← Назад к вопросам

Делал ли мониторинг сервиса

1.7 Middle🔥 171 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Мониторинг сервиса в 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
JaegerDistributed tracingOpenTelemetry exporter
ELKЛоги и анализLogstash + Filebeat
DatadogAPM и мониторингJava agent
PagerDutyАлертыИнтеграция с Grafana
New RelicПолный APMNew 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"

Ключевые метрики которые я мониторил

  1. Request Rate — количество запросов в секунду
  2. Latency (p50, p95, p99) — время ответа
  3. Error Rate — процент неудачных запросов
  4. Database Connection Pool — использованные соединения
  5. Memory Usage — heap и non-heap memory
  6. GC Pause Time — время garbage collection
  7. Thread Count — активные потоки
  8. 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) позволяет быстро диагностировать любые проблемы.