[Observability] 클라우드 네이티브에서의 모니터링, Prometheus
서버나 서비스 등의 운영에 있어서 모니터링은 필수 요소이다.
개발 Language 못지않게 모니터링 툴/시스템들도 굉장히 다양한 종류가 존재하고 새롭게 생겨나고 있다.
나는 기존에는 Cloudwatch Agent나 Logstash + Datadog 등을 이용해서 서버나 서비스에서 발생하는 데이터들을 모니터링하도록 구성했었다.
다만, Datadog의 요금정책 등의 이슈들로 인해 다른 모니터링 도구 탐색을 하게 되었다.
그렇게 최근들어 알게된 Prometheus를 적용하고 깊게 공부해보고자 해서, 이 시리즈를 작성하기로 했다.
이번에는 Prometheus의 기본 개념과 특징을 알아보도록한다.
Prometheus
Metric 수집 모니터링 오픈소스 프로젝트, SoundCloud사에서 개발했으며 CNCF 소속 프로젝트
Kubernetes 클러스터와 컨테이너를 비롯한 대상의 모니터링을 쉽게 할 수 있다.
저장된 Metric은 자체 Query Language인 promQL으로 시각화 가능하다.
Prometheus의 특/장점
Pull 방식의 데이터 수집
다른 모니터링 데이터 수집용 Agent들은 보통 대상 서버에 설치되어 Agent가 데이터를 모아서 직접 중앙 서버로 쏴주는 Push 형식으로 구성된다.
하지만, Prometheus는 이들과는 다르게 중앙서버가 직접 대상서버에서 데이터를 가져가는 Pull 방식을 기본적으로 채용했다. (Push 방식으로도 변경이 가능)
grafana와 연동으로 시각화
기본 Prometheus Web UI는 데이터 시각화 방면에서 조금 아쉬운 부분이 존재한다. 수집한 Metric을 시각화해주는 대시보드 오픈소스인 Grafana를 연동시켜 더욱 가시성을 높일 수 있다.
다양한 유형의 Exporter
Exporter는 Prometheus가 metric을 가져가게(pull)하기 위한 모니터링 대상에 설치하는 agent이다.
수집하는 metric의 유형별로 다양한 exporter들이 오픈소스로 제공되고, 직접 custom해서 사용할 수도 있다.
Prometheus 아키텍쳐
처음 마주하면 생각보다 요소가 다양해서 어렵게 느껴질 수 있다.
일단 Prometheus의 전체적인 아키텍쳐는 데이터 수집 / 데이터 저장 / 데이터 조회 / 데이터 알람 파트로 나누어 볼 수 있다.
그리고 각 파트별로 대표적인 구성요소를 아래와 같이 볼 수 있다.
수집
Exporter : Prometheus 서버가 metric을 Pull해갈 수 있도록 데이터를 수집해서 HTTP Endpoint를 제공해주는 Agent
PushGateway : 단발/일회성 작업에서 발생하는 Metric을 수집하기 위해 Prometheus 서버 앞단에 위치하는 Gateway, Metric 데이터를 PushGateway에 Push하면, Prometheus 서버는 PushGateway에서 Metric데이터를 Pull해간다.
저장
TSDB : Time Series DB, 시계열 데이터베이스이다. Prometheus 서버로 수집된 데이터들은 기본적으로 im-memory에 저장하지만, disk로 저장할 경우 TSDB format을 사용한다.
조회
Grafana : Prometheus 서버에 TSDB 시계열 데이터로 저장된 Metric을 효과적으로 시각화할 수 있는 대시보드
알람
Alertmanager : Prometheus에서 발생한 경고를 메시지 형태로 다양한 수신자에게 전송하는 도구
Grafana
데이터를 시각화하기 위한 오픈소스 시각화 분석도구로 Prometheus 기본 Web UI의 조금 부족한 데이터 시각화 기능을 보완하기 위해 주로 같이 한 세트로 묶여 연동한다.
연동할 수 있는 데이터 소스로는 Prometheus, ElasticSearch, InfluxDB, Amazon Cloudwatch 등등 다양하게 존재한다.
데이터 소스 플러그인을 설치해서 Grafana로 데이터를 끌어올 수 있다.
이렇게 Prometheus와 Grafana 개념을 간단하게 알아보았다.
다음으로 EC2 인스턴스를 통해 Metric을 수집해 Prometheus로 Pull해보고, Grafana까지 연동해보도록한다.