[DevOps] Prometheus & Grafana

young-gue Park·2024년 3월 27일
1

DevOps

목록 보기
11/13
post-thumbnail

⚡ Prometheus & Grafana


📌 Prometheus

🔷 오픈 소스 시스템 모니터링 및 경고 도구, 시계열 데이터베이스

  • CNCF(Cloud Native Computing Foundation)에 의해 관리
  • 주요 특징으로 다차원 데이터 모델, 유연한 쿼리 언어(PromQL), 시간 시리즈 데이터 수집, 실시간 경고 등이 있다.

🔷 프로메테우스가 제공하는 주요 기능

  1. 멀티차원 데이터 모델

    • 라벨을 기반으로 한 시계열 데이터를 사용하여 강력한 쿼리를 실행할 수 있다.
  2. PromQL

    • 프로메테우스 쿼리 언어를 사용하여 정밀한 시계열 데이터 분석이 가능.
  3. 독립성 및 서버리스

    • 별도의 분산 저장 시스템 없이 동작하며, 각 서비스에 에이전트를 설치할 필요가 없다.
  1. 강력한 경고
    • Alertmanager와 통합하여 복잡한 경고 규칙을 설정하고 관리할 수 있다.

📌 Why Prometheus?

🥬 현재 프로젝트

1. 향상된 인사이트와 가시성

  • 시스템의 성능 지표를 실시간으로 수집하고 시각화함으로써, 서비스의 건강 상태를 한눈에 파악할 수 있게 되었다.
  • 이는 빅데이터 분석의 정확도와 서비스 추천의 품질을 직접적으로 향상시켰다.

2. 경고와 빠른 문제 해결

  • 프로메테우스의 실시간 경고 시스템을 통해 성능 저하나 예상치 못한 문제가 발생할 경우 즉시 팀에 알림을 줄 수 있게 되었다.
  • 이를 통해 신속한 대응이 가능해졌고, 잠재적인 서비스 중단 시간을 대폭 줄였다.

3. 무중단 운영

  • 프로메테우스의 비침투적인 모니터링 방식 덕분에 서비스가 모니터링 과정에서 발생할 수 있는 성능 저하나 중단 없이 지속적으로 데이터를 수집할 수 있게 되었다.

4. 쉬운 통합과 확장성

  • 스프링 부트 애플리케이션과의 쉬운 통합을 통해, Gradle 관리 환경에서도 끊김 없이 모니터링 솔루션을 배포할 수 있게 되었다.
  • 컨테이너화된 환경에서의 확장성은 서비스가 성장함에 따라 자연스럽게 시스템을 확장할 수 있게 도와주었다.

📌 Prometheus 사용하기

필자는 EC2 상에서 Docker를 이용한 서버 관리 중이다.

1. Docker의 컨테이너로 Prometheus 서버를 열기 전에 미리 prometheus.yml 파일을 작성한다.

# 기본적인 전역 설정 (매트릭 수집 간격 설정)
global:
  scrape_interval:     1s
  evaluation_interval: 1s
  # 'scrpae_timeout'의 default는 10초
# Alertmanager
alerting:
  alertmanagers:
    - static_configs:
        - targets:
        	- alertmanager:9093
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs:
        - job_name: 'spring-boot'
          metrics_path: '/actuator/prometheus'
          static_configs:
                  - targets: ['Domain or localhost:8084']
  • metrics_path : metric 경로 지정

  • static_configs: targets에는 host를 지정

  • scrape_interval: 수집 주기를 설정

2. 볼륨 마운트를 이용하여 컨테이너를 연다.

sudo docker run -d \
  --name=prometheus \
  -p 9090:9090 \
  -v /home/jenkins/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

3. 프로젝트의 설정을 추가한다.

🖥 build.gradle

dependency {
	implementation 'io.micrometer:micrometer-registry-prometheus'
}

🖥 application.yml

management:
  endpoint:
    metrics:
      enabled: true
    prometheus:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "prometheus"
  metrics:
    tags:
      application: ${spring.application.name}

💡 /actuator/prometheus로 접속하거나 http://<Prometheus를 띄운 서버의 public ip>:9090으로 접속하면 잘 연동되었는지 확인해 볼 수 있다.

그런데...

써본 사람은 알겠지만 메트릭이 넘어와도 이것들을 여기서 한눈에 보는 것이 쉽지 않다. 그래서 이를 더 효과적으로 시각화하기 위해 Grafana를 적용하기로 결정하였다.


📌 Grafana

🔷 강력한 시각화 및 분석 도구

  • 다양한 데이터 소스에서 수집된 메트릭을 통해 동적 대시보드를 생성

  • 사용자가 복잡한 데이터를 쉽게 이해할 수 있도록 돕고, 시스템이나 어플리케이션의 상태를 한눈에 파악할 수 있도록 시각적인 피드백을 제공한다.

  • Grafana는 특히 Prometheus와 같은 시계열 데이터베이스와 연동할 때 그 진가를 발휘한다.

🔷 Grafana의 주요 기능

  1. 다양한 데이터 소스 지원

    • Prometheus, InfluxDB, ElasticSearch 등 다양한 데이터 소스를 지원한다.
  2. 강력한 시각화 기능

    • 각종 그래프, 차트, 맵, 히트맵 등을 이용하여 데이터를 시각화한다.
  3. 쉬운 대시보드 관리

    • 사용자 친화적인 인터페이스를 통해 대시보드를 쉽게 생성하고 관리할 수 있다.
  4. 알림 기능

    • 데이터의 특정 조건을 충족할 때 알림을 설정하여 즉시 피드백을 받을 수 있다.

📌 Why Grafana?

1. 빠른 인사이트 획득

  • Grafana 대시보드를 통해 실시간으로 시스템과 어플리케이션의 상태를 모니터링할 수 있게 되었다.
  • 이로 인해 데이터 기반의 의사 결정이 빠르게 이루어지고, 장애 발생 시 즉각적인 대응이 가능해졌다.

2. 향상된 협업

  • Grafana의 대시보드 공유 기능은 팀원들 간의 커뮤니케이션을 강화했다.
  • 팀 내외부 스테이크홀더들이 동일한 대시보드를 보며 데이터에 대한 이해를 동일한 시각에서 시작할 수 있게 되었다.

3. 성능 모니터링의 효율화

  • Grafana의 강력한 시각화 도구를 이용하여, 복잡한 메트릭도 쉽게 해석할 수 있게 되었다.
  • 성능 지표를 한눈에 파악함으로써, 문제 해결 과정에서 드는 시간과 노력을 크게 줄일 수 있었다.

4. 사용자 경험 개선

  • Grafana를 통해 사용자 행동과 상호작용에 대한 분석이 가능해졌고, 이를 통해 보다 맞춤화된 사용자 경험을 제공할 수 있게 되었다.

📌 Grafana 사용하기

1. Grafana imageDocker Container화 시킨다.

🖥 compose.yaml

grafana:
    image: grafana/grafana:latest
    container_name: grafana
    user: "$UID:$GID"
    ports:
      - "3000:3000"
    volumes:
      - ./grafana-data:/var/lib/grafana
    depends_on:
      - prometheus
  • prometheus가 이미 올라가있다면, 당연히 직접 docker 명령어를 이용해 컨테이너를 생성해도 상관없다.
  • 다만 볼륨 마운트와 user UID 및 GID는 적어놓는 것이 좋다.
  • depends_on 설정을 통해 prometheus 컨테이너보다 먼저 생성되어 오류가 발생하는 것을 막아야한다.

❗ 볼륨 없이 만든 컨테이너가 닫히면 얄짤없이 모든 것이 날아갈 수 있다는 건 늘 기억하자.

2. Grafana 접속 후 초기 설정을 한다.

💡 이전에 올렸던 Grafana 사용 포스팅을 참고하길 바란다.

3. Data source로 Prometheus를 등록한다.

  • Save & test 를 눌러 해당 표시가 나타나면 성공한 것이다.

3. 대시보드를 만들거나 import 한다.

  • 필자는 Spring boot 2.1 System Monitor를 이용하였다.

  • JSON을 다운 받아서 직접 넣거나, ID를 복사하여 import한다.

  • DataSource로 프로메테우스를 등록하여 추가하면 대쉬보드가 생성된다.


마치며...

프로메테우스는 현대적인 애플리케이션 모니터링을 위한 강력한 도구다. 간단하면서도 강력한 쿼리 언어, 자체 저장소를 이용한 뛰어난 독립성, 다양한 애플리케이션과의 쉬운 통합, 그리고 빠르고 유연한 경고 시스템은 모니터링을 새로운 차원으로 끌어올렸다.

프로젝트에서 프로메테우스를 통해 얻은 데이터와 인사이트는 성능 최적화의 방향을 제시하고, 사용자 경험을 개선하는 데 매우 중요한 역할을 했다. 또한, 프로젝트의 신속한 확장과 유연한 운영을 가능하게 하는 기반을 마련했다.

모니터링은 우리가 생각하는 것 이상으로 개발 프로세스와 운영에 근본적인 영향을 미치며, 프로메테우스는 이러한 모니터링의 필수적인 부분을 책임진다. 어떤 규모의 시스템에서든지 프로메테우스를 통해 품질과 안정성을 지키는 것은 이제 선택이 아닌 필수가 되었다고 생각한다.

그라파나 역시 그러하다.
우리 프로젝트에 그라파나를 통합함으로써, 팀의 효율성을 극대화하고, 서비스의 품질을 지속적으로 향상시키는 데 크게 기여했다. 데이터가 말해주는 이야기를 보는 것이 이제 그 어느 때보다 중요하고, 그라파나는 그러한 이야기를 효과적으로 들려주는 데 필수적인 도구다. 이는 기술적인 분석을 넘어서, 직관적인 통찰력을 제공하며, 미래 예측과 전략적인 의사결정을 가능하게 한다.

그라파나의 적용은 단순히 성능 측정에 그치지 않고, 서비스 개선의 방향을 설정하고 사용자 만족도를 높이는 데 기여했다. 결국, 그라파나는 단순한 모니터링 툴이 아니라, 프로젝트의 성공을 위한 파트너가 되었다고 생각한다.

마지막으로 아직 프로메테우스에서의 알림 설정에 대해선 이 글에서 언급하지 않았다.
추후에 기회가 된다면 추가로 언급하도록 하겠다.

profile
Hodie mihi, Cras tibi

0개의 댓글