1. 前言

工作几个月了,但是工作的前3个月几乎没有工作内容,从国庆节后终于步入工作节奏,开始接一些需求了,老早就想督促自己去学习去记录,但是自制力太差了,希望自己可以慢慢的写博客、读书,取得一些进步,在半年后取得一些成果。
    之前看了半天的spring security ,本想写一篇博客,结果因为太懒,一直没动笔,都忘光了。。
    言归正传,前阵子leader给了我一个监控的需求,需要使用prometheus,因此我去调研了一下,然后在项目中使用。

2. prometheus简介

关于prometheus的介绍,网上有很多,我就不在此班门弄斧了,里面主要有counter、gauge、timer、summary和histogram五种度量方式,前三种比较好理解,后两种我理解的是对某一个值分布的统计,即横坐标不是时间轴。

3. gauge的使用

现在需求是这样的,将时间轴等距离均分,如间隔是一分钟,然后去监控每一分钟内发送到kafka中的消息数量。首先counter是不能使用的,因为counter的设定是只增不减,然后summary和histogram在我的理解中是对分布的统计和监控,所以也不能使用,因此我只好投机取巧的使用了gauge(投机取巧说的是:gauge的意义更在于是统计一个实时的值,反应一种动态变化)。
    因为项目使用的是springboot2.x,为了方便,就结合actuator使用了,引入如下依赖(项目使用的是gradle,目前感觉没有maven好用)

   compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '2.2.10.RELEASE'compile group: 'io.micrometer', name: 'micrometer-registry-prometheus', version: '1.1.3'

3.1 定义gauge变量

要使用gauge,首先需要引入register,并在register中注册gauge,gauge的定义包括名字以及一个Number(当然还有其他的注册方式,如标签等,需要可以自行google),因为此处要统计某段时间内某个值的积累量,因此我做了如下定义

gaugeMap.put(gaugeName,registry.gauge(gaugeName,new AtomicLong(0));

放入map中的目的是为了之后容易操作。
     然后我们可以使用该gauge对需要统计的量进行增量,如以下操作

send(){kafkaTemplate.send(topic, data);gaugeMap.get(gaugeName).incrementAndGet();
}

当然,监控操作最好是使用aop来进行,这样可以和业务代码分离。

3.2 统计该gauge变量在某一段时间内的积累值

首先我们要明白,prometheus收集监控信息时,不支持push操作,需要对配置的各个监控目标进行pull操作,因为我们要监控一分钟内的积累量,就需要将prometheus server端的拉取间隔配置为60s,接下来就遇到了另一个问题,在prometheus server拉取的时候,如何正好将这一刻的积累值给它,并进行清零操作呢?
    我的思路是这样的,prometheus server端拉取信息也是通过springboot项目暴露的http端点,因此可以通过拦截器,当拉取结束后就对gauge的积累值进行清零。结果发现拦截器并不起作用,后来想起来暴露的端口都可以通过配置替换,所以可能是springboot项目中,prometheus client自己起了一个springboot环境,因此导致拦截器无效。灵机一动,想到过滤器是在servlet层面进行过滤的,应该会生效吧,然后尝试了一下果然可以拦截到 ip:port/actuator/prometheus 端点,所以就选择使用过滤器进行这个操作。
    这里还有一个坑,在filter中自动注入为null。这是因为在spring项目中,在项目启动时,监听器listener最先初始化,然后是过滤器filter,最后是servlet。 Spring监听器在启动时会读取spring配置文件,进行spring容器的初始化。springMVC的dispatcherServlet初始化时会读取springMVC的配置文件,进行springMVC容器的初始化。Spring容器初始化时会实例化各个bean。过滤器是servlet规范中定义的,并不归spring容器管理,也无法直接注入spring中的bean,所以在filter中无法注入spring的实例。
    因此使用如下方法注入即可

public void init(FilterConfig config) throws ServletException {ServletContext sc = config.getServletContext();ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);if (ctx != null && ctx.getBean("prometheusMonitor") != null) {monitor = (PrometheusCustomMonitor) ctx.getBean("prometheusMonitor");log.info("prometheusMonitor 注入");}
}

之后就可以愉快的使用它了,然后我们配置好filter的拦截路径后,进行如下操作

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain){filterChain.doFilter(servletRequest, servletResponse);gaugeMap.get(gaugeName).set(0L);
}

这样大体的使用就讲完了,希望之后可以每周或者每两周写一篇博客,加油。

整合springboot,prometheus中guage的使用,统计一段时间中某个值的积累相关推荐

  1. nohup命令解决SpringBoot/java -jar命令启动项目运行一段时间自动停止问题

    nohup命令解决SpringBoot/java -jar命令启动项目运行一段时间自动停止问题 问题背景 有一个springboot项目,放在测试服务器跑,但是隔一段时间,就会GG,要搞清楚怎么回事. ...

  2. JAVA中实现让程序等待一段时间的方法

    JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式. 方法一: 通过线程的sleep方法. Thread.currentThread().sleep(1000); 在需要程 ...

  3. 统计一段文字中的单词个数并按单词的字母顺序排序后输出

    现需要统计若干段文字(英文)中的不同单词数量. 如果不同的单词数量不超过10个,则将所有单词输出(按字母顺序),否则输出前10个单词. 注1:单词之间以空格(1个或多个空格)为间隔. 注2:忽略空行或 ...

  4. python 教程之如何使用python中的四分位距统计数据查找数据中的异常值

    异常值是远离其他数据点的数据点,例如在图像中您会看到异常值. 那么我们如何找到包含异常值的行在这篇文章中,我们在数据的 r_values 列中找到异常值. 因此,要提取异常值,我们需要两个值 第 25 ...

  5. 统计一段英文中单词的个数c语言,C语言统计一篇英文短文中单词的个数实例代码...

    具体代码如下所述: #include #define N 1000 void main(){ char en[N][81]; int i,j,num=0,n,state; //num 用来统计单词的个 ...

  6. 如何统计多个Excel文件中的信息,统计多个工作簿中的数据,统计多个表格中相同的条,统计多个表格的和等等

    做为信息收集人员,可能经常需要统计多个Excel文件收集来的信息,对多个Excel.对多个工作簿.对多个表格进行统计,统计的维度包含按文件名.按表名进行求和.求排名.求平均值.条件统计.条件求和.文字 ...

  7. c++设置一个二维字符组初值_C语言 | 统计一段话中的字符

    "要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在C语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语 ...

  8. 统计一段文本中每个单词出现的次数(以单词为键,单词出现的次数为值)

    方法1(通过TreeMap): 第一种通过TreeMap,代码如下: package Test2;import java.util.Map; import java.util.Set; import ...

  9. java统计每个单词单词出现的次数_(java)统计若干段英文中的单词数量,并统计每个单词出现的次数按降序排序。...

    注1(1)注2 !!!!! 10 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...

最新文章

  1. concat和concat_ws()区别及MySQL的几个实用字符串函数
  2. sqlplus 如何连接到指定数据库,并创建用户与授权
  3. 核弹级漏洞log4shell席卷全球!危及苹果腾讯百度网易,修改iPhone名称就可触发...
  4. 使用 NuGet 管理我们的程序集 - 预发行版
  5. 基于linux的地震数据处理软件的设计与实现,地震数据处理软件系统与应用实验指导书...
  6. 袁大头 如何辨别假货
  7. 词频统计及其效能分析
  8. Android开发者必备工具-常见Android模拟器(MuMu、夜神、蓝叠、逍遥、雷电、Genymotion...)
  9. 使用Echarts实现中国地图,官方china.js文件
  10. Linux程序设计——shell
  11. VBR,ABR,CBR
  12. 工业机器人实训耗材_工业机器人实训课程
  13. 太湖2018年渔业产值达7.3亿元 今年大闸蟹产量将降低
  14. 【Jetpack】WorkManager
  15. element input限制输入数字
  16. Git - git 入门
  17. spring用到的设计模式
  18. h5 每页打印固定表头以及表尾 解决表头过长打印分页表头不固定问题
  19. SRS十周年杭州站沙龙技术备忘录
  20. 95后女孩从月入3000到月入10万

热门文章

  1. 2022-4-8 Leetcode 185.部门工资前三高的所有员工
  2. MBR60200PT-ASEMI肖特基二极管常见型号MBR60200PT
  3. 2022-3-31 Leetcode 716.最大栈
  4. ios上传音频文件到服务器,怎么把第三方音频文件添加到Apple Music
  5. [数位dp]招商银行笔试---填补数字
  6. 聚类和判别分析小论文
  7. vmware workstation 15.5 pro 简易安装 win7 64位旗舰版 虚拟机
  8. html5实现DisuzX论坛手机版ucenter头像修改
  9. F1到F12使用说明书
  10. 计算机模拟动物打架,动物打架模拟器