diff --git a/examples/workflows/create_alert_from_vm_metric.yml b/examples/workflows/create_alert_from_vm_metric.yml index e4eaaeaa4..e28ff9d02 100644 --- a/examples/workflows/create_alert_from_vm_metric.yml +++ b/examples/workflows/create_alert_from_vm_metric.yml @@ -15,22 +15,25 @@ workflow: actions: - name: create-alert - alias: - # assign the value of the query result to the alias `cpu` - # so we can use it anywhere in the action - cpu: "{{ steps.victoriametrics-step.results.data.result.0.value.1 }}" # only create an alert if the CPU usage is greater than 0.005 - if: "{{ aliases.cpu }} > 0.005 " + if: "{{ steps.victoriametrics-step.results.data.result.0.value.1 }} > 0.001 " provider: type: keep # create an alert with the following details with: name: "High CPU Usage" description: "CPU usage is high on the VM (created from VM metric)" - severity: '{{ aliases.cpu }} > 0.9 ? "critical" : {{ aliases.cpu }} > 0.7 ? "warning" : "info"' + severity: '{{ steps.victoriametrics-step.results.data.result.0.value.1 }} > 0.9 ? "critical" : {{ steps.victoriametrics-step.results.data.result.0.value.1 }} > 0.7 ? "warning" : "info"' labels: environment: production app: myapp service: api team: devops owner: alice + # optional: customize the fingerprint based on these fields + fingerprint_fields: + - environment + - app + - service + - team + - owner diff --git a/keep/providers/keep_provider/keep_provider.py b/keep/providers/keep_provider/keep_provider.py index ff45fcda2..df898d55e 100644 --- a/keep/providers/keep_provider/keep_provider.py +++ b/keep/providers/keep_provider/keep_provider.py @@ -1,21 +1,22 @@ """ Keep Provider is a class that allows to ingest/digest data from Keep. """ -import yaml + import logging -from html import unescape from datetime import datetime, timezone +from html import unescape +import yaml from keep.api.core.db import get_alerts_with_filters from keep.api.models.alert import AlertDto +from keep.api.tasks.process_event_task import process_event from keep.contextmanager.contextmanager import ContextManager from keep.exceptions.provider_exception import ProviderException from keep.providers.base.base_provider import BaseProvider from keep.providers.models.provider_config import ProviderConfig from keep.searchengine.searchengine import SearchEngine from keep.workflowmanager.workflowstore import WorkflowStore -from keep.api.tasks.process_event_task import process_event class KeepProvider(BaseProvider): @@ -127,49 +128,63 @@ def _notify(self, **kwargs): workflow_to_update_yaml = unescape(workflow_to_update_yaml) workflow_to_update_yaml = yaml.safe_load(workflow_to_update_yaml) - if 'workflow' in workflow_to_update_yaml: - workflow_to_update_yaml = workflow_to_update_yaml['workflow'] + if "workflow" in workflow_to_update_yaml: + workflow_to_update_yaml = workflow_to_update_yaml["workflow"] workflow = workflowstore.create_workflow( - tenant_id=self.context_manager.tenant_id, - created_by=f"workflow id: {self.context_manager.workflow_id}", - workflow=workflow_to_update_yaml + tenant_id=self.context_manager.tenant_id, + created_by=f"workflow id: {self.context_manager.workflow_id}", + workflow=workflow_to_update_yaml, ) except Exception as e: self.logger.exception( "Failed to create workflow", - extra={"tenant_id": context_manager.tenant_id, "workflow": workflow}, + extra={ + "tenant_id": context_manager.tenant_id, + "workflow": workflow, + }, ) raise ProviderException(f"Failed to create workflow: {e}") else: + fingerprint_fields = kwargs.get("fingerprint_fields", []) alert = AlertDto( - name=kwargs['name'], - status=kwargs.get('status'), - lastReceived=kwargs.get('lastReceived'), - environment=kwargs.get('environment', "undefined"), - duplicateReason=kwargs.get('duplicateReason'), - service=kwargs.get('service'), - message=kwargs.get('message'), - description=kwargs.get('description'), - severity=kwargs.get('severity'), + name=kwargs["name"], + status=kwargs.get("status"), + lastReceived=kwargs.get("lastReceived"), + environment=kwargs.get("environment", "undefined"), + duplicateReason=kwargs.get("duplicateReason"), + service=kwargs.get("service"), + message=kwargs.get("message"), + description=kwargs.get("description"), + severity=kwargs.get("severity"), pushed=True, - url=kwargs.get('url'), - labels=kwargs.get('labels'), - ticket_url=kwargs.get('ticket_url'), - fingerprint=kwargs.get('fingerprint'), + url=kwargs.get("url"), + labels=kwargs.get("labels"), + ticket_url=kwargs.get("ticket_url"), + fingerprint=kwargs.get("fingerprint"), ) + # if fingerprint_fields are provided, calculate fingerprint + if fingerprint_fields: + # calculate fingerprint + self.logger.info( + "Calculating fingerprint for alert", + extra={"fingerprint_fields": fingerprint_fields}, + ) + alert.fingerprint = self.get_alert_fingerprint( + alert, fingerprint_fields + ) + process_event( {}, self.context_manager.tenant_id, "keep", None, - kwargs.get('fingerprint'), + kwargs.get("fingerprint"), None, None, alert, ) - def validate_config(self): """ Validates required configuration for Keep provider.