معالجة القواعد المستندة إلى الحد القابلة للتكوين في Azure Stream Analytics

توضح هذه المقالة كيفية استخدام البيانات المرجعية لتحقيق حل تنبيهي يستخدم قواعد مستندة إلى الحد قابلة للتكوين في Azure Stream Analytics.

السيناريو: التنبيه على أساس حدود القاعدة القابلة للتعديل

قد تحتاج إلى إنتاج تنبيه كناتج عندما تصل الأحداث المتدفقة الواردة إلى قيمة معينة، أو عندما تتجاوز القيمة المجمعة استناداً إلى الأحداث المتدفقة الواردة حداً معيناً. من السهل إعداد استعلام Stream Analytics الذي يقارن القيمة بحد ثابت ومحدد مسبقاً. يمكن استخدام تعليمات برمجية مضمّنة لحد ثابت في صيغة الاستعلام المتدفقة باستخدام مقارنات عددية بسيطة (أكبر من، وأقل من، ومساواة).

في بعض الحالات، يجب أن تكون قيم الحد قابلة للتكوين بسهولة أكبر دون تحرير صيغة الاستعلام في كل مرة تتغير فيها قيمة الحد. في حالات أخرى، قد تحتاج إلى العديد من الأجهزة أو المستخدمين الذين تتم معالجتهم بواسطة نفس الاستعلام مع وجود قيم حد مختلفة لكل منهم على كل نوع من الأجهزة.

يمكن استخدام هذا النمط لتكوين الحدود ديناميكياً، واختيار نوع الجهاز الذي يتم تطبيقه بشكل انتقائي عن طريق تصفية بيانات الإدخال، واختيار الحقول المراد تضمينها في الإخراج بشكل انتقائي.

استخدم إدخال بيانات مرجعية إلى وظيفة Stream Analytics كبحث عن حدود التنبيه:

  • قم بتخزين قيم الحد في البيانات المرجعية، قيمة واحدة لكل مفتاح.
  • انضم إلى أحداث إدخال البيانات المتدفقة إلى البيانات المرجعية في عمود المفتاح.
  • استخدم القيمة المحددة من البيانات المرجعية كقيمة الحد.

مثال على البيانات والاستعلام

في المثال، يتم إنشاء التنبيهات عندما يتطابق تجميع البيانات المتدفقة من الأجهزة في نافذة مدتها دقيقة مع القيم المنصوص عليها في القاعدة المقدمة كبيانات مرجعية.

في الاستعلام، لكل deviceId، ولكل metricName ضمن deviceId، يمكنك تكوين من 0 إلى 5 أبعاد إلى GROUP BY. يتم تجميع الأحداث التي تحتوي على قيم التصفية المقابلة فقط. بمجرد تجميعها، يتم حساب مجاميع الإطارات الخاصة بالحد الأدنى، والحد الأقصى، والمتوسط، عبر نافذة هبوط مدتها 60 ثانية. يتم بعد ذلك حساب عوامل التصفية على القيم المجمعة وفقاً للحد المكونة في المرجع، لإنشاء حدث إخراج التنبيه.

على سبيل المثال، افترض أن هناك وظيفة Stream Analytics لها إدخال بيانات مرجعي يسمى القواعدوتدفق إدخال البيانات المسمى القياسات.

البيانات المرجعيّة

يوضح هذا المثال للبيانات المرجعية كيف يمكن تمثيل القاعدة المستندة إلى الحد. يحتفظ ملف JSON بالبيانات المرجعية ويتم حفظه في موقع تخزين Azure Blob، ويتم استخدام حاوية تخزين البيانات الثنائية الكبيرة هذه كمدخل بيانات مرجعي يُسمى القواعد. يمكنك الكتابة فوق ملف JSON واستبدال تكوين القاعدة مع مرور الوقت، دون التوقف أو بدء وظيفة البث.

  • يتم استخدام قاعدة المثال لتمثيل تنبيه قابل للتعديل عند تجاوز CPU (المتوسط ​​أكبر من أو يساوي) القيمة 90 بالمائة. الحقل value قابل للتكوين حسب الحاجة.
  • لاحظ أن القاعدة بها حقل عامل تشغيل، والذي يتم تفسيره ديناميكياً في بناء جملة الاستعلام لاحقاً في AVGGREATEROREQUAL.
  • تقوم القاعدة بتصفية البيانات على مفتاح مكون معين 2 بقيمة C1. الحقول الأخرى عبارة عن سلسلة فارغة، تشير إلى عدم تصفية تدفق الإدخال بواسطة حقول الحدث هذه. يمكنك إعداد قواعد إضافية لوحدة المعالجة المركزية لتصفية الحقول المطابقة الأخرى حسب الحاجة.
  • لا يتم تضمين جميع الأعمدة في حدث تنبيه الإخراج. في هذه الحالة، يتم تشغيل includedDim رقم المفتاح 2TRUE لتمثيل أن الحقل رقم 2 لبيانات الحدث في الدفق سيتم تضمينه في أحداث الإخراج المؤهلة. لا يتم تضمين الحقول الأخرى في إخراج التنبيه، ولكن يمكن تعديل قائمة الحقول.
{
    "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": ""
    }    
}

مثال على دفق الاستعلام

يدمج طلب بحث Stream Analytics هذا في نموذج القواعد البيانات المرجعية من المثال أعلاه، إلى تدفق إدخال للبيانات يُسمى القياسات.

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

مثال تدفق بيانات حدث الإدخال

تمثل بيانات JSON النموذجية هذه بيانات إدخال القياسات المستخدمة في استعلام التدفق أعلاه.

  • تم إدراج ثلاثة أمثلة على الأحداث ضمن النطاق الزمني لمدة دقيقة واحدة، القيمة T14:50.
  • الثلاثة جميعها لها نفس deviceId القيمة 978648.
  • تختلف قيم قياس وحدة المعالجة المركزية في كل حدث، 98، 95، 80 على التوالي. أول مثالين فقط يتجاوزان قاعدة تنبيه وحدة المعالجة المركزية المحددة في القاعدة.
  • كان حقل includeDim في قاعدة التنبيه هو المفتاح رقم 2. يسمى حقل المفتاح 2 المقابل في أمثلة الأحداث باسم NodeName. الأحداث الثلاثة النموذجية لها قيم N024 وN024N014 على التوالي. في الإخراج، ترى العقدة فقط N024 حيث إن هذه هي البيانات الوحيدة التي تطابق معايير التنبيه لوحدة المعالجة المركزية العالية. N014 لا يفي بالحد الأعلى لوحدة المعالجة المركزية.
  • يتم تكوين قاعدة التنبيه باستخدام filter فقط على المفتاح رقم 2، والذي يتوافق مع الحقل cluster في نماذج الأحداث. جميع الأحداث النموذجية الثلاثة لها قيمة C1 وتتطابق مع معايير التصفية.
{
    "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
    }
}

مثال على الإخراج

يُظهر هذا المثال الناتج عن بيانات JSON أن حدث تنبيه واحد قد تم إنشاؤه بناءً على قاعدة حد وحدة المعالجة المركزية المحددة في البيانات المرجعية. يحتوي حدث الإخراج على اسم التنبيه بالإضافة إلى التجميع (المتوسط، الأدنى، الأقصى) للحقول التي تم النظر فيها. تتضمن بيانات حدث الإخراج رقم مفتاح الحقل 2 NodeName القيمة N024 بسبب تكوين القاعدة. (تم تعديل JSON لإظهار فواصل الأسطر لسهولة القراءة.)

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