telegraf中获取出来的disk相关的监控,如何添加一个disk 序列号的tag

news/2024/12/26 19:45:21/文章来源:https://www.cnblogs.com/larhuan/p/18634086

查看telegraf关于diskio输出的文档
https://github.com/influxdata/telegraf/tree/master/plugins/inputs/diskio

  ## Device metadata tags to add on systems supporting it (Linux only)## Use 'udevadm info -q property -n <device>' to get a list of properties.## Note: Most, but not all, udev properties can be accessed this way. Properties## that are currently inaccessible include DEVTYPE, DEVNAME, and DEVPATH.# device_tags = ["ID_FS_TYPE", "ID_FS_USAGE"]

telegraf 在linux 添加设备元数据标签
使用 “udevadm info -q property -n ” 命令来获取属性列表
-q property: 指定输出信息的类型为设备属性
-n : 指定查询的设备信息

输出示例
DEVLINKS=/dev/disk/by-id/ata-WDC_WD10EZEX-00RQHB0_WD-WCC4K0E89672-part1 /dev/disk/by-id/wwn-0x50014ee20b1b5c42-part1 /dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0-part1 /dev/disk/by-uuid/12345678-9abc-def0-1234-56789abcdef0
DEVNAME=/dev/sda1
DEVPATH=/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda/sda1
DEVTYPE=partition
ID_BUS=ata
ID_FS_TYPE=ext4
ID_FS_UUID=12345678-9abc-def0-1234-56789abcdef0
ID_FS_UUID_ENC=12345678-9abc-def0-1234-56789abcdef0
ID_FS_VERSION=1.0
ID_MODEL=WDC_WD10EZEX-00RQHB0
ID_MODEL_ENC=WDC_WD10EZEX-00RQHB0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
ID_PART_ENTRY_DISK=8:0
ID_PART_ENTRY_NUMBER=1
ID_PART_ENTRY_SCHEME=dos
ID_PART_ENTRY_SIZE=209715200
ID_PART_ENTRY_START=2048
ID_PART_ENTRY_TYPE=0x83
ID_PART_TABLE_TYPE=dos
ID_PATH=pci-0000:00:1f.2-scsi-0:0:0:0
ID_PATH_TAG=pci-0000_00_1f_2-scsi-0_0_0_0
ID_SERIAL=WD-WCC4K0E89672
ID_SERIAL_SHORT=WD-WCC4K0E89672
ID_TYPE=disk
ID_WWN=0x50014ee20b1b5c42
ID_WWN_WITH_EXTENSION=0x50014ee20b1b5c42
MAJOR=8
MINOR=1
SUBSYSTEM=block
USEC_INITIALIZED=1234567890说明
DEVLINKS: 设备的符号链接。
DEVNAME: 设备节点名称。
DEVPATH: 设备在设备树中的路径。
DEVTYPE: 设备类型,例如 partition。
ID_BUS: 设备的总线类型,例如 ata。
ID_FS_TYPE: 文件系统类型,例如 ext4。
ID_FS_UUID: 文件系统的UUID。
ID_MODEL: 设备的型号。
ID_PART_ENTRY_DISK: 分区所在的磁盘设备。
ID_PART_ENTRY_NUMBER: 分区编号。
ID_PART_ENTRY_SCHEME: 分区表类型,例如 dos。
ID_PART_ENTRY_SIZE: 分区大小(以512字节为单位)。
ID_PART_ENTRY_START: 分区起始扇区。
ID_PART_ENTRY_TYPE: 分区类型,例如 0x83 表示Linux分区。
ID_PATH: 设备的路径。
ID_SERIAL: 设备的序列号。
ID_TYPE: 设备类型,例如 disk。
MAJOR: 主设备号。
MINOR: 次设备号。
SUBSYSTEM: 设备所属的子系统,例如 block。
USEC_INITIALIZED: 设备初始化时间(以微秒为单位)

目前需要用到设备的序列号,所以在配置文件[[inputs.diskio]] 部分增加

[[inputs.diskio]]
device_tags = ["ID_SERIAL"]

然后在虚拟机里面使用telegraf测试命令,可以看到disk_io的监控信息里面增加名为"ID_SERIAL"的tag。
telegraf --config /etc/telegraf/telegraf.conf --test

到此disk_io相关的监控指标值上都有了名为"ID_SERIAL"的tag。

但是希望disk相关的监控值,也加上名为"ID_SERIAL"的tag,
但是查看https://github.com/influxdata/telegraf/tree/master/plugins/inputs/disk里面,并没有相关配置可以进行配置。
只能从protheutheus监控指标加tag的方向入手,找到了Prometheus 两个label相关的函数。
简单了解了一下这两个函数的用法。
label_replace()
允许基于正则表达式匹配、修改和创建指标的标签。

label_replace(<vector selector>,  "<dst_label>",     "<replacement>", "<src_label>","<regex>"
)

"": 指标选择器,指定要操作的指标。
"<dst_label>": 目标标签的名称,新的标签将创建或者更新这个标签。
"": 用于替换的字符串。 可以使用捕获组引用 ($1, $2, …)。
"<src_label>": 源标签的名称,将从这个标签中读取数据。
"": 用于匹配源标签值的正则表达式。
工作原理:

  1. label_replace() 函数会遍历 选择的所有指标
  2. 对于每个指标,它会尝试用 匹配 <src_label> 的值。
  3. 如果匹配成功,则会根据 创建或更新 <dst_label> 的值。在 中,可以使用 $1, $2, … 来引用正则表达式捕获的分组
  4. 如果匹配失败,则不进行任何操作,<dst_label> 的值保持不变(如果存在)或者不创建(如果不存在)

使用示例:
prometheus_http_requests_total{code="200", container="prometheus", endpoint="web", handler="/api/v1/labels", job="prometheus-k8s", namespace="kube-system", pod="prometheus-k8s-0", service="prometheus-k8s"}

增加tag值
eg:

  1. 从 handler中提取 API 版本并放入 api_version 标签
    label_replace(prometheus_http_requests_total, "api_version", "$1", "handler", "/api/(v[0-9]+)/.*")
    结果
    prometheus_http_requests_total
  2. 将handler中提取最后一部分放入 api_version标签
    label_replace(prometheus_http_requests_total, "api_version", "\(1", "handler", "/[^/]+/([^/]+)\)")
  3. 将handler的所有值放入 api_version 标签
    label_replace(prometheus_http_requests_total, "api_version", "$1", "handler", "(.+)")
    (.+) 表示匹配任何非空字符序列,并将其捕获为第一个组
    prometheus_http_requests_total
  4. 将endpoint的值赋值给instance
    label_replace(prometheus_http_requests_total, "instance", "$1", "endpoint", "(.+)")
    结果
    prometheus_http_requests_total

label_join()
将多个标签的值连接成一个字符串,并将其设置为新的标签的值。
label_join(
,
"<dst_label>",
"",
"<src_label_1>",
"<src_label_2>",
...
)
: 指标选择器,指定要操作的指标。
"<dst_label>": 目标标签的名称,将创建或更新这个标签。
"": 用于连接标签值的分隔符。
`”“, ““, …: 要连接的源标签的名称。

工作原理:
1.label_join() 函数会遍历 选择的所有指标。
2. 对于每个指标,它会获取所有指定的 <src_label> 的值。
3. 它会将这些值使用 连接起来。
4. 将连接后的字符串设置为 <dst_label> 的值。

eg:
node_bonding_slaves{endpoint="https-metrics",job="node-exporter", master="bond1", namespace="kube-system", pod="node-exporter-p7nkv", service="node-exporter"}

将 job 和 pod 连接到 job_pod 标签:
label_join(node_bonding_slaves, "job_pod", "-", "job", "pod")

node_bonding_slaves{endpoint="https-metrics", job="node-exporter", job_pod="node-exporter-node-exporter-p7nkv", master="bond1", namespace="kube-system", pod="node-exporter-p7nkv", service="node-exporter"}
ps:过度使用 label_replace() 和 label_join() 会影响 Prometheus 的查询性能。 在不需要时避免使用。

发现这两个函数,其实都是将一个指标的tag,用于给自己重新增加新的tag或者修改掉某个tag的值,并不能满足需要。
只能另寻他法,发现可以通过自己造一个disk_io指标的0值,然后再通过与disk相关的指标进行相加运算后使用group_left函数,获取disk的tag。
简单介绍一下,group_left和group_right函数的用法。
主要用于处理向量之间的聚合运算,控制哪些标签会被保留,哪些标签会被丢弃。
默认情况下,只有两个向量中都存在的标签才会保留。 group_left 和 group_right 允许你指定 左侧向量的标签 或 右侧向量的标签,即使它们在另一个向量中不存在,也需要保留。

<聚合操作>  ( <向量> ) <group_left|group_right>  ( [<标签列表>] )  [<向量>]
<聚合操作>  ( <向量> )  [<向量>]  <group_left|group_right>  ( [<标签列表>] ) <聚合操作>: sum, avg, max, min, count, stddev, stdvar, topk, bottomk, quantile, 等
<向量>: PromQL查询的结果,代表时间序列数据。
group_left: 保留左侧向量的标签 (除了用于聚合的标签)。
group_right: 保留右侧向量的标签 (除了用于聚合的标签)。
[<标签列表>]: (可选) 要保留的标签列表。如果不指定,则保留所有未参与聚合的标签。

sum(rate(http_requests_total[5m])) by (job, instance)
/ on(job, instance)
group_left(service)
kube_pod_info
首先计算每个 job 和 instance 的 HTTP 请求速率,然后使用 on(job, instance) 将其与 kube_pod_info 指标关联。最后,使用 group_left(service) 将结果按照 service 进行分组.
on 关键字用于指定在聚合操作时需要匹配的标签

在prometheusrule里面增加指标- expr: diskio_io_time-diskio_io_timerecord: diskio_0这个是包含diskio_io_time所有tag的一个指标名通过这个指标名称和disk指标相加,在uuid和name相匹配的情况下获取disk的标签,来将ID_Serial的标签加到disk上面disk_used + on (uuid, name) group_left(ID_SERIAL) diskio_0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/859415.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# WPF PrintDialog 打印(2)

前面https://www.cnblogs.com/yinyu5/p/18633910使用PrintVisual方法只打印了可见部分的元素,所以这里改为使用PrintDocument方法来进行打印。 需要引用System.Printing.dll 界面代码:1 <Window x:Class="WpfApp123.MainWindow"2 xmlns="http://sc…

Redis可视化工具推荐:Another Redis Desktop Manager使用教程与下载

Redis是一种高性能的Key-Value数据库,被广泛应用于缓存、消息队列等场景。尽管Redis的命令行工具功能强大,但对于许多开发者而言,使用一款可视化工具可以大大提高操作效率和用户体验。今天为大家推荐一款功能强大的Redis可视化工具——Another Redis Desktop Manager,并提供…

RISC-V篇-VSCode+qemu+gdb可视化调试Linux Kernel

https://zhuanlan.zhihu.com/p/4185359719本文发布于微信公众号:Linux底层小工,欢迎关注,获取更多原创技术文章! “VSCode+qemu+gdb调试OpenSBI确实很爽,那怎能少了调试kernel呢~~” 01 VScode调试MMU开启之前的kernel 有了调试OpenSBI的基础,再调试kernel,那设置相当简…

中考阅读理解深入逻辑分析-006 A Streams Journey to the Sea 一条小溪通往大海的旅程

文章正文 A little stream ran down from a high mountain far, far away through many villages and forests, until it reached a desert. The stream then thought,“I’ve been through countless difficulties. I should have no problem crossing the desert!”But as sh…

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 自学教材《C语言程序设计》…

Chrome 或引入 Gemini AI 功能「Glic」,需访问麦克风;理想同学 App 即将上线支持语音交流、识物

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

洛谷题单指南-线段树的进阶用法-P3834 【模板】可持久化线段树 2

原题链接:https://www.luogu.com.cn/problem/P3834 题意解读:静态区间第k小问题,可持久化线段树(也称为主席树)模版题。 解题思路: 一、朴素想法:如何求完整区间[1,n]第k小 1、权值线段树 设n个数构成序列a,b数组代表a中元素出现的次数,即b数组的构建方式为对每一个a[…

FTP一键安装脚本(linux版)

简述:linux版权限可能会不容易理解,可参考windwos做为基础。一、FTP(linux版) 1. ftp详解 简介: vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。 vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、…

React—01—基本学习,如何在html中直接使用react;

一、react的特点:<script>标签这里要加一个“text/babel”,babel才知道这个<script>标签里要解析js代码,否则babel不会启动。 React 组件是返回标签的 JavaScript 函数:哪个组件是通过改变 state 实现可响应的,或者哪个组件拥有 这个 state。 然后我们需要确定…

记录python+pyside+qml+qtcharts 使用,防踩坑

使用QML-qtquick 进行开发时,有个使用chart图表的需求,看了一大圈,网上都是qmake或是cmake来构建QTchart,用python开发也只搜到QtWidgets模块进行图表绘制。然而我对qtwidgets不是很了解,想要的是QML开发,在使用ChartView{}时一直闪退,没有效果。经历了苦苦搜寻,终于在 h…

制作了一款 pdf 转换图片的工具( csharp 版 )

在 Windsurf 的帮助下,制作了一款 windows 下的 pdf 转换图片(png/jpg/tif)工具。支持递归查找 pdf,一些配置给写死了,适合简单使用。 PDF 批量转图片工具 这是一个功能强大且易用的 PDF 转图片工具,专为批量处理 PDF 文件设计。它能够将 PDF 文件的每一页转换为高质量的…

C# WPF PrintDialog 打印(1)

参考“WPF 打印实例”的文章:https://www.cnblogs.com/gnielee/archive/2010/07/02/wpf-print-sample.html 测试程序: 首先打印Canvas效果:看起来似乎没问题,但是调整窗体尺寸遮挡部分元素:再打印Canvas效果:可以发现PrintVisual方法只打印了可见部分的元素,测试打印Dat…