LabHub
배우기 러닝패스 코스

Loki — 로그를 색인하지 않는 로그 저장소 · 파서로 본문에서 값을 꺼낸다 · 실습

오류는 하나도 없는데 5xx 건수가 실제의 3분의 1이었다

LabHub 에서 이어서 보기

목표

파드 안의 진짜 Loki 에서 네 가지 LogQL 파서를 직접 붙여 보고, 파싱 오류가 난 줄과 오류 없이 조용히 값을 못 꺼낸 줄을 각각 세어 진짜 5xx 건수를 구합니다.

왜 중요한가

Loki 는 본문을 색인하지 않는다. 그래서 본문 속 값으로 거르려면 질의할 때마다 파서로 꺼내야 하고, 파서를 잘못 고르면 숫자가 조용히 줄어든다. json 은 실패를 __error__ 라벨로 신고하지만 logfmt 는 신고하지 않는다 — 형식이 다른 줄을 만나면 아무 라벨도 만들지 않고 지나가고, 라벨이 없으면 뒤따르는 라벨 필터는 그 줄을 조용히 버린다. 대시보드에는 오류도 경고도 안 뜬다. 그래서 새 스트림을 질의하기 전에 늘 두 숫자를 먼저 재야 한다 — 파싱이 실패한 줄 수와, 실패하지도 않았는데 값이 안 나온 줄 수.

단계

1. /root/lk-parsers 에서 Loki 를 띄우고 date +%s/root/lk-parsers/anchor.txt 에 적은 뒤 python3 /opt/lab/d5/gen.py parsers "$(cat anchor.txt)" 로 자료를 넣으세요. 그리고 기준 시각에서 과거 한 시간 동안 {app="mixed"}{app="orders"} 가 각각 몇 줄인지 세어 /root/lk-parsers/01-boot.txtmixed=<정수>orders=<정수> 두 줄로 적으세요.
2. orders 스트림에서 status 가 500 인 줄이 몇 줄인지 logfmt 파서로 세세요. 질의는 /root/lk-parsers/02-logfmt.logql, 답은 /root/lk-parsers/02-logfmt.txtlines=<정수> 로 적습니다.
3. mixed 스트림에 json 파서를 붙여, 파싱에 성공한 줄과 __error__ 라벨이 붙은 줄을 각각 세세요. 답은 /root/lk-parsers/03-json.txtok=<정수>err=<정수> 두 줄로 적고, __error__ 의 실제 값 하나를 /root/lk-parsers/03-json-name.txt 에 한 줄로 적으세요.
4. mixed 스트림에 logfmt 파서를 붙였을 때 오류는 나지 않았는데 status 라벨이 만들어지지 않은 줄이 몇 줄인지 세세요. 질의는 /root/lk-parsers/04-silent.logql, 답은 /root/lk-parsers/04-silent.txtlines=<정수> 로 적습니다.
5. 본문에 legacy 가 든 줄만 골라 pattern 파서로 상태 코드를 꺼내고, 그 값이 500 인 줄을 세세요. 질의는 /root/lk-parsers/05-pattern.logql, 답은 /root/lk-parsers/05-pattern.txtlines=<정수> 로 적습니다. 질의에는 pattern 파서가 반드시 들어가야 합니다.
6. 같은 레거시 줄에서 regexp 파서로 걸린 시간(밀리초)을 꺼내, 1000 보다 큰 줄을 세세요. 질의는 /root/lk-parsers/06-regexp.logql, 답은 /root/lk-parsers/06-regexp.txtlines=<정수> 로 적습니다. 질의에는 regexp 파서가 반드시 들어가야 합니다.
7. mixed 스트림의 줄을 형식 세 가지로 갈라 세어 /root/lk-parsers/tally.tsv 를 만드세요. 머리글 없이 세 줄이고 각 줄은 탭으로 나눈 두 칸 <형식><탭><줄수> 입니다. 형식 이름은 순서대로 json, legacy, logfmt 이고, 세 줄의 합은 1단계에서 센 mixed 전체 줄 수와 같아야 합니다.
8. mixed 스트림에서 상태 코드가 500 인 줄의 진짜 총 건수를 구해 /root/lk-parsers/08-total.txttotal=<정수> 로 적고, 그 다음 줄에 reason= 으로 시작하는 한 문장(공백 뺀 40자 이상)을 적으세요. 왜 파서 하나로는 이 숫자를 셀 수 없는지 자기 말로 씁니다.

참고

단계 8개

  1. 형식이 섞인 스트림을 손에 쥔다
  2. 형식이 깔끔할 때는 logfmt 한 줄이면 된다
  3. json 파서는 실패를 신고한다
  4. 오류도 없이 아무것도 안 꺼낸 줄을 센다
  5. 자리가 고정된 줄에는 pattern 이 맞다
  6. 정규식 파서로 숫자를 꺼내 비교한다
  7. 응용 ① — 형식별로 몇 줄인지 표로 만든다
  8. 응용 ② — 진짜 5xx 건수와 그 사실을 남긴다