如何用Logstash Ruby代码计算SNMP CPU指定字段的平均值
Logstash中计算SNMP CPU利用率数组平均值的Ruby实现
需求说明
现有从SNMP获取到的CPU利用率数据,其中cpmCPUTotalTable是包含多个CPU核心数据的数组,每个数组元素包含"1.1.8"字段(对应CPU利用率数值)。需要在Logstash中通过Ruby代码计算该字段的平均值(示例结果:(10+2+1)/3 = 4.3)。
解决方案
在Logstash的filter阶段添加ruby插件,遍历数组提取目标字段值并计算平均值:
filter { ruby { code => ' # 获取目标数组,为空则初始化空数组避免报错 cpu_table = event.get("cpmCPUTotalTable") || [] # 提取所有元素的"1.1.8"字段值,过滤非数值数据 cpu_values = cpu_table.map { |item| item["1.1.8"] }.select { |val| val.is_a?(Numeric) } # 计算平均值,处理空数组情况防止除以0 if cpu_values.size > 0 average_cpu = cpu_values.sum.to_f / cpu_values.size # 将结果保留1位小数存入新字段 event.set("cpu_average", average_cpu.round(1)) else event.set("cpu_average", nil) end ' } }
代码细节解释
event.get("cpmCPUTotalTable") || []:从Logstash事件中读取目标数组,若数组不存在则赋值为空数组,避免后续代码报错cpu_table.map { |item| item["1.1.8"] }:遍历数组,提取每个元素的"1.1.8"字段值.select { |val| val.is_a?(Numeric) }:过滤掉非数值的无效数据,避免计算时出现类型错误cpu_values.sum.to_f / cpu_values.size:将求和结果转为浮点数后计算平均值,保证结果精度event.set("cpu_average", average_cpu.round(1)):将计算结果保留1位小数后存入新字段cpu_average,方便后续日志分析使用- 空数组判断:当数组为空时,将平均值设为
nil,避免触发除以0的异常
测试验证
针对你提供的示例数据,运行上述代码后,cpu_average字段会得到4.3,与预期结果一致。
内容的提问来源于stack exchange,提问作者P N Jain
相关产品推荐
相关产品推荐

