You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:25:25