Prometheus(프로메테우스) PushGateway API 연동하기 (NestJS)
Prometheus Push Gateway API Interworking (NestJS)
Prometheus의 PushGateway를 NestJS와 API 연동하는 방법을 알아보겠습니다.
1. PUT, DELETE API 테스트
먼저 API 툴로 요청하는 방법입니다.
Auth Type은 Basic Auth 방식이며, PushGateway 접속 ID/PW 정보를 같이 담아 전송하면 됩니다.
POST & PUT URL:
https://PushGateway주소/metrics/job/JOB이름/hostname/호스트명/project/프로젝트명
hostname이나 project는 Metric별 구분을 위한 라벨이므로 다른 변수명으로 변경 가능합니다.
DELETE URL:
https://PushGateway주소/metrics/job/JOB이름/hostname/호스트명/project/프로젝트명
2. NestJS 연동하기
PushGateway에 CPU와 Memory 사용률을 전송한다 가정해보겠습니다.
아래는 연동하는 소스입니다.
metricsTestJOB.ts:
import axios from 'axios';
import { Buffer } from 'buffer';
// Basic Auth 토큰 생성용 함수
const ENCODING = 'base64';
function base64(string: string) {
return Buffer.from(string).toString(ENCODING);
}
function token(user: string, pass: string) {
return base64([user, pass].join(':'));
}
// Basic Auth 토큰 생성용 함수 .
export interface TestJOBBody {
hostname: string;
project: string;
CpuPercent: number | string;
MemPercent: number | string;
}
/** testJOB Pushgateway Metric */
export const metricsTestJOB = async (body: TestJOBBody) => {
/** 프로메테우스 basic auth 토큰 생성 */
const prometheusAuth = token(
process.env.PROMETHEUS_ID,
process.env.PROMETHEUS_PW
);
let data = '';
const job = 'testJOB';
const url = `${process.env.PUSHGATEWAY_URL}/metrics/job/${job}/hostname/${body.hostname}/project/${body.project}`;
////////////////////////////////////////////////////////////// metric 값 세팅
data += `CPUusage_use{name="CPU",} ${body.CpuPercent}\n`;
data += `MEMusage_use{name="MEM",} ${body.MemPercent}\n`;
////////////////////////////////////////////////////////////// metric 값 세팅 .
// Pushgateway 전송
await axios
.post(encodeURI(url), data, {
headers: {
Authorization: `Basic ${prometheusAuth}`,
},
})
.catch((result) => {
console.log('result:', result);
});
// Pushgateway 전송 .
};
Prometheus의 로그인 인증 방식은 base64를 사용하고 있습니다.
base64를 활용해 토큰을 생성하고 POST의 헤더 인증 값에 넣어 data와 함께 전송하며, data의 값은 모두 string이여야 합니다.
data에 여러 개의 값을 추가하려면 위 data변수와 같이 ' \n ' 을 이용해 구분합니다.
* ID, PW, PushGateway URL은 env파일에 값을 저장하고 불러와 사용합니다.
아래와 예시처럼 Controller에서 미리 만들어 둔 metricsTestJOB을 호출해 사용 할 수 있습니다.
3. 실행 결과
서버를 실행하고 insomnia를 통해 값을 JSON형태로 전송해 보겠습니다.
{
"hostname": "hoonjo",
"project": "TEST",
"CpuPercent": "70",
"MemPercent": "60"
}
✔︎ PushGateway에 접속해 정상적으로 값이 들어온지 확인!
값이 잘 들어온 모습입니다 ㅎㅎ
Prometheus는 기본적으로 데이터를 Pulling 방식으로 데이터를 수집하지만
불가피한 상황에 데이터를 Pushing 방식으로 사용하기 위해 PushGateway를 사용하기도 합니다.
위 와 같이 연동해서 다양한 방법으로 적용해보면 좋을 것 같습니다. 😁