Megosztás a következőn keresztül:


Konfigurálható küszöbérték-alapú szabályok feldolgozása az Azure Stream Analyticsben

Ez a cikk azt ismerteti, hogyan használható referenciaadatok egy olyan riasztási megoldás eléréséhez, amely konfigurálható küszöbérték-alapú szabályokat használ az Azure Stream Analyticsben.

Forgatókönyv: Riasztások állítható szabályküszöbök alapján

Előfordulhat, hogy riasztást kell létrehoznia kimenetként, ha a bejövő streamelt események elértek egy bizonyos értéket, vagy ha a bejövő streamelt eseményeken alapuló összesített érték túllép egy bizonyos küszöbértéket. Egyszerű beállítani egy Stream Analytics-lekérdezést, amely egy rögzített és előre meghatározott statikus küszöbértékhez hasonlítja az értéket. A rögzített küszöbértékek az egyszerű numerikus összehasonlításokkal (nagyobb, mint, kisebb mint és egyenlőség) nehezen kódálhatók a streamelési lekérdezés szintaxisában.

Bizonyos esetekben a küszöbértékeket egyszerűbben kell konfigurálni anélkül, hogy a lekérdezési szintaxist minden alkalommal módosítanák, amikor egy küszöbérték megváltozik. Más esetekben előfordulhat, hogy számos olyan eszközre vagy felhasználóra van szüksége, amelyet ugyanaz a lekérdezés dolgoz fel, és mindegyiknek különböző küszöbértékei vannak az egyes eszközökön.

Ez a minta használható a küszöbértékek dinamikus konfigurálására, a bemeneti adatok szűrésével, valamint a kimenetbe felvenni kívánt mezők szelektív kiválasztásával, hogy milyen eszközre vonatkozik a küszöbérték.

Használjon referenciaadat-bemenetet egy Stream Analytics-feladathoz a riasztási küszöbértékek kereséseként:

  • Tárolja a küszöbértékeket a referenciaadatokban, kulcsonként egy értéket.
  • Csatlakoztassa a streamelési adatbemeneti eseményeket a kulcsoszlop referenciaadataihoz.
  • Használja a referenciaadatok kulcsolt értékét küszöbértékként.

Példaadatok és lekérdezés

A példában a riasztások akkor jönnek létre, ha az eszközökről percekig tartó időszakban streamelt adatok összesítése megegyezik a referenciaadatként megadott szabályban megadott értékekkel.

A lekérdezésben a deviceId és a deviceId alatt található minden metrikanév esetében 0 és 5 dimenzió között konfigurálható a GROUP BY értékre. Csak a megfelelő szűrőértékekkel rendelkező események vannak csoportosítva. A csoportosítást követően a rendszer a Min, Max, Avg ablakos összesítéseket egy 60 másodperces átfedési időszakon keresztül számítja ki. Az összesített értékek szűrőinek kiszámítása a hivatkozásban konfigurált küszöbérték alapján történik a riasztás kimeneti eseményének létrehozásához.

Tegyük fel például, hogy van egy Stream Analytics-feladat, amely rendelkezik egy szabályok nevű referenciaadat-bemenettel, és a streamelési adatbevitel neve metrikák.

Referenciaadatok

Ez a példa referenciaadatok bemutatják, hogyan ábrázolható egy küszöbérték-alapú szabály. A referenciaadatokat egy JSON-fájl tárolja, amelyet az Azure Blob Storage-ba ment, és ezt a blobtárolót használja a rendszer a szabályok nevű referenciaadat-bemenetként. Felülírhatja ezt a JSON-fájlt, és az idő előrehaladtával lecserélheti a szabálykonfigurációt anélkül, hogy leállítaná vagy elindítaná a streamelési feladatot.

  • A példaszabály egy állítható riasztás megjelenítésére szolgál, ha a cpu meghaladja (az átlag nagyobb vagy egyenlő) az érték 90 százalékában. A value mező igény szerint konfigurálható.
  • Figyelje meg, hogy a szabály egy operátormezővel rendelkezik, amelyet a lekérdezés szintaxisa később AVGGREATEROREQUALdinamikusan értelmez.
  • A szabály egy adott dimenziókulcson 2 szűri az adatokat a értékkel C1. Más mezők üres sztringek, amelyek azt jelzik, hogy a bemeneti streamet nem szűrik ezek az eseménymezők. További CPU-szabályokat is beállíthat, hogy szükség szerint szűrjön más egyező mezőket.
  • Nem minden oszlopnak kell szerepelnie a kimeneti riasztási eseményben. Ebben az esetben a kulcsszám 2 be van kapcsolvaTRUE, includedDim hogy a stream eseményadatainak 2. mezője szerepeljen a jogosult kimeneti eseményekben. A többi mező nem szerepel a riasztás kimenetében, de a mezőlista módosítható.
{
    "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": ""
    }    
}

Példa streamelési lekérdezésre

Ez a példa Stream Analytics-lekérdezés összekapcsolja a fenti példában szereplő szabályok referenciaadatait egy metrikák nevű bemeneti adatfolyamkal.

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

Példa streamelési bemeneti eseményadatokra

Ez a példa JSON-adatok a fenti streamelési lekérdezésben használt metrikák bemeneti adatait képviselik.

  • Három példaesemény jelenik meg az 1 perces időtartományban( érték T14:50).
  • Mindháromnak ugyanaz deviceId az értéke 978648.
  • A CPU-metrikák értékei az egyes eseményekben 9895,, 80 illetve különbözőek lehetnek. Csak az első két példaesemény lépi túl a szabályban létrehozott CPU-riasztási szabályt.
  • A riasztási szabály includeDim mezője a 2-es kulcsszám volt. A példaesemények megfelelő 2. kulcsmezőjének neve NodeName. A három példaesemény értéke N024, N024és N014 . A kimenetben csak a csomópont N024 jelenik meg, mivel ez az egyetlen adat, amely megfelel a magas processzorhasználat riasztási feltételeinek. N014 nem éri el a magas CPU-küszöbértéket.
  • A riasztási szabály csak a filter 2-es kulcsszámmal van konfigurálva, amely megfelel a cluster mintaesemények mezőjének. A három példaesemény mindegyike rendelkezik értékkel C1 , és megfelel a szűrési feltételeknek.
{
    "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
    }
}

Példakimenet

Ez a példa kimeneti JSON-adatok azt mutatják, hogy egyetlen riasztási esemény jött létre a referenciaadatokban meghatározott CPU-küszöbérték-szabály alapján. A kimeneti esemény tartalmazza a riasztás nevét, valamint a figyelembe vett mezők összesített (átlag, perc, max) értékét. A kimeneti esemény adatai tartalmazzák a szabálykonfiguráció miatt a 2 NodeName . mezőkulcs értékét N024 . (A JSON-t úgy módosították, hogy az olvashatóság érdekében sortöréseket jelenítsen meg.)

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