Loki - Promtail - Grafana

우야·2021년 8월 19일
0

Loki, Promtail, Grafana를 활용하여 Log를 수집하고 Monitoring하는 방법

이거는 어디에 쓰는 물건인가?

  • 로그 수집과 모니터링을 위해 사용한다.

  • 이 과정을 이해 하기 위해서는 Loki, Promtail, Grafana의 역할을 알아야한다.

  • 그리고, 이런 구조가 필요했던 이유는?
    - Elastic search, Fluent-bit, Kibana의 구조로 Log수집을 했었다. 하지만 Elasticsearch에서의 새로운 라이센스를 적용하는것으로 인해서 Log수집 및 Monitoring의 구성을 바꿔야 하는 고민을 하게되었다.

    Elastic search 라이선스 변경 내용
    올해 Elastic에서는 Elasticsearch 7.11 버전부터 새로운 라이센스인 SSPL 또는 Elastic 라이센스 중에서 하나를 골라 사용할 수 있는 Dual 라이센스를 발표하면서 기존의 Apache 2.0 라이센스를 더는 제공하지 않는다고 발표하였습니다.
    https://blog.opsnow.com/35

  • 간단히 매칭해서 살펴보면 아래와 같은 구조를 가진다.

    • Elasticsearch = Loki : Log Data 저장소

    • Fluent-bit = Promtail : Log 수집기

    • Kibana = Grafana : Monitoring 화면

  1. Loki
    -- https://grafana.com/docs/loki/latest/overview/
  • Grafana Loki는 log aggregation tool이며, core of fully-featured logging stack이다.
  • Loki는 로그 데이터를 효율적으로 보관하도록 최적화된 데이터 저장소이다.
  • 로그 데이터의 효율적인 인덱싱한다.
  • 다른 로깅 시스템과 달리 Loki 인덱스는 Label로 만들어지며 원래 로그 메시지는 인덱싱되지 않습니다.
  • 구조
    - agent : promtail or many other Agents(fluent-bit ...)
    - agent는 app에의 log data를 수집하여, loki에 보내어 log를 쌓게 한다.
  • LogQL 사용
  • Loki features
    • 로그 인덱싱을 위한 효율적인 메모리 사용 : 레이블 집합에 대한 인덱싱
    • 멀티 테넌시 : 여러 테넌트가 단일 Loki인스턴스를 사용하게할 수 있음
    • LogQL, Loki의 쿼리 언어 : data metric 사용가능한 쿼리 언어
    • 확장성 : 대규모 설치를 위한 확장가능한 설계 구조, 각 마이크로서비스 구성요소는 별도의 프로세스로 나누어 구성 가능함
    • agent 유연성 : 많은 agent가 플러그인으로 지원함
    • grafana 통합 : grafana와 원할하게 통합되어 stack으로 제공
  1. Promtail
    -- https://grafana.com/docs/loki/latest/clients/promtail/
  • Promtail은 로컬 로그의 내용을 개인 Loki 인스턴스 또는 Grafana Cloud 로 전송하는 에이전트이다.
  • 구성
    • config.yaml에 Promtail의 서버, 로그 스크랩 방법등이 정의 되어있다.
    • client : 수집을 할때 시간 정보
    • positions: 로그 수집 마지막 위치 기록정보 (promtail이 죽었다 다시시작되면 해당 정보를 활용)
    • server : server 정보
    • target_config : config sync 주기
    • scrape_configs : 가장 중요한것으로 수집기의 Job을 정의하는것
      • target 정의 : kubernetes(kubernetes_sd_configs), file, syslog등의 스크랩핑 대상을 정의하고 레이블링하는 부분
      • pipline 정의 : target에서 수집한 log를 parsing, transform, action, filtering 하는 동작 정의하고 레이블링하는 부분
        예) 아래 job_name: kubernetes-pods-app의 scraping을 보면,
      1. kubernetes_sd_configs를 보면, kubernetes에 있는 pod들을 가져오고 pod에서 사용되는 container들의 log(/var/log/pods/$1/.log)들이 저장되되는 것을 가져온다.
      2. pipeline_stage을 보면, 수집된 log를
        - https://grafana.com/docs/loki/latest/clients/promtail/pipelines/
        1. pasing 동작 : json으로 parsing
        2. transformer 동작 : 예제에 없음
        3. Action 동작 : labels로 data
        4. filtering 동작 :
          • match를 활용
          • selector로 container rabel을 찾아낸다.
          • regex로 log에서 사용할 부분을 찾아내고 이것을 data라는 label을 만든다.
          • data는 json형태로 parsing하고 logname, content부분을 label을 만든다.
        5. 이런 절차의 결과로
          • data, logname, content라는 label을 만들어 Loki에 저장을 하는 것이다.
    • 참고 : 여기서 설명하지 않은 부분이 많으니 Document를 꼭 참고 해야한다.
      • 각 pipeline stage의 단계별로 사용할수 있는것이 정의되어 있음
        • pasing 단계 : docker, cri, regex, json
        • transform 단계 : multiline, template
        • action 단계 : timestamp, output, labels, metrics, tenant
        • filter 단계 : match, drop
data:
  promtail.yaml: |
    client:
      backoff_config:
        max_period: 5m
        max_retries: 10
        min_period: 500ms
      batchsize: 1048576
      batchwait: 1s
      external_labels: {}
      timeout: 10s
    positions:
      filename: /run/promtail/positions.yaml
    server:
      http_listen_port: 3101
    target_config:
      sync_period: 10s
    scrape_configs:
    - job_name: kubernetes-pods-app
      pipeline_stages:
      - json:
          expressions:
            log:
            stream:
            timestamp: time
      - match:
          selector: '{data="container"}'
          stages:
          - regex:
              expression: '(?P<data>{[\s\w\S\W]+[\}])'
              source: log
          - labels:
              data:
          - json:
              expressions:
                logname: 'log.name'
                content: '"content"'
              source: contents
          - labels:
              logname:
              content:
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - action: drop
        regex: .+
        source_labels:
        - __meta_kubernetes_pod_label_name
      - source_labels:
        - __meta_kubernetes_pod_label_app
        target_label: __service__
      - source_labels:
        - __meta_kubernetes_pod_node_name
        target_label: __host__
      - action: drop
        regex: ''
        source_labels:
        - __service__
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_container_name
        target_label: container
      - replacement: /var/log/pods/*$1/*.log
        separator: /
        source_labels:
        - __meta_kubernetes_pod_uid
        - __meta_kubernetes_pod_container_name
        target_label: __path__
  1. Grafana



profile
Fullstack developer

0개의 댓글