이번엔 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 |