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

Prometheus自定义脚本监控实战:从Pushgateway到业务指标采集

1. 为什么需要Pushgateway?

在Prometheus的监控体系中,大部分场景都是通过Pull模式来采集数据的。Prometheus服务器会定期从配置好的Exporter中拉取指标数据。这种设计简单高效,但也存在一些局限性。比如,当我们需要监控一些短生命周期的任务或者批处理作业时,这些任务可能还没等到Prometheus来拉取数据就已经结束了。这时候,Pushgateway就派上用场了。

Pushgateway充当了一个中间缓存层的角色。短生命周期的任务可以将自己的监控指标推送到Pushgateway,然后由Prometheus从Pushgateway拉取这些数据。这样既保持了Prometheus整体的Pull架构,又解决了临时性任务监控的问题。

我在实际项目中就遇到过这样的情况:有一个每天凌晨运行的批处理任务,运行时间大概只有几分钟。最初我们尝试直接让Prometheus来拉取数据,但发现经常抓不到数据。后来引入Pushgateway后,这个问题就迎刃而解了。

2. Pushgateway的部署与配置

2.1 安装Pushgateway

Pushgateway是用Go语言编写的,安装非常简单。我们可以直接从Prometheus官网下载预编译好的二进制包:

wget https://github.com/prometheus/pushgateway/releases/download/v1.6.2/pushgateway-1.6.2.linux-amd64.tar.gz tar xvf pushgateway-1.6.2.linux-amd64.tar.gz cd pushgateway-1.6.2.linux-amd64

为了便于管理,我习惯将Pushgateway配置为系统服务。创建一个systemd服务文件:

cat > /etc/systemd/system/pushgateway.service <<EOF [Unit] Description=Prometheus Pushgateway After=network.target [Service] User=prometheus Group=prometheus ExecStart=/usr/local/bin/pushgateway \ --persistence.file=/var/lib/pushgateway/pushgateway.data \ --persistence.interval=5m Restart=on-failure [Install] WantedBy=multi-user.target EOF

这里有几个关键参数需要注意:

  • --persistence.file:指定数据持久化文件路径
  • --persistence.interval:数据持久化间隔时间

创建必要的目录并设置权限:

mkdir -p /var/lib/pushgateway chown -R prometheus:prometheus /var/lib/pushgateway

然后启动服务并设置开机自启:

systemctl daemon-reload systemctl start pushgateway systemctl enable pushgateway

2.2 Prometheus配置

要让Prometheus从Pushgateway拉取数据,需要在Prometheus的配置文件中添加对应的job配置。编辑prometheus.yml文件,添加如下内容:

- job_name: 'pushgateway' honor_labels: true scrape_interval: 30s static_configs: - targets: ['pushgateway-server:9091'] labels: instance: pushgateway

这里有个很重要的参数honor_labels需要特别注意。当设置为true时,Prometheus会优先使用Pushgateway传过来的标签,否则会覆盖这些标签。在大多数情况下,我们都希望保留推送时的标签信息,所以建议设置为true。

配置完成后,重新加载Prometheus配置:

systemctl reload prometheus

3. 数据推送实战

3.1 基础推送操作

最简单的推送方式是使用curl命令直接发送指标数据。比如我们要推送一个名为"example_metric"的指标,值为3.14:

echo "example_metric 3.14" | curl --data-binary @- http://pushgateway:9091/metrics/job/example_job

这条命令会将指标推送到Pushgateway,并关联到一个名为"example_job"的job。在Prometheus中查询时,这个指标会有job="example_job"的标签。

如果需要推送更复杂的指标,可以这样操作:

cat <<EOF | curl --data-binary @- http://pushgateway:9091/metrics/job/some_job/instance/some_instance # TYPE some_metric counter some_metric{label="val1"} 42 # TYPE another_metric gauge # HELP another_metric Just an example. another_metric 2398.283 EOF

这里我们推送了两个指标,并指定了它们的类型(TYPE)和帮助信息(HELP)。同时,我们还为这个推送组指定了instance标签。

3.2 数据删除操作

有时候我们需要删除Pushgateway中的旧数据。Pushgateway提供了几种删除方式:

删除特定instance的数据:

curl -X DELETE http://pushgateway:9091/metrics/job/some_job/instance/some_instance

删除整个job的数据:

curl -X DELETE http://pushgateway:9091/metrics/job/some_job

如果要删除所有数据(需要启动时启用admin API):

curl -X PUT http://pushgateway:9091/api/v1/admin/wipe

注意最后一个操作需要Pushgateway启动时添加--web.enable-admin-api参数。

4. 实战:Shell和Python脚本集成

4.1 Shell脚本示例

在实际项目中,我们通常会用脚本来自动化指标的采集和推送。下面是一个实用的Shell脚本示例,它会收集系统信息并推送到Pushgateway:

#!/bin/bash # 定义Pushgateway地址和job名称 PUSHGATEWAY="http://pushgateway:9091" JOB_NAME="system_metrics" INSTANCE=$(hostname) # 收集系统指标 CPU_LOAD=$(cat /proc/loadavg | awk '{print $1}') MEM_FREE=$(free -m | awk '/Mem:/ {print $4}') DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%') # 推送指标到Pushgateway cat <<EOF | curl --data-binary @- ${PUSHGATEWAY}/metrics/job/${JOB_NAME}/instance/${INSTANCE} # TYPE cpu_load gauge cpu_load ${CPU_LOAD} # TYPE mem_free gauge mem_free ${MEM_FREE} # TYPE disk_usage gauge disk_usage ${DISK_USAGE} EOF

这个脚本会收集系统的CPU负载、可用内存和根分区使用率,然后推送到Pushgateway。我们可以把这个脚本放到crontab中定期执行:

*/5 * * * * /path/to/script.sh

4.2 Python脚本示例

对于更复杂的监控需求,Python可能是更好的选择。Python有官方的prometheus_client库,使用起来非常方便。首先安装客户端库:

pip install prometheus_client

下面是一个Python脚本示例,它会模拟监控一个应用的队列长度和处理延迟:

#!/usr/bin/env python from prometheus_client import CollectorRegistry, Gauge, push_to_gateway import random import time import socket # 配置信息 GATEWAY = 'http://pushgateway:9091' JOB_NAME = 'app_metrics' INSTANCE = socket.gethostname() # 创建注册表 registry = CollectorRegistry() # 定义指标 queue_size = Gauge('app_queue_size', 'Current size of processing queue', registry=registry) processing_time = Gauge('app_processing_time', 'Time to process an item (ms)', ['item_type'], registry=registry) def collect_metrics(): # 模拟获取队列长度 queue_size.set(random.randint(0, 100)) # 模拟处理不同类型的项目耗时 for item_type in ['image', 'video', 'text']: processing_time.labels(item_type=item_type).set(random.randint(10, 500)) # 推送指标 push_to_gateway(GATEWAY, job=JOB_NAME, registry=registry) if __name__ == '__main__': while True: collect_metrics() time.sleep(60) # 每分钟推送一次

这个脚本定义了两个指标:一个是简单的队列长度,另一个是带标签的处理时间(区分不同类型的处理项)。它会每分钟收集一次数据并推送到Pushgateway。

5. 常见问题与最佳实践

5.1 数据过期问题

Pushgateway的一个常见问题是数据不会自动过期。即使推送数据的进程已经终止,Pushgateway仍然会保留这些数据,直到被显式删除。这可能导致Prometheus中显示的数据与实际不符。

解决方案有几种:

  1. 为短生命周期任务设置显式的过期时间(通过脚本在任务结束时删除数据)
  2. 使用Pushgateway的--metric.timetolive参数(如果版本支持)
  3. 定期清理旧数据

5.2 标签设计

在设计指标标签时,需要注意以下几点:

  • 避免使用高基数的标签(如用户ID、会话ID等),这会导致Prometheus存储压力剧增
  • 为job和instance使用有意义的名称,便于后续查询和告警
  • 保持标签命名的一致性,遵循Prometheus的命名规范

5.3 性能考量

当监控规模较大时,Pushgateway可能成为性能瓶颈。以下是一些优化建议:

  • 为Pushgateway配置足够的资源(特别是内存)
  • 考虑使用多个Pushgateway实例并做负载均衡
  • 适当调整Prometheus的抓取间隔,避免过于频繁
  • 对于高频率更新的指标,考虑在应用端做适当聚合

5.4 监控Pushgateway自身

别忘了监控Pushgateway本身的健康状况。Prometheus自带的Pushgateway exporter会暴露一些有用的指标,比如:

  • pushgateway_http_requests_total:请求计数
  • pushgateway_http_request_duration_seconds:请求延迟
  • pushgateway_build_info:版本信息

可以基于这些指标设置告警,确保Pushgateway正常运行。

http://www.jsqmd.com/news/323639/

相关文章:

  • Pi0机器人控制模型保姆级教程:使用Jupyter Notebook交互式调试
  • 高效语义分析工具推荐:bge-m3镜像开箱即用实战测评
  • Clawdbot网关配置详解:Git版本控制与团队协作实践
  • Vue3甘特图高效开发指南:从技术原理到企业级实践
  • 小白也能懂的VAD技术:FSMN镜像保姆级使用教程
  • DASD-4B-Thinking部署实战:vLLM+Chainlit一键搭建长链思维推理服务
  • Qwen-Image-Edit-F2P开源可审计:模型权重/代码/配置全公开可验证方案
  • 3步解锁Mac多任务效率革命:Topit窗口管理神器让你的工作流提速300%
  • Linux进程状态可视化:用动态追踪技术绘制进程生命周期图谱
  • 网盘提速工具:让文件下载速度飞起来的实用指南
  • Pi0 VLA模型推理性能分析:16GB GPU下6-DOF动作延迟实测报告
  • Fun-ASR WebUI界面体验,操作简单但功能齐全
  • 模型体积0.8GB怎么实现?GGUF-Q4压缩技术实战详解
  • Qwen3-Reranker-4B实战教程:构建面向中小企业的开源搜索中台重排序模块
  • ChatTTS在线服务架构解析:如何实现高并发低延迟的实时语音合成
  • 智能客服系统测试工具实战:从接口压测到对话意图验证的全链路优化
  • YOLO X Layout部署案例:高校AI实验室私有云平台文档理解能力共享服务
  • Qwen3-Reranker-0.6B入门指南:从模型加载、输入构造到score解码全链路
  • GTE中文向量模型部署案例:智能写作助手中的文本润色+情感一致性校验
  • 16种音乐流派一键分类:ccmusic-database开箱即用体验
  • Lychee Rerank MM惊艳案例:社交媒体图文帖重排序Top5结果对比分析
  • LongCat-Image-Editn企业落地手册:API接入OA系统,审批流触发自动修图任务
  • 5分钟攻克键盘连击:键盘连击拦截的智能防御方案
  • 设计效率工具:图层转换的效率革命
  • StructBERT中文语义匹配5分钟快速上手:零基础搭建智能客服系统
  • Linux系统运行Windows软件的高效解决方案:deepin-wine使用指南
  • Clawdbot部署Qwen3:32B降本提效案例:替代OpenAI API,年节省超¥12万推理费用
  • 游戏自动化工具全攻略:从功能解析到安全运行的专家指南
  • 解锁本地多人游戏新可能:Nucleus Co-Op完全指南
  • Qwen3:32B模型微调实战:基于Clawdbot平台的迁移学习