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

 更新时间:2023年04月11日 09:37:56   作者:政采云技术  
这篇文章主要为大家介绍了业务系统的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业务系统的资料请关注脚本之家其它相关文章!

相关文章

  • Java 自定义注解在登录验证的应用示例

    Java 自定义注解在登录验证的应用示例

    本文主要介绍了Java 自定义注解在登录验证的应用示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java中的自旋锁与阻塞锁详解

    Java中的自旋锁与阻塞锁详解

    这篇文章主要介绍了Java中的自旋锁与阻塞锁详解,阻塞锁是指当线程尝试获取锁失败时,线程进入阻塞状态,直到接收信号后被唤醒,阻塞或者唤醒一个Java线程需要操作系统切换CPU 状态来完成,这种状态转换 需要耗费处理器时间,需要的朋友可以参考下
    2023-10-10
  • Java8实现对List<Integer>的求和

    Java8实现对List<Integer>的求和

    这篇文章主要介绍了Java8实现对List<Integer>的求和方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Java String创建对象实例解析

    Java String创建对象实例解析

    这篇文章主要介绍了Java String创建对象实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • java返回的List进行add操作报错

    java返回的List进行add操作报错

    本文主要介绍了java返回的List进行add操作报错,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java垃圾回收机制算法详解

    Java垃圾回收机制算法详解

    这篇文章主要介绍了Java垃圾回收机制算法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot中实现@Scheduled动态定时任务

    SpringBoot中实现@Scheduled动态定时任务

    SpringBoot中的@Scheduled注解为定时任务提供了一种很简单的实现,本文主要介绍了SpringBoot中实现@Scheduled动态定时任务,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Springboot集成restTemplate过程详解

    Springboot集成restTemplate过程详解

    这篇文章主要介绍了Springboot集成restTemplate过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java实现二叉搜索树的插入、删除功能

    Java实现二叉搜索树的插入、删除功能

    这篇文章主要介绍了Java实现二叉搜索树的插入、删除,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • 浅谈JAVA工作流的优雅实现方式

    浅谈JAVA工作流的优雅实现方式

    这篇文章主要介绍了浅谈JAVA工作流的优雅实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11

最新评论