Belajar Observability dengan LGTM Stack - Collecting Logs dengan Grafana Alloy
Episode 11 of 36

Belajar Observability dengan LGTM Stack - Collecting Logs dengan Grafana Alloy

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

Grafana Alloy Introduction

Mengapa Alloy

Alloy menggabungkan kemampuan OpenTelemetry Collector, Prometheus agent, dan Loki client dalam satu binary. Ciri utamanya:

  • Vendor-neutral: bisa mengirim data ke LGTM, Datadog, atau backend lain.
  • OpenTelemetry compatibility: menerima dan memproses sinyal OTLP.
  • Dynamic configuration: konfigurasi bisa di-reload dan diprogram ulang saat berjalan.
  • Programmable pipelines: alur data dibangun sebagai rangkaian komponen.
Cek konfigurasi Alloy
docker exec alloy alloy convert --version

Perintah docker exec alloy alloy convert --version membantu memverifikasi binary di dalam container.

Alloy Architecture

Component-Based Design

Semua yang dilakukan Alloy direpresentasikan sebagai komponen. Setiap komponen menerima data, memproses, dan mengekspos hasil yang bisa disambungkan ke komponen lain — membentuk pipeline.

  • Component-based design: setiap fungsi adalah komponen kecil yang bisa digabung.
  • Pipeline composition: output satu komponen menjadi input komponen berikutnya.
  • Data flow model: data mengalir dari receiver ke exporter lewat rantai komponen.
  • Configuration language (River): semua pipeline ditulis dalam bahasa River.
Contoh pipeline River
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.default

Perhatikan baris terakhir loki.source.file.app_logs -> loki.write.default — operator panah menghubungkan komponen sumber ke komponen tujuan.

Metode Koleksi Log

File Tailing dan Docker Logs

Alloy membaca log dari beragam sumber dengan komponen berbeda:

Koleksi log dari Docker
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.

Kubernetes, Syslog, dan Journal

Metode lain yang tersedia:

  • Kubernetes pod logs: loki.source.kubernetes memantau log pod.
  • Syslog receiver: loki.source.syslog menerima log dari device jaringan.
  • Journal logs: loki.source.journal membaca log systemd.
Sumber koleksi log
file | docker | kubernetes | syslog | journal

Pola file | docker | kubernetes | syslog | journal ini mencakup hampir semua kebutuhan koleksi log umum.

Log Processing

Label dan Parsing

Sebelum dikirim, log bisa diproses: mengekstrak label, memparsing isi, memfilter, dan menambah metadata. Komponen loki.process memuat rangkaian stage:

Proses dan enrichment log
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.default

Stage stage.labels memetakan field hasil parsing menjadi label log — pola ini penting untuk kontrol cardinality.

Filtering dan Multi-Tenancy Routing

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.

Mengirim ke Loki

Remote Write dan Batching

Pengiriman ke Loki memakai protokol push dengan konfigurasi batching, kompresi, retry, dan backpressure:

Konfigurasi pengiriman ke Loki
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.

Penutup

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:

  • Alloy membangun pipeline dari rangkaian komponen yang dihubungkan dengan panah.
  • River adalah bahasa konfigurasi Alloy.
  • Koleksi log mencakup file, Docker, Kubernetes, syslog, dan journal.
  • Proses log mengekstrak label, memparsing, memfilter, dan enrichment.
  • Batching dan kompresi menekan biaya pengiriman ke Loki.

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.

Belajar Observability dengan LGTM Stack - Collecting Logs dengan Grafana Alloy | Belajar Observability dengan LGTM Stack