상세 컨텐츠

본문 제목

Prometheus(프로메테우스) PushGateway API 연동하기 (NestJS)

DevOps/Prometheus

by Hoonjo 2023. 8. 22. 19:00

본문

Prometheus(프로메테우스) PushGateway API 연동하기 (NestJS)

Prometheus Push Gateway API Interworking (NestJS)

 

 

 

PrometheusPushGatewayNestJSAPI 연동하는 방법을 알아보겠습니다.

 

 

 

 

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별 구분을 위한 라벨이므로 다른 변수명으로 변경 가능합니다.

API툴을 이용한 POST 전송 (insomnia)
PushGateway에 Metric이 추가된 모습

 

DELETE URL:

https://PushGateway주소/metrics/job/JOB이름/hostname/호스트명/project/프로젝트명

API툴을 이용한 DELETE 전송 (insomnia)
Metric이 삭제된 모습


 

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을 호출해 사용 할 수 있습니다.

metricsTestJOB 함수를 호출

 


 

3. 실행 결과

 

서버를 실행하고 insomnia를 통해 값을 JSON형태로 전송해 보겠습니다.

{
	"hostname": "hoonjo",
	"project": "TEST",
	"CpuPercent": "70",
	"MemPercent": "60"
}

POST 전송

 

 

✔︎ PushGateway에 접속해 정상적으로 값이 들어온지 확인!

CPU 사용률 70%
Memory 사용률 60%

 

값이 잘 들어온 모습입니다 ㅎㅎ

 

Prometheus는 기본적으로 데이터를 Pulling 방식으로 데이터를 수집하지만

불가피한 상황에 데이터를 Pushing 방식으로 사용하기 위해 PushGateway를 사용하기도 합니다.

위 와 같이 연동해서 다양한 방법으로 적용해보면 좋을 것 같습니다. 😁