Салют, хабраўчане! Напярэдадні старту новага набору на курс
Гэты артыкул – кароткае ўвядзенне ў Loki. Праект Loki
Асноўнай крыніцай натхнення для 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:
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.
Экран 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
Вэб-кліент запускае прыкладанні на серверы, 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
Націснуўшы на "Test" можна праверыць сувязь з Loki.
Які робіцца запыты да Loki
Цяпер перайдзіце ў Grafana у раздзел "Explore". Пры прыёме логаў ад кантэйнераў Loki дадае метададзеныя ад Kubernetes. Такім чынам, становіцца магчымым праглядаць логі вызначанага кантэйнера.
Напрыклад, для выбару логаў кантэйнера promtail можна выкарыстоўваць наступны запыт: {container_name = "promtail"}
.
Тут таксама не забудзьцеся абраць крыніцу дадзеных Loki.
Гэты запыт верне актыўнасць кантэйнераў у наступным выглядзе:
Вынік запыту ў Grafana
Даданне на дашборд
Пачынаючы з Grafana 6.4, можна змясціць інфармацыю аб логах непасрэдна на дашборд. Пасля гэтага карыстач зможа хутка перамыкацца паміж колькасцю запытаў на яго сайце да трэйс прыкладання.
Ніжэй прыведзены прыклад дашборда, які рэалізуе гэтае ўзаемадзеянне:
Узор дашборда з метрыкамі 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, якія адлюстроўваюцца ў Grafana
Становіцца магчымым выкарыстоўваць адно з палёў JSON, напрыклад, для:
- спасылкі на знешні інструмент
- фільтрацыі змесціва логаў
Напрыклад, вы можаце клікнуць на traceId, каб перайсці ў Zipkin ці Jaeger.
Традыцыйна чакаем вашыя каментары і запрашаем на
Крыніца: habr.com