EC2에 Grafana + Prometheus + Loki로 모니터링 구축하기
포스트
취소

EC2에 Grafana + Prometheus + Loki로 모니터링 구축하기

서론

모니터링의 중요성

현대의 애플리케이션과 서비스는 복잡하고, 다양한 구성 요소로 구성되어 있습니다. 이러한 복잡한 시스템에서는 오류나 성능 저하, 다양한 이슈들이 예상치 못한 시간에 발생할 수 있습니다. 이러한 이슈들을 신속하게 파악하고 대응하기 위해서는 효과적인 모니터링 시스템이 필수적입니다.

모니터링은 시스템의 건강 상태를 지속적으로 관찰하고, 이상 징후나 문제가 발생했을 때 즉각적으로 알림을 받을 수 있게 해줍니다. 따라서, 장애 발생 시간을 최소화하고, 사용자 경험을 향상시키는 데 크게 기여합니다.

Grafana, Prometheus, Loki 소개

  • Grafana: Grafana는 오픈소스 대시보드 및 모니터링 솔루션입니다. 다양한 데이터 소스에서 정보를 가져와 시각적으로 나타낼 수 있으며, 알림, 애노테이션, 플러그인 지원 등 다양한 기능을 제공합니다.

  • Prometheus: Prometheus는 CNCF(Cloud Native Computing Foundation)에서 후원하는 오픈소스 시스템 모니터링 및 경고 툴킷입니다. 메트릭 수집 및 저장, 시계열 데이터베이스, 강력한 질의 언어(PromQL) 등의 기능을 제공합니다.

  • Loki: Loki는 Grafana Labs에서 개발한 로그 수집 및 집계 시스템입니다. Loki는 Prometheus의 아이디어와 접근 방식에서 영감을 받아 설계되었습니다. 특히, Loki는 Prometheus의 라벨 시스템을 활용하여 로그 데이터를 분류하고 쿼리합니다. 이러한 설계는 Prometheus를 사용하던 사용자들에게 친숙한 경험을 제공하며, 메트릭과 로그를 함께 분석할 때 효과적인 환경을 제공합니다.

이 세 도구를 함께 사용함으로써, EC2에서 운영하는 애플리케이션 및 서비스의 성능 모니터링, 로깅, 알림을 통합적으로 관리할 수 있게 됩니다.

Grafana 설치 및 설정

모니터링 시스템을 구축할 때, 실시간으로 시스템의 상태를 확인할 수 있는 대시보드는 필수적입니다. Grafana는 이러한 역할을 수행하는 인기 있는 대시보드 솔루션 중 하나입니다. Prometheus와 Loki를 통한 모니터링 데이터를 Grafana 대시보드를 통해 시각화하는 것이 목표입니다.

우리는 이 목표를 달성하기 위해 Docker를 활용하여 Grafana, Prometheus, Loki를 구동할 예정입니다. 이들 각각의 서비스는 도커 컨테이너 내에서 실행될 것이며, 각 컨테이너들은 monitoring_network라는 동일한 브릿지 네트워크 내에서 작동할 것입니다. 이렇게 함으로써 컨테이너 간의 통신이 컨테이너 이름을 URL로 사용하여 간편하게 이루어질 수 있게 됩니다.

그러면, 우선 Grafana를 웹 페이지로 띄워보는 것부터 시작해봅시다!

Grafana 웹 페이지 구축

먼저, 모니터링을 위한 도커 네트워크 monitoring_network를 생성합니다.

1
sudo docker network create monitoring_network

다음으로, Grafana 컨테이너를 실행합니다.

1
sudo docker run --network=monitoring_network -d -p 3001:3000 --name=grafana --user "$(id -u)" -v /workspace/grafana:/var/lib/grafana grafana/grafana

명령어의 핵심 옵션은 다음과 같습니다:

  • -v /workspace/grafana:/var/lib/grafana: 이 옵션은 호스트 시스템의 /workspace/grafana 디렉토리와 컨테이너 내의 /var/lib/grafana 디렉토리를 연결합니다. 이를 통해 Grafana의 데이터와 설정 파일들이 호스트 시스템에 저장되어, 컨테이너를 재시작해도 데이터가 유지됩니다.

  • -p 3001:3000: Grafana는 기본적으로 3000 포트에서 실행됩니다. 이 옵션은 호스트의 3001 포트와 컨테이너의 3000 포트를 연결하여, 외부에서 접속할 때는 3001 포트를 사용하도록 합니다.

또한, 해당 Grafana 서비스를 외부에서 접근 가능하게 하기 위해 Nginx 설정을 다음과 같이 구성할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen 3000;
    server_name grafana.kjb4494.site;

    location / {
        proxy_pass http://localhost:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

이 설정을 /etc/nginx/conf.d/grafana.conf에 저장한 후, Nginx를 재시작하면 ALB와 Route53을 구성하여 외부에서 grafana.kjb4494.site 도메인을 통해 Grafana에 접속할 수 있게 됩니다.

Grafana 로그인 대시보드에 접속하면, 최초의 아이디와 비밀번호는 admin/admin으로 설정되어 있습니다. 이를 통해 로그인하고 나서 필요에 따라 비밀번호를 변경할 수 있습니다.

Prometheus 설치 및 설정

Prometheus는 오픈 소스 모니터링 및 알림 툴킷입니다. 주로 시계열 데이터 모니터링에 사용되며, 풍부한 데이터 모델과 질의 언어(PromQL)를 제공합니다. 설치 및 설정 문서

설치 방법

1
sudo docker run --network=monitoring_network -d -p 9090:9090 -v /workspace/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus prom/prometheus

저의 경우, /workspace/prometheus/prometheus.yml 설정파일은 다음과 같이 구성했습니다:

1
2
3
4
5
6
7
8
9
10
11
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]
  - job_name: "pet-diary-auth-api"
    metrics_path: "/actuator/prometheus"
    static_configs:
      - targets: ["172.18.0.1:8081"]

여기서 targets에 지정된 주소는 모니터링 대상인 애플리케이션의 주소입니다. 저는 AWS 프리티어 환경이라 동일한 EC2 인스턴스 내에서 애플리케이션을 실행하고 있기 때문에, monitoring_network 도커 네트워크의 게이트웨이 IP를 사용하였습니다.

Spring 애플리케이션에서 Prometheus 연동 설정

Prometheus를 통해 Spring 애플리케이션의 메트릭을 수집하기 위한 설정은 다음과 같습니다:

  1. 의존성 추가

    먼저, 필요한 의존성을 build.gradle 또는 pom.xml에 추가합니다.

    1
    2
    
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'io.micrometer:micrometer-registry-prometheus'
    
  2. Properties 설정

    application.yml 또는 application.properties 파일에 다음 설정을 추가합니다:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    management:
    endpoint:
      prometheus:
      enabled: true
    endpoints:
      web:
      exposure:
        include: prometheus,info,health
    metrics:
      export:
      prometheus:
        enabled: true
    
  3. 보안 설정

    만약 Spring Security 등을 사용하고 있다면, Prometheus 메트릭을 제공하는 엔드포인트에 대한 권한을 설정해야 합니다. 이를 위해 /actuator/prometheus 경로에 대한 접근 권한을 적절하게 조정해야 합니다.

Grafana에 연결

사진

Connetions 목록에서 Datasource로 Prometheus를 추가하여 Prometheus server URL을 설정해줍니다. 동일한 도커 브릿지 네트워크에 있기 때문에 컨테이너명으로 접근 가능합니다. 정상적으로 구축됐으면 Save & test 버튼을 눌르면 Successfully queried the Prometheus API.와 같은 메시지가 뜹니다.

Import dashboard

처음부터 대시보드를 일일이 구성하면 매우 귀찮기 때문에 Grafana Dashboard에서 마음에 드는 구성을 골라 Import 해보겠습니다. 저는 Prometheus Benchmark - 2.7.x를 사용해보도록 하겠습니다.

사진

사용방법은 매우 간단합니다. Import via grafana.com에 ID만 입력해서 Load를 진행해주면 됩니다.

사진

이전에 만든 Prometheus Datasource를 연결해주면 위와 같이 성공적으로 대시보드가 나타납니다.

Loki 및 Promtail 설치 및 설정

Loki 개요

Loki는 Grafana Labs에서 개발한 로그 수집 및 집계 시스템입니다.

Loki는 Prometheus와는 약간 다른 용도로 설계되었습니다. Prometheus는 주로 시계열 데이터를 모니터링하는데 사용되는 반면, Loki는 로그 데이터를 중심으로 설계되었습니다. 특히, Loki는 로그 메시지의 메타데이터만 인덱싱하고, 로그 메시지의 내용 자체는 인덱싱하지 않습니다. 이 방식은 로그 수집과 집계의 효율성을 크게 향상시키며, 저장 공간 및 리소스 사용량을 최소화합니다.

이러한 특성 덕분에, Loki는 특히 클라우드 환경에서 많은 양의 로그 데이터를 효과적으로 관리하는 데 유용합니다. 그리고 Prometheus에서 수집한 메트릭 데이터와 함께 Loki에서 수집한 로그 데이터를 Grafana 대시보드에서 동시에 조회하면, 시스템의 문제를 더 빠르게 파악하고 대응할 수 있습니다.

설치 및 설정 문서

Loki 설치 방법

Grafana나 Prometheus와 비슷하므로 자세한 설명은 생략하겠습니다.

1
2
wget https://raw.githubusercontent.com/grafana/loki/v2.9.1/cmd/loki/loki-local-config.yaml -O /workspace/loki/loki-config.yaml
sudo docker run --network=monitoring_network --name loki -d -v /workspace/loki:/mnt/config -p 3100:3100 grafana/loki:2.9.1 --config.file=/mnt/config/loki-config.yaml

Promtail 개요

Promtail은 Loki의 클라이언트로, 로그 파일을 Loki에 전달하는 역할을 합니다. Loki 자체는 로그를 직접 수집할 수 없으므로, Promtail과 같은 클라이언트가 필요하게 됩니다. Promtail은 호스트의 로그 파일들을 읽어서 Loki로 전송하는 중요한 구성요소입니다. 설치 및 설정 문서

Promtail 설치 및 설정 방법

1
2
wget https://raw.githubusercontent.com/grafana/loki/v2.9.1/clients/cmd/promtail/promtail-docker-config.yaml -O /workspace/promtail/promtail-config.yaml
sudo docker run --network=monitoring_network --name promtail -d -v /workspace/promtail:/mnt/config -v /workspace/projects/auth-api/logs:/pet-diary-auth-api --link loki grafana/promtail:2.9.1 --config.file=/mnt/config/promtail-config.yaml

위의 Docker 실행 명령에서 -v /workspace/projects/auth-api/logs:/pet-diary-auth-api 옵션은 호스트의 /workspace/projects/auth-api/logs 경로에 있는 로그 파일들을 Docker 컨테이너 내의 /pet-diary-auth-api 경로에 마운트하는 역할을 합니다. 이렇게 마운트된 로그 파일들은 Promtail에 의해 읽히게 되며, 설정 파일 내의 __path__ 설정을 통해 해당 로그 파일들이 어디에 위치하는지를 알게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
  - job_name: system
    static_configs:
      - targets:
          - localhost
        labels:
          job: pet-diary-auth-api-log
          __path__: /pet-diary-auth-api/*.log

이 설정에서 __path__는 Promtail이 로그를 수집할 위치를 가리킵니다. 여기서는 /pet-diary-auth-api/*.log로 설정되어 있으므로, Promtail은 /pet-diary-auth-api 디렉터리 내의 모든 .log 확장자를 가진 로그 파일들을 읽어 Loki로 전송하게 됩니다.

로그 경로 추가 방법

새로운 로그 경로를 추가해야 할 경우 다음 단계를 따라주세요:

  1. promtail-config.yaml 파일의 scrape_configs를 수정합니다. 여기서 수정할 부분은 주로 __path__ 설정입니다. 위에서 다운로드 받은 기본 설정 파일을 참고하면서 필요에 따라 로그 수집 경로를 조정할 수 있습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    scrape_configs:
     - job_name: system
       static_configs:
         - targets:
             - localhost
             labels:
             job: pet-diary-auth-api-log
             __path__: /pet-diary-auth-api/*log
         - targets:
             - localhost
             labels:
             job: applogs
             __path__: /app/logs/*log
    
  2. 새로 추가된 로그 경로의 볼륨을 Docker에 마운트합니다.

    1
    
    docker run ... -v /app/logs:/app/logs ... grafana/promtail:2.9.1 ...
    
  3. 변경 사항을 적용하기 위해 Promtail의 Docker 컨테이너를 재시작합니다.

    1
    
    docker restart promtail
    

Grafana에 연결 및 테스트

연결은 Prometheus Datasource를 추가했던 것처럼 똑같이 진행하면 됩니다.

저는 테스트를 위해 Loki를 사용하는 Dashboard인 ID 17175를 Import 해봤습니다.

사진

물론, 위 사진처럼 Import 하자마자 정상 동작하는 것은 아닙니다. Edit로 들어가 아까 설정한 promtail-config.yaml을 참고하여 PromQL을 적당하게 수정해줘야합니다.

  • Log Type Rate

    1
    
    sum by(level) (rate({job="pet-diary-auth-api-log"} | pattern `<timestamp> <level> <id> --- <message>` | level =~ "DEBUG|ERROR|TRACE|INFO" |= "$log_keyword" [1m]))
    
  • Log of All Spring Boot Apps

    1
    
    {job="pet-diary-auth-api-log"}
    

결론

이 글에서는 Grafana, Prometheus, Loki 및 Promtail의 기본 설치 및 설정 방법에 대해 알아보았습니다. 이러한 툴들을 활용하면, 시스템의 모니터링 및 로깅을 효과적으로 관리할 수 있습니다. 복잡한 인프라 환경에서 문제점을 빠르게 파악하고 대응할 수 있도록 도와주는 이러한 도구들은 DevOps 문화의 핵심 요소 중 하나입니다. 초기 설정이나 튜닝 과정에서 어려움이 있을 수 있지만, 한번 잘 구성해두면 시스템 운영에 큰 도움이 됩니다. 😄

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.