Query Details
let query_frequency = 1h;
let query_period = 3d;
let _ExpectedFrequencies =
_GetWatchlist("DataType-IngestedTables")
| where Type == "ThreatIntelIndicators"
| project Type, Critical, SourceSystem = Auxiliar, ExpectedIngestionFrequency = totimespan(Frequency)
;
ThreatIntelIndicators
| where TimeGenerated > ago(query_period)
| summarize IngestionTime = max(ingestion_time()) by Type, SourceSystem
| lookup kind=inner _ExpectedFrequencies on Type, SourceSystem
| where IngestionTime between (ago(ExpectedIngestionFrequency + query_frequency) .. ago(ExpectedIngestionFrequency))
| extend
TimespanWithoutIngestion = now() - IngestionTime,
AlertSeverity = case(
Critical == "true", "High",
"Informational"
)
| project
Type,
SourceSystem,
Critical,
ExpectedIngestionFrequency,
TimespanWithoutIngestion,
AlertSeverity
This KQL query is designed to monitor the ingestion of threat intelligence indicators and identify any delays in their expected ingestion frequency. Here's a simplified explanation of what the query does:
Define Parameters:
query_frequency is set to 1 hour, which is used to define a buffer period for checking ingestion times.query_period is set to 3 days, which specifies the time range for checking data.Retrieve Expected Frequencies:
Type is "ThreatIntelIndicators".Type, Critical, SourceSystem, and converts Frequency to a timespan for ExpectedIngestionFrequency.Check Ingestion Times:
ThreatIntelIndicators table for entries generated within the last 3 days.Type and SourceSystem.Compare with Expected Frequencies:
Type and SourceSystem.Calculate Delay and Severity:
TimespanWithoutIngestion).Critical.Output:
Type, SourceSystem, Critical status, ExpectedIngestionFrequency, TimespanWithoutIngestion, and AlertSeverity.In summary, this query helps identify threat intelligence indicators that are not being ingested as frequently as expected, highlighting potential issues with data ingestion processes.

Jose Sebastián Canós
Released: July 9, 2025
Tables
Keywords
Operators