什么是 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 告警 文档
引荐阅读
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
微信公众号
文章同步发布,政采云技能团队公众号,欢迎重视