서버 개발자로서 꽤나 긴 시간동안 코딩을 하면서 지내고 있을 무렵, CPU 및 GPU 등 다양한 데이터를 수집하는 아키텍처를 구현해야할 일이 생겼다. slurm이라는 리눅스 노드들을 클러스터링하는 툴을 쓰고 있는 상황이었고, 어떻게 모니터링 할 수 있을 지 고민하기 시작했다. HPC managing하는 과정에서 결국 시계열 데이터를 수집하는 방법을 쓰기로 했고 그러한 과정에서 프로메테우스를 열심히 공부하기 시작했다.
마스터 노드가 셋, 워커 노드가 백 개에 달하는 시스템에서 CPU 및 GPU를 모니터링하는 작업을 수행하는 아키텍처를 구현하고 있을 때, 가장 먼저 떠오른 것은 뭔가 queue를 두고 node에서 데이터들을 쏘아보내는 곳이 있어야 하지 않을까? 하는 고민이었다. 메시지 큐를 써야 하나 생각하고 있을 때, 문득 든 생각이 시계열 데이터를 처리하는 것이라면 프로메테우스가 좋지 않을까? 하는 생각이었다.
본론
먼저 Prometheus에 대해서 소개하면 다음과 같다. 프로메테우스는 오픈 소스 시스템 모니터링을 도와주는 도구로 특히 시계열 데이터(time-series data)를 수집하고, 저장하며, 쿼리하는 데 중점을 둔다. 이렇게 시계열 데이터를 수집하기만 하는 프로메테우스는 주로 단독으로 쓰이지 않고, 다른 서버와 연계하여 사용하게 된다.
특히 프로메테우스가 수집한 데이터를 보여주는 grafana와 같은 시각화 툴이나, exporter라고 불리는 프로메테우스에 Matrix이라는 자료형으로 데이터를 쏘아주는 것들이 있다. 이러한 조합으로 함께 사용하게 된다. Matrix은 시계열 데이터를 다차원 배열로 표현한 것이다.
Matrix?
먼저 미시적으로 메트릭(Matrix)에 대해서 자세히 알아둬야할 필요가 있다. 추후 우리가 어떤 시계열 데이터를 수집할 수 있을 지 알아보기 위함이다. 프로메테우스에서 제공하는 레퍼런스와 메트릭 유형은 아래와 같다.
- Prometheus docs : https://prometheus.io/docs/concepts/metric_types/
Metric types | Prometheus
An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.
prometheus.io
- Counter : 증가만 가능한 값, 예를 들면 요청 횟수 등
- Gauge : 값이 증가하거나 감소할 수 있는 것, 예를 들어 현재 메모리 사용량 등
- Histogram : 관찰값을 버킷으로 나눠 집계, 예를 들어 응답 시간 분포 등
- Summary : 특정 기간 동안 관찰값의 요약 통계, 예를 들어 요청 시간의 백분위 수 등
이러한 데이터를 특정 서버에서 exporter를 통해 메트릭의 형태로 노출한다. 이런 메트릭을 프로메테우스가 캐치하여 저장하게 된다. 이렇게 저장된 데이터를 PromQL로 가져다 쓸 수 있다.
위 문장들이 이해가 쉽게 가지 않는다면, 공식 문서에서 제시하는 프로메테우스 아키텍처를 보며 확인해보자.
Prometheus Architecture
위 사진을 확인해보면, 왼쪽 하단에 있는 exporter 들이 내보내는 메트릭을 수집한다. 내부적으로 데이터를 저장하고, 이를 통해 Prometheus alerting을 통해서 다양한 방법으로 얼럿을 보내는 방법이 있다.
다른 방법으로는 프로메테우스 서버의 시계열 데이터를 확인할 수 있게 도와주는 것이 위에서 말한 PromQL이다. 프로메테우스에서 기본적으로 제공하는 Web UI나 Grafana와 같은 오픈 소스 모니터링 툴이 PromQL을 사용하게 된다. 이 외에 직접적으로 프로메테우스의 데이터를 가져오는 것이 필요하다고 하면, 직접 PromQL의 API를 통해 프로메테우스에서 시계열 데이터를 가져올 수 있다.
여기서 가장 중요한 것은 아무래도 단연 exporter다. 메트릭의 형태로 데이터를 뿜어내는 것이 있어야 프로메테우스가 수집할 수 있기 때문이다. 다행히 이러한 exporter를 직접 만들 지 않아도, 이미 많은 exporter들을 확인할 수 있다.
- dockerhub exporter : https://hub.docker.com/search?q=exporter
https://hub.docker.com/search?q=exporter
hub.docker.com
dockerhub에 exporter로 검색을 해보면 위와 같은 정보를 얻을 수 있다. redis, node, mongodb, nginx 등 우리가 흔히 접할 수 있는 모든 서버란 서버의 exporter들을 볼 수 있다. 이러한 프리셋 도커 이미지를 가져와서 적용함으로써 손쉽게 서비스에서 메트릭을 추출할 수 있게 된다.
약간의 커스터마이징이 필요할 수 있겠지만, 일반적인 데이터의 수집은 이러한 방식으로 커버할 수 있다. prometheus는 설정 파일은 prometheus.yml에 설정되어 있는 대로 exporter들이 내뿜는 matrix을 수집할 수 있다.
Prometheus installation
이번 포스팅에서는 docker를 기반으로 premetheus를 실행하는 방법을 알아본다. 다음 명령어를 통해 docker로 간단하게 실행시킬 수 있다.
$ docker run -p 9090:9090 prom/prometheus
그 후 localhost의 9090포트로 접속하면 다음과 같은 화면을 볼 수 있다.
위와 같은 화면을 볼 수 있으며, 프로메테우스 대시보드를 통해서 시계열 데이터의 처리를 할 수 있다. 하지만 우리가 일반적으로 위 대시보드를 크게 사용하지는 않는다. 이는 단순히 9090번 포트에서 서빙되고 있는 것이며, 프로메테우스의 진가는 다른 서버와 연결을 시켜주는 중간 다리의 역할을 한다.
Prometheus extension
앞서 보았던 프로메테우스의 진정한 사용을 위해서는 메트릭을 뿜어내는 exporter들과 시각화를 도와주는 UI가 필요하다. 대표적으로는 grafana가 있는데, 우리는 많은 사용자들이 만들어둔 이러한 것들을 볼 수 있다.
dockerhub에서 제공하는 다양한 exporter preset
그라파나에서 제공하는 다양한 exporter별 대시보드
이렇게 프로메테우스는 주로 exporter와 dashboard의 중간 다리 역할을 한다. 가장 중요한 것은 시계열 데이터!! 라는 것이다. 굳이 시계열 데이터가 아니라면 프로메테우스 말고도 다양한 선택지가 있을 것이다.
이렇게 exporter - prometheus - grafana를 통해서 모니터링 툴을 만드는 방법도 있으며, 비슷하지만 다른 으로는 ELK 스택이라는 것도 있다. 대표적으로 ELK 스택이라고 불리는 것이 있는데, Elasticsearch, Logstash, Kibana 이 세 가지 조합이 있다. 이 친구들은 주로 로그 수집에 많이 쓰이게 된다.
서비스의 가용성과 다양한 요소들을 고려하여 여러가지 모니터링 툴을 도입할 수 있다. 다양한 것들을 알고 있으면, 적재적소에 필요한 기술을 가져다 쓸 수 있지 않을까. 앞으로 다양한 기술들을 리뷰할 계획이다.
마치며
다음 포스팅은 node-exporter, prometheus, grafana 조합을 설명할 계획이다.
'DevOps > prometheus' 카테고리의 다른 글
prometheus와 grafana로 redis 서버 모니터링 (0) | 2024.07.16 |
---|---|
promethous와 grafana로 linux 시스템 모니터링 (2) | 2024.07.14 |