Loki — събиране на логове, използвайки подхода Prometheus

Здравейте, хабровчани! В навечерието на новия набор за курс „DevOps практики и инструменти“ подготвихме за вас превод на интересен материал.

Тази статия е кратко въведение в Loki. Проектът Loki се подкрепя от Grafana и е насочен към централизирано събиране на логове (от сървъри или контейнери).

Основният източник на вдъхновение за Loki е Prometheus идеята да се прилагат неговите подходи в управлението на логовете:

  • използване на етикети (labels) за съхранение на данни
  • консумация на малко ресурси

Ще се върнем към принципите на работа на Prometheus и ще приведем няколко примера за неговото използване в контекста на Kubernetes.

Няколко думи за Prometheus

За да разберем напълно как функционира Loki, е важно да направим крачка назад и да си припомним малко за Prometheus.

Една от отличителните характеристики на Prometheus е извличането на метрики от точки за събиране (чрез експортери) и съхранението им в TSDB (база данни за времеви серии) с добавяне на метаданни под формата на етикети.

Защо е необходимо

В последно време Prometheus стана де факто стандарт в света на контейнерите и Kubernetes: инсталацията му е много проста, а в кластера Kubernetes по подразбиране присъства крайна точка за Prometheus. Prometheus също може да извлича метрики от приложения, разположени в контейнер, докато запазва определени етикети. Поради това мониторингът на приложения е много лесен за реализиране.

За съжаление, все още няма „готово“ решение за управление на логовете, и трябва да намерите решение за себе си:

  • управляван облачен сервиз за централизиране на логовете (AWS, Azure или Google)
  • сервис за мониторинг „мониторинг като услуга“ (monitoring as a service) (например, Datadog)
  • създаване на свой собствен сервиз за събиране на логове.

За третия вариант аз традиционно използвах Elasticsearch, въпреки че не винаги бях доволен от него (особено от тежестта и сложността на настройката).

Loki беше проектиран с цел опростяване на реализацията в съответствие с следните принципи:

  • да бъде лесен за стартиране
  • да консумира малко ресурси
  • да работи самостоятелно без никакво специално обслужване
  • да служи като допълнение на Prometheus, за да помогне при разследването на проблеми

Тази простота обаче идва с някои компромиси. Един от тях е, че съдържанието не се индексира. Заради това търсенето по текста не е особено ефективно или богато и не позволява статистика на текстовото съдържание. Но тъй като Loki иска да бъде еквивалент на grep и допълнение към Prometheus, това не е недостатък.

Разследване на инциденти

За да разберем по-добре защо на Loki не му е нужна индексация, да се върнем към метода за разследване на инциденти, използван от разработчиците на Loki:

Loki — събиране на логове, използвайки подхода Prometheus
1 Аларма → 2 Табло → 3 Adhoc Запитване → 4 Агрегация на логове → 5 Разпределено проследяване → 6 Поправка!
(1 Аларма → 2 Табло → 3 Adhoc Запитване → 4 Агрегация на логове → 5 Разпределено проследяване → 6 Поправка!)

Идеята е, че получаваме някаква аларма (Slack известие, 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: като Prometheus, но за логове.
loki/loki-stack 0.19.1 v0.4.0 Loki: като Prometheus, но за логове.
loki/fluent-bit 0.0.2  v0.0.1 Използва fluent-bit Loki go плъгин за...
loki/promtail   0.13.1 v0.4.0 Отговаря за събиране на логовете и...

Тези пакети имат следните функции:

  • пакета 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

Когато стартирате тази команда, трябва да получите следния изход:

ПОСЛЕДНО РАЗГЪНАТО: Вт. 19 Ноем. 2019 15:56:54
ИМАТЕЛ: мониторинг
СТАТУС: РАЗГЪНАТО
РЕСУРСИ:
==> v1/ClusterRole
ИМЕ ВЪЗРАСТ
loki-promtail-clusterrole 189d
…
ЗАБЕЛЕЖКИ:
Стекът Локи е разгънат в кластера ви. Локи може да бъде добавен като източник на данни в Grafana.
Вижте <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> за повече подробности.

Ако погледнем състоянието на подовете в пространството с имена "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

За да се свържете с Grafana в Kubernetes, трябва да отворите тунел към неговия под. По-долу е командата за отваряне на порт 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

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

От версия 6.4 на Grafana, е възможно да се постави информация за логовете директно на дашборда. След това потребителят може бързо да превключва между броя на заявките на сайта си и трасетата на приложението.

По-долу е пример за дашборд, реализиращ това взаимодействие:

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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster