Loki - збор логаў, выкарыстоўваючы падыход Prometheus

Салют, хабраўчане! Напярэдадні старту новага набору на курс "DevOps практыкі і інструменты" падрыхтавалі для вас перавод цікавага матэрыялу.

Гэты артыкул – кароткае ўвядзенне ў Loki. Праект Loki падтрымліваецца Grafana і накіраваны на цэнтралізаваны збор логаў (з сервераў ці кантэйнераў).

Асноўнай крыніцай натхнення для Loki быў Праметэй з ідэяй прымянення яго падыходаў да кіравання логамі:

  • выкарыстанне пазнак (labels) для захоўвання дадзеных
  • спажыванне малой колькасці рэсурсаў

Мы яшчэ вернемся да прынцыпаў працы Prometheus і прывядзем некалькі прыкладаў яго выкарыстання ў кантэксце Kubernetes.

Некалькі слоў аб Prometheus

Каб цалкам зразумець, як працуе Loki, важна зрабіць крок назад і крыху ўспомніць Prometheus.

Адной з адметных характарыстык Prometheus з'яўляецца выманне метрык з кропак збору (праз экспарцёры) і захаванне іх у TSDB (Time Series Data Base, база дадзеных часовых шэрагаў) з даданнем метададзеных у выглядзе пазнак.

Навошта гэта трэба

У апошні час Prometheus стаў стандартам дэ-факта ў свеце кантэйнераў і Kubernetes: яго ўстаноўка вельмі простая, а ў кластары Kubernetes першапачаткова прысутнічае эндпаінт для Prometheus. Prometheus таксама можа здабываць метрыкі з прыкладанняў, разгорнутых у кантэйнеры, захоўваючы пры гэтым пэўныя пазнакі. Таму маніторынг дадаткаў вельмі просты ў рэалізацыі.

На жаль, для кіравання логамі да гэтага часу няма рашэння "пад ключ", і вы павінны знайсці рашэнне для сябе:

  • кіраваны хмарны сэрвіс для цэнтралізацыі логаў (AWS, Azure або Google)
  • сэрвіс маніторынгу "маніторынг як паслуга" (monitoring as a service) (напрыклад, Datadog)
  • стварэнне свайго сэрвісу збору логаў.

Для трэцяга варыянту я традыцыйна выкарыстаў Elasticsearch, нягледзячы на ​​тое, што я не заўсёды быў ім задаволены (асабліва яго цяжарам і складанасцю наладкі).

Loki быў спраектаваны з мэтай спрашчэння рэалізацыі ў адпаведнасці з наступнымі прынцыпамі:

  • быць простым для старту
  • спажываць мала рэсурсаў
  • працаваць самастойна без якога-небудзь спецыяльнага абслугоўвання
  • служыць дадаткам да Prometheus для дапамогі ў расследаванні багаў

Аднак гэтая прастата дасягаецца за рахунак некаторых кампрамісаў. Адзін з іх - не індэксаваць кантэнт. Таму пошук па тэксце не вельмі эфектыўны ці багаты і не дазваляе весці статыстыку па змесце тэксту. Але паколькі Loki жадае быць эквівалентам grep і дадаткам да Prometheus, тое гэта не з'яўляецца недахопам.

Расследаванне інцыдэнтаў

Каб лепш зразумець, чаму Loki не патрэбна індэксацыя, давайце вернемся да метаду расследавання інцыдэнтаў, які выкарыстоўвалі распрацоўшчыкі Loki:

Loki - збор логаў, выкарыстоўваючы падыход Prometheus
1 Alert → 2 Дашбар → 3 Adhoc Query → 4 Log Aggregation → 5 Distributed Tracing → 6 Fix!
(1 Папярэджанне → 2 Дашборд → 3 Adhoc Query → 4 Агрэгацыя логаў → 5 Размеркаваная трасіроўка → 6 Выпраўляем!)

Ідэя складаецца ў тым, што мы атрымліваем нейкі алерт (Slack Notification, SMS і т. д.) і пасля гэтага:

  • глядзім дашборды Grafana
  • глядзім метрыкі сэрвісаў (напрыклад, у Prometheus)
  • глядзім запісы логаў (напрыклад, у Elasticsearch)
  • магчыма, зірнем на размеркаваныя трэйсы (Jaeger, Zipkin і інш.)
  • і, нарэшце, выпраўляем зыходную праблему.

Тут, у выпадку стэка Grafana + Prometheus + Elasticsearch + Zipkin, давядзецца выкарыстоўваць чатыры розных інструмента. Для скарачэння часу добра было б мець магчымасць выконваць усе гэтыя этапы з дапамогай адной прылады: Grafana. Варта адзначыць, што такі падыход да даследавання рэалізаваны ў Grafana пачынаючы з версіі 6. Такім чынам, становіцца магчымым звяртацца да дадзеных Prometheus непасрэдна з Grafana.

Loki - збор логаў, выкарыстоўваючы падыход Prometheus
Экран Explorer падзелены паміж Prometheus і Loki

На гэтым экране можна глядзець логі ў Loki, звязаныя з метрыкамі Prometheus, выкарыстоўваючы канцэпцыю падзелу экрана. Пачынальна з версіі 6.5, Grafana дазваляе апрацоўваць ідэнтыфікатар трасіроўкі (trace id) у запісах логаў Loki для пераходу па спасылках да вашых каханым прыладам размеркаванай трасіроўкі (Jaeger).

Лакальны тэст Loki

Самы просты спосаб лакальнага тэставання Loki - выкарыстоўваць docker-compose. Файл docker-compose знаходзіцца ў рэпазітары Loki. Атрымаць рэпазітар можна з дапамогай наступнай каманды git:

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

Затым вам трэба перайсці ў каталог production:

$ cd production

Пасля гэтага можна атрымаць апошнюю версію выяў Docker:

$ docker-compose pull

Нарэшце, стэк Loki запускаецца наступнай камандай:

$ docker-compose up

Архітэктура Loki

Вось невялікая дыяграма з архітэктурай Loki:

Loki - збор логаў, выкарыстоўваючы падыход Prometheus
Прынцыпы архітэктуры Loki

Вэб-кліент запускае прыкладанні на серверы, Promtail збірае логі і адпраўляе іх у Loki, вэб-кліент таксама адпраўляе метададзеныя ў Loki. Loki усё агрэгуе і перадае ў Grafana.
Loki запушчаны. Для прагляду наяўных кампанентаў выканайце наступную каманду:

$ docker ps

У выпадку свежаўсталяванага Docker каманда павінна вярнуць наступны вынік:

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

Мы бачым наступныя кампаненты:

  • Promtail: агент, які адказвае за цэнтралізацыю логаў
  • Grafana: вядомы інструмент для дашбордаў
  • Loki: дэман цэнтралізацыі дадзеных

У рамках класічнай інфраструктуры (напрыклад, на аснове віртуальных машын) на кожнай машыне павінен быць разгорнуты агент Promtail. Grafana і Loki могуць быць устаноўлены на адной машыне.

Разгортванне ў Kubernetes

Усталёўка кампанентаў Loki у Kubernetes будзе складацца ў наступным:

  • daemonSet для разгортвання агента Promtail на кожнай з машын у кластары сервераў
  • разгортванне (Deployment) Loki
  • і апошняе - разгортванне Grafana.

На шчасце, Loki даступны ў выглядзе пакета Helm, што спрашчае яго разгортванне.

Ўстаноўка праз Heml

Heml ужо павінен быць у вас усталяваны. Яго можна спампаваць з GitHub-рэпазітара праекта. Ён усталёўваецца праз распакаванне архіва, які адпавядае вашай архітэктуры, і даданні helm у $PATH.

Заўвага: версія 3.0.0 Helm была выпушчана нядаўна. Так як у ёй было шмат змен, то чытачу рэкамендуецца крыху пачакаць, перш за пачаць яе выкарыстоўваць.

Даданне крыніцы для Helm

Першым крокам будзе даданне рэпазітара "loki" з дапамогай наступнай каманды:

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

Пасля гэтага можна шукаць пакеты з імем "loki":

$ helm search loki

Вынік:

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

Гэтыя пакеты маюць наступныя функцыі:

  • пакет loki/loki адпавядае толькі серверу Loki
  • пакет loki/fluent-bit дазваляе разгортваць DaemonSet, выкарыстоўваючы fluent-bin для збору логаў замест Promtail
  • пакет loki/promtail змяшчае агент збору лог-файлаў
  • пакет loki/loki-stack, дазваляе адразу разгарнуць Loki сумесна з Promtail.

Ўстаноўка Loki

Каб разгарнуць Loki у Kubernetes, выканайце наступную каманду ў прасторы імёнаў “monitoring”:

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

Для захавання на дыск дадайце параметр --set loki.persistence.enabled = true:

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

Заўвага: калі вы жадаеце разгарнуць адначасова Grafana, то дадайце параметр --set grafana.enabled = true

Пры запуску гэтай каманды вы павінны атрымаць наступную выснову:

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.

Паглядзеўшы на стан подаў у прасторы імёнаў "monitoring", мы ўбачым, што ўсё разгорнута:

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

Вынік:

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

Усе поды запушчаны. Цяпер прыйшоў час зрабіць некалькі тэстаў!

Падключэнне да Grafana

Каб пад Kubernetes падлучыцца да Grafana, неабходна адкрыць тунэль да яго поду. Ніжэй прыведзена каманда для адкрыцця порта 3000 для пада Grafana:

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

Яшчэ адным важным момантам з'яўляецца неабходнасць узнаўлення пароля адміністратара Grafana. Пароль захоўваецца ў сакрэце loki-grafana ў полі .data.admin-user у фармаце base64.

Для яго аднаўлення неабходна выканаць наступную каманду:

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

Выкарыстоўвайце гэты пароль сумесна з уліковым запісам адміністратара па змаўчанні (admin).

Вызначэнне крыніцы дадзеных Loki у Grafana

Першым чынам пераканаецеся, што створаная крыніца дадзеных Loki (Configuration / Datasource).
Вось прыклад:

Loki - збор логаў, выкарыстоўваючы падыход Prometheus
Прыклад налады крыніцы дадзеных для Loki

Націснуўшы на "Test" можна праверыць сувязь з Loki.

Які робіцца запыты да Loki

Цяпер перайдзіце ў Grafana у раздзел "Explore". Пры прыёме логаў ад кантэйнераў Loki дадае метададзеныя ад Kubernetes. Такім чынам, становіцца магчымым праглядаць логі вызначанага кантэйнера.

Напрыклад, для выбару логаў кантэйнера promtail можна выкарыстоўваць наступны запыт: {container_name = "promtail"}.
Тут таксама не забудзьцеся абраць крыніцу дадзеных Loki.

Гэты запыт верне актыўнасць кантэйнераў у наступным выглядзе:

Loki - збор логаў, выкарыстоўваючы падыход Prometheus
Вынік запыту ў Grafana

Даданне на дашборд

Пачынаючы з Grafana 6.4, можна змясціць інфармацыю аб логах непасрэдна на дашборд. Пасля гэтага карыстач зможа хутка перамыкацца паміж колькасцю запытаў на яго сайце да трэйс прыкладання.

Ніжэй прыведзены прыклад дашборда, які рэалізуе гэтае ўзаемадзеянне:

Loki - збор логаў, выкарыстоўваючы падыход Prometheus
Узор дашборда з метрыкамі Prometheus і логамі Loki

Будучыня Loki

Я пачаў выкарыстоўваць Loki яшчэ ў траўні / чэрвені з версіі 0.1. Сёння ўжо выпушчана версія 1 і нават 1.1 і 1.2.

Трэба прызнаць, што версія 0.1 была не дастаткова стабільная. Але 0.3 паказала ўжо рэальныя прыкметы сталасці, а наступныя версіі (0.4, потым 1.0) толькі ўзмацнілі гэтае ўражанне.

Пасля 1.0.0, ні ў каго ўжо не можа быць апраўданняў, каб не выкарыстоўваць гэтую выдатную прыладу.

Далейшыя паляпшэнні павінны тычыцца не Loki, а хутчэй яго інтэграцыі з найвышэйшай Grafana. Насамрэч, у Grafana 6.4 ужо з'явілася добрая інтэграцыя з дашбордамі.

Grafana 6.5, якая была выпушчана нядаўна, яшчэ больш паляпшае гэтую інтэграцыю, аўтаматычна распазнаючы змест логаў у фармаце JSON.

Ніжэй на відэа прыведзены невялікі прыклад гэтага механізму:

Loki - збор логаў, выкарыстоўваючы падыход Prometheus
Выкарыстанне радкоў Loki, якія адлюстроўваюцца ў Grafana

Становіцца магчымым выкарыстоўваць адно з палёў JSON, напрыклад, для:

  • спасылкі на знешні інструмент
  • фільтрацыі змесціва логаў

Напрыклад, вы можаце клікнуць на traceId, каб перайсці ў Zipkin ці Jaeger.

Традыцыйна чакаем вашыя каментары і запрашаем на адкрыты вэбінар, дзе пагаворым аб тым, як развівалася DevOps-індустрыя на працягу 2019 года і абмяркуем магчымыя шляхі развіцця на 2020 год.

Крыніца: habr.com