Bearbeta konfigurerbara tröskelvärdesbaserade regler i Azure Stream Analytics

Den här artikeln beskriver hur du använder referensdata för att uppnå en aviseringslösning som använder konfigurerbara tröskelvärdesbaserade regler i Azure Stream Analytics.

Scenario: Aviseringar baserat på justerbara tröskelvärden för regler

Du kan behöva skapa en avisering som utdata när inkommande strömmade händelser har nått ett visst värde, eller när ett aggregerat värde baserat på inkommande strömmade händelser överskrider ett visst tröskelvärde. Det är enkelt att konfigurera en Stream Analytics-fråga som jämför värdet med ett statiskt tröskelvärde som är fast och förutbestämt. Ett fast tröskelvärde kan hårdkodas i strömningsfrågesyntaxen med hjälp av enkla numeriska jämförelser (större än, mindre än och likhet).

I vissa fall måste tröskelvärdena vara enklare att konfigurera utan att redigera frågesyntaxen varje gång ett tröskelvärde ändras. I andra fall kan du behöva flera enheter eller användare som bearbetas av samma fråga, där var och en av dem har olika tröskelvärden på varje typ av enhet.

Det här mönstret kan användas för att dynamiskt konfigurera tröskelvärden, selektivt välja vilken typ av enhet tröskelvärdet gäller genom att filtrera indata och selektivt välja vilka fält som ska inkluderas i utdata.

Använd en referensdatainmatning till ett Stream Analytics-jobb som en uppslagning av tröskelvärdena för aviseringar:

  • Lagra tröskelvärdena i referensdata, ett värde per nyckel.
  • Anslut strömmande dataindatahändelser till referensdata i nyckelkolumnen.
  • Använd det nyckelade värdet från referensdata som tröskelvärde.

Exempeldata och frågor

I exemplet genereras aviseringar när mängden data som strömmas in från enheter under ett minutlångt fönster matchar de angivna värdena i regeln som tillhandahålls som referensdata.

I frågan för varje deviceId och varje metricName under deviceId kan du konfigurera från 0 till 5 dimensioner till GROUP BY. Endast de händelser som har motsvarande filtervärden grupperas. När de har grupperats beräknas fönsteraggregaten Min, Max, Avg över ett rullande fönster på 60 sekunder. Filter på de aggregerade värdena beräknas sedan enligt det konfigurerade tröskelvärdet i referensen för att generera aviseringsutdatahändelsen.

Anta till exempel att det finns ett Stream Analytics-jobb som har en referensdatainmatning med namnet rules och strömmande dataindata med namnet metrics.

Referensdata

Det här exemplet på referensdata visar hur en tröskelvärdesbaserad regel kan representeras. En JSON-fil innehåller referensdata och sparas i Azure Blob Storage och bloblagringscontainern används som referensdataindata med namnet rules. Du kan skriva över den här JSON-filen och ersätta regelkonfigurationen efter hand, utan att stoppa eller starta strömningsjobbet.

  • Exempelregeln används för att representera en justerbar avisering när PROCESSORn överskrider (genomsnittet är större än eller lika med) värdeprocenten 90 . Fältet value kan konfigureras efter behov.
  • Observera att regeln har ett operatorfält som dynamiskt tolkas i frågesyntaxen senare i AVGGREATEROREQUAL.
  • Regeln filtrerar data på en viss dimensionsnyckel 2 med värdet C1. Andra fält är en tom sträng som anger att indataströmmen inte ska filtreras efter dessa händelsefält. Du kan konfigurera ytterligare CPU-regler för att filtrera andra matchande fält efter behov.
  • Det är inte alla kolumner som ska ingå i utdataaviseringshändelsen. I det här fallet includedDim aktiveras TRUE nyckelnumret 2 för att representera att fältnummer 2 av händelsedata i dataströmmen inkluderas i de kvalificerande utdatahändelserna. De andra fälten ingår inte i aviseringsutdata, men fältlistan kan justeras.
{
    "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": ""
    }    
}

Exempel på direktuppspelningsfråga

Den här Stream Analytics-exempelfrågan kopplar regelreferensdata från exemplet ovan till en indataström med namngivna mått.

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) 
    )

Exempel på strömmande indatahändelsedata

Det här exemplet på JSON-data representerar de måttindata som används i strömningsfrågan ovan.

  • Tre exempelhändelser visas inom tidsintervallet på 1 minut, värdet T14:50.
  • Alla tre har samma deviceId värde 978648.
  • Cpu-måttvärdena varierar i varje händelse, 98, 8095respektive. Endast de två första exempelhändelserna överskrider cpu-aviseringsregeln som upprättas i regeln.
  • IncludeDim-fältet i aviseringsregeln var nyckelnummer 2. Motsvarande nyckel 2-fält i exempelhändelserna heter NodeName. De tre exempelhändelserna har värdena N024, N024respektive N014 . I utdata ser du bara noden N024 eftersom det är de enda data som matchar aviseringsvillkoren för hög CPU-användning. N014 uppfyller inte det höga CPU-tröskelvärdet.
  • Aviseringsregeln cluster konfigureras med endast filter nyckelnummer 2, vilket motsvarar fältet i exempelhändelserna. De tre exempelhändelserna har alla värden C1 och matchar filtervillkoren.
{
    "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
    }
}

Exempel på utdata

I det här exemplet visar JSON-utdata att en enskild aviseringshändelse har skapats baserat på den cpu-tröskelregel som definierats i referensdata. Utdatahändelsen innehåller namnet på aviseringen samt aggregerade (genomsnitt, min, max) för de fält som övervägs. Händelsedata för utdata innehåller värdet N024 för fältnyckel nummer 2 NodeName på grund av regelkonfigurationen. (JSON har ändrats för att visa radbrytningar för läsbarhet.)

{"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}