io.micrometer.core.instrument 패키지
io.micrometer.core.instrument 패키지는 Micrometer의 핵심 부분임.
애플리케이션의 메트릭을 수집하고 관리하는 데 필요한 주요 인터페이스와 클래스를 제공함.
Micrometer는 JVM 기반 애플리케이션에서 성능 모니터링과 메트릭 수집을 위한 라이브러리로, 다양한 모니터링 시스템과 연동할 수 있는 일관된 API를 제공함.
Micrometer 소개
Micrometer는 메트릭을 수집하고 이를 다양한 모니터링 시스템(Prometheus, Grafana, Datadog, New Relic 등)으로 전송하는 기능을 제공함.
이를 통해 애플리케이션의 성능, 리소스 사용량, 이벤트 발생 등을 모니터링 하고 분석할 수 있음.
io.micrometer.core.instrument 패키지의 주요 구성 요소
1. MeterRegistry
- 설명
메트릭을 등록하고 관리하는 중앙 저장소 역할을 함.
다양한 모니터링 시스템에 메트릭을 전송할 때 이 레지스트리를 통해 이루어짐.
- 사용법
MeterRegistry registry = new SimpleMeterRegistry();
- 종류
SimpleMeterRegistry, PrometheusMeterRegistry, GraphiteMeterRegistry 등 다양한 구현체가 있으며, 사용하는 모니터링 시스템에 따라 선택함.
2. Meter
- 설명
측정하려는 대상의 추상화를 나타내는 인터페이스임.
Counter, Gauge, Timer 등의 구체적인 메트릭 유형의 상위 인터페이스임.
- 메서드
getId() : Meter의 식별자를 반환함
measure() : 현재 측정 값을 반환함
3. Meter.Id
- 설명
Meter를 식별하는 데 사용되는 정보들을 포함함.
메트릭의 이름, 태그, 베이스 단위 등을 포함함.
- 예시
Meter.Id meterId = meter.getId();
String name = meterId.getName();
List<Tag> tags = meterId.getTags();
4. Counter
- 설명
단조롭게 증가하는 값을 측정하는 데 사용됨.
이벤트 발생 횟수, 요청 수 등을 카운트함.
Counter counter = registry.counter("requests.total", "method", "GET");
counter.increment(); // 값을 1 증가
counter.increment(2.0); // 값을 2 증가
5. Gauge
- 설명
어떤 값의 현재 상태를 측정함.
값이 증가하거나 감소할 수 있으며, 주로 리소스 사용량, 큐의 크기 등을 모니터링함.
- 생성 및 사용
List<String> list = new ArrayList<>();
Gauge gauge = Gauge.builder("list.size", list, List::size)
.register(registry);
이 예시에서는 list의 크기를 실시간으로 모니터링함.
6. Timer
- 설명
코드 블록이나 메서드의 실행 시간을 측정하고, 호출 횟수와 함께 분포를 기록함.
- 생성 및 사용
Timer timer = registry.timer("requests.latency", "method", "GET");
timer.record(() -> {
// 측정하려는 코드 블록
});
또는 시간 값을 수동으로 기록할 수 있음.
long start = System.nanoTime();
// 실행할 코드
long end = System.nanoTime();
timer.record(end - start, TimeUnit.NANOSECONDS);
7. DistributionSummary
- 설명
수치 데이터의 분포를 측정함.
이벤트의 크기나 용량(예: 페이로드 크기, 파일 크기)을 측정할 때 사용함.
- 생성 및 사용
DistributionSummary summary = registry.summary("payload.size", "endpoint", "/upload");
summary.record(512); // 512바이트 크기 기록
8. LongTaskTimer
- 설명
긴 작업의 기간을 측정하는 데 사용됨.
일반적인 Timer와 달리 작업이 완료될 때까지의 시간을 추적함.
- 생성 및 사용
LongTaskTimer longTaskTimer = registry.more().longTaskTimer("long.task.timer");
LongTaskTimer.Sample sample = longTaskTimer.start();
// 실행할 긴 작업
sample.stop();
9. FunctionCounter
- 설명
특정 객체의 상태를 기반으로 카운터 값을 계산함.
값이 리셋되거나 변경될 수 있는 카운트를 측정할 때 사용함.
- 생성 및 사용
FunctionCounter counter = FunctionCounter.builder("queue.processed", queue, Queue::processedCount)
.register(registry);
10. FunctionTimer
- 설명
객체의 메서드를 사용하여 시간과 카운트 값을 계산하는 타이머임.
- 생성 및 사용
FunctionTimer timer = FunctionTimer.builder("process.time", processor,
Processor::getCount,
Processor::getTotalTime,
TimeUnit.MILLISECONDS)
.register(registry);
11. Tag
- 설명
메트릭에 추가 정보를 제공하는 키-값 쌍임.
메트릭을 세분화하여 필터링하거나 분류할 때 사용함.
- 사용법
Counter counter = registry.counter("requests.total", Tags.of("method", "GET", "status", "200"));
12. MeterBinder
- 설명
커스텀 또는 외부 리소스의 메트릭을 등록하는 데 사용되는 인터페이스임.
bindTo(MeterRegistry registry) 메서드를 구현하여 메트릭을 등록함.
- 예시
public class MyMetrics implements MeterBinder {
private final MyResource resource;
public MyMetrics(MyResource resource) {
this.resource = resource;
}
@Override
public void bindTo(MeterRegistry registry) {
Gauge.builder("resource.size", resource, MyResource::getSize)
.register(registry);
}
}
이 클래스를 스프링 빈으로 등록하면 자동으로 메트릭이 바인딩 됨.
13. Config
- 설명
MeterRegistry의 설정을 위한 인터페이스임.
메트릭의 기본값이나 공통 태그 등을 설정할 수 있음.
- 사용법
MeterRegistry registry = new SimpleMeterRegistry();
registry.config()
.commonTags("application", "my-app")
.meterFilter(MeterFilter.deny(id -> id.getName().startsWith("jvm")));
14. MeterFilter
- 설명
메트릭의 등록 과정에서 필터링하거나 변환하는 데 사용됨.
- 사용법
registry.config().meterFilter(MeterFilter.deny(id -> id.getName().contains("unwanted.metric")));
사용 예시
1. HTTP 요청 수 카운트
@RestController
public class MyController {
private final Counter requestCounter;
public MyController(MeterRegistry registry) {
this.requestCounter = registry.counter("http.requests.total", "method", "GET");
}
@GetMapping("/hello")
public String hello() {
requestCounter.increment();
return "Hello, World!";
}
}
2. 메서드 실행 시간 측정
@Service
public class MyService {
private final Timer methodTimer;
public MyService(MeterRegistry registry) {
this.methodTimer = registry.timer("service.method.time", "method", "processData");
}
public void processData() {
methodTimer.record(() -> {
// 실제 처리 로직
});
}
}
주요 특징 및 장점
1. 일관된 API
다양한 모니터링 시스템에 관계없이 동일한 코드로 메트릭을 정의하고 사용할 수 있음.
2. 다양한 메트릭 타입 지원
카운터, 게이지, 타이머 등 다양한 유형의 메트릭을 제공하여 다양한 시나리오에 대응할 수 있음.
3. 태그 기반 메트릭
메트릭에 태그를 추가하여 세분화된 모니터링이 가능하며, 필터링 및 집계에 유용함.
4. 확장성
MeterBinder 인터페이스를 통해 커스텀 메트릭이나 외부 라이브러리의 메트릭을 손쉽게 통합할 수 있음.
5. Spring Boot 통합
Spring Boot Actuator와 긴밀하게 연동되어 자동으로 메트릭을 수집하고 노출할 수 있음.
주의 사항
1. 데이터 타입 명시
게이지나 펑션 기반 메트릭을 사용할 때는 데이터 타입에 주의해야 함.
특히 람다 표현식이나 메서드 참조를 사용할 때 불필요한 객체 생성이나 성능 저하가 발생하지 않도록 해야함.
2. 메트릭 이름 규칙
메트릭 이름은 소문자와 점으로 구분된 단어로 구성하는 것이 일반적임.
모니터링 시스템마다 이름 규칙이 다를 수 있으므로 해당 시스템의 가이드라인을 따름.
3. 태그 수 제한
태그의 조합 수가 매우 많아지면 모니터링 시스템에 부하를 줄 수 있음.
필요하지 않은 태그는 지양하고, 태그 값으로 고유 식별자(ID) 등의 변동성이 큰 값을 사용하지 않도록 함.
결론
io.micrometer.core.instrument 패키지는 Micrometer의 핵심 기능을 제공함.
애플리케이션의 다양한 메트릭을 정의하고 관리하는 데 사용됨.
이를 통해 애플리케이션의 성능과 상태를 효율적으로 모니터링할 수 있으며, 문제 발생 시 빠르게 대응할 수 있음.
Micrometer를 활용하면 복잡한 모니터링 시스템 통합 작업을 단순화하고, 코드의 일관성을 유지하면서도 강력한 모니터링 기능을 구현할 수 있음.
'Data Engineering > Zeppelin' 카테고리의 다른 글
[Zeppelin] org.glassfish.hk2 (0) | 2024.09.23 |
---|---|
[Zeppelin] org.eclipse.jetty (0) | 2024.09.20 |
[Zeppelin] Maven 기본 구조 (0) | 2024.09.20 |
[Zeppelin] Maven (2) | 2024.09.18 |
[Zeppelin] SLF4J (0) | 2024.09.18 |