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


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

    使用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则还需要引入额外的包。

    
        io.github.chen-gliu
        nacos-consul-adapter
        version
     
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果拉取不到包,可以在setting文件中添加如下配置:

    
    	mvnrepository
    	*
    	仓库
    	https://repo1.maven.org/maven2
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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: []
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注意:-targets: 后面是引入了nacos-consul-adapter.jar包的实例IP+端口,记得换成自己的实例IP和端口。如图:
    在这里插入图片描述
    这个配置表示:prometheus每隔2秒钟从http://192.168.0.4:18016/actuator/prometheus这个url拉取指标数据。

    在每个Spring Cloud实例中的配置

    引入Prometheus监控包

    
       io.micrometer
       micrometer-registry-prometheus
       1.5.1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    暴露每个应用的指标接口

    在每个需要监控的项目里面加上:

    @Bean
        MeterRegistryCustomizer configurer(
                @Value("${spring.application.name}") String applicationName) {
            return (registry) -> registry.config().commonTags("application", applicationName);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在项目启动类加上这个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 orderTest(@PathVariable("appId") String appId) {
            counter.increment();
            return RestResponse.ok(appId);
        }
    
        /**
         * 商品请求测试
         */
        @GetMapping("/product/{appId}")
        public RestResponse productTest(@PathVariable("appId") String appId) {
            counter.increment();
            return RestResponse.ok(appId);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    然后分别访问接口/order/{appId}6次,访问接口/product/{appId}6次,然后我们在 Grafana Dashboard 上添加一个新的 Panel 并添加 Query 查询,最后图形化展示出来,这个就不截图赘述了,有兴趣的自己试一下吧。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    rust学习—— 复合类型结构体、复合类型枚举、复合类型元组
    aarch64 gcc 10.3.1 源码编译 qemu-4.2.0
    ROS 仿真
    bash关闭按tab两次才显示关闭按tab显示隐藏文件
    微服务架构的优缺点都有哪些?
    C# 给Word每一页设置不同文字水印
    SpringBoot+Vue项目在线学习网站
    【FISCO-BCOS】十八、使用docker部署区块链
    设计模式系列详解 -- 迭代器模式
    ESP8266-Arduino编程实例-L9110直流电机风扇传感器模块
  • 原文地址:https://blog.csdn.net/m0_67402026/article/details/126113876