在SpringBoot自定义指标并集成Prometheus和Grafana监控

前沿

写这篇文章的目的是发现自己整天埋头写业务代码但忽略了主动发现问题的能力,这里指的是监控和报警。结合工作中发现Prometheus和Grafana还是主流一些。本文介绍如何使用自定义指标,并使用Prometheus进行监控并报警,同时在 Grafana 进行展现。

看完本文的收益:

  • 主动发现线上问题,而不用被动等客诉,线上问题的概率会变少。
  • 向上汇报,相比于你写的代码更喜欢能量化的东西比如UI中的数据。
  • 源码【免费】云服务器在最后有VX联系方式,直接拿去跑。

项目搭建

目标:我的目标是监听服务的调用次数和接口的RT
技术栈:SpringBoot服务、Prometheus和Grafana
注意事项:整个过程都是通过Docker安装,高效

SpringBoot工程配置

首先新加一个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>

需要配置properties开启监控

spring.application.name=springboot-demo
server.port=8082#将所有Actuator端点暴露
management.endpoints.web.exposure.include=*
#启用Prometheus指标导出
management.metrics.export.prometheus.enabled=true
#springboot-demo
management.metrics.tags.application=${spring.application.name}
#启用Tomcat MBean注册表,以便于通过JMX进行监控和管理
server.tomcat.mbeanregistry.enabled=true

检查boot段监控是开启成功,在浏览器中输入http://ip:port/actuator/prometheus。出现下图所示,表示boot已经能配置成功。
在这里插入图片描述
然后带着目标(监控方法的调用次数和RT)去编写代码

package com.example.springbootprometheusgrafanademo;import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Random;/*** @author chaird* @create 2024-05-17 0:38*/
@RestController
public class MethodCountController {/*** 引入micrometer的工具类*/@Resourceprivate MeterRegistry meterRegistry;@GetMapping("/deleteCount")public Object deleteCount() {System.out.println("deleteCount-----" + LocalDateTime.now().toString());incrementMonitorConut("com.example.springbootprometheusgrafanademo.HelloController.deleteCount");return "deleteCount-----" + LocalDateTime.now().toString();}@GetMapping("/addCount")public Object addCount() {System.out.println("add-----" + LocalDateTime.now().toString());incrementMonitorConut("com.example.springbootprometheusgrafanademo.HelloController.addCount");return "addCount-----" + LocalDateTime.now().toString();}/*** 记录接口调用次数** @param method*/public void incrementMonitorConut(String method) {//定义指标名称String mertricName = "method_count";Counter counter = meterRegistry.counter(mertricName, "methodName", method);counter.increment();}/*********************************************************************************************//********************************上面是接口调用次数,下面是接口调用耗时******************************//*********************************************************************************************/@GetMapping("/deleteRt")public Object deleteRt() {System.out.println("deleteRt-----" + LocalDateTime.now().toString());recordMethodRt("com.example.springbootprometheusgrafanademo.HelloController.deleteRt", 20L);return "deleteRt-----" + LocalDateTime.now().toString();}@GetMapping("/addRt")public Object addRt() {System.out.println("addRt-----" + LocalDateTime.now().toString());recordMethodRt("com.example.springbootprometheusgrafanademo.HelloController.addRt", 10L);return "addRt-----" + LocalDateTime.now().toString();}/*** 记录接口的RT** @param method*/public void recordMethodRt(String method, Long rt) {//定义指标名称String mertricName = "method_rt";meterRegistry.timer(mertricName, Tags.of("methodName", method)).record(rt, java.util.concurrent.TimeUnit.MILLISECONDS);}}

启动boot应用程序。

搭建Prometheus

注意:下面使用Docker安装,简单省事

首先编写一个配置文件prometheus.yml,告诉Prometheus要监听哪些应用程序,当然本文要监听的是boot程序

scrape_configs:- job_name: 'spring_boot_app'   # job 名称metrics_path: '/actuator/prometheus'   # 监控路径static_configs:- targets: ['101.200.123.220:8082']  # 监控目标,即本文中的boot的端口和IP

然后通过docker启动应用程序

docker run -d -p 9090:9090 -v /root/cbeann/docker/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus prom/prometheus

访问**http://ip:port/**并选择下面标签,就可以看到下面这个标就表明boot已经被prometheus监听到了。
在这里插入图片描述
接下来触发几个请求保证有数据,此时我写了个脚本curl100.sh循环触发100次,简单操作

#!/bin/bash# 循环执行 curl 命令 100for ((i = 1; i <= 100; i++)); do# 执行 curl 命令curl -s -o /dev/null http://101.200.123.220:8082/addCount  # 替换 http://example.com 为你要请求的 URL# 输出当前循环次数echo "Curl request $i"# 休眠 1 秒sleep 1# 执行 curl 命令curl -s -o /dev/null http://101.200.123.220:8082/deleteCount  # 替换 http://example.com 为你要请求的 URL# 输出当前循环次数echo "Curl request $i"# 休眠 1 秒sleep 1# 执行 curl 命令curl -s -o /dev/null http://101.200.123.220:8082/deleteRt  # 替换 http://example.com 为你要请求的 URL# 输出当前循环次数echo "Curl request $i"# 休眠 1 秒sleep 1# 执行 curl 命令curl -s -o /dev/null http://101.200.123.220:8082/addRt  # 替换 http://example.com 为你要请求的 URL# 输出当前循环次数echo "Curl request $i"# 休眠 1 秒sleep 1done

执行脚本

sh curl100.sh

此时prometheus已经有数据了,然后点操作一下就能看到数据了。

Grafana美化监控

docker安装Grafana,执行命令如下

docker run -d --name=grafana -p 3000:3000 grafana/grafana

执行完毕后输入**http://ip:port/**后, 首次访问时,默认的用户名和密码是 admin/admin

首先添加一个Prometheus的数据源
在这里插入图片描述
然后输入Prometheus的地址,然后选择最下面的Save,没问题后创建面板Dashboard在这里插入图片描述

在面板上选择自定义的指标,然后按照顺序点一下,整个图就简单绘制出来了。
在这里插入图片描述

Grafana不美观怎办。官方有专门的主题面板库https://grafana.com/grafana/dashboards/ ,可以直接导入
在这里插入图片描述

总结

领导爱看大盘,Grafana就挺好
既要低头干活(CRUD),更要抬头看路
主动发现问题


作者阿里淘天Java开发工程师,CSDN博客专家,阿里云博客专家,专注于后端技术的分享。如果你迷茫,不妨来瞅瞅码农的轨迹。模拟面试、简历辅导、项目亮点、校招内推加VX:CHAI956056312


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

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

相关文章

重学java 40.多线程 — 死锁和线程状态

—— 24.5. 一、死锁 1.死锁介绍&#xff08;锁嵌套就有可能产生死锁&#xff09; 指的是两个或者两个以上的线程在执行的过程中由于竞争同步锁而产生的一种阻塞现象;如果没有外力的作用,他们将无法继续执行下去,这种情况称之为死锁 例&#xff1a; 两线程处于互相等待的状态&a…

上位机图像处理和嵌入式模块部署(mcu常见三种烧录方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和单纯的windows上位机开发、嵌入式linux开发不一样&#xff0c;mcu的开发&#xff0c;是需要通过烧录器把编译好的镜像烧入到开发板里面的。这是很…

STM32通用定时器的应用实例(基于STM32F103)

目录 概述 1 STM32Cube配置项目 1.1 准备环境 1.2 配置项目参数 1.3 生成Project 2 HAL函数 2.1 初始化函数&#xff1a;HAL_TIM_Base_Init 2.2 中断模式启动定时器函数&#xff1a;HAL_TIM_Base_Start 2.3 定时器回调函数&#xff1a; HAL_TIM_PeriodElapsedCallback…

ElasticSearch操作之重置密码脚本

ElasticSearch操作之重置密码脚本 #!/bin/bash # 使用样例 ./ES密码重置.sh 旧密码 新密码# 输入旧密码 es_old_password$1# 设置新的密码变量 es_password$2# 正确响应 es_reponse{"acknowledged":true}# 检查Elasticsearch是否在运行 if pgrep -f elasticsearch &g…

2024年5月计算机视觉论文推荐:包括扩散模型、视觉语言模型、图像编辑和生成、视频处理和生成以及图像识别等各个主题

我们今天总结下2024年5月发表的最重要的论文&#xff0c;重点介绍了计算机视觉领域的最新研究和进展&#xff0c;包括扩散模型、视觉语言模型、图像编辑和生成、视频处理和生成以及图像识别等各个主题。 Diffusion Models 1、Dual3D: Efficient and Consistent Text-to-3D Ge…

【C++题解】1697. 请输出n~1之间所有的整数

问题:1697. 请输出n~1之间所有的整数 类型&#xff1a;循环 题目描述&#xff1a; 从键盘读入一个整数 n &#xff0c;请输出 n∼1 之间所有的整数&#xff0c;每行输出 1 个。 比如&#xff0c;假设读入 n5 &#xff0c;输出结果如下&#xff1a; 5 4 3 2 1 输入&#xff1…

Java进阶学习笔记4——Static应用知识:代码块

代码块&#xff1a; 代码块是类的五大成员之一&#xff08;成员变量、构造器、方法、代码块、内部类&#xff09;。 Java类生命周期&#xff1a;加载、验证、准备、初始化、卸载。 代码块分为两种&#xff1a; 静态代码块&#xff1a; 格式&#xff1a;static {} 特点&…

SpringBoot 集成 Nebula

工作需求&#xff0c;开始了解图数据库&#xff0c;经过工具选型&#xff0c;最终选择nebula graph&#xff0c;并集成到springboot&#xff0c;java 环境下如何对 Nebula Graph 进行操作&#xff0c;本文整理下过程。 1、首先引入 pom 依赖 <dependency><groupId&g…

鸿蒙系统与OpenHarmony:中国科技行业的新动力与就业前景

背景 经历近年来的迅猛发展&#xff0c;鸿蒙原生应用数量已突破4000款&#xff0c;生态设备数量超过8亿台&#xff0c;开发者群体壮大至220万人。更为显著的是&#xff0c;鸿蒙系统在中国市场的份额已经超过了15%&#xff0c;稳居第三大操作系统&#xff0c;其生态之树已然枝繁…

探秘机器学习经典:K-近邻算法(KNN)全解析

在浩瀚的机器学习宇宙中,K-近邻算法(K-Nearest Neighbors,简称KNN)如同一颗璀璨的明星,以其简洁直观的原理和广泛的应用范围,赢得了众多数据科学家的喜爱。今天,让我们一起揭开KNN的神秘面纱,深入探讨它的运作机制、优缺点、应用场景,以及如何在实际项目中灵活运用。 …

23. 【Java教程】接口

本小节我们将学习 Java 接口&#xff08;interface&#xff09;&#xff0c;通过本小节的学习&#xff0c;你将了解到什么是接口、为什么需要接口、如何定义和实现接口&#xff0c;以及接口的特点等内容。最后我们也将对比抽象类和接口的区别。 1. 概念 Java 接口是一系列方法的…

PostgreSQL事务基础理解

PostgreSQL事务 事务是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。数据库事务通常包含一个序列对数据库的读和写操作&#xff0c;主要是包含以下两个目的&#xff1a; 为数据库操作序列提供一个从失败中恢复到正常状态的方法&#…

事务管理控制

文章目录 1. 事务的基本概念2. 数据库的并发控制2.1 事务调度2.2 并发操作带来的问题2.3 并发调度的可串行性2.4 并发控制技术2.5 两段锁协议2.6 多粒度封锁协议 3. 数据库的备份与恢复3.1 数据库系统故障3.2 数据库的备份3.3 数据库的恢复 4. 数据库的安全性与完整性4.1 数据库…

VMware虚拟机桥接无线网卡上网(WIFI)

一、打开VM点击【编辑】-【虚拟网络编辑器】 二、点击【桥接模式】- 点击【自动设置】- 选择自己的无线网适配器 - 【确定】 三、开机之后会弹出提示连接网络&#xff0c;就能看见网络已经连上了

网络变压器原理与维修视频

如果你在寻找网络变压器原理与维修方面的视频教程&#xff0c;可以在网上找一些优质的资料进行学习。一些国内外知名的教育和科技资源网站&#xff0c;如B站、优酷、YouTube等&#xff0c;都有涉及网络变压器原理和维修的视频教程&#xff0c;你可以在这些网站上进行搜索。 通常…

智慧之选:开源与闭源大模型的未来探索

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

淘宝订单系统ERP中如何接入平台订单信息?(订单API)

淘宝开放平台中有交易API&#xff0c;里面有各种关于交易的API接口。但是申报应用权限的审核流程严格又漫长。不少公司费时费力的申请后&#xff0c;结果还是没有审批下来。 调用淘宝自定义接口custom&#xff0c;可以实现淘宝开放平台API的调用。技术人员会根据您需要的接口做…

基于SpringBoot的网盘系统设计与实现

第1章 绪论... 1 1.1 研究背景与意义... 1 1.1.1 研究背景... 1 1.1.1 研究意义... 1 1.2 国内外研究现状... 2 1.2.1 国内研究现状... 2 1.2.2 国外研究现状... 3 1.3 论文组织架构... 4 第2章 关键技术介绍... 5 2.1 SpringBoot. 5 2.2 MySQL数据库... 5 2.3 MVC架…

Java进阶学习笔记2——static修饰成员变量

static&#xff1a; 叫静态&#xff0c;可以修饰成员变量、成员方法。 成员变量按照有无static修饰&#xff0c;分为两种&#xff1a; 类变量&#xff1a;有static修饰&#xff0c;属于类&#xff0c;在计算机中只有一份&#xff0c;会被类的全部对象共享。静态成员变量。 实…

【LeetCode】30.串联所有单词的子串

串联所有单词的子串 题目描述&#xff1a; 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["ab","cd",&qu…