一、Micrometer 简介
Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,它提供了多种度量指标类型(Timers、Guauges、Counters等),同时支持接入不同的监控系统,例如 Influxdb、Graphite、Prometheus 等。我们可以通过 Micrometer 收集 Java 性能数据,配合 Prometheus 监控系统实时获取数据,并最终在 Grafana 上展示出来,从而很容易实现应用的监控。
Micrometer 中有两个最核心的概念,分别是计量器(Meter)和计量器注册表(MeterRegistry)。计量器用来收集不同类型的性能指标信息,Micrometer 提供了如下几种不同类型的计量器:
计数器(Counter): 表示收集的数据是按照某个趋势(增加/减少)一直变化的,也是最常用的一种计量器,例如接口请求总数、请求错误总数、队列数量变化等。
计量仪(Gauge): 表示搜集的瞬时的数据,可以任意变化的,例如常用的 CPU Load、Mem 使用量、Network 使用量、实时在线人数统计等,
计时器(Timer): 用来记录事件的持续时间,这个用的比较少。
分布概要(Distribution summary): 用来记录事件的分布情况,表示一段时间范围内对数据进行采样,可以用于统计网络请求平均延迟、请求延迟占比等。
二、springboot项目集成Micrometer
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.5.1</version>
</dependency>
这里引入了 io.micrometer 的 micrometer-registry-prometheus 依赖以及 spring-boot-starter-actuator 依赖,因为该包对 Prometheus 进行了封装,可以很方便的集成到 Spring Boot 工程中。
配置application.yml文件
spring:
application:
name: springboot2-prometheus
management:
endpoints:
web:
exposure:
include: '*'
metrics:
tags:
application: ${spring.application.name}
management.endpoints.web.exposure.include 配置为开启 Actuator 服务,因为Spring Boot Actuator 会自动配置一个 URL 为 /actuator/Prometheus 的 HTTP 服务来供 Prometheus 抓取数据,不过默认该服务是关闭的,该配置将打开所有的 Actuator 服务。management.metrics.tags.application 配置会将该工程应用名称添加到计量器注册表的 tag 中去,方便后边 Prometheus 根据应用名称来区分不同的服务。
注册MeterRegistryCustomizer
@Configuration
public class MicrometerConfig {
@Value("${spring.application.name}")
private String applicationName;
@Bean
MeterRegistryCustomizer configurer(MeterRegistry meterRegistry) {
return registry -> meterRegistry.config().commonTags("application", applicationName);
}
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
}
启动服务,访问http://127.0.0.1:8099/actuator/prometheus
三、Prometheus简介
什么是Prometheus?
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。
2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目。
Prometheus目前在开源社区相当活跃。
Prometheus和Heapster(Heapster是K8S的一个子项目,用于获取集群的性能数据。)相比功能更完善、更全面。Prometheus性能也足够支撑上万台规模的集群。
Prometheus的特点:
多维度数据模型。
灵活的查询语言。
不依赖分布式存储,单个服务器节点是自主的。
通过基于HTTP的pull方式采集时序数据。
可以通过中间网关进行时序列数据推送。
通过服务发现或者静态配置来发现目标服务对象。
支持多种多样的图表和界面展示,比如Grafana等。
基本原理:
Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。
服务过程:
1、Prometheus Daemon负责定时去目标上抓取metrics(指标)数据,每个抓取目标需要暴露一个http服务的接口给它定时抓取。Prometheus支持通过配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup等方式指定抓取目标。Prometheus采用PULL的方式进行监控,即服务器可以直接通过目标PULL数据或者间接地通过中间网关来Push数据。
2、Prometheus在本地存储抓取的所有数据,并通过一定规则进行清理和整理数据,并把得到的结果存储到新的时间序列中。
3、Prometheus通过PromQL和其他API可视化地展示收集的数据。Prometheus支持很多方式的图表可视化,例如Grafana、自带的Promdash以及自身提供的模版引擎等等。Prometheus还提供HTTP API的查询方式,自定义所需要的输出。
4、PushGateway支持Client主动推送metrics到PushGateway,而Prometheus只是定时去Gateway上抓取数据。
5、Alertmanager是独立于Prometheus的一个组件,可以支持Prometheus的查询语句,提供十分灵活的报警方式。
这里为了快速方便启动 Prometheus、Grafana 服务,我使用 Docker 方式启动,所以本机需要安装好 Docker 环境
安装Prometheus
docker run --name prometheus -d -p 9090:9090 prom/prometheus:latest
这里默认 Prometheus 开放 9090 端口
http://192.168.25.129:9090/graph
Prometheus 默认配置文件 prometheus.yml 在容器内路径为 /etc/prometheus/prometheus.yml
进入容器
docker exec -it dfdaaffd5a94 /bin/sh
修改prometheus.yml文件
vi /etc/prometheus/prometheus.yml
增加metrics_path: ‘/actuator/prometheus’
targets: [‘192.168.1.79:8099’] 是监控springboot搭建的服务
static_configs:
- targets: ['192.168.1.79:8099'] ---是监控springboot搭建的服务
labels:
instance: springboot2-prometheus --应用实例名称,自己定义
service: demo-service --应用服务名称,自己定义
重启容器
docker restart dfdaaffd5a94
访问http://192.168.25.129:9090/targets 可以看到监控springboot项目连接成功
四、Grafana Dashboard可视化监控指标
docker安装grafana
docker run -d -p 3000:3000 --name=grafana grafana/grafana
启动完毕后,浏览器访问 http://ip:3000 即可,首次登录使用 admin:admin 默认账户密码登录并修改密码。登录完毕,需要添加数据源,这里我们要添加的就是上边 Prometheus 数据源,配置如下图:
配置完毕,接下来需要导入对应的监控 JVM 的 Dashboard 模板,模板编号为 4701
导入后就能看到jvm的各种指标
五、自定义监控指标并展示到 Grafana
上边是 spring-boot-actuator 集成了 Micrometer 来提供的默认监控项,覆盖 JVM 各个层间的监控,配合 Grafana Dashboard 模板基本可以满足我们日常对 Java 应用的监控。当然,它也支持自定义监控指标,实现各个方面的监控,例如统计访问某一个 API 接口的请求数,统计实时在线人数、统计实时接口响应时间等功能,而这些都可以通过使用上边的四种计量器来实现。接下来,来演示下如何自定义监控指标并展示到 Grafana 上。
1、监控某几个 API 请求次数
在项目中创建一个IndexController 类,并创建接口,每次请求该接口就counter.increment()增加一次
public class IndexController {
@Autowired
private MeterRegistry meterRegistry;
private Counter counter;
@RequestMapping(value="/user")
public String getUser() {
counter = meterRegistry.counter("app_requests_method_count", "method", "IndexController.index");
counter.increment();
log.info("请求总次数:{}", counter.count());
return "李冰冰";
}
请求/user接口,然后登陆prometheus,查询可以看到请求了7次
#查询语句
app_requests_method_count_total{application="springboot2-prometheus", instance="springboot2-prometheus", method="IndexController.index"}
可以看到正确统计出来这两个接口请求的访问数,这里解释一下查询语句:app_requests_method_count_total{application=“springboot2-prometheus”, instance=“springboot2-prometheus”, method=“IndexController.index”}
app_requests_method_count_total 为上边代码中设置的 Counter 名称。
application 为初始化 registry 时设置的通用标签,标注应用名称,这样做好处就是可以根据应用名称区分不同的应用。
instance 为 prometheus.yml 中配置的 instance 实例名称,用来区分应用实例。
method 为上边代码中设置的 Counter 标签名称,可以用来区分不同的方法,这样就不用为每一个方法设置一个 Counter 了。
然后在grafana中创建自定义panel, 把上面的查询语句放进去展示上面的内容
#我们发现视图中的查询application和instance 替换成了$application和$instance, 这是因为我们设置了变量,不需要每次对相同的内容,每次都设置一遍
app_requests_method_count_total{application="$application", instance="$instance", method="IndexController.index"}
grafana中的变量设置
选择panel——》settings——》variables中,点击new