java
CHAPTER 88 / 99
읽기 약 2분
FUNCTION
모니터링: Actuator + Prometheus
핵심 개념
Spring Boot Actuator·Prometheus 메트릭·Grafana 대시보드 — 서버 상태 모니터링.
본문
Actuator 의존성
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'application.yml
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus,env
base-path: /actuator
endpoint:
health:
show-details: when-authorized
probes:
enabled: true
metrics:
tags:
application: ${spring.application.name}
env: ${spring.profiles.active}
prometheus:
metrics:
export:
enabled: true기본 엔드포인트
GET /actuator/health
{"status": "UP"}
GET /actuator/health/liveness
GET /actuator/health/readiness
GET /actuator/metrics
{"names": ["jvm.memory.used", "http.server.requests", ...]}
GET /actuator/metrics/jvm.memory.used
{"name": "jvm.memory.used", "measurements": [...]}
GET /actuator/prometheus
# Prometheus exposition 형식
# HELP jvm_memory_used_bytes ...
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{area="heap"} 123456789커스텀 헬스 체크
@Component
@RequiredArgsConstructor
public class DatabaseHealthIndicator implements HealthIndicator {
private final DataSource dataSource;
@Override
public Health health() {
try (Connection conn = dataSource.getConnection()) {
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 1")) {
if (rs.next()) {
return Health.up()
.withDetail("database", "PostgreSQL")
.build();
}
}
} catch (SQLException e) {
return Health.down(e).build();
}
return Health.unknown().build();
}
}
@Component
@RequiredArgsConstructor
public class ExternalApiHealthIndicator implements HealthIndicator {
private final RestTemplate restTemplate;
@Override
public Health health() {
try {
ResponseEntity<String> response = restTemplate.getForEntity(
"https://api.example.com/health", String.class
);
if (response.getStatusCode().is2xxSuccessful()) {
return Health.up().build();
}
} catch (Exception e) {
return Health.down(e).build();
}
return Health.down().build();
}
}커스텀 메트릭
@Component
@RequiredArgsConstructor
public class OrderMetrics {
private final MeterRegistry registry;
private Counter orderCount;
private Timer orderDuration;
@PostConstruct
void init() {
orderCount = Counter.builder("orders.total")
.description("총 주문 수")
.tag("service", "order")
.register(registry);
orderDuration = Timer.builder("orders.duration")
.description("주문 처리 시간")
.register(registry);
}
public void recordOrder(String status) {
orderCount.increment();
}
public <T> T timeOrderProcess(Supplier<T> action) {
return orderDuration.record(action);
}
}
@Service
public class OrderService {
@Timed(value = "orders.processing", description = "주문 처리")
public Order placeOrder(OrderRequest req) {
// ... 자동으로 메트릭 기록
}
}Prometheus 설정
# prometheus.yml
scrape_configs:
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
scrape_interval: 15s
static_configs:
- targets: ['app:8080']Grafana 대시보드
주요 패널:
- JVM Memory (heap/non-heap)
- HTTP requests rate by status (200/400/500)
- HTTP request duration P50/P95/P99
- DB connection pool (active/idle)
- Custom: orders/min, error rate
- Cache hit rate다음 챕터
CH.20 "CI/CD: GitHub Actions + Docker" — PR → 자동 배포.
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 Spring 코드의 Actuator + Prometheus 부분을 분석해서 메트릭 설계·알람와 개선 우선순위를 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
Actuator + Prometheus vs 다른 패턴 비교를 실전 사례 5개로 보여주고 Prometheus vs DataDog vs NewRelic를 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 코드베이스 전체를 분석해서 Actuator + Prometheus 관련 미모니터링 영역를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 한국 기업의 Actuator + Prometheus 채택률과 한국 SaaS 모니터링 스택를 솔직히 알려줘.
⭐ 이것만 기억하세요
모니터링: Actuator + Prometheus는 이 3가지만 확실히 잡으세요
1.Actuator + Micrometer + Prometheus + Grafana = 표준 Spring 모니터링 스택
2.커스텀 헬스 + 메트릭으로 비즈니스 KPI 추적 (주문/결제/사용자)
3.다음 챕터 CH.20에서 CI/CD — 자동 배포 파이프라인
공유하기
진행도 88 / 99