Badoo ã§ã¯ãæ°ãããã¯ãããžãŒãåžžã«ç£èŠããããããåœç€Ÿã®ã·ã¹ãã ã§äœ¿çšãã䟡å€ããããã©ãããè©äŸ¡ããŠããŸãã ç§ãã¡ã¯ãããã®ç 究㮠XNUMX ã€ãã³ãã¥ããã£ãšå ±æããããšèããŠããŸãã ãã°éçŽã·ã¹ãã ã§ãã Loki å°çšã§ãã
Loki ã¯ãã°ãä¿åããã³è¡šç€ºããããã®ãœãªã¥ãŒã·ã§ã³ã§ããããã®ã¹ã¿ãã¯ã¯ãã°ãåæã㊠Prometheus ã«ããŒã¿ãéä¿¡ããããã®æè»ãªã·ã¹ãã ãæäŸããŸãã XNUMX æã«ã¯ãã¯ãªãšã€ã¿ãŒã«ãã£ãŠç©æ¥µçã«å®£äŒãããŠããå¥ã®ã¢ããããŒãããªãªãŒã¹ãããŸããã ç§ãã¡ã¯ãLoki ãäœãã§ããããLoki ãæäŸããæ©èœããããŠçŸåšäœ¿çšããŠããã¹ã¿ãã¯ã§ãã ELK ã®ä»£æ¿ãšããŠã©ã®çšåºŠæ©èœã§ãããã«èå³ããããŸããã
ãããšã¯
Grafana Loki ã¯ããã°ãæäœããããã®å®å šãªã·ã¹ãã ã®ã³ã³ããŒãã³ãã®ã»ããã§ãã ä»ã®åæ§ã®ã·ã¹ãã ãšã¯ç°ãªããLoki ã¯ãã°ã®ã¡ã¿ããŒã¿ãã€ãŸãã©ãã« (Prometheus ãšåã) ã®ã¿ãã€ã³ããã¯ã¹åãããã°èªäœãåå¥ã®ãã£ã³ã¯ã«å§çž®ãããšããèãã«åºã¥ããŠããŸãã
Loki ã§äœãã§ãããã説æããåã«ããã¡ã¿ããŒã¿ã®ã¿ã«ã€ã³ããã¯ã¹ãä»ãããšããã¢ã€ãã¢ããäœãæå³ããã®ããæ確ã«ããããšæããŸãã nginx ãã°ã®è¡ã®äŸã䜿çšããŠãLoki ã®ã¢ãããŒããšãElasticsearch ãªã©ã®åŸæ¥ã®ãœãªã¥ãŒã·ã§ã³ã§ã®ã€ã³ããã¯ã¹äœæã®ã¢ãããŒããæ¯èŒããŠã¿ãŸãããã
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 ã® XNUMX ã€ã®ã³ã³ããŒãã³ãã§æ§æãããŸãã Promtail ã¯ãã°ãåéããåŠçã㊠Loki ã«éä¿¡ããŸãã ãããããããä¿ç®¡ããŸãã ãŸããGrafana 㯠Loki ã«ããŒã¿ãèŠæ±ããŠè¡šç€ºã§ããŸãã äžè¬ã«ãLoki ã¯ãã°ã®ä¿åãšæ€çŽ¢ã ãã§ã¯ãããŸããã ã¹ã¿ãã¯å
šäœã¯ãPrometheus ã®æ¹æ³ã䜿çšããŠåä¿¡ããŒã¿ãåŠçããã³åæããããã®åªããæ©äŒãæäŸããŸãã
ã€ã³ã¹ããŒã«ããã»ã¹ã®èª¬æã衚瀺ãããŸã
ãã°ããæ€çŽ¢ãã
ç¹å¥ãª Grafana ã€ã³ã¿ãŒãã§ã€ã¹ã§ãã Explorer ã§ãã°ãæ€çŽ¢ã§ããŸãã ã¯ãšãªã¯ LogQL èšèªã䜿çšããŸãããã㯠Prometheus ã§äœ¿çšããã PromQL ã«ãã䌌ãŠããŸãã åççã«ã¯ãåæ£ grep ãšèããããšãã§ããŸãã
æ€çŽ¢ã€ã³ã¿ãŒãã§ã€ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
ãªã¯ãšã¹ãèªäœã¯ãã»ã¬ã¯ã¿ãŒãšãã£ã«ã¿ãŒã® XNUMX ã€ã®éšåã§æ§æãããŸãã ã»ã¬ã¯ã¿ãŒã¯ããã°ã«å²ãåœãŠãããã€ã³ããã¯ã¹ä»ãã¡ã¿ããŒã¿ (ã©ãã«) ã䜿çšããæ€çŽ¢ã§ããããã£ã«ã¿ãŒã¯ãã»ã¬ã¯ã¿ãŒã«ãã£ãŠå®çŸ©ãããã¬ã³ãŒãããã£ã«ã¿ãŒã§é€å€ããæ€çŽ¢æååãŸãã¯æ£èŠè¡šçŸã§ãã 以äžã®äŸã§ã¯ãäžæ¬åŒ§å ã«ã»ã¬ã¯ã¿ãŒãããããã®åŸã¯ãã¹ãŠãã£ã«ã¿ãŒã§ãã
{image_name="nginx.promtail.test"} |= "index"
Loki ã®ä»çµã¿äžãã»ã¬ã¯ã¿ãŒãªãã§ã¯ãšãªãäœæããããšã¯ã§ããŸããããã©ãã«ã¯å¿ èŠã«å¿ããŠäžè¬çã«äœæã§ããŸãã
ã»ã¬ã¯ã¿ãŒã¯ãäžæ¬åŒ§ã§å²ãŸããããŒãšå€ã®å€ã§ãã ã»ã¬ã¯ã¿ãŒãçµã¿åãããŠãæŒç®å =ã!=ããŸãã¯æ£èŠè¡šçŸã䜿çšããŠããŸããŸãªæ€çŽ¢æ¡ä»¶ãæå®ã§ããŸãã
{instance=~"kafka-[23]",name!="kafka-dev"}
// ÐайЎÑÑ Ð»ÐŸÐ³Ðž Ñ Ð»ÐµÐ¹Ð±Ð»ÐŸÐŒ instance, ОЌеÑÑОе зМаÑеМОе kafka-2, kafka-3, О ОÑклÑÑÐžÑ dev
ãã£ã«ã¿ãŒã¯ãã»ã¬ã¯ã¿ãŒãåä¿¡ãããã¹ãŠã®ããŒã¿ããã£ã«ã¿ãŒã§é€å€ããããã¹ããŸãã¯æ£èŠè¡šçŸã§ãã
ã¡ããªã¯ã¹ã¢ãŒãã§ã¯åä¿¡ããŒã¿ã«åºã¥ããŠã¢ãããã¯ã°ã©ããååŸããããšãå¯èœã§ãã ããšãã°ãæååã€ã³ããã¯ã¹ãå«ããšã³ããªã nginx ãã°ã«è¡šç€ºãããé »åºŠã確èªã§ããŸãã
æ©èœã®å®å
šãªèª¬æã¯ããã¥ã¡ã³ãã«ãããŸãã
ãã°ã®è§£æ
ãã°ãåéããã«ã¯ããã€ãã®æ¹æ³ããããŸãã
- ãã°ãåéããããã®ã¹ã¿ãã¯ã®æšæºã³ã³ããŒãã³ãã§ãã Promtail ã䜿çšããŸãã
- Docker ã³ã³ããããçŽæ¥äœ¿çšããŠ
Loki Docker ãã®ã³ã°ãã©ã€ããŒã - Loki ã«ããŒã¿ãéä¿¡ã§ãã Fluentd ãŸã㯠Fluent Bit ã䜿çšããŸãã Promtail ãšã¯ç°ãªããã»ãŒãã¹ãŠã®çš®é¡ã®ãã°ã«å¯Ÿå¿ããæ¢è£œã®ããŒãµãŒããããè€æ°è¡ã®ãã°ãåŠçã§ããŸãã
éåžžãPromtail ã¯è§£æã«äœ¿çšãããŸãã 次㮠XNUMX ã€ã®ããšãè¡ããŸãã
- ããŒã¿ãœãŒã¹ãæ€çŽ¢ããŸãã
- ã©ãã«ã貌ãä»ããŸãã
- ããã«ããŒã¿ãéä¿¡ããŸãã
çŸåšãPromtail ã¯ããŒã«ã« ãã¡ã€ã«ãš systemd ãžã£ãŒãã«ãããã°ãèªã¿åãããšãã§ããŸãã ãã°ãåéãããåãã·ã³ã«ã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
Kubernetes ãšã®çµ±å: Promtail 㯠Kubernetes REST API ãéããŠèªåçã«ã¯ã©ã¹ã¿ãŒã®ç¶æ ãèªèããããŒãããµãŒãã¹ããŸãã¯ããããããã°ãåéããKubernetes ããã®ã¡ã¿ããŒã¿ (ãããåããã¡ã€ã«åãªã©) ã«åºã¥ããŠã©ãã«ãå³åº§ã«æçš¿ããŸãã ã
Pipeline ã䜿çšããŠããã°ã®ããŒã¿ã«åºã¥ããŠã©ãã«ã貌ãä»ããããšãã§ããŸãã Pipeline Promtail 㯠XNUMX çš®é¡ã®ã¹ããŒãžã§æ§æã§ããŸãã 詳现ã«ã€ããŠã¯ã
- 解æ段éã ãã㯠RegEx ãš JSON ã®æ®µéã§ãã ãã®æ®µéã§ã¯ããã°ããããŒã¿ãæœåºããŠãããããæœåºããããäœæããŸãã å¿ èŠãªãã£ãŒã«ããæœåºããããããã«ã³ããŒããã ã㧠JSON ããæœåºã§ããŸãããŸãã¯ãæ£èŠè¡šçŸ (RegEx) ã䜿çšããŠãååä»ãã°ã«ãŒããæœåºããããããã«ããããã³ã°ããããŸãã æœåºããããããã¯ããŒãšå€ã®ã¹ãã¢ã§ãããŒã¯ãã£ãŒã«ãã®ååãå€ã¯ãã°ããã®å€ã§ãã
- ãã©ã³ã¹ãã©ãŒã ã¹ããŒãžã ãã®ã¹ããŒãžã«ã¯ XNUMX ã€ã®ãªãã·ã§ã³ããããŸããå€æã«ãŒã«ãèšå®ããå€æãšãæœåºããããããããå€æããããã®ããŒã¿ ãœãŒã¹ã§ãããœãŒã¹ã§ãã æœåºããããããã«ãã®ãããªãã£ãŒã«ããååšããªãå Žåã¯ãäœæãããŸãã ãã®ããã«ããŠãæœåºããããããã«åºã¥ããŠããªãã©ãã«ãäœæããããšãã§ããŸãã ãã®æ®µéã§ã¯ãããªã匷åãªã¡ãœããã䜿çšããŠãæœåºããããããå
ã®ããŒã¿ãæäœã§ããŸãã
Golang ãã³ãã¬ãŒã ã ããã«ãæœåºããããããã¯è§£æäžã«å®å šã«ããŒãããããããããšãã°ããã®äžã®å€ã{{if .tag}ã¿ã°å€ãååšãã{end}}ãã確èªã§ããããã«ãªãããšãèŠããŠããå¿ èŠããããŸãã ãã³ãã¬ãŒãã¯ãæ¡ä»¶ãã«ãŒããããã³çœ®æãããªã ãªã©ã®äžéšã®æååé¢æ°ããµããŒãããŠããŸãã - ã¢ã¯ã·ã§ã³ã¹ããŒãžã ãã®æç¹ã§ãæœåºãããã³ã³ãã³ãã䜿çšããŠäœããè¡ãããšãã§ããŸãã
- æœåºãããããŒã¿ããã©ãã«ãäœæããLoki ã«ãã£ãŠã€ã³ããã¯ã¹ãä»ããããŸãã
- ãã°ããã€ãã³ãæéãå€æŽãŸãã¯èšå®ããŸãã
- Loki ã«éä¿¡ãããããŒã¿ (ãã° ããã¹ã) ãå€æŽããŸãã
- ã¡ããªã¯ã¹ãäœæããŸãã
- ãã£ã«ã¿ãªã³ã°ã¹ããŒãžã äžèŽã¹ããŒãžã§ã¯ãå¿ èŠã®ãªããšã³ããªã /dev/null ã«éä¿¡ãããããããªãåŠçã®ããã«è»¢éããããšãã§ããŸãã
éåžžã® nginx ãã°ãåŠçããäŸã䜿çšããŠãPromtail ã䜿çšããŠãã°ã解æããæ¹æ³ã瀺ããŸãã
ãã¹ãã§ã¯ãnginx-proxy ãšããŠãå€æŽããã nginx ã€ã¡ãŒãž jwilder/nginx-proxy:alpine ãšãHTTP çµç±ã§èªèº«ã«åãåãããããšãã§ããå°ããªããŒã¢ã³ã䜿çšããŠã¿ãŸãããã ããŒã¢ã³ã«ã¯è€æ°ã®ãšã³ããã€ã³ãããããããŸããŸãªãµã€ãºãããŸããŸãª HTTP ã¹ããŒã¿ã¹ãããŸããŸãªé 延ã®å¿çããããã®ãšã³ããã€ã³ãã«æäŸã§ããŸãã
/var/lib/docker/containers/ ãã¹ã«æ²¿ã£ãŠèŠã€ãã Docker ã³ã³ãããããã°ãåéããŸãã / -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ããªãã·ã§ã³ããããåãããšã XNUMX è¡ã§å®è¡ããŸãããããã»ã©æ確ã§ã¯ãããŸãã)ã
scrape_configs:
- job_name: containers
static_configs:
labels:
job: containerlogs
__path__: /var/lib/docker/containers/*/*log # for linux only
ãã®æ§æãæå¹ã«ãããšããã¹ãŠã®ã³ã³ããããã®ãã°ã Loki ã«éä¿¡ãããŸãã ãããåé¿ããã«ã¯ãdocker-compose.yml ã§ãã¹ã nginx ã®èšå®ãå€æŽãããã° ã¿ã° ãã£ãŒã«ããè¿œå ããŸãã
proxy:
image: nginx.test.v3
//âŠ
logging:
driver: "json-file"
options:
tag: "{{.ImageName}}|{{.Name}}"
promtail.yml ãç·šéãããã€ãã©ã€ã³ãèšå®ããŸãã å ¥åã«ã¯æ¬¡ã®ã¿ã€ãã®ãã°ãå«ãŸããŸãã
{"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"}
ãã€ãã©ã€ã³ã¹ããŒãž:
- json:
expressions:
stream: stream
attrs: attrs
tag: attrs.tag
åä¿¡ JSON ãããã£ãŒã«ã streamãattrsãattrs.tag (ååšããå Žå) ãæœåºããæœåºããããããã«é 眮ããŸãã
- regex:
expression: ^(?P<image_name>([^|]+))|(?P<container_name>([^|]+))$
source: "tag"
æœåºããããããã«ã¿ã° ãã£ãŒã«ããé 眮ã§ããå Žåã¯ãæ£èŠè¡šçŸã䜿çšããŠã€ã¡ãŒãžãšã³ã³ããã®ååãæœåºããŸãã
- labels:
image_name:
container_name:
ã©ãã«ãå²ãåœãŠãŸãã æœåºãããããŒã¿å 㧠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 ã§ãããã¹ãŠã®ãã°ã«ã€ããŠããœãŒã¹ ãã°ãããã° ãã£ãŒã«ããæœåºããæœåºããããããã«è¡ããŒã䜿çšããŠé 眮ããŸãã
- regex:
# suppress forego colors
expression: .+nginx.+|.+[0m(?P<virtual_host>[a-z_.-]+) +(?P<nginxlog>.+)
source: logrow
æ£èŠè¡šçŸã䜿çšããŠå ¥åè¡ãã¯ãªã¢ããnginx ä»®æ³ãã¹ããš 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 ãªã©ã®ãªã¯ãšã¹ãã®ç®çãå€æããæœåºããããããã«å¯Ÿå¿ããããŒãèšå®ããŸãã
- template:
source: request_type
template: "{{if .photo}}photo{{else if .static_type}}static{{else if .api_request}}api{{else}}other{{end}}"
ãã³ãã¬ãŒãã®æ¡ä»¶æŒç®åã䜿çšããŠãæœåºããããããã«ã€ã³ã¹ããŒã«ãããŠãããã£ãŒã«ãã確èªããrequest_type ãã£ãŒã«ãã«å¿ èŠãªå€ (åçãéçãAPI) ãèšå®ããŸãã 倱æããå Žåã¯ä»ã®ãã®ãå²ãåœãŠãŸãã request_type ã«ã¯ãªã¯ãšã¹ã ã¿ã€ããå«ãŸããããã«ãªããŸããã
- labels:
api_request:
virtual_host:
request_type:
status:
æœåºãããããã«å«ããããšãã§ããå 容ã«åºã¥ããŠãã©ãã« api_requestãvirtual_hostãrequest_typeãããã³ status (HTTP ã¹ããŒã¿ã¹) ãèšå®ããŸãã
- output:
source: nginx_log_row
åºåãå€æŽããŸãã ããã§ãæœåºããããããããã¯ãªãŒã³ã¢ããããã nginx ãã°ã Loki ã«éãããŸãã
äžèšã®æ§æãå®è¡ãããšããã°ã®ããŒã¿ã«åºã¥ããŠåãšã³ããªã«ã©ãã«ãå²ãåœãŠãããŠããããšãããããŸãã
çæãã¹ãç¹ã® XNUMX ã€ã¯ãå€æ°ã®å€ (ã«ãŒãã£ããªãã£) ãæã€ã©ãã«ãååŸãããšãLoki ã®é床ã倧å¹
ã«äœäžããå¯èœæ§ãããããšã§ãã ã€ãŸããããšãã° user_id ãã€ã³ããã¯ã¹ã«å«ããã¹ãã§ã¯ãããŸããã ããã«ã€ããŠã¯ãèšäºã
ãã°ã®å¯èŠå
Loki ã¯ãLogQL ã䜿çšã㊠Grafana ã°ã©ãã®ããŒã¿ ãœãŒã¹ãšããŠæ©èœã§ããŸãã 次ã®æ©èœããµããŒããããŠããŸãã
- rate â XNUMX ç§ãããã®ã¬ã³ãŒãæ°ã
- äžå®æéã®ã«ãŠã³ã â æå®ãããç¯å²å ã®ã¬ã³ãŒãã®æ°ã
SumãAvg ãªã©ã®éèšé¢æ°ããããŸãã éåžžã«è€éãªã°ã©ã (HTTP ãšã©ãŒæ°ã®ã°ã©ããªã©) ãäœæã§ããŸãã
æšæºããŒã¿ ãœãŒã¹ Loki ã¯ãPrometheus ããŒã¿ ãœãŒã¹ãšæ¯èŒããŠæ©èœãå€å°å¶éãããŠããŸã (å¡äŸãå€æŽã§ããªããªã©) ããLoki 㯠Prometheus ã¿ã€ãã®ãœãŒã¹ãšããŠæ¥ç¶ã§ããŸãã ãããææžåãããåäœãã©ããã¯ããããŸããããéçºè
ã®å¿çããå€æãããšãã
Prometheus ã¿ã€ãã®ããŒã¿ ãœãŒã¹ãšã㊠Loki ãè¿œå ãã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
ãã®ãªãã·ã§ã³ã䜿çšãããšãæœåºããããããã®ããŒã¿ã«åºã¥ããŠã¡ããªã¯ã¹ãå®çŸ©ããã³æŽæ°ã§ããŸãã ãããã®ã¡ããªã¯ã¹ã¯ Loki ã«ã¯éä¿¡ãããŸãããPromtail /metrics ãšã³ããã€ã³ãã«è¡šç€ºãããŸãã Prometheus ã¯ããã®æ®µéã§åä¿¡ããããŒã¿ãåä¿¡ããããã«æ§æããå¿ èŠããããŸãã äžèšã®äŸã§ã¯ãrequest_type=âapiâ ã«ã€ããŠãã¹ãã°ã©ã ã¡ããªãã¯ãåéããŸãã ãã®ã¿ã€ãã®ã¡ããªã¯ã¹ã§ã¯ãããŒã»ã³ã¿ã€ã«ãååŸãããšäŸ¿å©ã§ãã éçããã³åçã«ã€ããŠã¯ããã€ãã®åèšãšãã€ããåä¿¡ããè¡æ°ãåéããŠå¹³åãèšç®ããŸãã
ã¡ããªã¯ã¹ã«ã€ããŠè©³ããèªã
Promtail ã§ããŒããéããŸãã
promtail:
image: grafana/promtail:1.4.1
container_name: monitoring.promtail
expose:
- 9080
ports:
- "9080:9080"
promtail_custom ãã¬ãã£ãã¯ã¹ãä»ããã¡ããªãã¯ã衚瀺ãããŠããããšã確èªããŸãã
ããã¡ããŠã¹ã®ã»ããã¢ããã æ±äººæ å ±ãè¿œå :
- job_name: 'promtail'
scrape_interval: 10s
static_configs:
- targets: ['promtail:9080']
ãããŠã°ã©ããæããŸãã
ããããããšã§ãããšãã°æãé ã XNUMX ã€ã®ã¯ãšãªãèŠã€ããããšãã§ããŸãã ãããã®ã¡ããªã¯ã¹ã®ç£èŠãèšå®ããããšãã§ããŸãã
ã¹ã±ãŒãªã³ã°
Loki ã¯ãã·ã³ã°ã« ãã€ã㪠ã¢ãŒããŸãã¯ã·ã£ãŒã ã¢ãŒã (æ°Žå¹³ã¹ã±ãŒã©ãã« ã¢ãŒã) ã®ããããã«ãªããŸãã 1.5 çªç®ã®ã±ãŒã¹ã§ã¯ãããŒã¿ãã¯ã©ãŠãã«ä¿åã§ãããã£ã³ã¯ãšã€ã³ããã¯ã¹ã¯å¥ã ã«ä¿åãããŸãã ããŒãžã§ã³ XNUMX ã§ã¯ãXNUMX ãæã«ä¿åããæ©èœãå°å ¥ãããŠããŸãããéçšç°å¢ã§ã®äœ¿çšã¯ãŸã æšå¥šãããŠããŸããã
ãã£ã³ã¯ã¯ S3 äºæã¹ãã¬ãŒãžã«ä¿åã§ããæ°Žå¹³ã¹ã±ãŒã©ãã«ãªããŒã¿ããŒã¹ (CassandraãBigTableããŸã㯠DynamoDB) ãã€ã³ããã¯ã¹ã®ä¿åã«äœ¿çšã§ããŸãã Loki ã®ä»ã®éšåããã£ã¹ããªãã¥ãŒã¿ãŒ (æžã蟌ã¿çš) ãšã¯ãšãªã¢ (ã¯ãšãªãŒçš) ã¯ã¹ããŒãã¬ã¹ã§ãããæ°Žå¹³æ¹åã«ãæ¡åŒµãããŸãã
DevOpsDays Vancouver 2019 ã«ã³ãã¡ã¬ã³ã¹ã§ãåå è
ã® 1 人ã§ãã Callum Styan æ°ã¯ãLoki ã䜿çšãããããžã§ã¯ãã«ã¯ãåèšãµã€ãºã® XNUMX% æªæºã®ã€ã³ããã¯ã¹ãæã€ãã¿ãã€ãã®ãã°ããããšçºè¡šããŸããã
ãããšELKã®æ¯èŒ
ã€ã³ããã¯ã¹ãµã€ãº
çµæã®ã€ã³ããã¯ã¹ ãµã€ãºããã¹ãããããã«ãäžèšã®ãã€ãã©ã€ã³ãæ§æãããŠãã nginx ã³ã³ãããŒãããã°ãååŸããŸããã ãã° ãã¡ã€ã«ã«ã¯ 406 è¡ãå«ãŸããŠãããåèšå®¹é㯠624 MB ã§ããã ãã°ã¯ 109 æé以å ã«çæããã100 ç§ãããçŽ XNUMX ãšã³ããªãçæãããŸããã
ãã°ã® XNUMX è¡ã®äŸ:
ELK ã«ãã£ãŠã€ã³ããã¯ã¹ä»ãããããšãã€ã³ããã¯ã¹ ãµã€ãºã¯ 30,3 MB ã«ãªããŸãã
Loki ã®å Žåãããã«ãããã€ã³ããã¯ã¹ãçŽ 128 KBããã£ã³ã¯å ã®ããŒã¿ãçŽ 3,8 MB ã«ãªããŸããã ãã°ã¯äººå·¥çã«çæããããã®ã§ãããå€çš®å€æ§ãªããŒã¿ãå«ãŸããŠããªãããšã«æ³šæããŠãã ããã ããŒã¿ãå«ãå ã® Docker JSON ãã°ãåçŽã« gzip ãããšã95,4% ã®å§çž®ãåŸãããŸãããã¯ãªãŒã³ãª nginx ãã°ã®ã¿ã Loki èªäœã«éä¿¡ããããšããäºå®ãèæ ®ãããšãæ倧 4 MB ã®å§çž®ã¯ç解ã§ããŸãã Loki ã©ãã«ã®äžæã®å€ã®åèšæ°ã¯ 35 ã§ãããã€ã³ããã¯ã¹ã®ãµã€ãºãå°ããããšãããããŸãã ELK ã®å Žåããã°ãã¯ãªã¢ãããŸããã ãããã£ãŠãLoki ã¯å ã®ããŒã¿ã 96%ãELK 㯠70% å§çž®ããŸããã
ã¡ã¢ãªæ¶è²»é
Prometheus ãš ELK ã¹ã¿ãã¯å šäœãæ¯èŒãããšãLoki ã®ãé£ã¹ããéã¯æ°åã® XNUMX ã«ãªããŸãã Go ãµãŒãã¹ã Java ãµãŒãã¹ããæ¶è²»éãå°ãªãããšã¯æããã§ãããJVM ããŒã Elasticsearch ã®ãµã€ãºãš Loki ã«å²ãåœãŠãããã¡ã¢ãªãæ¯èŒããã®ã¯èª€ãã§ãããããã§ããLoki ã䜿çšããã¡ã¢ãªãã¯ããã«å°ãªãããšã¯æ³šç®ã«å€ããŸãã CPU ã®å©ç¹ã¯ããã»ã©æçœã§ã¯ãããŸããããååšããŸãã
ã¹ããŒã
Loki ã¯ãã°ãããéãã貪é£ãããŸãã é床ã¯å€ãã®èŠå (ãã°ã®çš®é¡ããã°ã®è§£æã®é«åºŠãããããã¯ãŒã¯ããã£ã¹ã¯ãªã©) ã«ãã£ãŠæ±ºãŸããŸãããééããªã ELK ãããé«éã§ã (ç§ã®ãã¹ãã§ã¯çŽ XNUMX å)ã ããã¯ãLoki ãã€ã³ããã¯ã¹ã«å ¥ããããŒã¿ãã¯ããã«å°ãªããããã€ã³ããã¯ã¹äœæã«è²»ããæéãççž®ããããšããäºå®ã«ãã£ãŠèª¬æãããŸãã æ€çŽ¢é床ã«é¢ããŠã¯ãç¶æ³ã¯éã§ããLoki ã¯æ°ã®ã¬ãã€ããè¶ ããããŒã¿ã§ã¯èããé床ãäœäžããŸãããELK ã®æ€çŽ¢é床ã¯ããŒã¿ã®ãµã€ãºã«äŸåããŸããã
ãã°ããæ€çŽ¢ãã
Loki ã¯ããã°æ€çŽ¢æ©èœã®ç¹ã§ ELK ã«å€§ããå£ããŸãã æ£èŠè¡šçŸã䜿çšãã grep ã¯åŒ·åã§ãããæçããããŒã¿ããŒã¹ã«ã¯å£ããŸãã ç¯å²ã¯ãšãªã®æ¬ åŠãã©ãã«ã«ããéçŽã®ã¿ãã©ãã«ãªãã§æ€çŽ¢ã§ããªãããšãªã©ãããããã¹ãŠã Loki ã§ã®é¢å¿ã®ããæ å ±ã®æ€çŽ¢ãå¶éããŸãã ããã¯ãLoki ã䜿çšããŠäœãèŠã€ãããªããšããæå³ã§ã¯ãããŸããããPrometheus ãã£ãŒãã§æåã«åé¡ãèŠã€ãã次ã«ãããã®ã©ãã«ã䜿çšããŠãã°å ã§äœãèµ·ãã£ãããæ¢ããšãã®ãã°ã®æäœãããŒãå®çŸ©ããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹
ãŸã第äžã«ãããã¯çŸããã§ãïŒããããªãããæµæã§ããŸããã§ããïŒã Grafana ã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯èŠæ ããããŸãããKibana ã®æ¹ãã¯ããã«æ©èœãè±å¯ã§ãã
ããã®é·æãšçæ
å©ç¹ã® XNUMX ã€ã¯ãLoki ã Prometheus ãšçµ±åãããŠãããããããã«ã¡ããªã¯ã¹ãšã¢ã©ãŒããååŸã§ããããšã§ãã Prometheus ããç¶æ¿ãããµãŒãã¹ãã£ã¹ã«ããªããããèªåçã«ã©ãã«ãä»ãããããããKubernetes Pod ãããã°ãåéããŠä¿åããã®ã«äŸ¿å©ã§ãã
æ¬ ç¹ã¯ããã¥ã¡ã³ãã匱ãããšã§ãã Promtail ã®ç¹åŸŽãæ©èœãªã©ãããã€ãã®ããšã¯ã³ãŒããç 究ããéçšã§ã®ã¿çºèŠãããŸãããã幞ãã«ãããã¯ãªãŒãã³ãœãŒã¹ã§ãã ãã 1.0 ã€ã®æ¬ ç¹ã¯ã解ææ©èœã匱ãããšã§ãã ããšãã°ãLoki ã¯è€æ°è¡ã®ãã°ã解æã§ããŸããã ãã 2019 ã€ã®æ¬ ç¹ã¯ãLoki ãæ¯èŒçæ°ãããã¯ãããžãŒã§ããããšã§ã (ãªãªãŒã¹ XNUMX 㯠XNUMX 幎 XNUMX æã§ãã)ã
ãŸãšã
Loki ã¯ãå°èŠæš¡ããã³äžèŠæš¡ã®ãããžã§ã¯ãã«é©ãã 100% èå³æ·±ããã¯ãããžãŒã§ããããã°ã®éçŽããã°ã®æ€çŽ¢ãç£èŠãããã³ãã°ã®åæã®å€ãã®åé¡ã解決ã§ããŸãã
ç§ãã¡ã«ã¯ãç§ãã¡ã«åã£ã ELK ã¹ã¿ãã¯ããããé·å¹Žã«ããã£ãŠããŸããŸãªã«ã¹ã¿ã ãœãªã¥ãŒã·ã§ã³ãå¢ããããŠãããããBadoo ã§ã¯ Loki ã䜿çšããŸããã ç§ãã¡ã«ãšã£ãŠãé害ãšãªãã®ã¯ãã°ã®æ€çŽ¢ã§ãã 100 æ¥ãããçŽ XNUMX GB ã®ãã°ãããããããã¹ãŠãèŠã€ããŠããã以äžã®æ å ±ãè¿ éã«èŠã€ããããããšãéèŠã§ãã ã°ã©ãäœæãšç£èŠã«ã¯ãããŒãºã«åãããŠçžäºã«çµ±åãããä»ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŸãã Loki ã¹ã¿ãã¯ã«ã¯æãããªå©ç¹ããããŸãããæ¢ã«åŸãŠãã以äžã®ãã®ã¯åŸãããããã®å©ç¹ã移è¡ã³ã¹ããäžåãããšã¯ç¢ºãã«ãããŸããã
調æ»ã®çµæãLoki ã䜿çšã§ããªãããšãæããã«ãªããŸãããããã®æçš¿ãéžæã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
èšäºã§äœ¿çšãããŠããã³ãŒããå«ãŸãããªããžããªã¯æ¬¡ã®ãšããã§ãã
åºæïŒ habr.com