ΠΡ Π² Badoo ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠΌ ΡΠ²Π΅ΠΆΠΈΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΈ ΠΎΡΠ΅Π½ΠΈΠ²Π°Π΅ΠΌ, ΡΡΠΎΠΈΡ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡ Π² Π½Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ°ΠΊΠΈΡ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ ΠΈ Ρ ΠΎΡΠΈΠΌ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ Ρ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎΠΌ. ΠΠ½ΠΎ ΠΏΠΎΡΠ²ΡΡΠ΅Π½ΠΎ Loki β ΡΠΈΡΡΠ΅ΠΌΠ΅ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π»ΠΎΠ³ΠΎΠ².
Loki β ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° Π»ΠΎΠ³ΠΎΠ², ΡΠ°ΠΊΠΆΠ΅ ΡΡΠΎΡ ΡΡΠ΅ΠΊ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π³ΠΈΠ±ΠΊΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Π΄Π»Ρ ΠΈΡ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ Π² Prometheus. Π ΠΌΠ°Π΅ Π²ΡΡΠ»ΠΎ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°ΡΡ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»ΠΈ. ΠΠ°Ρ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π»ΠΎ, ΡΡΠΎ ΡΠΌΠ΅Π΅Ρ Loki, ΠΊΠ°ΠΊΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΡΡΡΠΏΠ°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ ELK β ΡΡΠ΅ΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ΅ΠΉΡΠ°Ρ.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Loki
Grafana Loki β ΡΡΠΎ Π½Π°Π±ΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π΄Π»Ρ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ Ρ Π»ΠΎΠ³Π°ΠΌΠΈ. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌ Loki ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° ΠΈΠ΄Π΅Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ Π»ΠΎΠ³ΠΎΠ² β labels (ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² Prometheus), a ΡΠ°ΠΌΠΈ Π»ΠΎΠ³ΠΈ ΡΠΆΠΈΠΌΠ°ΡΡ ΡΡΠ΄ΠΎΠΌ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ°Π½ΠΊΠΈ.
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ 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.
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΏΠΎΠΈΡΠΊΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
Π‘Π°ΠΌ Π·Π°ΠΏΡΠΎΡ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ: 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:
ΠΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
ΠΠ°ΡΡΠΈΠ½Π³ Π»ΠΎΠ³ΠΎΠ²
ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠΎΠ±ΡΠ°ΡΡ Π»ΠΎΠ³ΠΈ:
- Π‘ ΠΏΠΎΠΌΠΎΡΡΡ 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 ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΡΡΠΎΡΡΡ ΠΈΠ· ΡΠ΅ΡΡΡΡΡ
ΡΠΈΠΏΠΎΠ² ΡΡΠ°Π΄ΠΈΠΉ. ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ β Π²
- Parsing stages. ΠΡΠΎ ΡΡΠ°Π΄ΠΈΡ RegEx ΠΈ JSON. ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΠΌΡ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π»ΠΎΠ³ΠΎΠ² Π² ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΡ extracted map. ΠΠ·Π²Π»Π΅ΠΊΠ°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· JSON, ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΡΡ Π½ΡΠΆΠ½ΡΠ΅ Π½Π°ΠΌ ΠΏΠΎΠ»Ρ Π² extracted map, ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ (RegEx), Π³Π΄Π΅ Π² extracted map βΠΌΠ°ΠΏΡΡΡΡβ named groups. Extracted map ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ key-value Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, Π³Π΄Π΅ key β ΠΈΠΌΡ ΠΏΠΎΠ»Ρ, Π° value β Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π»ΠΎΠ³ΠΎΠ².
- 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. - Action stages. ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Ρ ΠΈΠ·Π²Π»Π΅ΡΡΠ½Π½ΡΠΌ:
- Π‘ΠΎΠ·Π΄Π°ΡΡ Π»Π΅ΠΉΠ±Π» ΠΈΠ· extracted data, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅ΡΡΡ Loki.
- ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ±ΡΡΠΈΡ ΠΈΠ· Π»ΠΎΠ³Π°.
- ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ (ΡΠ΅ΠΊΡΡ Π»ΠΎΠ³Π°), ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΉΠ΄ΡΡ Π² Loki.
- Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΌΠ΅ΡΡΠΈΠΊΠΈ.
- 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.
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½Ρ ΠΌΠ΅ΡΠΊΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π°Π½Π½ΡΡ ΠΈΠ· Π»ΠΎΠ³Π°.
ΠΡΠΆΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠΊ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ (cardinality) ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Loki. Π’ΠΎ Π΅ΡΡΡ Π½Π΅ ΡΡΠΎΠΈΡ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ Π² ΠΈΠ½Π΄Π΅ΠΊΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, user_id. ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ΡΡΠΎΠΌ ΡΠΈΡΠ°ΠΉΡΠ΅ Π² ΡΡΠ°ΡΡΠ΅ β
ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π»ΠΎΠ³ΠΎΠ²
Loki ΠΌΠΎΠΆΠ΅Ρ Π²ΡΡΡΡΠΏΠ°ΡΡ Π² ΡΠΎΠ»ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ Π³ΡΠ°ΡΠΈΠΊΠΎΠ² Grafana, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ LogQL. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ:
- rate β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ;
- count over time β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅.
ΠΡΡ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ Π°Π³ΡΠ΅Π³ΠΈΡΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Sum, Avg ΠΈ Π΄ΡΡΠ³ΠΈΠ΅. ΠΠΎΠΆΠ½ΠΎ ΡΡΡΠΎΠΈΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π³ΡΠ°ΡΠΈΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π³ΡΠ°ΡΠΈΠΊ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° HTTP-ΠΎΡΠΈΠ±ΠΎΠΊ:
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ data source Loki Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅Π·Π°Π½ ΠΏΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ data source Prometheus (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅Π»ΡΠ·Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π»Π΅Π³Π΅Π½Π΄Ρ), Π½ΠΎ Loki ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΠΊΠ°ΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Ρ ΡΠΈΠΏΠΎΠΌ Prometheus. Π― Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΡΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π½ΠΎ, ΡΡΠ΄Ρ ΠΏΠΎ ΠΎΡΠ²Π΅ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² β
ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Loki ΠΊΠ°ΠΊ data source Ρ ΡΠΈΠΏΠΎΠΌ Prometheus ΠΈ Π΄ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ URL /loki:
Π ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ Π³ΡΠ°ΡΠΈΠΊΠΈ, ΠΊΠ°ΠΊ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π±Ρ ΠΌΡ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Ρ ΠΌΠ΅ΡΡΠΈΠΊΠ°ΠΌΠΈ ΠΈΠ· Prometheus:
Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΠ°ΡΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ ΡΡΠΎ ΠΏΠΎΠΏΡΠ°Π²ΡΡ.
ΠΠ΅ΡΡΠΈΠΊΠΈ
Π 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 ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ:
ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ 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 Π½Π° ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ Π΄ΠΎΠΊΠ΅ΡΠΎΠ²ΡΠΊΠΎΠΌ 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 service discovery ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π°Π²Π΅ΡΠΈΠ²Π°Π΅Ρ Π»Π΅ΠΉΠ±Π»Ρ.
ΠΠ· ΠΌΠΈΠ½ΡΡΠΎΠ² β ΡΠ»Π°Π±Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π΅ΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Promtail, Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ» ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°, Π±Π»Π°Π³ΠΎ open-source. ΠΡΡ ΠΎΠ΄ΠΈΠ½ ΠΌΠΈΠ½ΡΡ β ΡΠ»Π°Π±ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠ°ΡΡΠΈΠ½Π³Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Loki Π½Π΅ ΡΠΌΠ΅Π΅Ρ ΠΏΠ°ΡΡΠΈΡΡ multiline-Π»ΠΎΠ³ΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΊ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠ°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ½Π΅ΡΡΠΈ ΡΠΎ, ΡΡΠΎ Loki β ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΠ»ΠΎΠ΄Π°Ρ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ (ΡΠ΅Π»ΠΈΠ· 1.0 Π±ΡΠ» Π² Π½ΠΎΡΠ±ΡΠ΅ 2019 Π³ΠΎΠ΄Π°).
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Loki β Π½Π° 100% ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ ΠΈ ΡΡΠ΅Π΄Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΡΠ΅ΡΠ°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°Ρ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π»ΠΎΠ³ΠΎΠ², ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎ Π»ΠΎΠ³Π°ΠΌ, ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π»ΠΎΠ³ΠΎΠ².
ΠΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Loki Π² Badoo, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π΅ΠΌ ELK-ΡΡΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Ρ ΡΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ ΠΈ ΠΊΠΎΡΠΎΡΡΠΉ Π·Π° ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ ΠΎΠ±ΡΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΌΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡΠΌΠΈ. ΠΠ»Ρ Π½Π°Ρ ΠΊΠ°ΠΌΠ½Π΅ΠΌ ΠΏΡΠ΅ΡΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠΈΡΠΊ ΠΏΠΎ Π»ΠΎΠ³Π°ΠΌ. ΠΠΌΠ΅Ρ ΠΏΠΎΡΡΠΈ 100 ΠΠ± Π»ΠΎΠ³ΠΎΠ² Π² Π΄Π΅Π½Ρ, Π½Π°ΠΌ Π²Π°ΠΆΠ½ΠΎ ΡΠΌΠ΅ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡ Π²ΡΡ ΠΈ ΡΡΡΡ-ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΈ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π±ΡΡΡΡΠΎ. ΠΠ»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π³ΡΠ°ΡΠΈΠΊΠΎΠ² ΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΡΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ΄ Π½Π°ΡΠΈ Π½ΡΠΆΠ΄Ρ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ. Π£ ΡΡΠ΅ΠΊΠ° Loki Π΅ΡΡΡ ΠΎΡΡΡΠΈΠΌΡΠ΅ ΠΏΠ»ΡΡΡ, Π½ΠΎ ΠΎΠ½ Π½Π΅ Π΄Π°ΡΡ Π½Π°ΠΌ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Ρ Π½Π°Ρ Π΅ΡΡΡ, ΠΈ Π΅Π³ΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΡΠΎΡΠ½ΠΎ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΊΡΠΎΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ.
Π Ρ ΠΎΡΡ ΠΏΠΎΡΠ»Π΅ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ°Π»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΌΡ Loki ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, Π½Π°Π΄Π΅Π΅ΠΌΡΡ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠΉ ΠΏΠΎΡΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²Π°ΠΌ Π² Π²ΡΠ±ΠΎΡΠ΅.
Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Ρ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ Π² ΡΡΠ°ΡΡΠ΅, Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com