【grafana】创建多变量table插图

这个普罗米修斯的指标啊,大多数都是键值对,而且笔者如果没记错,他这个值还必须是浮点。少数可以设成离散值(Enum),但本质还是一个带翻译功能的键值对

这样的好处是,做起来非常简单,而且很容易塞到内存里,然后因为指标拿过来肯定要做进一步的计算,加减乘除之类的,也会比较方便。但是如果我们要建一个table,也就是一个固定键,后面跟多个可变量。就只能用 merge 或者 join 来做,用grafana来建表就需要多整几步。

这个帖子,笔者会展示如何在grafana里面设置一个多变量一行的表格(table)出来

本文是作者的小笔记,同时也是这篇文章的补充,如果有需要,请移步官网文档系统查看搭建一个grafana + Prometheus + node-exporter + pushgateway + alertmanager的监控解决方案-CSDN博客

Grafana documentation | Grafana documentation

一、【背景描述】

有若干个消费者(理解为客户端或者任务),每天他们会来到窗口前排队,他们每个人都有三个属性(结构体),分别是:

  •         排队号(索引,index)        
  •         健康度(status)
  •         上一次服务时间(last acc time)

分析一下,这本质是一个以消费者姓名(UUID或者name)为唯一索引,后面跟着多个变量的结构,那么我们分析如果制成表,至少有以下需求

  1. 监控的展示是一个表格,以排队号(index)做排序索引,不能是字符串排序而是数字排序(因为grafana默认是字符串排序的…)
  2. 排队号(index)每天都会产生变化,因此排队表格中,人员的位置要同时变更
  3. 消费者姓名(UUID或name)为常量,其余为变量,考虑到Prometheus指标都是键值对,我们要避免变量发生变化的时候,不产生新的行,而是在原有位置更改数据(需要新建多个指标,随后对多个指标做join或者merge操作)

【grafana】创建多变量table插图(1) 

二、【设计指标】

我们直接python写脚本,起三个指标,分别是index,status,last_time。类型笔者这里用Gauge(仪表盘)

 其中

  • status可以约定200为正常,400是没到;
  • last_time用时间戳翻译成时间(prometheus的value必须是浮点,所以用时间戳比较合适,不过注意,grafana的时间戳是13位,所以建议乘一个1000)
import prometheus_client

def urfunction(person):
    pass
    vars_dicts[f'person_index_{person}'].labels(name=person).set(2)
    vars_dicts[f'{person}_status'].labels(name=person).set(200)
    vars_dicts[f'{person}_last_time'].labels(name=person).set(1717152964000)

if __name__ == "__main__":
    pass
    # 这里注意一下,如果这个laoban有时候会不来,那么要考虑他不来的情况,防止no data带崩整个程序
    person_List = ['laowang','xiaobaober','dahuang','heinu','laoban']
    
    ## 用字典初始化变量,一来方便管理,二来方便变量回收
    vars_dict = {}
    for person in person_List:
        vars_dict[f'person_index_{person}'] = Gauge(f'{person}_index',
                                    'index of each person', ['name'])
        vars_dict[f'person_status_{person}']  = Gauge(f'{person}_status', 
                                    'Status of each person', 
                                    ['name'])
        vars_dict[f'person_lasttime_{person}']= Gauge(f'{person}_last_time', 
                                    'time of each person', 
                                    ['name'])
    ## end init vars
    
    # UP Exporter
    start_http_server(8848)

    while True:
        for person in person_List:
            urfunction(laowang)    # 可以写一个函数更新我们的指标
# 每10秒更新一次指标,这个时间不准,就图一乐
# 想要更准确,用timer或者硬件中断做         
        time.sleep(10)  

然后把指标脚本跑起即可,并且在prometheus处确定exporter已成功连接

python3 ur_script.py

三、【设计图表】

设计完自定义的指标,接下来我们需要在grafana中配置一下图表,因为是多个指标我们做到一个表中,需要弄一些变换。

1. 进入你的grafana——> dashboards ——> 新建一个visualization

【grafana】创建多变量table插图(2)

2. 右侧选取图表类型为Table,并添加我们之前设置的三个指标(add query)

【grafana】创建多变量table插图(3)

3. 添加 transform data

(1)filter fields by name

隐藏不需要的列,我们在grafana中引用指标的时候,会额外显示Time __name__ instance job,我们这里不但用不上,他还会阻碍我们后续对指标进行合并(merge),很好理解,多余的列会让merge失效,从而产生多行而不是一行

【grafana】创建多变量table插图(4)

(2)merge series/tables

直接加就好了,没什么好说的

【grafana】创建多变量table插图(5)

(3)Oraganize field by name

本质就是重命名,因为prometheus的指标本质是一个键值对,值是没有名字的,只会显示val1,val2,所以我们用这个给他重新起个名字

【grafana】创建多变量table插图(6)

(4)Convert field type

数值类型转换,把 prometheus 取到的浮点转化为我们需要的类型。

对index变为num方便按照数字而非字符排序;

对时间将其转换为时间格式,方便查看;

【grafana】创建多变量table插图(7)

(5)sort by

排个序,如果不用这个,可以鼠标点击table的表头,也能升序降序,但是会有一个箭头在上面,不好看

【grafana】创建多变量table插图(8)

 4. 效果图

【grafana】创建多变量table插图(9)

5. 思考

这个监控的设计,本质是要求每天来的消费者都一样,才能正常工作,如果出现了新旧消费者变更,则会出现index混乱重复的情况,我们如何设计一个完全不受此限制的图表?

四、【参考】

  1.  client_python (prometheus.github.io)
  2.  Getting started | Prometheus
本站无任何商业行为
个人在线分享 » 【grafana】创建多变量table
E-->