프로메테우스와 그라파나를 통한 모니터링 대시보드를 만들며 궁금했던 내용들과 키워드들을 정리해봤습니다.
프로메테우스는 시스템 모니터링과 알람을 위한 툴킷입니다. 사운드클라우드에서 개발하였고, 오픈소스 프로젝트로 CNCF의 2번째 프로젝트가 되었습니다.
모니터링 도구들 중 가장 빈번하게 사용하며 추후 설명할 그라파나와 연계되어 많이 활용합니다.
가장 궁금했던 내용으로 데이터를 누가 내보내는지가 궁금했습니다. 로깅과 비슷하게 생각해보면 로깅은 코드를 통하여 내보냈으나 모니터링은 그러한 코드를 못보았거나 코드와 무관한 서비스들(DB, 인스턴스)에도 활용되는 것들을 보았기 때문입니다.
결론적으로 프로메테우스에서는 exporter
라는 라이브러리를 통해 지표를 내보냅니다. 다양한 서비스(mysql과 같은 DB, JIRA와 같은 이슈 관리 툴, Apache와 같은 웹 서버, 그외 GC 등)에 알맞는 지표들을 내보낼 수 있는 라이브러리(exporter
)를 만들어 제공하면 사용자가 해당 서비스와 함께 이러한 라이브러리를 다운로드받아 활용합니다.
참고: Exporters and integrations | Prometheus
또한, Golang이나 Java 등에서는 코드를 통해 지표를 내보낼 수 있는 라이브러리를 제공하기도 합니다.
참고
모니터링을 위해 내보내는 지표들을 metric
이라고 합니다.
exporter를 설치한 port의 /metrics
라는 HTTP 경로에서 아래 이미지와 같은 데이터들을 내보냅니다.
이미지에 있는 데이터인 prometheus_target_interval_length_seconds{interval="10s",quantile="0.01"} 9.993262796
을 살펴보면 metric_name{label1="value1"} metric_value
와 같은 구조로 메트릭을 내보내고 있습니다.
이름과 값은 당연하게도 직접적으로 활용되며 라벨은 추후 조회시 필터링할 때에 활용됩니다.
이러한 메트릭은 여러 종류가 있습니다. 카운터, 게이지, 히스토그램, 서머리로 총 4가지 존재합니다. 제가 사용해본 것은 카운터와 게이지입니다.
카운터는 증가하거나 초기화되기만 할 수 있는 값으로 선형적으로 증가하는 네트워크 실패 횟수 등에서 활용할 수 있습니다.
게이지는 증가 및 하락할 수 있는 값으로 지속적으로 변화하는 메모리 사용량, CPU 사용량 등을 표현할 수 있습니다.
이렇게 만들어진 metric들이 HTTP를 통해 노출되며, 프로메테우스는 이들을 pull하여 TSDB에 저장합니다. 이후는 일반 DB를 활용하는 것과 같이 PromQL이라는 쿼리를 통해 저장된 데이터를 조회할 수 있습니다.
pull 방식에 대해 설명을 더하자면, 프로메테우스는 scrape
이라는 수집 과정을 가지고 있습니다. 프로메테우스에서 설정 파일(prometheus.yml
)을 통해 수집할 대상(target
)을 선정하면 수집주기(scrape_interval
)에 따라 대상의 /metrics
에 대해 요청합니다. 이 때 대상의 exporter에서 실시간으로 metric 정보를 조합하여 응답해줍니다.
그라파나는 데이터 저장 없이 쿼리, 알림, 시각화를 도와주는 오픈소스 플랫폼입니다.
프로메테우스와 같은 도구들을 데이터소스로써 등록할 수 있고, 이러한 데이터 소스의 데이터들을 쿼리로 제공한다면, 그라파나는 제공되는 데이터를 효과적으로 시각화하는 것을 도와줍니다.
PromQL은 프로메테우스를 조회할 때 사용하는 쿼리 언어입니다. 프로메테우스에서도 사용할 순 있지만, 보통 그라파나 시각화를 할 때 사용합니다. 주요 내용들에 대해 작성해봤습니다.
prometheus_http_requests_total{code="200",handler="/api/v1/query_range"} 70
prometheus_http_requests_total{code="200",handler="/api/v1/read"} 0
prometheus_http_requests_total{code="200",handler="/api/v1/rules"} 0
와 같은 메트릭이 있다고 가정하면,
prometheus_http_requests_total
을 이용하면 전체 목록을 조회할 수 있습니다.{}
내부에 있는 라벨을 활용하여 prometheus_http_requests_total{handler="/api/v1/read"}
와 같이 특정 라벨만 조회할 수 있으며prometheus_http_requests_total{handler=~"/api/v1/.*"}
와 같이 특정 라벨만 조회할 수 있으며prometheus_http_requests_total{handler=~"/api/v1/.*"}
와 같이 regax를 적용할 수도 있습니다.avg by (handler) (prometheus_http_requests_total)
와 같은 방식으로 핸들러들의 평균을 구할 수도 있고, avg
대신 sum
을 활용해 그 합을 구할수도 있습니다.
deriv()
: 기울기를 구합니다.delta()
: 변화량을 구합니다.이러한 쿼리 방법을 활용해 패널을 구성하고 패널들을 모아 대시보드를 구성할 수 있습니다. 대시보드를 구성하며 주요했던 것은 variable
기능이었습니다. 이는 아래와 같은 모습으로 검색 서비스의 필터링과 유사합니다.
앞서 살펴봤던 http_request 예제에서는 handler을 원하는 variable을 설정하고 이에 따라 원하는 handler들만 조회할 수도 있습니다.
이러한 정보들을 활용하여 대시보드를 구성하면 알람을 추가하면 유용합니다. 기존에는 프로메테우스의 AlertManager
을 주로 활용하였으나, 그라파나의 버전 업데이트를 거쳐 개선되고 있는 Grafana Alerting
도 좋은 대안으로 떠오르고 있습니다. 후자는 다양한 데이터소스에 등록할 수 있다는 점, 대시보드와 비교해보기 좋다는 장점이 있습니다.
Alert Rule: 다양한 조건을 활용해 rule을 정할 수 있습니다. 프로메테우스의 경우 PromQL을 활용할 수 있습니다.
Notification policies: 계층적인 알람 정책으로 인해 원하는 라벨에 해당하는 알람만 받도록 설정할 수도 있습니다.