Делал ли мониторинг сервиса
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Мониторинг сервиса в Java приложениях
Да, я активно работал с мониторингом сервисов. Это критически важная часть Production-ready приложений.
Стеки, которые я использовал
1. Prometheus + Grafana
Это индустриальный стандарт для метрик. Я реализовывал:
@Component
public class CustomMetrics {
private final MeterRegistry meterRegistry;
// Счётчик вызовов
private final Counter apiRequests;
// Gauge для текущего значения
private final AtomicInteger activeConnections;
// Timer для latency
private final Timer apiLatency;
public CustomMetrics(MeterRegistry registry) {
this.meterRegistry = registry;
this.apiRequests = Counter.builder("api.requests.total")
.description("Total API requests")
.tag("service", "my-app")
.register(registry);
this.activeConnections = new AtomicInteger(0);
meterRegistry.gauge("api.connections.active", activeConnections);
this.apiLatency = Timer.builder("api.request.latency")
.description("API request latency")
.publishPercentiles(0.5, 0.95, 0.99)
.register(registry);
}
public void recordRequest(long durationMs) {
apiRequests.increment();
apiLatency.record(Duration.ofMillis(durationMs));
}
}
Prometheus scrape'ит эндпоинт /actuator/prometheus каждые 15 секунд, потом Grafana визуализирует графики.
2. ELK Stack (Elasticsearch + Logstash + Kibana)
Для логирования и трейсинга я использовал ELK:
@Slf4j
@Component
public class OrderService {
public void processOrder(Order order) {
MDC.put("order_id", order.getId().toString());
MDC.put("user_id", order.getUserId().toString());
try {
log.info("Processing order",
Map.of("status", "started", "amount", order.getTotal()));
// Бизнес-логика
log.info("Order processed",
Map.of("status", "completed"));
} catch (Exception e) {
log.error("Failed to process order",
Map.of("status", "failed", "error", e.getMessage()), e);
} finally {
MDC.clear();
}
}
}
Logstash парсит JSON логи и отправляет в Elasticsearch. В Kibana я создавал дашборды для анализа.
3. Distributed Tracing: Jaeger + OpenTelemetry
Для отслеживания запросов через микросервисы:
@Configuration
public class TracingConfig {
@Bean
public OpenTelemetry openTelemetry() {
return OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder()
.addSpanProcessor(
JaegerThriftSpanExporter.builder()
.setEndpoint("http://jaeger:14250")
.build()
)
.build()
)
.build();
}
}
Каждый запрос получает trace_id, который проходит через все сервисы. Jaeger UI показывает время в каждом сервисе.
4. Health Checks и Readiness Probes
Для Kubernetes:
@Component
public class DatabaseHealthIndicator extends AbstractHealthIndicator {
@Override
protected void doHealthCheck(Health.Builder builder) {
try {
// Проверь подключение к БД
template.queryForObject("SELECT 1", Integer.class);
builder.up()
.withDetail("database", "PostgreSQL")
.withDetail("connection", "OK");
} catch (Exception e) {
builder.down()
.withException(e);
}
}
}
@RestController
@RequestMapping("/health")
public class HealthController {
@GetMapping("/live") // liveness probe
public ResponseEntity<String> isAlive() {
return ResponseEntity.ok("OK");
}
@GetMapping("/ready") // readiness probe
public ResponseEntity<?> isReady(HealthEndpoint endpoint) {
Health health = endpoint.health();
if (health.getStatus() == Status.UP) {
return ResponseEntity.ok(health);
}
return ResponseEntity.status(503).body(health);
}
}
Инструменты которые я использовал
| Инструмент | Задача | Интеграция |
|---|---|---|
| Prometheus | Сбор метрик | Micrometer + Spring Boot Actuator |
| Grafana | Визуализация | Prometheus datasource |
| Jaeger | Distributed tracing | OpenTelemetry exporter |
| ELK | Логи и анализ | Logstash + Filebeat |
| Datadog | APM и мониторинг | Java agent |
| PagerDuty | Алерты | Интеграция с Grafana |
| New Relic | Полный APM | New Relic Java agent |
Типичная Setup в Production
# docker-compose.yml
services:
my-app:
image: my-app:latest
ports:
- "8080:8080"
environment:
OTEL_EXPORTER_JAEGER_ENDPOINT: http://jaeger:14250
depends_on:
- prometheus
- jaeger
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_PASSWORD: admin
jaeger:
image: jaegertracing/all-in-one
ports:
- "16686:16686"
Ключевые метрики которые я мониторил
- Request Rate — количество запросов в секунду
- Latency (p50, p95, p99) — время ответа
- Error Rate — процент неудачных запросов
- Database Connection Pool — использованные соединения
- Memory Usage — heap и non-heap memory
- GC Pause Time — время garbage collection
- Thread Count — активные потоки
- Queue Depth — размер очередей в системе
Алерты которые я настраивал
# prometheus alert rules
groups:
- name: application
rules:
- alert: HighErrorRate
expr: rate(api_errors_total[5m]) > 0.05
for: 5m
annotations:
summary: "High error rate detected"
- alert: SlowRequests
expr: histogram_quantile(0.95, api_latency) > 500
for: 10m
annotations:
summary: "p95 latency over 500ms"
- alert: LowDiskSpace
expr: node_filesystem_free_bytes < 1e9
annotations:
summary: "Less than 1GB free space"
Итог
Мониторинг сервиса — это не optional, это необходимость для Production. Я использовал комбинацию Prometheus + Grafana для метрик, ELK для логов, и Jaeger для трейсинга. Эта трёхуровневая система (metrics, logs, traces) позволяет быстро диагностировать любые проблемы.