The Sentinel Connector Was Green — But the Events Had Stopped
The connector looked fine.
Configured.
Connected.
No obvious warning demanding attention.
But an analyst hunting through the expected security data noticed something strange.
The newest events were hours old.
The connector still existed.
The workspace still worked.
The queries still ran.
Only the evidence had stopped arriving.
Agent Foskett asked a question every SOC should ask regularly.
Are we monitoring the connector — or are we monitoring the data?

Connected Did Not Mean Current.
A configured connector is only part of the story. Detection depends on the expected data continuing to reach the workspace.
The first clue was absence
The clue was simply that a table which normally received frequent events had gone quiet.
That made this a different kind of investigation.
Agent Foskett was investigating something that should have happened — but did not.
Start with the data, not the connector page
For this case, the affected source was Microsoft 365 audit data flowing into
OfficeActivity.The same principle applies to any expected table: identify its normal cadence and compare that with the newest available event.
Find the newest event
- 1
- 2
- 3
- 4
- 5
- 6
- 7
OfficeActivity
| summarize LastEventTime = max(TimeGenerated),
EventsLastHour = countif(TimeGenerated > ago(1h)),
EventsLast24Hours = countif(TimeGenerated > ago(24h))
| extend EventAge = now() - LastEventTimeThe table had stopped moving
That did not yet explain why.
It established the gap.
Before diagnosing a connector problem, prove that the expected data is actually stale.
Separate event time from ingestion time
TimeGenerated with ingestion_time() to distinguish stale source events from delayed ingestion into the workspace.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
OfficeActivity
| where TimeGenerated > ago(7d)
| extend IngestionTime = ingestion_time(),
IngestionDelay = ingestion_time() - TimeGenerated
| summarize LastEventTime = max(TimeGenerated),
LastIngestionTime = max(IngestionTime),
P95Delay = percentile(IngestionDelay, 95),
P99Delay = percentile(IngestionDelay, 99)Freshness and delay are different problems
If neither recent event timestamps nor recent ingestion timestamps exist, the collection path may have stalled entirely.
“No current events” and “current events arriving late” are not the same failure.
Now inspect Sentinel's own health evidence
SentinelHealth when auditing and health monitoring is enabled.Microsoft recommends monitoring connector health, connectivity and performance, and provides both the Data collection health monitoring workbook and health-table queries for this purpose.
Agent Foskett used that evidence as another layer — not as a replacement for checking the target data itself.
Check recent connector health
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
SentinelHealth
| where TimeGenerated > ago(3d)
| where OperationName == "Data fetch status change"
| where Status in ("Success", "Failure")
| summarize arg_max(TimeGenerated, *) by SentinelResourceName, SentinelResourceId
| project TimeGenerated,
SentinelResourceName,
SentinelResourceId,
Status,
Description,
ExtendedProperties
| order by TimeGenerated descA healthy-looking state was not enough
Agent Foskett therefore kept two questions separate.
Is the connector reporting a problem?
and
Is the expected data actually arriving?
Build a simple data-freshness monitor
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
let MaximumExpectedSilence = 30m;
OfficeActivity
| summarize LastEventTime = max(TimeGenerated)
| extend EventAge = now() - LastEventTime
| extend FreshnessState =
iff(EventAge > MaximumExpectedSilence, "STALE", "CURRENT")Thresholds need a baseline
It could be meaningless for a source that legitimately produces one event per day.
Agent Foskett reviewed historical event volume and cadence before deciding what “stopped” should mean operationally.
Missing-data detection needs an expected heartbeat.
See the normal ingestion pattern
- 1
- 2
- 3
- 4
- 5
- 6
OfficeActivity | where TimeGenerated > ago(7d) | summarize Events = count() by bin(TimeGenerated, 1h) | order by TimeGenerated asc
The outage window mattered more than the colour
Every analytics rule, hunting query and investigation relying on that source during the gap had potentially operated with incomplete visibility.
The connector problem therefore became a detection-coverage problem.
When telemetry stops, the question is not only “how do we restore it?” It is also “what could we not see while it was gone?”
Restore collection — then validate it
He returned to the target table.
Were new events arriving?
Were timestamps current?
Was ingestion delay back within the expected range?
Had the historical gap been backfilled, or did it remain permanent?
Recovery is proven by data, not by configuration alone.
Build the missing-data timeline
What Agent Foskett checked
What the evidence can and cannot prove
ingestion_time() helps distinguish source event time from workspace ingestion time.SentinelHealth can provide health evidence for supported Sentinel resources when health monitoring is enabled, but Microsoft documents connector-specific support and limitations.No single status indicator replaces validation of the telemetry your detections actually consume.
The lesson
The workspace was online.
The queries still worked.
And yet the SOC had lost visibility into part of the environment.
A connector can look reassuring while the data tells a different story.
Agent Foskett stopped looking at the colour of the connector and measured the age of the evidence.
Related investigations
Final thought
But sometimes the most important signal is silence.
No events.
No fresh records.
No evidence where evidence should exist.
Agent Foskett did not trust the connector's appearance. He asked the data when it had last spoken.
The Logs Already Knew! 🔎

