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.

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). Het value veld kan indien nodig worden geconfigureerd.
  • U ziet dat de regel een operatorveld heeft, dat later AVGGREATEROREQUALdynamisch wordt geïnterpreteerd in de querysyntaxis.
  • De regel filtert de gegevens op een bepaalde dimensiesleutel 2 met de waarde C1. 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 sleutelnummer 2 ingeschakeld TRUE 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 waarde 978648.
  • De metrische cpu-waarden variëren per gebeurtenis, 98respectievelijk , 9580 . 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 waarden N024, N024en N014 . In de uitvoer ziet u alleen het knooppunt N024 , 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 het cluster veld in de voorbeeldgebeurtenissen. De drie voorbeeldevenementen hebben allemaal een waarde C1 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}