Мониторинг Kotlin приложений: метрики и алерты от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему мониторинг жизненно важен для Kotlin-приложений

Современные Kotlin-приложения, работающие на JVM (Java Virtual Machine), часто становятся критическими узлами инфраструктуры. Без надлежащего мониторинга вы рискуете столкнуться с внезапными сбоями, утечками памяти или деградацией производительности, которые останутся незамеченными до момента инцидента. В этой статье мы разберем, как построить полноценную систему мониторинга Kotlin-приложений «от А до Я»: от сбора базовых метрик (CPU, память, GC) до настройки алертов в Grafana и Prometheus.

Мы рассмотрим три ключевых инструмента: Micrometer (фасад для метрик), Prometheus (хранилище и сборщик) и Grafana (визуализация и алерты). Все примеры кода написаны на Kotlin.

1. Основы сбора метрик: Micrometer и Prometheus

Micrometer — это де-факто стандартный фасад для мониторинга в экосистеме Spring и Kotlin. Он предоставляет единый API для отправки метрик в различные системы (Prometheus, Datadog, New Relic и др.).

1.1. Подключение зависимостей (Gradle)

dependencies {
    implementation("io.micrometer:micrometer-registry-prometheus:1.12.0")
    implementation("org.springframework.boot:spring-boot-starter-actuator")
}

Для Ktor или чистого Kotlin без Spring можно добавить только micrometer-core и micrometer-registry-prometheus.

1.2. Базовая конфигурация Micrometer в Spring Boot

В application.yml достаточно включить Actuator и Prometheus endpoint:

management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus
  metrics:
    export:
      prometheus:
        enabled: true

После запуска приложения метрики будут доступны по адресу /actuator/prometheus.

1.3. Создание собственных метрик (пример на Kotlin)

Допустим, вы хотите считать количество обработанных заказов и время их обработки:

import io.micrometer.core.instrument.MeterRegistry
import io.micrometer.core.instrument.Timer
import org.springframework.stereotype.Service
import java.util.concurrent.atomic.AtomicLong

@Service
class OrderService(private val registry: MeterRegistry) {

    private val processedOrders: AtomicLong = registry.gauge(
        "orders.processed.count",
        AtomicLong(0)
    )
    private val orderProcessingTime: Timer = registry.timer("orders.processing.time")

    fun processOrder(orderId: String) {
        val sample = Timer.start()
        try {
            // Логика обработки заказа
            Thread.sleep((50..200).random().toLong())
            processedOrders.incrementAndGet()
        } finally {
            sample.stop(orderProcessingTime)
        }
    }
}

Теперь метрики orders_processed_count и orders_processing_time_seconds появятся в Prometheus.

2. Настройка Prometheus для сбора метрик

Prometheus — это сервер, который «скрапит» (запрашивает) метрики с ваших приложений по расписанию.

2.1. Конфигурация prometheus.yml

Добавьте ваш Kotlin-сервис как цель (target):

scrape_configs:
  - job_name: 'kotlin-app'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['localhost:8080']

Если приложение работает в Docker/Kubernetes, используйте service discovery.

2.2. Важные метрики JVM по умолчанию

Micrometer автоматически экспортирует множество метрик JVM:

  • jvm_memory_used_bytes — используемая память (heap/non-heap)
  • jvm_gc_pause_seconds — время пауз GC
  • jvm_threads_live_threads — количество активных потоков
  • process_cpu_usage — загрузка CPU процессом

Эти данные уже доступны в Prometheus после первого scrape.

3. Визуализация и алерты в Grafana

Grafana — это интерфейс для построения дашбордов и настройки уведомлений.

3.1. Подключение Prometheus как источника данных

  1. Зайдите в Configuration → Data Sources → Add data source
  2. Выберите Prometheus
  3. Укажите URL: http://localhost:9090 (или адрес вашего Prometheus)
  4. Нажмите Save & Test

3.2. Построение дашборда производительности

Создайте панели для ключевых метрик:

  • Использование CPU: rate(process_cpu_usage[1m])
  • Память heap: jvm_memory_used_bytes{area="heap"}
  • Время GC: rate(jvm_gc_pause_seconds_sum[5m])
  • Количество заказов в минуту: rate(orders_processed_count[1m])

3.3. Настройка алертов (Alerting)

Алерты позволяют получать уведомления (email, Telegram, Slack) при выходе метрик за допустимые границы.

Пример правила для алерта «Высокая загрузка CPU»:

groups:
  - name: kotlin-alerts
    rules:
      - alert: HighCpuUsage
        expr: process_cpu_usage > 0.8
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU usage > 80% for 5 minutes"
          description: "CPU usage is {{ $value }} on instance {{ $labels.instance }}"

В Grafana можно настроить контактные точки (Contact points) для отправки уведомлений в Telegram через бота или в Slack.

4. Продвинутые техники: алерты на бизнес-метрики и логи

Мониторинг не ограничивается техническими метриками. Добавьте бизнес-алерты:

  • Падение количества заказов: rate(orders_processed_count[10m]) < 1 — если за 10 минут не было ни одного заказа.

Блоги

Рекомендаций по книгам