prometheus监控JAVA应用(JVM等)并自定义监控指标
- 主体思路
- 将Nacos伪装成Consul
- 快速开始
-
- 在Spring Cloud Gateway引入jar包
- Prometheus配置
- 在每个Spring Cloud实例中的配置
-
- 引入Prometheus监控包
- 暴露每个应用的指标接口
- 查看Prometheus中监控到的服务
- 配置grafana并展示一些监控界面
- 自定义监控指标并展示到 Grafana
-
- 监控所有API请求次数
在
使用docker搭建服务监控prometheus+node_export+grafana的过程详解文章中我们已经完成了使用docker搭建prometheus+node_export+grafana监控环境并展示了最终的监控效果图,有兴趣的可以去阅读参考一下,接下来我们将进入下一步:使用Prometheus+Grafana监控注册在Nacos中的服务,我们来看看会有什么样的监控效果吧!
主体思路
要想使用Prometheus来监控注册在Nacos中的服务,怎么做呢?是不是把Nacos的URL作为Prometheus一个job配置项就可以呢?事实并非如此,能够通过如此方便的配置就可以实现监控所有服务的,现在只有Consul可以做到,因为Prometheus官方提供Consul为注册中心的配置方式,配置后可自动获取Consul中所有实例的信息并进行监控,那我们怎么办呢?有的同学可能就想到了:那我们是不是也可以在服务中以相同的接口给Prometheus返回服务信息,将自己伪装成一个Consul服务器节点,这样就可以使用Prometheus配置Consul那样来配置我们的假的Consul服务器节点呢?
有了这样的思路,下面我们要做的就是如何做到将自己伪装成一个Consul服务器节点。
将Nacos伪装成Consul
我们知道Prometheus只支持Consul的接口,不支持Nacos的接口,但是Nacos是可以取到这些信息的,所以我们需要一个中间层来将Nacos的数据转换为Prometheus可以识别的。在GitHub上找到了大佬开源了Eureka的实现方式,也有大佬提供了Nacos的方式,哈哈,这个时候就是体现我们『拿来主义』的时候了,项目的开源地址:Nacos Consul Adapter,有兴趣的可以去下载下来学习学习。
快速开始
在Spring Cloud Gateway引入jar包
可以是服务中任意的节点,在Spring Cloud Gateway中引入jar包的原因是它基于Reactor,如果不是使用Spring WebFlux则还需要引入额外的包。
<dependency>
<groupId>io.github.chen-gliu</groupId>
<artifactId>nacos-consul-adapter</artifactId>
<version>version</version>
</dependency>
如果拉取不到包,可以在setting文件中添加如下配置:
<mirror>
<id>mvnrepository</id>
<mirrorOf>*</mirrorOf>
<name>仓库</name>
<url>https://repo1.maven.org/maven2</url>
</mirror>
Prometheus配置
在Prometheus中添加如下配置:
- job_name: nacos-prometheus
scrape_interval: 2s
metrics_path: '/actuator/prometheus'
static_configs:
consul_sd_configs:
- server: '192.168.0.4:18016'
services: []
注意:-targets:
后面是引入了nacos-consul-adapter.jar包的实例IP+端口,记得换成自己的实例IP和端口。如图:
这个配置表示:prometheus每隔2秒钟从http://192.168.0.4:18016/actuator/prometheus这个url拉取指标数据。
在每个Spring Cloud实例中的配置
引入Prometheus监控包
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.5.1</version>
</dependency>
暴露每个应用的指标接口
在每个需要监控的项目里面加上:
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(
@Value("${spring.application.name}") String applicationName) {
return (registry) -> registry.config().commonTags("application", applicationName);
}
在项目启动类加上这个bean配置之后,别忘记在配置文件加上management.endpoints.web.exposure.include=*
这些配置来开启 Actuator 服务,因为Spring Boot Actuator 会自动配置一个 URL 为 /actuator/Prometheus 的 HTTP 服务来供 Prometheus 抓取数据,不过默认该服务是关闭的,该配置将打开所有的 Actuator 服务,完成之后,我们再启动服务,然后在浏览器访问http://192.168.0.4:6601/actuator/prometheus,就可以看到服务的一系列不同类型 metrics 信息,例如 http_server_requests_seconds_count、jvm_threads_states_threads、jvm_classes_loaded_classes、jvm_memory_max_bytes、jvm_gc_pause_seconds summary、jvm_gc_memory_promoted_bytes_total counter 等等。
查看Prometheus中监控到的服务
重启prometheus容器,访问http://192.168.0.4:9090/targets
:
状态为UP表明prometheus已经成功获取到了这个target的数据,也就是说我们配置成功了。
我们也可以到graph中去根据关键字搜索一些统计数据,如下:
上图就是根据关键字:jvm_threads_states_threads在prometheus中搜索到的相关统计数据的图表展示,也可以点击Table标签页直接看数字。
配置grafana并展示一些监控界面
前面搭建监控环境的时候已经介绍过怎么通过import导入dashboard了,这里就不在赘述了,有需要的,可以直接去看一下。
我们从grafana官方dashboards里面找到我们要import的模板ID:10280
,直接操作导入即可,我们来看一下导入后的结果:
下面是JVM相关的监控数据:
GC情况:
日志统计分析数据:
等等,还有很多,感兴趣的同学,可以操作一下。
自定义监控指标并展示到 Grafana
虽然spring-boot-actuator集成了Micrometer来提供的默认监控项,覆盖 JVM 各个层间的监控,配合 Grafana Dashboard 模板基本可以满足我们日常对 Java 应用的监控,当然,它也支持自定义监控指标,实现各个方面的监控,例如统计访问某一个 API 接口的请求数,统计实时在线人数、统计实时接口响应时间等功能,而这些都可以通过使用Micrometer来实现,那么接下来,我们来演示下如何自定义监控指标并展示到 Grafana 上。
监控所有API请求次数
监控请求次数可以使用 Counter 计数器来处理,为了测试,我们就直接在Controller类中进行累计,项目中,可以使用一个AOP切面,通过切面注入可以做到统计所有请求记录,代码:
@RestController
@RequestMapping("/gateway/metrics")
public class GrafanaTestController {
@Autowired
private MeterRegistry meterRegistry;
private Counter counter;
@PostConstruct
public void init() {
Tags tags = Tags.of("common", "test");
// 公共标签
meterRegistry.config().commonTags(tags);
counter = Counter.builder("metrics.request.common").register(meterRegistry);
}
/**
* 订单请求测试
*/
@GetMapping("/order/{appId}")
public RestResponse<String> orderTest(@PathVariable("appId") String appId) {
counter.increment();
return RestResponse.ok(appId);
}
/**
* 商品请求测试
*/
@GetMapping("/product/{appId}")
public RestResponse<String> productTest(@PathVariable("appId") String appId) {
counter.increment();
return RestResponse.ok(appId);
}
}
然后分别访问接口/order/{appId}6次,访问接口/product/{appId}6次,然后我们在 Grafana Dashboard 上添加一个新的 Panel 并添加 Query 查询,最后图形化展示出来,这个就不截图赘述了,有兴趣的自己试一下吧。