Memproses aturan berbasis ambang batas yang dapat dikonfigurasi di Azure Stream Analytics
Artikel ini menjelaskan cara menggunakan data referensi untuk mencapai solusi pemberitahuan yang menggunakan aturan berbasis ambang batas yang dapat dikonfigurasi di Azure Stream Analytics.
Skenario: Pemberitahuan berdasarkan ambang batas aturan yang dapat disesuaikan
Anda mungkin perlu membuat pemberitahuan sebagai output saat peristiwa streaming masuk telah mencapai nilai tertentu, atau ketika nilai agregat berdasarkan peristiwa streaming masuk melebihi ambang batas tertentu. Sangat mudah untuk menyiapkan kueri Azure Stream Analytics yang membandingkan nilai dengan ambang batas statik yang diperbaiki dan telah ditentukan. Ambang batas tetap dapat dikodekan dengan keras ke dalam sintaks kueri streaming menggunakan perbandingan numerik sederhana (lebih besar dari, kurang dari, dan kesetaraan).
Dalam beberapa kasus, nilai ambang batas harus lebih mudah dikonfigurasi tanpa mengedit sintaks kueri setiap kali nilai ambang batas berubah. Dalam kasus lain, Anda mungkin memerlukan banyak perangkat atau pengguna yang diproses oleh kueri yang sama dengan masing-masing dari mereka memiliki nilai ambang batas yang berbeda pada setiap jenis perangkat.
Pola ini dapat digunakan untuk mengonfigurasi ambang batas secara dinamis, secara selektif memilih jenis perangkat mana yang diterapkan ambang batas dengan memfilter data input, dan secara selektif memilih bidang mana yang akan dimasukkan dalam output.
Pola desain yang direkomendasikan
Gunakan input data referensi ke tugas Azure Stream Analytics sebagai pencarian ambang batas pemberitahuan:
- Simpan nilai ambang batas dalam data referensi, satu nilai per kunci.
- Bergabunglah dengan peristiwa input data streaming ke data referensi pada kolom kunci.
- Gunakan nilai kunci dari data referensi sebagai nilai ambang batas.
Contoh data dan kueri
Dalam contoh, pemberitahuan dihasilkan ketika agregat streaming data dari perangkat dalam jendela selama satu menit cocok dengan nilai yang ditetapkan dalam aturan yang disediakan sebagai data referensi.
Dalam kueri, untuk setiap deviceId, dan setiap metrikName di bawah deviceId, Anda dapat mengonfigurasi dari 0 hingga 5 dimensi ke GROUP BY. Hanya kejadian yang memiliki nilai filter terkait yang dikelompokkan. Setelah dikelompokkan, agregat jendela Min, Max, Avg, dihitung lebih dari 60 detik jendela jatuh. Filter pada nilai agregat kemudian dihitung sesuai ambang batas yang dikonfigurasi dalam referensi, untuk menghasilkan peristiwa output pemberitahuan.
Sebagai contoh, asumsikan ada pekerjaan Azure Stream Analytics yang memiliki input data referensi aturan, bernama, dan streaming data input metrik bernama.
Data referensi
Contoh data referensi ini memperlihatkan bagaimana aturan berbasis ambang batas dapat diwakili. File JSON menyimpan data referensi dan disimpan ke penyimpanan blob Azure, dan kontainer penyimpanan blob itu digunakan sebagai input data referensi yang bernama aturan. Anda dapat menimpa file JSON ini dan mengganti konfigurasi aturan seiring berjalannya waktu, tanpa menghentikan atau memulai pekerjaan streaming.
- Contoh aturan digunakan untuk mewakili pemberitahuan yang dapat disesuaikan ketika CPU melebihi (rata-rata lebih besar dari atau sama dengan) persen
90
nilai.value
Bidang ini dapat dikonfigurasi sesuai kebutuhan. - Perhatikan aturan memiliki bidang operator, yang ditafsirkan secara dinamis dalam sintaks kueri di kemudian hari
AVGGREATEROREQUAL
. - Aturan memfilter data pada kunci dimensi tertentu
2
dengan nilaiC1
. Bidang lain adalah karakter kosong, menunjukkan untuk tidak memfilter stream input oleh bidang peristiwa tersebut. Anda bisa menyetel aturan CPU tambahan untuk memfilter bidang pencocokan lainnya sesuai kebutuhan. - Tidak semua kolom akan disertakan dalam peristiwa pemberitahuan output. Dalam hal ini,
includedDim
nomor kunci2
diaktifkan untuk mewakili bidang nomorTRUE
2 data peristiwa dalam stream akan disertakan dalam peristiwa output yang memenuhi syarat. Bidang lainnya tidak disertakan dalam output pemberitahuan, tetapi daftar bidang dapat disesuaikan.
{
"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": ""
}
}
Contoh kueri streaming
Contoh kueri Azure Stream Analytics ini menggabungkan data referensi aturan dari contoh di atas, ke aliran input metrik data bernama.
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)
)
Contoh input data peristiwa streaming
Contoh data JSON ini menunjukkan metrik input data yang digunakan dalam kueri streaming di atas.
- Tiga contoh peristiwa dicantumkan dalam jangka waktu 1 menit, nilai
T14:50
. - Ketiganya memiliki
deviceId
nilai978648
yang sama. - Nilai metrik CPU bervariasi di setiap peristiwa,
98
,95
,80
masing-masing. Hanya dua peristiwa contoh pertama yang melebihi aturan pemberitahuan CPU yang ditetapkan dalam aturan. - Bidang includeDim dalam aturan pemberitahuan adalah kunci nomor 2. Bidang kunci 2 yang sesuai dalam contoh peristiwa diberi nama
NodeName
. Tiga contoh peristiwa memiliki nilaiN024
,N024
, danN014
masing-masing. Dalam output, Anda hanya melihat simpulN024
karena ini adalah satu-satunya data yang cocok dengan kriteria pemberitahuan untuk CPU tinggi.N014
tidak memenuhi ambang CPU yang tinggi. - Aturan pemberitahuan dikonfigurasi dengan hanya
filter
pada nomor kunci 2, yang sesuai dengancluster
bidang dalam contoh kejadian. Tiga contoh peristiwa semuanya memiliki nilaiC1
dan cocok dengan kriteria filter.
{
"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
}
}
Contoh output
Contoh output data JSON ini menunjukkan satu peristiwa pemberitahuan diproduksi berdasarkan aturan ambang batas CPU yang ditentukan dalam data referensi. Peristiwa output berisi nama pemberitahuan serta bidang agregat (rata-rata, min, maks) dari bidang yang dipertimbangkan. Data peristiwa output mencakup NodeName
nilai N024
nomor kunci bidang 2 karena konfigurasi aturan. (JSON diubah untuk menunjukkan jeda baris untuk keterbacaan.)
{"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}