Prometheus, Grafana를 이용한 서버 모니터링

연구실 서버가 많다보니 서버들 헬스체크할 필요성을 느꼈다.
마침 Prometheus라는 좋은 metric 수집툴이 있어서 이를 시각화도구인 Grafana와 연동해 서비스해보기로 하였다.
이 글을 막힘없이 따라하면 기존 인프라에 모니터링 시스템을 운용하는데 30분도 채 걸리지 않을 것이다.

이 글에서 다룰 내용은 다음과 같다.

  • Prometheus란
  • Prometheus 설치운용
  • Node Exporter 설치운용
  • Grafana 연동
  • Service 배포

Prometheus란

Prometheus는 모니터링과 알람 기능을 제공하는 standalone 오픈 소스 시스템이다.
위의 그림에서 보이듯 몇 가지 중요한 특징이 있다.

  • 데이터 수집 모듈과 모니터링용 HTTP 서버 존재
  • Metric 저장을 위해 시계열 DB(Level DB) 운영 [링크]
  • push/pull 방식의 데이터 수집을 모두 지원
  • Alertmanager 모듈을 통해 알람을 push방식으로 전파
  • PromQL(Prometheus Query Language)을 통해 시각화와 데이터 내보내기를 수행

대충 이 정도만 이해하면 된다.
더 자세한건 공식 홈페이지를 참고하자.

참고로 Prometheus에는 아래의 standalone 솔루션을 제공한다.

  • prometheus – Prometheus 서버
  • alertmanager – 알람 솔루션
  • blackbox_exporter – 외부의 HTTP(S), DNS, TCP, ICMP 모니터링 솔루션
  • consul_exporter – Consul 데이터 수집 솔루션
  • graphite_exporter – Graphite 데이터 수집 솔루션
  • haproxy_exporter – HAProxy 데이터 수집 솔루션
  • memcached_exporter – Memcached 데이터 수집 솔루션
  • mysqld_exporter – MySQL 데이터 수집 솔루션
  • node_exporter – 서버 데이터 수집 솔루션
  • pushgateway – Push 방식의 데이터 수집 솔루션
  • statsd_exporter – StatsD 데이터 수집 솔루션

Prometheus 설치운용

Prometheus 사용법은 어렵지 않다.
공식 홈페이지의 Getting Started만 따라해도 서비스가 가능하다.
설치파일은 공식 홈페이지에서 받으면 된다.
tar.gz 파일을 wget 등으로 내려받아 사용하면 된다.

다운로드받은 파일의 압축을 풀면 prometheus binary와 설정파일 등이 존재한다.
prometheus.yml 설정파일에는 prometheus를 위한 설정들과 metric pulling을 위한 exporter 정보가 기록된다.
다음 예시는 a.aaa.comb.aaa.com 서버에서 동작하고있는 node_exporter로부터 서버 metric을 수집하기 위한 prometheus.yml 설정이다.
그 밖의 자세한 설정 정보는 공식 홈페이지를 참고하면 된다.

 scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
    - targets: ['localhost:9090']
      labels:
        group: 'prometheus'
        instance: 'prometheus_server'

  - job_name: 'server'
    scrape_interval: 5s
    static_configs:
    - targets: ['a.aaa.kr:9100']
      labels:
        group: 'server'
        instance: 'a'
    - targets: ['b.aaa.kr:9100']
      labels:
        group: 'server'
        instance: 'b'

참고로 위의 설정에서 instance는 targets를 대신하여 사용할 instance 이름이다.
instance를 지정하지 않으면 targets에 기재된 난잡한 URL이 대신 표시된다.

이제 prometheus를 다음과 같이 실행하면 prometheus 설정파일을 읽어 프로그램을 실행할 수 있다.
프로그램이 실행되면 http://localhost:9090을 통해 prometheus 창을 볼 수 있다.
다만 이 글에서는 grafana와 연동하고자 하기에 prometheus 웹페이지에 대해서는 설명하지 않는다.

$ ./prometheus --config.file=prometheus.yml

이제 설정파일에 기재된 exporter들로부터 metric을 pull할 준비가 되었다.
Prometheus에서 제공하는 프로그램들은 Standalone binary이기 때문에 &를 통해 백그라운드에서 실행하거나 service화하여 운용하는 것이 편하다. (글 마지막 참고)

Node Exporter 설치운용

Prometheus에서 제공되는 Node Exporter는 서버 metric을 수집하는 솔루션이다.
이 또한 설치운용이 단순하다.
공식 홈페이지에서 파일을 내려받아 압축을 풀고 다음과 같이 binary를 실행하면 된다.

$ ./node_exporter

Node Exporter 또한 다양한 인자를 넣어줄 수 있다.
이에 대해서는 Github를 참고하자.

Grafana 연동

Grafana가 무엇이며 어떻게 설치하는지는 이 글의 범위를 벗어나기에 따로 언급하지 않는다.
Grafana의 설치만큼 Grafana에 Prometheus를 연동하는 것 또한 매우 간단하다.
아래 그림처럼 Data Source에 Prometheus URL을 적어주기만 하면 연결된다.

그 후 나머지는 Grafana를 취향에 맞게 튜닝하면 된다.
필자의 경우 up metric과 grafana labs의 예제를 사용하였다.
up metric은 해당 서버의 health check를 위한 metric이다. [docs]
화면을 어떻게 구성했는지는 지엽적인 내용이기에 따로 언급하지는 않는다.

Service 배포

Prometheus Server

Prometheus Server를 편하게 운용하기 위해 다음처럼 /opt/prometheus 디렉터리를 구성하였다.

$ mkdir /opt/prometheus
$ ln -s /root/prometheus-2.33.0.linux-amd64/prometheus /opt/prometheus/prometheus
$ ln -s /root/prometheus-2.33.0.linux-amd64/prometheus.yml /opt/prometheus/prometheus.yml

그리고 다음처럼 prometheus.service 파일을 작성하였다.
만약 prometheus 포트를 변경하고싶다면 yml과 service에 모두 명시해주어야 한다.
yml은 포트가 명시되어있으니 바로 수정하면 되고, service는 web.listen-address 인자를 추가하면 된다.

[Unit]
Description=Prometheus Server
After=multi-user.target

[Service]
Type=simple
ExecStart=/opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml --web.listen-address=:9090
Restart=always
RestartSec=5
User=root

PIDFile=/opt/prometheus/prometheus.pid
WorkingDirectory=/opt/prometheus
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

다음은 service 파일을 배포하고 운용하는 방법이다. (systemctl을 기준으로 작성됨)

$ sudo ln -s /opt/prometheus/prometheus.service /etc/systemd/system/prometheus.service  # 배포
$ sudo systemctl enable prometheus  # Prometheus 부팅 시 자동실행
$ sudo systemctl start prometheus  # Prometheus 실행
$ sudo systemctl stop prometheus  # Prometheus 종료

prometheus.yml에 설정을 잘못 기재하면 프로그램이 실행되지 않는다.
service 구동 전에 prometheus를 별도로 실행하여 설정파일이 올바르게 읽히는지 확인하는 것이 좋다.

Node Exporter

딱히 다를 것이 없다.
위처럼 준비하되 service 파일 내용만 수정해주면 된다.

$ mkdir /opt/prometheus
$ ln -s /root/node_exporter-1.3.1.linux-amd64/node_exporter /opt/prometheus/node_exporter

필자는 prometheus_node_exporter.service로 명명하였다.

[Unit]
Description=Prometheus Node Exporter
After=multi-user.target

[Service]
Type=simple
ExecStart=/opt/prometheus/node_exporter
Restart=always
RestartSec=5
User=root

PIDFile=/opt/prometheus/node_exporter.pid
WorkingDirectory=/opt/prometheus
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

댓글 남기기