引言:为什么监控是生产环境稳定性的基石
\n\n在现代开发中,编写代码只是工作的一半。为了让 Kotlin 应用在负载下稳定运行,必须了解其内部状态。基本的日志和健康检查只能提供表面信息。通过指标和告警实现的高级监控,不仅能记录故障,还能预测故障、发现瓶颈并快速响应异常。在本文中,我们将探讨如何基于 Micrometer + Prometheus + Alertmanager + Grafana 技术栈,为 Kotlin 应用构建一套生产就绪的监控系统。\n
\n\n1. 使用 Micrometer 和 Prometheus 收集指标
\n\nMicrometer 是一个指标收集门面,实际上已成为 JVM 和 Kotlin 世界的标准。它支持多种后端:Prometheus、Datadog、New Relic 等。对于 Kotlin 应用(Spring Boot、Ktor、http4k),集成非常简单。\n
\n\n1.1. 引入与配置
\n在 build.gradle.kts 中添加必要的依赖:
// 对于 Spring Boot\nimplementation("io.micrometer:micrometer-registry-prometheus")\n\n// 对于 Ktor(手动配置)\nimplementation("io.micrometer:micrometer-core:1.12.0")\nimplementation("io.micrometer:micrometer-registry-prometheus:1.12.0")\n\n对于 Spring Boot,会自动创建一个 MeterRegistry Bean。在 Ktor 中,您需要手动初始化它:
import io.micrometer.prometheus.PrometheusMeterRegistry\nimport io.micrometer.core.instrument.Clock\nimport io.prometheus.client.CollectorRegistry\n\nval registry = PrometheusMeterRegistry(\n PrometheusConfig.DEFAULT,\n CollectorRegistry.defaultRegistry,\n Clock.SYSTEM\n)\n\n// 导出 /metrics 端点\nembeddedServer(Netty, port = 8080) {\n routing {\n get("/metrics") {\n call.respondText(registry.scrape())\n }\n }\n}.start(wait = true)\n\n1.2. 自定义指标
\n除了标准指标(JVM、CPU、内存),还要添加业务指标。以下是已处理订单计数器的示例:
\nval orderCounter = Counter.builder("orders.processed")\n .description("Total processed orders")\n .register(registry)\n\nfun processOrder(order: Order) {\n // 业务逻辑\n orderCounter.increment()\n}\n\n或者用于请求执行时间的直方图:
\nval requestTimer = Timer.builder("http.requests.duration")\n .description("Duration of HTTP requests")\n .publishPercentiles(0.5, 0.95, 0.99)\n .sla(Duration.ofMillis(100), Duration.ofMillis(500))\n .register(registry)\n\nfun handleRequest(block: () -> Response): Response {\n return requestTimer.record(block)\n}\n\n2. 高级告警:从阈值到预测
\n\n基于简单阈值(例如 CPU > 90%)的告警常常产生误报。在高级层面,我们使用 Alertmanager 和带有聚合与预测功能的 PromQL 规则。\n
\n\n2.1. 配置 Alertmanager
\n用于向 Telegram 和 Slack 发送通知的 alertmanager.yml 配置:
route:\n receiver: 'team-alerts'\n group_wait: 30s\n group_interval: 5m\n repeat_interval: 1h\n\nreceivers:\n- name: 'team-alerts'\n telegram_configs:\n - bot_token: 'YOUR_BOT_TOKEN'\n chat_id: -123456789\n parse_mode: 'HTML'\n slack_configs:\n - api_url: 'https://hooks.slack.com/services/...'\n channel: '#alerts'\n\n2.2. 用于智能告警的 PromQL 规则
\n在 rules.yml 中,我们描述一个规则:当响应时间的第 95 百分位数在 5 分钟内超过 500 毫秒时触发:
groups:\n- name: http_latency\n rules:\n - alert: HighLatencyP95\n expr: |\n histogram_quantile(0.95,\n sum(rate(http_requests_duration_seconds_bucket[5m])) by (le, endpoint)\n ) > 0.5\n for: 5m\n ann