본문 바로가기
AWS(Amazon Web Service)/Prom+Grafana+cAdvisor

[AWS] Prometheus+Grafana 설치 (1)

by Haengsin 2021. 11. 16.
  • Prometheus Server는 Expoter가 열어놓은 HTTP 엔드포인트에 접속해서 Metric을 수집한다. (Pull)
  • Prometheus Server에 Grafana를 연동해서 대시보드 등의 시각화를 한다.
  • 알림을 받을 규칙을 만들어서 Alert Manager로 보내면 Alert Manager가 규칙에 따라 알림을 보낸다.

 

Prometheus란?

. SoundCloud 사에서 만든 오픈소스 시스템 모니터링 및 경고 툴킷이다. Kubernetes 에서도 Prometheus를 사용하여 매트릭 수집 및 대시보드 구축하는 방식을 장려하고 있다. 

 

(Prometheus Architecture)

 

Prometheus targets : Jobs/exporters 는 실제로 매트릭을 수집하는 프로세스이다.

exporter 가 매트릭을 수집하고 HTTP 통신을 통해 매트릭 데이터를 가져갈 수 있게 /metrics 라는 HTTP Endpoint를 제공한다. 

 

Prometheus server 가 이 exporter의 Endpoint로 HTTP GET 요청을 날려 매트릭 정보를 수집(Pull) 한다. 즉, 서버가 각 클라이언트에 대해서 알고 있어야 하는게 아니라 서버에 클라이언트가 떠 있으면 서버가 주기적으로 클라이언트에 접속해서 데이터를 가져오는 방식이다.

 

수집한 정보를 Prometheus가 제공하는 간단한 웹 뷰를 통해 조회할 수 있고 그 안에서 테이블 및 그래프 형태로 확인할 수 있다. 그러나, 시각화 도구가 부족하여 이를 직접 사용하기 보다는 보통 Grafana 라는 Data Visualization Tool을 이용하여 시각화한다. 

 

한계점으로는 Prometheus는 클러스터링 기능이 없다. 한 대의 Prometheus 서버로 수천대의 서버를 다 모니터링할 수 없다. 

 

 

Grafana란?

 

. 그라파나는 오픈소스 매트릭 데이터 시각화 도구로 메트릭 분석 플랫폼을 지향하고 있다. 2014년에 처음 릴리스되었으며, 매트릭 정보를 시각화하고 대시보드를 구성하기 유용하다.  Prometheus는 물론 AWS CloudWatch, Azure Monitor 와 같은 데이터 소스를 비롯해 InfluxDB, ElasticSearch 등을 기반으로 로그 데이터를 지원하는 등 더 많은 데이터 소스를 지원하고 있다. 

 

서버 리소스의 매트릭 정보나 로그 같은 데이터를 가져와 시각화하는데 사용하며, 시각화한 그래프에서 특정 리소스가 임계값 이상으로 사용되었을 때 알림을 전달 받을 수 있는 기능도 제공한다. 오픈소스 툴킷인 만큼 커뮤니티가 많이 활성화되어 직접 대시보드를 작성할 수도 있지만, 사용자들이 만들어놓은 대시보드를 Import 하여 손쉽게 구성 가능하다.

 

현재 그라파나 랩(Grafana Labs)에서 개발하고 있으며, 이 회사에서 Grafana Enterprise와 Grafana Cloud 와 같은 상용 서비스도 개발하고 있다.

 

현재 그라파나는 페이팔(Paypal), 이베이(ebay), 인텔(Intel), Dell Technologies, SIEMENS, Unity, Nutanix 등 다양한 세계적인 기업들에서 활용되고 있다.

 

Prometheus+Grafana 

.설치 전에 사용되는 어떻게 구성할 것인지와 각 프로세스에서 사용되는 Port가 무엇인 지 혼동하지 않도록 정리해두고 진행한다.

예시
예시

  • 9090 port는 prometheus 자체 서비스 포트이다. 이 포트를 사용하여 수집한 각종 매트릭 데이터를 전달 및 노출하고, 이런 과정의 프로세스가 잘 진행되고 있는지 스스로 모니터링하는 포트이기도 하다. 만약 이 포트의 /metrics 경로를 호출하면 prometheus 서버에 수집된 매트릭을 조회할 수 있다.
  • AWS 에서 사용할 경우, prometheus와 grafana 서비스 포트의 인바운드 규칙을 갖고 있는 보안 그룹을 생성하여 EC2에 보안 그룹을 추가해주어야 한다.

 

 

1. Docker 설치

sudo yum install -y docker

 

2. Prometheus 설치

prometheus는 prometheus.yml 이라는 파일을 사용하여 기본적인 설정을 한다.

(prmetheus.yml 기본 설정)

# 기본적인 전역 설정 
global:
  scrape_interval:     15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
  evaluation_interval: 15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
  # 'scrpae_timeout' 이라는 설정은 기본적으로 10초로 세팅되어 있다.# Alertmanager 설정
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093# 규칙을 처음 한번 로딩하고 'evaluation_interval'설정에 따라 정기적으로 규칙을 평가한다.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"# 매트릭을 수집할 엔드포인트를 설정. 여기서는 Prometheus 서버 자신을 가리키는 설정을 했다.
scrape_configs:
  # 이 설정에서 수집한 타임시리즈에 'job=<job_name>'으로 잡의 이름을 설정한다.
  - job_name: 'prometheus'    
    # 'metrics_path'라는 설정의 기본 값은 '/metrics'이고
    # 'scheme'라는 설정의 기본 값은 'http'이다.    static_configs:
    - targets: ['localhost:9090']

global: 부터 alerting: , rule_files: , scrape_configs: 등 많은 코드로 구성되어 있다.

Prometheus 서버는 이 yml 파일을 통해 기본적인 설정을 하고 어떤 exporter로부터 매트릭 정보를 수집할 것인지 

즉, job_name을 확인한다.

 

  • global: 부분은 매트릭 수집을 위한 전역 설정값. 
  • alerting: 
  • rule_files: 부분에서 Alert 규칙 등 필요한 규칙을 작성해서 사용할 수 있다.
  • scrape_configs: 부분에서 실제 exporter를 지정한다. 여러 대상을 targets로 설정할 수 있다.

- job_name: 에 잡의 이름을 지정하고, 이 잡이 데이터를 수집할 exporter 경로를 static_configs:- targets: 와              metrics_path: , scheme: 에 설정한다.

- targets: 에 지정하는 것은 Prometheus 서버가 접근해서 데이터를 가져올 Exporter의 HTTP EndPoint 이다. 따라서 localhost:9090으로 지정하면 기본값인 metrics_path를 이용해서 localhost:9090/metrics에 접근해서 데이터를 가져온다. 이는 Prometheus 서버가 매트릭을 수집하는 서버인 동시에 매트릭을 노출하는 Exporter이기도 하다는 의미이다.

 

 

※ Prometheus.yml 상세 설정 : https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read

 

Configuration | Prometheus

An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.

prometheus.io

 

 

(1) prometheus.yml 파일 생성

mkdir /Prometheus
vi /Prometheus/prometheus.yml

 

 

# 기본적인 전역 설정 
global:
  scrape_interval:     15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
  evaluation_interval: 15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
  # 'scrpae_timeout' 이라는 설정은 기본적으로 10초로 세팅되어 있다.
# Alertmanager 설정
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093
# 규칙을 처음 한번 로딩하고 'evaluation_interval'설정에 따라 정기적으로 규칙을 평가한다.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"
# 매트릭을 수집할 엔드포인트를 설정. 여기서는 Prometheus 서버 자신을 가리키는 설정을 했다.
scrape_configs:
  # 이 설정에서 수집한 타임시리즈에 'job=<job_name>'으로 잡의 이름을 설정한다.
  - job_name: 'prometheus'
    # 'metrics_path'라는 설정의 기본 값은 '/metrics'이고
    # 'scheme'라는 설정의 기본 값은 'http'이다.
    static_configs:
    - targets: ['localhost:9090']

 (2) prometheus 설치

#!/bin/bash  
sudo docker run -d \
        -p 9090:9090 \
        -v /Prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
        prom/prometheus

Docker Host의 /Prometheus/prometheus.yml 설정 파일과 컨테이너 내부의 /etc/prometheus/prometheus.yml 에 마운트한다. 즉, Host의 해당 경로의 파일을 수정하면 실제 컨테이너 내부의 /etc/prometheus/prometheus.yml 에 수정한 설정 값이 반영되어 prometheus 컨테이너가 실행된다는 뜻이다.

※ prometheus 컨테이너가 종료되더라도 수집하던 매트릭 데이터는 보존하려면 볼륨을 생성하여 prometheus 컨테이너의 /prometheus 디렉터리에 마운트한다.

 

브라우저를 열어 http://(공인 IP):9090 으로 접속 확인하면 정상적으로 데이터를 가져오는 것을 확인할 수 있다.

localhost:9090

  • [Status] > [Targets] : 어떤 Exporter를 수집하고 있는 지 대상(Targets)을 확인할 수 있다.

위처럼 Targets에서 prometheus.yml에서 지정했던 Job이 잘 수집되고 있음을 확인할 수 있다. Job의 이름은 prometheus 였고, 수집 대상(targets)의 Endpoint는 http://localhost:9090/metrics 였다.

 

이 외에 추가적인 exporter를 prometheus.yml의 scrape_configs: d에서 세팅하여 다른 매트릭 데이터도 수집하도록 하려면 대상에 exporter를 설치해주어야 한다.

 

(다양한 종류의 exporter)

  • node_exporter
  • kube_state_metrics
  • mysql-exporter
  • cAdvisor(docker-container)
  • wmi-exporter
  • mongodb-exporter
  • redis-exporter
  • elasticsearch-exporter
  • ...

 

3. 대상(target)에 Exporter 설치 

매트릭을 제공하는 다양한 exporter가 존재하지만, 대상(target)에 node-exporter 설치를 진행한다.

 

(1) 대상 인스턴스에 Port 9100 에 대한 Rule이 있는 보안 그룹을 추가한다.

(2) node-exporter 설치

$ docker pull prom/node-exporter


$ docker run -d -p 9100:9100 prom/node-exporter

브라우저를 열어 http://(공인 IP):9100 으로 접속 확인하면 정상적으로 데이터를 가져오는 것을 확인할 수 있다.

4. Prometheus server에 target 추가하기.

prometheus server에 target을 추가하기 위하여 prometheus.yml 파일에 설정을 추가한다.

exporter를 설치한 target의 정보를 prometheus.yml 에 입력하고 scrape_interval 은 10초로 설정

 

 

브라우저를 열어 http://(공인 IP):9100 으로 접속 확인하면 추가된 target에서 정상적으로 데이터를 가져오는 것을 확인할 수 있다.

※ 표현식 언어

Prometheus에서는 수집한 매트릭 데이터를 조회할 수 있는 함수형 표현식 언어를 제공하고 있다. 이 표현식 언어로 매트릭 데이터를 실시간으로 조회할 수 있고 위에서 Select Box로 특정 매트릭을 선택해서 데이터나 그래프를 본 것도 이 표현식 언어를 이용한 것이다.

  • 앞에서 조회한 process_cpu_seconds_total, node_cpu, http_requests_total 등을 인스턴스 벡터라고 부른다.
  • 인스턴스 벡터 뒤에 { } 로 레이블을 지정하면 필터링을 사용할 수 있는데 http_requests_total{job="prometheus", group="canary"} 와 같이 사용한다. 이렇게 하면 http_requests_total에서 job 이름은 prometheus이고 group은 canary인 정보만 조회한다.
  • 레이블에서는 =, !=, =~, !~ 같은 논리연산자를 사용할 수 있고 여기서 ~는 정규표현식 비교를 의미한다. 그래서 http_requests_total{environment=~"staging|testing|development",method!="GET"} 와 같이 사용 가능하다.
  • 인스턴스 벡터 뒤에 레인지 벡터라고 부르는 [ ] 을 사용할 수 있다. http_requests_total{job="prometheus"}[5m] 라고 하면 최근 5분의 값을 조회하는 것을 의미힌다.
  • node_cpu offset 10m 처럼 특정 시간의 값을 조회하는 오프셋 모디파이어를 사용할 수 있다.

 

 

Reference

 

[AWS] Prometheus+Grafana 설치 (2)

https://haengsin.tistory.com/34

 

[AWS] Prometheus+Grafana 설치 (2)

앞 장에서 AWS EC2 인스턴스 2개에 대하여 각각 Prometheus, node-exporter 설치 https://haengsin.tistory.com/category/AWS%28Amazon%20Web%20Service%29/Prometheus%2BGrafana 'AWS(Amazon Web Service)/Promet..

haengsin.tistory.com