Prometheus简介和代码样例
一、Prometheus简介
(一)定义与功能
- 数据采集与存储
- Prometheus是一个开源的系统监控和警报工具包。它专注于从各种目标(如应用程序、服务器等)采集指标数据,并将这些数据存储在自己的时间序列数据库中。例如,它可以采集服务器的CPU使用率、内存使用量、网络流量等指标,也可以采集应用程序内部自定义的业务指标,如某个微服务的每秒请求数量、请求响应时间等。
- 多维数据模型
- 采用多维数据模型,数据以指标(metric)的形式存在,每个指标都有名称和一组键值对标签(labels)。这些标签用于区分不同维度的数据。例如,对于服务器的CPU使用率指标,可以有标签如“server_name”(服务器名称)、“environment”(环境,如生产环境或测试环境)等,这样就可以方便地对不同服务器在不同环境下的CPU使用率进行查询和分析。
- 强大的查询语言(PromQL)
- Prometheus提供了PromQL(Prometheus Query Language),这是一种灵活而强大的查询语言。通过PromQL,可以对采集到的指标数据进行各种复杂的查询操作。例如,可以查询特定时间段内某个服务器的平均CPU使用率,或者查询所有处于生产环境的服务器中内存使用量超过某个阈值的服务器数量等。
- 可视化和告警
- 虽然Prometheus本身提供了一个简单的表达式浏览器用于查询和可视化数据,但通常会与Grafana等可视化工具集成,以创建丰富的仪表盘来展示监控数据。此外,Prometheus可以根据预定义的规则进行告警,当指标数据满足一定条件(如CPU使用率超过90%持续5分钟)时,可以触发告警,通过邮件、短信或其他通知方式告知相关人员。
(二)架构组成
- Prometheus Server
- 这是Prometheus的核心组件,负责从配置的目标(exporters和服务发现机制发现的目标)采集指标数据、存储数据到本地的时间序列数据库,并对数据进行查询处理。例如,它会定期从安装了Node Exporter(用于采集服务器指标的工具)的服务器上采集指标数据。
- Exporters
- Exporters是一些专门用于将各种系统或应用的指标数据转换为Prometheus能够理解的格式并暴露出来的工具。例如,有Node Exporter用于采集Linux服务器的指标,MySQL Exporter用于采集MySQL数据库的指标,还有用于采集Java应用指标的JMX Exporter等。不同的Exporters可以方便地将不同类型的目标数据提供给Prometheus采集。
- Service Discovery(服务发现)
- Prometheus支持多种服务发现机制,如基于文件的服务发现、DNS服务发现、Kubernetes服务发现等。通过服务发现,Prometheus可以自动发现需要采集指标数据的目标,而不需要手动配置每个目标的地址。例如,在Kubernetes环境中,Prometheus可以通过Kubernetes的服务发现机制自动找到所有运行的Pod并采集它们的指标数据。
二、代码样例
(一)在Spring Boot应用中集成Prometheus(使用Micrometer)
-
添加依赖
- 在基于Maven构建的Spring Boot项目中,添加以下依赖:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer - prometheus - registry</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring - boot - starter - actuator</artifactId> </dependency>
- 这里,
micrometer - prometheus - registry
用于将Micrometer的指标数据以Prometheus格式暴露出来,spring - boot - starter - actuator
提供了应用的监控端点,包括用于Prometheus采集的/metrics
端点。
-
配置Actuator
- 在
application.yml
或application.properties
中配置Actuator,以暴露Prometheus需要的端点:
management: endpoints: web: exposure: - prometheus metrics: export: prometheus: enabled: true
- 这样就配置了Actuator,使得Prometheus可以从
/metrics
端点采集指标数据。
- 在
-
自定义指标(可选)
- 如果需要定义自己的业务指标,可以使用Micrometer的API。例如,以下是一个简单的计数器指标示例:
import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.MeterRegistry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyMetrics { private final Counter myCounter; @Autowired public MyMetrics(MeterRegistry meterRegistry) { myCounter = meterRegistry.counter("my_custom_counter"); } public void incrementCounter() { myCounter.increment(); } }
- 在这个示例中,定义了一个名为“my_custom_counter”的计数器指标,并且提供了一个方法来递增这个计数器。这个自定义指标可以用于统计某个业务操作(如用户登录次数等)的发生次数。
-
启动应用并查看指标
- 启动Spring Boot应用后,可以通过访问
http://[host]:[port]/actuator/metrics
查看所有暴露的指标数据,其中包括系统自动采集的指标(如JVM指标、HTTP请求指标等)以及自定义的指标。如果要以Prometheus格式查看,可以访问http://[host]:[port]/actuator/prometheus
,这里的[host]
和[port]
是Spring Boot应用的主机地址和端口号。
- 启动Spring Boot应用后,可以通过访问