본문으로 바로가기

Prometheus, Grafana 사용해보기

category n년차 개발자 2022. 8. 23. 19:38
반응형

회사에서 팀이동을 하면서 현재 팀에서는 Prometheus, Grafana를 사용중에 있어 로컬에 설치해보고 알아보려고 합니다.

Prometheus 프로메테우스

- 프로메테우스는 메트릭 기반의 오픈소스 모니터링 시스템
- 대상 시스템으로부터 각종 모니터링 지표를 수집하여 저장하고 검색할 수 있는 시스템.

특징 

  • pull 방식의 메트릭 수집
  • 많은 시스템을 모니터링할 수 있는 다양한 플러그인을 가지고 있다.
  • 모니터링 대상 시스템로부터 pulling 방식으로 메트릭을 읽어서 수집한다.

 

 

 

Grafana 그라파나

- 그라파나는 프로메테우스를 비롯한 여러 데이터들을 시각화해주는 모니터링 툴.

 

Kibana와의 차이

  • 키바나는 주로 로그 메시지 분석에 사용된다.
  • 그라파나는 시스템 관점(cpu, 메모리, 디스크)의 메트릭 지표를 시각화하는데 특화되어 있다.
  • 키바나는 elasticsearch에 묶여 있지만, 그라파나는 다양한 데이터베이스를 선택할 수 있다.
  • 그라파나는 알람 기능을 무료로 사용할 수 있다. 

아키텍처

 

Prometheus Server

Jobs / Exporter의 앤드포인트로 HTTP GET 요청을 날려 metric 정보를 수집(Pull)한다.

 

Service Discovery

데이터 수집 대상을 발견. 프로메테우스는 기본적으로 모니터링 대상 목록을 유지하고 있다.

 

Pushgateway

Pushgateway는 쉽게말해 Proxy Forwarding을 해서 접근할 수 없는 곳에 데이터가 존재하는 경우에 사용할 수 있는 대안이다. application 이 pushgateway 에 메트릭을 push한 후, prometheus server 가 pushgateway 에 접근해 metric 을 수집(Pull) 해서 가져오는 방식으로 동작한다.

 

Jobs / Exporter

실제 매트릭을 수집하는 프로세스

 

Alert manager

PromQL로 실행된 모든 결과는 알림이고, 이 알림 중에서 특정 알림에 대해 규칙을 만들어서 이메일, 텔레그램 등 전송되게 할 수 있다.

 

docker-elk-setting

 

Docker + Elasticsearch, Kibana 구성 (cluster)

docker-elk-setting GitHub - lgm3555/docker-elk-setting: docker-elk-setting docker-elk-setting. Contribute to lgm3555/docker-elk-setting development by creating an account on GitHub. github.com 구성..

1995-dev.tistory.com

 

Elasticsearch 확인

# http://localhost:9200/_cat/nodes

172.31.0.2 69 16 11 1.32 1.97 1.13 dilmrt - es1
172.31.0.3 61 16 11 1.32 1.97 1.13 dilmrt * es2

 

Prometheus Docker, Grafana Docker, Jobs / Exporter Docker 실행

version: '3.2'
services:
  prometheus:
    image: prom/prometheus:v2.27.1
    network_mode: "host"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

  grafana:
    image: grafana/grafana:7.5.7
    network_mode: "host"
    depends_on:
      - prometheus

  elasticsearch_exporter:
    image: justwatch/elasticsearch_exporter:1.1.0
    network_mode: "host"
    container_name: elasticsearch_exporter
    depends_on:
      - prometheus
    command: "--es.uri http://elastic:changeme@172.17.227.20:9200"
    restart: always
    ports:
      - 9114:9114

  #node-exporter:
  #  image: prom/node-exporter:latest
  #  network_mode: "host"
  #  ports:
  #    - 9100

 

prometheus.yml

# prometheus.yml
global:
  scrape_interval: 15s # 15초마다 metrics 수집
  evaluation_interval: 15s # 15초마다 규칙 평가
scrape_configs: # 수집 대상 지정 설정
  - job_name: 'prometheus' # Prometheus
    metrics_path: '/metrics'
    static_configs:
      - targets: ['172.17.227.20:9090']
  - job_name: 'elasticsearch-exporter' # elasticsearch-exporter
    metrics_path: '/metrics'
    scrape_interval: 10s
    static_configs:
      - targets: ['172.17.227.20:9114']
  #- job_name: 'node-exporter'
  #  metrics_path: '/metrics'
  #  scrape_interval: 10s
  #  static_configs:
  #    - targets: ['172.17.227.20:9100']

 

Grafana 실행 확인 (http://localhost:3000)

기본 ID, PW

admin, admin

 

Prometheus 실행 확인 (http://localhost:9090)

Targets 정상 확인

 

metric 

# HELP elasticsearch_breakers_estimated_size_bytes Estimated size in bytes of breaker
# TYPE elasticsearch_breakers_estimated_size_bytes gauge
elasticsearch_breakers_estimated_size_bytes{breaker="accounting",cluster="docker-cluster",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="172.31.0.2",name="es1"} 698004
elasticsearch_breakers_estimated_size_bytes{breaker="fielddata",cluster="docker-cluster",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="172.31.0.2",name="es1"} 1744
elasticsearch_breakers_estimated_size_bytes{breaker="in_flight_requests",cluster="docker-cluster",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="172.31.0.2",name="es1"} 0
elasticsearch_breakers_estimated_size_bytes{breaker="parent",cluster="docker-cluster",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="172.31.0.2",name="es1"} 1.76943664e+08
elasticsearch_breakers_estimated_size_bytes{breaker="request",cluster="docker-cluster",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="172.31.0.2",name="es1"} 0
# HELP elasticsearch_breakers_limit_size_bytes Limit size in bytes for breaker
# TYPE elasticsearch_breakers_limit_size_bytes gauge
elasticsearch_breakers_limit_size_bytes{breaker="accounting",cluster="docker-cluster",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="172.31.0.2",name="es1"} 2.68435456e+08
elasticsearch_breakers_limit_size_bytes{breaker="fielddata",cluster="docker-cluster",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="172.31.0.2",name="es1"} 1.07374182e+08
elasticsearch_breakers_limit_size_bytes{breaker="in_flight_requests",cluster="docker-cluster",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="172.31.0.2",name="es1"} 2.68435456e+08
elasticsearch_breakers_limit_size_bytes{breaker="parent",cluster="docker-cluster",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="172.31.0.2",name="es1"} 2.55013683e+08
elasticsearch_breakers_limit_size_bytes{breaker="request",cluster="docker-cluster",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="172.31.0.2",name="es1"} 1.61061273e+08

....

 

Elasticsearch-exporter 확인

docker logs -f elasticsearch_exporter

level=info ts=2022-08-24T00:15:05.0499532Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T00:20:05.0496723Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T00:25:05.0497301Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T00:30:05.049432Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T00:35:05.0499644Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T00:40:05.0497897Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T00:45:05.0498472Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T00:50:05.0497455Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T00:55:05.0492716Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T01:00:05.0492765Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T01:05:05.0500098Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T01:10:05.0494305Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T01:15:05.0497013Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T01:20:05.0494444Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T01:25:05.0492478Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T01:30:05.0493912Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"
level=info ts=2022-08-24T01:35:05.0492729Z caller=clusterinfo.go:169 msg="providing consumers with updated cluster info label"

 

 

Data Sources 등록

 

Prometheus Data Source 등록

 

Elasticsearch Data Source 등록

 

DashBoard 선택

 

Node Exporter Full

Edit Delete Confirm Cancel

grafana.com

 

 

Elasticsearch DashBoard

반응형