<?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%A1%D0%B2%D1%8F%D0%B7%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_%D1%81_%D1%82%D1%80%D0%B0%D1%81%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8</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%A1%D0%B2%D1%8F%D0%B7%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_%D1%81_%D1%82%D1%80%D0%B0%D1%81%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_%D1%81_%D1%82%D1%80%D0%B0%D1%81%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;action=history"/>
	<updated>2026-10-26T19:40:40Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_%D1%81_%D1%82%D1%80%D0%B0%D1%81%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=7041&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: « = Связывание данных логов с трассировками = Ключ-АСТРОМ может обогащать загруженные данные логов дополнительной информацией, которая помогает распознавать, коррелировать и оценивать данные. Обогащение логов приводит к более точному анализу логов. Об...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_%D1%81_%D1%82%D1%80%D0%B0%D1%81%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=7041&amp;oldid=prev"/>
		<updated>2026-10-13T17:58:31Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: « = Связывание данных логов с трассировками = Ключ-АСТРОМ может обогащать загруженные данные логов дополнительной информацией, которая помогает распознавать, коррелировать и оценивать данные. Обогащение логов приводит к более точному анализу логов. Об...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
= Связывание данных логов с трассировками =&lt;br /&gt;
Ключ-АСТРОМ может обогащать загруженные данные логов дополнительной информацией, которая помогает распознавать, коррелировать и оценивать данные. Обогащение логов приводит к более точному анализу логов. Обогащение логов позволяет:&lt;br /&gt;
&lt;br /&gt;
* Бесшовно переключать контекст и анализировать отдельные спаны, транзакции или целые рабочие нагрузки.&lt;br /&gt;
* Помогать командам разработки быстрее обнаруживать и точно определять проблемы.&lt;br /&gt;
&lt;br /&gt;
== Автоматическое обогащение логов ==&lt;br /&gt;
Вы можете включить обогащение логов для конкретной технологии, используемой для создания данных логов, и позволить Ключ-АСТРОМ автоматически внедрять дополнительные атрибуты в каждую получаемую запись лога. Этот метод рекомендуется для структурированных данных логов известных технологий.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ограничение обогащения логов&amp;#039;&amp;#039;&amp;#039; Используйте &amp;#039;&amp;#039;&amp;#039;Переопределение группы процессов&amp;#039;&amp;#039;&amp;#039;, чтобы ограничить обогащение логов конкретной группой процессов или процессом внутри группы процессов.&lt;br /&gt;
&lt;br /&gt;
=== Включение/отключение обогащения логов для конкретной технологии ===&lt;br /&gt;
Чтобы включить обогащение логов для конкретной технологии:&lt;br /&gt;
&lt;br /&gt;
# Перейдите в &amp;#039;&amp;#039;&amp;#039;Настройки&amp;#039;&amp;#039;&amp;#039; и выберите &amp;#039;&amp;#039;&amp;#039;Настройки &amp;gt; Функции ЕдиногоАгента&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Отфильтруйте по обогащению.&lt;br /&gt;
# Включите/отключите обогащение логов для каждой технологии, которую вы используете для создания загружаемых данных логов.&lt;br /&gt;
# Выберите &amp;#039;&amp;#039;&amp;#039;Сохранить изменения&amp;#039;&amp;#039;&amp;#039;, чтобы сохранить конфигурацию.&lt;br /&gt;
&lt;br /&gt;
=== Что делает автоматическое обогащение логов ===&lt;br /&gt;
Обогащение логов изменяет загруженные данные логов и добавляет следующую информацию в каждую обнаруженную запись лога:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;dt.trace_id&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dt.span_id&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dt.entity.process_group_instance&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Поддерживаемые фреймворки ===&lt;br /&gt;
Полный список фреймворков логирования, поддерживающих автоматическое обогащение контекста трассировок/спанов, см. в разделе &amp;#039;&amp;#039;&amp;#039;Поддержка технологий&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Структурированные данные логов ===&lt;br /&gt;
Для структурированных данных логов, таких как &amp;#039;&amp;#039;&amp;#039;JSON&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;XML&amp;#039;&amp;#039;&amp;#039; и хорошо определённые текстовые форматы логов, Ключ-АСТРОМ добавляет поле атрибута в запись лога.&lt;br /&gt;
&lt;br /&gt;
==== Пример обогащённых данных логов в формате JSON ====&lt;br /&gt;
Данные логов в формате &amp;#039;&amp;#039;&amp;#039;JSON&amp;#039;&amp;#039;&amp;#039; обогащаются дополнительными свойствами &amp;lt;code&amp;gt;dt.trace_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dt.span_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;dt.entity.process_group_instance&amp;lt;/code&amp;gt;.&amp;lt;pre&amp;gt;{&lt;br /&gt;
  &amp;quot;severity&amp;quot;: &amp;quot;error&amp;quot;,&lt;br /&gt;
  &amp;quot;time&amp;quot;: 1638957438023,&lt;br /&gt;
  &amp;quot;pid&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;hostname&amp;quot;: &amp;quot;paymentservice-788946fdcd-42lgq&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;paymentservice-charge&amp;quot;,&lt;br /&gt;
  &amp;quot;dt.trace_id&amp;quot;: &amp;quot;d04b42bc9f4b6ecdbf6bc9f4b6ecdbc&amp;quot;,&lt;br /&gt;
  &amp;quot;dt.span_id&amp;quot;: &amp;quot;9adc716eb808d428&amp;quot;,&lt;br /&gt;
  &amp;quot;dt.entity.process_group_instance&amp;quot;: &amp;quot;PROCESS_GROUP_INSTANCE-27204EFED3D8466E&amp;quot;,&lt;br /&gt;
  &amp;quot;message&amp;quot;: &amp;quot;Unsupported card type for cardNumber=************0454&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пример обогащённых данных логов в формате XML ====&lt;br /&gt;
Данные логов в формате &amp;#039;&amp;#039;&amp;#039;XML&amp;#039;&amp;#039;&amp;#039; обогащаются дополнительными узлами &amp;lt;code&amp;gt;dt.trace_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dt.span_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;dt.entity.process_group_instance&amp;lt;/code&amp;gt;.&amp;lt;pre&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1252&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;lt;record&amp;gt;&lt;br /&gt;
&amp;lt;date&amp;gt;2021-08-24T14:41:36.565218700Z&amp;lt;/date&amp;gt;&lt;br /&gt;
&amp;lt;millis&amp;gt;1629816096565&amp;lt;/millis&amp;gt;&lt;br /&gt;
&amp;lt;nanos&amp;gt;218700&amp;lt;/nanos&amp;gt;&lt;br /&gt;
&amp;lt;sequence&amp;gt;0&amp;lt;/sequence&amp;gt;&lt;br /&gt;
&amp;lt;logger&amp;gt;com.apm.testapp.logging.jul.XMLLoggingSample&amp;lt;/logger&amp;gt;&lt;br /&gt;
&amp;lt;level&amp;gt;INFO&amp;lt;/level&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;com.apm.testapp.logging.jul.BaseLoggingSample&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;method&amp;gt;info&amp;lt;/method&amp;gt;&lt;br /&gt;
&amp;lt;thread&amp;gt;1&amp;lt;/thread&amp;gt;&lt;br /&gt;
&amp;lt;message&amp;gt;Update completed successfully.&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;dt.trace_id&amp;gt;513fcd4e9b08792fcd4e9b08792&amp;lt;/dt.trace_id&amp;gt;&lt;br /&gt;
&amp;lt;dt.span_id&amp;gt;125840e3125840e3&amp;lt;/dt.span_id&amp;gt;&lt;br /&gt;
&amp;lt;dt.entity.process_group_instance&amp;gt;PROCESS_GROUP_INSTANCE-27204EFED3D8466E&amp;lt;/dt.entity.process_group_instance&amp;gt;&amp;lt;/record&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Неструктурированные данные логов ===&lt;br /&gt;
Проверьте, влияет ли обогащение логов Ключ-АСТРОМ на ваш существующий конвейер данных логов, прежде чем использовать автоматическое обогащение логов для неструктурированных данных логов. Чтобы избежать обогащения логов из тестовых или симуляционных запусков, рекомендуется исключать процессы, содержащие &amp;lt;code&amp;gt;--dry-run&amp;lt;/code&amp;gt;. Например, сервер приложений &amp;#039;&amp;#039;&amp;#039;Payara&amp;#039;&amp;#039;&amp;#039; использует стартовые скрипты с такими сухими запусками, и сервер может не запуститься корректно, если это исключение не установлено.&lt;br /&gt;
&lt;br /&gt;
Неструктурированные данные логов обычно состоят из необработанного простого текста, который упорядочен последовательно и предназначен для чтения людьми. Ключ-АСТРОМ не обогащает неструктурированные данные логов автоматически. Ключ-АСТРОМ может обогащать неструктурированные данные логов, но добавление дополнительной информации к данным логов может повлиять на сторонние инструменты, которые потребляют те же данные логов.&lt;br /&gt;
&lt;br /&gt;
==== Пример обогащённых данных логов в формате необработанного текста ====&lt;br /&gt;
Данные логов в необработанном тексте обогащаются дополнительной строкой &amp;lt;code&amp;gt;[!dt dt.trace_id=$trace_id, dt.span_id=$span_id, dt.entity.process_group_instance=$dt.entity.process_group_instance]&amp;lt;/code&amp;gt; (атрибуты и их значения).&amp;lt;pre&amp;gt;127.0.0.1 - [21/Oct/2021:10:33:28 +0200] GET /index.htm HTTP/1.1 404 597 [!dt dt.trace_id=aa764ee37ebaa764ee37eaa764ee37e,dt.span_id=b93ede8b93ede8, dt.entity.process_group_instance=PROCESS_GROUP_INSTANCE-27204EFED3D8466E]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ручное обогащение логов ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Версия ЕдиногоАгента&amp;#039;&amp;#039;&amp;#039; 1.239+&lt;br /&gt;
&lt;br /&gt;
Вы можете вручную обогащать загруженные данные логов Ключ-АСТРОМ, определив шаблон лога, включающий поля &amp;lt;code&amp;gt;dt.span_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dt.trace_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dt.trace_sampled&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;dt.entity.process_group_instance&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;[]&amp;lt;/code&amp;gt;) с префиксом &amp;lt;code&amp;gt;!dt&amp;lt;/code&amp;gt;. Например, &amp;lt;code&amp;gt;[!dt dt.trace_id=$dt_trace_id,dt.span_id=$dt_span_id, dt.entity.process_group_instance=$dt.entity.process_group_instance]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Поля должны быть отформатированы без двойных кавычек.&lt;br /&gt;
* Любые недопустимые символы для поля и значения поля должны быть экранированы.&lt;br /&gt;
* Любые управляющие символы, такие как &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;, должны быть исключены из определения обогащения.&lt;br /&gt;
&lt;br /&gt;
=== Пример ручного обогащения данных логов NGINX ===&lt;br /&gt;
Предположим, вы хотите вручную обогатить данные логов &amp;#039;&amp;#039;&amp;#039;NGINX&amp;#039;&amp;#039;&amp;#039; полями &amp;lt;code&amp;gt;dt.trace_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dt.span_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;dt.trace_sampled&amp;lt;/code&amp;gt;. Файл конфигурации &amp;#039;&amp;#039;&amp;#039;NGINX&amp;#039;&amp;#039;&amp;#039; содержит множество стандартных переменных &amp;#039;&amp;#039;&amp;#039;NGINX&amp;#039;&amp;#039;&amp;#039;, ваше определение формата лога должно находиться в секции &amp;lt;code&amp;gt;log_format&amp;lt;/code&amp;gt;. Например:&amp;lt;pre&amp;gt;log_format custom &amp;#039;$remote_addr - [$time_local] $request $status $body_bytes_sent [!dt dt.trace_id=$dt_trace_id,dt.span_id=$dt_span_id,dt.trace_sampled=$dt_trace_sampled]&amp;#039;;&lt;br /&gt;
access_log logs/access.log custom;&amp;lt;/pre&amp;gt;Результатом будет файл &amp;lt;code&amp;gt;access.log&amp;lt;/code&amp;gt;, содержащий обогащённые записи логов:&amp;lt;pre&amp;gt;127.0.0.1 - [22/Mar/2022:08:50:45 +0100] GET /index.htm HTTP/1.1 200 30 [!dt dt.trace_id=b9e5c9ec08be5fab5071d76f427be7da,dt.span_id=43c5bb9432593963,dt.trace_sampled=true]&lt;br /&gt;
127.0.0.1 - [22/Mar/2022:08:50:45 +0100] GET /index.htm HTTP/1.1 200 30 [!dt dt.trace_id=01e52950b145d97bf22345e68c5e6c58,dt.span_id=de819d856eecb236,dt.trace_sampled=true]&amp;lt;/pre&amp;gt;Для &amp;#039;&amp;#039;&amp;#039;ЕдиногоАгента&amp;#039;&amp;#039;&amp;#039; версии 1.237 и более ранних используемые переменные &amp;#039;&amp;#039;&amp;#039;NGINX&amp;#039;&amp;#039;&amp;#039; отличаются. Например:&amp;lt;pre&amp;gt;log_format custom &amp;#039;$remote_addr - [$time_local] $request $status $body_bytes_sent [!dt dt.trace_id=$trace_id,dt.span_id=$span_id]&amp;#039;;&lt;br /&gt;
access_log logs/access.log custom;&amp;lt;/pre&amp;gt;Результатом будет файл &amp;lt;code&amp;gt;access.log&amp;lt;/code&amp;gt;, содержащий обогащённые записи логов:&amp;lt;pre&amp;gt;127.0.0.1 - [21/Oct/2021:10:33:28 +0200] GET /index.htm HTTP/1.1 404 597 [!dt dt.trace_id=e1c0afeb0b8a91d7748139aa764ee37e,dt.span_id=e5e6748fab93ede8]&lt;br /&gt;
127.0.0.1 - [21/Oct/2021:10:33:31 +0200] GET /index.html HTTP/1.1 200 1056 [!dt dt.trace_id=81fe7816ba6c38f7aa09aef3684cd941,dt.span_id=3bdacc466ae073cd]&amp;lt;/pre&amp;gt;Если вы используете фреймворк логирования и форматировщик логов, который позволяет задавать пользовательские шаблоны логов, вы можете адаптировать шаблон в форматировщике логов и напрямую обращаться к атрибутам обогащения Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
=== Пример ручного обогащения данных логов Log4j ===&lt;br /&gt;
В &amp;lt;code&amp;gt;PatternFormatter&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;Log4j&amp;#039;&amp;#039;&amp;#039; можно указать такой шаблон, чтобы включить информацию обогащения Ключ-АСТРОМ:&amp;lt;pre&amp;gt;&amp;lt;PatternLayout pattern=&amp;quot;%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} dt.trace_id=%X{dt.trace_id} dt.span_id=%X{dt.span_id} dt.entity.process_group_instance=%X{dt.entity.process_group_instance} - %msg%n&amp;quot;/&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример ручного обогащения Logstash Logback encoder ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Logback&amp;#039;&amp;#039;&amp;#039; — преемник проекта &amp;#039;&amp;#039;&amp;#039;log4j&amp;#039;&amp;#039;&amp;#039;. &amp;#039;&amp;#039;&amp;#039;Logstash Logback&amp;#039;&amp;#039;&amp;#039; — расширение, предоставляющее кодировщики, макеты и аппендеры для логирования в &amp;#039;&amp;#039;&amp;#039;JSON&amp;#039;&amp;#039;&amp;#039; и других форматах, поддерживаемых &amp;#039;&amp;#039;&amp;#039;Jackson&amp;#039;&amp;#039;&amp;#039;. Ниже приведён пример ручного обогащения с использованием кодировщика &amp;#039;&amp;#039;&amp;#039;Logstash&amp;#039;&amp;#039;&amp;#039;. Обратите внимание на дополнительное свойство &amp;lt;code&amp;gt;mdc&amp;lt;/code&amp;gt; в файле конфигурации, где можно указать переменные &amp;#039;&amp;#039;&amp;#039;MDC&amp;#039;&amp;#039;&amp;#039;.&amp;lt;pre&amp;gt;&amp;lt;appender name=&amp;quot;COMPOSITEJSONENCODER&amp;quot; class=&amp;quot;ch.qos.logback.core.FileAppender&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;file&amp;gt;compositejsonencoder.log&amp;lt;/file&amp;gt;&lt;br /&gt;
  &amp;lt;encoder class=&amp;quot;net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;providers&amp;gt;&lt;br /&gt;
      &amp;lt;timestamp&amp;gt;&lt;br /&gt;
        &amp;lt;fieldName&amp;gt;timestamp&amp;lt;/fieldName&amp;gt;&lt;br /&gt;
        &amp;lt;timeZone&amp;gt;UTC&amp;lt;/timeZone&amp;gt;&lt;br /&gt;
      &amp;lt;/timestamp&amp;gt;&lt;br /&gt;
      &amp;lt;loggerName&amp;gt;&lt;br /&gt;
        &amp;lt;fieldName&amp;gt;logger&amp;lt;/fieldName&amp;gt;&lt;br /&gt;
      &amp;lt;/loggerName&amp;gt;&lt;br /&gt;
      &amp;lt;logLevel&amp;gt;&lt;br /&gt;
        &amp;lt;fieldName&amp;gt;level&amp;lt;/fieldName&amp;gt;&lt;br /&gt;
      &amp;lt;/logLevel&amp;gt;&lt;br /&gt;
      &amp;lt;threadName&amp;gt;&lt;br /&gt;
        &amp;lt;fieldName&amp;gt;thread&amp;lt;/fieldName&amp;gt;&lt;br /&gt;
      &amp;lt;/threadName&amp;gt;&lt;br /&gt;
      &amp;lt;mdc&amp;gt;&lt;br /&gt;
        &amp;lt;includeMdcKeyName&amp;gt;dt.span_id&amp;lt;/includeMdcKeyName&amp;gt;&lt;br /&gt;
        &amp;lt;includeMdcKeyName&amp;gt;dt.trace_id&amp;lt;/includeMdcKeyName&amp;gt;&lt;br /&gt;
        &amp;lt;includeMdcKeyName&amp;gt;dt.entity.host&amp;lt;/includeMdcKeyName&amp;gt;&lt;br /&gt;
      &amp;lt;/mdc&amp;gt;&lt;br /&gt;
      &amp;lt;stackTrace&amp;gt;&lt;br /&gt;
        &amp;lt;fieldName&amp;gt;stackTrace&amp;lt;/fieldName&amp;gt;&lt;br /&gt;
        &amp;lt;!-- maxLength - limit the length of the stack trace --&amp;gt;&lt;br /&gt;
        &amp;lt;throwableConverter class=&amp;quot;net.logstash.logback.stacktrace.ShortenedThrowableConverter&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;maxDepthPerThrowable&amp;gt;200&amp;lt;/maxDepthPerThrowable&amp;gt;&lt;br /&gt;
          &amp;lt;maxLength&amp;gt;14000&amp;lt;/maxLength&amp;gt;&lt;br /&gt;
          &amp;lt;rootCauseFirst&amp;gt;true&amp;lt;/rootCauseFirst&amp;gt;&lt;br /&gt;
        &amp;lt;/throwableConverter&amp;gt;&lt;br /&gt;
      &amp;lt;/stackTrace&amp;gt;&lt;br /&gt;
      &amp;lt;message /&amp;gt;&lt;br /&gt;
      &amp;lt;throwableClassName&amp;gt;&lt;br /&gt;
        &amp;lt;fieldName&amp;gt;exceptionClass&amp;lt;/fieldName&amp;gt;&lt;br /&gt;
      &amp;lt;/throwableClassName&amp;gt;&lt;br /&gt;
    &amp;lt;/providers&amp;gt;&lt;br /&gt;
  &amp;lt;/encoder&amp;gt;&lt;br /&gt;
&amp;lt;/appender&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример ручного обогащения данных логов .NET Serilog ===&lt;br /&gt;
В &amp;#039;&amp;#039;&amp;#039;.NET Serilog&amp;#039;&amp;#039;&amp;#039; вы можете настраивать шаблоны вывода для текстовых приёмников, таких как консольные или файловые, чтобы включить информацию обогащения Ключ-АСТРОМ.&amp;lt;pre&amp;gt;{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] [!dt dt.trace_id={trace_id}, dt.span_id={span_id}, dt.trace_sampled={trace_sampled}] {Message:lj}{NewLine}{Exception}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NGINX ingress с Kubernetes ==&lt;br /&gt;
Вы можете обогащать логи с помощью &amp;#039;&amp;#039;&amp;#039;NGINX&amp;#039;&amp;#039;&amp;#039; ingress в &amp;#039;&amp;#039;&amp;#039;Kubernetes&amp;#039;&amp;#039;&amp;#039; в два шага:&lt;br /&gt;
&lt;br /&gt;
# Выполните инструкции по инструментированию &amp;#039;&amp;#039;&amp;#039;ingress-nginx на Kubernetes&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Добавьте команду ниже в файл &amp;lt;code&amp;gt;configmap.yaml&amp;lt;/code&amp;gt; для &amp;#039;&amp;#039;&amp;#039;NGINX&amp;#039;&amp;#039;&amp;#039; ingress. Добавление строки &amp;lt;code&amp;gt;main-snippet&amp;lt;/code&amp;gt; включает загрузку через &amp;#039;&amp;#039;&amp;#039;ЕдиныйАгент&amp;#039;&amp;#039;&amp;#039; и необязательно, если вы уже следовали инструкциям по ручному инструментированию.&lt;br /&gt;
&amp;lt;pre&amp;gt;main-snippet: load_module /opt/astromkey/oneagent/agent/bin/current/linux-musl-x86-64/liboneagentnginx.so;log-format-upstream: &amp;#039;$remote_addr - $remote_user [$time_local] &amp;quot;$request&amp;quot; [!dt dt.trace_id=$dt_trace_id,dt.span_id=$dt_span_id,dt.trace_sampled=$dt_trace_sampled] $status $body_bytes_sent &amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; $request_length&amp;#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример файла configmap.yaml ===&lt;br /&gt;
&amp;lt;pre&amp;gt;apiVersion: v1&lt;br /&gt;
kind: Namespace&lt;br /&gt;
metadata:&lt;br /&gt;
  name: prod-ingress-nginx&lt;br /&gt;
  labels:&lt;br /&gt;
    app.kubernetes.io/name: ingress-nginx&lt;br /&gt;
    app.kubernetes.io/instance: ingress-nginx&lt;br /&gt;
---&lt;br /&gt;
# Source: ingress-nginx/templates/controller-serviceaccount.yaml&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: ServiceAccount&lt;br /&gt;
metadata:&lt;br /&gt;
  labels:&lt;br /&gt;
    helm.sh/chart: ingress-nginx-4.0.6&lt;br /&gt;
    app.kubernetes.io/name: ingress-nginx&lt;br /&gt;
    app.kubernetes.io/instance: ingress-nginx&lt;br /&gt;
    app.kubernetes.io/version: 1.0.4&lt;br /&gt;
    app.kubernetes.io/managed-by: Helm&lt;br /&gt;
    app.kubernetes.io/component: controller&lt;br /&gt;
  name: ingress-nginx&lt;br /&gt;
  namespace: prod-ingress-nginx&lt;br /&gt;
automountServiceAccountToken: true&lt;br /&gt;
---&lt;br /&gt;
# Source: ingress-nginx/templates/controller-configmap.yaml&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: ConfigMap&lt;br /&gt;
metadata:&lt;br /&gt;
  labels:&lt;br /&gt;
    helm.sh/chart: ingress-nginx-4.0.6&lt;br /&gt;
    app.kubernetes.io/name: ingress-nginx&lt;br /&gt;
    app.kubernetes.io/instance: ingress-nginx&lt;br /&gt;
    app.kubernetes.io/version: 1.0.4&lt;br /&gt;
    app.kubernetes.io/managed-by: Helm&lt;br /&gt;
    app.kubernetes.io/component: controller&lt;br /&gt;
  name: ingress-nginx-controller&lt;br /&gt;
  namespace: prod-ingress-nginx&lt;br /&gt;
data:&lt;br /&gt;
  allow-snippet-annotations: &amp;#039;true&amp;#039;&lt;br /&gt;
  main-snippet: load_module /opt/astromkey/oneagent/agent/bin/current/linux-musl-x86-64/liboneagentnginx.so;&lt;br /&gt;
  log-format-upstream: &amp;#039;$remote_addr - $remote_user [$time_local] &amp;quot;$request&amp;quot; [!dt dt.trace_id=$dt_trace_id,dt.span_id=$dt_span_id,dt.trace_sampled=$dt_trace_sampled] $status $body_bytes_sent &amp;quot;$http_referer&amp;quot; &amp;quot;$http_user_agent&amp;quot; $request_length&amp;#039;&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Получение ID спанов и трассировок ==&lt;br /&gt;
Чтобы Ключ-АСТРОМ мог сопоставлять логи с соответствующими трассировками, вы можете включать ID спанов и трассировок в сообщения логов, используя нотацию &amp;lt;code&amp;gt;[!dt]&amp;lt;/code&amp;gt;. В следующих примерах показано, как получить ID спанов и трассировок с помощью &amp;#039;&amp;#039;&amp;#039;OpenTelemetry&amp;#039;&amp;#039;&amp;#039; или &amp;#039;&amp;#039;&amp;#039;SDK ЕдиногоАгента&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
В примере ниже создана функция &amp;lt;code&amp;gt;dt_log&amp;lt;/code&amp;gt; для обогащения заданного сообщения лога информацией &amp;lt;code&amp;gt;trace_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;span_id&amp;lt;/code&amp;gt;. Печать этого обогащённого сообщения в настроенный приёмник логов связывает сообщение лога с текущим активным спаном в веб-интерфейсе Ключ-АСТРОМ.&amp;lt;pre&amp;gt;import logging&lt;br /&gt;
from opentelemetry import trace&lt;br /&gt;
&lt;br /&gt;
def dt_log(self, record):&lt;br /&gt;
    if (not self.disabled) and self.filter(record):&lt;br /&gt;
        ctx = trace.get_current_span().get_span_context()&lt;br /&gt;
        if ctx.is_valid:&lt;br /&gt;
            trace_id = &amp;quot;{0:032X}&amp;quot;.format(ctx.trace_id)&lt;br /&gt;
            span_id = &amp;quot;{0:016X}&amp;quot;.format(ctx.span_id)&lt;br /&gt;
            record.msg = f&amp;quot;[!dt dt.trace_id={trace_id},dt.span_id={span_id}] - {record.msg}&amp;quot;&lt;br /&gt;
    self.callHandlers(record)&lt;br /&gt;
&lt;br /&gt;
logging.Logger.handle = dt_log&lt;br /&gt;
&lt;br /&gt;
def lambda_handler(event, context):&lt;br /&gt;
    logger = logging.getLogger()&lt;br /&gt;
    logger.warning(&amp;quot;Hello world&amp;quot;)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;statusCode&amp;quot;: 200,&lt;br /&gt;
        &amp;quot;body&amp;quot;: &amp;quot;Hello from lambda&amp;quot;&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Получение ID экземпляра группы процессов ==&lt;br /&gt;
Вы можете получить поле &amp;lt;code&amp;gt;dt.entity.process_group_instance&amp;lt;/code&amp;gt; с помощью команды &amp;#039;&amp;#039;&amp;#039;OpenTelemetry Python&amp;#039;&amp;#039;&amp;#039;, содержащей &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt;. Поле &amp;lt;code&amp;gt;process_group_instance&amp;lt;/code&amp;gt; извлекается как один из атрибутов, передаваемых в &amp;lt;code&amp;gt;merged&amp;lt;/code&amp;gt;, как показано в примере ниже:&lt;br /&gt;
&lt;br /&gt;
С &amp;#039;&amp;#039;&amp;#039;ЕдинымАгентом&amp;#039;&amp;#039;&amp;#039; вы можете просто указать на локальную конечную точку без токена аутентификации, чтобы включить загрузку трассировок.&amp;lt;pre&amp;gt;import json&lt;br /&gt;
from opentelemetry import trace as OpenTelemetry&lt;br /&gt;
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (&lt;br /&gt;
    OTLPSpanExporter,&lt;br /&gt;
)&lt;br /&gt;
from opentelemetry.sdk.resources import Resource&lt;br /&gt;
from opentelemetry.sdk.trace import TracerProvider, sampling&lt;br /&gt;
from opentelemetry.sdk.trace.export import (&lt;br /&gt;
    BatchSpanProcessor,&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
merged = dict()&lt;br /&gt;
for name in [&amp;quot;dt_metadata_e617c525669e072eebe3d0f08212e8f2.json&amp;quot;, &amp;quot;/var/lib/astromkey/enrichment/dt_metadata.json&amp;quot;]:&lt;br /&gt;
    try:&lt;br /&gt;
        data = &amp;#039;&amp;#039;&lt;br /&gt;
        with open(name) as f:&lt;br /&gt;
            data = json.load(f if name.startswith(&amp;quot;/var&amp;quot;) else open(f.read()))&lt;br /&gt;
        merged.update(data)&lt;br /&gt;
    except:&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
merged.update({&lt;br /&gt;
    &amp;quot;service.name&amp;quot;: &amp;quot;python-quickstart&amp;quot;,  #TODO Replace with the name of your application&lt;br /&gt;
    &amp;quot;service.version&amp;quot;: &amp;quot;1.0.1&amp;quot;,  #TODO Replace with the version of your application&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
resource = Resource.create(merged)&lt;br /&gt;
tracer_provider = TracerProvider(sampler=sampling.ALWAYS_ON, resource=resource)&lt;br /&gt;
OpenTelemetry.set_tracer_provider(tracer_provider)&lt;br /&gt;
tracer_provider.add_span_processor(&lt;br /&gt;
    BatchSpanProcessor(OTLPSpanExporter(&lt;br /&gt;
        endpoint=&amp;quot;http://localhost:14499/otlp/v1/traces&amp;quot;&lt;br /&gt;
    ))&lt;br /&gt;
)&amp;lt;/pre&amp;gt;При использовании &amp;#039;&amp;#039;&amp;#039;ЕдиногоАгента&amp;#039;&amp;#039;&amp;#039; обязательно включите публичный &amp;#039;&amp;#039;&amp;#039;Контроллер выполнения расширений&amp;#039;&amp;#039;&amp;#039; в настройках Ключ-АСТРОМ, иначе данные не будут отправляться. Перейдите в &amp;#039;&amp;#039;&amp;#039;Настройки &amp;gt; Настройки &amp;gt; Контроллер выполнения расширений&amp;#039;&amp;#039;&amp;#039;. Переключатели &amp;#039;&amp;#039;&amp;#039;Включить контроллер выполнения расширений&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;Включить локальный API для метрик PIPE/HTTP и загрузки логов&amp;#039;&amp;#039;&amp;#039; должны быть активны.&lt;br /&gt;
&lt;br /&gt;
== Ограничения ==&lt;br /&gt;
Если вы используете пользовательский форматировщик/транспорт &amp;#039;&amp;#039;&amp;#039;winston&amp;#039;&amp;#039;&amp;#039; (применимо только к &amp;#039;&amp;#039;&amp;#039;Node.js&amp;#039;&amp;#039;&amp;#039;), вам нужно вручную добавить ваши внедрённые &amp;lt;code&amp;gt;dt.traceId&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;dt.spanId&amp;lt;/code&amp;gt;, как в примере ниже:&amp;lt;pre&amp;gt;const winston = require(&amp;quot;winston&amp;quot;);&lt;br /&gt;
const Transport = require(&amp;quot;winston-transport&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
class CustomTransport extends Transport {&lt;br /&gt;
  log(info, next) {&lt;br /&gt;
    let myLogLine = `MyLogLine: ${info.timestamp} level=${info.level}: ${info.message}`;&lt;br /&gt;
&lt;br /&gt;
    // this is important as above line only picks timestamp, level and message but nothing else from metadata&lt;br /&gt;
    if (info[&amp;quot;dt.trace_id&amp;quot;]) {&lt;br /&gt;
      myLogLine = `[!dt dt.trace_id=${info[&amp;quot;dt.trace_id&amp;quot;]},dt.span_id=${info[&amp;quot;dt.span_id&amp;quot;]},dt.trace_sampled=${info[&amp;quot;dt.trace_sampled&amp;quot;]}] ${myLogLine}`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    console.log(myLogLine);&lt;br /&gt;
    next();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const logger = winston.createLogger({&lt;br /&gt;
  level: &amp;quot;info&amp;quot;,&lt;br /&gt;
  format: winston.format.timestamp(),&lt;br /&gt;
  transports: [&lt;br /&gt;
    new CustomTransport(), // this transport includes all metadata (including astromkey added traceId,..)&lt;br /&gt;
    new winston.transport.Console({&lt;br /&gt;
      format: winston.format.simple()&lt;br /&gt;
    })&lt;br /&gt;
  ]&lt;br /&gt;
})&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
</feed>