
ΠΠΈΠ΅ Π² Badoo ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠ»Π΅Π΄ΠΈΠΌ Π·Π° Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΈ ΠΎΡΠ΅Π½ΡΠ²Π°ΠΌΠ΅ Π΄Π°Π»ΠΈ Π΄Π° Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π² Π½Π°ΡΠ°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΠ΄Π½ΠΎ ΠΎΡ ΡΠ΅Π·ΠΈ ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½ΠΈΡ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΠΌ Ρ ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ°. Π’ΠΎ Π΅ ΠΏΠΎΡΠ²Π΅ΡΠ΅Π½ΠΎ Π½Π° Loki β ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° Π°Π³ΡΠ΅Π³ΠΈΡΠ°Π½Π΅ Π½Π° Π»ΠΎΠ³Π°.
Loki Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅, ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠΎΠ·ΠΈ ΡΡΠ΅ΠΊ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π³ΡΠ²ΠΊΠ°Π²Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΡΡ Π½ΠΈΡ Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π² Prometheus. ΠΡΠ΅Π· ΠΌΠ°ΠΉ ΠΈΠ·Π»Π΅Π·Π΅ ΠΏΠΎΡΠ΅Π΄Π½Π°ΡΠ° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΡΠΎΠΌΠΎΡΠΈΡΠ°Ρ ΡΡΠ·Π΄Π°ΡΠ΅Π»ΠΈΡΠ΅. ΠΠ°Ρ Π½ΠΈ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ°Π²ΠΈ Loki, ΠΊΠ°ΠΊΠ²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΠΈ Π² ΠΊΠ°ΠΊΠ²Π° ΡΡΠ΅ΠΏΠ΅Π½ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° Π½Π° ELK β ΡΡΠ΅ΠΊΠ°, ΠΊΠΎΠΉΡΠΎ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅.
ΠΠ°ΠΊΠ²ΠΎ Π΅ Loki
Grafana Loki Π΅ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° ΡΡΠ»ΠΎΡΡΠ½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π»ΠΎΠ³Π°. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ, Loki Π΅ ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° ΠΈΠ΄Π΅ΡΡΠ° Π΄Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ° ΡΠ°ΠΌΠΎ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ β labels (ΠΊΠ°ΡΠΎ Π² Prometheus), Π° ΡΠ°ΠΌΠΈΡΠ΅ Π»ΠΎΠ³Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΠ° Π² ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΠ°Π½ΠΊΠΎΠ²Π΅.
,
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° 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.
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡΡ Π·Π° ΡΡΡΡΠ΅Π½Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:

Π‘Π°ΠΌΠ°ΡΠ° Π·Π°ΡΠ²ΠΊΠ° ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ Π΄Π²Π΅ ΡΠ°ΡΡΠΈ: ΡΠ΅Π»Π΅ΠΊΡΠΎΡ ΠΈ ΡΠΈΠ»ΡΡΡ. Π‘Π΅Π»Π΅ΠΊΡΠΎΡΡΡ Π΅ ΡΡΡΡΠ΅Π½Π΅ΡΠΎ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½ΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΠΈ (Π΅ΡΠΈΠΊΠ΅ΡΠΈ), ΠΊΠΎΠΈΡΠΎ ΡΠ° ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈ Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅, Π° ΡΠΈΠ»ΡΡΡΡΡ β ΡΡΡΡΠ°ΡΠΊΠ° ΠΈΠ»ΠΈ ΡΠ΅Π³Π΅ΠΊΡ, Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠΈΠ»ΡΡΠΈΡΠ°Ρ Π·Π°ΠΏΠΈΡΠΈΡΠ΅, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΎΡ ΡΠ΅Π»Π΅ΠΊΡΠΎΡΠ°. Π ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ: Π ΡΠΈΠ³ΡΡΠ½ΠΈΡΠ΅ ΡΠΊΠΎΠ±ΠΈ β ΡΠ΅Π»Π΅ΠΊΡΠΎΡΡΡ, Π²ΡΠΈΡΠΊΠΎ ΡΠ»Π΅Π΄ β ΡΠΈΠ»ΡΡΡ.
{image_name="nginx.promtail.test"} |= "index"ΠΠΎΡΠ°Π΄ΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° Loki Π½Π΅ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΡΡ Π·Π°ΡΠ²ΠΊΠΈ Π±Π΅Π· ΡΠ΅Π»Π΅ΠΊΡΠΎΡ, Π½ΠΎ Π΅ΡΠΈΠΊΠ΅ΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΎΠ±ΡΠΈ.
Π‘Π΅Π»Π΅ΠΊΡΠΎΡΡΡ Π΅ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ Π² ΡΠΈΠ³ΡΡΠ½ΠΈ ΡΠΊΠΎΠ±ΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΡΠ΅Π»Π΅ΠΊΡΠΎΡΠΈ ΠΈ Π΄Π° Π·Π°Π΄Π°Π²Π°ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ Π·Π° ΡΡΡΡΠ΅Π½Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ =, != ΠΈΠ»ΠΈ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ:
{instance=~"kafka-[23]",name!="kafka-dev"}
// ΠΠ°ΠΌΠΈΡΠ° Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ Ρ Π΅ΡΠΈΠΊΠ΅Ρ instance, ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ°Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡ kafka-2, kafka-3 ΠΈ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Ρ dev Π€ΠΈΠ»ΡΡΡΡΡ Π΅ ΡΠ΅ΠΊΡΡ ΠΈΠ»ΠΈ ΡΠ΅Π³Π΅ΠΊΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠΈΠ»ΡΡΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈ ΠΎΡ ΡΠ΅Π»Π΅ΠΊΡΠΎΡΠ°.
ΠΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ad-hoc Π³ΡΠ°ΡΠΈΠΊΠΈ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Π² ΡΠ΅ΠΆΠΈΠΌ metrics. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΡΠ΅ΡΡΠΎΡΠ°ΡΠ° Π½Π° ΠΏΠΎΡΠ²ΡΠ²Π°Π½Π΅ Π² Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ Π½Π° nginx Π·Π°ΠΏΠΈΡ, ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΡΡΠΈΠ½Π³Π° index:

ΠΡΠ»Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° .
ΠΠ°ΡΡΠΈΠ½Π³ Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅
ΠΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π°ΡΠΈΠ½Π° Π·Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅:
- Π§ΡΠ΅Π· Promtail, ΡΡΠ°Π½Π΄Π°ΡΡΠ΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΎΡ ΡΡΠ΅ΠΊΠ° Π·Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅.
- ΠΠ°ΠΏΡΠ°Π²ΠΎ ΠΎΡ Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π°
- ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Fluentd ΠΈΠ»ΠΈ Fluent Bit, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ Π΄Π°Π½Π½ΠΈ Π² Loki. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Promtail, ΡΠ΅ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Ρ Ρ Π³ΠΎΡΠΎΠ²ΠΈ ΠΏΠ°ΡΡΡΡΠΈ ΠΏΠΎΡΡΠΈ Π·Π° Π²ΡΠ΅ΠΊΠΈ Π²ΠΈΠ΄ Π»ΠΎΠ³ ΠΈ ΡΠ΅ ΡΠΏΡΠ°Π²ΡΡ ΠΈ Ρ ΠΌΡΠ»ΡΠΈΠ»ΡΠ°ΠΉΠ½ΠΎΠ²ΠΈ Π»ΠΎΠ³ΠΎΠ²Π΅.
ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π·Π° ΠΏΠ°ΡΡΠΈΠ½Π³ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Promtail. Π’ΠΎΠΉ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΡΠΈ Π½Π΅ΡΠ°:
- ΠΠ°ΠΌΠΈΡΠ° ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈΡΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ.
- ΠΡΠΈΠΊΡΠ΅ΠΏΡ ΠΊΡΠΌ ΡΡΡ Π΅ΡΠΈΠΊΠ΅ΡΠΈ.
- ΠΠ·ΠΏΡΠ°ΡΠ° Π΄Π°Π½Π½ΠΈΡΠ΅ Π² Loki.
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° Promtail ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ΡΠ΅ Π»ΠΎΠ³ΠΎΠ²Π΅ ΠΎΡ Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ ΠΎΡ systemd journal. Π’ΠΎΠΉ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π½Π° Π²ΡΡΠΊΠ° ΠΌΠ°ΡΠΈΠ½Π°, ΠΎΡ ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΡΠ±ΠΈΡΠ°Ρ Π»ΠΎΠ³ΠΎΠ²Π΅.
ΠΠΌΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Kubernetes: Promtail Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΡΠ΅Π· Kubernetes REST API ΡΠ°Π·Π±ΠΈΡΠ° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° ΠΈ ΡΡΠ±ΠΈΡΠ° Π»ΠΎΠ³ΠΎΠ²Π΅ ΠΎΡ Π½ΠΎΠ΄Π°, ΡΡΡΠ²ΠΈΡΠ° ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π°, Π²Π΅Π΄Π½Π°Π³Π° Π·Π°ΠΊΡΠ΅ΠΏΠ²Π°ΠΉΠΊΠΈ Π΅ΡΠΈΠΊΠ΅ΡΠΈ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΠΈ ΠΎΡ Kubernetes (ΠΈΠΌΠ΅ Π½Π° ΠΏΠΎΠ΄Π°, ΠΈΠΌΠ΅ Π½Π° ΡΠ°ΠΉΠ»Π° ΠΈ Ρ.Π½.).
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°ΠΊΡΠ΅ΠΏΠ²Π°ΡΠ΅ Π΅ΡΠΈΠΊΠ΅ΡΠΈ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Pipeline. Pipeline Π½Π° Promtail ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ ΡΠ΅ΡΠΈΡΠΈ ΡΠΈΠΏΠ° Π΅ΡΠ°ΠΏΠΈ. ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ β Π² , ΡΡΠΊ ΡΡΡΠΎ ΠΎΡΠ±Π΅Π»ΡΠ·Π²Π°ΠΌ Π½ΡΠΊΠΎΠΈ Π½ΡΠ°Π½ΡΠΈ.
- ΠΡΠ°ΠΏΠΈ Π½Π° ΠΏΠ°ΡΡΠΈΠ½Π³. Π’ΠΎΠ²Π° Π΅ Π΅ΡΠ°ΠΏΡΡ RegEx ΠΈ JSON. ΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΠΈΠ·Π²Π»ΠΈΡΠ°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ Π² ΡΠ°ΠΊΠ° Π½Π°ΡΠ΅ΡΠ΅Π½Π°ΡΠ° extracted map. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅ΡΠ΅ ΠΎΡ JSON, ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΠΉΠΊΠΈ Π½ΡΠΆΠ½ΠΈΡΠ΅ ΠΏΠΎΠ»Π΅ΡΠ° Π² extracted map, ΠΈΠ»ΠΈ ΡΡΠ΅Π· ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ (RegEx), ΠΊΡΠ΄Π΅ΡΠΎ Π² extracted map ΡΠ΅ βΠΌΠ°ΠΏΠ²Π°Ρβ ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½ΠΈ Π³ΡΡΠΏΠΈ. Extracted map ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ key-value, ΠΊΡΠ΄Π΅ΡΠΎ key Π΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΏΠΎΠ»Π΅ΡΠΎ, Π° value Π΅ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΎΡ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅.
- ΠΡΠ°ΠΏΠΈ Π½Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ. Π’ΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΠΈΠΌΠ° Π΄Π²Π΅ ΠΎΠΏΡΠΈΠΈ: ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΡΠ΄Π΅ΡΠΎ Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΈ source β ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ Π·Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡ extracted map. ΠΠΊΠΎ ΡΠ°ΠΊΠΎΠ²Π° ΠΏΠΎΠ»Π΅ Π² extracted map Π½ΡΠΌΠ°, ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΎ. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π΅ΡΠΈΠΊΠ΅ΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° extracted map. ΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠ°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ Π² extracted map, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΌΠΎΡΠ΅Π½ . ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠΌΠ½ΠΈ, ΡΠ΅ extracted map ΡΠ΅ Π·Π°ΡΠ΅ΠΆΠ΄Π° Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΏΡΠΈ ΠΏΠ°ΡΡΠΈΠ½Π³, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π² Π½Π΅Π³ΠΎ: β{{if .tag}tag value exists{end}}β. Template ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΡΠ»ΠΎΠ²ΠΈΡ, ΡΠΈΠΊΠ»ΠΈ ΠΈ Π½ΡΠΊΠΎΠΈ ΡΡΡΠΈΠ½Π³ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠ°ΡΠΎ Replace ΠΈ Trim.
- ΠΡΠ°ΠΏΠΈ Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ. ΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π½Π΅ΡΠΎ Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΎΡΠΎ:
- ΠΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π΅ΡΠΈΠΊΠ΅Ρ ΠΎΡ extracted data, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ° Π² Loki.
- ΠΠ° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΈΠ»ΠΈ Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΡΡΠ±ΠΈΡΠΈΠ΅ ΠΎΡ Π»ΠΎΠ³Π°.
- ΠΠ° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ (ΡΠ΅ΠΊΡΡΠ° Π½Π° Π»ΠΎΠ³Π°), ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΎΡΠΈΠ΄Π°Ρ Π² Loki.
- ΠΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ.
- ΠΡΠ°ΠΏΠΈ Π½Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅. Π‘ΡΠ°Π΄ΠΈΡΡΠ° match, Π² ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈΡΠ΅ Π² /dev/null Π·Π°ΠΏΠΈΡΠΈΡΠ΅, ΠΎΡ ΠΊΠΎΠΈΡΠΎ Π½ΡΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π°, ΠΈΠ»ΠΈ Π΄Π° Π³ΠΈ Π½Π°ΡΠΎΡΠΈΡΠ΅ Π·Π° ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°.
Π©Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ° Ρ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ nginx Π»ΠΎΠ³Π°, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠ°ΡΡΠΈΡΠ΅ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Promtail.
ΠΠ° ΡΠ΅ΡΡ ΡΠ΅ Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½ ΠΎΠ±ΡΠ°Π· Π½Π° nginx jwilder/nginx-proxy:alpine ΠΊΠ°ΡΠΎ nginx-proxy ΠΈ ΠΌΠ°Π»ΡΠΊ Π΄Π΅ΠΌΠΎΠ½, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°ΠΏΠΈΡΠ²Π° ΡΠ°ΠΌ ΡΠ΅Π±Π΅ ΡΠΈ ΠΏΠΎ HTTP. ΠΠ° Π΄Π΅ΠΌΠΎΠ½Π° ΡΠ° Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ, Π½Π° ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄Π°Π²Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΡΠ°Π·ΠΌΠ΅Ρ, ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ HTTP ΡΡΠ°ΡΡΡΠΈ ΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π·Π°ΠΊΡΡΠ½Π΅Π½ΠΈΠ΅.
Π©Π΅ ΡΡΠ±ΠΈΡΠ°ΠΌΠ΅ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΏΠΎ ΠΏΡΡΡ /var/lib/docker/containers//-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 # ΡΠ°ΠΌΠΎ Π·Π° linuxΠΠΎΠ³Π°ΡΠΎ Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΡΠ°ΠΊΠ°Π²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, Π² 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:
- json:
expressions:
stream: stream
attrs: attrs
tag: attrs.tagΠΠ·Π²Π»ΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ»Π΅ΡΠ° stream, attrs, attrs.tag (Π°ΠΊΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ) ΠΎΡ Π²Ρ ΠΎΠ΄ΡΡΠΈΡ JSON ΠΈ Π³ΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠΌΠ΅ Π² extracted map.
- regex:
expression: ^(?P([^|]+))|(?P([^|]+))$
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ΠΡΡ Π²ΡΡΠ»ΡΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ Π»ΠΎΠ³ΠΎΠ²Π΅, ΠΏΡΠΈ ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΠΎΡΠΊΡΠΈΡΠΈ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ Π΅ΡΠΈΠΊΠ΅ΡΠΈ 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[a-z_.-]+) +(?P.+)
source: logrowΠΠΎΡΠΈΡΡΠ²Π°ΠΌΠ΅ Π²Ρ ΠΎΠ΄Π½Π°ΡΠ° ΡΡΡΠΎΠΊΠ° Ρ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ ΠΈ ΠΈΠ·Π²Π»ΠΈΡΠ°ΠΌΠ΅ nginx virtual host ΠΈ ΡΡΡΠΎΠΊΠ°ΡΠ° Π»ΠΎΠ³ Π½Π° nginx.
- regex:
source: nginxlog
expression: ^(?P[w.]+) - (?P[^ ]*) [(?P[^ ]+).*] "(?P[^ ]*) (?P[^ ]*) (?P[^ ]*)" (?P[d]+) (?P[d]+) "(?P[^"]*)" "(?P[^"]*)"( "(?P[d.]+)")?ΠΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ nginx Π»ΠΎΠ³Π° Ρ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ.
- regex:
source: request_url
expression: ^.+.(?Pjpg|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[^/?]+).*$
- regex:
source: request_url
expression: ^/api/(?P[^/?]+).*$Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ 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ΠΡΠΎΠΌΠ΅Π½ΡΠΌΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π°. Π‘Π΅Π³Π° Π² Loki ΠΈΠ·Π»ΠΈΠ·Π° ΠΏΠΎΡΠΈΡΡΠ΅Π½ΠΈΡΡ nginx Π»ΠΎΠ³ ΠΎΡ extracted map.

Π‘Π»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ, ΡΠ΅ Π½Π° Π²ΡΡΠΊΠ° Π·Π°ΠΏΠΈΡ Π΅ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ Π΅ΡΠΈΠΊΠ΅Ρ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ Π»ΠΎΠ³Π°.
Π’ΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π΅ΡΠΈΠΊΠ΅ΡΠΈ Ρ Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ (ΠΊΠ°ΡΠ΄ΠΈΠ½Π°Π»Π½ΠΎΡΡ) ΠΌΠΎΠΆΠ΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° Π·Π°Π±Π°Π²ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° Loki. Π’ΠΎΠ΅ΡΡ, Π½Π΅ Π±ΠΈΠ²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π² ΠΈΠ½Π΄Π΅ΠΊΡΠ° Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ user_id. ΠΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎ ΡΠ΅ΠΌΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ Π² ΡΡΠ°ΡΠΈΡΡΠ° ββ. ΠΠΎ ΡΠΎΠ²Π° Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΡΡΠΈΡΠ΅ ΠΏΠΎ user_id Π±Π΅Π· ΠΈΠ½Π΄Π΅ΠΊΡΠΈ. Π’ΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠΈΠ»ΡΡΠΈ ΠΏΡΠΈ ΡΡΡΡΠ΅Π½Π΅ (Π΄Π° 'Π³ΡΠ΅ΠΏΠΈΡΠ΅' ΠΏΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅), Π° ΠΈΠ½Π΄Π΅ΠΊΡΡΡ ΡΡΠΊ ΡΠ»ΡΠΆΠΈ ΠΊΠ°ΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° ΠΏΠΎΡΠΎΠΊΠ°.
ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅

Loki ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ»ΡΠΆΠΈ ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ Π·Π° Π³ΡΠ°ΡΠΈΠΊΠΈ Π² Grafana, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ LogQL. ΠΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ:
- rate β Π±ΡΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°;
- count over time β Π±ΡΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Π² Π·Π°Π΄Π°Π΄Π΅Π½ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΡΠΈΡΡΡΡΠ²Π°Ρ Π°Π³ΡΠ΅Π³ΠΈΡΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Sum, Avg ΠΈ Π΄ΡΡΠ³ΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΡΠ΅ Π΄ΠΎΡΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΈ Π³ΡΠ°ΡΠΈΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π³ΡΠ°ΡΠΈΠΊΠ° Π½Π° Π±ΡΠΎΡ Π½Π° HTTP Π³ΡΠ΅ΡΠΊΠΈΡΠ΅:

Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΡ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ Loki Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΠΏΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ Prometheus (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π»Π΅Π³Π΅Π½Π΄Π°ΡΠ°), Π½ΠΎ Loki ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Ρ ΡΠΈΠΏ Prometheus. ΠΠ΅ ΡΡΠΌ ΡΠΈΠ³ΡΡΠ΅Π½, ΡΠ΅ ΡΠΎΠ²Π° Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ°Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π½ΠΎ, ΡΡΠ΄Ρ ΠΏΠΎ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ββ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ²Π° Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π·Π°ΠΊΠΎΠ½Π½ΠΎ ΠΈ Loki Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ PromQL.
ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ Loki ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ Ρ ΡΠΈΠΏ Prometheus ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ URL /loki:

Π ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ°Π²ΠΈΡΠ΅ Π³ΡΠ°ΡΠΈΠΊΠΈ, ΠΊΠ°ΠΊΡΠΎ Π°ΠΊΠΎ ΡΠ°Π±ΠΎΡΠ΅Ρ ΡΠ΅ Ρ ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΠΎΡ Prometheus:

ΠΠΈΡΠ»Ρ, ΡΠ΅ Π½Π΅ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ΡΠΎ Π²ΡΠ² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π² Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ΅ Π³ΠΎ ΠΏΠΎΠΏΡΠ°Π²ΡΡ.

ΠΠ΅ΡΡΠΈΠΊΠΈ
Π Loki Π΅ Π½Π°Π»ΠΈΡΠ½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΡΠ»ΠΎΠ²ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΠΎΡ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ΡΠΎ ΠΈΠΌ Π² Prometheus. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ Π½Π° nginx ΠΏΡΠΈΡΡΡΡΠ²Π° Π±ΡΠΎΡΡ Π½Π° Π±Π°ΠΉΡΠΎΠ²Π΅ΡΠ΅ Π² ΠΎΡΠ³ΠΎΠ²ΠΎΡ, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡ ΡΠΎΡΠΌΠ°Ρ Π½Π° Π»ΠΎΠ³Π°, ΠΈ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π² ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ°. Π’Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ΠΈ Π² Prometheus.
ΠΠΎΠ±Π°Π²ΡΠΉΡΠ΅ ΠΎΡΠ΅ Π΅Π΄Π½Π° ΡΠ΅ΠΊΡΠΈΡ Π² promtail.yml:
- match:
selector: '{request_type="api"}'
stages:
- metrics:
http_nginx_response_time:
type: Histogram
description: "Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π² 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: "ΡΡΠΌΠ° Π½Π° Π±Π°ΠΉΡΠΎΠ²Π΅ΡΠ΅ Π² ΠΎΡΠ³ΠΎΠ²ΠΎΡ"
source: bytes_out
config:
action: add
http_nginx_response_bytes_count:
type: Counter
description: "Π±ΡΠΎΡ Π½Π° Π±Π°ΠΉΡΠΎΠ²Π΅ΡΠ΅ Π² ΠΎΡΠ³ΠΎΠ²ΠΎΡ"
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 ΡΠ° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈ:

ΠΠ°ΡΡΡΠΎΠΉΠ²Π°ΠΌΠ΅ Prometheus. ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ job promtail:
- job_name: 'promtail'
scrape_interval: 10s
static_configs:
- targets: ['promtail:9080']Π ΡΠΈΡΡΠ²Π°ΠΌΠ΅ Π³ΡΠ°ΡΠΈΠΊ:

ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΡΠΈΡΠΈΡΠ΅ Π½Π°ΠΉ-Π±Π°Π²Π½ΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π½Π° ΡΠ΅Π·ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³.
ΠΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅
Loki ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠ°ΠΊΡΠΎ Π² Π΅Π΄ΠΈΠ½ΠΈΡΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ (single binary mode), ΡΠ°ΠΊΠ° ΠΈ Π² ΡΠ°ΡΠ΄ΠΈΡΡΠ΅ΠΌ (horizontally-scalable mode). ΠΡΠ² Π²ΡΠΎΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π΄Π°Π½Π½ΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ°, ΠΊΠ°ΡΠΎ ΡΠ°Π½ΠΊΠΎΠ²Π΅ΡΠ΅ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ ΠΎΡΠ΄Π΅Π»Π½ΠΎ. Π Π²Π΅ΡΡΠΈΡ 1.5 Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΅Π΄Π½ΠΎ ΠΌΡΡΡΠΎ, Π½ΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΡΠ°.

Π§Π°Π½ΠΊΠΎΠ²Π΅ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π² S3-ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, Π·Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ - Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ: Cassandra, BigTable ΠΈΠ»ΠΈ DynamoDB. ΠΡΡΠ³ΠΈΡΠ΅ ΡΠ°ΡΡΠΈ Π½Π° Loki - Distributors (Π·Π° Π·Π°ΠΏΠΈΡ) ΠΈ Querier (Π·Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ) - ΡΠ° stateless ΠΈ ΡΡΡΠΎ ΡΠ΅ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Ρ Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½ΠΎ.
ΠΠ° ΠΊΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΡΡΠ° DevOpsDays Vancouver 2019 Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Callum Styan ΡΠΏΠΎΠΌΠ΅Π½Π°, ΡΠ΅ Ρ Loki Π½Π΅Π³ΠΎΠ²ΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π° Ρ ΠΏΠ΅ΡΠ°Π±Π°ΠΉΡΠΈ Π»ΠΎΠ³ΠΎΠ²Π΅ Ρ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΏΠΎΠ΄ 1% ΠΎΡ ΠΎΠ±ΡΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ: "".
Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π½Π° Loki ΠΈ ELK
Π Π°Π·ΠΌΠ΅Ρ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ°
ΠΠ° ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ° Π²Π·Π΅Ρ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° nginx, Π·Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠ²Π°ΡΠ΅ Pipeline, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ ΠΏΠΎ-Π³ΠΎΡΠ΅. Π€Π°ΠΉΠ»ΡΡ Ρ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°ΡΠ΅ 406 624 ΡΠ΅Π΄Π° Ρ ΠΎΠ±Ρ ΠΎΠ±Π΅ΠΌ 109 ΠΠ±. ΠΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ Π° Π·Π° Π΅Π΄ΠΈΠ½ ΡΠ°Ρ, ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ 100 Π·Π°ΠΏΠΈΡΠ° Π² ΡΠ΅ΠΊΡΠ½Π΄Π°.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° Π΄Π²Π° ΡΠ΅Π΄Π° ΠΎΡ Π»ΠΎΠ³Π°:

ΠΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡΡΠ° Π² ELK ΡΠΎΠ²Π° Π΄Π°Π»ΠΎ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ° 30,3 ΠΠ±:

Π ΡΠ»ΡΡΠ°Ρ Ρ Loki ΡΠΎΠ²Π° Π΄Π°Π²Π° ΠΎΠΊΠΎΠ»ΠΎ 128 ΠΠ± ΠΈΠ½Π΄Π΅ΠΊΡ ΠΈ ΠΎΠΊΠΎΠ»ΠΎ 3,8 ΠΠ± Π΄Π°Π½Π½ΠΈ Π² ΡΠ°Π½ΠΊ. Π’ΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ Π»ΠΎΠ³ΡΡ Π΅ Π±ΠΈΠ» Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΠΈΠ·ΠΊΡΡΡΠ²Π΅Π½ΠΎ ΠΈ Π½Π΅ ΡΠ΅ Π΅ ΠΎΡΠ»ΠΈΡΠ°Π²Π°Π» Ρ Π³ΠΎΠ»ΡΠΌΠΎ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·ΠΈΠ΅ ΠΎΡ Π΄Π°Π½Π½ΠΈ. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ gzip Π½Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡ docker JSON Π»ΠΎΠ³ Ρ Π΄Π°Π½Π½ΠΈ Π΄Π°Π²Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡ ΠΎΡ 95,4%, Π° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ Π² ΡΠ°ΠΌΠΈΡ Loki ΡΠ΅ Π΅ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π» ΡΠ°ΠΌΠΎ ΠΏΠΎΡΠΈΡΡΠ΅Π½ nginx Π»ΠΎΠ³, ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΡΠ° Π΄ΠΎ 4 ΠΠ± Π΅ ΠΎΠ±ΡΡΠ½ΠΈΠΌΠ°. ΠΠ±ΡΠΈΡΡ Π±ΡΠΎΠΉ ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π·Π° Π΅ΡΠΈΠΊΠ΅ΡΠΈΡΠ΅ Π½Π° Loki Π΅ Π±ΠΈΠ» 35, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ±ΡΡΠ½ΡΠ²Π° ΠΌΠ°Π»ΠΊΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ°. ΠΠ° ELK Π»ΠΎΠ³ΡΡ ΡΡΡΠΎ Π΅ Π±ΠΈΠ» ΠΏΠΎΡΠΈΡΡΠ΅Π½. Π’Π°ΠΊΠ° ΡΠ΅, Loki Π΅ ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΠ°Π» ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Ρ 96%, Π° ELK β Ρ 70%.
ΠΠΎΠ½ΡΡΠΌΠ°ΡΠΈΡ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ

ΠΠΊΠΎ ΡΡΠ°Π²Π½ΡΠ²Π°ΠΌΠ΅ ΡΠ΅Π»ΠΈΡ ΡΡΠ΅ΠΊ 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 ΡΡΠ½ΠΊΡΠΈΡ Π·Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³ΠΈ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Ρ Π΅ΡΠΈΠΊΠ΅ΡΠΈ.
ΠΡ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»Π½ΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΈ - ΡΠ»Π°Π±Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ. ΠΡΠΊΠΎΠΈ Π½Π΅ΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡΠΈΡΠ΅ ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Promtail, ΠΎΡΠΊΡΠΈΡ ΡΠ°ΠΌΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠΎΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π°, Π·Π° ΡΠ°ΡΡΠΈΠ΅ Π΅ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄. ΠΡΠ΅ Π΅Π΄ΠΈΠ½ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ - ΡΠ»Π°Π±ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΠΏΠ°ΡΡΠΈΠ½Π³. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Loki Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠ°ΡΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎΡΠ΅Π΄ΠΎΠ²ΠΈ Π»ΠΎΠ³ΠΎΠ²Π΅. ΠΡΠΌ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈ, ΡΠ΅ Loki Π΅ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»Π½ΠΎ Π½ΠΎΠ²Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ (ΡΠ΅Π»ΠΈΠ· 1.0 Π±Π΅ΡΠ΅ ΠΏΡΠ΅Π· Π½ΠΎΠ΅ΠΌΠ²ΡΠΈ 2019 Π³.).
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Loki Π΅ ΠΈΠ·ΡΡΠ»ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠΆΠ΄Π° Π·Π° ΠΌΠ°Π»ΠΊΠΈ ΠΈ ΡΡΠ΅Π΄Π½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΠΉΠΊΠΈ ΡΠ΅ΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°ΡΠΈ Π·Π° Π°Π³ΡΠ΅Π³Π°ΡΠΈΡ Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅, ΡΡΡΡΠ΅Π½Π΅ Π² Π»ΠΎΠ³ΠΎΠ²Π΅, ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ Π°Π½Π°Π»ΠΈΠ· Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅.
ΠΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Loki Π² Badoo, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ELK ΡΡΠ΅ΠΊ, ΠΊΠΎΠΉΡΠΎ Π½ΠΈ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ²Π° ΠΈ ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π· Π³ΠΎΠ΄ΠΈΠ½ΠΈΡΠ΅ Π΅ Π½Π°ΡΡΡΠΏΠ°Π» ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ Π·Π° Π½Π°Ρ Π΅ ΡΡΡΡΠ΅Π½Π΅ΡΠΎ Π² Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅. Π‘ ΠΏΠΎΡΡΠΈ 100 ΠΠ± Π»ΠΎΠ³ΠΎΠ²Π΅ Π½Π° Π΄Π΅Π½, Π²Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΌΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ ΠΈ ΠΎΡΠ΅ ΠΌΠ°Π»ΠΊΠΎ ΠΈ Π΄Π° Π³ΠΎ ΠΏΡΠ°Π²ΠΈΠΌ Π±ΡΡΠ·ΠΎ. ΠΠ° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π³ΡΠ°ΡΠΈΠΊΠΈ ΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΄ΡΡΠ³ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈ Π·Π° Π½Π°ΡΠΈΡΠ΅ Π½ΡΠΆΠ΄ΠΈ ΠΈ ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½ΠΈ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ. Π‘ΡΠ΅ΠΊΡΡ Π½Π° Loki ΠΈΠΌΠ° ΠΎΡΠ΅Π·Π°Π΅ΠΌΠΈ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°, Π½ΠΎ ΡΠΎΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π²Π΅ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅, ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ Π½ΡΠΌΠ° Π΄Π° ΠΏΠΎΠΊΡΠΈΡΡ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈΡΠ΅ Π·Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ.
Π Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠ»Π΅Π΄ ΠΏΡΠΎΡΡΠ²Π°Π½Π΅ΡΠΎ ΡΡΠ°Π½Π° ΡΡΠ½ΠΎ, ΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Loki, ΡΠ΅ Π½Π°Π΄ΡΠ²Π°ΠΌΠ΅, ΡΠ΅ ΡΠΎΠ·ΠΈ ΠΏΠΎΡΡ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ ΠΏΡΠΈ ΠΈΠ·Π±ΠΎΡΠ°.
Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡΠΌΡΡ Ρ ΠΊΠΎΠ΄Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π² ΡΡΠ°ΡΠΈΡΡΠ°, ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
