LabHub
배우기 러닝패스 코스

Loki — 로그를 색인하지 않는 로그 저장소 · LogQL 로 묻는다 · 실습

로그는 다 들어 있는데 무엇을 물어야 할지 몰랐다

LabHub 에서 이어서 보기

목표

파드 안의 진짜 Loki 에 LogQL 을 직접 던져, 스트림 선택자와 줄 필터로 원하는 줄만 꺼내고 돌아온 JSON 의 모양까지 읽을 수 있게 됩니다.

왜 중요한가

Loki 에 질문을 던지는 일은 두 층으로 나뉜다. 먼저 선택자가 어느 스트림의 청크를 읽을지 정하고, 그 다음 줄 필터가 읽어 온 줄을 하나씩 맞춰 본다. 이 순서를 모르면 '왜 이 질의는 빠르고 저 질의는 느린가' 를 영원히 설명하지 못한다. 본문은 색인되어 있지 않으므로 줄 필터는 선택자가 고른 만큼을 전부 읽는다 — 그래서 사고 조사에서 가장 먼저 하는 일이 선택자와 시간 구간을 좁히는 일이다. limit 과 direction 도 사고 조사의 결과를 바꾼다. 방향을 모르고 limit 을 걸면 가장 중요한 첫 오류 대신 마지막 오류만 보게 된다.

단계

1. /root/lk-logql 에서 Loki 를 띄우고, date +%s 값을 /root/lk-logql/anchor.txt 에 한 줄로 적은 뒤 python3 /opt/lab/d5/gen.py logql "$(cat anchor.txt)" 로 자료를 넣으세요. 그리고 지금 Loki 에 스트림이 몇 개인지 세어 /root/lk-logql/01-boot.txtstreams=<정수> 한 줄로 적으세요.
2. 기준 시각에서 과거 한 시간 동안 appweb 이고 levelerror 인 줄이 몇 줄인지 구하세요. 쓴 질의를 /root/lk-logql/02-selector.logql 에, 줄 수를 /root/lk-logql/02-selector.txtlines=<정수> 한 줄로 적습니다.
3. 같은 한 시간 동안 세 서비스(web·api·worker) 전체에서 본문에 timeout 이 든 줄이 몇 줄인지 구하세요. 질의는 /root/lk-logql/03-line.logql, 답은 /root/lk-logql/03-line.txtlines=<정수> 로 적습니다.
4. 세 서비스 전체에서 본문에 refused 가 들어 있고 rpc 는 들어 있지 않은 줄을 세세요. 질의는 /root/lk-logql/04-chain.logql, 답은 /root/lk-logql/04-chain.txtlines=<정수> 로 적습니다.
5. 세 서비스 전체에서 본문에 500 또는 503 이라는 세 자리 숫자가 든 줄을 정규식 줄 필터 하나로 세세요. 질의는 /root/lk-logql/05-regex.logql, 답은 /root/lk-logql/05-regex.txtlines=<정수> 로 적습니다. 질의에는 정규식 줄 필터 연산자가 반드시 들어가야 합니다.
6. {app="web",level="error"} 를 같은 한 시간 구간에 limit=5 로 두 번 질의하세요. 한 번은 direction=forward, 한 번은 direction=backward 입니다. 결과를 /root/lk-logql/06-order.txt 에 세 줄로 적습니다 — forward_first=<나노초 타임스탬프>, backward_first=<나노초 타임스탬프>, total=<구간 전체 줄 수>.
7. 아무 로그 질의나 한 번 던져 원본 JSON 을 보고 /root/lk-logql/07-shape.txt 에 세 줄을 적으세요. result_type= 뒤에는 data.resultType 의 값, ts_unit= 뒤에는 values 의 첫 칸이 어떤 시간 단위인지(ns·us·ms·s 중 하나), entry_len= 뒤에는 values 의 원소 하나가 몇 칸짜리 배열인지 정수로 적습니다.
8. webapi 두 서비스에서 본문에 timeout 또는 refused 가 든 줄만 골라, 그 중 가장 이른 줄의 나노초 타임스탬프와 전체 줄 수를 구하세요. 질의는 /root/lk-logql/08-triage.logql, 답은 /root/lk-logql/08-triage.txtlines=<정수>first_ts=<나노초> 두 줄로 적습니다. 질의에는 정규식 줄 필터가 들어가야 하고, worker 는 들어가면 안 됩니다.

참고

단계 8개

  1. Loki 를 띄우고 하루치 대신 한 시간치를 넣는다
  2. 선택자만으로 볼 곳을 정한다
  3. 줄 필터로 본문을 뒤진다
  4. 필터를 이어 붙여 걸러 낸다
  5. 정규식 줄 필터
  6. limit 과 direction — 무엇이 잘려 나가는가
  7. 돌아온 JSON 을 읽는다
  8. 응용 — 한 질의로 사고 구간을 좁힌다