[Application Monitoring] Custom Metric 구현하기

Hyunjun Kim·2025년 6월 29일
0

Data_Engineering

목록 보기
89/153

3 Custom Metric 구현하기

3.1 Metric 선언 및 정의 방법

static final Counter requests = Counter.build()
	.name("requests_total")
	.help("Total requests.")
	.labelNames("method", "api")
	.register();
  • 한 번 선언된 메트릭은 static으로 JVM 내에서 global 영역에 존재해야 한다.
  • builder pattern 으로 설정한다.
  • label 이 있다면 string varags 로 세팅한다.
    • label 은 사용할때 순서대로 맞춰넣어야 하므로 순서가 중요하다.
  • register 에서 CollectorRegistry 를 지정하지 않으면, default registry 를 사용한다.
    • 다른 framework 내장 registry 와 연동하려면 해당 객체를 등록해주던가, 아니면 default registry 를 역으로 해당 framework 에 등록해야한다.

3.2 Counter 사용하기

3.2.1 정의

API 호출 수를 count 하기 위한 counter 정의.

static final Counter requests = Counter.build()
	.name("requests_total")
	.help("Total requests.")
	.labelNames("method", "api")
	.register();
  • label 로 HTTP method 와 API 종류를 구분할 수 있게 한다.

3.2.2 사용

API의 각 메소드에 다음과 같이 api 별로 count를 할 수 있도록 한다.

requests.labels($http_method, $api).inc();
  • 각 메소드에 맞게 $http_method, $api 값을 넣는다.
  • inc() 는 atomic 하게 해당하는 counter 를 increment ( = +1) 한다.
    • inc(amount) 함수로 원하는 양만큼 증가시킬 수도 있다.

3.2.3 Counter Monitoring

Req/s by API

sum by (method, api) (irate(requests_total[$__rate_interval]))

3.3 Histogram 사용하기

3.3.1 정의

Website 호출 latency 를 측정하기위한 Histogram 정의

static final Histogram remoteSiteLatency = Histogram.build()
	.name("remote_website_latency_seconds")
	.help("Request latency in seconds.")
	.labelNames("site")
	.buckets(0.1, 0.5, 0.8, 0.9, 0.95, 0.99, 1)
	.register();
  • label로 site 를 구분할 수 있게 했다.

3.3.2 명시적으로 timer 에 값 넣기

long startTime = System.currentTimeMillis();
String response = restTemplate.getForObject(site, String.class);
remoteSiteLatency.labels(site).observe((System.currentTimeMillis() - startTime) / 1000);

3.3.3 timer 로 측정 끝 구간 알기

Histogram.Timer timer = remoteSiteLatency.labels(site).startTimer();
String response = restTemplate.getForObject(site, String.class);
timer.observeDuration();

3.3.4 try-with-resource 구문에서 사용하기

try (Histogram.Timer requestTimer = remoteSiteLatency.labels(site).startTimer()) {
	String response = restTemplate.getForObject(site, String.class);
	return ResponseEntity.ok(response);
} catch (Exception e) {
	return ResponseEntity.unprocessableEntity().body(e.getMessage() + e.getStackTrace());
}

3.3.5 Histogram Monitoring

0.95 0.99 등 worst 를 histogra_quantitile 함수로 aggregation 해서 집계한다.
Histogram latency .95 by site

histogram_quantile(0.95, sum(rate(remote_website_latency_seconds_bucket[5m])) by (le, site))
  • unit: seconds
profile
Data Analytics Engineer 가 되

0개의 댓글