StackStorm / st2

StackStorm (aka "IFTTT for Ops") is event-driven automation for auto-remediation, incident responses, troubleshooting, deployments, and more for DevOps and SREs. Includes rules engine, workflow, 160 integration packs with 6000+ actions (see https://exchange.stackstorm.org) and ChatOps. Installer at https://docs.stackstorm.com/install/index.html
https://stackstorm.com/
Apache License 2.0
6.07k stars 749 forks source link

how to get dynamic varible in action chain #5645

Open Anz14 opened 2 years ago

Anz14 commented 2 years ago

I've integrated stackstorm with alertmanager and opsgenie. I want to fetch the host name dynamically in the action chain for slack and opsgenie action. How can I achieve this, so that it fetch the hostanames dynamically and send it to slack/opsgenie ?

Rules:

---
    name: "kafka_diskspace_remediation"
    pack: "demo"
    description: "kafka disk  event handler."
    enabled: true

    trigger:
        parameters:
            url: "sample"
        type: "core.st2.webhook"

    criteria:
        trigger.body.alerts[0].labels.alertname:
            type: "startswith"
            pattern : "Disk_usage_kafka"

    action:
        ref: "demo.demo_kafka_chain_meta"
        parameters:
            triggers: "{{ trigger }}"

Action-chain:

---
  chain:
    -
      name: "kafka_demo_disk_action"
      ref: "demo.kafka_demo_disk_action"
      parameters:
        triggers: "{{ triggers }}"
      on-success: "post_success_to_slack"
      on-failure: "opsgenie_escalation"
    -
      name: "post_success_to_slack"
      ref: "slack.post_message"
      parameters:
        channel: "#slo-sli"
        message: Current disk usage in / partition is less than 50% on  {{host}}

    -
      name: "opsgenie_escalation"
      ref: "opsgenie.create_alert"
      parameters:
        message: Current disk usage in / partition is more than 50% on  {{host}}

Achin-chain meta:

---
name: "demo_kafka_chain_meta"
description: "Simple Action Chain workflow for kafka disk alert"
pack: "demo"
runner_type: "action-chain"
entry_point: "chains/demo_kafka_chain.yaml"
enabled: true
parameters:
    triggers:
        type: "string"
        description: "Trigger received"
        required: true

Action:

---
name: "kafka_demo_disk_action"
pack: "demo"
runner_type: "python-script"
description: "On receiving a trigger, ssh into the problematic hosts and perform some action."
enabled: true
entry_point: "kafka_demo_disk_action.py"
parameters:
    triggers:
        type: "string"
        description: "Trigger received"
        required: true
output_schema:
    result:
        type: "string"

when triggering the above action chain, I'm getting below error.

Error:

 "error": "Failed to run task \"post_success_to_slack\". Parameter rendering failed.. Failed rendering value for action parameter \"message\" in task \"post_success_to_slack\" (template string=Current disk usage in / partition is less than 50% on {{host}}): 'host' is undefined",
  "traceback": "Traceback (most recent call last):\n  File \"/opt/stackstorm/st2/lib/python3.8/site-packages/action_chain_runner/action_chain_runner.py\", line 813, in _resolve_params\n    rendered_params = jinja_utils.render_values(\n  File \"/opt/stackstorm/st2/lib/python3.8/site-packages/st2common/util/jinja.py\", line 149, in render_values\n    raise e\n  File \"/opt/stackstorm/st2/lib/python3.8/site-packages/st2common/util/jinja.py\", line 144, in render_values\n    rendered_v = env.from_string(v).render(super_context)\n  File \"/opt/stackstorm/st2/lib/python3.8/site-packages/jinja2/environment.py\", line 1090, in render\n    self.environment.handle_exception()\n  File \"/opt/stackstorm/st2/lib/python3.8/site-packages/jinja2/environment.py\", line 832, in handle_exception\n    reraise(*rewrite_traceback_stack(source=source))\n  File \"/opt/stackstorm/st2/lib/python3.8/site-packages/jinja2/_compat.py\", line 28, in reraise\n    raise value.with_traceback(tb)\n  File \"<template>\", line 1, in top-level template code\njinja2.exceptions.UndefinedError: 'host' is undefined\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/opt/stackstorm/st2/lib/python3.8/site-packages/action_chain_runner/action_chain_runner.py\", line 534, in _run_chain\n    liveaction = self._get_next_action(\n  File \"/opt/stackstorm/st2/lib/python3.8/site-packages/action_chain_runner/action_chain_runner.py\", line 847, in _get_next_action\n    resolved_params = ActionChainRunner._resolve_params(\n  File \"/opt/stackstorm/st2/lib/python3.8/site-packages/action_chain_runner/action_chain_runner.py\", line 825, in _resolve_params\n    raise action_exc.ParameterRenderingFailedException(msg)\nst2common.exceptions.action.ParameterRenderingFailedException: Failed rendering value for action parameter \"message\" in task \"post_success_to_slack\" (template string=Current disk usage in / partition is less than 50% on {{host}}): 'host' is undefined\n"
}
amanda11 commented 2 years ago

I presume you are wanting the host thay the alert came from. You will need to investigate what is in the body of the alert from alert manager, to see if it has the hostname as part of its alert.

Anz14 commented 2 years ago

@amanda11 Yes Exactly.

Below is the trigger payload.

{ "trigger": "core.949b9434-4b8d-4716-951a-13b3889b850c", "occurrence_time": "2022-05-11T06:58:13.594000Z", "status": "processed", "id": "627b5e8520e3d021ee8d8f84", "payload": { "headers": { "Host": "stackstorm-uat.groww.in,stackstorm-uat.groww.in", "X-Real-Ip": "", "X-Forwarded-For": "", "Content-Length": "1615", "User-Agent": "Alertmanager/0.22.2", "Content-Type": "application/json", "X-Request-Id": "ca6efe06-a2fb-4d34-8ef9-76fc4f0c0f51" }, "body": { "receiver": "web\.hook", "status": "firing", "alerts": [ { "status": "firing", "labels": { "alertname": "Disk_usage_kafka for / partition more than 50%", "device": "sda1", "fstype": "ext4", "host": "test-zookerper-1", "instance": ":9273", "mode": "rw", "monitor": "example", "path": "/", "severity": "warning", "stack": "compute_engine", "team": "stackstorm" }, "annotations": { "description": "Disk_usage_kafka more than 50% for / partition on instance :9273 with current value of 57.62990738891588.", "summary": "Disk_usage_kafka more than 50% for / partition on instance compute_engine" }, "startsAt": "2022-05-11T06:54:28.528964753Z", "endsAt": "0001-01-01T00:00:00Z", "generatorURL": "http://test-zookerper-1:9090/graph?g0.expr=disk_used_percent%7Bhost%3D%22test-zookerper-1%22%2Cpath%3D%22%2F%22%7D+%3E+50&g0.tab=1", "fingerprint": "335add2583c555a0" } ], "groupLabels": { "alertname": "Disk_usage_kafka for / partition more than 50%" }, "commonLabels": { "alertname": "Disk_usage_kafka for / partition more than 50%", "device": "sda1", "fstype": "ext4", "host": "test-zookerper-1", "instance": ":9273", "mode": "rw", "monitor": "example", "path": "/", "severity": "warning", "stack": "compute_engine", "team": "stackstorm" }, "commonAnnotations": { "description": "Disk_usage_kafka more than 50% for / partition on instance :9273 with current value of 57.62990738891588.", "summary": "Disk_usage_kafka more than 50% for / partition on instance compute_engine" }, "externalURL": "http://test-zookerper-1:9093", "version": "4", "groupKey": "{}/{team=~\"stackstorm\"}:{alertname=\"Disk_usage_kafka for / partition more than 50%\"}", "truncatedAlerts": 0 } } }