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

【监控报警体系建设】监控标准与最佳实践
一、监控类型明确‌timer类监控‌此类监控包含耗时和计数两种属性涵盖tp50、tp90、tp99、max以及tps等指标。‌counter类监控‌仅具备计数功能的监控类型主要用于统计tps每秒事务数。‌gauge类监控‌定时记录数值的监控类型适用于需要周期性捕捉数据波动的场景。二、必备监控项一项目出入口监控‌对外接口监控‌项目对外提供的http接口、dubbo接口应配置timer类监控以精确捕捉接口响应时间及吞吐量。‌消息消费监控‌若消费线程内处理消息则加timer类监控以衡量处理耗时。若不在消费线程内处理则加counter类监控仅统计消息消费次数。‌外部调用监控‌项目调用的其他项目接口包括http接口、dubbo接口、redis操作、数据库访问、发送mq等均需加timer类监控确保外部调用性能可控。‌websocket接口监控‌订阅的websocket接口接收消息量应加counter类监控以监控消息接收频率。二项目内存缓存监控‌无限内存队列‌队列大小应使用gauge类监控实时反映队列内存占用情况。‌无限大小缓存‌如guava缓存等同样适用gauge类监控确保缓存使用情况清晰可见。三业务监控‌定时任务监控‌不可中断的定时任务或有一定间隔时间的任务应增加执行时间、执行次数及间隔时间的监控采用timer类监控。‌重要接口成功率‌重要接口的成功率应使用counter类监控确保接口稳定性。三、可选监控项‌缓存命中率‌使用缓存时可分别加命中和不命中的counter监控以评估缓存效率。‌处理流程分支命中率‌处理流程的分支可分别加命中次数监控采用counter类监控优化流程设计。‌消息消费延迟监控‌消费mq时可加消息的消费延迟和处理延迟监控采用timer类监控确保消息处理及时性。‌内置系统监控‌包括jvm、系统、数据库连接池等内置监控可根据项目需求选择性配置。四、不推荐监控项‌数值差别过大的监控‌将数值差别过大的监控项放在一起会导致数值小的数据异常时在图表上难以体现影响监控效果。‌监控数据过多‌监控数据过多时图表上会密密麻麻地布满线条难以分辨个别数据的变化趋势。‌不必要的细分监控‌对于不需要细分的监控项只做一个监控即可。例如下单接口的耗时监控无需区分细节参数避免监控冗余。2.grafana监控配置标准以下内容受版本影响较大仅供参考timer类型如果监控类型是timer则需要配置avgtp50tp90,tp99tps在同一个图中左边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{quantile0.99})这个监控项中最大的一个quantile(num,key)分位数num是一个介于0到1之间的值表示要计算的分位数。例如要计算中位数第50%分位数分位数的值为0.5。如果要计算第90%分位数则分位数的值为0.9。quantile(0.9, my_time_series)统计tp90rate(key)irate(key)irate和rate都会用于计算某个指标在一定时间间隔内的变化速率。就是tps推荐使用irate- irate取的是在指定时间范围内的最近两个数据点来算速率- irate适合快速变化的计数器counter- rate取的是在指定时间范围内的所有数据点算出一组速率然后取平均值作为结果。- rate适合缓慢变化的计数器countersum(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 bysum by(uri,status)(irate(http_server_requests_seconds_count{jobetf}[30s]))按照uri和status两种tag分别求和统计http接口的请求tps{name~jvm_classes_.*}通过正则表达式查询不同的keyjvm_classes_.*表示将所有jvm_classes_开头的key查询出来-clamp_max(your_metric, 1000)所有大于1000的值会被替换为1000-4.比较有用的内置监控项:内置监控的key受依赖的监控包版本不同而有所不同具体key可以在机器上请求监控key查看以下key不一定在所有系统中存在监控key说明http_server_requests_seconds_counthttp接口调用次数http_server_requests_seconds_sumhttp接口调用总耗时http_server_requests_seconds_maxhttp接口调用最大耗时jvm_threads_states_threadsjvm线程数监控区分不同状态jvm_memory_used_bytesjvm内存使用监控区分不同的堆区域jvm_gc_pause_seconds_countgc暂停次数jvm_gc_pause_seconds_sumgc暂停总时间jvm_gc_pause_seconds_maxgc暂停最大时间jvm_gc_live_data_size_bytesgc存活数据大小process_files_open_files进程打开文件数system_load_average_1m1分钟负载system_cpu_usage系统cpu使用kafka_consumer_records_consumed_total_records_totalkafka消费数量包含机器实例和主题的taghikaricp_*hikaricp相关监控包含很多监控项tomcat_*tomcat相关监控log4j2_*日志相关监控kafka_*kafka相关监控数量很多6.项目接入监控项目需要提供http接口供普罗米修斯拉取监控数据需要提供http接口给运维配置到普罗米修斯上spring boot项目一般引入actuator包然后配置以下配置提供http接口