//@desc:Springboot+Prometheus+grafana 制作自己的业务监控

//@desc:码字不宜,转载请注明出处

//@author:张慧源  <turing_zhy@163.com>

//@date:2022/09/09

知识储备

Prometheus 中文文档 : https://prometheus.fuckcloudnative.io/

系统架构

开始实现

生成业务指标

经典实现方法

经典的实现方法网上有很多案例,即利用切面在接口发生调用的时候写入指标数据

详见:https://www.jb51.net/article/202726.htm

自己的实现方案

由于自己的业务是为服务架构,第一期打算先实现从无到有,于是采用了定时任务跑指标的方案

引入依赖

<!--prometheus-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.8.4</version>
</dependency> <!--定时任务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<version>2.6.6</version>
</dependency> <!--actuator 监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.7.2</version>
</dependency>

配置文件

#监控路径
management:
endpoints:
web:
exposure:
include: "*"

注册自己的指标[我这里用的是guaua格式数据]

package cn.hexcloud.m82.monitoring.service.monitor;

import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.prometheus.client.Gauge;
import org.springframework.stereotype.Service; import javax.annotation.PostConstruct;
import javax.annotation.Resource; /**
* 优惠相关监控
*
* @author abner<huiyuan.zhang @ hex-tech.net>
* @date 2022-09-08 17:09:14
*/
@Service
public class PromotionMonitor {
/**
* 核券数量
*/
public static Gauge VERIFY_COUPON_COUNT; /**
* 核券金额
*/
public static Gauge VERIFY_COUPON_AMOUNT_SUM; /**
* 核活动数量
*/
public static Gauge VERIFY_ACTIVITY_COUNT; /**
* 核活动金额
*/
public static Gauge VERIFY_ACTIVITY_AMOUNT_SUM; /**
* 构造函数
*
* @author abner<huiyuan.zhang @ hex-tech.net>
* @date 2022-09-08 11:33:56
*/
@PostConstruct
private void init() {
VERIFY_COUPON_COUNT = initVerifyCouponCount();
VERIFY_COUPON_AMOUNT_SUM = initVerifyCouponAmountSum();
VERIFY_ACTIVITY_COUNT = initVerifyActivityCount();
VERIFY_ACTIVITY_AMOUNT_SUM = initVerifyActivityAmountSum();
} @Resource
private PrometheusMeterRegistry prometheusMeterRegistry; /**
* 获取 verify coupon count 句柄
*
* @author abner<huiyuan.zhang @ hex-tech.net>
* @date 2022-09-08 11:47:45
*/
public Gauge getVerifyCouponCount() {
return VERIFY_COUPON_COUNT;
} /**
* 获取 verify coupon amount sum 句柄
*
* @author abner<huiyuan.zhang @ hex-tech.net>
* @date 2022-09-08 11:47:45
*/
public Gauge getVerifyCouponAmountSum() {
return VERIFY_COUPON_AMOUNT_SUM;
} /**
* 获取 experience count 句柄
*
* @author abner<huiyuan.zhang @ hex-tech.net>
* @date 2022-09-08 11:47:45
*/
public Gauge getVerifyActivityCount() {
return VERIFY_ACTIVITY_COUNT;
} /**
* 获取 verify activity amount sum 句柄
*
* @author abner<huiyuan.zhang @ hex-tech.net>
* @date 2022-09-08 11:47:45
*/
public Gauge getVerifyActivityAmountSum() {
return VERIFY_ACTIVITY_AMOUNT_SUM;
} /**
* 核券数量
*/
public Gauge initVerifyCouponCount() {
Gauge verifyCouponCount = Gauge.build().name("verify_coupon_count").labelNames("partner_id").help("verify coupon count").register();
prometheusMeterRegistry.getPrometheusRegistry().register(verifyCouponCount);
return verifyCouponCount;
} /**
* 核券金额
*/
public Gauge initVerifyCouponAmountSum() {
Gauge verifyCouponAmountSum = Gauge.build().name("verify_coupon_amount_sum").labelNames("partner_id").help("verify coupon amount sum").register();
prometheusMeterRegistry.getPrometheusRegistry().register(verifyCouponAmountSum);
return verifyCouponAmountSum;
} /**
* 核销活动数量
*/
public Gauge initVerifyActivityCount() {
Gauge verifyActivityCount = Gauge.build().name("verify_activity_count").labelNames("partner_id").help("verify activity count").register();
prometheusMeterRegistry.getPrometheusRegistry().register(verifyActivityCount);
return verifyActivityCount;
} /**
* 核活动金额
*/
public Gauge initVerifyActivityAmountSum() {
Gauge verifyActivityAmountSum = Gauge.build().name("verify_activity_amount_sum").labelNames("partner_id").help("verify activity amount sum").register();
prometheusMeterRegistry.getPrometheusRegistry().register(verifyActivityAmountSum);
return verifyActivityAmountSum;
}
}

写入指标

log.info("VerifyActivityCount-partnerId:{}-count:{}",partnerCountAmountActivityDto.getPartnerId(),partnerCountAmountActivityDto.getCount());
promotionMonitor.getVerifyActivityCount().labels(partnerCountAmountActivityDto.getPartnerId()).set(partnerCountAmountActivityDto.getCount()); float verifyCouponAmount = partnerCountAmountActivityDto.getAmount()
.divide(BigDecimal.TEN.multiply(BigDecimal.TEN), 2, RoundingMode.HALF_UP)
.floatValue();
log.info("VerifyActivityAmountSum-partnerId:{}-amount:{}",partnerCountAmountActivityDto.getPartnerId(),verifyCouponAmount);
promotionMonitor.getVerifyActivityAmountSum().labels(partnerCountAmountActivityDto.getPartnerId()).set(verifyCouponAmount);

效果展示

路径:http://localhost:8080//actuator/prometheus

配置prometheus 抓取上面的指标

** 可以搭建自己的prometheus服务也可以使用阿里云的prometheus**

我是使用阿里云的prometheus

抓取配置

# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s). # Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=` to any timeseries scraped from this config.
- job_name: 'prometheus' # metrics_path defaults to '/metrics'
# scheme defaults to 'http'. static_configs:
- targets: ['localhost:9090']

配置自己的图表

我的业务需要分租户展示,kennel跟大家的不太一样,稍微展示下吧

最终效果展示

Springboot+Prometheus+grafana 制作自己的业务监控的更多相关文章

  1. SpringBoot+Prometheus+Grafana实现应用监控和报警

    一.背景 SpringBoot的应用监控方案比较多,SpringBoot+Prometheus+Grafana是目前比较常用的方案之一.它们三者之间的关系大概如下图: 关系图 二.开发SpringBo ...

  2. Prometheus+Grafana+Alertmanager搭建全方位的监控告警系统

    prometheus安装和配置 prometheus组件介绍 1.Prometheus Server: 用于收集和存储时间序列数据. 2.Client Library: 客户端库,检测应用程序代码,当 ...

  3. 使用 Prometheus + Grafana 对 Kubernetes 进行性能监控的实践

    1 什么是 Kubernetes? Kubernetes 是 Google 开源的容器集群管理系统,其管理操作包括部署,调度和节点集群间扩展等. 如下图所示为目前 Kubernetes 的架构图,由 ...

  4. Kubernetes使用prometheus+grafana做一个简单的监控方案

    前言 本文介绍在k8s集群中使用node-exporter.prometheus.grafana对集群进行监控.其实现原理有点类似ELK.EFK组合.node-exporter组件负责收集节点上的me ...

  5. 微服务监控之三:Prometheus + Grafana Spring Boot 应用可视化监控

    一.Springboot增加Prometheus 1.Spring Boot 应用暴露监控指标,添加如下依赖 <dependency> <groupId>org.springf ...

  6. 基于Prometheus和Grafana打造业务监控看板

    前言 业务监控对许许多多的场景都是十分有意义,业务监控看板可以让我们比较直观的看到当前业务的实时情况,然后运营人员可以根据这些情况及时对业务进行调整操作,避免业务出现大问题. 老黄曾经遇到过一次比较尴 ...

  7. prometheus+grafana监控mysql最佳实践

    导航 前言 环境准备 安装Docker 安装prometheus 安装mysqld_exporter prometheus采集数据 安装grafana grafana配置数据源 感谢您的阅读,预计阅读 ...

  8. Prometheus(一):Prometheus+Grafana 安装配置

    一.基础环境 系统 IP 监控主机 CentOS 7 192.168.56.200 被监控主机 CentOS 7 192.168.56.201 二.Prometheus服务端安装 以下操作皆在监控主机 ...

  9. Prometheus+Grafana监控SpringBoot

    Prometheus+Grafana监控SpringBoot 一.Prometheus监控SpringBoot 1.1 pom.xml添加依赖 1.2 修改application.yml配置文件 1. ...

  10. 基于Docker+Prometheus+Grafana监控SpringBoot健康信息

    在微服务体系当中,监控是必不可少的.当系统环境超过指定的阀值以后,需要提醒指定的运维人员或开发人员进行有效的防范,从而降低系统宕机的风险.在CNCF云计算平台中,Prometheus+Grafana是 ...

随机推荐

  1. 【干货】Java开发者快速上手.NET指南

    前言 前几天有小伙伴在技术群里发了一个微软官方出的:适用于Java开发人员的.NET快速入门免费电子书,今天大姚来分享一下Java开发者想要快速上手.NET有哪些教程和优质资料. 微软适用于Java开 ...

  2. 【OpenCV】OpenCV (C++) 与 OpenCvSharp (C#) 之间数据通信

      OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上. 它轻量级而且高效--由一 ...

  3. 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。

    private static void stringSubLen(String msg) { int max = 0; int left = 0; Map<Character,Integer&g ...

  4. Visual Studio快捷键总览,推荐VS+Resharper实现高效开发

    VS2022之后,其实还挺好用的,但个人还是习惯VS+Resharper的强强组合,尤其是Ctrl+N快捷键的全局搜,比VS自带的Ctrl+T好用太多了,Ctrl+B还能直接查看反编译之后的dll的方 ...

  5. 访问数据库 与 Java框架各层级

    目录 访问数据库流程 Java框架各层级 4 层 对象的调用流程 耦合性与分层 项目地址:https://github.com/aijisjtu/Bot-Battle 访问数据库流程 flowchar ...

  6. #状压dp#JZOJ 3853 帮助Bsny

    题目 一共有\(n\)本书,混乱值是连续相同高度书本的段数. 可以取出\(k\)本书随意放回,问最小混乱值,高度\([25\sim 32]\) 分析 设\(f[i][j][k][mask]\)表示前\ ...

  7. OpenHarmony之NAPI框架介绍

      张志成 诚迈科技高级技术专家 NAPI是什么 NAPI的概念源自Nodejs,为了实现javascript脚本与C++库之间的相互调用,Nodejs对V8引擎的api做了一层封装,称为NAPI.可 ...

  8. 如何通过OpenHarmony的音频模块实现录音变速功能?

    简介 OpenAtom OpenHarmony(以下简称"OpenHarmony")是由开放原子开源基金会孵化及运营的开源项目,是面向全场景.全连接.全智能时代的智能物联网操作系统 ...

  9. Mybatis实现增删改查

    ​1.CRUD 1.1namespace namespace中的包名必须和Dao/mapper接口包名一致 1.2select 选择,查询语句 id:就是对应的namespace中的方法名 resul ...

  10. JavaScript 高阶技巧

    0x01 深浅拷贝 开发中经常需要拷贝(复制)一个对象,如果直接赋值,则对拷贝对象的修改会影响到源对象 const o1 = { a: 1, b: 2 } const o2 = o1 console. ...