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.
Önerilen tasarım deseni
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. Alanvalue
gerektiğinde yapılandırılabilir. - Kuralın, üzerinde daha sonra
AVGGREATEROREQUAL
yer 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ğeriyleC1
filtreler. 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ırTRUE
. 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ğere978648
sahiptir. - CPU ölçüm değerleri sırasıyla , her olayda
98
95
80
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 ,N024
veN014
değerlerineN024
sahiptir. Çı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ı anahtarlafilter
yapılandırılır. Üç örnek olayın tümü değereC1
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}