当前位置: 首页 > news >正文

25.1 降低采集资源消耗的收益和无用监控指标的判定依据

本节重点介绍 :

  • 降低采集资源消耗的收益
  • 哪些是无用指标,什么判定依据
    • 通过 grafana的 mysql 表获取所有的 查询表达式expr
    • 通过 获取所有的prometheus rule文件获取所有的 告警表达式expr
    • 通过 获取所有的prometheus 采集器接口 获取所有的采集metrics
    • 计算可得到现在没用到的metrics列表
      • 计算方法为 所有采集到的-(告警的+看图的)

降低采集资源消耗的收益

  • 缓存系统内存使用降低
    • 监控系统为了加快查询速度会在各个环节上设置缓存
    • 那么如果采集指标过多,无疑会使缓存内存使用变多
  • 存储系统磁盘使用降低
    • 持久话存储的磁盘使用量和监控指标的数量是成正比的
  • 组件间网络传输流量降低
    • 更多的监控指标数据意味着,组件间网络传输流量更大
  • 查询速度提升降低
    • 更多的监控指标意味着查询的速度会被拖慢

收益实例

  • 分析cadvisor 和 node_exporter中可以被drop的指标及其采集方式,去掉后 采集qps下降25%
  • drop_result.png

哪些是无用指标,什么判定依据

  • 一句话就可以总结 :always collect ,never used

指标的使用

  • 看图使用
  • 告警使用

那么系统中除了看图和告警使用的指标理论上都可以去掉

  • 但是要注意的点是,有些指标今天没用到是还没发现它的意义
  • 有可能明天就会使用

具体的判定依据

看图侧

  • 假设所有的看图都配置在grafana中
  • 通过grafana 的dashboard 接口或者 grafana的 mysql 表获取所有的 查询表达式expr
  • image.png
  • 对应就是众多的promql,在其中解析出所有的metrics
  • 就可以获得看图侧的 metrics 列表 ,可以命名为graph_metrics_set
python脚本
  • 创建db对象连接grafana 数据库
  • 查询所有的 dashboard
  • 遍历dashboard中的panel 对象获取 expr对象
  • 将expr和prometheus metric 正则匹配,匹配到就是metric
# pip install sqlalchemy PyMySQL
import re
import json
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmakerMETRIC_NAME_RE = re.compile(r'.*?([a-zA-Z_:][a-zA-Z0-9_:]*){.*?')GRAFANA_SLAVE_DB_HOST = "172.20.70.205"
GRAFANA_SLAVE_DB_PORT = 3306
GRAFANA_SLAVE_DB_USER = "root"
GRAFANA_SLAVE_DB_PASS = "123123"def init_grafana_db_session():engine = create_engine('mysql+pymysql://{}:{}@{}:{}/grafana'.format(GRAFANA_SLAVE_DB_USER,GRAFANA_SLAVE_DB_PASS,GRAFANA_SLAVE_DB_HOST,GRAFANA_SLAVE_DB_PORT))# 创建DBSession类型:dbSession = sessionmaker(bind=engine, autocommit=True)return dbSession()def get_metrics_from_grafana_db():ds = init_grafana_db_session()res = ds.execute('select  data,slug from dashboard ')exprs = set()for r in res:try:data = json.loads(r[0])panels = data.get("panels")if not panels:continuefor p in panels:if not p:continuetargets = p.get("targets")if not targets:continuefor i in targets:ee = i.get("expr")ddd = METRIC_NAME_RE.findall(ee)exprs.update(set(ddd))except Exception as e:print(e)ss = sorted(list(exprs))print(ss)return ssget_metrics_from_grafana_db()

image.png

告警侧

  • 获取所有的prometheus rule文件
  • 根据rule文件中的promql 解析出metrics,可以命名为 alert_metrics_set
python 脚本
  • 打开rule yaml 文件,逐行获取
  • 用正则匹配,匹配到的即为metric
import reMETRIC_NAME_RE = re.compile(r'.*?([a-zA-Z_:][a-zA-Z0-9_:]*){.*?')def get_metrics_from_rule_file(rule_file):exprs = set()with open(rule_file, encoding='UTF-8') as f:for i in f.readlines():if not "expr" in i:continueddd = METRIC_NAME_RE.findall(i)exprs.update(set(ddd))ss = sorted(list(exprs))print(ss)return ssget_metrics_from_rule_file("rule.yml")

采集侧

  • 根据所有的采集器的接口获取其对应的metrics列表,对应接口如下
/api/v1/label/__name__/values
  • 意思是获取__name__标签的values列表,也就是所有的metircs_name
  • 截图
  • image.png
  • 可以命名为 scrape_metrics_set
python脚本
import requestsdef get_metrics_names(host):url = "http://{}/api/v1/label/__name__/values".format(host)res = requests.get(url)print(res.status_code)exprs = res.json().get("data")if not exprs:returnss = sorted(list(exprs))print(ss)return ssget_metrics_names("172.20.70.215:8091")

计算可得到现在没用到的metrics列表

  • 计算方法为 所有采集到的-(告警的+看图的)
scrape_metrics_set - (alert_metrics_set + graph_metrics_set)

本节重点总结 :

  • 降低采集资源消耗的收益
  • 哪些是无用指标,什么判定依据
    • 通过 grafana的 mysql 表获取所有的 查询表达式expr
    • 通过 获取所有的prometheus rule文件获取所有的 告警表达式expr
    • 通过 获取所有的prometheus 采集器接口 获取所有的采集metrics
    • 计算可得到现在没用到的metrics列表
      • 计算方法为 所有采集到的-(告警的+看图的)

http://www.mrgr.cn/news/49388.html

相关文章:

  • 7-2 试试多线程
  • 探索C#编程基础:从输入验证到杨辉三角的生成
  • Java——数组的定义与使用
  • AndroidLogger 使用问题
  • 大厂面试真题-AQS中节点的入队时机有哪些
  • React入门 9:React Router
  • 【汇编语言】寄存器(CPU工作原理)(七)—— 查看CPU和内存,用机器指令和汇编指令编程
  • 多语言网站的设计的探索——安企CMS多语言功能的实现记录
  • Python字符串格式
  • 鸿蒙开发 三十七 ArkTs类 class
  • HAL库常用的函数:
  • oracle存储过程
  • 位定时结构
  • 面试真题 | 百度C++研发工程师面经
  • 动态规划最大子段和讲解和【题解】——最大子段和
  • springcloud之服务提供与负载均衡调用 Eureka
  • 『香驰控股』上线采购数字化平台,企企通助推农业产业化国家重点龙头提升供应链价值
  • AttributeError: ‘str‘ Object Has No Attribute ‘x‘:字符串对象没有属性x的完美解决方法
  • 【优选算法篇】双指针的优雅舞步:C++ 算法世界的浪漫探索
  • 【C++】— 类和对象(3)