본 포스팅은 총 3편으로 구성되어 있습니다.
2024.05.05 - [IT/오픈소스] - 프로메테우스(Prometheus) 오픈소스란?
2024.05.05 - [IT/오픈소스] - 프로메테우스(Prometheus) 기본 사용법
2024.05.06 - [IT/오픈소스] - 프로메테우스(Prometheus) 자바 클라이언트 활용
프로메테우스 관련 마지막 포스팅이다.
이전 포스팅에서는 프로메테우스는 무엇이며, 어떻게 사용해야할지에 관하여 설명했다.
지금까지는 node_exporter같은 exporter를 설치하여 기본적으로 제공해주는 메트릭 정보를 활용했다. node_exporter뿐만 아니라 jmx_exporter 등 많은 exporter가 있지만 회사 솔루션레벨의 제품에서의 모니터링은 기본적으로 제공해주는 메트릭만으로는 충분치 않다. 좋든 싫든 내가 원하는 메트릭정보를 커스터마이징해야하는데, 다행히도 프로메테우스에서는 각 언어별로 클라이언트를 지원하고있다. 자바 진영에서는 java_client를 제공한다.
https://prometheus.io/docs/instrumenting/clientlibs/
https://github.com/prometheus/client_java
자바 클라이언트 설치 및 기동
간단하게 자바 코드에 해당 java_client를 껴넣고 소스를 기동한다고 생각하면 된다.
pom.xml
<properties>
<prometheus-version>1.1.0</prometheus-version>
</properties>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-core</artifactId>
<version>${prometheus-version}</version>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-instrumentation-jvm</artifactId>
<version>${prometheus-version}</version>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-exporter-httpserver</artifactId>
<version>${prometheus-version}</version>
</dependency>
main함수
import io.prometheus.metrics.core.metrics.Counter;
import io.prometheus.metrics.exporter.httpserver.HTTPServer;
import io.prometheus.metrics.instrumentation.jvm.JvmMetrics;
import java.io.IOException;
public class App {
public static void main(String[] args) throws InterruptedException, IOException {
JvmMetrics.builder().register(); // initialize the out-of-the-box JVM metrics
Counter counter = Counter.builder()
.name("my_count_total")
.help("example counter")
.labelNames("status")
.register();
counter.labelValues("ok").inc();
counter.labelValues("ok").inc();
counter.labelValues("error").inc();
HTTPServer server = HTTPServer.builder()
.port(9400)
.buildAndStart();
System.out.println("HTTPServer listening on port http://localhost:" + server.getPort() + "/metrics");
Thread.currentThread().join(); // sleep forever
}
}
JvmMetrics.builder.register(); 는 자바 클라이언트가 제공하는 기본 JVM관련 지표를 포함하여 넘겨줄지 여부를 나타낸다.
HTTPSever server = new HTTPServer(9400);
DefaultExports.initialize();
이렇게 구성하는것은 0.16.0의 버전이다. 공식문서에서도 1.0이상을 권장하고있으므로 사용하지않길 바란다.
메트릭 확인
이렇게만 구성하고 실행하여 localhost:8989/metric 으로 접속해보자.
my_count_total 과 더불어 jvm_memory, jvm_gc, jvm_buffer 등의 메트릭정보들이 생성되는것을 확인할 수 있다. 내가 직접 만든 my_count_total 메트릭 이외에는 JvmMetrics.builder.register()를 입력하여서 자동으로 생성하는것이라고 생각하면된다.
눈여겨보아야할것은 직접 생성한 메트릭 정보이다.
Counter counter = Counter.builder()
.name("my_count_total")
.help("example counter")
.labelNames("status")
.register();
counter.labelValues("ok").inc();
counter.labelValues("ok").inc();
counter.labelValues("error").inc();
포스팅 1편에서 언급하였듯이, 메트릭유형은 아래 4가지로 분류된다.
https://prometheus.io/docs/concepts/metric_types/
- Counter - 가장 많이 수집되는 유형의 메트릭 타입. 누적 개수를 표현 (증가밖에 할수없다)
- 초당 요청 개수
- 초당 요청 성공률
- Gauge - 현재 상태를 표현하는 매트릭 타입. Counter와 달리 증가는 물론 감소도 가능하다
- 현재 커넥션 개수
- 현재 스레드 개수
- 현재 메모리 사용량
- Summary - 시스템 성능을 이해할때 필요한 매트릭 타입
- 지연 시간
- 응답 시간
- History - Summary와 거의 유사하지만, 분위수를 추가
자신이 원하는 메트릭의 유형을 잘 선택해야한다. 위의 예제에서는 단순 누적 합계를 구하는것이므로 Counter를 사용하였다. labelValues로 메트릭의 라벨을 붙여서 구분가능하게 하고, inc()함수로 1을 더하였다. 즉, my_count_total이라는 이름의 메트릭은 ok라벨로 2, error라벨로 1로 생성된것이다.
메트릭정보를 생성하는 것은 확인했으니, 이제 프로메테우스에서 해당 메트릭정보를 집계하도록 yml파일쪽에 target 정보를 추가한다.
prometheus.yml
- job_name: "my_metric"
static_configs:
- targets: ["localhost:9400"]
yml 수정 후, 프로메테우스를 재기동하여 프로메테우스 url로 접근한다.
해당 화면처럼 my_metric이 up상태인것을 확인한다면, 프로메테우스에서 내가 만든 커스텀메트릭을 잘 집계하는것이다.
그래프쪽에가서 my_count_total을 입력하면 수집된 메트릭 정보를 보여준다.
"error"는 1이고 / "ok" 는 2인것을 확인할 수 있다. 모든것이 내가 넣어준 그대로 집계가 되었다.
여기에, ExecutorService를 사용하여 10개의 쓰레드가 150번 ok 라벨을 증가시키는 소스를 추가하였다.
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 150; i++) {
executorService.execute(() -> {
try {
System.out.println(Thread.currentThread().getName());
counter.labelValues("ok").inc();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
error라벨은 그대로 1이지만, ok라벨을 2+150하여 152값이 잘 반영되는것을 확인하였다.
2번 포스팅을 이용하여, rate()함수를 이용하면 초당 평균 증가량도 그래프로 확인할 수 있다.
증가량뿐아니라, 현재 상태값(현재 지연 거래 개수 등)을 알고싶다면 Counter가 아닌 Gauge로 구현하면된다.
참고로 gauge는 inc()와 dec()를 사용하면된다.
늘 그래왔듯, 모든것은 공식문서에 친절히 나와있다.
공식문서를 읽는것을 생활화하자.
https://prometheus.io/docs/instrumenting/clientlibs/
https://prometheus.github.io/client_java/instrumentation/jvm/
'IT > 오픈소스' 카테고리의 다른 글
JPA - 다양한 쿼리방법 (0) | 2024.12.23 |
---|---|
JPA - 고급 매핑 (0) | 2024.12.23 |
프로메테우스(Prometheus) 기본 사용법 (0) | 2024.05.05 |
프로메테우스(Prometheus) 오픈소스란? (0) | 2024.05.05 |
JPA - 기본 개념 (1) | 2024.01.30 |
댓글