在watcher负载中正确Map转换的时间戳

vdgimpew  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(0)|浏览(363)

我遇到了一个问题,我可以正确地转换watcher负载中的文档时间戳并将其存储到一个列表中,但我不确定如何正确地将其Map到返回的负载。
希望一些代码能帮我解决一些问题。下面是我的watcher中的一个转换,我将返回一个新的有效负载,并将这些文档中的字段Map到一些已定义的字符串:

"transform": {
    "chain": [
      {
        "script": {
          "source": "ctx.vars.ogStack = ctx.payload",
          "lang": "painless"
        }
      },
      {
        "search": {
          "request": {
            "search_type": "query_then_fetch",
            "indices": [
              "idx-pattern-*"
            ],
            "rest_total_hits_as_int": true,
            "body": {
              "size": 1000,
              "sort": [
                "timestamp.keyword"
              ],
              "query": {
                "bool": {
                  "must": [
                    {
                      "wildcard": {
                        "host.name": {
                          "value": "*af?m*"
                        }
                      }
                    },
                    {
                      "query_string": {
                        "query": "{{#ctx.payload.hits.hits}} {{_source.session_id}} {{/ctx.payload.hits.hits}}"
                      }
                    }
                  ],
                  "filter": {
                    "range": {
                      "@timestamp": {
                        "from": "{{ctx.trigger.scheduled_time}}||-1d",
                        "to": "{{ctx.trigger.triggered_time}}"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      {
        "script": {
          "source": """
              def testl = [];
              for (def doc : ctx.payload.hits.hits){
                  def temp = doc._source.timestamp;
                  StringBuilder sb = new StringBuilder(temp);
                  sb.insert(10,'T');
                  sb.deleteCharAt(11);
                  sb.append('Z');
                  ZonedDateTime zdt = ZonedDateTime.parse(sb);
                  ZonedDateTime ct = zdt.withZoneSameInstant(ZoneId.of("America/Chicago"));
                  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE, d MMM yyyy h:mm:ss.SSSS a z");
                  String date_formatted = ct.format(dtf);
                  testl.add(date_formatted);
              }
              return [
                'new': ctx.payload.hits.hits.stream().map(t -> {return [
                  'time': t._source.timestamp,
                  'msg': t._source.message,
                  'debug': t._source.debug,
                  'ses_id': t._source.session_id,
                  'stack': t._source.stack,
                  'host': t._source.host.name,
                  'user': t._source.user,
                  'clusters': t._source.host.system_name,
                  'test': testl]}).collect(Collectors.toList())
              ]
            """,
          "lang": "painless"
        }
      }
    ]
  }

在搜索级别之后,将返回一个新的有效负载,并将其加载到下面的脚本转换中。这个有效负载由100个文档组成。每个文档都有多个字段,包括一个时间戳。我想要的是为每个文档转换时间戳。我分别使用for循环来实现这一点。我迭代了有效负载中的每个文档,取出时间戳,转换它,并存储在列表中 testl . 然后我将其添加到java流中(出于测试目的,我知道这不是一种方法),以确保正确转换列表中的日期。
所以现在我有一个正确转换日期的列表,但是没有Map到 new 有效载荷。重要的是,我在 new 有效负载,而不是用于输出目的的另一个有效负载对象。我可以对java流中的时间戳应用一个函数吗?这似乎是一个合乎逻辑的解决方案,但我不知道如何或如果这是可能的。
如果我能澄清什么,请告诉我。提前谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题