회사에서 팀이동을 하면서 현재 팀에서는 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로 실행된 모든 결과는 알림이고, 이 알림 중에서 특정 알림에 대해 규칙을 만들어서 이메일, 텔레그램 등 전송되게 할 수 있다.
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 선택
Elasticsearch DashBoard
'n년차 개발자' 카테고리의 다른 글
docker mysql 쿼리 결과 파일로 받기 (0) | 2022.10.14 |
---|---|
Java -Xms -Xmx 옵션 (OutOfMemoryError: Java heap space...) (0) | 2022.09.19 |
트랜잭션 격리 수준 (Isolation level) (0) | 2022.08.20 |
AWS EC2 인스턴스에 ES 설치 후 ELB, ROUTE53 적용 하기 (0) | 2022.07.15 |
AWS Lambda, S3, EventBridge, Cloude Watch를 사용하여 EC2 AUTO STOP 적용하기 (JAVA) (0) | 2022.07.14 |