Loki - pengumpulan log menggunakan pendekatan Prometheus

Salut, warga Khabrovsk! Menjelang dimulainya pendaftaran baru untuk kursus "Praktik dan alat DevOps" Kami telah menyiapkan terjemahan materi menarik untuk Anda.

Artikel ini adalah pengenalan singkat tentang Loki. Proyek Loki didukung oleh Grafana dan ditujukan untuk pengumpulan log terpusat (dari server atau container).

Inspirasi utama Loki adalah Prometheus dengan ide menerapkan pendekatannya pada manajemen log:

  • menggunakan label untuk menyimpan data
  • konsumsi sedikit sumber daya

Kami akan kembali ke cara kerja Prometheus dan memberikan beberapa contoh penggunaannya dalam konteks Kubernetes.

Beberapa kata tentang Prometheus

Untuk memahami sepenuhnya cara kerja Loki, penting untuk mengambil langkah mundur dan mengingat sedikit tentang Prometheus.

Salah satu ciri khas Prometheus adalah ekstraksi metrik dari titik pengumpulan (melalui eksportir) dan menyimpannya di TSDB (Time Series Data Base), dengan penambahan metadata berupa label.

Kenapa kamu membutuhkannya

Baru-baru ini, Prometheus telah menjadi standar de facto di dunia container dan Kubernetes: instalasinya sangat sederhana, dan cluster Kubernetes dilengkapi dengan titik akhir asli untuk Prometheus. Prometheus juga dapat mengekstrak metrik dari aplikasi yang diterapkan dalam wadah sambil menyimpan label tertentu. Oleh karena itu, pemantauan aplikasi sangat mudah untuk diterapkan.

Sayangnya, masih belum ada solusi siap pakai untuk pengelolaan log, dan Anda harus menemukan solusinya sendiri:

  • layanan cloud terkelola untuk memusatkan log (AWS, Azure atau Google)
  • layanan pemantauan “pemantauan sebagai layanan” (misalnya, Datadog)
  • membuat layanan pengumpulan log Anda sendiri.

Untuk opsi ketiga, saya biasanya menggunakan Elasticsearch, meskipun faktanya saya tidak selalu menyukainya (terutama bobot dan kerumitan konfigurasinya).

Loki dirancang untuk menyederhanakan implementasi berdasarkan prinsip-prinsip berikut:

  • sederhana untuk memulai
  • mengkonsumsi sedikit sumber daya
  • bekerja secara mandiri tanpa perawatan khusus
  • berfungsi sebagai tambahan pada Prometheus untuk membantu investigasi bug

Namun, kesederhanaan ini harus mengorbankan beberapa kompromi. Salah satunya adalah tidak mengindeks konten. Oleh karena itu, pencarian teks tidak terlalu efisien atau kaya dan tidak memungkinkan statistik isi teks. Namun karena Loki ingin menjadi setara dengan grep dan pelengkap Prometheus, hal ini bukanlah suatu kerugian.

Investigasi Insiden

Untuk lebih memahami mengapa Loki tidak memerlukan pengindeksan, mari kembali ke metode investigasi insiden yang digunakan pengembang Loki:

Loki - pengumpulan log menggunakan pendekatan Prometheus
1 Peringatan → 2 Dasbor → 3 Kueri Adhoc → 4 Agregasi Log → 5 Pelacakan Terdistribusi → 6 Perbaikan!
(1 Peringatan → 2 Dasbor → 3 Kueri Adhoc → 4 Agregasi Log → 5 Pelacakan Terdistribusi → 6 Perbaikan!)

Idenya adalah kita menerima semacam peringatan (Pemberitahuan Slack, SMS, dll.) dan setelah itu:

  • lihat dasbor Grafana
  • lihat metrik layanan (misalnya, di Prometheus)
  • lihat entri log (misalnya, di Elasticsearch)
  • mungkin lihat jejak yang didistribusikan (Jaeger, Zipkin, dll.)
  • dan akhirnya memperbaiki masalah aslinya.

Di sini, dalam kasus tumpukan Grafana + Prometheus + Elasticsearch + Zipkin, Anda harus menggunakan empat alat berbeda. Untuk mengurangi waktu, alangkah baiknya jika semua langkah ini dapat dilakukan menggunakan satu alat: Grafana. Perlu dicatat bahwa pendekatan penelitian ini telah diterapkan di Grafana sejak versi 6. Dengan demikian, data Prometheus dapat diakses langsung dari Grafana.

Loki - pengumpulan log menggunakan pendekatan Prometheus
Layar Explorer terbagi antara Prometheus dan Loki

Dari layar ini Anda dapat melihat log Loki yang terkait dengan metrik Prometheus menggunakan konsep layar terpisah. Sejak versi 6.5, Grafana memungkinkan Anda mengurai id jejak di entri log Loki untuk mengikuti tautan ke alat penelusuran terdistribusi favorit Anda (Jaeger).

Tes Loki lokal

Cara termudah untuk menguji Loki secara lokal adalah dengan menggunakan docker-compose. File penulisan buruh pelabuhan terletak di repositori Loki. Anda bisa mendapatkan repositori menggunakan perintah berikut git:

$ git clone https://github.com/grafana/loki.git

Maka Anda perlu pergi ke direktori produksi:

$ cd production

Setelah ini, Anda bisa mendapatkan image Docker versi terbaru:

$ docker-compose pull

Terakhir, tumpukan Loki diluncurkan dengan perintah berikut:

$ docker-compose up

Arsitektur Loki

Berikut adalah diagram kecil dengan arsitektur Loki:

Loki - pengumpulan log menggunakan pendekatan Prometheus
Prinsip Arsitektur Loki

Klien web menjalankan aplikasi di server, Promtail mengumpulkan log dan mengirimkannya ke Loki, klien web juga mengirimkan metadata ke Loki. Loki mengumpulkan semuanya dan mengirimkannya ke Grafana.
Loki diluncurkan. Untuk melihat komponen yang tersedia, jalankan perintah berikut:

$ docker ps

Dalam kasus Docker yang baru diinstal, perintah tersebut akan mengembalikan hasil berikut:

IMAGE               PORTS                  NAMES
grafana/promtail:                          production_promtail_1
grafana/grafana: m  0.0.0.0:3000->3000/tcp production_grafana_1
grafana/loki: late  80/tcp,0.0.0.0:3100... production_loki_1

Kami melihat komponen-komponen berikut:

  • Promtail: agen yang bertanggung jawab untuk memusatkan log
  • Grafana: alat dasbor yang terkenal
  • Loki: Daemon Sentralisasi Data

Sebagai bagian dari infrastruktur klasik (misalnya, berdasarkan mesin virtual), agen Promtail harus disebarkan di setiap mesin. Grafana dan Loki dapat diinstal pada mesin yang sama.

Penerapan ke Kubernetes

Menginstal komponen Loki di Kubernetes adalah sebagai berikut:

  • daemonSet untuk menyebarkan agen Promtail pada setiap mesin di cluster server
  • Penyebaran Loki
  • dan yang terakhir adalah penerapan Grafana.

Untungnya, Loki tersedia dalam paket Helm, sehingga mudah digunakan.

Instalasi melalui Heml

Anda seharusnya sudah menginstal Heml. Itu dapat diunduh dari repositori GitHub proyek. Itu diinstal dengan membongkar arsip yang sesuai dengan arsitektur Anda dan menambahkan helm ke dalamnya $PATH.

Catatan: Helm versi 3.0.0 dirilis baru-baru ini. Karena sudah banyak perubahan, pembaca disarankan menunggu sebentar sebelum menggunakannya..

Menambahkan sumber untuk Helm

Langkah pertama adalah menambahkan repositori “loki” menggunakan perintah berikut:

$ helm add loki https://grafana.github.io/loki/charts

Setelah ini, Anda dapat mencari paket bernama “loki”:

$ helm search loki

Hasilnya:

loki/loki       0.17.2 v0.4.0 Loki: like Prometheus, but for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: like Prometheus, but for logs.
loki/fluent-bit 0.0.2  v0.0.1 Uses fluent-bit Loki go plugin for...
loki/promtail   0.13.1 v0.4.0 Responsible for gathering logs and...

Paket-paket ini memiliki beberapa fitur berikut:

  • paket loki/loki hanya cocok dengan server Loki
  • paket loki/fasih-bit memungkinkan Anda menerapkan DaemonSet menggunakan fluent-bin untuk mengumpulkan log, bukan Promtail
  • paket loki/promtail berisi agen pengumpulan file log
  • paket loki/loki-stack, memungkinkan Anda untuk segera menerapkan Loki bersama dengan Promtail.

Menginstal Loki

Untuk menerapkan Loki ke Kubernetes, jalankan perintah berikut di namespace “pemantauan”:

$ helm upgrade --install loki loki/loki-stack --namespace monitoring

Untuk menyimpan ke disk, tambahkan parameter --set loki.persistence.enabled = true:

$ helm upgrade --install loki loki/loki-stack 
              --namespace monitoring 
              --set loki.persistence.enabled=true

Catatan: jika Anda ingin menerapkan Grafana secara bersamaan, tambahkan parameternya --set grafana.enabled = true

Saat Anda menjalankan perintah ini, Anda akan mendapatkan output berikut:

LAST DEPLOYED: Tue Nov 19 15:56:54 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 189d
…
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
See <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

Melihat keadaan pod di namespace “monitoring”, kita dapat melihat bahwa semuanya telah di-deploy:

$ kubectl -n monitoring get pods -l release=loki

Hasilnya:

NAME                 READY  STATUS   RESTARTS  AGE
loki-0               1/1    Running  0         147m
loki-promtail-9zjvc  1/1    Running  0         3h25m
loki-promtail-f6brf  1/1    Running  0         11h
loki-promtail-hdcj7  1/1    Running  0         3h23m
loki-promtail-jbqhc  1/1    Running  0         11h
loki-promtail-mj642  1/1    Running  0         62m
loki-promtail-nm64g  1/1    Running  0         24m

Semua pod sedang berjalan. Sekarang saatnya melakukan beberapa tes!

Menghubungkan ke Grafana

Untuk terhubung ke Grafana di bawah Kubernetes, Anda perlu membuka terowongan ke podnya. Di bawah ini adalah perintah untuk membuka port 3000 untuk pod Grafana:

$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80

Poin penting lainnya adalah kebutuhan untuk memulihkan kata sandi administrator Grafana. Kata sandi dirahasiakan loki-grafana di lapangan .data.admin-user dalam format base64.

Untuk memulihkannya, Anda perlu menjalankan perintah berikut:

$ kubectl -n monitoring get secret loki-grafana 
 --template '{{index .data "admin-password" | base64decode}}'; echo

Gunakan kata sandi ini bersama dengan akun administrator default (admin).

Mendefinisikan sumber data Loki di Grafana

Pertama-tama pastikan sumber data Loki sudah dibuat (Konfigurasi/Sumber Data).
Berikut ini sebuah contoh:

Loki - pengumpulan log menggunakan pendekatan Prometheus
Contoh menyiapkan sumber data untuk Loki

Dengan mengklik “Tes” Anda dapat memeriksa koneksi dengan Loki.

Membuat permintaan ke Loki

Sekarang pergi ke Grafana ke bagian “Jelajahi”. Saat menerima log dari container, Loki menambahkan metadata dari Kubernetes. Dengan demikian, dimungkinkan untuk melihat log dari wadah tertentu.

Misalnya, untuk memilih log kontainer promtail, Anda bisa menggunakan kueri berikut: {container_name = "promtail"}.
Di sini juga ingat untuk memilih sumber data Loki.

Kueri ini akan mengembalikan aktivitas kontainer sebagai berikut:

Loki - pengumpulan log menggunakan pendekatan Prometheus
Hasil kueri di Grafana

Tambahkan ke dasbor

Dimulai dengan Grafana 6.4, Anda dapat menempatkan informasi log langsung di dasbor. Setelah ini, pengguna akan dapat dengan cepat beralih antara jumlah permintaan di situsnya dan jejak aplikasi.

Di bawah ini adalah contoh dashboard yang mengimplementasikan interaksi ini:

Loki - pengumpulan log menggunakan pendekatan Prometheus
Contoh dasbor dengan metrik Prometheus dan log Loki

Masa Depan Loki

Saya mulai menggunakan Loki pada bulan Mei/Juni dengan versi 0.1. Saat ini versi 1, bahkan 1.1 dan 1.2 telah dirilis.

Harus diakui versi 0.1 kurang stabil. Namun versi 0.3 sudah menunjukkan tanda-tanda kedewasaan yang nyata, dan versi berikutnya (0.4, lalu 1.0) hanya memperkuat kesan ini.

Setelah 1.0.0, tidak ada seorang pun yang punya alasan untuk tidak menggunakan alat luar biasa ini.

Peningkatan lebih lanjut seharusnya bukan pada Loki, melainkan integrasinya dengan Grafana yang luar biasa. Faktanya, Grafana 6.4 sudah memiliki integrasi yang baik dengan dashboard.

Grafana 6.5, yang dirilis baru-baru ini, semakin meningkatkan integrasi ini dengan secara otomatis mengenali konten log dalam format JSON.

Video di bawah ini menunjukkan contoh kecil dari mekanisme ini:

Loki - pengumpulan log menggunakan pendekatan Prometheus
Menggunakan string Loki yang diekspos di Grafana

Salah satu bidang JSON dapat digunakan, misalnya, untuk:

  • tautan ke alat eksternal
  • memfilter konten log

Misalnya, Anda dapat mengklik traceId untuk membuka Zipkin atau Jaeger.

Seperti biasa, kami menantikan komentar Anda dan mengundang Anda untuk melakukannya buka webinar, di mana kita akan membahas tentang bagaimana industri DevOps berkembang selama tahun 2019 dan mendiskusikan kemungkinan jalur pengembangan untuk tahun 2020.

Sumber: www.habr.com