本节重点介绍 :
- 降低采集资源消耗的收益
- 哪些是无用指标,什么判定依据
- 通过 grafana的 mysql 表获取所有的 查询表达式expr
- 通过 获取所有的prometheus rule文件获取所有的 告警表达式expr
- 通过 获取所有的prometheus 采集器接口 获取所有的采集metrics
- 计算可得到现在没用到的metrics列表
- 计算方法为 所有采集到的-(告警的+看图的)
降低采集资源消耗的收益
- 缓存系统内存使用降低
- 监控系统为了加快查询速度会在各个环节上设置缓存
- 那么如果采集指标过多,无疑会使缓存内存使用变多
- 存储系统磁盘使用降低
- 持久话存储的磁盘使用量和监控指标的数量是成正比的
- 组件间网络传输流量降低
- 更多的监控指标数据意味着,组件间网络传输流量更大
- 查询速度提升降低
- 更多的监控指标意味着查询的速度会被拖慢
收益实例
- 分析cadvisor 和 node_exporter中可以被drop的指标及其采集方式,去掉后 采集qps下降25%
哪些是无用指标,什么判定依据
- 一句话就可以总结 :always collect ,never used
指标的使用
- 看图使用
- 告警使用
那么系统中除了看图和告警使用的指标理论上都可以去掉
- 但是要注意的点是,有些指标今天没用到是还没发现它的意义
- 有可能明天就会使用
具体的判定依据
看图侧
- 假设所有的看图都配置在grafana中
- 通过grafana 的dashboard 接口或者 grafana的 mysql 表获取所有的 查询表达式expr
- 对应就是众多的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()
告警侧
- 获取所有的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
- 截图
- 可以命名为 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列表
- 计算方法为 所有采集到的-(告警的+看图的)