在现代的分布式系统中,监控和报警是确保系统健康运行的重要组成部分。Prometheus 是一个开源的系统监控和报警工具包,它能够高效地收集和查询指标数据。本文将介绍如何在 Java 应用程序中集成 Prometheus 进行监控,并配置报警规则。
Prometheus 是由 SoundCloud 开发的一个开源监控系统和时间序列数据库。它通过 HTTP 拉取指标、支持多维数据模型、强大的查询语言(PromQL)以及灵活的报警机制,成为众多微服务架构的理想选择。
要将 Prometheus 集成到 Java 应用中,首先需要添加相关的 Maven 或 Gradle 依赖项。这里我们以 Maven 为例:
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient</artifactId>
<version>0.15.0</version>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_hotspot</artifactId>
<version>0.15.0</version>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_servlet</artifactId>
<version>0.15.0</version>
</dependency>
接下来,我们需要创建一个 /metrics
端点,以便 Prometheus 可以拉取指标数据。
import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.exporter.MetricsServlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class PrometheusMetricsServlet extends MetricsServlet {
public PrometheusMetricsServlet(CollectorRegistry registry) {
super(registry);
}
}
// 注册 Servlet
import io.prometheus.client.CollectorRegistry;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
@WebServlet(name = "prometheusMetricsServlet", urlPatterns = "/metrics",
initParams = {@WebInitParam(name = "registry", value = "default")})
public class PrometheusMetricExporter extends PrometheusMetricsServlet {
public PrometheusMetricExporter() {
super(CollectorRegistry.defaultRegistry);
}
}
我们可以定义一些自定义的指标来监控业务逻辑。
import io.prometheus.client.Gauge;
public class CustomMetrics {
private static final Gauge requestsInFlight =
Gauge.build()
.name("http_requests_in_flight")
.help("The number of HTTP requests in flight.")
.register();
public static void incrementRequests() {
requestsInFlight.inc();
}
public static void decrementRequests() {
requestsInFlight.dec();
}
}
在 Prometheus 的配置文件 prometheus.yml
中添加以下内容,以告诉 Prometheus 哪里可以找到我们的 Java 应用程序的指标。
scrape_configs:
- job_name: 'java_app'
metrics_path: '/metrics'
static_configs:
- targets: ['localhost:8080']
然后重启 Prometheus 服务以使更改生效。
Prometheus 自身并不直接发送报警信息,而是通过 Alertmanager 来管理报警通知。
在 Prometheus 的配置目录下创建一个 alert.rules
文件,定义报警规则。
groups:
- name: example
rules:
- alert: HighRequestLatency
expr: http_request_duration_seconds{job="java_app"} > 0.5
for: 1m
labels:
severity: page
annotations:
summary: "High request latency on {{ $labels.instance }}"
description: "{{ $labels.instance }} has had high request latency for more than 1 minute."
在 Alertmanager 的配置文件 alertmanager.yml
中设置接收报警的方式。
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'admin@example.com'
然后启动 Alertmanager 和 Prometheus,确保它们能够相互通信。
通过以上步骤,我们成功地在 Java 应用程序中集成了 Prometheus 监控,并配置了报警规则。这使得我们可以实时监控应用程序的状态并在出现问题时及时收到通知。