Loki

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— grafana๊ฐ€ ๋ฒŒ์จ ์„ค์น˜๋˜์ž‡๋‹ค. loki๋ฅผ ์ฟ ๋ฒ ์— ์„ค์น˜ํ•ด๋ณด์ž.

install Loki stack

helm subchart๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. argocd๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ.

apiVersion: v2
name: core-loki-stack
type: application
version: 1.0.0
appVersion: '1.0.0'
dependencies:
  - name: loki-stack
    version: 2.4.1
    repository: https://grafana.github.io/helm-charts

deploy

argocd๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ๋ฅผ ํ•˜์˜€๋‹ค.

setting

grafana์— ์ ‘์†ํ›„ data source๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

http://core-loki-stack:3100 ์‚ฌ์šฉ. ์„œ๋น„์Šค๋ช…์ด๋‹ค.

๋ฐ์ดํ„ฐ ํ™•์ธํ•˜์ž

์‚ฌ์ด๋“œ ๋ฉ”๋‰ด์—์„œ explorer๋ฅผ ์„ ํƒ

์ƒ๋‹จ ๋ฉ”๋‰ด์—์„œ loki๋ฅผ ์„ ํƒํ•œ๋‹ค.

๋นˆ ํ™”๋ฉด์ด ๋‚˜์˜ฌ๊ฒƒ์ด๋‹ค. ์ด๊ฑธ ์‚ฌ์šฉํ•˜๋ ค๋ฉด LogQL์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

https://grafana.com/docs/loki/latest/logql/

๋กœ๊ทธ ์ฟผ๋ฆฌ๋Š” log stream selector์™€ filter expression ์ด๋ ‡๊ฒŒ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

Log Stream Selector

์ฟผ๋ฆฌ ํ‘œํ˜„์‹์˜ label ๋ถ€๋ถ„์„ ์ค‘๊ด„ํ˜ธ {}๋กœ ๋ฌถ์€ ๋‹ค์Œ key value ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ label์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ˆ˜์˜ label ํ‘œํ˜„์‹๋“ค์€ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

{namespace="kube-system",pod="core-dns-66bff467f8-2jz7d"}

์ด๋Ÿฐ์‹์ด๋‹ค. ์‰ฝ๊ฒŒ ํ•˜๊ธฐ์œ„ํ•ด์„œ ๋กœ๊ทธ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋ˆ„๋ฅธ๋‹ค. ํ˜„์žฌ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•œ selector๋“ค์ด ๋ณด์ธ๋‹ค. ์—ฌ๊ธฐ์„œ namespace๋ฅผ ํด๋ฆญํ•ด๋ณด์ž.

์ด์ œ ์›ํ•˜๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๋ˆ„๋ฅผ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ ๊ฐ์ฒด๋“ค์ด ์„ ํƒ๋˜์–ด์„œ ๋‚ด์šฉ์ด ๋ณด์ธ๋‹ค.

  • label ๋งค์นญ ์—ฐ์‚ฐ์ž

    • = ์ •ํ™•ํžˆ ๋™์ผํ•จ.

    • != ๋™์ผํ•˜์ง€ ์•Š์Œ.

    • =~ ์ •๊ทœํ‘œํ˜„์‹ ๋งค์นญ.

    • !~ ์ •๊ทœํ‘œํ˜„์‹์— ๋งค์นญ๋˜์ง€ ์•Š์Œ.

  • sample

    • {name=~"kubernetes.+"}

    • {name!~"kubernetes.+"}

filter expression

๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํ•„ํ„ฐํ• ์ˆ˜ ์žˆ๋‹ค.

  • Keep log lines that have the substring โ€œerrorโ€:

|= "error"
  • A complete query using this example:

{job="mysql"} |= "error"
  • Discard log lines that have the substring โ€œkafka.server:type=ReplicaManagerโ€:

!= "kafka.server:type=ReplicaManager"
  • A complete query using this example:

{instance=~"kafka-[23]",name="kafka"} != "kafka.server:type=ReplicaManager"
  • Keep log lines that contain a substring that starts with tsdb-ops and ends with io:2003. A complete query with a regular expression:

{name="kafka"} |~ "tsdb-ops.\*io:2003"
  • Keep log lines that contain a substring that starts with error=, and is followed by 1 or more word characters. A complete query with a regular expression:

{name="cassandra"} |~ `error=\w+`

์ด๋Ÿฐ์‹์œผ๋กœ ํ•„ํ„ฐํ• ์ˆ˜ ์žˆ๋‹ค.

ํ•„ํ„ฐ ์—ฐ์‚ฐ์ž๋“ค์€ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ‘œํ˜„์‹์„ ์ˆœ์ฐจ์ ์œผ๋กœ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๋กœ๊ทธ ๋ผ์ธ๋“ค์€ ๋ชจ๋“  ํ•„ํ„ฐ๋ฅผ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

{job="mysql"} |= "error" != "timeout"

- |= ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๋Š” ๋ผ์ธ.
- != ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ผ์ธ.
- |~ ์ •๊ทœ ํ‘œํ˜„์‹์— ๋งค์นญ๋˜๋Š” ๋ผ์ธ.
- !~ ์ •๊ทœ ํ‘œํ˜„์‹์— ๋งค์นญ๋˜์ง€ ์•Š๋Š” ๋ผ์ธ.

๋งค์นญ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋Œ€์†Œ ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ฉฐ (?i)๋ฅผ ์ •๊ทœ ํ‘œํ˜„์‹ ์•ž์— ์ ‘๋‘์‚ฌ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€์†Œ ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋„๋ก ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://grafana.com/docs/loki/latest/logql/ ์—์„œ ์ฐธ๊ณ ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

sample

{namespace="kube-system"} |= "[ERROR]"

Pattern Parser

์ƒˆ๋กœ์šด ๋ฒ„์ „๋ถ€ํ„ฐ ์ ์šฉ๋จ.

{namespace=~"ingress-nginx|ingress-nginx-internal"}  | pattern `<remote_ip> - - <_> "<method> <_> <_>" <status> <_> <_> "<_>" <_>`

์ด๋Ÿฌ๋ฉด ์งค๋ผ์„œ ๋ณด์—ฌ์ค€๋‹ค. ์—ฌ๊ธฐ์„œ ํ•„ํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฑธ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์ง€?

{namespace=~"ingress-nginx|ingress-nginx-internal"}  | pattern `<remote_ip> - - <_> "<method> <_> <_>" <status> <_> <_> "<_>" <_>`  | status="400"

{namespace=~"ingress-nginx|ingress-nginx-internal"}  | pattern `<remote_ip> - - <_> "<method> <_> <_>" <status> <_> <_> "<_>" <_>`  | status=~"[4-5].*"

Last updated

Was this helpful?