Оператор Pattern
Применимо: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Шаблон — это конструкция, которая сопоставляет кортежи строк с табличными выражениями.
Каждый шаблон должен объявить имя шаблона и при необходимости определить сопоставление шаблонов. Шаблоны, определяющие сопоставление, возвращают табличное выражение при вызове. Разделите все два оператора точкой с запятой.
Пустые шаблоны — это шаблоны, объявленные, но не определяющие сопоставление. При вызове они возвращают ошибку SEM0036 вместе с сведениями о отсутствующих определениях шаблонов в заголовке HTTP.
Приложения среднего уровня, предоставляющие интерфейс языка запросов Kusto (KQL), могут использовать возвращаемые сведения в рамках процесса для обогащения результатов запроса KQL. Дополнительные сведения см. в разделе Работа с приложениями среднего уровня.
Синтаксис
Объявите пустой шаблон:
declare
pattern
PatternName;
Объявите и определите шаблон:
declare
pattern
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
Дополнительные сведения о соглашениях синтаксиса.
Параметры
Имя | Тип | Обязательно | Описание |
---|---|---|---|
PatternName | string |
✔️ | Имя шаблона. |
ArgName | string |
✔️ | Имя аргумента. У шаблонов может быть один или несколько аргументов. |
ArgType | string |
✔️ | Скалярный тип данных аргумента ArgName. Возможные значения: string |
PathName | string |
Имя аргумента пути. Шаблоны не могут иметь пути или один путь. | |
PathArgType | string |
Тип аргумента PathArgType. Возможные значения: string |
|
ArgValue | string |
✔️ | |
PathValue | string |
Значение для сопоставления PathName. | |
выражения |
string |
✔️ | Табличное или лямбда-выражение, которое ссылается на функцию, возвращающую табличные данные. Например, Logs | where Timestamp > ago(1h) |
Примеры
В примерах этого раздела показано, как использовать синтаксис для начала работы.
Примеры, приведенные в этой статье, используют общедоступные таблицы в кластера, например таблицу
StormEvents
в базе данных Samples.
В примерах этой статьи используются общедоступные таблицы, такие как таблица
StormEvents
в аналитике погоды примеры данных.
Определение простого шаблона
В этом примере определяется шаблон, который сопоставляет состояния с выражением, возвращающим столицу или крупный город.
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
выходных
Приложение | Данные | Метрика |
---|---|---|
Приложение #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")
выходных
Лат | Long |
---|---|
37.405992 | -122.078515 |