9.3 KiB
Per AI Blitz Plan §platform.procedures. Layer: 1. Repo: devops-infra-helm-charts.
Procedure — Modify observability stack config
Layer: Layer 1 — values diff + PR. Blast radius: one chart × one cluster (a metrics gap, retention change, or alert-rule edit can ripple to paging and dashboards across the BU). Approval: observability owner (
siddharth.pal@meesho.com) + cluster owner.
This procedure covers edits to the cluster-by-cluster observability override files:
| Override path | What it controls |
|---|---|
helm-overrides/<cluster>/victoria-metrics-agent/custom-values.yaml |
Scrape targets, relabel rules, remote-write tenancy. |
helm-overrides/<cluster>/victoria-metrics-cluster/custom-values.yaml |
vmstorage retention, vmselect/vminsert sizing, ruler config. |
helm-overrides/<cluster>/mimir/custom-values.yaml (also mimir-distributed) |
Mimir distributor/ingester/ruler config and tenancy. |
helm-overrides/<cluster>/loki/custom-values.yaml (also loki-distributed) |
Loki retention, ingestion limits, multi-tenant config. |
helm-overrides/<cluster>/tempo/custom-values.yaml (also tempo-distributed) |
Tempo block retention, distributor sizing. |
helm-overrides/<cluster>/grafana/custom-values.yaml |
Datasources, dashboard providers, plugins. |
helm-overrides/<cluster>/vmalert/custom-values.yaml |
vmalert alerting rules and notifier config. |
helm-overrides/<cluster>/prometheus/custom-values.yaml (or kube-prometheus-stack) |
Prometheus alert rules, scrape config, retention. |
All of these are versioned-sibling-aware — confirm whether the cluster's Argo Application points at victoria-metrics-cluster or victoria-metrics-cluster-latest, etc., before editing. See ../../global/coding-guidelines/observability.md for stack conventions.
When to use
- Adding/removing scrape targets, relabel rules, recording rules.
- Changing retention (
vmstorage.retentionPeriod, Lokiretention_period, Tempocompaction.block_retention). - Adding/removing/tuning alert rules in
vmalertorkube-prometheus-stack. - Adding/removing Grafana datasources, dashboards, plugins.
- Tuning ingester/distributor sizing for Mimir/Loki/Tempo.
Do not use this procedure for:
- Bumping the chart version of an observability tool — use update-chart-version.md.
- Onboarding a brand-new observability tool to a cluster — use onboard-app-to-cluster.md.
- A blue-green migration between sibling charts (
-latest) — use blue-green-chart-migration.md.
Inputs
| Input | Example |
|---|---|
| Target cluster | k8s-supply-prd-ase1 |
| Target chart | victoria-metrics-cluster |
| Versioned-sibling target (if applicable) | victoria-metrics-cluster-latest |
| Change kind | retention bump, new scrape target, new alert rule, dashboard add |
| Promql expression(s) touched (if any) | sum(rate(...)) by (job) > 0.05 |
| Approval ticket | CMR-1234 (if BU policy requires) |
Pre-conditions
- The cluster directory and chart override exist.
- The cluster's Argo
Applicationpoints at the chart you're editing (and not its sibling). Checkgithub.com/Meesho/devops-infra-argo-config. - You have the previous PR diff for context (most observability edits are touching a known knob).
- You have access to PromQL/promtool (or vmalert binary) locally for rule validation.
Steps
1. Confirm which sibling the cluster runs
# In the sister repo
gh search code --repo Meesho/devops-infra-argo-config "<chart>" -- path:**/<cluster>*
Find the Application whose spec.source.path points at this repo. Note whether it's victoria-metrics-cluster or victoria-metrics-cluster-latest. Editing the wrong one is silent — the file diff merges, but no cluster picks it up.
2. Read the current values
yq e '.' helm-overrides/<cluster>/<chart>/custom-values.yaml | less
Note current retention, scrape targets, and any inline alert rules.
3. Author the change
Edit helm-overrides/<cluster>/<chart>/custom-values.yaml. Surgical — only the keys the task requires. Preserve YAML key order; preserve comments.
Cardinality discipline
If the change adds a label, scrape target, or relabel_configs rule, ask: can the new label exceed ~few-hundred distinct values? If yes, drop or aggregate. See observability.md §Cardinality discipline.
Retention changes
Increasing vmstorage.retentionPeriod, Loki retention_period, or Tempo block_retention grows the backing PVC. Confirm persistence.size (or vmstorage.persistentVolume.size) has been bumped to match — otherwise vmstorage runs out of disk silently.
Alert-rule edits
If the rule's for: window or severity label changes, the PagerDuty routing may swap. Cross-check the cluster's Alertmanager / vmalert notifier config before merging.
4. Render the chart locally
helm template <release> helm-templates/<chart> \
-f helm-overrides/<cluster>/<chart>/custom-values.yaml > /tmp/rendered.yaml
The render must succeed. If it errors, fix the values before continuing.
5. Validate any PromQL touched
For Prometheus/kube-prometheus-stack:
# Extract PrometheusRule objects from rendered output
yq e 'select(.kind == "PrometheusRule")' /tmp/rendered.yaml > /tmp/rules.yaml
# Validate
promtool check rules /tmp/rules.yaml
For vmalert:
# Extract VMRule (or ConfigMap with rules)
yq e 'select(.kind == "VMRule" or .kind == "ConfigMap")' /tmp/rendered.yaml > /tmp/vmrules.yaml
# vmalert dry-run
vmalert -dryRun -rule=/tmp/vmrules.yaml
If promtool / vmalert is unavailable locally, surface the rule expression in the PR description and request reviewer to validate.
6. (Grafana) Validate datasource URL is in-cluster
Datasources should point at in-cluster Service DNS (e.g. http://victoria-metrics-cluster-vmselect:8481), not external endpoints. Never pin a Grafana datasource at *.meeshogcp.in, prd.meesho.int, or any production hostname — that violates the NEVER-DO list and routes through external networking unnecessarily.
7. Open the PR
git checkout -b obs/<cluster>-<chart>-<short-desc>
git add helm-overrides/<cluster>/<chart>/custom-values.yaml
git commit -m "obs(<cluster>/<chart>): <short desc>"
git push origin obs/<cluster>-<chart>-<short-desc>
gh pr create --base main
PR description template
## Summary
<one-line: what changed and why>
## Cluster × chart
- Cluster: `<cluster>`
- Chart: `<chart>` (sibling: `<sibling-or-N/A>`)
- File: `helm-overrides/<cluster>/<chart>/custom-values.yaml`
## Validation
- [ ] `helm template` renders cleanly
- [ ] `promtool check rules` / `vmalert -dryRun` passed (PromQL expression: `<expr>`)
- [ ] Cardinality bounded (no unbounded label introduced)
- [ ] Retention/PVC headroom confirmed (if retention changed)
- [ ] PagerDuty routing unchanged (if alert rule changed)
## Approvers
- Observability owner: <handle>
- Cluster owner: <handle>
## Sister repo
- N/A (no Application change required)
8. After merge
Argo CD on the target cluster reconciles. Most observability charts use manual sync (see observability.md) — open the cluster's Argo CD UI, find the Application, click Sync. Watch:
kubectl --context=<ctx> -n <observability-ns> get pods -w
kubectl --context=<ctx> -n <observability-ns> logs <chart>-pod | tail -50
If a metric goes missing post-sync → ../runbooks/metrics-gap.md.
Anti-patterns
- Editing the wrong sibling. The Argo Application points at
*-latest; you edit the stable chart's values. Diff merges, nothing applies. - Adding
pod_name/request_id/user_idas a label without aggregation — explodes cardinality. - Bumping retention without bumping PVC. vmstorage runs out of disk; ingest fails silently.
- Silent PagerDuty re-route. Changing
severity:fromwarningtocritical(or vice versa) without coordinating on-call. - Inlining production hostnames as Grafana datasource URLs — see SANCTITY_RULES.md R3.
- Cross-cluster normalising — touching every cluster's
custom-values.yamlin one PR. Surgical only; one cluster per PR.
Rollback
- Revert the values PR. Argo CD will re-render with the previous values; click Sync.
- For retention shrinks: data older than the new retention is dropped on next compaction. Reverting restores the config but not the data.
Related
- Coding guideline: ../../global/coding-guidelines/observability.md.
- Runbook: ../runbooks/metrics-gap.md.
- Procedure: modify-alert-rules.md — alert-only edits.
- Schema: ../schemas/custom-values-schema.md.
- ADR: ../../../wiki/analyses/ADR-A2-blue-green-sibling-pattern.md.
- Wiki: ../../../wiki/entities/DevOps%20Infra%20Helm%20Charts.md.