- 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 등 다양한 세계적인 기업들에서 활용되고 있다.
- Success stories and case studies : https://grafana.com/success/
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
(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 으로 접속 확인하면 정상적으로 데이터를 가져오는 것을 확인할 수 있다.
- [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
- https://blog.outsider.ne.kr/1254
- https://gurumee92.tistory.com/224
- https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read
- https://m.blog.naver.com/sehyunfa/221798053263
[AWS] Prometheus+Grafana 설치 (2)
https://haengsin.tistory.com/34
'AWS(Amazon Web Service) > Prom+Grafana+cAdvisor' 카테고리의 다른 글
Prometheus Architecture (0) | 2022.10.30 |
---|---|
[Prometheus/Shell script] node exporter 와 mysqld exporter 설치 (0) | 2022.06.23 |
[AWS] Prometheus+Grafana+cAdvisor 설치 (0) | 2021.11.19 |
[AWS] Prometheus+Grafana 설치 (2) (0) | 2021.11.17 |