引言
最近领导们拍板,让开发一个以Prometheus为核心的监控系统,监控服务的某些指标,以及某些厂商提供的机器指标。
然后,机器,没有,只能用一台linux服务器模拟代替。
服务的话,一开始在被监控的服务程序A里面埋点,但是入侵性有点强,点位出了几次BUG,导致A服务几次无法运作。所以,服务指标,就修改为从数据库里面查询,祛除了侵入性(数据库没有的数据让服务对应负责人往数据库里写)。
注意:
prometheus适合用于趋势统计,本质上是周期性拉取数据,储存到prometheus的时序数据库。并提供趋势相关计算函数,以更加直观的方式输出指标的趋势。
它不能替代关系型数据库,断电后会重新计数,也不适合充当计数器。
架构调用时序图
说明
- 官网地址:https://prometheus.io/
- 导出器服务:prometheus的exporter。
- 指标收集器服务:使用JAVA写的一个微服务。它向前端提供将指标聚合为数据的服务,提供创建服务指标、更新节点配置文件、更新告警配置文件、接收以及处理告警消息等功能。
- AlertManager:prometheus告警触发后,固定通知的告警通知组件。而后,AlertManager会通知到其它自定义的服务。
(PS: 对于我而言,只是用到了它的webhook,我觉得有点浪费。但是没有找到告警不通过AlertManager,从Prometheus发送到url的方式。) - 以下是接口调用流程图
设计相关要点
- 监控埋点分为两种,厂家提供、测试时使用的exporter自带,在程序里向prometheus手动编码注册指标。
- 将被监控的数据,提供到前端输出流程:埋点(已埋)->prometheus收集->向primetheus查询->向数据库查询->清洗数据发往前端。
- 若计划将PromSQL以及Prometheus数据查询接口交由前端编写,注意提前展开会议确认。(大概率不会通过,因为我这边前端只负责画界面,相关监控接口,即PromSQL,要后端写)
- 从数据库中获取指标流程:prometheus周期向微服务拉取指标,微服务指向数据库。示例JAVA代码如下:
countApiByApi() 函数方法为提供计数指标的回调方法。
/**
* 创建快照
*
* @param api 注释名
*/
private Gauge creteGauge(String modelName, String api) {
Integer val = 0;
List<Tag> tagList = baseTag();
tagList.add(Tag.of(API_TYPE, api));
tagList.add(Tag.of(MODEL_NAME, modelName));
// 子快照
Gauge gauge = Gauge.builder(API_SUM_GAUGE_NAME, val, value -> countApiByApi(modelName, api))
.tags(tagList)
// 描述
.description(API_SUM_GAUGE_DESP)
// 注册
.register(RegistryUnit.getRegistry());
log.debug("gauge指标:{} tag :{}已创建", API_SUM_GAUGE_NAME, tagList);
return gauge;
}
Prometheus搭建、微服务设计、指标设计参见: