从PromQL到Categraf指标:搞定Prometheus+Categraf后的数据查询实战指南 从PromQL到Categraf指标搞定PrometheusCategraf后的数据查询实战指南当你终于完成了Prometheus和Categraf的部署对接看着两个服务都正常运行内心或许会涌起一丝成就感。但很快一个新的挑战摆在面前在Prometheus的Web UI上面对那个空白的查询框你突然意识到——我该查什么怎么查这就像拿到了一把万能钥匙却不知道哪扇门值得打开。本文将带你跨越从部署成功到查询自如的最后一公里。1. 理解Categraf与Prometheus的数据流在开始查询之前我们需要先理清数据是如何从Categraf流向Prometheus的。Categraf作为采集器会定期从系统中收集各类指标如CPU、内存、磁盘等然后通过Remote Write协议将这些指标推送到Prometheus的/api/v1/write接口。与传统的Prometheus拉取模式不同这种推送方式带来一个关键变化指标名称保留了Categraf的原始格式而不是标准的Prometheus指标命名。例如传统Prometheus指标node_memory_MemFree_bytesCategraf推送的指标mem_free这种差异意味着你不能直接照搬PromQL的常见查询语句而需要先了解Categraf暴露的具体指标名称。2. 探查Categraf的指标库2.1 使用--test参数发现可用指标Categraf提供了一个极其实用的功能--test模式。通过在启动命令中添加这个参数你可以查看任意插件采集的具体指标。基本语法如下./categraf --test --inputs 插件名例如要查看内存相关的指标./categraf --test --inputs mem输出示例12:01:43 mem_used agent_hostnamenode1 667467776 12:01:43 mem_commit_limit agent_hostnamenode1 3063525376 12:01:43 mem_high_free agent_hostnamenode1 0 12:01:43 mem_vmalloc_chunk agent_hostnamenode1 0 12:01:43 mem_total agent_hostnamenode1 1832091648每行输出包含三个关键部分指标名称如mem_used标签如agent_hostnamenode1指标值如6674677762.2 常用插件及其指标Categraf内置了数十个采集插件以下是一些最常用的插件及其典型指标插件名称关键指标示例用途说明cpucpu_usage,cpu_userCPU使用率统计memmem_used,mem_free内存使用情况diskdisk_used,disk_free磁盘空间监控diskiodiskio_read_bytes,diskio_write_bytes磁盘I/O统计netnet_in_bytes,net_out_bytes网络流量监控提示可以通过ls conf/input.*命令查看已启用的所有插件配置。3. 在Prometheus中查询Categraf指标3.1 基础查询语法掌握了指标名称后在Prometheus的Web UI中查询就变得简单了。基本模式是直接输入指标名mem_used如果想按主机过滤可以添加标签条件mem_used{agent_hostnamenode1}3.2 实用查询示例以下是一些你可能立即用到的查询示例CPU使用率100 - (avg by(agent_hostname)(irate(cpu_usage_idle[1m])) * 100)内存使用百分比(mem_used / mem_total) * 100磁盘空间使用率(disk_used / disk_total) * 100网络流入速率bytes/sirate(net_in_bytes[1m])3.3 查询技巧与排错当查询没有返回预期结果时可以尝试以下排查步骤检查指标是否存在在Prometheus的Graph页面输入{__name__~.*mem.*}这样的正则表达式列出所有包含mem的指标验证数据新鲜度在Graph页面查看scrape_samples_scraped指标确认数据是否持续更新检查Categraf日志查看logs/categraf.log文件确认是否有采集错误4. 从Prometheus到Grafana的可视化4.1 创建基础仪表板在Grafana中创建基于Categraf指标的仪表板时关键是要正确设置Prometheus数据源。查询语句与在Prometheus UI中使用的完全相同例如CPU面板查询100 - (avg by(agent_hostname)(irate(cpu_usage_idle[1m])) * 100)内存面板查询mem_used{agent_hostname~$host} mem_total{agent_hostname~$host}4.2 告警规则配置Grafana的告警也可以直接基于Categraf指标。例如设置内存不足告警alert: HighMemoryUsage expr: (mem_used / mem_total) * 100 90 for: 5m labels: severity: warning annotations: summary: High memory usage on {{ $labels.agent_hostname }} description: Memory usage is at {{ $value }}%4.3 仪表板变量优化为了使仪表板更灵活可以添加以下变量主机选择变量label_values(agent_hostname)设备选择变量用于磁盘监控label_values(disk_used, device)5. 高级技巧与最佳实践5.1 指标重命名与标准化如果你希望Categraf的指标更符合Prometheus的命名规范可以在config.toml中添加重写规则[[processors.rename]] metric mem_used new_name node_memory_used_bytes5.2 长期存储与降采样对于长期存储需求考虑将Prometheus数据远程写入到VictoriaMetrics或Thanos等解决方案。在config.toml中添加额外的writer[[writers]] url http://victoriametrics:8428/api/v1/write5.3 性能优化建议调整采集频率在config.toml中设置interval 60秒选择性启用插件只启用需要的插件减少资源消耗使用标签过滤在查询时合理使用标签减少处理的数据量6. 实战案例构建完整的监控视图让我们以一个实际的服务器监控为例展示如何将各个指标组合起来CPU监控面板总使用率100 - (avg by(agent_hostname)(irate(cpu_usage_idle[1m])) * 100)各核心使用率100 - (irate(cpu_usage_idle{cpu0}[1m]) * 100)内存监控面板使用量趋势mem_used使用百分比(mem_used / mem_total) * 100缓存与缓冲mem_cached,mem_buffered磁盘监控面板空间使用率(disk_used / disk_total) * 100IOPSrate(diskio_reads[1m]),rate(diskio_writes[1m])吞吐量rate(diskio_read_bytes[1m]),rate(diskio_write_bytes[1m])网络监控面板流量rate(net_in_bytes[1m]) * 8,rate(net_out_bytes[1m]) * 8(转换为bit)错误包rate(net_in_errs[1m]),rate(net_out_errs[1m])在实际项目中我发现最常遇到的问题不是查询语法错误而是对指标含义理解不准确。例如cpu_usage和cpu_usage_idle的关系或者mem_used是否包含缓存。这时候回到--test输出的原始指标值往往能帮助澄清疑惑。