본문으로 건너뛰기

Promtail Pipeline(로그 변환)

Pipeline

promtail 시작 시 discovery(or static) -> relabel -> pipeline 순으로 진행되며, pipeline이 무한 반복되면서 로그를 수집하게 됩니다.

pipeline에는 stage라는 단계가 있고, 선언된 순서로 실행됩니다. stage에서는 Parsing, Transform, Action, Filtering 작업을 수행합니다.

pipeline에서 사용할 수 있는 데이터는 다음과 같습니다.

  • Labels
    • discovery(or static) + relabel 단계에서 생성된 labels
    • 앞선 stage에서 생성된 labels
  • Extracted Map
    • discovery(or static) + relabel 단계에서 생성된 labels
    • 앞선 stage에서 생성된 key-value map
  • timestamp
  • log line
pipeline_stages:
- <stage>:
<option>: <value>

Parsing stage

cri

cri: {}

cri는 아래와 같은 작업을 수행합니다.

- regex:
expression: "^(?s)(?P<time>\\S+?) (?P<stream>stdout|stderr) (?P<flags>\\S+?) (?P<content>.*)$"
- labels:
stream:
- timestamp:
source: time
format: RFC3339Nano
- output:
source: content

multiline

multiline:
# https://github.com/google/re2/wiki/Syntax
firstline: <re2>
# https://pkg.go.dev/time#ParseDuration
max_wait_time: 3s
max_lines: 128

Transform stage

template

template:
source: <key>
# https://pkg.go.dev/text/template
# https://masterminds.github.io/sprig/
template: <template>
  • <key>
    • Extracted Map에 있으면 해당 key의 value를 템플레이팅 된 값으로 대체합니다.
    • Extracted Map에 없으면 해당 key를 생성하고 템플레이팅 된 값으로 대체합니다.
  • <template>
    • 변수
      • {{ .Value }}: Extracted Map에서 source <key>에 해당하는 값을 가져옵니다.
      • {{ .Entry }}: 로그 라인 전체를 가져옵니다.
      • {{ .<key> }}: Extracted Map에서 <key>에 해당하는 값을 가져옵니다.

Action stage

Filtering stage

match

match:
# https://grafana.com/docs/loki/latest/query/log_queries/#log-stream-selector
# https://grafana.com/docs/loki/latest/query/log_queries/#line-filter-expression
selector: <logql>
action: keep
stages: []