这里有一份全面的指南,介绍如何将Prometheus集成到Java Spring Boot应用中,用于度量、警报和日志。
普罗米修斯是一个开源的监控和警报系统,最初由SoundCloud开发。它专为云原生环境中的可靠性和可扩展性而设计,确保能够在这些环境中稳定运行,并且是云原生计算基金会的一部分。普罗米修斯特别适合捕获和查询时序数据,使其非常适合用于应用监控。
普罗米修斯无缝集成了 Spring Boot,利用 Micrometer 提供应用程序指标。Micrometer 起到桥梁作用,让各种指标可以被普罗米修斯收集。
第一步:添加依赖库
在你的 pom.xml
中添加 Spring Boot 和 Micrometer 所需的依赖。
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
这会引入Micrometer的Prometheus注册表,它会以Prometheus友好的格式收集并发布指标。
在 application.properties
中启用 Spring Boot 指标,以暴露相关指标信息。
# Prometheus指标暴露配置 management.endpoints.web.exposure.include=prometheus # Prometheus端点启用配置 management.endpoint.prometheus.enabled=true # Prometheus指标导出启用配置 management.metrics.export.prometheus.enabled=true
Prometheus 指标数据将在 /actuator/prometheus
端点路径提供。你可以在 http://localhost:8080/actuator/prometheus
查看这些原始指标数据。
为了让 Prometheus 从你的 Spring Boot 应用程序中抓取指标数据,更新你的 prometheus.yml
配置文件以定义一个抓取作业。
scrape_configs: - job_name: 'spring-boot' metrics_path: '/actuator/prometheus' static_configs: - targets: ['localhost:8080']
注:以上为 YAML 配置,用于配置监控 spring-boot 应用程序的指标路径和目标地址。
此配置让Prometheus从运行在localhost:8080
的Spring Boot应用程序中抓取指标。
你可以通过Micrometer的API在Spring Boot中定义你自己的指标。
要跟踪特定端点被访问的次数,请使用Counter
指标。
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Counter; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class 自定义指标控制器 { private final Counter 访问计数器; public 自定义指标控制器(MeterRegistry registry) { this.访问计数器 = Counter.builder("custom_metric_access_counter") .description("描述了对自定义端点访问次数的说明") .register(registry); } @GetMapping("/custom") public String 自定义端点() { 访问计数器.increment(); return "访问了自定义端点"; } }
每当访问 /custom
时,accessCounter
会加一,从而让 Prometheus 能记录和监控这个指标。
普罗米修斯的警报规则配置在alert_rules.yml
文件中。根据特定的指标和条件来设定规则。
我们来设置一个触发警报,如果自定义端点被频繁访问,这可能意味着流量模式不正常。
groups: - name: spring-boot-alerts rules: - alert: 高访问率 expr: rate(custom_metric_access_counter[5m]) > 5 for: 1m labels: severity: 警告 annotations: summary: "检测到自定义端点高访问率" description: "在最近的5分钟内,/custom端点的访问计数器每分钟的访问次数超过了5次。"
这条规则监控 /custom
端点的访问频率,并在访问频率每分钟超过5次且在五分钟内持续时触发警告。
普罗米修斯可以将警报转发到 AlertManager 以便进行通知管理。AlertManager 可以将警报发送到各种通知渠道,例如邮件、Slack 或 PagerDuty。
要配置AlertManager插件,请创建或编辑一个config.yml
文件,指定您的通知偏好。
global: resolve_timeout: 5m route: receiver: 'slack-notifications' receivers: - name: 'slack-notifications' slack_configs: - send_resolved: true api_url: 'https://hooks.slack.com/services/your/webhook/url' channel: '#alerts' text: "警报: {{ .摘要 }}"
此配置会将警报发送到指定的 Slack 频道。
Prometheus 不是作为日志工具来设计的,但它可以通过 Grafana
将日志与指标关联起来。Grafana 可以将日志和指标拉取到同一个视图中,帮助你发现模式和趋势并排查问题。
Grafana 是一个强大的工具,用于可视化并分析收集自 Prometheus 的指标。
配置 > 数据源
并将 Prometheus 添加为数据源。假设你想监控并针对某个端点的高延迟发出警报信息,该端点位于你的 Spring Boot 应用中。
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Timer; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class LatencyMetricsController { private final Timer timer; public LatencyMetricsController(MeterRegistry registry) { this.timer = Timer.builder("custom_latency_metric") .description("延迟端点的延迟情况") .register(registry); } @GetMapping("/latency") public String latencyEndpoint() { return timer.record(() -> { // 模拟任务 try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } return "延迟已跟踪!"; }); } }
timer
度量记录了处理 /latency
端点所需的时间。
3. 设置延迟警告提醒
- alert: 高延迟警报 expr: histogram_quantile(0.9, rate(custom_latency_metric_bucket[5m])) > 200 for: 1m labels: severity: critical annotations: summary: "/latency 端点延迟过高" description: "/latency 端点延迟较高(90%分位数 > 200毫秒)。
将Prometheus与Spring Boot集成后,您将获得强大的监控能力。此设置允许您跟踪自定义应用指标,为关键性能指标(KPI)设置警报,并可视化指标。在生产环境中,您可以扩展此设置,使用Grafana和AlertManager来构建完整的可观测性栈。