Source code for grafanarmadillo.alerter
"""Push and pull Grafana alerts."""
from typing import Optional, Tuple, Union
from grafana_client import GrafanaApi
from grafana_client.client import GrafanaClientError
from grafanarmadillo.types import AlertContent, AlertSearchResult, FolderSearchResult
from grafanarmadillo.util import Cache, CacheMode
[docs]class Alerter:
"""Collection of methods for managing alert rules."""
def __init__(self, api: GrafanaApi, disable_provenance=True, cache_mode: Union[CacheMode, Cache] = CacheMode.SESSION) -> None:
super().__init__()
self.api = api
self.disable_provenance = disable_provenance
self._cache = CacheMode.select(cache_mode)
[docs] def import_alert(
self, content: AlertContent, folder: FolderSearchResult
):
"""Import an alert into Grafana."""
content = content.copy()
# set the folder in case it isn't, which would happen if the metadata was scrubbed from the alert content
content["folderUID"] = folder["uid"]
content.pop("id", None)
try:
if "uid" in content:
exists = self.api.alertingprovisioning.get_alertrule(content["uid"])
else:
exists = None
except GrafanaClientError as e:
if e.status_code == 404:
exists = None
else:
raise
if exists:
self.api.alertingprovisioning.update_alertrule(content["uid"], content, disable_provenance=self.disable_provenance)
else:
self.api.alertingprovisioning.create_alertrule(content, disable_provenance=self.disable_provenance)
self._cache.unset("list_alerts")
[docs] def export_alert(
self, alert: AlertSearchResult
) -> Tuple[AlertContent, Optional[FolderSearchResult]]:
"""Export an alert from Grafana and its folder information too."""
alert_content = self.api.alertingprovisioning.get_alertrule(alert["uid"])
folder = self.api.folder.get_folder(alert_content["folderUID"])
return alert_content, folder