【监控报警体系建设】监控标准与最佳实践

项目监控标准

在生产项目运行过程中,可能会遭遇各种问题。而一个问题的影响程度与其发现时间密切相关。因此,我梳理并总结了一套生产项目应具备的完整监控标准。

一、监控类型明确

  1. timer类监控‌:此类监控包含耗时和计数两种属性,涵盖tp50、tp90、tp99、max以及tps等指标。
  2. counter类监控‌:仅具备计数功能的监控类型,主要用于统计tps(每秒事务数)。
  3. gauge类监控‌:定时记录数值的监控类型,适用于需要周期性捕捉数据波动的场景。

二、必备监控项

(一)项目出入口监控

  1. 对外接口监控 ‌:项目对外提供的http接口、dubbo接口,应配置timer类监控,以精确捕捉接口响应时间及吞吐量。
  2. 消息消费监控 ‌:
    • 若消费线程内处理消息,则加timer类监控,以衡量处理耗时。
    • 若不在消费线程内处理,则加counter类监控,仅统计消息消费次数。
  3. 外部调用监控 ‌:项目调用的其他项目接口,包括http接口、dubbo接口、redis操作、数据库访问、发送mq等,均需加timer类监控,确保外部调用性能可控。
  4. websocket接口监控‌:订阅的websocket接口,接收消息量应加counter类监控,以监控消息接收频率。

(二)项目内存缓存监控

  1. 无限内存队列‌:队列大小应使用gauge类监控,实时反映队列内存占用情况。
  2. 无限大小缓存‌:如guava缓存等,同样适用gauge类监控,确保缓存使用情况清晰可见。

(三)业务监控

  1. 定时任务监控‌:不可中断的定时任务,或有一定间隔时间的任务,应增加执行时间、执行次数及间隔时间的监控,采用timer类监控。
  2. 重要接口成功率‌:重要接口的成功率应使用counter类监控,确保接口稳定性。

三、可选监控项

  1. 缓存命中率‌:使用缓存时,可分别加命中和不命中的counter监控,以评估缓存效率。
  2. 处理流程分支命中率‌:处理流程的分支可分别加命中次数监控,采用counter类监控,优化流程设计。
  3. 消息消费延迟监控‌:消费mq时,可加消息的消费延迟和处理延迟监控,采用timer类监控,确保消息处理及时性。
  4. 内置系统监控‌:包括jvm、系统、数据库连接池等内置监控,可根据项目需求选择性配置。

四、不推荐监控项

  1. 数值差别过大的监控‌:将数值差别过大的监控项放在一起,会导致数值小的数据异常时,在图表上难以体现,影响监控效果。
  2. 监控数据过多‌:监控数据过多时,图表上会密密麻麻地布满线条,难以分辨个别数据的变化趋势。
  3. 不必要的细分监控‌:对于不需要细分的监控项,只做一个监控即可。例如,下单接口的耗时监控,无需区分细节参数,避免监控冗余。

2.grafana监控配置标准(以下内容受版本影响较大,仅供参考)

timer类型

如果监控类型是timer,则需要配置avg,tp50,tp90,tp99,tps,在同一个图中,左边y轴为耗时,右边y轴为次数

假设监控的key是GET__api_v1_order则配置如下

复制代码
// 监控方法耗时的平均值
avg(irate(POST__api_v1_order_seconds_sum[30s])/irate(POST__api_v1_order_seconds_count[30s]))
// tp50,tp90,tp99
max by (quantile)(POST__api_v1_order_seconds)
// 最大值
max(GET__api_v1_order_seconds_max)
// 调用速率,tps
sum(irate(GET__api_v1_order_seconds_count[30s]))

如果是counter类型的监控则只有tps

最终效果图

  • 左边y轴是耗时,右边y轴是tps次数,点击下面指标可单独查看

具体配置方法

  • 平均值和tp50,tp90和tp99配置

  • 最大值和tps配置

  • 将tps的值指定到右边Y轴

  • 将左侧Y轴的单位指定为秒,会自动换算成毫秒或其他单位

单位选择

  • 次数类的单位不用配置
  • 时间类的单位在time→second(s)
  • 字节类的单位在data→bytes
  • 百分比的单位在Msci→percent(0-1)

监控分组

将重要和关键的监控单独分组

3.比较有用的内置函数

函数 说明 示例
sum(key) 求和 -
min(key) 最小 -
max(key) 最大 -
avg(key) 平均 -
count(key) 统计 -
bottomk(num,key) 最小的k个 同下
topk(num,key) 样本值最大的k个元素 topk(3,key),最大的3个 topk(1,etf_receive_delay_seconds{quantile="0.99"}) 这个监控项中最大的一个
quantile(num,key) 分位数 num是一个介于0到1之间的值,表示要计算的分位数。 例如,要计算中位数(第50%分位数),分位数的值为0.5。 如果要计算第90%分位数,则分位数的值为0.9。 quantile(0.9, my_time_series) 统计tp90
rate(key) irate(key) irate和rate都会用于计算某个指标在一定时间间隔内的变化速率。就是tps,推荐使用irate - irate取的是在指定时间范围内的最近两个数据点来算速率; - irate适合快速变化的计数器(counter) - rate取的是在指定时间范围内的所有数据点,算出一组速率,然后取平均值作为结果。 - rate适合缓慢变化的计数器(counter) sum(irate(POST__api_v1_order_seconds_count[30s])) 统计请求数的tps,并汇总求和
increase(key) 获取区间向量中的第一个和最后一个样本并返回其增长量 它会在单调性发生变化时(如由于采样目标重启引起的计数器复位)自动中断。 等同于时间范围内秒数 * rate() increase(task_recon_insert_record_seconds_count[1m]) 1分钟内的增长值
... by(tag,tag)(key) 分组统计,...可以替换为任意运算函数,比如max by,sum by,avg by sum by(uri,status)(irate(http_server_requests_seconds_count{job="etf"}[30s])) 按照uri和status两种tag分别求和统计http接口的请求tps
{name=~"jvm_classes_.*"} 通过正则表达式查询不同的key jvm_classes_.*表示将所有jvm_classes_开头的key查询出来 -
clamp_max(your_metric, 1000) 所有大于1000的值会被替换为1000 -

4.比较有用的内置监控项:

  • 内置监控的key受依赖的监控包版本不同而有所不同,具体key可以在机器上请求监控key查看
  • 以下key不一定在所有系统中存在
监控key 说明
http_server_requests_seconds_count http接口调用次数
http_server_requests_seconds_sum http接口调用总耗时
http_server_requests_seconds_max http接口调用最大耗时
jvm_threads_states_threads jvm线程数监控,区分不同状态
jvm_memory_used_bytes jvm内存使用监控,区分不同的堆区域
jvm_gc_pause_seconds_count gc暂停次数
jvm_gc_pause_seconds_sum gc暂停总时间
jvm_gc_pause_seconds_max gc暂停最大时间
jvm_gc_live_data_size_bytes gc存活数据大小
process_files_open_files 进程打开文件数
system_load_average_1m 1分钟负载
system_cpu_usage 系统cpu使用
kafka_consumer_records_consumed_total_records_total kafka消费数量,包含机器实例和主题的tag
hikaricp_* hikaricp相关监控,包含很多监控项
tomcat_* tomcat相关监控
log4j2_* 日志相关监控
kafka_* kafka相关监控,数量很多

6.项目接入监控

项目需要提供http接口供普罗米修斯拉取监控数据,需要提供http接口给运维配置到普罗米修斯上

spring boot项目一般引入actuator包,然后配置以下配置提供http接口

spring boot项目如何使用actuator,grafana,普罗米修斯,请参考网上教程

相关推荐
AI产品测评官29 分钟前
2026年AI招聘架构深潜:多Agent协同如何打造主动出击智能体代表?
人工智能·架构
mzhan01732 分钟前
Linux: compare的直观性
java·linux·服务器
mask哥38 分钟前
力扣算法java实现汇总整理(下)
java·算法·leetcode
小陈的进阶之路44 分钟前
Python系列课(2)——判断
java·前端·python
刚子编程1 小时前
C# Join 进阶:GroupJoin、性能对决与自定义比较器
java·servlet·c#·join
漫随流水1 小时前
IDEA快速生成构造方法(空参、带参)
java·intellij-idea
spencer_tseng1 小时前
Spring Boot 3.0+ jakarta.*
java·spring boot
Bat U1 小时前
JavaEE|文件操作和IO
java·开发语言
DavidSoCool2 小时前
Spring AI Alibaba ReactAgent 调用Tool 实现多轮对话
java·人工智能·spring·多轮对话·reactagent
神所夸赞的夏天2 小时前
如何获取多层json数据,存成dictionary,并取最大最小值
java·前端·json