我的编程空间,编程开发者的网络收藏夹
学习永远不晚

业务系统的Prometheus实践示例详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

业务系统的Prometheus实践示例详解

什么是 Prometheus

Prometheus(普罗米修斯)是古希腊的一个神明,名字的意思是「先见之明」。从它的名字可以看出,Prometheus 是做「先见之明」的监控告警用途。

官网描述为From metrics to insight,用指标洞察系统。

Prometheus 其实就是一个数据监控解决方案,它能帮你简单快速地搭建起一套可视化的监控系统。

例如研发比较关注机器的 CPU、内存、硬盘,产品和运营比较关注运营层面的指标,例如新增用户数,日活等,都可以通过 Prometheus 和 grafana 简单,直观化展示。

例如下图 JVM 的监控。

业务实践背景

公司某个业务需要 n 个评审专家对同一批 n 张业务报表批量签字。3 方签字接口只有支持单个报表签字,所以需要 n*n 次,单次签字逻辑复杂,流程较长,所有后台用线程池做了异步化。

签字作为业务的核心节点,不能有故障。所以怎么监控线程池的关键指标,实现动态调整参数,当任务数量过多告警,是一个需要解决的痛点。

我们通过 Prometheus 自定义线程池的指标,grafana 展示,apollo 动态调整线程池的变量,实现弹性扩展。

实践

线程池参数动态更新

通过接入 apollo 配置,当检测到线程池的配置变化时,重新设置:

  • 核心线程数
  • 最大线程数
  • 修改线程空闲时间
@Component
public class ApolloRefreshConfig {
    @Resource
    private RefreshScope refreshScope;
    @Resource
    private ApplicationContext applicationContext;
    @Resource
    private ThreadPoolExecutor executorService;
    @ApolloConfigChangeListener
    public void onChange(ConfigChangeEvent changeEvent) {
        applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
        refreshScope.refreshAll();
        // 刷新变量
        asyncRequestTaskConfigChange(changeEvent.changedKeys());
    }
    private void asyncRequestTaskConfigChange(Set<String> changedKeys) {
        //apollo 变更的是线程池变量
        if (changedKeys.contains(EvaluationProcessAsyncRequestTaskConfig.ASYNC_REQUEST_TASK_CHANGE_FLAG_KEY)) {
            // 核心线程数
            Integer corePoolSizeOld = executorService.getCorePoolSize();
            if (!corePoolSize.equals(corePoolSizeOld)) {
                executorService.setCorePoolSize(corePoolSize);
            }
            // 最大线程数
            Integer maximumPoolSizeOld = executorService.getMaximumPoolSize();
            if (!maximumPoolSize.equals(maximumPoolSizeOld)) {
                executorService.setMaximumPoolSize(maximumPoolSize);
            }
            // 修改线程空闲时间
            Long keepAliveTimeOld = executorService.getKeepAliveTime(TimeUnit.MINUTES);
            if (!keepAliveTime.equals(keepAliveTimeOld)) {
                executorService.setKeepAliveTime(keepAliveTime, TimeUnit.MINUTES);
            }
        }
    }
}

线程池指标上报

在 springboot 版本 2.X 版本以后,使用 Prometheus 进行监控,只需引入 Spring Boot Actuator 相关的 jar,就可以简单集成,然后我们就可以自定义业务指标,上报 Prometheus 了

<dependency>
    <groupId>cn.gov.zcy.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency

Prometheus 中的核心类 io.micrometer.core.instrument.MeterRegistry 中可以定制各种业务指标,也有封装的例如计数类 Counter,这里引用一个 Gauge 只定义的指标

@Component
public class MonitorFactory {
    @Resource
    private MeterRegistry meterRegistry;
    @Resource
    private ThreadPoolExecutor threadPoolExecutor;
    private ThreadPoolSizeMonitor threadPoolSizeMonitor = new ThreadPoolSizeMonitor(threadPoolExecutor);
    class ThreadPoolSizeMonitor implements ToDoubleFunction {
        private ThreadPoolExecutor executor;
        //计数
        private AtomicDouble monitor = new AtomicDouble(0);
        public Object getMonitor() {
            return monitor;
        }
        public ThreadPoolSizeMonitor(ThreadPoolExecutor executor) {
            this.executor = executor;
        }
        @Override
        public double applyAsDouble(Object o) {
            monitor.set(executor.getPoolSize());
            return monitor.get();
        }
    }
    //上报指标,初始化时注册指标
    @PostConstruct
    public void monitorThreadPool() {
        // 当前存活线程数
        Gauge.builder("ReportBatchSignPool_poolSizeMonitor", threadPoolSizeMonitor.getMonitor(), threadPoolSizeMonitor).register(meterRegistry);
        // 当前活跃(忙碌)线程数
        // 核心存活线程数
        // 提交的任务数
        // 执行完毕的任务数
        // 任务队列积压监控
    }
    //1 分钟更新一次指标数据
    @Scheduled(cron = "0 0/1 * * * ?")
    public void publishWatcher() {
        threadPoolSizeMonitor.applyAsDouble(null);
    }
}

Prometheus 指标展示

用 Prometheus quering 语句查询出具体数值 最后一列展示向量结果 16,查询语法如下

prometheus.io/docs/promet…

grafana 可视化展示

告警配置

grafana 配置告警,配置具体的通知信息,触发规则,告警的通知渠道 参考官方文档

grafana.com/docs/grafan…

通知到叮叮告警群

总结

本文介绍了研发人员通过配置 Prometheus 自定义的业务指标,实现监控告警完整链路的大致的流程。大家也可以定制化除了系统指标(例如 CPU、JVM、IO 等)外,梳理出自己系统的核心业务,添加告警,增强系统的稳定性,做到未雨绸缪,防患于未然。

参考文献

Prometheus 官方文档

grafana 告警 文档

以上就是业务系统的Prometheus实践示例详解的详细内容,更多关于Prometheus业务系统的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

业务系统的Prometheus实践示例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

业务系统的Prometheus实践示例详解

这篇文章主要为大家介绍了业务系统的Prometheus实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-15

react后台系统最佳实践示例详解

这篇文章主要为大家介绍了react后台系统最佳实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-03

ReactQuery系列React Query 实践示例详解

这篇文章主要为大家介绍了ReactQuery系列React Query 实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

Ansible Galaxy命令的使用实践示例详解

这篇文章主要为大家介绍了Ansible Galaxy命令的使用实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-28

Linux时间子系统之时间的表示示例详解

前言 在linux内核中,为了兼容原有的代码,或者符合某种规范,并且还要满足当前精度日益提高的要求,实现了多种与时间相关但用于不同目的的数据结构: 1)jiffies和jiffies_64 内核用jiffies_64全局变量记录系统自启动以
2022-06-04

JavaScript实现系统防挂机(无操作弹窗)的示例详解

在一些学习系统,或者考试系统中。一旦出现长时间未操作,就会判定这个人不在场。所以就会进行退出系统,处于对安全和系统负担还有业务的需求。本文就来用JavaScript做一个系统防挂机功能,需要的可以参考一下
2023-01-09

iOS系统的底层通知框架库示例详解

观察者模式观察者模式是一种用于解耦一系列需要相互协作的类之间进行通信的对象行为模式。它定义了对象之间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。观察者模式的实现一般分为两个步骤:消费者注册通知消息监听
2022-05-26

ERP系统实现机械工业信息化生产的示例分析

ERP系统实现机械工业信息化生产的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、生产流程混乱,生产物料补给不及时有的机械工业生产各个流程操作随意性太
2023-06-05

php项目接入xxl-job调度系统的示例详解

将PHP项目接入XXL-JOB调度系统本指南提供将PHP项目集成到XXL-JOB调度系统的分步说明。了解先决条件、安装步骤、任务创建、调度、监控和高级用法,以帮助您轻松管理和调度任务。
php项目接入xxl-job调度系统的示例详解
2024-04-25

php项目接入xxl-job调度系统的示例详解

目录1. 部署xxl-job调度中心2. 整合xxl-job调度系统2.1 创建执行器项目2.2 新增执行器 2.3 部署执行器项目2.4 新增GLUE模式任务2.5 编写php代码片段1. 部署xxl-job调度中心此处略,请自行百度。下面重点介绍如何将ph
2021-10-16

Python实现统计图像连通域的示例详解

这篇文章主要为大家详细介绍了如何利用Python实现统计图像连通域的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
2023-05-17

.NET6+Quartz实现定时任务的示例详解

摘要:本文介绍了如何使用.NET6和Quartz.NET实现定时任务。文章包含了分步说明,包括安装Quartz.NET包、定义作业和触发器、配置和启动调度程序,以及示例代码。Quartz是一个灵活且可扩展的调度框架,适用于安排和执行大量任务。它提供了高性能、持久化支持和监控功能,但不适合初学者且可能存在复杂性和并发性问题。
.NET6+Quartz实现定时任务的示例详解
2024-04-02

使用Springboot实现OAuth服务的示例详解

OAuth(OpenAuthorization)是一个开放标准,用于授权第三方应用程序访问用户资源,而不需要共享用户凭证。本文主要介绍了如何使用Springboot实现一个OAuth服务,需要的可以参考一下
2023-05-19

JavaScript实现类似Express的中间件系统(实例详解)

在Express中可以给一个请求设置若干个中间件,在处理响应时会按顺序执行这些中间件,正在执行的中间件可以控制是否执行下一个中间件,这篇文章主要介绍了JavaScript实现类似Express的中间件系统的相关资料,需要的朋友可以参考下
2023-02-14

C++实现统计代码运行时间的示例详解

这篇文章主要为大家详细介绍了C++一个有趣的小项目——统计代码运行时间,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-05-19

MySQL 的启动选项和系统变量实例详解

本文实例讲述了MySQL 的启动选项和系统变量。分享给大家供大家参考,具体如下: MySQL的配置信息可以通过两种方式实现,一种是命令行形式,在启动MySQL服务时后边带上相关配置参数,此种方式会在MySQL重启后失效。另外一种是通过写入配
2022-05-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录