我遇到了一个问题,我可以正确地转换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流中的时间戳应用一个函数吗?这似乎是一个合乎逻辑的解决方案,但我不知道如何或如果这是可能的。
如果我能澄清什么,请告诉我。提前谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!