Azure Stream Analytics'te yapılandırılabilir eşik tabanlı kuralları işleme

Bu makalede, Azure Stream Analytics'te yapılandırılabilir eşik tabanlı kurallar kullanan bir uyarı çözümü elde etmek için başvuru verilerinin nasıl kullanılacağı açıklanır.

Senaryo: Ayarlanabilir kural eşiklerine göre uyarı verme

Gelen akışlı olaylar belirli bir değere ulaştığında veya gelen akış olaylarını temel alan toplu bir değer belirli bir eşiği aştığında çıkış olarak bir uyarı oluşturmanız gerekebilir. Değeri sabit ve önceden belirlenmiş bir statik eşikle karşılaştıran bir Stream Analytics sorgusu ayarlamak kolaydır. Sabit eşik, basit sayısal karşılaştırmalar (büyüktür, küçüktür ve eşitlik) kullanılarak akış sorgusu söz dizimine sabit kodlanabilir.

Bazı durumlarda eşik değerlerinin, eşik değeri her değiştiğinde sorgu söz dizimini düzenlemeden daha kolay yapılandırılabilir olması gerekir. Diğer durumlarda, aynı sorgu tarafından işlenen çok sayıda cihaza veya kullanıcıya ihtiyacınız olabilir ve her biri her cihazda farklı eşik değerlerine sahip olabilir.

Bu desen, eşikleri dinamik olarak yapılandırmak, giriş verilerini filtreleyerek eşiğin hangi cihaz türünü uygulayacağı seçmeli olarak seçmek ve çıkışa eklenecek alanları seçmeli olarak seçmek için kullanılabilir.

Uyarı eşiklerinin araması olarak Stream Analytics işine başvuru verisi girişi kullanın:

  • Eşik değerlerini, anahtar başına bir değer olacak şekilde başvuru verilerinde depolayın.
  • Akış verisi giriş olaylarını anahtar sütunundaki başvuru verilerine birleştirin.
  • Eşik değeri olarak başvuru verilerinden anahtarlanan değeri kullanın.

Örnek veriler ve sorgu

Örnekte, dakikalar süren bir süre içinde cihazlardan gelen veri akışının toplamı, başvuru verileri olarak sağlanan kuraldaki belirtilen değerlerle eşleştiğinde uyarılar oluşturulur.

Sorguda, her deviceId için ve deviceId altındaki her metricName için 0 ile 5 boyut arasında group by olarak yapılandırabilirsiniz. Yalnızca karşılık gelen filtre değerlerine sahip olaylar gruplandırılır. Gruplandırıldıktan sonra, pencerelenmiş Min, Max, Avg toplamları 60 saniyelik atlayan bir pencere üzerinden hesaplanır. Toplanan değerlerdeki filtreler daha sonra uyarı çıkış olayını oluşturmak için başvuruda yapılandırılan eşiğe göre hesaplanır.

Örneğin , rules adlı bir başvuru veri girişi ve ölçümler adlı akış verisi girişi olan bir Stream Analytics işi olduğunu varsayalım.

Başvuru verileri

Bu örnek başvuru verileri, eşik tabanlı bir kuralın nasıl temsil edilebileceğini gösterir. JSON dosyası başvuru verilerini barındırır ve Azure blob depolama alanına kaydedilir ve bu blob depolama kapsayıcısı rules adlı bir başvuru veri girişi olarak kullanılır. Akış işini durdurmadan veya başlatmadan, zaman geçtikçe bu JSON dosyasının üzerine yazabilir ve kural yapılandırmasını değiştirebilirsiniz.

  • Örnek kural, CPU değer 90 yüzdesini aştığında ayarlanabilir bir uyarıyı (ortalama değer yüzdesinden büyük veya buna eşit) göstermek için kullanılır. Alan value gerektiğinde yapılandırılabilir.
  • Kuralın, üzerinde daha sonra AVGGREATEROREQUALyer alan sorgu söz diziminde dinamik olarak yorumlanan bir işleç alanına sahip olduğuna dikkat edin.
  • Kural, belirli bir boyut anahtarındaki 2 verileri değeriyle C1filtreler. Diğer alanlar boş dizedir ve giriş akışının bu olay alanlarına göre filtrelenmediğini gösterir. Diğer eşleşen alanları gerektiği gibi filtrelemek için ek CPU kuralları ayarlayabilirsiniz.
  • Çıkış uyarısı olayına tüm sütunlar dahil edilmeyecek. Bu durumda, includedDim akıştaki olay verilerinin 2 numaralı alanının uygun çıkış olaylarına dahil olacağını göstermek için anahtar numarası 2 açılır TRUE . Diğer alanlar uyarı çıkışına dahil değildir, ancak alan listesi ayarlanabilir.
{
    "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": ""
    }    
}

Örnek akış sorgusu

Bu örnek Stream Analytics sorgusu, yukarıdaki örnekte yer alan kural başvuru verilerini metrics adlı bir veri giriş akışına ekler.

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

Giriş olayı verilerini akışa alma örneği

Bu örnek JSON verileri, yukarıdaki akış sorgusunda kullanılan ölçüm giriş verilerini temsil eder.

  • Üç örnek olay 1 dakikalık zaman aralığı ( değeri T14:50) içinde listelenir.
  • Üçü de aynı deviceId değere 978648sahiptir.
  • CPU ölçüm değerleri sırasıyla , her olayda 989580 farklılık gösterir. Yalnızca ilk iki örnek olay, kuralda oluşturulan CPU uyarı kuralını aşıyor.
  • Uyarı kuralındaki includeDim alanı 2 numaralı anahtardı. Örnek olaylarda karşılık gelen anahtar 2 alanı olarak adlandırılır NodeName. Üç örnek olay sırasıyla , N024ve N014 değerlerine N024sahiptir. Çıktıda, yalnızca yüksek CPU için uyarı ölçütlerine uyan tek veri olan düğümü N024 görürsünüz. N014 yüksek CPU eşiğini karşılamıyor.
  • Uyarı kuralı, örnek olaylardaki alana karşılık gelen cluster yalnızca 2 numaralı anahtarla filter yapılandırılır. Üç örnek olayın tümü değere C1 sahiptir ve filtre ölçütleri ile eşleşmektedir.
{
    "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
    }
}

Örnek çıkış

Bu örnek çıktı JSON verileri, başvuru verilerinde tanımlanan CPU eşik kuralına göre tek bir uyarı olayının üretildiğini gösterir. Çıkış olayı, uyarının adını ve dikkate alınan alanların toplamını (ortalama, min, maksimum) içerir. Çıkış olay verileri, kural yapılandırmasından dolayı 2 NodeName numaralı alan anahtarı değerini N024 içerir. (JSON, okunabilirlik için satır sonlarını gösterecek şekilde değiştirildi.)

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