devops
Grafana - Loki - Promtail 모니터링 본문
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 추가
동일 클러스터 내에서 배포되었기 때문에 릴리즈 네임과 포트 지정
3) Label filtering
https://medium.com/lonto-digital-services-integrator/grafana-loki-configuration-nuances-2e9b94da4ac1
https://www.atatus.com/blog/a-beginners-guide-for-grafana-loki/
'DevOps > Monitoring' 카테고리의 다른 글
Promtail - Loki을 이용하여 쿠버네티스 Container 로그파일 모니터링하기 (0) | 2023.12.27 |
---|---|
Service Monitor 서비스 모니터 Target 등록 에러 (0) | 2023.09.30 |