我试图在票务系统中注册一个票,并使用Watcher操作将票ID保存在Elasticsearch文档中。票证ID在对“注册新票证”请求的响应中传递,但我不知道如何从另一个操作访问响应。
我本想使用输入链接,但在注册票证时,我必须遍历查询结果,据我所知,这只能在操作中实现。我想我需要的是动作链接之类的东西,但我不确定是否存在这样的东西。
以下是当前的watch代码:
{
"trigger": {
"schedule": {
"interval": "1m"
}
},
"input": {
"search": {
"request": {
"search_type": "query_then_fetch",
"indices": [
".alerts-security.alerts-default"
],
"rest_total_hits_as_int": true,
"body": {
"query": {
"bool": {
"filter": [
{
"range": {
"@timestamp": {
"gte": "now-1m",
"lte": "now"
}
}
},
{
"match": {
"kibana.alert.workflow_status": "open"
}
}
]
}
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.hits.total": {
"gt": 0
}
}
},
"actions": {
"otobo_webhook": {
"transform": {
"script": {
"source": """
['items': ctx.payload.hits.hits.collect(alert -> [
'id': alert._id,
'timestamp': alert._source['@timestamp'],
'rule_name': alert._source['kibana.alert.rule.name'],
'rule_note': alert._source['kibana.alert.rule.note'],
'host_name': alert._source['host.name']
])]
""",
"lang": "painless"
}
},
"foreach": "ctx.payload.items",
"max_iterations": 500,
"webhook": {
"scheme": ,
"host": ,
"port": ,
"method": ,
"path": ,
"params": {},
"headers": {},
"body": """
{
"UserLogin": ,
"Password": ,
"Ticket": {
"Title": "Elastic Alert (generated by rule {{ctx.payload.rule_name}})",
/* some more ticket data */
},
"Article": {
"CommmunicationChannel": "Email",
"From": "test@test.pl",
"Subject": "Elastic Alert (generated by rule {{ctx.payload.rule_name}})",
"Body": "<p>Rule \"{{ctx.payload.rule_name}}\" emmitted an alert at {{ctx.payload.timestamp}} with a note: \"{{ctx.payload.rule_note}}\". Device: {{ctx.payload.host_name}}.</p>",
"ContentType": "text/html charset=utf-8"
}
}
"""
}
}
}
}
现在我需要添加另一个操作,它将使用第一个操作的http响应数据。
1条答案
按热度按时间h5qlskok1#
我无法使用HTTP响应数据,但我找到了一个解决方法。由于我将ticket ID添加到警报中,所以我查询没有此字段的文档,并且我使用输入链接只留下第一个结果。现在,如果没有发现警报,手表将崩溃。否则,我注册一个票据,仍然在输入链中,我对该操作执行的唯一操作是使用票据ID更新警报,同时将其标记为已处理。手表会一个接一个地处理警报,直到没有警报为止。
诚然,这是一个黑客和绝对可怕的性能方面,但它适用于我的用例。对于更复杂的任务,我担心Watcher太有限了,需要一个外部脚本。