《SpringBoot 整合 Prometheus 采集自定义指标》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,如需交流,欢迎留言评论。👍

文章目录

    • 写在前面的话
    • SpringBoot 整合 Prometheus
    • 继续采集 OkHttp3 指标
    • 整合 Grafana
    • 关于 PromQL 语法
    • 总结陈词


写在前面的话

前不久博主整理了 《企业实战分享 · 常用运维中间件》,提到一些常用的中间件,这回介绍一下代码层面的具体整合工作。
此篇博文先介绍一下SpringBoot如何整合Prometheus采集自定义指标,各位大佬可以自行发散。


SpringBoot 整合 Prometheus

背景说明:这里默认已经准备好一个完整的SpringBoot项目,并且已经整合了Druid,这里以采集Druid指标为例介绍整合流程。

Step1、添加 Pom 依赖

<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

Step2、在 application.yml 中配置 Actuator 和 Prometheus

management:endpoints:web:exposure:# 仅暴露 prometheus、health 和 info 端点。include: prometheus, health, infometrics:export:prometheus:# 启用 Prometheus 指标导出。enabled: trueendpoint:prometheus:# 启用 /prometheus 端点。enabled: true

Step3、注册 Druid 数据源的指标到 Micrometer

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(DruidDataSource.class)
static class DruidDataSourcePoolMetadataProviderConfiguration implements SmartInitializingSingleton {private DruidDataSource wrappedDataSource;@Beanpublic DataSourcePoolMetadataProvider druidPoolDataSourceMetadataProvider() {return (dataSource) -> {DruidDataSource ds = DataSourceUnwrapper.unwrap(dataSource, DruidDataSource.class);if (ds != null) {this.wrappedDataSource = ds;return new DruidDataSourcePoolMetadata(ds);}return null;};}@Overridepublic void afterSingletonsInstantiated() {if (this.wrappedDataSource == null) {return;}Metrics.gauge(MetricsConstant.DataSource.POOLING_COUNT, this.wrappedDataSource, DruidDataSource::getPoolingCount);Metrics.gauge(MetricsConstant.DataSource.CONNECT_OPEN_COUNT, this.wrappedDataSource, DruidDataSource::getConnectCount);Metrics.gauge(MetricsConstant.DataSource.CONNECT_CLOSE_COUNT, this.wrappedDataSource, DruidDataSource::getCloseCount);Metrics.gauge(MetricsConstant.DataSource.CONNECT_ERROR_COUNT, this.wrappedDataSource, DruidDataSource::getConnectErrorCount);Metrics.gauge(MetricsConstant.DataSource.EXECUTE_COUNT, this.wrappedDataSource, DruidDataSource::getExecuteCount);Metrics.gauge(MetricsConstant.DataSource.ROLLBACK_COUNT, this.wrappedDataSource, DruidDataSource::getRollbackCount);Metrics.gauge(MetricsConstant.DataSource.PHYSICAL_CONNECT_COUNT, this.wrappedDataSource, DruidDataSource::getCreateCount);Metrics.gauge(MetricsConstant.DataSource.PHYSICAL_CLOSE_COUNT, this.wrappedDataSource, DruidDataSource::getDestroyCount);Metrics.gauge(MetricsConstant.DataSource.PHYSICAL_CONNECT_ERROR_COUNT, this.wrappedDataSource, DruidDataSource::getCreateErrorCount);Metrics.gauge(MetricsConstant.DataSource.NOT_EMPTY_WAIT_COUNT, this.wrappedDataSource, DruidDataSource::getNotEmptyWaitCount);Metrics.gauge(MetricsConstant.DataSource.NOT_EMPTY_WAIT_MILLIS, this.wrappedDataSource, DruidDataSource::getNotEmptyWaitMillis);}
}

Step4、配置 Prometheus 抓取 Spring Boot 应用的指标
进入Prometheus所在服务器,修改配置文件prometheus.yml
如下所示,是配置具体某个服务,如果是SpringCloud,有接入网关,也可以通过网关配置。

scrape_configs:- job_name: 'spring-boot-app'static_configs:- targets: ['localhost:8080']

Step5、启动 Spring Boot 应用并检查指标
访问地址:http://127.0.0.1:28888//actuator/prometheus
应该可以看到如下图所示的相关指标信息,包括 Druid 数据源的指标。
image.png

Step6、打开 Prometheus 界面验证
启动 Prometheus,访问地址:http://localhost:9090
在 Prometheus 的界面中可以看到从 Spring Boot 应用中抓取到的指标数据,操作效果如下图:
image.png


继续采集 OkHttp3 指标

需求背景
框架采用OkHttp3作为远程调用工具,现在也需要采集相关指标到Prometheus
这里基本实现思路,类似前面的Druid整合方案。
1、瞬时类型的指标,可以在初始化的时候利用Metrics.gauge注册;
2、请求耗时这样的指标,可以借助 OkHttp3 的拦截器,计算耗时,再利用Metrics.timer注册;

Metrics.gauge 和 Metrics.timer 区别
Metrics.gauge 收集的是瞬时数据(instantaneous data),也就是某一时刻的数值。这些数据通常反映了当前状态或当前值,例如内存使用量、线程数、队列长度等。
Metrics.timer 收集的是区间数据(interval data),也就是一段时间内的多个数据点。这些数据点可以用于计算统计信息,比如平均值、最小值、最大值等。
通过这两种不同的度量方式,可以全面地监控和分析应用程序的性能和状态。

具体代码案例

public class HttpClientMetricsInterceptor implements Interceptor {public HttpClientMetricsInterceptor(Dispatcher dispatcher) {Assert.notNull(dispatcher, "OkHttp dispatcher could not be null");Metrics.gauge(HttpClient.MAX_REQ_PER_HOST_SIZE, dispatcher.getMaxRequestsPerHost());Metrics.gauge(HttpClient.MAX_REQ_SIZE, dispatcher.getMaxRequests());Metrics.gauge(HttpClient.REQ_RUNNING_COUNT, dispatcher, Dispatcher::runningCallsCount);Metrics.gauge(HttpClient.REQ_QUEUE_TASK_COUNT, dispatcher, Dispatcher::queuedCallsCount);ExecutorService executorService = dispatcher.executorService();if (executorService instanceof ThreadPoolExecutor) {ThreadPoolExecutor executor = (ThreadPoolExecutor) executorService;Metrics.gauge(HttpClient.MAX_POOL_SIZE, executor, ThreadPoolExecutor::getMaximumPoolSize);Metrics.gauge(HttpClient.CORE_POOL_SIZE, executor, ThreadPoolExecutor::getCorePoolSize);Metrics.gauge(HttpClient.ACTIVE_POOL_COUNT, executor, ThreadPoolExecutor::getActiveCount);Metrics.gauge(HttpClient.LARGEST_POOL_SIZE, executor, ThreadPoolExecutor::getLargestPoolSize);}}@Overridepublic Response intercept(Chain chain) throws IOException {Timer.Sample sample = Timer.start(Metrics.globalRegistry);Request request = chain.request();Response response = null;try {response = chain.proceed(request);} finally {String threadName = Thread.currentThread().getName();boolean async = StrUtil.startWith(threadName, "okhttp", true);Timer timer = Metrics.timer(HttpClient.RESP_TIME,"method", request.method(),"status", String.valueOf(response == null ? "-1" : response.code()),"uri", URLUtil.getPath(request.url().toString()),"async", async + "");sample.stop(timer);}return response;}}

整合 Grafana

采集到Prometheus的数据,可以通过界面操作,但如果想以仪表盘的直观形式展示更多指标信息,可以考虑整合Grafana,整合工作很简单,代码不需要任何改动。
只需要按如下步骤:

  • 安装并启动 Grafana。
  • 配置 Prometheus 数据源。
  • 创建或导入 Dashboard。
  • 使用 Prometheus 查询语法可视化指标。
  • 根据需要配置告警和通知。

企业微信截图_17089126918229.png
相关博文:《企业实战分享 · 常用运维中间件》


关于 PromQL 语法

使用Prometheus界面查询的时候,需要借助PromQL语法,一般使用Prometheus查询自定义指标。
通过指标建议通过Grafana面板查询更直观。
下方是一些查询示例:

语法:<metric name>{<label name>=<label value>, ...}
示例一:onelink_datasource_poolingCount{application="archive-service"}[20s] offset 1m
示例分析:
1、onelink_datasource_poolingCount是指标名称,是自定义指标,代表“当前连接池中的连接数”;
2、{application="archive-service"}大括号代表过滤,很好理解;
3、[20s]中括号代表时间范围,没添加时间的代表瞬时向量查询,添加了时间的代表区间向量查询,右侧Value会出现多个值,值的个数等于指定时间/拉取频率,例如开发库指定10秒拉取,则出现2个值。
4、offset代表时间位移,不添加代表以当前系统时间为基准进行查询;示例二:
count(onelink_datasource_poolingCount{application="archive-service"} > 1)
rate(onelink_datasource_poolingCount{application="archive-service"}[1m]) --1分钟增长
topk(6, onelink_datasource_poolingCount > 3) -- 查看前6的指标
示例分析:
1、通过布尔运算对时间序列进行过滤,其实就是上面示例二的大于号,将value进行比对;
2、可以使用一些函数,具体看示例;过滤符号补充:
label=value 完全匹配
label!=value 完全不陪陪
label=~regx 正则匹配
label=!~regx 正则不匹配
onelink_datasource_poolingCount{application=~"archive-service|dc-.*"}时间单位补充:
s - 秒
m - 分钟
h - 小时
d - 天
w - 周
y - 年布尔运算补充:
== (相等)
!= (不相等)
> (大于)
< (小于)
>= (大于等于)
<= (小于

总结陈词

上文分享若干企业实际开发中日常使用场景及应对方案,希望对大家有帮助。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并发漏洞介绍

文章目录 漏洞介绍漏洞场景举例核心思路总结一下 漏洞介绍 并发漏洞&#xff0c;又称条件竞争漏洞&#xff0c;是指在多线程或多进程环境中&#xff0c;由于对共享资源的访问没有正确的同步控制&#xff0c;导致程序行为异常或安全问题的漏洞。这种漏洞常见于各种软件系统中&a…

基于与STM32的加湿器之旋转编码器驱动

1.简介 旋转编码器&#xff0c;也被称为轴编码器或脉冲编码器&#xff08;SPC&#xff09;&#xff0c;是一种将旋转的机械位移量转换为电气信号的传感器&#xff0c;其信号可用于检测位置、速度等。 2.工作原理 旋转编码器的工作原理主要基于光电转换或磁电转换。以光电式旋转…

uniapp 小程序注册全局弹窗组件(无需引入,无需写标签)

由于uniapp没有开放根节点&#xff0c;所以一般情况下通过app.components注册&#xff0c;在需要的页面直接写组件标签&#xff0c;但是如果每个页面都需要的话&#xff0c;再每个都加的话会非常的麻烦 网上的思路都不咋地&#xff1a; 1.通过写一个透明弹窗页面来实现&#…

在 Objective-C 中,如何有效地处理内存管理以避免内存泄漏?

在 Objective-C 中&#xff0c;可以通过以下几个方法来有效地处理内存管理以避免内存泄漏&#xff1a; 使用自动引用计数&#xff08;ARC&#xff09;&#xff1a;ARC 是一种自动内存管理机制&#xff0c;它可以自动地插入 retain、release 和 autorelease 方法来管理对象的内存…

Proteus元器件库与仪器仪表

常用元件与仪表简介 分立元件 1. 电阻Resistor 电阻 RES 排阻 RESPACK-8 2. 电容 Capacitor 瓷片电容 CAP 电解电容 CAP-ELEC 3. 电感 Inductor 4. 电位器 Potentiometer 5. 二极管 Diode 发光二极管 LED 6. 晶体管 Transistor 7. 场效应管 FET 8. 三极管 T…

LivePortrait 数字人:开源的图生视频模型,本地部署和专业视频制作详细教程

看到上面面部表情动态图片&#xff0c;是不是感觉挺有有意思&#xff1f;它就是通过快手、中科大和复旦大学联合研发的图生视频开源大模型LivePortrait&#xff08;灵动人像&#xff09;生成的视频。通过LivePortrait大模型&#xff0c;我们只需要一张人脸正面图片和一段文字或…

单相整流-TI视频课笔记

目录 1、单相半波整流 1.1、单相半波----电容滤波---超轻负载 1.2、单相半波----电容滤波---轻负载 1.3、单相半波----电容滤波---重负载 2、全波整流 2.1、全波整流的仿真 2.2、半波与全波滤波的对比 3、全桥整流电路 3.1、全波和全桥整流对比 3.2、半波全波和全桥…

.env.development、.env.production、.env.staging

环境变量文件&#xff08;如 .env.development、.env.production、.env.staging&#xff09;用于根据不同的环境&#xff08;开发、生产、测试等&#xff09;配置应用程序的行为。 作用 .env.development&#xff1a;用于开发环境的配置。开发人员在本地开发时会使用这个文件…

php获取,昨,今,后天.... 本周,月,年...日期时间戳

时间戳->时间转换工具 时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu) 代码如下: public function date(){/** 日期 **/// 今天的日期$result[today_date] date("Y-m-d");// 昨天的日期$result[yesterday_date] date("Y-m-d", strtotime(&quo…

Oracle使用fetch first子句报错:ORA-00933 SQL命令未正确结束

问题背景 今天在统计终端厂商告警次数Top10的时候使用SQL查询使用到了fetch first子句&#xff0c;结果执行报错&#xff1a;ORA-00933 SQL命令未正确结束。 报错原因 Oracle数据库中&#xff0c;使用 FETCH FIRST 子句需要启用 Oracle 12c 及以上版本。如果在较低版本的 Or…

【Git使用】管理代码

Git使用 1、git命令1.1、git init1.2、git add1.3、git commit1.4、git push1.5、git branch1.6、git fetch1.7、git checkout X1.8、git status 2、提交执行顺序3、常见错误Error3.1、error: pathspec XXX did not match any file(s) known to git3.2、fatal: not a valid obj…

使机器人在执行任务倒快递

这段代码是用来控制机器人在不同模式下的行为&#xff0c;具体是处理 residenceright 和 residenceleft 两种模式下的过渡过程。代码中使用了一个 mythread 结构体&#xff0c;该结构体包含了机器人的当前模式 (mode) 和过渡过程的阶段 (residenceTransientProcess)。以下是对这…

PyTorch是使用GPU和CPU优化的深度学习张量库——torchvision

torchvision datasets torchvision.datasets 包含了许多标准数据集的加载器。例如&#xff0c;CIFAR10 和 ImageFolder 是其中两个非常常用的类。 CIFAR10 CIFAR10 数据集是一个广泛使用的数据集&#xff0c;包含10类彩色图像&#xff0c;每类有6000张图像&#xff08;5000张…

C++ 类和对象(上)

再C中&#xff0c;我们使用类定义自己的数据类型。通过定义新的类型来反映待解决的问题中的各种概念&#xff0c;可以使我们更容易编写&#xff0c;调试和修改程序。 类定义格式 首先类的定义格式和结构体差不多&#xff0c;而结构体的那一套语法也可以在C中使用。class是定义…

RC-u3 跑团机器人

这道题目要求我们模拟一个跑团机器人&#xff0c;解析玩家输入的包含骰子掷出和加减法运算的指令&#xff0c;计算出不同种类的骰子分别需要掷出几个&#xff0c;并根据输入指令得到可能的最小结果和最大结果。 题目分析 我们需要解析输入的表达式&#xff0c;处理其中的加法…

oracle数据库的plsql免安装版安装

这个是连接oracle数据库的&#xff0c;注意安装不能有中文路径。以下只是示例。 1、打开D:\ruanjian\plsql\plsql\plsql&#xff0c;发送plsqldev.exe快捷方式到桌面。 2、新弹出的页面填写cancel,什么也不写。 3、将instanceclient解压&#xff0c;并复制文件路径。 修改tool…

[Python学习篇] Python搭建静态web服务器

Python内置的web静态服务器 Python内置的http.server模块可以快速启动一个简单的HTTP服务器。 在Python 3中&#xff0c;打开命令行或终端&#xff0c;在你想要作为静态服务器根目录的文件夹下&#xff0c;运行以下命令&#xff1a; python -m http.server 8000 这将会在…

纯vue+js实现数字0到增加到指定数字动画效果功能

关于数字增加动画效果网上基本上都是借助第三方插件实现的,就会导致有的项目安装插件总会出问题,所有最好使用原生vue+js实现,比较稳妥 纯vue+js实现数字0到增加到指定数字动画效果功能 vue+js 实现数字增加动画功能 效果图 其中,关于数字变化的间隔时间,延时效果都可…

数据结构与算法 —— DFS的定义与原理

DFS&#xff08;Distributed File System&#xff0c;分布式文件系统&#xff09;是一种允许网络连接的多个计算机之间共享信息的系统架构。与传统的文件系统&#xff08;如NTFS、HFS等&#xff09;不同&#xff0c;DFS分布在多个文件服务器或多个位置&#xff0c;通过计算机网…

澳门建筑插画:成都亚恒丰创教育科技有限公司

澳门建筑插画&#xff1a;绘就东方之珠的斑斓画卷 在浩瀚的中华大地上&#xff0c;澳门以其独特的地理位置和丰富的历史文化&#xff0c;如同一颗璀璨的明珠镶嵌在南国海疆。这座城市&#xff0c;不仅是东西方文化交融的典范&#xff0c;更是建筑艺术的宝库。当画笔轻触纸面&a…