Logging & Monitoring - 1. Loki

zuckerfrei·2023년 4월 17일
0

Monitoring

목록 보기
3/6

요약

모니터링, 로깅을 위해 Loki, Grafana, Prometheus를 도입한 내용 정리
2023-03-08



0. 구성

그림 출처

아키텍쳐에서 보다시피
Promtail이 로그를 수집하고, Loki로 라벨링화하여 데이터를 전달하면, grafana가 수집한 데이터를 시각화한다.

여기서 나는 Promtail 대신 Loki Docker Plugin을 사용하여 Loki에게 전달해주도록 구성했다.

  1. 모든 서비스를 도커 컨테이너로 띄우는 상황이었고
  2. docker plugin을 써보고 싶었고
  3. loki 공식 문서에도 별다른 설정 없이 사용할 수 있는 것 처럼 적혀 있어서, 빠른 도입이 가능할 것이라 생각했다.

참조1 : https://grafana.com/docs/loki/latest/clients/docker-driver/#know-issues

참조2 : https://grafana.com/docs/loki/latest/clients/docker-driver/configuration/#supported-log-opt-options



1. Loki

1.1 Loki docker plugin

먼저 promtail을 대신해서 각 컨테이너의 로그를 수집할 docker plugin을 설치한다.
명령어 한 줄로 설치할 수 있어서 아주 간단했다.
참조

[root@dev-server docker]# docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
latest: Pulling from grafana/loki-docker-driver
Digest: sha256:82270b494d8c157f035fde65bc0159076f4c4361b5bb061b4fc817e8db04234a
32dbe5a742d5: Complete
Installed plugin grafana/loki-docker-driver:latest

설치 후 확인

[admin@dev-server docker]$ docker plugin ls
ID             NAME          DESCRIPTION           ENABLED
05b5e64f7f26   loki:latest   Loki Logging Driver   true

1.2 loki 설정 파일 작성

수집한 로그를 인덱싱할 Loki 컨테이너를 만들기 위해, 먼저 config 파일을 작성한다.

loki-config.yaml

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  instance_addr: 127.0.0.1
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: http://localhost:9093
  • host의 3100 포트로 loki 서비스를 할 것이라 선언한다. 이 포트는 나중에 grafana의 datasource에서 사용된다.

1.3 docker daemon 설정

loki docker plugin으로 컨테이너 로그를 수집하려 한다면, docker daemon 설정을 변경해줘야 한다.

/etc/docker/daemon.json 수정

{
  "debug": true,
  "log-driver": "loki",
  "log-opts": {
        "loki-url": "http://172.19.0.10:3100/loki/api/v1/push",
        "loki-batch-size": "400"
    }
}

/etc/docker/daemon.json 파일은 Docker daemon의 설정 파일로, Docker daemon이 실행되면서 사용하는 옵션들을 지정할 수 있다.
기본 로그 드라이버는 json-file로 설정되어 있으나, loki로 변경해준다.

  • loki-url
    • loki의 API 엔드포인트 URL. plugin과 grafana가 모두 이 경로를 사용한다.
    • loki를 컨테이너로 띄울 경우, 이 url에는 docker network ip를 입력해야한다. docker inspect 명령어로 컨테이너 ip를 확인하고 입력한다.
    • 컨테이너를 재시작 할 경우 ip가 변경되기도 하는데, 이럴 경우를 대비해서 loki 컨테이너는 ip를 고정시켜놓았다.
  • log-batc-size
    * loki로 전송되는 로그 데이터의 배치 크기. 한 번에 처리할 데이터 양이라고 한다.

이 설정 후 docker를 재시작하여 변경된 설정을 반영한다.

sudo systemctl restart docker

1.4 Loki 컨테이너 생성

아래 명령어로 Loki 컨테이너를 띄운다.

# 
docker run -d \
--restart=always \
--network [네트워크이름] \
--ip 172.19.0.10 \
--name=loki \
--mount type=bind,source=[loki-config.yaml파일 경로],target=/etc/loki/local-config.yaml \
-p 3100:3100 \
grafana/loki:2.7.3
  • --ip : loki의 IP를 고정시켜서 실행 → 재시작해도 /etc/docker/daemon.json 값을 그대로 사용하기 위함
  • --mount : loki-config.yaml 파일을 마운트 시켜서 설정파일로 읽도록 만듦

1.5 app 컨테이너 설정

  • 기존 컨테이너
    만약 기존에 다른 컨테이너가 기본 로그 드라이버(json-file)로 띄워진 상태였고,
    나중에 loki로 로그 드라이버를 변경할 경우 이 컨테이너의 상태가 비정상이 될 수 있다.
    (stop, rm, restart가 매우 느리거나 동작하지 않음)
  • 추가 설정
    다른 app 컨테이너 실행시 loki 로깅 드라이버를 사용하고 싶다면, 아래와 같이 옵션을 추가한다.
docker run \
--[다른 옵션] \
--log-driver=loki \
--log-opt loki-url=<LOKI_URL> \
<IMAGE>


다음글에서는 loki로 수집한 로그를 어떻게 grafana에서 대시보드로 시각화하는지 정리하겠다.

profile
무설탕 음료를 좋아합니다

0개의 댓글