Skip to content

Commit 6dc9d13

Browse files
committed
feat: provision alerts
1 parent 0a3c871 commit 6dc9d13

13 files changed

+2083
-3514
lines changed

.github/workflows/metrics-deploy.yml

+18
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ on:
3737
required: true
3838
type: string
3939
default: "grafana-dashboard-password"
40+
slack_webhook_url_secret_name:
41+
description: The name of the secret which holds the Slack webhook URL
42+
required: true
43+
type: string
44+
default: "slack-webhook-url"
4045
secrets:
4146
GCP_SA_KEY:
4247
required: true
@@ -70,6 +75,10 @@ on:
7075
description: The name of the secret which holds the Grafana dashboard password
7176
required: true
7277
default: "grafana-dashboard-password"
78+
slack_webhook_url_secret_name:
79+
description: The name of the secret which holds the Slack webhook URL
80+
required: true
81+
default: "slack-webhook-url"
7382

7483
jobs:
7584
metrics_deployment:
@@ -89,6 +98,7 @@ jobs:
8998
TF_STATE_BUCKET: aztec-terraform
9099
GKE_CLUSTER_CONTEXT: "gke_testnet-440309_us-west1-a_${{ inputs.cluster }}"
91100
GRAFANA_DASHBOARD_PASSWORD_SECRET_NAME: ${{ inputs.grafana_dashboard_password_secret_name }}
101+
SLACK_WEBHOOK_URL_SECRET_NAME: ${{ inputs.slack_webhook_url_name }}
92102

93103
steps:
94104
- name: Checkout code
@@ -118,6 +128,12 @@ jobs:
118128
echo "::add-mask::$(gcloud secrets versions access latest --secret=${{ env.GRAFANA_DASHBOARD_PASSWORD_SECRET_NAME }})"
119129
echo "grafana_dashboard_password=$(gcloud secrets versions access latest --secret=${{ env.GRAFANA_DASHBOARD_PASSWORD_SECRET_NAME }})" >> "$GITHUB_OUTPUT"
120130
131+
- name: Grab the Slack webhook URL
132+
id: get-slack-webhook-url
133+
run: |
134+
echo "::add-mask::$(gcloud secrets versions access latest --secret=${{ env.GRAFANA_DASHBOARD_PASSWORD_SECRET_NAME }})"
135+
echo "slack_webhook_url=$(gcloud secrets versions access latest --secret=${{ env.SLACK_WEBHOOK_URL_SECRET_NAME }})" >> "$GITHUB_OUTPUT"
136+
121137
- name: Ensure Terraform state bucket exists
122138
run: |
123139
if ! gsutil ls gs://${{ env.TF_STATE_BUCKET }} >/dev/null 2>&1; then
@@ -155,6 +171,7 @@ jobs:
155171
-var="VALUES_FILE=${{ env.VALUES_FILE }}" \
156172
-var="GKE_CLUSTER_CONTEXT=${{ env.GKE_CLUSTER_CONTEXT }}" \
157173
-var="GRAFANA_DASHBOARD_PASSWORD=${{ steps.get-grafana-dashboard-password.outputs.grafana_dashboard_password }}" \
174+
-var="SLACK_WEBHOOK_URL=${{ steps.get-slack-webhook-url.outputs.slack_webhook_url }}" \
158175
-lock=${{ inputs.respect_tf_lock }}
159176
160177
- name: Terraform Plan
@@ -165,6 +182,7 @@ jobs:
165182
-var="VALUES_FILE=${{ env.VALUES_FILE }}" \
166183
-var="GKE_CLUSTER_CONTEXT=${{ env.GKE_CLUSTER_CONTEXT }}" \
167184
-var="GRAFANA_DASHBOARD_PASSWORD=${{ steps.get-grafana-dashboard-password.outputs.grafana_dashboard_password }}" \
185+
-var="SLACK_WEBHOOK_URL=${{ steps.get-slack-webhook-url.outputs.slack_webhook_url }}" \
168186
-out=tfplan \
169187
-lock=${{ inputs.respect_tf_lock }}
170188

spartan/metrics/copy-dashboard.sh

+30-4
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,34 @@ cd "$(dirname "${BASH_SOURCE[0]}")"
55

66
cp values.tmp.yaml values.yaml
77

8-
for dashboard in ./grafana_dashboards/*.json; do
9-
dashboard_name=$(basename "$dashboard" .json)
10-
export DASHBOARD_JSON=$(jq -c '.' "$dashboard")
11-
yq -i ".grafana.dashboards.default.\"$dashboard_name\".json = strenv(DASHBOARD_JSON)" values.yaml
8+
for dashboard_file in ./grafana/dashboards/*.json; do
9+
if [ -f "$dashboard_file" ]; then
10+
# Get the filename without path and extension
11+
full_filename=$(basename "$dashboard_file" .json)
12+
13+
# Extract folder name and dashboard name using underscore as separator
14+
# Format: foldername_dashboardname.json
15+
if [[ "$full_filename" == *"_"* ]]; then
16+
folder_name=${full_filename%%_*}
17+
dashboard_name=${full_filename#*_}
18+
else
19+
# If no underscore, use "default" as the folder
20+
folder_name="default"
21+
dashboard_name=$full_filename
22+
fi
23+
24+
# Read the dashboard JSON content
25+
export dashboard_content=$(jq -c '.' "$dashboard_file")
26+
27+
# Use yq to add the dashboard to the values file
28+
yq -i ".grafana.dashboards.${folder_name}.${dashboard_name}.json = strenv(dashboard_content)" values.yaml
29+
30+
echo "Injected dashboard: $dashboard_name into folder: $folder_name"
31+
fi
32+
done
33+
34+
for file in ./grafana/alerts/*.yaml; do
35+
file_name=$(basename "$file" .yaml)
36+
export file_content=$(cat "$file" )
37+
yq -i ".grafana.alerting.\"${file_name}.yaml\" = env(file_content)" values.yaml
1238
done
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: 1
2+
contactPoints:
3+
- orgId: 1
4+
name: 'Slack #network-alerts channel'
5+
receivers:
6+
- uid: deexubp9hzpc1b
7+
type: slack
8+
settings:
9+
url: $SLACK_WEBHOOK_URL
10+
disableResolveMessage: false
11+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: 1
2+
policies:
3+
- orgId: 1
4+
receiver: 'Slack #network-alerts channel'
5+
object_matchers:
6+
- - k8s_namespace_name
7+
- =~
8+
- $PRODUCTION_NAMESPACES_REGEX
9+
group_by:
10+
- grafana_folder
11+
- alertname

0 commit comments

Comments
 (0)