目录
1、场景说明
上篇链接:https://blog.csdn.net/qq_51785096/article/details/129427476?spm=1001.2014.3001.5501
上节我们说到Prometheus有很多监控指标,有了解过的同学应该知道,Springboot也是可以集成Prometheus的,但是由于指标太多并且不一定是我们需要的指标,甚至我们需要的指标根本没有被实现。
此时,我们就需要自己将这些指标查询出来,并且让Pormetheus可以获取并将这些数据进行处理,接下来我将从两部分讲解Springboot如何集成Prometheus以及我们如何自定义监控指标。
2、Springboot集成Prometheus
-
导入依赖
<!--Springboot集成prometheus依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
-
配置文件
开启Prometheus的Web访问
server: port: 9999 management: endpoints: web: exposure: include: '*' # 打开 Prometheus 的 Web 访问 Path metrics: # 下面选项建议打开,以监控 http 请求的 P99/P95 等,具体的时间分布可以根据实际情况设置 distribution: sla: http: server: requests: 1ms,5ms,10ms,50ms,100ms,200ms,500ms,1s,5s # 在 Prometheus 中添加特别的 Labels tags: # 必须加上对应的应用名,因为需要以应用的维度来查看对应的监控 application: ${spring.application.name} spring: application: # 这里只是给指标的出处起了个名字 name: prometheus-demo
-
查看默认指标
直接启动项目,访问/actuator/prometheus
上图中就是Springboot默认的监控指标,当然我只是截图了一部分还有其他的指标,并且默认也是可以监控Web接口一些信息。 -
查看web接口指标
我们编写一个简单的接口,我们在这个接口sleep了2秒,启动项目。
先访问hello接口
查询一下,可以看到接口被访问了1次,接口延迟为2秒(因为我们在接口中sleep了2秒)
多访问几次看看效果
修改sleep时间看看效果,效果很明显(因为修改sleep的时间后重启服务了,所以之前的数据就没了,查询到的是重启后的访问次数和延迟)
3、自定义指标
-
介绍
相信大家也看出来了,Springboot集成Prometheus后的监控指标比较死板,不一定会符合业务需求(如果恰好符合某位同学的需求那就当我没说),所以我们就需要自定义一个指标,看过我上一篇文章的同学应该有了解到Prometheus是通过主动拉取的方式获取指标的,也就是说,只要我们能够让它从我们指定的接口拉取我们自己通过计算得到的指标数据,那就算是成功了,并且将这些数据交给它,让它帮助我们进行展示、监控、告警等操作。
-
导入依赖
<!--自定义指标依赖--> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient</artifactId> <version>0.16.0</version> </dependency> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_hotspot</artifactId> <version>0.16.0</version> </dependency> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_servlet</artifactId> <version>0.16.0</version> </dependency>
-
实现
实现一个service,这里我用Gauge(仪表盘)类型的指标举一个例子
-
继承Prometheus的指标类MetricsServlet
(这一步是必须的,也可以模仿MetricsServlet的实现将数据交给Pormetheus管理,但是这就设计Prometheus的源码了,大家有兴趣可以自己研究一下),实现一个接口/metrics(这个路径不是固定的,随意即可)
-
结果查看
启动项目访问metrics接口,可以看到数据和指标名都展示出来了
-
将数据交给Promethues
其实到这一步我们只是成功将数据装进Prometheus的指标容器中而已,还没有真正被Prometheus拉取到,这里我只做k8s中如何编写yaml文件让Prometheus主动拉取该指标。
在k8s中创建Prometheus时,Prometheus会先创建一个自定义资源ServiceMonitor,Prometheus Operator 在 Kubernetes 集群中安装时,默认会去读取 ServiceMonitor 资源并生成 Prometheus 目标配置,我们需要做的就是编写一个ServiceMonitor资源的yaml,让Prometheus读取到。apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: labels: k8s-app: ${该资源在k8s中的标签} name: ${资源名} namespace: ${命名空间} spec: endpoints: - interval: 30s (prometheus拉取数据的周期) port: http-api (prometheus拉取数据的网络协议) path: ${url} (prometheus拉取数据的访问路径,就是刚刚的接口,我定义的是metrics) selector: # 这里是因为k8s中是有內部域名以及service资源的 就是告诉prometheus去哪个ip,哪个端口拉取数据 # 如果不知道service资源概念的 可以去了解一下 matchLabels: app: ${被监控服务的service资源的标签} id: ${被监控服务的资源的唯一标识} namespaceSelector: matchNames: - ${被监控服务的命名空间}
-
示例结果
做完上面这些,我们就成功将自定义的指标交给Prometheus了,接下来展示一个已经实现了的案例,可以看出这个环境中有两个pod有在上报指标,redis中key的数量分别是多少也可以看到
鸡汤送上:
始终相信,付出就会有收获,或大或小,或迟或早,始终不会辜负你的努力!
最后说明:
代码在这里: https://gitee.com/xiaokuncom/devin-blog/tree/develop/prometheusMetrics
创作不易,若转载请标明出处或原文链接!!!