Введение: Почему мониторинг жизненно важен для 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— время пауз GCjvm_threads_live_threads— количество активных потоковprocess_cpu_usage— загрузка CPU процессом
Эти данные уже доступны в Prometheus после первого scrape.
3. Визуализация и алерты в Grafana
Grafana — это интерфейс для построения дашбордов и настройки уведомлений.
3.1. Подключение Prometheus как источника данных
- Зайдите в Configuration → Data Sources → Add data source
- Выберите Prometheus
- Укажите URL:
http://localhost:9090(или адрес вашего Prometheus) - Нажмите 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 минут не было ни одного заказа.