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.

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. valueBidang 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 nilai C1. 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 kunci 2 diaktifkan untuk mewakili bidang nomor TRUE 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 nilai 978648 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 nilai N024, N024, dan N014 masing-masing. Dalam output, Anda hanya melihat simpul N024 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 dengan cluster bidang dalam contoh kejadian. Tiga contoh peristiwa semuanya memiliki nilai C1 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}