devops

Grafana - Loki - Promtail 모니터링 본문

DevOps/Monitoring

Grafana - Loki - Promtail 모니터링

vataops 2023. 9. 29. 23:52
반응형

Prometheus는 Memory와 CPU같은 하드웨어 리소스를 모니터링하는데 사용되므로 프로세스의 이벤트를 로깅하는데 한계가 있다.

ELK 스택으로 개별 모니터링 파이프라인을 구축하기도 하지만, Grafana로 로깅에 최저화된 Loki를 사용하면 이미 Prometheus + Grafana로 메트릭을 수집하던 파이프라인에서 효율적인 로깅까지도 가능해진다.

Loki

Loki는 2018년 Grafana Lab에서 시작한 프로젝트로 수평 확장과 높은 가용성 그리고 멀티테넌시라는 특징을 가지고 있으며 낮은 비용에 운영이 간단하다.

Store the logs in Loki

Loki는 로그 텍스트를 인덱싱하지않고, 스트림으로 그룹화, 라벨링으로 인덱싱한다. 이를 통해서 비용 절감과 함께 로그 라인 쿼리를 짧은 시간에 처리할 수 있다.

LogQL

로키의 강력한 쿼리언어로, 로그를 explore하는데 사용한다. LogQL 쿼리는 Grafana에서 Log를 시각화한다.

Distributed Storage

로그를 압축하고 동일한 로그 라인을 중복 저장하지 않도록 설계되어 있어, 스토리지 비용이 절약된다. (Loki는 로그 데이터 저장에 chunk와 index 두가지 주요 컴포넌트로 데이터를 나누어 저장함) 

  • Chunk : 실제 로그 데이터의 압축된 연속적 블록을 의미함. 수집한 로그 데이터를 chunk 형태로 압축하여 저장하며, 압축된 chunk는 다양한 백엔드 스토리지에 저장됨. 대표적으로 AWS S3, Google Cloud Storage 등이 있음.

Architecture

 

로키는 Distributor, Ingester, Qurie,  Query Frontend 라는 4가지 모듈로 구성된다. 

  • Distributor : 클라이언트의 데이터 스트림은 Distributor에 의해서 처리되고 검증된다. 유효 데이터는 Chunk로 분할되어 병렬 처리를 위해 여러 Ingester로 전송된다.
  • Ingester : Ingester에 의해서 데이터가 Storage에 기록된다. 메모리 내에서의 검색의 경우에서 ingester가 데이터를 리턴한다.
  • Querier : Ingester와 오브젝트 스토리지에서 사용자 쿼리를 처리하는데 사용된다. 쿼리는 먼저 로컬 스토리지에서 수행된 다음, Long-term 스토리지에서 수행된다.
  • Query Frontend : 선택적으로 쿼리에 대한 API 엔드포인트를 제공하여 대규모 쿼리를 병렬화할 수 있다. 대규모 검색을 작은 단위로 나누어 로그 읽기를 병렬로 수행한다. 

Promtail

Promtail은 Loki를 위한 Log collector로 Prometheus의 서비스 디스커버리와 같은 역할을 한다. labeling, transforming 그리고 Log filtering을 Loki로 전달하기 전에 수행한다.

Grafana Loki의 작동

 

1) Promtail로 로그 가져오기 : Loki로 수집 전에 로그의 태그 지정과 변환 필터링과 같은 기능을 거친다

2) Loki에 로그 저장

3) LogQL을 이용하여 탐색

4) alert 로그 

Loki 적용 테스트

1) https://github.com/grafana/helm-charts / loki-stack helm chart 배포

test_pod:
  enabled: true
  image: bats/bats:1.8.2
  pullPolicy: IfNotPresent

loki:
  enabled: true
  isDefault: true
  url: http://{{(include "loki.serviceName" .)}}:{{ .Values.loki.service.port }}
  readinessProbe:
    httpGet:
      path: /ready
      port: http-metrics
    initialDelaySeconds: 45
  livenessProbe:
    httpGet:
      path: /ready
      port: http-metrics
    initialDelaySeconds: 45
  datasource:
    jsonData: "{}"
    uid: ""


promtail:
  enabled: true
  config:
    logLevel: info
    serverPort: 3101
    clients:
      - url: http://{{ .Release.Name }}:3100/loki/api/v1/push

나머지 컴포넌트는 false 설정

2) Grafana datasource 추가

loki datasource

동일 클러스터 내에서 배포되었기 때문에 릴리즈 네임과 포트 지정

3) Label filtering

loki explore


https://medium.com/lonto-digital-services-integrator/grafana-loki-configuration-nuances-2e9b94da4ac1

https://www.atatus.com/blog/a-beginners-guide-for-grafana-loki/

반응형
Comments