如何编写Prometheus exporter采集文件中存储的设备状态指标值
问题解答
指标类型选择
明确选Gauge类型,原因:
- Histogram 适用于对观测值做分桶统计、计算百分位、求和计数的场景(比如接口延迟、请求大小分布等),完全不适合存储单个设备的离散瞬时状态
- Gauge 专门用于表示可随时增减的瞬时数值,完美匹配设备在线/离线这种会随时间变化的状态值,后续做时序趋势观测也更方便
最优实现方案
核心思路是用Gauge的标签(Label)关联设备ID,把枚举状态映射为数值存储,具体实现步骤如下:
1. 依赖安装
首先安装prometheus客户端库:
pip install prometheus_client
2. 状态映射规则
把文本状态转换为Prometheus支持的数值:
- ONLINE 映射为
1 - OFFLINE 映射为
0
3. 完整实现代码
from prometheus_client import Gauge, start_http_server import time import re # 定义Gauge指标,device_id作为标签关联设备 DEVICE_STATUS = Gauge( 'device_running_status', 'Running status of connected device, 1=ONLINE, 0=OFFLINE', ['device_id'] ) # 状态文件路径,替换为你实际的文件路径 STATUS_FILE_PATH = '/path/to/your/device_status.txt' def update_device_status(): # 正则匹配每一行的设备ID和状态 pattern = re.compile(r'^(DEVICE_\d+)\s*=\s*(ONLINE|OFFLINE)$') status_map = {'ONLINE': 1, 'OFFLINE': 0} # 先清空旧的指标数据,避免已移除的设备残留指标 DEVICE_STATUS.clear() with open(STATUS_FILE_PATH, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue match = pattern.match(line) if match: device_id = match.group(1) status = match.group(2) DEVICE_STATUS.labels(device_id=device_id).set(status_map[status]) if __name__ == '__main__': # 启动exporter服务,监听9101端口(可自定义未被占用的端口) start_http_server(9101) # 每15秒刷新一次状态,可根据你的需求调整间隔 while True: update_device_status() time.sleep(15)
4. 验证与对接
- 启动服务后访问
http://你的服务器IP:9101/metrics就能看到生成的指标,格式示例:
device_running_status{device_id="DEVICE_1"} 1.0 device_running_status{device_id="DEVICE_2"} 0.0 device_running_status{device_id="DEVICE_3"} 1.0 device_running_status{device_id="DEVICE_4"} 0.0
- 在Prometheus配置中添加该exporter的抓取任务,之后就可以在Grafana中选择
device_running_status指标,按device_id分组生成各设备的状态时序图
内容的提问来源于stack exchange,提问作者FestiveHydra235
相关产品推荐
相关产品推荐

