共用方式為


Pattern 陳述式

適用於:✅Microsoft網狀架構Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel

模式是將字串元組對應至表格式表達式的建構。 每個模式都必須 宣告 模式名稱,並選擇性地 定義 模式對應。 定義對應的模式會在叫用時傳回表格式表達式。 任何兩個語句都必須以分號分隔。

空白模式 是宣告但未定義對應的模式。 叫用時,它們會傳回錯誤 SEM0036 ,以及 HTTP 標頭中遺漏模式定義的詳細數據。 提供 Kusto 查詢語言 (KQL) 體驗的仲介層應用程式可以使用傳回的詳細數據作為其程式的一部分,以擴充 KQL 查詢結果。 如需詳細資訊,請參閱 使用中介層應用程式

語法

  • 宣告空白模式:

    declarepattern PatternName ;

  • 宣告並定義模式:

    declarepattern PatternName ArgName( = : ArgType [, ... ]) [[ PathName : PathArgType ] ]

    {

          ( ArgValue1_1 [ , ArgValue2_1, ... ] ) [ .[ PathValue_1 ] ] { = expression1 } ;

        [ ArgValue1_2 [ (, ArgValue2_2, ... ] )[ .[ PathValue_2 ] ] { = expression2 } ; ... ]

    } ;

  • 叫用模式:

    • PatternName ( ArgValue1 [, ArgValue2 ...] ).PathValue
    • PatternName ( ArgValue1 [, ArgValue2 ...] ).["PathValue"]

深入瞭解 語法慣例

參數

姓名 類型​​ 必要 描述
PatternName string ✔️ 模式的名稱。
ArgName string ✔️ 引數的名稱。 模式可以有一或多個自變數。
ArgType string ✔️ ArgName 自變數的純量數據類型。 可能的值: string
PathName string path 自變數的名稱。 模式不能有路徑或一個路徑。
PathArgType string PathArgType 自變數的類型。 可能的值: string
ArgValue string ✔️ 對應至表達式的 ArgName 和選擇性 PathName Tuple 值。
PathValue string 要對應 PathName的值。
expression string ✔️ 參考傳回表格式數據的函式的表格式或 Lambda 表達式。 例如:Logs | where Timestamp > ago(1h)

範例

在下列每個範例中,會宣告、定義並叫用模式。

定義簡單模式

下列範例會定義模式,此模式會將狀態對應至傳回其首都/主要城市的表達式。

declare pattern country = (name:string)[state:string]
{
  ("USA").["New York"] = { print Capital = "Albany" };
  ("USA").["Washington"] = { print Capital = "Olympia" };
  ("Canada").["Alberta"] = { print Capital = "Edmonton" };
};
country("Canada").Alberta

輸出

大寫
埃德蒙頓

下列範例會定義定義一些範圍應用程式數據的模式。

declare pattern App = (applicationId:string)[scope:string]  
{
    ('a1').['Data']    = { range x from 1 to 5 step 1 | project App = "App #1", Data    = x };
    ('a1').['Metrics'] = { range x from 1 to 5 step 1 | project App = "App #1", Metrics = rand() };
    ('a2').['Data']    = { range x from 1 to 5 step 1 | project App = "App #2", Data    = 10 - x };
    ('a3').['Metrics'] = { range x from 1 to 5 step 1 | project App = "App #3", Metrics = rand() };
};
union App('a2').Data, App('a1').Metrics

輸出

App 資料 計量
應用程式 #2 9
應用程式 #2 8
應用程式 #2 7
應用程式 #2 6
應用程式 #2 5
應用程式 #1 0.53674122855537532
應用程式 #1 0.78304713305654439
應用程式 #1 0.20168860732346555
應用程式 #1 0.13249123867679469
應用程式 #1 0.19388305330563443

正規化

叫用模式有語法變化。 例如,下列聯集會傳回單一模式表達式,因為所有調用都是相同的模式。

declare pattern app = (applicationId:string)[eventType:string]
{
    ("ApplicationX").["StopEvents"] = { database("AppX").Events | where EventType == "StopEvent" };
    ("ApplicationX").["StartEvents"] = { database("AppX").Events | where EventType == "StartEvent" };
};
union
  app("ApplicationX").StartEvents,
  app('ApplicationX').StartEvents,
  app("ApplicationX").['StartEvents'],
  app("ApplicationX").["StartEvents"]

沒有通配符

在模式中對通配符沒有特殊待遇。 例如,下列查詢會傳回單一遺漏的模式調用。

declare pattern app = (applicationId:string)[eventType:string]
{
    ("ApplicationX").["StopEvents"] = { database("AppX").Events | where EventType == "StopEvent" };
    ("ApplicationX").["StartEvents"] = { database("AppX").Events | where EventType == "StartEvent" };
};
union app("ApplicationX").["*"]
| count

傳回語意錯誤

未宣告一或多個模式參考。 偵測到的模式參考:[“app('ApplicationX')。['*']"]

使用中介層應用程式

仲介層應用程式可讓使用者使用 KQL,並想要透過從其內部服務擴充查詢結果,來增強體驗。

為此,應用程式會為使用者提供模式語句,以傳回其使用者可在查詢中使用的表格式數據。 模式的自變數是應用程式用來擷取擴充數據的索引鍵。 當使用者執行查詢時,應用程式不會剖析查詢本身,而是計劃利用空模式傳回的錯誤來擷取所需的密鑰。 因此,它會在查詢前面加上空模式宣告、將它傳送至叢集進行處理,然後剖析傳回的 HTTP 標頭以擷取遺漏模式自變數的值。 應用程式會使用這些值來查閱擴充數據,並建置新的宣告來定義適當的擴充數據對應。 最後,應用程式會在用戶查詢前面加上新的定義、重新傳送以供處理,並將它收到的結果傳回給使用者。

範例

在下列範例中,中介層應用程式可讓您擴充具有經度/緯度位置的查詢。 應用程式會使用內部服務,將IP位址對應至經度/緯度位置,並提供為此用途所呼叫 map_ip_to_longlat 的模式。 假設應用程式會從使用者取得下列查詢:

map_ip_to_longlat("10.10.10.10")

應用程式不會剖析此查詢,因此不知道哪個IP位址 (10.10.10.10.10) 傳遞至模式。 因此,它會在用戶查詢前面加上空白 map_ip_to_longlat 模式宣告,並傳送它進行處理:

declare pattern map_ip_to_longlat;
map_ip_to_longlat("10.10.10.10")

應用程式會收到下列回應錯誤。

未宣告一或多個模式參考。 偵測到的模式參考:[“map_ip_to_longlat('10.10.10.10')]]

應用程式會檢查錯誤、判斷錯誤指出遺漏的模式參考,並擷取遺漏的IP位址(10.10.10.10.10)。 它會使用IP位址來查閱其內部服務中的擴充數據,並建置新的模式,以定義IP位址對應至對應的經度和緯度數據。 新的模式會預先加上使用者的查詢,然後再次執行。 這次查詢會成功,因為擴充數據現在在查詢中宣告,而且結果會傳送給使用者。

declare pattern map_ip_to_longlat = (address:string)
{
  ("10.10.10.10") = { print Lat=37.405992, Long=-122.078515 };
};
map_ip_to_longlat("10.10.10.10")

輸出

Lat Long
37.405992 -122.078515