在Logstash的sprintf语法中使用sprintf语法

时间:2018-11-28 16:22:08

标签: printf logstash logstash-configuration

对于以下数据结构:

{
  "sprints": [
    {
      "id": 17193,
      "name": "Sprint 12"
    },
    {
      "id": 16510,
      "name": "Sprint 11"
    }
  ],
  "velocityStatEntries": {
    "16510": {
      "estimated": {
        "value": 49
      },
      "completed": {
        "value": 36
      }
    },
    "17193": {
      "estimated": {
        "value": 52
      },
      "completed": {
        "value": 70
      }
    }
  }
}

鉴于此,我希望能够通过将“估计值”和“已完成”字段的值添加到具有其匹配ID的sprint中,从而产生一个更易于处理的Elasticsearch对象。

理想情况下,我想不用编写Ruby就可以解决这个问题,但是我找不到能处理这种情况的logstash本机解决方案。

首先,我使用split拆分了sprint字段上的数据,因此,我只有一个sprints对象,并且可以使用[sprints] [id]知道我正在处理的sprint。

然后,我尝试通过以下两种方式之一使用 mutate 过滤器: -使用合并将[velocityStateEntries] []对象添加到 当前的冲刺 -使用 add_field 添加我需要的两个字段

从语法上讲,这可能吗?理想情况下,我希望能够进行“双重替换”,从而获得当前sprint的估计时间,例如:

add_field => {
          "estimatedTime" => "%{[velocityStatEntries][%{[sprints][id]}][estimated][value]}"
}

但这似乎仅适用于硬编码格式,例如"estimatedTime" => "%{[velocityStatEntries][1234][estimated][value]}"

我必须为此使用Ruby格式吗?

1 个答案:

答案 0 :(得分:0)

就其价值而言,Ruby解决方案非常简单:

  ruby {
    code => "
        sprintId = event.get('[sprints][id]');
        estimated = event.get('[velocityStatEntries]['+(sprintId).to_s+'][estimated][value]');
        completed = event.get('[velocityStatEntries]['+(sprintId).to_s+'][completed][value]');
        event.set('[sprints][estimatedUnits]', estimated);
        event.set('[sprints][completedUnits]', completed);
      "
  }