본문 바로가기

Infrastructure/Prometheus

Prometheus Pushgateway with Node.Js

이번엔 Prometheus 의 Pushgateway 에 대해 살펴보도록 하겠습니다.

 

- Pushgateway

 

다시한번 간략히 설명하자면, Pull 방식으로 Prometheus 가 메트릭을 수집할 수 없을 때 (ex. batch-job) 사용 가능한 대안입니다.

Prometheus 공식 설명에서도 Pushgateway 는 서비스 수준 배치 작업의 결과를 캡쳐하는 정도로 사용하는게 유일하면서 유용한 사례라고 얘기하고 있습니다. (참고 링크)

 

일반적인 케이스에서 Pull 방식이 아닌 Pushgateway 를 사용할 경우 아래와 같이 발생할 수 있는 몇가지 위험이 있습니다.

 

• 단일 Pushgateway 를 사용해 여러 instance 를 모니터링 할 경우 Pushgateway 는 잠재적인 병목의 위험을 갖게 됩니다.

• Prometheus 가 매번 수집할 때마다 자동으로 생성하는 up 메트릭 (instance health monitoring) 을 잃게 됩니다.

• 수집된 메트릭은 Pushgateway API 를 사용해 수동으로 지워주지 않는 한 영원히 남아 Prometheus 에 노출됩니다.

 

따라서 이번 예시에서는 아주 심플한 코드를 작성해 Pushgateway 에 대해 맛보도록 하겠습니다.

 

- Pushgateway 설치

 

Prometheus 를 설치한다고 해서 Pushgateway 가 같이 설치되진 않습니다. 저는 docker 를 통해 Pushgateway 를 설치해보도록 하겠습니다. (참고 링크)

 

> docker pull prom/pushgateway

 

 

> docker images

 

 

먼저 prom/pushgateway 최신 이미지를 받아줍니다.

그 후 해당 이미지로 Pushgateway 컨테이너를 띄우면 끝입니다. 기본적으로 Pushgateway 는 9091 포트를 사용합니다.

 

> docker run -d -p 9091:9091 prom/pushgateway

 

컨테이너가 실행되면 브라우저에서 http://localhost:9091 로 접근해봅니다.

 

 

Prometheus 기본 UI 와 상당히 유사하고, 현재는 Pushgateway 로 push 한 메트릭이 전혀 없기 때문에 그저 빈 페이지입니다.

이제 코드 레벨에서 Pushgateway API 를 사용해 메트릭을 push 해보도록 하겠습니다.

 

- Push Metrics (with Node.Js)

 

예시 코드는 Node.Js 로 작성할 것입니다.

 

• 먼저 Node.Js 프로젝트를 하나 생성합니다.

 

> mkdir pushgateway-sample
> cd pushgateway-sample
> npm init

 

• API 호출을 위해 axios 모듈을 설치합니다.

 

npm install axios

 

• 먼저 간단한 코드를 작성하고 설명에 들어가겠습니다. (pushgateway.js)

 

const axios = require('axios');

const putData = (data = '') => {
  return await axios({
    method: 'put',
    url: 'http://localhost:9091/metrics/job/test',
    data,
  });
};

(async () => {
  const data = `
    # TYPE success_rate gauge\n
    success_rate{target="app1"} 30\n
    success_rate{target="app2"} 60\n
    # TYPE duration gauge\n
    duration{target="app1"} 100\n
    duration{target="app2"} 80\n
  `;
  
  await putData(data);
)();

 

먼저 data 를 보시면, 뭔가 이전에 봤던 metric data (아래 예시) 와 아주 유사하게 생겼습니다.

 

 

이전 포스팅에서 prom-client 를 통해 Node.Js 어플리케이션 메트릭을 수집했을 때, 메트릭은 단순 plain-text 형태로 위처럼 구성되어 있다는 점을 확인할 수 있었습니다.

 

마찬가지로 Pushgateway 에 메트릭을 보낼때는, 이렇게 동일한 텍스트 형태로 메트릭을 만들어서 보내면 됩니다.

다시 코드로 돌아와서 위에 보이는 것처럼 각각 gauge 타입의 success_rate 와 duration 두가지 메트릭을 만들고

target 이라는 label 을 붙였으며 success_rate 의 app1 label 에는 30의 값을, app2 label 에는 60의 값을 메트릭으로 넣은 것입니다.

 

API url 의 path 구성은 기본적으로 아래와 같습니다.

 

/metrics/job/<JOB_NAME>{/LABEL_NAME>/<LABEL_VALUE>}

 

job 이라고 되어있지만 얘도 label 중 하나일 뿐입니다. 위에서 success_rate{target="app1"} 이런 형태로 label 을 붙이고 있지만,

path 에 이와 같은 형태로 label 추가도 가능합니다. (위 예시에서 저는 JOB_NAME 에 test 라고 넣었는데, 실무에선 배치잡 이름을 넣고 그 외 라벨은 예시처럼 코드에서 붙여주고 있습니다)

 

method 는 put 을 사용했는데, 그 외 method 는 조금 후에 보도록 하겠습니다.

 

우선 위 코드를 실행합니다.

 

> node pushgateway.js

 

• Pushgateway

 

이제 코드레벨에서 Pushgateway API 를 사용해 보낸 메트릭이 어떻게 들어와있는지 확인해보도록 하겠습니다.

다시 브라우저를 열어 http://localhost:9091 로 접근합니다.

 

 

이렇게 메트릭이 Pushgateway 에 잘 들어와있습니다. 앞서 설명드린것처럼 label 로 붙인 job 과 target 도 설정되었습니다.

코드에서 추가하지않은 push_failure_time_seconds 와 push_time_seconds 두 메트릭이 보이는데,

각각 마지막으로 실패한 시각과 성공한 시각을 나타내며 Pushgateway 에 의해 자동으로 추가되는 메트릭입니다.

 

이제 Pushgateway 가 들고있는 이 메트릭을 Prometheus 가 접근해서 수집할 수 있도록 설정을 변경해보도록 하겠습니다.

 

• Prometheus 설정 및 확인

 

 

prometheus.yml 파일의 targets 을 Pushgateway url 로 변경해주기만 하면 끝입니다.

http://localhost:9090 에 접근해 Pushgateway 의 메트릭이 제대로 수집되었는지 확인해보도록 하겠습니다.

 

 

아까 추가한 duration 에 대해 쿼리했을 때의 결과입니다. 정상적으로 pull 되고 있는 것을 확인할 수 있습니다.

 

- PUT / POST / DELETE

 

이전 코드에서 Pushgateway API 사용시 method 로 put 을 사용했는데, 다른 method 들은 어떤 기능과 차이점이 있는지 확인해보도록 하겠습니다.

 

일반적으로 메트릭을 새롭게 추가하거나 업데이트할 때는 put 을 사용합니다.

post 도 방식은 put 과 동일합니다. 다만 post method 로 보내는 data 중 매칭되는 메트릭이 없다면 새로 생성하고, 있으면 업데이트하지만 기존 메트릭은 건드리지 않습니다. 즉 put method 는 요청 data 에 기존 메트릭이 없는 경우 그 메트릭을 지워버립니다.

 

const data = `
  # TYPE fail_rate gauge\n
  fail_rate{target="app1"} 60\n
  fail_rate{target="app2"} 30\n
  # TYPE success_rate gauge\n
  success_rate{target="app1"} 30\n
  success_rate{target="app2"} 60\n
`;

 

위 코드에서 duration 메트릭 부분은 제거하고, fail_rate 라는 새로운 메트릭을 추가해 post method 로 요청을 보냈습니다.

 

 

그 결과 보이는 것처럼 fail_rate 메트릭이 새로 추가되었고, success_rate 는 업데이트 되었으며 duration 은 그대로인것을 확인할 수 있습니다. (메트릭 옆에 unix time 을 통해 확인 가능)

 

이번엔 success_rate 메트릭만 data 에 담아서 put method 로 요청을 보냅니다.

 

const data = `
  # TYPE success_rate gauge\n
  success_rate{target="app1"} 10\n
  success_rate{target="app2"} 20\n
`;

 

 

그 결과 success_rate 메트릭은 업데이트 되었지만, 기존의 duration 과 fail_rate 메트릭은 제거된 것을 볼 수 있습니다.

경우에 따라 다르겠지만, 전 대체로 put method 를 사용하고 있습니다.

 

마지막으로 delete method 입니다. 별다른 data 없이 요청을 보내보도록 하겠습니다.

 

axios({
  method: 'delete',
  url: 'http://localhost:9091/metrics/job/test'
});

 

 

job="test" 에서 확인 가능했던 모든 메트릭이 제거되었습니다. path 의 label 을 통해 매칭되는 메트릭은 전부 제거하는 method 입니다.

 

- 실제 사용 예시

 

 

위는 제가 사내에서 실제로 Pushgateway 를 사용해 모니터링 중인 배치잡의 대시보드 중 하나입니다. 배치잡에 Pushgateway 를 붙여 해당 잡이 실행될 때마다 등록된 count 등을 메트릭으로 수집해 위와 같이 모니터링 하고 있습니다.

 

젠킨스 등을 통해 배치를 돌릴 시 잡의 성공 실패 유무는 굳이 Prometheus - Pushgateway 가 없어도 쉽게 확인이 가능하지만,

내부에서 만들어진 데이터를 실시간으로 확인하기엔 괜찮은 방법인 듯 합니다.

 

여기까지 Pushgateway 에 대한 내용을 마치도록 하겠습니다. (참고 링크)

'Infrastructure > Prometheus' 카테고리의 다른 글

Node.js Cluster mode 모니터링  (0) 2021.04.04
Node.js 어플리케이션 모니터링  (0) 2021.03.27
Prometheus Node Exporter 모니터링  (0) 2021.03.20
Prometheus 란?  (0) 2021.03.14