Loki - koleksyon ng log gamit ang Prometheus approach

Pagpupugay, mga residente ng Khabrovsk! Sa bisperas ng pagsisimula ng isang bagong pagpapatala para sa kurso "Mga kasanayan at tool ng DevOps" Naghanda kami ng pagsasalin ng kawili-wiling materyal para sa iyo.

Ang artikulong ito ay isang maikling panimula kay Loki. Proyekto Loki suportado ng Grafana at naglalayon sa sentralisadong koleksyon ng mga log (mula sa mga server o lalagyan).

Ang pangunahing inspirasyon para kay Loki ay Promiteyus na may ideya ng paglalapat ng kanyang mga diskarte sa pamamahala ng log:

  • gamit ang mga label upang mag-imbak ng data
  • pagkonsumo ng kaunting mapagkukunan

Babalik tayo sa kung paano gumagana ang Prometheus at magbibigay ng ilang halimbawa ng paggamit nito sa konteksto ng Kubernetes.

Ang ilang mga salita tungkol sa Prometheus

Upang lubos na maunawaan kung paano gumagana ang Loki, mahalagang tumalikod at maalala nang kaunti ang tungkol sa Prometheus.

Ang isa sa mga natatanging tampok ng Prometheus ay ang pagkuha ng mga sukatan mula sa mga punto ng koleksyon (sa pamamagitan ng mga exporter) at pag-iimbak ng mga ito sa TSDB (Time Series Data Base), kasama ang pagdaragdag ng metadata sa anyo ng mga label.

Bakit kailangan mo ito

Kamakailan, ang Prometheus ay naging de facto na pamantayan sa mundo ng mga container at Kubernetes: ang pag-install nito ay napakasimple, at ang Kubernetes cluster ay may katutubong endpoint para sa Prometheus. Maaari ding kunin ng Prometheus ang mga sukatan mula sa mga application na naka-deploy sa isang container habang nag-iimbak ng mga partikular na label. Samakatuwid, ang pagsubaybay sa aplikasyon ay napakadaling ipatupad.

Sa kasamaang palad, wala pa ring solusyon sa turnkey para sa pamamahala ng log, at dapat kang makahanap ng solusyon para sa iyong sarili:

  • pinamamahalaang serbisyo sa cloud para sa pagsentral ng mga log (AWS, Azure o Google)
  • serbisyo sa pagsubaybay "pagsubaybay bilang isang serbisyo" (halimbawa, Datadog)
  • paglikha ng iyong sariling serbisyo sa pagkolekta ng log.

Para sa pangatlong opsyon, tradisyonal kong ginamit ang Elasticsearch, sa kabila ng katotohanan na hindi ako palaging masaya dito (lalo na ang bigat at pagiging kumplikado ng pagsasaayos nito).

Ang Loki ay idinisenyo upang gawing simple ang pagpapatupad ayon sa mga sumusunod na prinsipyo:

  • maging simple sa pagsisimula
  • kumonsumo ng kaunting mapagkukunan
  • magtrabaho nang nakapag-iisa nang walang anumang espesyal na pagpapanatili
  • nagsisilbing karagdagan sa Prometheus upang tumulong sa mga pagsisiyasat ng bug

Gayunpaman, ang pagiging simple na ito ay nagmumula sa kapinsalaan ng ilang mga kompromiso. Isa sa mga ito ay ang hindi pag-index ng nilalaman. Samakatuwid, ang paghahanap ng teksto ay hindi masyadong mahusay o mayaman at hindi pinapayagan ang mga istatistika sa nilalaman ng teksto. Ngunit dahil gusto ni Loki na maging katumbas ng grep at pandagdag sa Prometheus, hindi ito kawalan.

Pagsisiyasat ng Insidente

Para mas maunawaan kung bakit hindi kailangan ni Loki ng pag-index, bumalik tayo sa paraan ng pagsisiyasat ng insidente na ginamit ng mga developer ng Loki:

Loki - koleksyon ng log gamit ang Prometheus approach
1 Alert → 2 Dashboard → 3 Adhoc Query → 4 Log Aggregation → 5 Distributed Tracing → 6 Ayusin!
(1 Babala → 2 Dashboard → 3 Adhoc Query → 4 Log Aggregation → 5 Distributed Tracing → 6 Fixing!)

Ang ideya ay nakakatanggap kami ng ilang uri ng alerto (Slack Notification, SMS, atbp.) at pagkatapos nito:

  • tingnan ang mga dashboard ng Grafana
  • tingnan ang mga sukatan ng serbisyo (halimbawa, sa Prometheus)
  • tingnan ang mga entry sa log (halimbawa, sa Elasticsearch)
  • baka tingnan ang mga ipinamamahaging bakas (Jaeger, Zipkin, atbp.)
  • at sa wakas ay inaayos ang orihinal na problema.

Dito, sa kaso ng Grafana + Prometheus + Elasticsearch + Zipkin stack, kakailanganin mong gumamit ng apat na magkakaibang tool. Upang mabawasan ang oras, mainam na magawa ang lahat ng mga hakbang na ito gamit ang isang tool: Grafana. Kapansin-pansin na ang pamamaraang ito sa pananaliksik ay ipinatupad sa Grafana mula noong bersyon 6. Kaya, nagiging posible na ma-access ang data ng Prometheus nang direkta mula sa Grafana.

Loki - koleksyon ng log gamit ang Prometheus approach
Explorer screen split sa pagitan ng Prometheus at Loki

Mula sa screen na ito maaari mong tingnan ang mga Loki log na nauugnay sa Prometheus metrics gamit ang split screen concept. Mula noong bersyon 6.5, pinapayagan ka ng Grafana na i-parse ang trace id sa mga entry ng Loki log upang sundan ang mga link sa iyong mga paboritong distributed tracing tool (Jaeger).

Lokal na pagsubok sa Loki

Ang pinakamadaling paraan upang subukan ang Loki nang lokal ay ang paggamit ng docker-compose. Ang docker-compose file ay matatagpuan sa Loki repository. Makukuha mo ang repositoryo gamit ang sumusunod na command git:

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

Pagkatapos ay kailangan mong pumunta sa direktoryo ng produksyon:

$ cd production

Pagkatapos nito maaari mong makuha ang pinakabagong bersyon ng mga larawan ng Docker:

$ docker-compose pull

Sa wakas, ang Loki stack ay inilunsad gamit ang sumusunod na command:

$ docker-compose up

Arkitektura ng Loki

Narito ang isang maliit na diagram na may arkitektura ng Loki:

Loki - koleksyon ng log gamit ang Prometheus approach
Mga Prinsipyo ng Arkitektura ng Loki

Ang web client ay nagpapatakbo ng mga application sa server, ang Promtail ay nangongolekta ng mga log at ipinapadala ang mga ito sa Loki, ang web client ay nagpapadala din ng metadata sa Loki. Pinagsasama-sama ni Loki ang lahat at ipinadala ito sa Grafana.
Inilunsad si Loki. Upang tingnan ang mga magagamit na bahagi, patakbuhin ang sumusunod na command:

$ docker ps

Sa kaso ng isang bagong naka-install na Docker, dapat ibalik ng command ang sumusunod na resulta:

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

Nakikita namin ang mga sumusunod na sangkap:

  • Promtail: ahente na responsable para sa sentralisasyon ng mga log
  • Grafana: isang sikat na tool sa dashboard
  • Loki: Data Centralization Daemon

Bilang bahagi ng isang klasikong imprastraktura (halimbawa, batay sa mga virtual machine), dapat na i-deploy ang ahente ng Promtail sa bawat makina. Maaaring mai-install ang Grafana at Loki sa parehong makina.

Deployment sa Kubernetes

Ang pag-install ng mga bahagi ng Loki sa Kubernetes ay ang mga sumusunod:

  • daemonSet para sa pag-deploy ng ahente ng Promtail sa bawat isa sa mga makina sa cluster ng server
  • Deployment Loki
  • at ang huli ay ang deployment ng Grafana.

Sa kabutihang palad, ang Loki ay magagamit bilang isang pakete ng Helm, na ginagawang madali itong i-deploy.

Pag-install sa pamamagitan ng Heml

Dapat ay na-install mo na ang Heml. Maaari itong ma-download mula sa GitHub repository ng proyekto. Ito ay naka-install sa pamamagitan ng pag-unpack ng archive na naaayon sa iyong arkitektura at pagdaragdag ng timon sa $PATH.

Tandaan: Ang bersyon 3.0.0 ng Helm ay inilabas kamakailan. Dahil maraming pagbabago dito, pinapayuhan ang mambabasa na maghintay ng kaunti bago ito gamitin..

Pagdaragdag ng source para sa Helm

Ang unang hakbang ay idagdag ang "loki" na repository gamit ang sumusunod na command:

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

Pagkatapos nito, maaari kang maghanap para sa mga pakete na pinangalanang "loki":

$ helm search loki

Resulta:

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...

Ang mga paketeng ito ay may mga sumusunod na tampok:

  • pakete loki/loki tumutugma lamang sa server ng Loki
  • pakete loki/fluent-bit nagbibigay-daan sa iyo na mag-deploy ng DaemonSet gamit ang fluent-bin upang mangolekta ng mga log sa halip na Promtail
  • pakete loki/promtail naglalaman ng ahente ng koleksyon ng log file
  • pakete loki/loki-stack, ay nagbibigay-daan sa iyong agad na i-deploy ang Loki kasama ng Promtail.

Pag-install ng Loki

Upang i-deploy ang Loki sa Kubernetes, patakbuhin ang sumusunod na command sa namespace na "monitoring":

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

Upang i-save sa disk, idagdag ang parameter --set loki.persistence.enabled = true:

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

Tandaan: kung gusto mong i-deploy ang Grafana sa parehong oras, pagkatapos ay idagdag ang parameter --set grafana.enabled = true

Kapag pinatakbo mo ang utos na ito dapat mong makuha ang sumusunod na output:

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.

Sa pagtingin sa estado ng mga pod sa "monitoring" namespace, makikita natin na ang lahat ay na-deploy:

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

Resulta:

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

Ang lahat ng mga pod ay tumatakbo. Ngayon ay oras na upang gumawa ng ilang mga pagsubok!

Kumokonekta sa Grafana

Para kumonekta sa Grafana sa ilalim ng Kubernetes, kailangan mong magbukas ng tunnel sa pod nito. Nasa ibaba ang command upang buksan ang port 3000 para sa Grafana pod:

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

Ang isa pang mahalagang punto ay ang pangangailangan na mabawi ang password ng administrator ng Grafana. Ang password ay pinananatiling lihim loki-grafana sa bukid .data.admin-user sa base64 na format.

Upang maibalik ito, kailangan mong patakbuhin ang sumusunod na command:

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

Gamitin ang password na ito kasabay ng default na administrator account (admin).

Pagtukoy ng isang Loki data source sa Grafana

Una sa lahat, siguraduhin na ang Loki data source ay nagawa na (Configuration/Datasource).
Narito ang isang halimbawa:

Loki - koleksyon ng log gamit ang Prometheus approach
Halimbawa ng pag-set up ng data source para sa Loki

Sa pamamagitan ng pag-click sa "Pagsubok" maaari mong suriin ang koneksyon sa Loki.

Gumagawa ng mga kahilingan kay Loki

Ngayon pumunta sa Grafana sa seksyong "I-explore". Kapag tumatanggap ng mga log mula sa mga container, nagdaragdag si Loki ng metadata mula sa Kubernetes. Kaya, nagiging posible na tingnan ang mga log ng isang partikular na lalagyan.

Halimbawa, upang piliin ang mga promtail container log, maaari mong gamitin ang sumusunod na query: {container_name = "promtail"}.
Dito rin tandaan na piliin ang Loki data source.

Ibabalik ng query na ito ang aktibidad ng container gaya ng sumusunod:

Loki - koleksyon ng log gamit ang Prometheus approach
Resulta ng query sa Grafana

Idagdag sa dashboard

Simula sa Grafana 6.4, maaari kang maglagay ng impormasyon ng log nang direkta sa dashboard. Pagkatapos nito, magagawa ng user na mabilis na lumipat sa pagitan ng bilang ng mga kahilingan sa kanyang site at mga bakas ng aplikasyon.

Nasa ibaba ang isang halimbawa ng isang dashboard na nagpapatupad ng pakikipag-ugnayang ito:

Loki - koleksyon ng log gamit ang Prometheus approach
Sample dashboard na may Prometheus metrics at Loki logs

Kinabukasan ni Loki

Sinimulan kong gamitin ang Loki noong Mayo/Hunyo na may bersyon 0.1. Ngayon ang bersyon 1, at maging ang 1.1 at 1.2 ay inilabas na.

Dapat aminin na ang bersyon 0.1 ay hindi sapat na matatag. Ngunit ang 0.3 ay nagpakita na ng tunay na mga palatandaan ng kapanahunan, at ang mga kasunod na bersyon (0.4, pagkatapos ay 1.0) ay nagpalakas lamang sa impression na ito.

Pagkatapos ng 1.0.0, walang sinuman ang maaaring magkaroon ng anumang dahilan upang hindi gamitin ang kahanga-hangang tool na ito.

Ang mga karagdagang pagpapabuti ay hindi dapat tungkol sa Loki, ngunit sa halip ang pagsasama nito sa mahusay na Grafana. Sa katunayan, ang Grafana 6.4 ay mayroon nang mahusay na pagsasama sa mga dashboard.

Ang Grafana 6.5, na pinakawalan kamakailan, ay higit na pinapabuti ang pagsasamang ito sa pamamagitan ng awtomatikong pagkilala sa mga nilalaman ng log sa JSON na format.

Ang video sa ibaba ay nagpapakita ng isang maliit na halimbawa ng mekanismong ito:

Loki - koleksyon ng log gamit ang Prometheus approach
Gamit ang mga Loki string na nakalantad sa Grafana

Nagiging posible na gamitin ang isa sa mga field ng JSON, halimbawa, para sa:

  • mga link sa panlabas na tool
  • pag-filter ng mga nilalaman ng log

Halimbawa, maaari kang mag-click sa traceId upang pumunta sa Zipkin o Jaeger.

Gaya ng dati, inaasahan namin ang iyong mga komento at iniimbitahan ka bukas na webinar, kung saan pag-uusapan natin kung paano umunlad ang industriya ng DevOps noong 2019 at tatalakayin ang mga posibleng landas sa pag-unlad para sa 2020.

Pinagmulan: www.habr.com