Описание шаблона

Переключайте службы с помощью раскрывающегося списка Версия. Дополнительные сведения о навигации.
Область применения: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

Шаблон — это конструкция, которая сопоставляет кортежи строк с табличными выражениями.

Каждый шаблон должен объявлять имя шаблона и при необходимости определять сопоставление шаблонов. Шаблоны, определяющие сопоставление, возвращают табличное выражение при вызове. Разделите все два оператора точкой с запятой.

Пустые шаблоны — это шаблоны, объявленные, но не определяющие сопоставление. При вызове они возвращают ошибку SEM0036 вместе с сведениями о отсутствующих определениях шаблонов в заголовке HTTP.

Приложения среднего уровня, предоставляющие интерфейс языка запросов Kusto (KQL), могут использовать возвращаемые сведения в рамках процесса для обогащения результатов запроса KQL. Дополнительные сведения см. в разделе Работа с приложениями среднего уровня.

Syntax

  • Объявите пустой шаблон:

    declare pattern Имя шаблона;

  • Объявите и определите шаблон:

    declare pattern = ( ArgName:ArgType [, ... ]) [[PathName:PathArgType]]

    {

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

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

    } ;

  • Вызов шаблона:

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

Дополнительные сведения о соглашениях синтаксиса.

Parameters

Name Type Required Description
PatternName string ✔️ Имя шаблона.
ArgName string ✔️ Имя аргумента. У шаблонов может быть один или несколько аргументов.
ArgType string ✔️ Скалярный тип данных аргумента ArgName . Возможные значения: string
PathName string Имя аргумента пути. Шаблоны не могут иметь пути или один путь.
PathArgType string Тип аргумента PathArgType . Возможные значения: string
ArgValue string ✔️ Значения кортежей ArgName и необязательные значения pathName , которые необходимо сопоставить с выражением.
PathValue string Значение для сопоставления с PathName.
expression string ✔️ Табличное или лямбда-выражение, которое ссылается на функцию, возвращающую табличные данные. Например, Logs | where Timestamp > ago(1h)

Examples

В примерах этого раздела показано, как использовать синтаксис для начала работы.

Примеры, приведенные в этой статье, используют общедоступные таблицы в кластере справки, например StormEvents таблицу в базе данных Samples .

В примерах этой статьи используются общедоступные таблицы, такие как Weather таблица в коллекции примеров Weather Analytics. Возможно, потребуется изменить имя таблицы в примере запроса, чтобы она соответствовала таблице в рабочей области.

Определение простого шаблона

В этом примере определяется шаблон, который сопоставляет состояния с выражением, возвращающим столицу или крупный город.

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

Output

Capital
Edmonton

Определение шаблона с областью действия

В этом примере определяется шаблон для области данных и метрик приложения. Шаблон вызывается для возврата объединения данных.

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

Output

App Data Metrics
Приложение #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

Normalization

Существуют варианты синтаксиса для вызова шаблонов. Например, следующий союз возвращает одно выражение шаблона, так как все вызовы имеют одинаковый шаблон.

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, чтобы получить значения отсутствующих аргументов шаблона. Приложение использует эти значения для поиска данных обогащения и создания нового объявления, определяющего соответствующее сопоставление данных обогащения.

Наконец, приложение предопределяет новое определение запроса, повторно отправляет его для обработки и возвращает результат, полученный пользователю.

Example

В примерах шаблон объявляется, определяется и вызывается.

Объявление пустого шаблона

В этом примере приложение среднего уровня расширяет запросы с расположениями долготы и широты. Приложение использует внутреннюю службу для сопоставления IP-адресов с расположениями долготы и широты и предоставляет шаблон, называемый map_ip_to_longlat. При выполнении запроса возвращается ошибка с отсутствующими определениями шаблонов:

map_ip_to_longlat("10.10.10.10")

Объявление и определение шаблона

Приложение не анализирует этот запрос и поэтому не знает, какой IP-адрес (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). Он использует 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")

Output

Lat Long
37.405992 -122.078515