prometheus에서 exporter는 메트릭을 수집하는 주체이다. 일반적인 모니터링 시스템에서는 agent라 칭하며 agent가 데이터를 수집하고 어디로 데이터를 전송할지를 알고있는 것에 비해 prometheus에서는 exporter가 데이터를 수집하고 이를 외부에서 가져갈 수 있게 준비할뿐 서버와의 연관관계가 없어 특별히 ‘exporter’라고 명명하고 있다.

매트릭 표출 (expose)

일반적으로 exporter는 웹서버를 기동시키며 ‘/metrics’라는 url로 자신이 수집한 매트릭을 표출하고 있다.

아래는 서비스를 확인하여 node exporter의 endpoint를 확인하고 데이터를 수집하는 예시이다. 노드관련한 매트릭을 평문(plan text)으로 제공하고 있다.

siim@adm:~$ kubectl get svc -n lma | grep node-exporter
prometheus-node-exporter         NodePort    10.14.184.179   <none>        9100:32290/TCP               28d

siim@adm:~$ curl m1:32290/metrics
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 7.3458e-05
go_gc_duration_seconds{quantile="0.25"} 0.000145494
...
# HELP node_boot_time_seconds Node boot time, in unixtime.
# TYPE node_boot_time_seconds gauge
node_boot_time_seconds 1.62260754e+09
# HELP node_context_switches_total Total number of context switches.
# TYPE node_context_switches_total counter
node_context_switches_total 1.99312904741e+11
# HELP node_cooling_device_cur_state Current throttle state of the cooling device
# TYPE node_cooling_device_cur_state gauge
node_cooling_device_cur_state{name="0",type="Processor"} 0
node_cooling_device_cur_state{name="1",type="Processor"} 0
node_cooling_device_cur_state{name="10",type="Processor"} 0
node_cooling_device_cur_state{name="11",type="Processor"} 0
...
# HELP node_cpu_seconds_total Seconds the cpus spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 1.857578386e+07
node_cpu_seconds_total{cpu="0",mode="iowait"} 16764.08
node_cpu_seconds_total{cpu="0",mode="irq"} 0
node_cpu_seconds_total{cpu="0",mode="nice"} 375.07
node_cpu_seconds_total{cpu="0",mode="softirq"} 73400.71
node_cpu_seconds_total{cpu="0",mode="steal"} 0
node_cpu_seconds_total{cpu="0",mode="system"} 73238.99
node_cpu_seconds_total{cpu="0",mode="user"} 191180.4
node_cpu_seconds_total{cpu="1",mode="idle"} 1.867749535e+07
node_cpu_seconds_total{cpu="1",mode="iowait"} 11244.55
...

자세히 살펴보면 주석을 통해 자체적으로 각 데이터의 의미와 타입을 알려주고 실제 그 매트릭의 값을 다차원(multi-dimentional)으로 보여주고 있는 것을 확인할 수 있다. 예를 들면 중간의 ‘node_cooling_device_cur_state’의 경우 타입은 측정치(gauge)이고 차원으로 이름과 타입을 제공하는 것을 확인할 수 있으며 ‘node_cpu_seconds_total’의 경우 타입은 계수(couter)이고 차원으로 cpu번호와 mode를 나타내고 있다. 각각의 Help를 통해 해당 매트릭이 의미를 정의하고있다.

참고로 모든 exporter는 exporter자체에 대한 수많은 매트릭을 표출하고 있어 처음 전체문서를 볼때 원하는 값을 찾기 힘들수 있다. 위 예시에서도 처음에 나오는 값들은 exporter의 동작과 관련한 값들이다.(go_....)

참고. 데이터 타입

prometheus의 매트릭의 값은 다음과 같은 4가지 타입중 하나를 갖는다. 좀더 자세한 내용은 공식페이지(https://prometheus.io/docs/concepts/metric_types/)를 참조하자.

개별 패키지로의 exporter

이러한 exporter는 다양한 형태로 존재한다. 첫번째는 독립 소프트웨어 패키지로 존재하는 exporter이다. 이는 필요한 데이터를 발생시키기위해 만드는 소프트웨어로 일반적으로는 레거시 시스템에 대한 매트릭을 생성하기 위한 형태로 만들어져 있다. 단일 소프트웨어에 한정적이지 않고 복합적인 상황에 대한 매트릭을 생성하고 이를 노출하는 https://github.com/Jimdo/aws-health-exporter, https://github.com/infinityworksltd/docker-hub-exporter..등 exporter들도 있다.

오픈소스로 제공되는 exporter들은 공식페이지의 링크(https://prometheus.io/docs/instrumenting/exporters/)를 통해 확인할 수 있다. 해당 링크에는 카테고리별로 각 소프트웨어에 대한 exporter 링크들을 제공하고 있다. exporter 이름옆에 ‘(official)’이라는 표시가 되어있는 것들은 prometheus 커뮤니티에서 테스트하고 공식 지원하는 것을 이야기하는 것이다.

스크린샷 2021-11-10 오후 4.30.09.png

공식 사이트와 별개로 NexClipper라는 회사에서 제공하고 있는 exporter hub (https://exporterhub.io/)를 통해서도 정보를 확인할 수 있다.

스크린샷 2022-01-07 오후 8.20.09.png

embeded exporter