业务系统的Prometheus实践

业务系统的Prometheus实践

什么是 Prometheus

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

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

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

例如研制比较重视机器的 CPU、内存、硬盘,产品和运营比较重视运营层面的目标,例如新增用户数,日活等,都能够经过 Prometheus 和 grafana 简略,直观化展现。

例如下图 JVM 的监控。

业务系统的Prometheus实践

事务实践

布景

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

签字作为事务的中心节点,不能有故障。所以怎么监控线程池的要害目标,完成动态调整参数,当使命数量过多告警,是一个需求解决的痛点。

咱们经过 Prometheus 自定义线程池的目标,grafana 展现,apollo 动态调整线程池的变量,完成弹性扩展。

实践

线程池参数动态更新

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

  1. 中心线程数
  2. 最大线程数
  3. 修正线程闲暇时刻
@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…

业务系统的Prometheus实践

grafana 可视化展现

业务系统的Prometheus实践

告警装备

grafana 装备告警,装备详细的告诉信息,触发规则,告警的告诉渠道 参阅官方文档

grafana.com/docs/grafan…

业务系统的Prometheus实践

业务系统的Prometheus实践

告诉到叮叮告警群

总结

本文介绍了研制人员经过装备 Prometheus 自定义的事务目标,完成监控告警完好链路的大致的流程。大家也能够定制化除了系统目标(例如 CPU、JVM、IO 等)外,整理出自己系统的中心事务,添加告警,增强系统的稳定性,做到未雨绸缪,防患于未然。

参阅文献

Prometheus 官方文档 grafana 告警 文档

引荐阅读

MVCC与数据库锁

浅谈“分布式锁”

浅析根据Spring Security 的身份认证流程

MySQL – InnoDB 内存结构解析

浅谈AI目标检测技能发展史

招贤纳士

政采云技能团队(Zero),包含前端(ZooTeam)、后端、测验、UED 等,Base 在风景如画的杭州,一个赋有激情、发明力和执行力的团队。团队现有500多名研制小伙伴,既有来自阿里、华为、网易的“老”兵,也有来自浙大、中科大、杭电等校的新人。团队在日常事务开发之外,还分别在云原生、区块链、人工智能、低代码平台、中间件、大数据、物料系统、工程平台、性能体验、可视化等领域进行技能探究和实践,推进并落地了一系列的内部技能产品,继续探究技能的新边界。此外,团队还纷纷投身社区建造,现在已经是 google flutter、scikit-learn、Apache Dubbo、Apache Rocketmq、Apache Pulsar、CNCF Dapr、Apache DolphinScheduler、alibaba Seata 等很多优异开源社区的贡献者。

假如你想改动一直被事折腾,期望开端折腾事;假如你想改动一直被告诫需求多些主意,却无从破局;假如你想改动你有才能去做成那个结果,却不需求你;假如你想改动你想做成的事需求一个团队去支撑,但没你带人的位置;假如你想改动原本领悟不错,但总是有那一层窗户纸的含糊……假如你信任信任的力气,信任平凡人能成就非凡事,信任能遇到更好的自己。假如你期望参与到随着事务腾飞的进程,亲手推进一个有着深化的事务了解、完善的技能系统、技能发明价值、影响力外溢的技能团队的成长进程,我觉得咱们该聊聊。任何时刻,等着你写点什么,发给 zcy-tc@cai-inc.com

微信公众号

文章同步发布,政采云技能团队公众号,欢迎重视

业务系统的Prometheus实践