Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

ΠœΡ‹ Π² Badoo постоянно ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠΌ свСТиС Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΈ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅ΠΌ, стоит Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² нашСй систСмС. Одним ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… исслСдований ΠΈ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с сообщСством. Оно посвящСно Loki β€” систСмС агрСгирования Π»ΠΎΠ³ΠΎΠ².

Loki β€” это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для хранСния ΠΈ просмотра Π»ΠΎΠ³ΠΎΠ², Ρ‚Π°ΠΊΠΆΠ΅ этот стСк прСдоставляСт Π³ΠΈΠ±ΠΊΡƒΡŽ систСму для ΠΈΡ… Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Prometheus. Π’ ΠΌΠ°Π΅ Π²Ρ‹ΡˆΠ»ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ создатСли. Нас заинтСрСсовало, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π΅Ρ‚ Loki, ΠΊΠ°ΠΊΠΈΠ΅ возмоТности прСдоставляСт ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΉ стСпСни ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ELK β€” стСка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ сСйчас.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Loki

Grafana Loki β€” это Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² для ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΉ систСмы Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π»ΠΎΠ³Π°ΠΌΠΈ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… систСм Loki основан Π½Π° ΠΈΠ΄Π΅Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Π»ΠΎΠ³ΠΎΠ² β€” labels (Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² Prometheus), a сами Π»ΠΎΠ³ΠΈ ΡΠΆΠΈΠΌΠ°Ρ‚ΡŒ рядом Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‡Π°Π½ΠΊΠΈ.

Π”ΠΎΠΌΠ°ΡˆΠ½ΡΡ страница, GitHub

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ описанию Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Loki, Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ подразумСваСтся ΠΏΠΎΠ΄ Β«ΠΈΠ΄Π΅Π΅ΠΉ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅Β». Π‘Ρ€Π°Π²Π½ΠΈΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Loki ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Elasticsearch, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ строки ΠΈΠ· Π»ΠΎΠ³Π° nginx:

172.19.0.4 - - [01/Jun/2020:12:05:03 +0000] "GET /purchase?user_id=75146478&item_id=34234 HTTP/1.1" 500 8102 "-" "Stub_Bot/3.0" "0.001"

Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы парсят строку Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ поля с большим количСством ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ user_id ΠΈ item_id, ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ всё Π² большиС индСксы. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠΌ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ слоТныС запросы быстро, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΡ‡Ρ‚ΠΈ всС Π΄Π°Π½Π½Ρ‹Π΅ β€” Π² индСксС. Но Π·Π° это приходится ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ индСкс становится большим, Ρ‡Ρ‚ΠΎ выливаСтся Π² трСбования ΠΊ памяти. Π’ ΠΈΡ‚ΠΎΠ³Π΅ полнотСкстовый индСкс Π»ΠΎΠ³ΠΎΠ² сопоставим ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ с самими Π»ΠΎΠ³Π°ΠΌΠΈ. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎ Π½Π΅ΠΌΡƒ быстро ΠΈΡΠΊΠ°Ρ‚ΡŒ, индСкс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. И Ρ‡Π΅ΠΌ большС Π»ΠΎΠ³ΠΎΠ², Ρ‚Π΅ΠΌ быстрСС индСкс увСличиваСтся ΠΈ Ρ‚Π΅ΠΌ большС памяти ΠΎΠ½ потрСбляСт.

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ Loki Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ· строки Π±Ρ‹Π»ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, количСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Π²Π΅Π»ΠΈΠΊΠΎ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ нСбольшой индСкс ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΡ ΠΈΡ… ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΠΎ проиндСксированным полям, Π° Π·Π°Ρ‚Π΅ΠΌ сканируя ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π΅ΡΡ рСгулярными выраТСниями ΠΈΠ»ΠΈ поиском подстроки. ΠŸΡ€ΠΎΡ†Π΅ΡΡ каТСтся Π½Π΅ самым быстрым, Π½ΠΎ Loki раздСляСт запрос Π½Π° нСсколько частСй ΠΈ выполняСт ΠΈΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, обрабатывая большоС количСство Π΄Π°Π½Π½Ρ‹Ρ… Π·Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ врСмя. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΡˆΠ°Ρ€Π΄ΠΎΠ² ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… запросов Π² Π½ΠΈΡ… конфигурируСтся; Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, количСство Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π·Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ зависит ΠΎΡ‚ количСства прСдоставлСнных рСсурсов.

Π­Ρ‚ΠΎΡ‚ компромисс ΠΌΠ΅ΠΆΠ΄Ρƒ большим быстрым индСксом ΠΈ малСньким индСксом с ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ΠΎΠΌ позволяСт Loki ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ систСмы. Π•Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π³ΠΈΠ±ΠΊΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Π² соотвСтствии с потрСбностями.

Loki-стСк состоит ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²: Promtail, Loki, Grafana. Promtail собираСт Π»ΠΎΠ³ΠΈ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ… ΠΈ отправляСт Π² Loki. Loki ΠΈΡ… Ρ…Ρ€Π°Π½ΠΈΡ‚. А Grafana ΡƒΠΌΠ΅Π΅Ρ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Loki ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ…. Π’ΠΎΠΎΠ±Ρ‰Π΅ Loki ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для хранСния Π»ΠΎΠ³ΠΎΠ² ΠΈ поиска ΠΏΠΎ Π½ΠΈΠΌ. Π’Π΅ΡΡŒ стСк Π΄Π°Ρ‘Ρ‚ большиС возмоТности ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·Ρƒ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Prometheus way.
ОписаниС процСсса установки ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ здСсь.

Поиск по логам

Π˜ΡΠΊΠ°Ρ‚ΡŒ ΠΏΠΎ Π»ΠΎΠ³Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ интСрфСйсС Grafana β€” Explorer. Для запросов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ язык LogQL, ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° PromQL, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉΡΡ Π² Prometheus. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ распрСдСлённый grep.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ поиска выглядит Ρ‚Π°ΠΊ:

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

Π‘Π°ΠΌ запрос состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй: selector ΠΈ filter. Selector β€” это поиск ΠΏΠΎ индСксированным ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌ (Π»Π΅ΠΉΠ±Π»Π°ΠΌ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ присвоСны Π»ΠΎΠ³Π°ΠΌ, Π° filter β€” поисковая строка ΠΈΠ»ΠΈ рСгэксп, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ записи, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ сСлСктором. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: Π’ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках β€” сСлСктор, всС Ρ‡Ρ‚ΠΎ послС β€” Ρ„ΠΈΠ»ΡŒΡ‚Ρ€.

{image_name="nginx.promtail.test"} |= "index"

Из-Π·Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Loki нСльзя Π΄Π΅Π»Π°Ρ‚ΡŒ запросы Π±Π΅Π· сСлСктора, Π½ΠΎ Π»Π΅ΠΉΠ±Π»Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ сколь ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ.

Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€ β€” это key-value значСния Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках. МоТно ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСлСкторы ΠΈ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ условия поиска, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ =, != ΠΈΠ»ΠΈ рСгулярныС выраТСния:

{instance=~"kafka-[23]",name!="kafka-dev"} 
// Найдёт Π»ΠΎΠ³ΠΈ с Π»Π΅ΠΉΠ±Π»ΠΎΠΌ instance, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ kafka-2, kafka-3, ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ dev 

Π€ΠΈΠ»ΡŒΡ‚Ρ€ β€” это тСкст ΠΈΠ»ΠΈ рСгэксп, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚ всС Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ сСлСктором.

Π•ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ получСния ad-hoc-Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ metrics. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ частоту появлСния Π² Π»ΠΎΠ³Π°Ρ… nginx записи, содСрТащСй строку index:

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

ПолноС описаниС возмоТностСй ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ LogQL.

ΠŸΠ°Ρ€ΡΠΈΠ½Π³ Π»ΠΎΠ³ΠΎΠ²

Π•ΡΡ‚ΡŒ нСсколько способов ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ:

  • Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Promtail, стандартного ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° стСка для сбора Π»ΠΎΠ³ΠΎΠ².
  • ΠΠ°ΠΏΡ€ΡΠΌΡƒΡŽ с Π΄ΠΎΠΊΠ΅Ρ€-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Loki Docker Logging Driver.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Fluentd ΠΈΠ»ΠΈ Fluent Bit, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Loki. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Promtail ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ парсСры практичСски для любого Π²ΠΈΠ΄Π° Π»ΠΎΠ³Π° ΠΈ ΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΌ числС с multiline-Π»ΠΎΠ³Π°ΠΌΠΈ.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ для парсинга ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Promtail. Он Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ Π²Π΅Ρ‰ΠΈ:

  • Находит источники Π΄Π°Π½Π½Ρ‹Ρ….
  • ΠŸΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»ΡΠ΅Ρ‚ ΠΊ Π½ΠΈΠΌ Π»Π΅ΠΉΠ±Π»Ρ‹.
  • ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Loki.

Π’ настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Promtail ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ с Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ с systemd journal. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСн Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π»ΠΎΠ³ΠΈ.

Π•ΡΡ‚ΡŒ интСграция с Kubernetes: Promtail автоматичСски Ρ‡Π΅Ρ€Π΅Π· Kubernetes REST API ΡƒΠ·Π½Π°Ρ‘Ρ‚ состояниС кластСра ΠΈ собираСт Π»ΠΎΠ³ΠΈ с Π½ΠΎΠ΄Ρ‹, сСрвиса ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π°, сразу Ρ€Π°Π·Π²Π΅ΡˆΠΈΠ²Π°Ρ Π»Π΅ΠΉΠ±Π»Ρ‹ Π½Π° основС ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Kubernetes (имя ΠΏΠΎΠ΄Π°, имя Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ‚. Π΄.).

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π²Π΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π»Π΅ΠΉΠ±Π»Ρ‹ Π½Π° основС Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π»ΠΎΠ³Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Pipeline. Pipeline Promtail ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… Ρ‚ΠΈΠΏΠΎΠ² стадий. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ β€” Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Ρ‚ΡƒΡ‚ ΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Ρƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡŽΠ°Π½ΡΡ‹.

  1. Parsing stages. Π­Ρ‚ΠΎ стадия RegEx ΠΈ JSON. На этом этапС ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π»ΠΎΠ³ΠΎΠ² Π² Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ extracted map. Π˜Π·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· JSON, просто копируя Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ поля Π² extracted map, ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· рСгулярныС выраТСния (RegEx), Π³Π΄Π΅ Π² extracted map β€œΠΌΠ°ΠΏΡΡ‚ΡΡβ€ named groups. Extracted map прСдставляСт собой key-value Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, Π³Π΄Π΅ key β€” имя поля, Π° value β€” Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π»ΠΎΠ³ΠΎΠ².
  2. Transform stages. Π£ этой стадии Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΎΠΏΡ†ΠΈΠΈ: transform, Π³Π΄Π΅ ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π° трансформации, ΠΈ source β€” источник Π΄Π°Π½Π½Ρ‹Ρ… для трансформации ΠΈΠ· extracted map. Если Π² extracted map Ρ‚Π°ΠΊΠΎΠ³ΠΎ поля Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ создано. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π»Π΅ΠΉΠ±Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ основаны Π½Π° extracted map. На этом этапС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² extracted map, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ достаточно ΠΌΠΎΡ‰Π½Ρ‹ΠΉ Golang Template. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π°Π΄ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ extracted map Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ загруТаСтся ΠΏΡ€ΠΈ парсингС, Ρ‡Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π½Π΅ΠΉ: β€œ{{if .tag}tag value exists{end}}”. Template ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ условия, Ρ†ΠΈΠΊΠ»Ρ‹ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ строковыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Replace ΠΈ Trim.
  3. Action stages. На этом этапС ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ с ΠΈΠ·Π²Π»Π΅Ρ‡Ρ‘Π½Π½Ρ‹ΠΌ:
    • Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π»Π΅ΠΉΠ±Π» ΠΈΠ· extracted data, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ проиндСксируСтся Loki.
    • Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ врСмя события ΠΈΠ· Π»ΠΎΠ³Π°.
    • Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ (тСкст Π»ΠΎΠ³Π°), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΉΠ΄ΡƒΡ‚ Π² Loki.
    • Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ.
  4. Filtering stages. Бтадия match, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² /dev/null записи, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹, Π»ΠΈΠ±ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π° Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

ΠŸΠΎΠΊΠ°ΠΆΡƒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… nginx-Π»ΠΎΠ³ΠΎΠ², ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Promtail.

Для тСста Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ Π² качСствС nginx-proxy ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· nginx jwilder/nginx-proxy:alpine ΠΈ нСбольшой Π΄Π΅ΠΌΠΎΠ½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ сам сСбя ΠΏΠΎ HTTP. Π£ Π΄Π΅ΠΌΠΎΠ½Π° Π·Π°Π΄Π°Π½ΠΎ нСсколько эндпоинтов, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ HTTP-статусами ΠΈ с Ρ€Π°Π·Π½ΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ.

Π‘ΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ Π±ΡƒΠ΄Π΅ΠΌ с Π΄ΠΎΠΊΠ΅Ρ€-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ /var/lib/docker/containers/<container_id>/<container_id>-json.log

Π’ docker-compose.yml настраиваСм Promtail ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°:

promtail:
  image: grafana/promtail:1.4.1
 // ...
 volumes:
   - /var/lib/docker/containers:/var/lib/docker/containers:ro
   - promtail-data:/var/lib/promtail/positions
   - ${PWD}/promtail/docker.yml:/etc/promtail/promtail.yml
 command:
   - '-config.file=/etc/promtail/promtail.yml'
 // ...

ДобавляСм Π² promtail.yml ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ Π»ΠΎΠ³ΠΎΠ² (Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ Π΅ΡΡ‚ΡŒ опция "docker", которая Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС ΠΎΠ΄Π½ΠΎΠΉ строчкой, Π½ΠΎ это Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ Ρ‚Π°ΠΊ наглядно):

scrape_configs:
 - job_name: containers

   static_configs:
       labels:
         job: containerlogs
         __path__: /var/lib/docker/containers/*/*log  # for linux only

ΠŸΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² Loki Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ со всСх ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². Π§Ρ‚ΠΎΠ±Ρ‹ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, мСняСм настройки тСстового nginx Π² docker-compose.yml β€” добавляСм Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ tag:

proxy:
 image: nginx.test.v3
//…
 logging:
   driver: "json-file"
   options:
     tag: "{{.ImageName}}|{{.Name}}"

ΠŸΡ€Π°Π²ΠΈΠΌ promtail.yml ΠΈ настраиваСм Pipeline. На Π²Ρ…ΠΎΠ΄ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π»ΠΎΠ³ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π°:

{"log":"u001b[0;33;1mnginx.1    | u001b[0mnginx.test 172.28.0.3 - - [13/Jun/2020:23:25:50 +0000] "GET /api/index HTTP/1.1" 200 0 "-" "Stub_Bot/0.1" "0.096"n","stream":"stdout","attrs":{"tag":"nginx.promtail.test|proxy.prober"},"time":"2020-06-13T23:25:50.66740443Z"}
{"log":"u001b[0;33;1mnginx.1    | u001b[0mnginx.test 172.28.0.3 - - [13/Jun/2020:23:25:50 +0000] "GET /200 HTTP/1.1" 200 0 "-" "Stub_Bot/0.1" "0.000"n","stream":"stdout","attrs":{"tag":"nginx.promtail.test|proxy.prober"},"time":"2020-06-13T23:25:50.702925272Z"}

Pipeline stage:

 - json:
     expressions:
       stream: stream
       attrs: attrs
       tag: attrs.tag

ИзвлСкаСм ΠΈΠ· входящСго JSON поля stream, attrs, attrs.tag (Ссли ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ) ΠΈ ΠΊΠ»Π°Π΄Ρ‘ΠΌ ΠΈΡ… Π² extracted map.

 - regex:
     expression: ^(?P<image_name>([^|]+))|(?P<container_name>([^|]+))$
     source: "tag"

Если ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π΅ tag Π² extracted map, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ рСгэкспа ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠΌΠ΅Π½Π° ΠΎΠ±Ρ€Π°Π·Π° ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

 - labels:
     image_name:
     container_name:

НазначаСм Π»Π΅ΠΉΠ±Π»Ρ‹. Если Π² extracted data Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ ΠΊΠ»ΡŽΡ‡ΠΈ image_name ΠΈ container_name, Ρ‚ΠΎ ΠΈΡ… значСния Π±ΡƒΠ΄ΡƒΡ‚ присвоСны ΡΠΎΠΎΡ‚Π²Π΅ΡΡ‚ΡƒΡŽΡ‰ΠΈΠΌ Π»Π΅ΠΉΠ±Π»Π°ΠΌ.

 - match:
     selector: '{job="docker",container_name="",image_name=""}'
     action: drop

ΠžΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°Π΅ΠΌ всС Π»ΠΎΠ³ΠΈ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ установлСнныС labels image_name ΠΈ container_name.

  - match:
     selector: '{image_name="nginx.promtail.test"}'
     stages:
       - json:
           expressions:
             row: log

Для всСх Π»ΠΎΠ³ΠΎΠ², Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… image_name Ρ€Π°Π²Π΅Π½ nginx.promtail.test, ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· исходного Π»ΠΎΠ³Π° ΠΏΠΎΠ»Π΅ log ΠΈ ΠΊΠ»Π°Π΄Ρ‘ΠΌ Π΅Π³ΠΎ Π² extracted map с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ row.

  - regex:
         # suppress forego colors
         expression: .+nginx.+|.+[0m(?P<virtual_host>[a-z_.-]+) +(?P<nginxlog>.+)
         source: logrow

ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ Π²Ρ…ΠΎΠ΄Π½ΡƒΡŽ строку рСгулярными выраТСниями ΠΈ вытаскиваСм nginx virtual host ΠΈ строку Π»ΠΎΠ³Π° nginx.

     - regex:
         source: nginxlog
         expression: ^(?P<ip>[w.]+) - (?P<user>[^ ]*) [(?P<timestamp>[^ ]+).*] "(?P<method>[^ ]*) (?P<request_url>[^ ]*) (?P<request_http_protocol>[^ ]*)" (?P<status>[d]+) (?P<bytes_out>[d]+) "(?P<http_referer>[^"]*)" "(?P<user_agent>[^"]*)"( "(?P<response_time>[d.]+)")?

ΠŸΠ°Ρ€ΡΠΈΠΌ nginx-Π»ΠΎΠ³ рСгулярными выраТСниями.

    - regex:
           source: request_url
           expression: ^.+.(?P<static_type>jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
     - regex:
           source: request_url
           expression: ^/photo/(?P<photo>[^/?.]+).*$
       - regex:
           source: request_url
           expression: ^/api/(?P<api_request>[^/?.]+).*$

Π Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ request_url. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСгэкспа опрСдСляСм Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ запроса: ΠΊ статикС, ΠΊ Ρ„ΠΎΡ‚ΠΊΠ°ΠΌ, ΠΊ API ΠΈ устанавливаСм Π² extracted map ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ»ΡŽΡ‡.

       - template:
           source: request_type
           template: "{{if .photo}}photo{{else if .static_type}}static{{else if .api_request}}api{{else}}other{{end}}"

ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ условных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² Template провСряСм установлСнныС поля Π² extracted map ΠΈ устанавливаСм для поля request_type Π½ΡƒΠΆΠ½Ρ‹Π΅ значСния: photo, static, API. НазначаСм other, Ссли Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ request_type содСрТит Ρ‚ΠΈΠΏ запроса.

       - labels:
           api_request:
           virtual_host:
           request_type:
           status:

УстанавливаСм Π»Π΅ΠΉΠ±Π»Ρ‹ api_request, virtual_host, request_type ΠΈ статус (HTTP status) Π½Π° основании Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² extracted map.

       - output:
           source: nginx_log_row

МСняСм output. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² Loki ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ nginx-Π»ΠΎΠ³ ΠΈΠ· extracted map.

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

ПослС запуска ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи присвоСны ΠΌΠ΅Ρ‚ΠΊΠΈ Π½Π° основС Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π»ΠΎΠ³Π°.

НуТно ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠΊ с большим количСством Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (cardinality) ΠΌΠΎΠΆΠ΅Ρ‚ сущСствСнно Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Loki. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ стоит ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² индСкс, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, user_id. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этом Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ β€œHow labels in Loki can make log queries faster and easier”. Но это Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ нСльзя ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΏΠΎ user_id Π±Π΅Π· индСксов. НуТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΏΡ€ΠΈ поискС (Β«Π³Ρ€Π΅ΠΏΠ°Ρ‚ΡŒΒ» ΠΏΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ), Π° индСкс здСсь выступаСт ΠΊΠ°ΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Визуализация Π»ΠΎΠ³ΠΎΠ²

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

Loki ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² Ρ€ΠΎΠ»ΠΈ источника Π΄Π°Π½Π½Ρ‹Ρ… для Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² Grafana, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ LogQL. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • rate β€” количСство записСй Π² сСкунду;
  • count over time β€” количСство записСй Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅.

Π•Ρ‰Ρ‘ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Sum, Avg ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. МоТно ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ достаточно слоТныС Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π³Ρ€Π°Ρ„ΠΈΠΊ количСства HTTP-ошибок:

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ data source Loki нСсколько ΡƒΡ€Π΅Π·Π°Π½ ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с data source Prometheus (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, нСльзя ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π»Π΅Π³Π΅Π½Π΄Ρƒ), Π½ΠΎ Loki ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ источник с Ρ‚ΠΈΠΏΠΎΠΌ Prometheus. Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ это Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π½ΠΎ, судя ΠΏΠΎ ΠΎΡ‚Π²Π΅Ρ‚Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² β€œHow to configure Loki as Prometheus datasource? Β· Issue #1222 Β· grafana/loki”, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, это Π²ΠΏΠΎΠ»Π½Π΅ Π·Π°ΠΊΠΎΠ½Π½ΠΎ, ΠΈ Loki ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ совмСстим с PromQL.

ДобавляСм Loki ΠΊΠ°ΠΊ data source с Ρ‚ΠΈΠΏΠΎΠΌ Prometheus ΠΈ дописываСм URL /loki:

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

И ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, ΠΊΠ°ΠΊ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π±Ρ‹ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°ΠΌΠΈ ΠΈΠ· Prometheus:

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ расхоТдСниС Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ это поправят.

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ

Π’ Loki доступны Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ извлСчСния числовых ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΈΠ· Π»ΠΎΠ³ΠΎΠ² ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΈΡ… Π² Prometheus. НапримСр, Π² Π»ΠΎΠ³Π΅ nginx присутствуСт количСство Π±Π°ΠΉΡ‚ΠΎΠ² Π½Π° ΠΎΡ‚Π²Π΅Ρ‚, Π° Ρ‚Π°ΠΊΠΆΠ΅, ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ стандартного Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π»ΠΎΠ³Π°, ΠΈ врСмя Π² сСкундах, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π½Π° ΠΎΡ‚Π²Π΅Ρ‚. Π­Ρ‚ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² Prometheus.

ДобавляСм Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Ρƒ ΡΠ΅ΠΊΡ†ΠΈΡŽ Π² promtail.yml:

- match:
   selector: '{request_type="api"}'
   stages:
     - metrics:
         http_nginx_response_time:
           type: Histogram
           description: "response time ms"
           source: response_time
           config:
             buckets: [0.010,0.050,0.100,0.200,0.500,1.0]
- match:
   selector: '{request_type=~"static|photo"}'
   stages:
     - metrics:
         http_nginx_response_bytes_sum:
           type: Counter
           description: "response bytes sum"
           source: bytes_out
           config:
             action: add
         http_nginx_response_bytes_count:
           type: Counter
           description: "response bytes count"
           source: bytes_out
           config:
             action: inc

ΠžΠΏΡ†ΠΈΡ позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π° основС Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· extracted map. Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Loki β€” ΠΎΠ½ΠΈ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² Promtail /metrics endpoint. Prometheus Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ сконфигурирован Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π½Π° этой стадии. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ для request_type=β€œapi” ΠΌΡ‹ собираСм ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΡƒ-гистограмму. Π‘ этим Ρ‚ΠΈΠΏΠΎΠΌ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Ρ†Π΅Π½Ρ‚ΠΈΠ»ΠΈ. Для статики ΠΈ Ρ„ΠΎΡ‚ΠΎ ΠΌΡ‹ собираСм сумму Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ количСство строк, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π±Π°ΠΉΡ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°Ρ… Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ здСсь.

ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΡ€Ρ‚ Π½Π° Promtail:

promtail:
     image: grafana/promtail:1.4.1
     container_name: monitoring.promtail
     expose:
       - 9080
     ports:
       - "9080:9080"

УбСТдаСмся, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ с прСфиксом promtail_custom появились:

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

НастраиваСм Prometheus. ДобавляСм job promtail:

- job_name: 'promtail'
 scrape_interval: 10s
 static_configs:
   - targets: ['promtail:9080']

И рисуСм Π³Ρ€Π°Ρ„ΠΈΠΊ:

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ самых ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Ρ… запроса. Π’Π°ΠΊΠΆΠ΅ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³.

ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Loki ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ (single binary mode), Ρ‚Π°ΠΊ ΠΈ Π² ΡˆΠ°Ρ€Π΄ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ (horizontally-scalable mode). Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΠ±Π»Π°ΠΊΠΎ, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ Ρ‡Π°Π½ΠΊΠΈ ΠΈ индСкс хранятся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. Π’ вСрсии 1.5 Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ хранСния Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС, Π½ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅.

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

Π§Π°Π½ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² S3-совмСстимом Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, для хранСния индСксов β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…: Cassandra, BigTable ΠΈΠ»ΠΈ DynamoDB. Π”Ρ€ΡƒΠ³ΠΈΠ΅ части Loki β€” Distributors (для записи) ΠΈ Querier (для запросов) β€” stateless ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎ.

На ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ DevOpsDays Vancouver 2019 ΠΎΠ΄ΠΈΠ½ ΠΈΠ· участников Callum Styan ΠΎΠ·Π²ΡƒΡ‡ΠΈΠ», Ρ‡Ρ‚ΠΎ с Loki Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ΅Ρ‚Π°Π±Π°ΠΉΡ‚Ρ‹ Π»ΠΎΠ³ΠΎΠ² с индСксом мСньшС 1% ΠΎΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°: β€œHow Loki Correlates Metrics and Logs β€” And Saves You Money”.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Loki ΠΈ ELK

Π Π°Π·ΠΌΠ΅Ρ€ индСкса

Для тСстирования ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° индСкса я взял Π»ΠΎΠ³ΠΈ с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° nginx, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ настраивался Pipeline, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅. Π€Π°ΠΉΠ» с Π»ΠΎΠ³Π°ΠΌΠΈ содСрТал 406 624 строки суммарным ΠΎΠ±ΡŠΡ‘ΠΌΠΎΠΌ 109 Мб. Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ Π»ΠΎΠ³ΠΈ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ часа, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΠΎ 100 записСй Π² сСкунду.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π²ΡƒΡ… строк ΠΈΠ· Π»ΠΎΠ³Π°:

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

ΠŸΡ€ΠΈ индСксации ELK это Π΄Π°Π»ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ индСкса 30,3 Мб:

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

Π’ случаС с Loki это Π΄Π°Π»ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 128 Кб индСкса ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 3,8 Мб Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‡Π°Π½ΠΊΠ°Ρ…. Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π»ΠΎΠ³ Π±Ρ‹Π» искусствСнно сгСнСрирован ΠΈ Π½Π΅ отличался большим Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ gzip Π½Π° исходном докСровском JSON-Π»ΠΎΠ³Π΅ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π΄Π°Π²Π°Π» ΠΊΠΎΠΌΠΏΡ€Π΅ΡΡΠΈΡŽ 95,4%, Π° с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² сам Loki посылался Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ nginx-Π»ΠΎΠ³, Ρ‚ΠΎ сТатиС Π΄ΠΎ 4 Мб объяснимо. Π‘ΡƒΠΌΠΌΠ°Ρ€Π½ΠΎΠ΅ количСство ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для Π»Π΅ΠΉΠ±Π»ΠΎΠ² Loki Π±Ρ‹Π»ΠΎ 35, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ нСбольшой Ρ€Π°Π·ΠΌΠ΅Ρ€ индСкса. Для ELK Π»ΠΎΠ³ Ρ‚Π°ΠΊΠΆΠ΅ очищался. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Loki сТал исходныС Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° 96%, Π° ELK β€” Π½Π° 70%.

ΠŸΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈ с Loki

Если ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ вСсь стСк Prometheus ΠΈ ELK, Ρ‚ΠΎ Loki «Сст» Π² нСсколько Ρ€Π°Π· мСньшС. ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ сСрвис Π½Π° Go потрСбляСт мСньшС, Ρ‡Π΅ΠΌ сСрвис Π½Π° Java, ΠΈ сравнСниС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° JVM Heap Elasticsearch ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти для Loki Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, Π½ΠΎ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Loki ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшС памяти. Π•Π³ΠΎ прСимущСство ΠΏΠΎ CPU Π½Π΅ Ρ‚Π°ΠΊ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ присутствуСт.

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ

Loki быстрСС Β«ΠΏΠΎΠΆΠΈΡ€Π°Π΅Ρ‚Β» Π»ΠΎΠ³ΠΈ. Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ зависит ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ² β€” Ρ‡Ρ‚ΠΎ Π·Π° Π»ΠΎΠ³ΠΈ, ΠΊΠ°ΠΊ ΠΈΠ·ΠΎΡ‰Ρ€Ρ‘Π½Π½ΠΎ ΠΌΡ‹ ΠΈΡ… парсим, ΡΠ΅Ρ‚ΡŒ, диск ΠΈ Ρ‚. Π΄. β€” Π½ΠΎ ΠΎΠ½Π° ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ Ρƒ ELK (Π² ΠΌΠΎΡ‘ΠΌ тСстС β€” ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² Π΄Π²Π° Ρ€Π°Π·Π°). ΠžΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ это Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Loki ΠΊΠ»Π°Π΄Ρ‘Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшС Π΄Π°Π½Π½Ρ‹Ρ… Π² индСкс ΠΈ, соотвСтствСнно, мСньшС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ Π½Π° индСксированиС. Π‘ΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ поиска ΠΏΡ€ΠΈ этом ситуация обратная: Loki ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎ ΠΏΡ€ΠΈΡ‚ΠΎΡ€ΠΌΠ°ΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π° Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚ΠΎΠ², Ρƒ ELK ΠΆΠ΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ поиска ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ зависит.

Поиск по логам

Loki сущСствСнно уступаСт ELK ΠΏΠΎ возмоТностям поиска ΠΏΠΎ Π»ΠΎΠ³Π°ΠΌ. Grep с рСгулярными выраТСниями β€” это сильная Π²Π΅Ρ‰ΡŒ, Π½ΠΎ ΠΎΠ½ уступаСт взрослой Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ range-запросов, агрСгация Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Π»Π΅ΠΉΠ±Π»Π°ΠΌ, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π±Π΅Π· Π»Π΅ΠΉΠ±Π»ΠΎΠ² β€” всё это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ нас Π² поисках ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Loki. Π­Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Loki Π½ΠΈΡ‡Π΅Π³ΠΎ нСльзя Π½Π°ΠΉΡ‚ΠΈ, Π½ΠΎ опрСдСляСт Ρ„Π»ΠΎΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π»ΠΎΠ³Π°ΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ сначала Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ°Ρ… Prometheus, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎ этим Π»Π΅ΠΉΠ±Π»Π°ΠΌ ΠΈΡ‰Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π² Π»ΠΎΠ³Π°Ρ….

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, это красиво (ΠΈΠ·Π²ΠΈΠ½ΠΈΡ‚Π΅, Π½Π΅ ΠΌΠΎΠ³ ΡƒΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ). Grafana ΠΈΠΌΠ΅Π΅Ρ‚ приятный Π³Π»Π°Π·Ρƒ интСрфСйс, Π½ΠΎ Kibana Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°.

ΠŸΠ»ΡŽΡΡ‹ ΠΈ минусы Loki

Из плюсов ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Loki интСгрируСтся с Prometheus, соотвСтствСнно, ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΈ Π°Π»Π΅Ρ€Ρ‚ΠΈΠ½Π³ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ. Он ΡƒΠ΄ΠΎΠ±Π΅Π½ для сбора Π»ΠΎΠ³ΠΎΠ² ΠΈ ΠΈΡ… хранСния с Kubernetes Pods, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ унаслСдованный ΠΎΡ‚ Prometheus service discovery ΠΈ автоматичСски Π½Π°Π²Π΅ΡˆΠΈΠ²Π°Π΅Ρ‚ Π»Π΅ΠΉΠ±Π»Ρ‹.

Из минусов β€” слабая докумСнтация. НСкоторыС Π²Π΅Ρ‰ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ особСнности ΠΈ возмоТности Promtail, я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² процСссС изучСния ΠΊΠΎΠ΄Π°, Π±Π»Π°Π³ΠΎ open-source. Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ минус β€” слабыС возмоТности парсинга. НапримСр, Loki Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ multiline-Π»ΠΎΠ³ΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΊ нСдостаткам ΠΌΠΎΠΆΠ½ΠΎ отнСсти Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Loki β€” ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ молодая тСхнология (Ρ€Π΅Π»ΠΈΠ· 1.0 Π±Ρ‹Π» Π² ноябрС 2019 Π³ΠΎΠ΄Π°).

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Loki β€” Π½Π° 100% интСрСсная тСхнология, которая ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΈ срСдних ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², позволяя Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ мноТСство Π·Π°Π΄Π°Ρ‡ агрСгирования Π»ΠΎΠ³ΠΎΠ², поиска ΠΏΠΎ Π»ΠΎΠ³Π°ΠΌ, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π»ΠΎΠ³ΠΎΠ².

ΠœΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Loki Π² Badoo, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π΅ΠΌ ELK-стСк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ нас устраиваСт ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π° ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ‚ оброс Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ кастомными Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ. Для нас ΠΊΠ°ΠΌΠ½Π΅ΠΌ прСткновСния являСтся поиск ΠΏΠΎ Π»ΠΎΠ³Π°ΠΌ. ИмСя ΠΏΠΎΡ‡Ρ‚ΠΈ 100 Π“Π± Π»ΠΎΠ³ΠΎΠ² Π² дСнь, Π½Π°ΠΌ Π²Π°ΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ всё ΠΈ Ρ‡ΡƒΡ‚ΡŒ-Ρ‡ΡƒΡ‚ΡŒ большС ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ это быстро. Для построСния Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚ΠΎΡ‡Π΅Π½Ρ‹ ΠΏΠΎΠ΄ наши Π½ΡƒΠΆΠ΄Ρ‹ ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ собой. Π£ стСка Loki Π΅ΡΡ‚ΡŒ ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΡ‹Π΅ ΠΏΠ»ΡŽΡΡ‹, Π½ΠΎ ΠΎΠ½ Π½Π΅ даст Π½Π°ΠΌ большС, Ρ‡Π΅ΠΌ Ρƒ нас Π΅ΡΡ‚ΡŒ, ΠΈ Π΅Π³ΠΎ прСимущСства Ρ‚ΠΎΡ‡Π½ΠΎ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΡ€ΠΎΡŽΡ‚ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ.

И хотя послС исслСдования стало понятно, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Loki ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, надССмся, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ пост ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π² Π²Ρ‹Π±ΠΎΡ€Π΅.

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с ΠΊΠΎΠ΄ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, находится Ρ‚ΡƒΡ‚.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com