prometheus监控JAVA应用(JVM等)并自定义监控指标

2年前 (2022) 程序员胖胖胖虎阿
424 0 0

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监控JAVA应用(JVM等)并自定义监控指标
这个配置表示: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监控JAVA应用(JVM等)并自定义监控指标

查看Prometheus中监控到的服务

重启prometheus容器,访问http://192.168.0.4:9090/targets
prometheus监控JAVA应用(JVM等)并自定义监控指标
prometheus监控JAVA应用(JVM等)并自定义监控指标
prometheus监控JAVA应用(JVM等)并自定义监控指标
状态为UP表明prometheus已经成功获取到了这个target的数据,也就是说我们配置成功了。
我们也可以到graph中去根据关键字搜索一些统计数据,如下:prometheus监控JAVA应用(JVM等)并自定义监控指标
上图就是根据关键字:jvm_threads_states_threads在prometheus中搜索到的相关统计数据的图表展示,也可以点击Table标签页直接看数字。

配置grafana并展示一些监控界面

前面搭建监控环境的时候已经介绍过怎么通过import导入dashboard了,这里就不在赘述了,有需要的,可以直接去看一下。
我们从grafana官方dashboards里面找到我们要import的模板ID:10280
,直接操作导入即可,我们来看一下导入后的结果:
prometheus监控JAVA应用(JVM等)并自定义监控指标
下面是JVM相关的监控数据:
prometheus监控JAVA应用(JVM等)并自定义监控指标
GC情况:prometheus监控JAVA应用(JVM等)并自定义监控指标
日志统计分析数据:
prometheus监控JAVA应用(JVM等)并自定义监控指标
等等,还有很多,感兴趣的同学,可以操作一下。

自定义监控指标并展示到 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 查询,最后图形化展示出来,这个就不截图赘述了,有兴趣的自己试一下吧。

相关文章

暂无评论

暂无评论...