Grafana Alloy adalah collector telemetry vendor-neutral yang menjadi penerus Grafana Agent. Episode ini membahas arsitektur berbasis komponen dan bahasa River, metode koleksi log dari file dan Docker, pemrosesan log, serta pengiriman log ke Loki dengan remote write.

Log tidak mengalir sendiri ke Loki. Di antara aplikasi dan backend dibutuhkan collector — proses yang membaca log dari berbagai sumber, memprosesnya, lalu mengirimkannya. Di series ini, peran itu dipegang Grafana Alloy.
Alloy adalah penerus Grafana Agent, dirancang sebagai collector yang vendor-neutral dan kompatibel penuh dengan OpenTelemetry. Episode ini membahas arsitekturnya, bahasa konfigurasi River, metode koleksi log dari file dan Docker, alur pemrosesan, serta pengiriman log ke Loki.
Alloy menggabungkan kemampuan OpenTelemetry Collector, Prometheus agent, dan Loki client dalam satu binary. Ciri utamanya:
docker exec alloy alloy convert --versionPerintah docker exec alloy alloy convert --version membantu memverifikasi binary di dalam container.
Semua yang dilakukan Alloy direpresentasikan sebagai komponen. Setiap komponen menerima data, memproses, dan mengekspos hasil yang bisa disambungkan ke komponen lain — membentuk pipeline.
loki.source.file "app_logs" {
targets = [{
__path__ = "/var/log/app/*.log"
}]
}
loki.write "default" {
endpoint {
url = "http://loki:3100/loki/api/v1/push"
}
}
loki.source.file.app_logs -> loki.write.defaultPerhatikan baris terakhir loki.source.file.app_logs -> loki.write.default — operator panah menghubungkan komponen sumber ke komponen tujuan.
Alloy membaca log dari beragam sumber dengan komponen berbeda:
discovery.docker "containers" {
host = env("DOCKER_HOST")
}
loki.source.docker "container_logs" {
host = env("DOCKER_HOST")
targets = discovery.docker.containers.targets
}loki.source.docker memantau container Docker secara langsung, sementara discovery.docker menemukan container yang berjalan.
Metode lain yang tersedia:
loki.source.kubernetes memantau log pod.loki.source.syslog menerima log dari device jaringan.loki.source.journal membaca log systemd.file | docker | kubernetes | syslog | journalPola file | docker | kubernetes | syslog | journal ini mencakup hampir semua kebutuhan koleksi log umum.
Sebelum dikirim, log bisa diproses: mengekstrak label, memparsing isi, memfilter, dan menambah metadata. Komponen loki.process memuat rangkaian stage:
loki.process "enrich" {
stage.regex {
source = "message"
expression = "level=(?P<level>\\w+)"
}
stage.labels {
values = {
level = "",
}
}
}
loki.source.file.app_logs -> loki.process.enrich
loki.process.enrich -> loki.write.defaultStage stage.labels memetakan field hasil parsing menjadi label log — pola ini penting untuk kontrol cardinality.
Baris yang tidak perlu bisa di-drop di pipeline. Untuk multi-tenancy, Alloy bisa menambahkan header tenant pada komponen write — dibahas lebih lanjut di episode 25.
Pengiriman ke Loki memakai protokol push dengan konfigurasi batching, kompresi, retry, dan backpressure:
loki.write "default" {
endpoint {
url = "http://loki:3100/loki/api/v1/push"
batch_max_size = 1 << 20
}
external_labels = {
cluster = "local",
}
}Nilai batch_max_size membatasi ukuran batch agar pengiriman efisien, sementara external_labels menambah label di sisi collector.
Info
Batching dan kompresi adalah kunci biaya. Tanpa batching, Alloy mengirim ribuan request kecil ke Loki; dengan batching, data dikompresi dan dikirim dalam satu batch besar — jauh lebih murah.
Di episode 11 ini kalian memahami peran Grafana Alloy sebagai collector vendor-neutral penerus Grafana Agent, mengenal arsitektur komponen dan bahasa River, mempelajari metode koleksi log dari file, Docker, Kubernetes, syslog, dan journal, serta alur pemrosesan dan pengiriman ke Loki.
Inti yang harus dibawa pulang:
Di episode 12 selanjutnya kita akan membahas structured logging best practices — prinsip key-value dan JSON, apa yang boleh dan tidak boleh dilog, perbandingan library logging per bahasa, serta korelasi log dengan TraceID. Data yang mengalir ke Loki hanya sebaik kualitas log yang dihasilkan aplikasi.