<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2</id>
	<title>Примеры логов - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2&amp;action=history"/>
	<updated>2026-10-26T19:39:05Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2&amp;diff=7069&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: « = Примеры логов = Управление логами и аналитика позволяют точно определять и извлекать любые данные логов с помощью &#039;&#039;&#039;Языка запросов Ключ-АСТРОМ (DQL)&#039;&#039;&#039;. После ознакомления с &#039;&#039;&#039;основами запросов DQL&#039;&#039;&#039; используйте примеры на этой странице, чтобы начать полу...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2&amp;diff=7069&amp;oldid=prev"/>
		<updated>2026-10-13T23:05:18Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: « = Примеры логов = Управление логами и аналитика позволяют точно определять и извлекать любые данные логов с помощью &amp;#039;&amp;#039;&amp;#039;Языка запросов Ключ-АСТРОМ (DQL)&amp;#039;&amp;#039;&amp;#039;. После ознакомления с &amp;#039;&amp;#039;&amp;#039;основами запросов DQL&amp;#039;&amp;#039;&amp;#039; используйте примеры на этой странице, чтобы начать полу...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
= Примеры логов =&lt;br /&gt;
Управление логами и аналитика позволяют точно определять и извлекать любые данные логов с помощью &amp;#039;&amp;#039;&amp;#039;Языка запросов Ключ-АСТРОМ (DQL)&amp;#039;&amp;#039;&amp;#039;. После ознакомления с &amp;#039;&amp;#039;&amp;#039;основами запросов DQL&amp;#039;&amp;#039;&amp;#039; используйте примеры на этой странице, чтобы начать получать ответы из ваших данных логов.&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Коды состояния и количество ==&lt;br /&gt;
В этом примере вы получаете распределение кодов состояния HTTP и количество ошибок по типам. Прокси-сервер записывает коды состояния HTTP-ответов. Вам нужно увидеть распределение кодов ответов за определённый временной диапазон и сосредоточиться на ошибках.&lt;br /&gt;
&lt;br /&gt;
=== Поиск соответствующих логов ===&lt;br /&gt;
Начните с поиска логов от экземпляра &amp;#039;&amp;#039;&amp;#039;HAProxy&amp;#039;&amp;#039;&amp;#039;. Поскольку строка &amp;lt;code&amp;gt;haproxy&amp;lt;/code&amp;gt; включена в сообщение лога, используйте функцию &amp;lt;code&amp;gt;contains()&amp;lt;/code&amp;gt;.&amp;lt;pre&amp;gt;fetch logs&lt;br /&gt;
| filter contains(content, &amp;quot;haproxy&amp;quot;)&amp;lt;/pre&amp;gt;Поиск строки &amp;lt;code&amp;gt;haproxy&amp;lt;/code&amp;gt; выполняется по всем записям за временной диапазон, поэтому его следует сузить для оптимизации запроса. Если сущность, создающая логи, может быть определена заранее, гораздо эффективнее искать в пределах этой конкретной сущности.&amp;lt;pre&amp;gt;fetch logs&lt;br /&gt;
| filter dt.entity.process_group==&amp;quot;PROCESS_GROUP-123F4A56BCDA0EA9&amp;quot;&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!timestamp&lt;br /&gt;
!content&lt;br /&gt;
!log.source&lt;br /&gt;
!dt.entity.host&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-10 14:05:42 2022-08-10T11:05:42Z&lt;br /&gt;
|localhost haproxy[12529]: 123.45.67.891:23456 http-in~ individual_servers/abcde1 123/0/0/1/456 HTTP_STATUS 200 284 - - –NN 5749/5745/0/1/0…&lt;br /&gt;
|/var/abcde/abc/defrghytji/HOST-1…&lt;br /&gt;
|HOST-AB-12-34567&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-10 14:05:46 2022-08-10T11:05:46Z&lt;br /&gt;
|localhost haproxy[12528]: 12.345.67.123:12345 http-in~ local/local1 5432/0/0/103/1234 HTTP_STATUS 200 138 - - – 7416/7413/407/408/0 0/…&lt;br /&gt;
|/var/abcde/abc/defrghytji/HOST-A2…&lt;br /&gt;
|HOST-CD-76-54321&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-10 14:05:50 2022-08-10T11:05:50Z&lt;br /&gt;
|localhost haproxy[12529]: 11.222.33.123:45678 http-in~ local/local1 19/0/1/110/123 HTTP_STATUS 204 64 - - – 5753/5749/358/359/0 0/0…&lt;br /&gt;
|/var/abcde/abc/defrghytji/HOST-A23…&lt;br /&gt;
|HOST-AR-78-12345&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Извлечение метрики из поля content ===&lt;br /&gt;
Поле &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt; лога содержит нужные коды &amp;lt;code&amp;gt;HTTP_STATUS&amp;lt;/code&amp;gt;. Теперь используйте команду &amp;lt;code&amp;gt;parse&amp;lt;/code&amp;gt;, чтобы создать шаблон &amp;#039;&amp;#039;&amp;#039;Языка шаблонов Ключ-АСТРОМ&amp;#039;&amp;#039;&amp;#039; со следующими элементами:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;LD&amp;lt;/code&amp;gt;: начните с сопоставления любых &amp;#039;&amp;#039;&amp;#039;строчных данных&amp;#039;&amp;#039;&amp;#039; в начале поля.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;#039;HTTP_STATUS &amp;#039;&amp;lt;/code&amp;gt;: &amp;#039;&amp;#039;&amp;#039;литеральное выражение&amp;#039;&amp;#039;&amp;#039;, которое непосредственно предшествует числовому HTTP-статусу и учитывает пробел.&lt;br /&gt;
* &amp;lt;code&amp;gt;INT:httpstatus&amp;lt;/code&amp;gt;: &amp;#039;&amp;#039;&amp;#039;целое число&amp;#039;&amp;#039;&amp;#039;, которое будет выделено в новое поле &amp;lt;code&amp;gt;httpstatus&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;fetch logs&lt;br /&gt;
| filter dt.entity.process_group==&amp;quot;PROCESS_GROUP-123F4A56BCDA0EA9&amp;quot;&lt;br /&gt;
| parse content, &amp;quot;LD &amp;#039;HTTP_STATUS &amp;#039; INT:httpstatus&amp;quot;&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!timestamp&lt;br /&gt;
!content&lt;br /&gt;
!httpstatus&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-10 14:05:42 2022-08-10T11:05:42Z&lt;br /&gt;
|localhost haproxy[12529]: 123.45.67.891:23456 http-in~ individual_servers/abcde1 123/0/0/1/456 HTTP_STATUS 200 284 - - –NN 5749/5745/0/1/ 0…&lt;br /&gt;
|200&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-10 14:05:46 2022-08-10T11:05:46Z&lt;br /&gt;
|localhost haproxy[12528]: 12.345.67.123:12345 http-in~ local/local1 5432/0/0/103/1234 HTTP_STATUS 200 138 - - – 7416/7413/407/408/0 0/…&lt;br /&gt;
|200&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-10 14:05:50 2022-08-10T11:05:50Z&lt;br /&gt;
|localhost haproxy[12529]: 11.222.33.123:45678 http-in~ local/local1 19/0/1/110/123 HTTP_STATUS 204 64 - - – 5753/5749/358/359/0 0/0…&lt;br /&gt;
|204&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Фильтрация диапазона значений ===&lt;br /&gt;
Вы можете выбрать диапазон значений для дальнейшего анализа с помощью &amp;#039;&amp;#039;&amp;#039;DQL&amp;#039;&amp;#039;&amp;#039;. Мы выбираем только коды состояния HTTP, начинающиеся с 400 и выше, так как они включают ошибки на стороне клиента и сервера.&amp;lt;pre&amp;gt;fetch logs&lt;br /&gt;
| filter dt.entity.process_group==&amp;quot;PROCESS_GROUP-802F3A32CECA0EA9&amp;quot;&lt;br /&gt;
| parse content, &amp;quot;LD &amp;#039;HTTP_STATUS &amp;#039; INT:httpstatus&amp;quot;&lt;br /&gt;
| filter httpstatus &amp;gt;= 400&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Агрегация результатов ===&lt;br /&gt;
Вам нужно агрегировать результаты с помощью &amp;lt;code&amp;gt;count()&amp;lt;/code&amp;gt;, чтобы получить сводку о том, сколько раз встречается каждый код состояния.&amp;lt;pre&amp;gt;fetch logs&lt;br /&gt;
| filter dt.entity.process_group==&amp;quot;PROCESS_GROUP-802F3A32CECA0EA9&amp;quot;&lt;br /&gt;
| parse content, &amp;quot;LD &amp;#039;HTTP_STATUS &amp;#039; INT:httpstatus&amp;quot;&lt;br /&gt;
| filter httpstatus &amp;gt;= 400&lt;br /&gt;
| summarize count(), by:{httpstatus}&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!count()&lt;br /&gt;
!httpstatus&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|403&lt;br /&gt;
|-&lt;br /&gt;
|779&lt;br /&gt;
|404&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|500&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|503&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Средний размер корзины ==&lt;br /&gt;
В этом примере вы определите средний размер корзины на основе логов. Ваше приложение записывает контекстные данные, relevant для вашего бизнеса. Вам нужно извлечь эти данные из логов и создать отчёт за определённый временной диапазон.&lt;br /&gt;
&lt;br /&gt;
=== Выбор конкретных данных процесса за определённый временной диапазон ===&lt;br /&gt;
Вам нужно запросить логи за последние три часа (это ваш временной диапазон), а затем указать процесс, который обрабатывает действия с корзиной в вашем магазине, — &amp;lt;code&amp;gt;cartservice cartservice-*&amp;lt;/code&amp;gt;.&amp;lt;pre&amp;gt;fetch logs, from:now()-3h&lt;br /&gt;
| filter dt.process.name==&amp;quot;cartservice cartservice-*&amp;quot;&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!timestamp&lt;br /&gt;
!content&lt;br /&gt;
!log.source&lt;br /&gt;
!dt.process.name&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:29:57&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:29:57.6864969Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;Slow GetCartAsync request detected for userId=a433448b-c38d-4144-9591-f510829d4gh2&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;abc0f94a&amp;quot;}&lt;br /&gt;
|/var/log/pods/prod_cartservice-74c8d7d674-7dqf&lt;br /&gt;
|cartservice cartservice-*&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:29:57&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:29:57.8068740Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;No carts for user ab51dc18-7724-44fb-cdf8-8bda633f0022&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;c9315217&amp;quot;}&lt;br /&gt;
|/var/log/pods/prod_cartservice-74c8d7d674-7dqf&lt;br /&gt;
|cartservice cartservice-*&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:29:58&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:29:57.6864541Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;GetCartAsync called with userId=z433448a-c38d-4123-9591-f510829d4ab2&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;1feab40c&amp;quot;}&lt;br /&gt;
|/var/log/pods/prod_cartservice-74c8d7d674-7dqf&lt;br /&gt;
|cartservice cartservice-*&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:30:01&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:30:01.1058085Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;Checking CartService Health&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;a01f1123&amp;quot;}&lt;br /&gt;
|/var/log/pods/prod_cartservice-74c8d7d674-7dqf&lt;br /&gt;
|cartservice cartservice-*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Проверка типов и количества товаров, добавленных в корзины ===&lt;br /&gt;
Вам нужно получить обзор типов и количества товаров, которые пользователи добавили в свои корзины. Поскольку логи содержат различные события, нужно указать события, в которых товары были добавлены в корзины, используя функцию &amp;lt;code&amp;gt;contains()&amp;lt;/code&amp;gt;. Чтобы очистить таблицу результатов, рекомендуется оставить только &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; и содержимое лога.&amp;lt;pre&amp;gt;fetch logs, from:now()-3h&lt;br /&gt;
| filter dt.process.name==&amp;quot;cartservice cartservice-*&amp;quot;&lt;br /&gt;
| filter contains(content, &amp;quot;AddItemAsync&amp;quot;)&lt;br /&gt;
| fields timestamp, content&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!timestamp&lt;br /&gt;
!content&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:55:04&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:55:04.9934166Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;AddItemAsync called with userId=a332eabc-f52f-40d5-a09f-51bb96f5d119, productId=1ZYFJ3GM2N, quantity=1&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;18b35248&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:55:07&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:55:07.1405993Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;AddItemAsync called with userId=5ddcdd66-f0fd-4608-839e-0cd7841a3bbc, productId=L2ECAV7KIM, quantity=5&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;04fe325f&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:55:32&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:55:32.5027148Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;AddItemAsync called with userId=66734557-683c-4864-b3c7-8f08b52f0b17, productId=LS3PSXUNUM, quantity=5&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;987426bd&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:30:01&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:55:58.6888309Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;AddItemAsync called with userId=c673ca76-3966-4174-b950-4c3f3aa22dfe, productId=4SIQT8TOJO, quantity=2&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;99a07cd5&amp;quot;}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Извлечение товаров и соответствующих количеств ===&lt;br /&gt;
Вам нужно извлечь идентификаторы товаров и количества из логов с помощью команды &amp;lt;code&amp;gt;parse&amp;lt;/code&amp;gt;. Используя &amp;#039;&amp;#039;&amp;#039;Язык шаблонов Ключ-АСТРОМ&amp;#039;&amp;#039;&amp;#039;, создайте шаблон и сопоставьте следующие части поля &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;LD&amp;lt;/code&amp;gt;: начните с сопоставления любых &amp;#039;&amp;#039;&amp;#039;строчных данных&amp;#039;&amp;#039;&amp;#039; в начале поля.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;#039;userId=&amp;#039;&amp;lt;/code&amp;gt;: &amp;#039;&amp;#039;&amp;#039;литеральное выражение&amp;#039;&amp;#039;&amp;#039;, которое непосредственно предшествует ID пользователя.&lt;br /&gt;
* &amp;lt;code&amp;gt;LD:userId&amp;lt;/code&amp;gt;: любые строчные данные, которые будут выделены в новое поле с именем &amp;lt;code&amp;gt;userId&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;#039;, productId=&amp;#039;&amp;lt;/code&amp;gt;: литеральное выражение, которое завершает ID пользователя и отделяет его от ID товара.&lt;br /&gt;
* &amp;lt;code&amp;gt;LD:productId&amp;lt;/code&amp;gt;: любые строчные данные, которые будут выделены в новое поле с именем &amp;lt;code&amp;gt;productId&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;#039;, quantity=&amp;#039;&amp;lt;/code&amp;gt;: литеральное выражение, которое завершает ID товара и отделяет его от количества.&lt;br /&gt;
* &amp;lt;code&amp;gt;INT:productQuantity&amp;lt;/code&amp;gt;: &amp;#039;&amp;#039;&amp;#039;целое число&amp;#039;&amp;#039;&amp;#039;, которое будет выделено в новое поле с именем &amp;lt;code&amp;gt;productQuantity&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Остальные поля игнорируются.&amp;lt;pre&amp;gt;fetch logs, from:now()-3h&lt;br /&gt;
| filter dt.process.name==&amp;quot;cartservice cartservice-*&amp;quot;&lt;br /&gt;
| filter contains(content, &amp;quot;AddItemAsync&amp;quot;)&lt;br /&gt;
| fields timestamp, content&lt;br /&gt;
| parse content, &amp;quot;LD &amp;#039;userId=&amp;#039; LD:userId &amp;#039;, productId=&amp;#039; LD:productId &amp;#039;, quantity=&amp;#039; INT:productQuantity&amp;quot;&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!timestamp&lt;br /&gt;
!content&lt;br /&gt;
!userId&lt;br /&gt;
!productId&lt;br /&gt;
!productQuantity&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:55:04&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:55:04.9934166Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;AddItemAsync called with userId=a332efea-f52f-40d5-a09f-51bb96f5d119, productId=1ZYFJ3GM2N, quantity=1&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;18b35248&amp;quot;}&lt;br /&gt;
|a332efea-f52f-40d5-a09f-51bb96f5d119&lt;br /&gt;
|1ZYFJ3GM2N&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:55:07&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:55:07.1405993Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;AddItemAsync called with userId=5bdcdd66-f0fd-4608-839e-0cd7841a3bbc, productId=L2ECAV7KIM, quantity=5&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;04fe325f&amp;quot;}&lt;br /&gt;
|5bdcdd66-f0fd-4608-839e-0cd7841a3bbc&lt;br /&gt;
|L2ECAV7KIM&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:55:32&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:55:32.5027148Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;AddItemAsync called with userId=66734557-683c-4864-c3c7-8f08b52f0b17, productId=LS3PSXUNUM, quantity=5&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;987426bd&amp;quot;}&lt;br /&gt;
|66734557-683c-4864-c3c7-8f08b52f0b17&lt;br /&gt;
|LS3PSXUNUM&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|2022-08-05 11:30:01&lt;br /&gt;
|{&amp;quot;@t&amp;quot;:&amp;quot;2022-08-05T08:55:58.6888309Z&amp;quot;,&amp;quot;@m&amp;quot;:&amp;quot;AddItemAsync called with userId=d673ca76-3966-4174-b950-4c3f3aa22dfe, productId=4SIQT8TOJO, quantity=2&amp;quot;,&amp;quot;@i&amp;quot;:&amp;quot;99a07cd5&amp;quot;}&lt;br /&gt;
|d673ca76-3966-4174-b950-4c3f3aa22dfe&lt;br /&gt;
|4SIQT8TOJO&lt;br /&gt;
|2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Очистка данных ===&lt;br /&gt;
Поскольку ID пользователя и исходная запись лога больше не relevant, давайте очистим таблицу результатов с помощью команды &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt;.&amp;lt;pre&amp;gt;fetch logs, from:now()-3h&lt;br /&gt;
| filter dt.process.name==&amp;quot;cartservice cartservice-*&amp;quot;&lt;br /&gt;
| filter contains(content, &amp;quot;AddItemAsync&amp;quot;)&lt;br /&gt;
| fields timestamp, content&lt;br /&gt;
| parse content, &amp;quot;LD &amp;#039;userId=&amp;#039; LD:userId &amp;#039;, productId=&amp;#039; LD:productId &amp;#039;, quantity=&amp;#039; INT:productQuantity&amp;quot;&lt;br /&gt;
| fields productId, productQuantity&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!productId&lt;br /&gt;
!productQuantity&lt;br /&gt;
|-&lt;br /&gt;
|1ZYFJ3GM2N&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|L2ECAV7KIM&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|LS3PSXUNUM&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|4SIQT8TOJO&lt;br /&gt;
|2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Сводка событий по товарам ===&lt;br /&gt;
Чтобы увидеть общее количество каждого товара, добавленного в корзину, используйте функцию &amp;lt;code&amp;gt;sum()&amp;lt;/code&amp;gt;.&amp;lt;pre&amp;gt;fetch logs, from:now()-3h&lt;br /&gt;
| filter dt.process.name==&amp;quot;cartservice cartservice-*&amp;quot;&lt;br /&gt;
| filter contains(content, &amp;quot;AddItemAsync&amp;quot;)&lt;br /&gt;
| fields timestamp, content&lt;br /&gt;
| parse content, &amp;quot;LD &amp;#039;userId=&amp;#039; LD:userId &amp;#039;, productId=&amp;#039; LD:productId &amp;#039;, quantity=&amp;#039; INT:productQuantity&amp;quot;&lt;br /&gt;
| fields productId, productQuantity&lt;br /&gt;
| summarize sum(productQuantity), by:{productId}&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!productId&lt;br /&gt;
!sum(productQuantity)&lt;br /&gt;
|-&lt;br /&gt;
|APUK6V6EV0&lt;br /&gt;
|61&lt;br /&gt;
|-&lt;br /&gt;
|B9ECA1YMWWN1N4OV7KIM&lt;br /&gt;
|47&lt;br /&gt;
|-&lt;br /&gt;
|66CDHSJNUP&lt;br /&gt;
|38&lt;br /&gt;
|-&lt;br /&gt;
|9DIQT8TOJO&lt;br /&gt;
|32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Поиск самых популярных товаров ===&lt;br /&gt;
Чтобы понять поведение среднего пользователя, мы хотим определить средний размер корзины для каждого товара. Для этого мы используем функцию &amp;lt;code&amp;gt;avg()&amp;lt;/code&amp;gt; и называем новое поле &amp;lt;code&amp;gt;averageProductQuantity&amp;lt;/code&amp;gt;. Затем мы сортируем средние значения от наибольшего к наименьшему и ограничиваем результаты, чтобы увидеть пять самых популярных товаров.&amp;lt;pre&amp;gt;fetch logs, from:now()-3h&lt;br /&gt;
| filter dt.process.name==&amp;quot;cartservice cartservice-*&amp;quot;&lt;br /&gt;
| filter contains(content, &amp;quot;AddItemAsync&amp;quot;)&lt;br /&gt;
| fields timestamp, content&lt;br /&gt;
| parse content, &amp;quot;LD &amp;#039;userId=&amp;#039; LD:userId &amp;#039;, productId=&amp;#039; LD:productId &amp;#039;, quantity=&amp;#039; INT:productQuantity&amp;quot;&lt;br /&gt;
| fields productId, productQuantity&lt;br /&gt;
| summarize averageProductQuantity = avg(productQuantity), by:{productId}&lt;br /&gt;
| sort averageProductQuantity desc&lt;br /&gt;
| limit 5&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!averageProductQuantity&lt;br /&gt;
!productId&lt;br /&gt;
|-&lt;br /&gt;
|4.746268656716418&lt;br /&gt;
|1ZYFJ3GM2N&lt;br /&gt;
|-&lt;br /&gt;
|4.4375&lt;br /&gt;
|26VCHSJNUP&lt;br /&gt;
|-&lt;br /&gt;
|4.415584415584416&lt;br /&gt;
|LS3PSXUNUM&lt;br /&gt;
|-&lt;br /&gt;
|4.3604651162790695&lt;br /&gt;
|L4ECAV7KIM&lt;br /&gt;
|-&lt;br /&gt;
|4.2682926829268295&lt;br /&gt;
|1YMWWN1N4O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отслеживание изменений пользователей ==&lt;br /&gt;
В этом примере вы отслеживаете изменения пользователей с помощью логов аудита. Вы хотите отслеживать тип и количество действий, выполняемых пользователями.&lt;br /&gt;
&lt;br /&gt;
=== Проверка доступности последних логов аудита ===&lt;br /&gt;
&lt;br /&gt;
* Узнайте, были ли доступны какие-либо логи аудита за последние пять минут.&lt;br /&gt;
* Установите временной диапазон и отфильтруйте только логи, исходный путь которых заканчивается на ваш designated path.&lt;br /&gt;
&amp;lt;pre&amp;gt;fetch logs, from:now()-5m&lt;br /&gt;
| filter endsWith(log.source,&amp;quot;change.log&amp;quot;)&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!content&lt;br /&gt;
!timestamp&lt;br /&gt;
!dt.entity.host&lt;br /&gt;
!dt.entity.process_group&lt;br /&gt;
|-&lt;br /&gt;
|{&amp;quot;eventType&amp;quot;:&amp;quot;UPDATE&amp;quot;,&amp;quot;tenantId&amp;quot;:&amp;quot;abc&amp;quot;,&amp;quot;use…&lt;br /&gt;
|2022-07-15 09:08:00 UTC 15.7.2022 12:08&lt;br /&gt;
|HOST-1&lt;br /&gt;
|PROCESS_GROUP-12ED48520DB559D1&lt;br /&gt;
|-&lt;br /&gt;
|{&amp;quot;eventType&amp;quot;:&amp;quot;CREATE&amp;quot;,&amp;quot;tenantId&amp;quot;:&amp;quot;efg&amp;quot;,&amp;quot;use…&lt;br /&gt;
|2022-07-15 09:08:07 UTC 15.7.2022 12:08:07&lt;br /&gt;
|HOST-2&lt;br /&gt;
|PROCESS_GROUP-34ED48520DB559D2&lt;br /&gt;
|-&lt;br /&gt;
|{&amp;quot;eventType&amp;quot;:&amp;quot;UPDATE&amp;quot;,&amp;quot;tenantId&amp;quot;:&amp;quot;hij&amp;quot;,&amp;quot;use…&lt;br /&gt;
|2022-07-15 09:11:19 UTC 15.7.2022 12:11:19&lt;br /&gt;
|HOST-3&lt;br /&gt;
|PROCESS_GROUP-56ED48520DB559D3&lt;br /&gt;
|-&lt;br /&gt;
|{&amp;quot;eventType&amp;quot;:&amp;quot;DELETE&amp;quot;,&amp;quot;tenantId&amp;quot;:&amp;quot;klm&amp;quot;,&amp;quot;use…&lt;br /&gt;
|2022-07-15 09:11:19 UTC 15.7.2022 12:11:19&lt;br /&gt;
|HOST-4&lt;br /&gt;
|PROCESS_GROUP-78ED48520DB559D4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Извлечение relevant полей для одного пользователя ===&lt;br /&gt;
&lt;br /&gt;
* Полученная таблица включает обновления, удаления и создания записей.&lt;br /&gt;
* Если вы ограничите запрос последним результатом, вы сможете понять действия, выполненные одним пользователем. Затем мы делаем следующее:&lt;br /&gt;
** Используйте &amp;lt;code&amp;gt;parse&amp;lt;/code&amp;gt;, чтобы превратить поле &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt; в объект &amp;#039;&amp;#039;&amp;#039;JSON&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
** Используйте &amp;lt;code&amp;gt;fieldsAdd&amp;lt;/code&amp;gt;, чтобы извлечь relevant поля из этого объекта.&lt;br /&gt;
** Используйте &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt;, чтобы добавить relevant поле.&lt;br /&gt;
** Используйте &amp;lt;code&amp;gt;fieldsRemove&amp;lt;/code&amp;gt;, чтобы получить только нужные столбцы.&lt;br /&gt;
&amp;lt;pre&amp;gt;fetch logs, from:now()-5m&lt;br /&gt;
| filter endsWith(log.source,&amp;quot;change.log&amp;quot;)&lt;br /&gt;
| limit 1&lt;br /&gt;
| parse content, &amp;quot;TIMESTAMP(&amp;#039;yyyy-MM-dd HH:mm:ss&amp;#039;):ts LD JSON:settings&amp;quot;&lt;br /&gt;
| fields ts, settings&lt;br /&gt;
| fieldsAdd type = settings[eventType], tenant = settings[tenantId], user = settings[userId]&lt;br /&gt;
| fieldsRemove settings&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ts&lt;br /&gt;
!type&lt;br /&gt;
!tenant&lt;br /&gt;
!user&lt;br /&gt;
|-&lt;br /&gt;
|2022-07-14 09:19:34&lt;br /&gt;
|UPDATE&lt;br /&gt;
|abc&lt;br /&gt;
|1aae042c-ab34-4f01-8d46-128971703d5a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Получение пользователей, выполнивших обновления и удаления ===&lt;br /&gt;
Чтобы получить пользователей, которые выполнили только обновления или удаления:&lt;br /&gt;
&lt;br /&gt;
* Удалите команду &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Добавьте фильтр для двух типов действий: update и delete.&lt;br /&gt;
&amp;lt;pre&amp;gt;fetch logs, from:now()-5m&lt;br /&gt;
| filter endsWith(log.source,&amp;quot;change.log&amp;quot;)&lt;br /&gt;
| parse content, &amp;quot;TIMESTAMP(&amp;#039;yyyy-MM-dd HH:mm:ss&amp;#039;):ts LD JSON:settings&amp;quot;&lt;br /&gt;
| fields ts, settings&lt;br /&gt;
| fieldsAdd type = settings[eventType], tenant = settings[tenantId], user = settings[userId]&lt;br /&gt;
| fieldsRemove settings&lt;br /&gt;
| filter in(type,array(&amp;quot;UPDATE&amp;quot;,&amp;quot;DELETE&amp;quot;))&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ts&lt;br /&gt;
!type&lt;br /&gt;
!tenant&lt;br /&gt;
!user&lt;br /&gt;
|-&lt;br /&gt;
|2022-07-14 09:19:34&lt;br /&gt;
|UPDATE&lt;br /&gt;
|abc&lt;br /&gt;
|2aae042c-ab34-4f01-8d46-128971703d5b&lt;br /&gt;
|-&lt;br /&gt;
|2022-07-14 05:11:04&lt;br /&gt;
|UPDATE&lt;br /&gt;
|abc&lt;br /&gt;
|386b63fc-1516-4b46-9714-ee53dd76c99c&lt;br /&gt;
|-&lt;br /&gt;
|2022-07-14 05:00:49&lt;br /&gt;
|DELETE&lt;br /&gt;
|abc&lt;br /&gt;
|486b63fc-1516-4b46-9714-ee53dd76c99d&lt;br /&gt;
|-&lt;br /&gt;
|2022-07-14 04:21:43&lt;br /&gt;
|DELETE&lt;br /&gt;
|abc&lt;br /&gt;
|586b63fc-1516-4b46-9714-ee53dd76c99e&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Определение типов изменений и количества изменений, выполненных каждым пользователем ===&lt;br /&gt;
Вы можете подсчитать записи с помощью команды &amp;lt;code&amp;gt;summarize&amp;lt;/code&amp;gt;.&amp;lt;pre&amp;gt;fetch logs, from:now()-5m&lt;br /&gt;
| filter endsWith(log.source,&amp;quot;change.log&amp;quot;)&lt;br /&gt;
| parse content, &amp;quot;TIMESTAMP(&amp;#039;yyyy-MM-dd HH:mm:ss&amp;#039;):ts LD JSON:settings&amp;quot;&lt;br /&gt;
| fields ts, settings&lt;br /&gt;
| fieldsAdd type = settings[eventType], tenant = settings[tenantId], user = settings[userId]&lt;br /&gt;
| fieldsRemove settings&lt;br /&gt;
| filter in(type,array(&amp;quot;UPDATE&amp;quot;,&amp;quot;DELETE&amp;quot;))&lt;br /&gt;
| summarize count(), by:{user,type}&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!user&lt;br /&gt;
!type&lt;br /&gt;
!count()&lt;br /&gt;
|-&lt;br /&gt;
|686b63fc-1516-4b46-9714-ee53dd76c99f&lt;br /&gt;
|DELETE&lt;br /&gt;
|78&lt;br /&gt;
|-&lt;br /&gt;
|786b63fc-1516-4b46-9714-ee53dd76c99g&lt;br /&gt;
|UPDATE&lt;br /&gt;
|34&lt;br /&gt;
|-&lt;br /&gt;
|8aae042c-ab34-4f01-8d46-128971703d5h&lt;br /&gt;
|UPDATE&lt;br /&gt;
|20&lt;br /&gt;
|-&lt;br /&gt;
|9d4a7ac8-e451-6469-cced-6f4358ef343i&lt;br /&gt;
|UPDATE&lt;br /&gt;
|17&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Подсчёт событий по пользователю с разбивкой по типу действия ===&lt;br /&gt;
Вы можете выполнить расчёт, объединив команду &amp;lt;code&amp;gt;summarize&amp;lt;/code&amp;gt; с функцией &amp;lt;code&amp;gt;countIf&amp;lt;/code&amp;gt;.&amp;lt;pre&amp;gt;fetch logs, from:now()-5m&lt;br /&gt;
| filter endsWith(log.source,&amp;quot;change.log&amp;quot;)&lt;br /&gt;
| parse content, &amp;quot;TIMESTAMP(&amp;#039;yyyy-MM-dd HH:mm:ss&amp;#039;):ts LD JSON:settings&amp;quot;&lt;br /&gt;
| fields ts, settings&lt;br /&gt;
| fieldsAdd type = settings[eventType], tenant = settings[tenantId], user = settings[userId]&lt;br /&gt;
| fieldsRemove settings&lt;br /&gt;
| filter in(type,array(&amp;quot;UPDATE&amp;quot;,&amp;quot;DELETE&amp;quot;))&lt;br /&gt;
| summarize {countIf(type==&amp;quot;CREATE&amp;quot;), countIf(type==&amp;quot;UPDATE&amp;quot;), countIf(type==&amp;quot;DELETE&amp;quot;)}, by:{tenant, user}&amp;lt;/pre&amp;gt;&amp;#039;&amp;#039;&amp;#039;Таблица результатов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!tenant&lt;br /&gt;
!user&lt;br /&gt;
!countIf(type==&amp;quot;CREATE&amp;quot;)&lt;br /&gt;
!countIf(type==&amp;quot;UPDATE&amp;quot;)&lt;br /&gt;
!countIf(type==&amp;quot;DELETE&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
|def&lt;br /&gt;
|186b63fc-1516-4b46-9714-ee53dd76c99a&lt;br /&gt;
|0&lt;br /&gt;
|34&lt;br /&gt;
|78&lt;br /&gt;
|-&lt;br /&gt;
|ghi&lt;br /&gt;
|2aae042c-ab34-4f01-8d46-128971703d5b&lt;br /&gt;
|19&lt;br /&gt;
|20&lt;br /&gt;
|8&lt;br /&gt;
|-&lt;br /&gt;
|jkl&lt;br /&gt;
|3d4a7ac8-e451-6469-cced-6f4358ef343c&lt;br /&gt;
|2&lt;br /&gt;
|17&lt;br /&gt;
|11&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Создание метрики лога ==&lt;br /&gt;
В этом примере вам нужно подсчитать, сколько отклонённых соединений зафиксировано в ваших данных логов. Для этого отфильтруйте нужные логи и превратите количество вхождений в метрику лога. В этом примере вам нужно отслеживать атрибут ваших логов и следить за уровнями ошибок, сообщаемыми в логах из вашего кластера K8s.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Создание оповещения по логам ==&lt;br /&gt;
В этом примере вам нужно настроить оповещение на основе появления событий логов. Посмотрите, как можно извлечь данные из логов, создать правило обработки, построить оповещение путём формирования события лога и проверить, захватывает ли ваше оповещение логи, соответствующие предопределённым критериям.&lt;br /&gt;
&lt;br /&gt;
== Создание метрики обнаружения аномалий ==&lt;br /&gt;
В этом варианте использования вам нужно автоматизировать обнаружение аномалий. Посмотрите, как можно извлечь данные из логов, создать правило обработки, создать метрику и создать оповещение, которое генерирует уведомление при возникновении аномалии.&lt;/div&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
</feed>