Prometheus는 SoundCloud 사에서 만든 오픈소스 시스템 모니터링 및 경고 툴이다.
많은 회사에서 사용 중이며 활발한 커뮤니티가 있다. 현재는 독립 오픈 소스 프로젝트이며 어떤 회사와도 독립적이다.
Prometheus는 측정 항목을 time series data로 수집하고 저장한다. 즉, 측정 항목 정보는 레이블이라는 선택적 키-값 쌍과 함께 기록된 타임스탬프와 함께 저장된다.
Prometheus는 시간에 따라 기록하는데 적합하다. 기계 중심 모니터링과 고도로 동적인 서비스 지향 아키텍쳐 모니터링에 모두 적합하다. 마이크로 서비스에서 다차원 데이터 수집 및 쿼리 지원은 특별한 강점이다.
또한 Prometheus는 중단 중에 신속하게 문제를 진단할 수 있도록 하는 시스템으로 안정성을 위해 설계되었다. 각 Prometheus는 독립형이며 네트워크 스토리지 또는 기타 원격 서비스에 의존하지 않느다. 인프라의 다른 부분이 손상되었을 때 이를 사용할 수 있으며 이를 사용하기 위해 광범위한 인프라를 설정할 필요가 없다.
일반적인 말로는 numeric measurement이다. time series의 의미는 시간 경과에 따라 기록됨을 의미한다. 사용자가 측정하고자 하는 것은 애플리케이션마다 다를 수 있다. 웹 서버의 경우 요청 시간일 수 있고 데이터베이스의 경우 활성 연결 수 또는 활성 쿼리 수 등일 수 있다.
Prometheus는 단기 작업을 위해 직접 또는 중간 푸시 게이트웨이를 통해 구성된 작업에서 측정항목을 스크랩한다. 스크랩한 모든 샘플을 로컬에 저장하고 이 데이터에 대한 규칙을 실행하여 기존 데이터에서 새 time series를 집계 및 기록하거나 경고를 생성한다. Grafana 또는 기타 API 소비자를 사용하여 수집된 데이터를 시각화할 수 있다.
Jobs/exporters
:/actuator/metrics
라는 HTTP endpoint를 제공한다.Prometheus server
:Grafana
라는 Data Visualization Tool을 이용하여 시각화하고 있다.현재 프로젝트는 ec2에 docker로 띄워져있는 상태이며, 도메인 주소로 들어갈 수 있다.
그리고 Prometheus는 같은 ec2에 다른 docker로 띄울 것이다.
기존의 프로젝트에 build.gradle
에 의존성을 추가한다.
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-core'
implementation 'io.micrometer:micrometer-registry-prometheus'
...
}
application.yml
에 다음과 같이 설정한다.
spring:
application:
name: monitoring
management:
endpoint:
metrics:
enabled: true # endpoint를 활성화한다.
prometheus:
enabled: true
endpoints: # Actuator가 제공하는 endpoint를 열어준다.
web:
exposure:
include: health, info, metrics, prometheus
metrics:
tags:
application: ${spring.application.name}
설정 적용을하고 http://{project 주소}/actuator
로 요청하면 아래와 같은 JSON을 볼 수 있다.
이를 통해 yaml에서 열어준 endpoint들이 활성화된 것을 알 수 있다.
/actuator
: actuator가 제공하는 url을 볼 수 있다./actuator/metrics
: 메트릭 목록을 보여준다./actuator/prometheus
: micrometer를 통해 수집된 metric들을 볼 수 있다.{
"_links": {
"self": {
"href": "http://daengnyang.store/actuator",
"templated": false
},
"prometheus": {
"href": "http://daengnyang.store/actuator/prometheus",
"templated": false
},
"health-path": {
"href": "http://daengnyang.store/actuator/health/{*path}",
"templated": true
},
"health": {
"href": "http://daengnyang.store/actuator/health",
"templated": false
},
"info": {
"href": "http://daengnyang.store/actuator/info",
"templated": false
},
"metrics-requiredMetricName": {
"href": "http://daengnyang.store/actuator/metrics/{requiredMetricName}",
"templated": true
},
"metrics": {
"href": "http://daengnyang.store/actuator/metrics",
"templated": false
}
}
}
프로메테우스를 설치하는데 다양한 방법이 있으며, 우리는 간단히 docker를 이용하여 실행시켰다.
📌 주의 사항 : 프로메테우스 이미지는 볼륨을 사용하여 실제 메트릭을 저장한다. 프로덕션 배포의 경우 볼륨 마운트를 사용하여 데이터를 쉽게 관리하는 것이 좋다.
prometheus.yml 파일을 작성한다.
프로메테우스 서버는 이 yml 파일을 통해 기본적인 설정을 하고 어떤 exporter로부터 메트릭 정보를 수집할 것인지 확인한다.
scrape_configs
: exporter를 지정한다.
job_name
으로 이름은 지정하고, exporter의 경로를 targets
, metrics_path
, scheme
으로 설정한다.
default yml 파일에서 job만 추가하였다.
# 기본적인 전역 설정
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: "prometheusaaaaaa"
# 'metrics_path'라는 설정의 기본 값은 '/metrics'이고
# 'scheme'라는 설정의 기본 값은 'http'이다.
static_configs:
- targets: ["localhost:9090"]
- job_name: 'daengnyang' # 잡 이름
metrics_path: '/actuator/prometheus' # 메트릭을 수집할 path 설정
static_configs:
- targets: ['{project_IP_주소}:{port_번호}']
프로메테우스를 도커로 배포한다.
위에서 작성한 prometheus.yml 파일과 컨테이너 내부의 prometheus.yml 파일을 bind-mount를 이용하여 동기화시켰다. 본인이 작성한 경로에 유의해서 작성한다.
docker run \
-d \
-p 9090:9090 \
-v /home/ubuntu/prometheus.yml:/etc/prometheus/prometheus.yml \
--name prometheus \
prom/prometheus
📌 Prometheus 컨테이너가 종료되면 수집하던 metric 데이터는 날라간다. 따라서 이를 보존하기 위해 volume-mount를 이용하여 ec2에 저장하는 것을 추천한다.
브라우저를 통해 Prometheus 대시보드로 접속해본다.
http://<Prometheus를 띄운 서버의 public ip>:9090
Status 탭 - Target 으로 들어가면 아래와 같은 화면이 보인다.
기본적으로 들어있는 쿼리를 Execute 해보기
Graph 탭 - 검색창에 원하는 항목 검색 - Execute
참고 :
https://prometheus.io/
https://devbksheen.tistory.com/180
https://covenant.tistory.com/244