Skip to content

Commit

Permalink
feat(api): customize fingerprint (keephq#3119)
Browse files Browse the repository at this point in the history
  • Loading branch information
shahargl authored Jan 25, 2025
1 parent d61767a commit dff3f5d
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 30 deletions.
15 changes: 9 additions & 6 deletions examples/workflows/create_alert_from_vm_metric.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
63 changes: 39 additions & 24 deletions keep/providers/keep_provider/keep_provider.py
Original file line number Diff line number Diff line change
@@ -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):
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit dff3f5d

Please sign in to comment.