我可以在Elasticsearch Watch中将HTTP响应从一个动作传递到另一个动作吗?

q5lcpyga  于 2023-05-28  发布在  ElasticSearch
关注(0)|答案(1)|浏览(177)

我试图在票务系统中注册一个票,并使用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响应数据。

h5qlskok

h5qlskok1#

我无法使用HTTP响应数据,但我找到了一个解决方法。由于我将ticket ID添加到警报中,所以我查询没有此字段的文档,并且我使用输入链接只留下第一个结果。现在,如果没有发现警报,手表将崩溃。否则,我注册一个票据,仍然在输入链中,我对该操作执行的唯一操作是使用票据ID更新警报,同时将其标记为已处理。手表会一个接一个地处理警报,直到没有警报为止。
诚然,这是一个黑客和绝对可怕的性能方面,但它适用于我的用例。对于更复杂的任务,我担心Watcher太有限了,需要一个外部脚本。

相关问题