Configureerbare regels op basis van drempelwaarden in Azure Stream Analytics
In dit artikel wordt beschreven hoe u referentiegegevens gebruikt om een waarschuwingsoplossing te bereiken die gebruikmaakt van configureerbare regels op basis van drempelwaarden in Azure Stream Analytics.
Scenario: Waarschuwingen op basis van aanpasbare regeldrempels
Mogelijk moet u een waarschuwing als uitvoer produceren wanneer binnenkomende gestreamde gebeurtenissen een bepaalde waarde hebben bereikt of wanneer een geaggregeerde waarde op basis van de binnenkomende gestreamde gebeurtenissen een bepaalde drempelwaarde overschrijdt. Het is eenvoudig om een Stream Analytics-query in te stellen die waarde vergelijkt met een statische drempelwaarde die vast en vooraf is bepaald. Een vaste drempelwaarde kan worden vastgelegd in de syntaxis van de streamingquery met behulp van eenvoudige numerieke vergelijkingen (groter dan, kleiner dan en gelijkheid).
In sommige gevallen moeten de drempelwaarden eenvoudiger kunnen worden geconfigureerd zonder de querysyntaxis te bewerken telkens wanneer een drempelwaarde wordt gewijzigd. In andere gevallen hebt u mogelijk meerdere apparaten of gebruikers nodig die door dezelfde query worden verwerkt, waarbij elk van deze verschillende drempelwaarden heeft op elk type apparaat.
Dit patroon kan worden gebruikt om drempelwaarden dynamisch te configureren, selectief te kiezen welk type apparaat de drempelwaarde toepast door de invoergegevens te filteren en selectief te kiezen welke velden moeten worden opgenomen in de uitvoer.
Aanbevolen ontwerppatroon
Gebruik referentiegegevensinvoer voor een Stream Analytics-taak als zoekactie voor de waarschuwingsdrempels:
- Sla de drempelwaarden op in de referentiegegevens, één waarde per sleutel.
- Voeg de invoer van streaminggegevens toe aan de referentiegegevens in de sleutelkolom.
- Gebruik de sleutelwaarde uit de referentiegegevens als drempelwaarde.
Voorbeeldgegevens en query's
In het voorbeeld worden waarschuwingen gegenereerd wanneer de aggregatie van gegevens die vanaf apparaten worden gestreamd in een minuut lang, overeenkomt met de opgegeven waarden in de regel die als referentiegegevens wordt opgegeven.
In de query kunt u voor elke deviceId en elke metricName onder de deviceId 0-5 dimensies configureren voor GROUP BY. Alleen de gebeurtenissen met de bijbehorende filterwaarden worden gegroepeerd. Eenmaal gegroepeerd, worden vensteraggregaties van Min, Max en Avg berekend over een tumblingvenster van 60 seconden. Filters op de geaggregeerde waarden worden vervolgens berekend volgens de geconfigureerde drempelwaarde in de verwijzing om de gebeurtenis voor de waarschuwingsuitvoer te genereren.
Stel dat er een Stream Analytics-taak is met een referentiegegevensinvoer met de naam regels en streaminggegevensinvoer met de naam metrische gegevens.
Referentiegegevens
In deze voorbeeldreferentiegegevens ziet u hoe een regel op basis van drempelwaarden kan worden weergegeven. Een JSON-bestand bevat de referentiegegevens en wordt opgeslagen in Azure Blob Storage. Deze blob-opslagcontainer wordt gebruikt als referentiegegevensinvoer met de naam regels. U kunt dit JSON-bestand overschrijven en de regelconfiguratie vervangen naarmate de tijd vordert, zonder de streamingtaak te stoppen of te starten.
- De voorbeeldregel wordt gebruikt om een aanpasbare waarschuwing weer te geven wanneer de CPU het waardepercentage
90
overschrijdt (gemiddelde is groter dan of gelijk aan). Hetvalue
veld kan indien nodig worden geconfigureerd. - U ziet dat de regel een operatorveld heeft, dat later
AVGGREATEROREQUAL
dynamisch wordt geïnterpreteerd in de querysyntaxis. - De regel filtert de gegevens op een bepaalde dimensiesleutel
2
met de waardeC1
. Andere velden zijn een lege tekenreeks, waarmee wordt aangegeven dat de invoerstroom niet moet worden gefilterd op deze gebeurtenisvelden. U kunt desgewenst aanvullende CPU-regels instellen om andere overeenkomende velden te filteren. - Niet alle kolommen moeten worden opgenomen in de uitvoerwaarschuwingsgebeurtenis. In dit geval
includedDim
wordt sleutelnummer2
ingeschakeldTRUE
om aan te geven dat veldnummer 2 van de gebeurtenisgegevens in de stream wordt opgenomen in de in aanmerking komende uitvoergebeurtenissen. De andere velden zijn niet opgenomen in de waarschuwingsuitvoer, maar de lijst met velden kan worden aangepast.
{
"ruleId": 1234,
"deviceId" : "978648",
"metricName": "CPU",
"alertName": "hot node AVG CPU over 90",
"operator" : "AVGGREATEROREQUAL",
"value": 90,
"includeDim": {
"0": "FALSE",
"1": "FALSE",
"2": "TRUE",
"3": "FALSE",
"4": "FALSE"
},
"filter": {
"0": "",
"1": "",
"2": "C1",
"3": "",
"4": ""
}
}
Voorbeeld van streamingquery
In deze voorbeeldquery van Stream Analytics worden de regels naar referentiegegevens uit het bovenstaande voorbeeld samengevoegd met een invoerstroom met gegevens met de naam metrische gegevens.
WITH transformedInput AS
(
SELECT
dim0 = CASE rules.includeDim.[0] WHEN 'TRUE' THEN metrics.custom.dimensions.[0].value ELSE NULL END,
dim1 = CASE rules.includeDim.[1] WHEN 'TRUE' THEN metrics.custom.dimensions.[1].value ELSE NULL END,
dim2 = CASE rules.includeDim.[2] WHEN 'TRUE' THEN metrics.custom.dimensions.[2].value ELSE NULL END,
dim3 = CASE rules.includeDim.[3] WHEN 'TRUE' THEN metrics.custom.dimensions.[3].value ELSE NULL END,
dim4 = CASE rules.includeDim.[4] WHEN 'TRUE' THEN metrics.custom.dimensions.[4].value ELSE NULL END,
metric = metrics.metric.value,
metricName = metrics.metric.name,
deviceId = rules.deviceId,
ruleId = rules.ruleId,
alertName = rules.alertName,
ruleOperator = rules.operator,
ruleValue = rules.value
FROM
metrics
timestamp by eventTime
JOIN
rules
ON metrics.deviceId = rules.deviceId AND metrics.metric.name = rules.metricName
WHERE
(rules.filter.[0] = '' OR metrics.custom.filters.[0].value = rules.filter.[0]) AND
(rules.filter.[1] = '' OR metrics.custom.filters.[1].value = rules.filter.[1]) AND
(rules.filter.[2] = '' OR metrics.custom.filters.[2].value = rules.filter.[2]) AND
(rules.filter.[3] = '' OR metrics.custom.filters.[3].value = rules.filter.[3]) AND
(rules.filter.[4] = '' OR metrics.custom.filters.[4].value = rules.filter.[4])
)
SELECT
System.Timestamp as time,
transformedInput.deviceId as deviceId,
transformedInput.ruleId as ruleId,
transformedInput.metricName as metric,
transformedInput.alertName as alert,
AVG(metric) as avg,
MIN(metric) as min,
MAX(metric) as max,
dim0, dim1, dim2, dim3, dim4
FROM
transformedInput
GROUP BY
transformedInput.deviceId,
transformedInput.ruleId,
transformedInput.metricName,
transformedInput.alertName,
dim0, dim1, dim2, dim3, dim4,
ruleOperator,
ruleValue,
TumblingWindow(second, 60)
HAVING
(
(ruleOperator = 'AVGGREATEROREQUAL' AND avg(metric) >= ruleValue) OR
(ruleOperator = 'AVGEQUALORLESS' AND avg(metric) <= ruleValue)
)
Voorbeeld van streaming-invoer gebeurtenisgegevens
Deze voorbeeld-JSON-gegevens vertegenwoordigen de invoergegevens van metrische gegevens die worden gebruikt in de bovenstaande streamingquery.
- Er worden drie voorbeeldgebeurtenissen weergegeven binnen de periode van 1 minuut, waarde
T14:50
. - Alle drie hebben dezelfde
deviceId
waarde978648
. - De metrische cpu-waarden variëren per gebeurtenis,
98
respectievelijk ,95
80
. Alleen de eerste twee voorbeeld gebeurtenissen overschrijden de CPU-waarschuwingsregel die in de regel is ingesteld. - Het veld includeDim in de waarschuwingsregel was sleutelnummer 2. Het bijbehorende sleutel 2-veld in de voorbeeldevenementen heet
NodeName
. De drie voorbeeldevenementen hebben respectievelijk waardenN024
,N024
enN014
. In de uitvoer ziet u alleen het knooppuntN024
, omdat dit de enige gegevens zijn die voldoen aan de waarschuwingscriteria voor een hoog CPU-gebruik.N014
voldoet niet aan de hoge CPU-drempelwaarde. - De waarschuwingsregel is geconfigureerd met alleen een
filter
op sleutelnummer 2, dat overeenkomt met hetcluster
veld in de voorbeeldgebeurtenissen. De drie voorbeeldevenementen hebben allemaal een waardeC1
en komen overeen met de filtercriteria.
{
"eventTime": "2018-04-30T14:50:23.1324132Z",
"deviceId": "978648",
"custom": {
"dimensions": {
"0": {
"name": "NodeType",
"value": "N1"
},
"1": {
"name": "Cluster",
"value": "C1"
},
"2": {
"name": "NodeName",
"value": "N024"
}
},
"filters": {
"0": {
"name": "application",
"value": "A1"
},
"1": {
"name": "deviceType",
"value": "T1"
},
"2": {
"name": "cluster",
"value": "C1"
},
"3": {
"name": "nodeType",
"value": "N1"
}
}
},
"metric": {
"name": "CPU",
"value": 98,
"count": 1.0,
"min": 98,
"max": 98,
"stdDev": 0.0
}
}
{
"eventTime": "2018-04-30T14:50:24.1324138Z",
"deviceId": "978648",
"custom": {
"dimensions": {
"0": {
"name": "NodeType",
"value": "N2"
},
"1": {
"name": "Cluster",
"value": "C1"
},
"2": {
"name": "NodeName",
"value": "N024"
}
},
"filters": {
"0": {
"name": "application",
"value": "A1"
},
"1": {
"name": "deviceType",
"value": "T1"
},
"2": {
"name": "cluster",
"value": "C1"
},
"3": {
"name": "nodeType",
"value": "N2"
}
}
},
"metric": {
"name": "CPU",
"value": 95,
"count": 1,
"min": 95,
"max": 95,
"stdDev": 0
}
}
{
"eventTime": "2018-04-30T14:50:37.1324130Z",
"deviceId": "978648",
"custom": {
"dimensions": {
"0": {
"name": "NodeType",
"value": "N3"
},
"1": {
"name": "Cluster",
"value": "C1 "
},
"2": {
"name": "NodeName",
"value": "N014"
}
},
"filters": {
"0": {
"name": "application",
"value": "A1"
},
"1": {
"name": "deviceType",
"value": "T1"
},
"2": {
"name": "cluster",
"value": "C1"
},
"3": {
"name": "nodeType",
"value": "N3"
}
}
},
"metric": {
"name": "CPU",
"value": 80,
"count": 1,
"min": 80,
"max": 80,
"stdDev": 0
}
}
Voorbeelduitvoer
Dit voorbeeld van JSON-uitvoergegevens laat zien dat er één waarschuwingsgebeurtenis is geproduceerd op basis van de CPU-drempelwaarderegel die is gedefinieerd in de referentiegegevens. De uitvoergebeurtenis bevat de naam van de waarschuwing en de geaggregeerde (gemiddelde, min, max) van de velden die worden overwogen. De uitvoer gebeurtenisgegevens bevatten veldsleutel nummer 2 NodeName
waarde N024
vanwege de regelconfiguratie. (De JSON is gewijzigd om regeleinden weer te geven voor leesbaarheid.)
{"time":"2018-05-01T02:03:00.0000000Z","deviceid":"978648","ruleid":1234,"metric":"CPU",
"alert":"hot node AVG CPU over 90","avg":96.5,"min":95.0,"max":98.0,
"dim0":null,"dim1":null,"dim2":"N024","dim3":null,"dim4":null}