代码之家  ›  专栏  ›  技术社区  ›  José Maia

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

  •  0
  • José Maia  · 技术社区  · 6 年前

    对于以下数据结构:

    {
      "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
          }
        }
      }
    }
    

    有鉴于此,我希望能够生成一个更易于处理的Elasticsearch对象,方法是将估计字段和已完成字段的值与匹配ID一起添加到sprint中。

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

    通过以下两种方式之一进行筛选: -使用 合并 将[velocityStateEntries][]对象添加到 当前冲刺 -使用 添加\u字段 添加我需要的两个字段

    从句法上讲,这是可能的吗?理想情况下,我希望能够进行某种“双重替代”,获得当前sprint的估计时间,比如:

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

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   José Maia    6 年前

    值得一提的是,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);
          "
      }