Your Zabbix Sees the Problem. Who Closes It?
Zabbix is very good at noticing. A trigger expression evaluates, a problem opens, an action sends the message. What happens next is still a person: the on-call opens the frontend, reads the problem, checks the host's latest data, scrolls the event history to see if it flapped yesterday too, remembers that someone changed a config on Tuesday, and decides whether this is an outage or noise. Then the next problem arrives and the same twenty minutes start again.
This post is about that second half. It walks through why the classic Zabbix workflow keeps producing more problems than people can close, and how CloudThinker reads Zabbix over its API to triage, correlate, act with approval, and verify that each problem is really gone.
Officially listed on Zabbix. CloudThinker is a vendor-supported integration in the Zabbix integrations catalog.
Why the problem queue keeps growing
None of what follows is a Zabbix flaw. These are the places where a detection system hands work to humans and the humans run out of time.
Triggers judge one item at a time. A trigger expression looks at item values on one host, like avg(/db-prod-02/vfs.dev.read.await[sda],5m)>50. It can't know that a deploy landed twenty minutes ago, that the same signature fired on three sibling hosts, or that the latency only matters because checkout depends on this database. The problem says what crossed a line. The why is left to whoever reads it.
Flapping is a configuration debt. A threshold set on launch day sits right inside today's normal range, so the problem opens and resolves every few minutes. Zabbix has the tool for this, a separate recovery expression for hysteresis, but someone has to notice the flap, pick a sensible band and edit the trigger. Until then, the team learns to ignore it, and that habit doesn't stay limited to the noisy trigger.
Dependency trees are rarely maintained. When a core switch dies, every host behind it goes unreachable, and forty problems open at once. Trigger dependencies can suppress that, but only if the dependency map matches the network as it is today, not as it was when someone first drew it.
Actions are deterministic. An action matches conditions and runs operations: send a message, escalate after 30 minutes, run a remote command. That's exactly right for routing. It can't look at the evidence and decide that this disk alert is a log-rotation bug on one host rather than a capacity problem on all of them.
Maintenance windows become blind mutes. The fastest way to stop a noisy problem is a maintenance window. Without an expiry, an owner and a reason, it outlives the noise it was meant to hide, and a real failure later goes unnoticed.
01Signal
Item-level triggers
Each trigger sees one host and one expression. Context like deploys, siblings and business impact lives elsewhere.
02Noise
Flap and storms
Missing recovery expressions and stale dependency maps turn one fault into dozens of problems.
03Response
Fixed actions
Escalations route the message. Nothing in the chain reads the evidence and decides what it means.
How CloudThinker connects
01Monitoring
Zabbix
- Triggers and problemsproblem.get, event.get
- Hosts and itemshost.get, item.get, history.get
- Dependenciestrigger.get with dependencies
- Maintenancemaintenance.get, create when approved
Nothing installed on hosts
02Investigation
CloudThinker
- TriageOutage, flap, capacity or noise
- CorrelateHost history, siblings, recent changes
- ProposeTrigger fix, scoped window, host action
- VerifyProblem resolved and stays resolved
Read-only by default
03Where the team works
Chat and on-call
Slack or TeamsFindings and approvals in the thread
PagerDutyPages only on confirmed outages
- JiraFollow-ups with evidence attached
- OnCall roomA shared room for serious incidents
Same channels, better input
Everything CloudThinker knows about your estate comes from the same API the Zabbix frontend uses. A read-only API user, scoped to the host groups you choose, covers inventory and every triage run. Write permission (to create a maintenance window, change a trigger or disable a host) is a separate grant you make later, per host group.
One problem, end to end
01Signal
Problem
A trigger opens a problem at or above the severity you choose.
02Classify
Triage
Outage, flapping trigger, capacity breach, or noise.
03Context
Correlate
History, sibling hosts, dependencies and recent changes.
04Approved
Act
Trigger tweak, scoped maintenance, or host action.
05Close
Verify
Confirms the problem resolved and holds. Reopens if not.
Here's a typical case. Disk read latency on db-prod-02 crosses its threshold at 14:20 and a problem opens.
1. Triage starts from what the problem implies. There are a few readings. The disk is failing. Something new is hammering it. Or the trigger is too tight and this is ordinary load. Each one predicts different data, and CloudThinker goes and checks rather than guessing.
2. Correlate with the API. It pulls the problem, its event history and the item values behind it:
{
"jsonrpc": "2.0",
"method": "event.get",
"params": {
"objectids": ["24631"],
"time_from": 1759840800,
"output": ["eventid", "clock", "value", "severity"],
"sortfield": ["clock"],
"sortorder": "DESC"
},
"id": 1
}
The history shows this trigger has never fired on db-prod-02 before, so it isn't a flap. history.get on the latency item shows a clean step change at 14:02, not a slow climb, so it isn't gradual wear. The sibling replica db-prod-03 shows the same step at the same minute. Two hosts, one moment: that points to a change, not a disk.
3. Name the suspect. CloudThinker checks the change sources you've connected (deploy events, the infrastructure repo, the CI pipeline) and finds a release at 14:00 that switched a reporting job from the replica pool to run during business hours. The finding in chat says that, in plain words, with links to the Zabbix problem, the two latency graphs and the release.
4. Propose, don't apply. The proposal is to move the job back to its night window and leave the trigger alone, because the trigger did its job. If the problem had been a flap instead, the proposal would have been a recovery expression with a specific band, written as a diff against the trigger, plus a maintenance window with an expiry while the change is reviewed.
5. Verify. After the fix ships, CloudThinker watches the item until the problem resolves and stays resolved for the window you set. If latency comes back, the problem reopens with the new evidence attached instead of a fresh, context-free alert.
Where it earns its keep
- The 3 a.m. flapping trigger. A trigger toggles every few minutes and pages each time. CloudThinker spots the pattern in the event history, proposes a recovery expression and a short maintenance window with an expiry, and posts the evidence. The page stops without anyone muting the host blind.
- The alert storm from one root cause. A switch goes down and dozens of dependent-host problems open together. CloudThinker groups them under the upstream problem so the queue shows one incident, and proposes the missing trigger dependency so the next storm is suppressed by Zabbix itself.
- The post-deploy regression. The example above: a step change on two hosts at the same minute, traced to a release rather than hardware.
- The Monday-morning queue. Over the weekend the queue filled with noise and a couple of real problems. CloudThinker hands the team a classified digest in chat so standup starts with the two that matter.
Why this beats the traditional workflow
| Traditional Zabbix workflow | With CloudThinker | |
|---|---|---|
| First look at a problem | A person opens the frontend and starts clicking | Triage and evidence are already in the thread |
| Flapping triggers | Ignored until someone edits the expression | Detected from history, recovery expression proposed |
| Alert storms | Dozens of problems, one cause | Grouped to the upstream problem, dependency proposed |
| Change correlation | From memory, if at all | Checked against deploys and config changes |
| Maintenance windows | Open-ended mutes | Scoped, with expiry, owner and reason |
| Knowledge | In the heads of whoever was on call | Stored and reused on the next matching problem |
The deeper difference is the shape of the work. An action runs the same operations every time its conditions match, which is what you want for routing. Investigation is different: the next question depends on the last answer. That's the part CloudThinker takes on, and it's the part that used to consume the on-call's night.
Gated by design
CloudThinker never changes a trigger, opens a maintenance window or disables a host without a gate. It acts within Auto Mode, so you decide what runs on its own and what waits for approval, from a maintenance window to a trigger edit.
Every action carries the problem link, the host, the correlated events and the reasoning. CloudThinker doesn't train on your infrastructure data, events or problem content.
Getting started
Three steps. None of them needs write access on day one.
1. Create a read-only API user. In Zabbix, add a user role with API access and read permission on the host groups you want covered, then generate an API token for that user. The Zabbix Connection guide has the exact settings.
2. Run read-only triage on one host group. Nothing changes in Zabbix. Ask from chat:
"Summarize active Zabbix problems for my staging host group. Classify each as outage, flapping trigger, capacity breach, or noise, and show the evidence for each call. Propose only, change nothing."
3. Hand it a scoped task once the team trusts the triage.
"For the staging host group only: give confirmed flapping triggers a 2-hour maintenance window. Recovery-expression changes still come to me for review."
Related reading
- Auto Mode: graduated autonomy with safe defaults
- CloudThinker Connections: how CloudThinker reaches your stack
- CloudThinker × Wazuh: from alerts to investigation
- Managed Cloud Service 24/7
Conclusion
Zabbix will keep seeing everything, and it should. What changes is what happens after the trigger fires: the evidence gets gathered before anyone opens the frontend, noise gets fixed at the trigger instead of muted, and each closed problem makes the next one faster.
Want to see it against your own host groups? Book a discovery call.
