From b8f0a18cb2dab3aed308ef88c116d7cf7aec86fa Mon Sep 17 00:00:00 2001 From: talboren Date: Sun, 7 Jan 2024 17:30:22 +0200 Subject: [PATCH] feat(provider): ilert (#689) --- docs/mint.json | 1 + .../documentation/ilert-provider.mdx | 48 ++++ .../workflows/ilert-incident-upon-alert.yaml | 23 ++ keep-ui/public/icons/ilert-icon.png | Bin 0 -> 57227 bytes keep/providers/ilert_provider/__init__.py | 0 .../ilert_provider/ilert_provider.py | 246 ++++++++++++++++++ 6 files changed, 318 insertions(+) create mode 100644 docs/providers/documentation/ilert-provider.mdx create mode 100644 examples/workflows/ilert-incident-upon-alert.yaml create mode 100644 keep-ui/public/icons/ilert-icon.png create mode 100644 keep/providers/ilert_provider/__init__.py create mode 100644 keep/providers/ilert_provider/ilert_provider.py diff --git a/docs/mint.json b/docs/mint.json index e0ddab340..b1762ba4f 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -59,6 +59,7 @@ "providers/documentation/cloudwatch-metrics", "providers/documentation/console-provider", "providers/documentation/datadog-provider", + "providers/documentation/ilert-provider", "providers/documentation/kibana-provider", "providers/documentation/discord-provider", "providers/documentation/elastic-provider", diff --git a/docs/providers/documentation/ilert-provider.mdx b/docs/providers/documentation/ilert-provider.mdx new file mode 100644 index 000000000..af1b1d310 --- /dev/null +++ b/docs/providers/documentation/ilert-provider.mdx @@ -0,0 +1,48 @@ +--- +title: "ILert" +sidebarTitle: "ILert Provider" +description: "ILert provider allows you to create, update, and resolve incidents in ILert for effective incident management and response." +--- + +## Inputs + +- `summary`: str: A brief summary of the incident or situation you're reporting. +- `status`: IlertIncidentStatus = IlertIncidentStatus.INVESTIGATING: The current status of the incident (e.g., INVESTIGATING, RESOLVED, MONITORING, IDENTIFIED). +- `message`: str = "": A detailed message describing the incident or situation. +- `affectedServices`: str = "[]": A JSON string representing the list of affected services and their statuses. +- `id`: str = "0": The ID of the incident to update. If set to "0", a new incident will be created. + +## Outputs + +_No information yet, feel free to contribute it using the "Edit this page" link at the bottom of the page_ + +## Authentication Parameters + +The `ilert_token` is required for connecting to the ILert provider. This should be a valid API token provided by ILert. + +## Connecting with the Provider + +### API Token + +To obtain the ILert API token, follow these steps: + +1. Log in to your ILert account. +2. Navigate to the "API Tokens" section under your user profile or account settings. +3. Generate a new API token. +4. Make sure "Read Permission" and "Write Permission" are checked. +5. Click on "Save" + +Ensure you have the necessary permissions assigned to the token for creating and updating incidents. + +## Scopes + +ILert integration does not require specific scopes to be set for API token as permissions are managed directly within ILert's platform. + +## Notes + +_No information yet, feel free to contribute it using the "Edit this page" link at the bottom of the page_ + +## Useful Links + +- [ILert API Documentation](https://api.ilert.com/api-docs/) +- [ILert Incident Management](https://www.ilert.com/incident-management/) diff --git a/examples/workflows/ilert-incident-upon-alert.yaml b/examples/workflows/ilert-incident-upon-alert.yaml new file mode 100644 index 000000000..09ba1dea0 --- /dev/null +++ b/examples/workflows/ilert-incident-upon-alert.yaml @@ -0,0 +1,23 @@ +id: aad72d69-92b9-4e21-8f67-97d2a69bf8ac +description: Create ILert incident upon Keep Alert +triggers: +- filters: + - key: source + value: keep + type: alert +owners: [] +services: [] +steps: [] +actions: +- name: ilert-action + provider: + config: '{{ providers.ilert-default }}' + type: ilert + with: + affectedServices: + - impact: OPERATIONAL + service: + id: 339743 + message: A mock incident created with Keep! + status: INVESTIGATING + summary: Keep Incident {{ alert.name }} diff --git a/keep-ui/public/icons/ilert-icon.png b/keep-ui/public/icons/ilert-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a6ad380879782e0eba2ef694509ae0b055718eb9 GIT binary patch literal 57227 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 LNkvXXu0mjfS&Wz_ literal 0 HcmV?d00001 diff --git a/keep/providers/ilert_provider/__init__.py b/keep/providers/ilert_provider/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/keep/providers/ilert_provider/ilert_provider.py b/keep/providers/ilert_provider/ilert_provider.py new file mode 100644 index 000000000..787ef9597 --- /dev/null +++ b/keep/providers/ilert_provider/ilert_provider.py @@ -0,0 +1,246 @@ +""" +Ilert Provider is a class that allows to create/close incidents in Ilert. +""" +import dataclasses +import enum +import json +import os + +import pydantic +import requests + +from keep.contextmanager.contextmanager import ContextManager +from keep.providers.base.base_provider import BaseProvider +from keep.providers.models.provider_config import ProviderConfig, ProviderScope +from keep.providers.providers_factory import ProvidersFactory + + +class IlertIncidentStatus(str, enum.Enum): + """ + Ilert incident status. + """ + + INVESTIGATING = "INVESTIGATING" + RESOLVED = "RESOLVED" + MONITORING = "MONITORING" + IDENTIFIED = "IDENTIFIED" + + +class IlertServiceStatus(str, enum.Enum): + """ + Ilert service status. + """ + + OPERATIONAL = "OPERATIONAL" + DEGRADED = "DEGRADED" + PARTIAL_OUTAGE = "PARTIAL_OUTAGE" + MAJOR_OUTAGE = "MAJOR_OUTAGE" + UNDER_MAINTENANCE = "UNDER_MAINTENANCE" + + +class IlertServiceNoIncludes(pydantic.BaseModel): + """ + Ilert service. + """ + + id: str + + +class IlertAffectedService(pydantic.BaseModel): + """ + Ilert affected service. + """ + + service: IlertServiceNoIncludes + impact: IlertServiceStatus + + +@pydantic.dataclasses.dataclass +class IlertProviderAuthConfig: + """ + Ilert authentication configuration. + """ + + ilert_token: str = dataclasses.field( + metadata={ + "required": True, + "description": "ILert API token", + "hint": "Bearer eyJhbGc...", + "sensitive": True, + } + ) + ilert_host: str = dataclasses.field( + metadata={ + "required": False, + "description": "ILert API host", + "hint": "https://api.ilert.com/api", + }, + default="https://api.ilert.com/api", + ) + + +class IlertProvider(BaseProvider): + """Create/Resolve incidents in Ilert.""" + + PROVIDER_SCOPES = [ + ProviderScope("read_permission", "Read permission", mandatory=True), + ProviderScope("write_permission", "Write permission", mandatory=False), + ] + + def __init__( + self, context_manager: ContextManager, provider_id: str, config: ProviderConfig + ): + super().__init__(context_manager, provider_id, config) + + def dispose(self): + """ + Dispose the provider. + """ + pass + + def validate_config(self): + """ + Validates required configuration for Ilert provider. + + """ + self.authentication_config = IlertProviderAuthConfig( + **self.config.authentication + ) + + def validate_scopes(self): + scopes = {} + self.logger.info("Validating scopes") + for scope in self.PROVIDER_SCOPES: + try: + if scope.name == "read_permission": + requests.get( + f"{self.authentication_config.ilert_host}/incidents", + headers={ + "Authorization": self.authentication_config.ilert_token + }, + ) + scopes[scope.name] = True + elif scope.name == "write_permission": + # TODO: find a way to validate write_permissions, for now it is always "validated" sucessfully. + scopes[scope.name] = True + except Exception as e: + self.logger.warning( + "Failed to validate scope", + extra={"scope": scope.name}, + ) + scopes[scope.name] = str(e) + self.logger.info("Scopes validated", extra=scopes) + return scopes + + def _notify( + self, + summary: str, + status: IlertIncidentStatus = IlertIncidentStatus.INVESTIGATING, + message: str = "", + affectedServices: str | list = "[]", + id: str = "0", + **kwargs: dict, + ): + self.logger.info( + "Creating/updating Ilert incident", + extra={ + "summary": summary, + "status": status, + "incident_message": message, + "affectedServices": affectedServices, + "id": id, + }, + ) + headers = {"Authorization": self.authentication_config.ilert_token} + + # Create or update incident + payload = { + "id": id, + "summary": summary, + "status": str(status), + "message": message, + **kwargs, + } + if affectedServices: + try: + payload["affectedServices"] = ( + json.loads(affectedServices) + if isinstance(affectedServices, str) + else affectedServices + ) + except Exception: + self.logger.warning( + "Failed to parse affectedServices", + extra={"affectedServices": affectedServices}, + ) + + # if id is set, we update the incident, otherwise we create a new one + should_update = id and id != "0" + if not should_update: + response = requests.post( + f"{self.authentication_config.ilert_host}/incidents", + headers=headers, + json=payload, + ) + else: + response = requests.put( + f"{self.authentication_config.ilert_host}/incidents/{id}", + headers=headers, + json=payload, + ) + + if not response.ok: + self.logger.error( + "Failed to create/update Ilert incident", + extra={ + "status_code": response.status_code, + "response": response.text, + }, + ) + raise Exception( + f"Failed to create/update Ilert incident: {response.status_code} {response.text}" + ) + self.logger.info( + "Ilert incident created/updated", + extra={"status_code": response.status_code}, + ) + + +if __name__ == "__main__": + # Output debug messages + import logging + + logging.basicConfig(level=logging.DEBUG, handlers=[logging.StreamHandler()]) + context_manager = ContextManager( + tenant_id="singletenant", + workflow_id="test", + ) + # Load environment variables + import os + + api_key = os.environ.get("ILERT_API_TOKEN") + + provider_config = { + "authentication": {"ilert_token": api_key}, + } + provider: IlertProvider = ProvidersFactory.get_provider( + context_manager=context_manager, + provider_id="ilert", + provider_type="ilert", + provider_config=provider_config, + ) + result = provider._query( + "Example", + message="Lorem Ipsum", + status="MONITORING", + affectedServices=json.dumps( + [ + { + "impact": "OPERATIONAL", + "service": {"id": 339743}, + } + ] + ), + id="242530", + ) + print(result)