This PR add labels for webhooks.
1. Make webhook "labelable" with ability to filter by labels.
2. Add labels to the webhook payload. It contain new field webhook with
it's name, id and labels. Field integration and alert_group has a
corresponding label field as well. See example of a new payload below:
```
{
"event": {
"type": "escalation"
},
"user": null,
"alert_group": {
"id": "IRFN6ZD31N31B",
"integration_id": "CTWM7U4A2QG97",
"route_id": "RUE7U7Z46SKGY",
"alerts_count": 1,
"state": "firing",
"created_at": "2023-11-22T08:54:55.178243Z",
"resolved_at": null,
"acknowledged_at": null,
"title": "Incident",
"permalinks": {
"slack": null,
"telegram": null,
"web": "http://grafana:3000/a/grafana-oncall-app/alert-groups/IRFN6ZD31N31B"
},
"labels": {
"severity": "critical"
}
},
"alert_group_id": "IRFN6ZD31N31B",
"alert_payload": {
"message": "This alert was sent by user for demonstration purposes"
},
"integration": {
"id": "CTWM7U4A2QG97",
"type": "webhook",
"name": "hi - Webhook",
"team": null,
"labels": {
"hello": "world",
"severity": "critical"
}
},
"notified_users": [],
"users_to_be_notified": [],
"webhook": {
"id": "WHAXK4BTC7TAEQ",
"name": "test",
"labels": {
"hello": "kesha"
}
}
}
```
I feel that there is an opportunity to make code cleaner - remove all
label logic from serializers, views and utils to models or dedicated
LabelerService and introduce Labelable interface with something like
label_verbal, update_labels methods. However, I don't want to tie
webhook labels with a refactoring.
---------
Co-authored-by: Dominik <dominik.broj@grafana.com>
113 lines
3.5 KiB
Text
113 lines
3.5 KiB
Text
running_under_parent_tiltfile = os.getenv("TILT_PARENT", "false") == "true"
|
|
# The user/pass that you will login to Grafana with
|
|
grafana_admin_user_pass = os.getenv("GRAFANA_ADMIN_USER_PASS", "oncall")
|
|
# HELM_PREFIX must be "oncall-dev" as it is hardcoded in dev/helm-local.yml
|
|
HELM_PREFIX = "oncall-dev"
|
|
# Use docker registery generated by ctlptl (dev/kind-config.yaml)
|
|
DOCKER_REGISTRY = "localhost:63628/"
|
|
|
|
if not running_under_parent_tiltfile:
|
|
# Load the custom Grafana extensions
|
|
v1alpha1.extension_repo(
|
|
name="grafana-tilt-extensions",
|
|
ref="main",
|
|
url="https://github.com/grafana/tilt-extensions",
|
|
)
|
|
v1alpha1.extension(
|
|
name="grafana", repo_name="grafana-tilt-extensions", repo_path="grafana"
|
|
)
|
|
|
|
load("ext://grafana", "grafana")
|
|
load("ext://configmap", "configmap_create")
|
|
load("ext://docker_build_sub", "docker_build_sub")
|
|
|
|
# Tell ops-devenv/Tiltifle where our plugin.json file lives
|
|
plugin_file = os.path.abspath("grafana-plugin/src/plugin.json")
|
|
|
|
|
|
def plugin_json():
|
|
return plugin_file
|
|
|
|
|
|
allow_k8s_contexts(["kind-kind"])
|
|
|
|
# Build the image including frontend folder for pytest
|
|
docker_build_sub(
|
|
"localhost:63628/oncall/engine:dev",
|
|
context="./engine",
|
|
cache_from=["grafana/oncall:latest"],
|
|
ignore=["./grafana-plugin/test-results/", "./grafana-plugin/dist/", "./grafana-plugin/e2e-tests/"],
|
|
child_context=".",
|
|
target="dev",
|
|
extra_cmds=["ADD ./grafana-plugin/src/plugin.json /etc/grafana-plugin/src/plugin.json"],
|
|
live_update=[
|
|
sync("./engine/", "/etc/app"),
|
|
run(
|
|
"cd /etc/app && pip install -r requirements.txt",
|
|
trigger="./engine/requirements.txt",
|
|
),
|
|
],
|
|
)
|
|
|
|
# Build the plugin in the background
|
|
local_resource(
|
|
"build-ui",
|
|
labels=["OnCallUI"],
|
|
cmd="cd grafana-plugin && yarn install && yarn build:dev",
|
|
serve_cmd="cd grafana-plugin && ONCALL_API_URL=http://oncall-dev-engine:8080 yarn watch",
|
|
allow_parallel=True,
|
|
)
|
|
|
|
yaml = helm("helm/oncall", name=HELM_PREFIX, values=["./dev/helm-local.yml", "./dev/helm-local.dev.yml"])
|
|
|
|
k8s_yaml(yaml)
|
|
|
|
# Generate and load the grafana deploy yaml
|
|
configmap_create(
|
|
"grafana-oncall-app-provisioning",
|
|
namespace="default",
|
|
from_file="dev/grafana/provisioning/plugins/grafana-oncall-app-provisioning.yaml",
|
|
)
|
|
|
|
k8s_resource(
|
|
objects=["grafana-oncall-app-provisioning:configmap"],
|
|
new_name="grafana-oncall-app-provisioning-configmap",
|
|
resource_deps=["build-ui", "engine"],
|
|
labels=["Grafana"],
|
|
)
|
|
|
|
# Use separate grafana helm chart
|
|
if not running_under_parent_tiltfile:
|
|
grafana(
|
|
context="grafana-plugin",
|
|
plugin_files=["grafana-plugin/src/plugin.json"],
|
|
namespace="default",
|
|
deps=["grafana-oncall-app-provisioning-configmap", "build-ui", "engine"],
|
|
extra_env={
|
|
"GF_SECURITY_ADMIN_PASSWORD": "oncall",
|
|
"GF_SECURITY_ADMIN_USER": "oncall",
|
|
"GF_AUTH_ANONYMOUS_ENABLED": "false",
|
|
},
|
|
)
|
|
|
|
k8s_resource(
|
|
workload="celery",
|
|
resource_deps=["mariadb", "redis-master"],
|
|
labels=["OnCallBackend"],
|
|
)
|
|
k8s_resource(
|
|
workload="engine",
|
|
port_forwards=8080,
|
|
resource_deps=["mariadb", "redis-master"],
|
|
labels=["OnCallBackend"],
|
|
)
|
|
k8s_resource(workload="redis-master", labels=["OnCallDeps"])
|
|
k8s_resource(workload="mariadb", labels=["OnCallDeps"])
|
|
|
|
|
|
# name all tilt resources after the k8s object namespace + name
|
|
def resource_name(id):
|
|
return id.name.replace(HELM_PREFIX + "-", "")
|
|
|
|
|
|
workload_to_resource_function(resource_name)
|