01 · Why clicked silences rot
"Ok", ending in 2137.
A real audit of one company's infrastructure found silences created years earlier.
They had an end date more than a century away and a two-word comment.
Their matchers pointed at alert rules that no longer existed anywhere. They muted
nothing useful. They also hid whatever came next under the same name.
A better UI is not the fix. The fix is to make every silence a reviewed
change with a reason and an end.
02 · Declare the window
One file per silence, with an end time that is mandatory.
Silences live in your alerting-config repository under
silences/<tenant>/<id>.yaml. Each file has matchers, a
start, an end at most 30 days later, a comment and a link to
the change that justifies the silence.
A genuinely long-lived silence is rare. It has a loud escape hatch,
permanent:. This needs a reason, an approver and a
review_by date.
03 · Checked before merge
A lint that needs no credentials at all.
The merge request (MR) pipeline runs a small, self-contained validator.
It refuses unknown keys, duplicate keys and multi-document files.
The tenant must match its directory. The id must match the file
name. The window must have an end. Every regex must compile.
It runs with no network and no secrets, because in many Alertmanager
setups a "read-only" certificate can also write. The assistant uses
the same validator as its loader. So review and runtime never
disagree about the schema.
04 · Applied on merge, by your CI
The assistant never holds an Alertmanager write key.
After merge, a job on the default branch prints a plan. Then it creates
the silence. Each silence carries a sentinel comment with its id and
generation. So the job never re-creates a past window. If you edit an end
time, the next pass reconciles it.
The lint ships with the assistant. The applier is a small, tested
script that runs in your pipeline. If the job cannot read a tenant, it fails
and does not guess.
05 · PagerDuty follows the silence
An incident opened before the window stops paging too.
An Alertmanager silence does nothing for a PagerDuty incident that
is already open. The escalation policy keeps sending notifications. So every
15 minutes the same pipeline snoozes open incidents that a
live declared silence covers. The snooze lasts until the silence ends.
It also resolves incidents whose alert group has stopped
firing. A silenced alert would never do this on its own.
06 · During the window
The alert fires, nobody is woken, the context is kept.
The migration trips PostgresReplicationLag at 06:40.
Alertmanager matches it to the silence and sends nothing.
The assistant's alert triage still sees the alert, with the silence
attached as context. The assistant annotates silenced alerts and does not
drop them. If something outside the planned change breaks, the
triage knows which alerts were expected.
07 · Before and at the end
A warning if it is still firing. Then alerting comes back.
Two hours before the end, and again thirty minutes before, a check runs. If alerts that
the silence covers are still firing, a Slack message says so.
At that point you can extend the silence on purpose (edit
ends_at in a new MR) or accept the page.
At ends_at the silence expires. Nobody has to remember it or clean it up.
08 · Audited afterwards
Every live silence, checked against the rules that exist.
A read-only audit checks every live silence of every tenant against the loaded
rule set. Rule-based checks flag a silence with no end, or with an end
more than 30 days away. They also flag a silence that matches no loaded rule,
and an empty or broken matcher. A permanent grant whose review date has
passed is a finding too.
A second report lists the other ways to mute an alert. These are inhibit rules, mute intervals and severity demotions.
The report also shows their expiry debt (mutes that should have ended). If the assistant cannot read a source, the answer is "unknown",
never "clean".
09 · Proposed with the change Roadmap
Planned: the silence arrives next to the upgrade MR.
Planned: when the assistant proposes a risky upgrade hop, it also
drafts the matching silence file as a companion MR. The silence fits the
window the hop needs. We also plan recurring maintenance windows, such as a weekly
patch slot, as a route-level mute interval.
Today your team writes the silence file. The rest of this page
runs in production.