<?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%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B5%D0%B1-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_iOS</id>
	<title>Мониторинг производительности веб-запросов для iOS - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B5%D0%B1-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_iOS"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B5%D0%B1-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_iOS&amp;action=history"/>
	<updated>2026-09-16T14:04:53Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B5%D0%B1-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_iOS&amp;diff=6594&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: «= Мониторинг производительности веб-запросов =  ЕдиныйАгент для &#039;&#039;&#039;iOS&#039;&#039;&#039; предоставляет комплексные возможности мониторинга веб-запросов:  * Автоматическая инструментация — автоматически фиксирует все веб-запросы, отправленные через &#039;&#039;&#039;URLSession&#039;&#039;&#039;. * &#039;&#039;&#039;W3C Trace Cont...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B5%D0%B1-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_iOS&amp;diff=6594&amp;oldid=prev"/>
		<updated>2026-08-19T17:51:22Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «= Мониторинг производительности веб-запросов =  ЕдиныйАгент для &amp;#039;&amp;#039;&amp;#039;iOS&amp;#039;&amp;#039;&amp;#039; предоставляет комплексные возможности мониторинга веб-запросов:  * Автоматическая инструментация — автоматически фиксирует все веб-запросы, отправленные через &amp;#039;&amp;#039;&amp;#039;URLSession&amp;#039;&amp;#039;&amp;#039;. * &amp;#039;&amp;#039;&amp;#039;W3C Trace Cont...»&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;iOS&amp;#039;&amp;#039;&amp;#039; предоставляет комплексные возможности мониторинга веб-запросов:&lt;br /&gt;
&lt;br /&gt;
* Автоматическая инструментация — автоматически фиксирует все веб-запросы, отправленные через &amp;#039;&amp;#039;&amp;#039;URLSession&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;W3C Trace Context&amp;#039;&amp;#039;&amp;#039; — активирует связь между фронтендом и бэкендом путем распространения заголовков контекста трассировки.&lt;br /&gt;
* Создание отчетов вручную — формирование отчетов о веб-запросах из пользовательских сетевых конфигураций.&lt;br /&gt;
* Обогащение событий — добавление пользовательских свойств к событиям веб-запросов.&lt;br /&gt;
&lt;br /&gt;
== Автоматизированная инструментация веб-запросов ==&lt;br /&gt;
&lt;br /&gt;
ЕдиныйАгент для &amp;#039;&amp;#039;&amp;#039;iOS&amp;#039;&amp;#039;&amp;#039; автоматически отслеживает веб-запросы, выполняемые с использованием API &amp;lt;code&amp;gt;URLSession&amp;lt;/code&amp;gt; от &amp;#039;&amp;#039;&amp;#039;Apple&amp;#039;&amp;#039;&amp;#039;, и сохраняет их в виде событий в Хранилище данных.&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;.&lt;br /&gt;
&lt;br /&gt;
Кроме того, измеряются временные параметры, полученные с мобильного устройства.&lt;br /&gt;
&lt;br /&gt;
=== Что фиксируется автоматически ===&lt;br /&gt;
&lt;br /&gt;
Для каждого веб-запроса SDK фиксирует:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;URL&amp;#039;&amp;#039;&amp;#039; запроса&lt;br /&gt;
* Метод &amp;#039;&amp;#039;&amp;#039;HTTP&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;GET&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;POST&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;PUT&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;DELETE&amp;#039;&amp;#039;&amp;#039; и т. д.)&lt;br /&gt;
* Код состояния ответа&lt;br /&gt;
* Размер запроса и ответа (отправлено/получено в байтах)&lt;br /&gt;
* Продолжительность запроса&lt;br /&gt;
* Ошибки (в случае неудачи запроса)&lt;br /&gt;
&lt;br /&gt;
Собранные данные будут структурированы и представлены в соответствии с полями, указанными в &amp;lt;code&amp;gt;request.*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Поддерживаемые API ===&lt;br /&gt;
&lt;br /&gt;
Автоматизированные измерительные приборы работают со следующими компонентами:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;URLSession.dataTask(with:completionHandler:)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;URLSession.downloadTask(with:completionHandler:)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;URLSession.uploadTask(with:from:completionHandler:)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Варианты асинхронного выполнения с использованием &amp;lt;code&amp;gt;async/await&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;URLSession.data(from:)&amp;lt;/code&amp;gt; и т. д.)&lt;br /&gt;
* &amp;lt;code&amp;gt;NSURLRequest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NSURLConnection&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NSURLProtocol&amp;lt;/code&amp;gt;&lt;br /&gt;
* Запросы &amp;lt;code&amp;gt;WKWebView&amp;lt;/code&amp;gt;&lt;br /&gt;
* Удобные методы &amp;lt;code&amp;gt;NSData&amp;lt;/code&amp;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;HTTP(S)&amp;#039;&amp;#039;&amp;#039;, не поддерживаются.&lt;br /&gt;
* Запросы стороннего фреймворка могут не поддерживаться инструментами мониторинга.&lt;br /&gt;
* Мы не рекомендуем использовать несколько инструментов мониторинга одновременно с включенной функцией отслеживания сбоев или инструментирования веб-запросов. Это может привести к проблемам совместимости, отображению неверной или некорректной информации, а также к потере данных мониторинга и сбоев. Тем не менее, если вы все же решите это сделать, проверьте совместимость этих инструментов с помощью ручного тестирования.&lt;br /&gt;
&lt;br /&gt;
Чтобы использовать Ключ-АСТРОМ и &amp;#039;&amp;#039;&amp;#039;Firebase&amp;#039;&amp;#039;&amp;#039; одновременно, выполните одно из следующих действий.&lt;br /&gt;
&lt;br /&gt;
* Полностью отключите мониторинг производительности &amp;#039;&amp;#039;&amp;#039;Firebase&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Отключите автоматическую проверку веб-запросов в ЕдиномАгенте для &amp;#039;&amp;#039;&amp;#039;iOS&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Следуйте только одному из описанных выше подходов; не выполняйте оба действия одновременно.&lt;br /&gt;
&lt;br /&gt;
Для одновременного использования Ключ-АСТРОМ и &amp;#039;&amp;#039;&amp;#039;mPaaS&amp;#039;&amp;#039;&amp;#039; выполните одно из следующих действий.&lt;br /&gt;
&lt;br /&gt;
* Отключите автоматическую проверку веб-запросов в ЕдиномАгенте для &amp;#039;&amp;#039;&amp;#039;iOS&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Не используйте фреймворк &amp;#039;&amp;#039;&amp;#039;MPNebulaAdapter&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;DTXInstrumentWebRequestTiming&amp;lt;/code&amp;gt; в значение &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; в файле &amp;lt;code&amp;gt;Info.plist&amp;lt;/code&amp;gt; вашего приложения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;key&amp;gt;DTXInstrumentWebRequestTiming&amp;lt;/key&amp;gt;&lt;br /&gt;
&amp;lt;false/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;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;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Тип запроса !! Тип измерительного прибора !! DTXInstrumentWebRequestTiming&lt;br /&gt;
|-&lt;br /&gt;
| HTTP(S) || Вариант А: Авто || true&lt;br /&gt;
|-&lt;br /&gt;
| HTTP(S) || Вариант B: Ручной || false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Нельзя комбинировать автоматическую и ручную инструментацию для одного и того же &amp;#039;&amp;#039;&amp;#039;HTTP(S)&amp;#039;&amp;#039;&amp;#039; запроса.&lt;br /&gt;
&lt;br /&gt;
== Контекст трассировки W3C для связи между фронтендом и бэкендом ==&lt;br /&gt;
&lt;br /&gt;
SDK поддерживает добавление контекста трассировки &amp;#039;&amp;#039;&amp;#039;W3C&amp;#039;&amp;#039;&amp;#039;, который позволяет связывать мобильные запросы с серверными службами. Подробнее см. раздел «Связывание фронтенда и бэкенда с использованием контекста трассировки W3C».&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое распространение заголовка контекста трассировки ===&lt;br /&gt;
&lt;br /&gt;
В большинстве случаев вам не нужно самостоятельно устанавливать заголовки контекста трассировки &amp;#039;&amp;#039;&amp;#039;W3C&amp;#039;&amp;#039;&amp;#039;. Когда включена автоматическая инструментация веб-запросов, ЕдиныйАгент проверяет каждый исходящий запрос и решает, следует ли генерировать, сохранять или оставлять заголовки контекста трассировки без изменений, основываясь на обнаруженных данных.&lt;br /&gt;
&lt;br /&gt;
==== Отсутствуют заголовки (типичный случай) ====&lt;br /&gt;
&lt;br /&gt;
Если запрос не содержит заголовков трассировки, ЕдиныйАгент генерирует новый действительный &amp;lt;code&amp;gt;traceparent&amp;lt;/code&amp;gt; и добавляет соответствующую запись &amp;lt;code&amp;gt;tracestate&amp;lt;/code&amp;gt; с контекстом, специфичным для Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
Это позволяет установить корреляцию между мобильным запросом и трассировкой на стороне сервиса. См. раздел «Связь между фронтендом и бэкендом».&lt;br /&gt;
&lt;br /&gt;
==== Существующий действительный &amp;lt;code&amp;gt;traceparent&amp;lt;/code&amp;gt; заголовок ====&lt;br /&gt;
&lt;br /&gt;
Если запрос уже содержит действительный идентификатор поставщика &amp;lt;code&amp;gt;traceparent&amp;lt;/code&amp;gt;, ЕдиныйАгент сохраняет его и обновляет &amp;lt;code&amp;gt;tracestate&amp;lt;/code&amp;gt;, добавляя информацию, специфичную для Ключ-АСТРОМ, без перезаписи существующих записей о поставщике.&lt;br /&gt;
&lt;br /&gt;
Если общий размер данных &amp;lt;code&amp;gt;tracestate&amp;lt;/code&amp;gt; станет слишком большим, ЕдиныйАгент может сократить количество записей, чтобы они оставались в пределах ограничений &amp;#039;&amp;#039;&amp;#039;W3C&amp;#039;&amp;#039;&amp;#039;. Данные Ключ-АСТРОМ сохраняются, когда это возможно.&lt;br /&gt;
&lt;br /&gt;
=== Отключить автоматическое распространение контекста трассировки ===&lt;br /&gt;
&lt;br /&gt;
Если вы не хотите, чтобы заголовки контекста трассировки &amp;#039;&amp;#039;&amp;#039;W3C&amp;#039;&amp;#039;&amp;#039; автоматически добавлялись к исходящим запросам, вы можете отключить эту функцию.&lt;br /&gt;
&lt;br /&gt;
# Перейдите в раздел &amp;#039;&amp;#039;&amp;#039;Ключевые показатели опыта&amp;#039;&amp;#039;&amp;#039; &amp;gt; &amp;#039;&amp;#039;&amp;#039;Обзор&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Выберите &amp;#039;&amp;#039;&amp;#039;Мобильные устройства&amp;#039;&amp;#039;&amp;#039;, чтобы просмотреть все мобильные версии сайта.&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;
# Отключите функцию &amp;#039;&amp;#039;&amp;#039;Включить связь между фронтендом и бэкендом через контекст трассировки W3C&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Передача заголовков контекста трассировки вручную ===&lt;br /&gt;
&lt;br /&gt;
Если вы используете собственный сетевой стек, вы можете самостоятельно передавать заголовки &amp;#039;&amp;#039;&amp;#039;W3C Trace Context&amp;#039;&amp;#039;&amp;#039; и при этом сопоставлять запрос с распределенными трассировками Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
Используйте &amp;lt;code&amp;gt;Astromkey.generateTraceContext(traceparent:tracestate:)&amp;lt;/code&amp;gt; (Swift) / &amp;lt;code&amp;gt;generateTraceContext:tracestate:&amp;lt;/code&amp;gt; (Objective-C) для создания или обогащения контекста трассировки в соответствии с официальной спецификацией &amp;#039;&amp;#039;&amp;#039;W3C Trace Context&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
* Если значение &amp;lt;code&amp;gt;traceparent&amp;lt;/code&amp;gt; равно &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;, ЕдиныйАгент генерирует новый &amp;lt;code&amp;gt;traceparent&amp;lt;/code&amp;gt; и соответствующий &amp;lt;code&amp;gt;tracestate&amp;lt;/code&amp;gt; (включая информацию, специфичную для поставщика Ключ-АСТРОМ).&lt;br /&gt;
* Если &amp;lt;code&amp;gt;traceparent&amp;lt;/code&amp;gt; присутствует и действителен, ЕдиныйАгент сохраняет его и дополняет &amp;lt;code&amp;gt;tracestate&amp;lt;/code&amp;gt; информацией, специфичной для поставщика Ключ-АСТРОМ (без перезаписи существующих записей о поставщике).&lt;br /&gt;
* Если контекст трассировки создать не удаётся (например, из-за недопустимости &amp;lt;code&amp;gt;traceparent&amp;lt;/code&amp;gt; или запрета на захват/тегирование), API возвращает значение &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;, и изменять заголовки запроса не следует.&lt;br /&gt;
&lt;br /&gt;
Затем вы можете повторно использовать полученные данные &amp;lt;code&amp;gt;traceparent&amp;lt;/code&amp;gt; для сопоставления событий веб-запроса, зарегистрированных вручную.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Swift&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import Astromkey&lt;br /&gt;
&lt;br /&gt;
var request = URLRequest(url: URL(string: &amp;quot;https://api.example.com/data&amp;quot;)!)&lt;br /&gt;
&lt;br /&gt;
// Считываем существующие заголовки (если таковые имеются)&lt;br /&gt;
let existingTraceparent = request.value(forHTTPHeaderField: &amp;quot;traceparent&amp;quot;)&lt;br /&gt;
let existingTracestate = request.value(forHTTPHeaderField: &amp;quot;tracestate&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
// Генерация/обогащение контекста трассировки&lt;br /&gt;
var traceparentForReporting: String?&lt;br /&gt;
if let ctx = Astromkey.generateTraceContext(existingTraceparent, tracestate: existingTracestate) {&lt;br /&gt;
    request.setValue(ctx.traceparent, forHTTPHeaderField: &amp;quot;traceparent&amp;quot;)&lt;br /&gt;
    request.setValue(ctx.tracestate, forHTTPHeaderField: &amp;quot;tracestate&amp;quot;)&lt;br /&gt;
    traceparentForReporting = ctx.traceparent&lt;br /&gt;
} else {&lt;br /&gt;
    // Изменения не должны применяться, если контекст не может быть создан (например, недопустимый traceparent)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ...здесь выполните свой HTTP-запрос...&lt;br /&gt;
&lt;br /&gt;
let requestData = DTXHttpRequestEventData(url: request.url!.absoluteString, method: request.httpMethod ?? &amp;quot;GET&amp;quot;)&lt;br /&gt;
    .withDuration(duration)&lt;br /&gt;
    .withStatusCode(statusCode)&lt;br /&gt;
&lt;br /&gt;
if let traceparent = traceparentForReporting {&lt;br /&gt;
    requestData.withTraceparentHeader(traceparent)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Astromkey.sendHttpRequestEvent(requestData)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Objective-C&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@import Astromkey;&lt;br /&gt;
&lt;br /&gt;
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@&amp;quot;https://api.example.com/data&amp;quot;]];&lt;br /&gt;
&lt;br /&gt;
// Считываем существующие заголовки (если таковые имеются)&lt;br /&gt;
NSString *existingTraceparent = [request valueForHTTPHeaderField:@&amp;quot;traceparent&amp;quot;];&lt;br /&gt;
NSString *existingTracestate = [request valueForHTTPHeaderField:@&amp;quot;tracestate&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
// Генерация/обогащение контекста трассировки&lt;br /&gt;
NSString *traceparentForReporting = nil;&lt;br /&gt;
DTXTraceContext *ctx = [Astromkey generateTraceContext:existingTraceparent tracestate:existingTracestate];&lt;br /&gt;
if (ctx) {&lt;br /&gt;
    [request setValue:ctx.traceparent forHTTPHeaderField:@&amp;quot;traceparent&amp;quot;];&lt;br /&gt;
    [request setValue:ctx.tracestate forHTTPHeaderField:@&amp;quot;tracestate&amp;quot;];&lt;br /&gt;
    traceparentForReporting = ctx.traceparent;&lt;br /&gt;
} else {&lt;br /&gt;
    // Изменения не должны применяться, если контекст не может быть создан (например, недопустимый traceparent)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ...здесь выполните свой HTTP-запрос...&lt;br /&gt;
&lt;br /&gt;
DTXHttpRequestEventData *requestData = [[[[DTXHttpRequestEventData alloc]&lt;br /&gt;
    initWithURL:request.URL.absoluteString method:request.HTTPMethod]&lt;br /&gt;
    withDuration:@(duration)]&lt;br /&gt;
    withStatusCode:@(statusCode)];&lt;br /&gt;
&lt;br /&gt;
if (traceparentForReporting) {&lt;br /&gt;
    [requestData withTraceparentHeader:traceparentForReporting];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[Astromkey sendHttpRequestEvent:requestData];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сообщайте о веб-запросах вручную ==&lt;br /&gt;
&lt;br /&gt;
Для сетевых библиотек, не охваченных автоматической инструментацией, вы можете вручную сообщать о веб-запросах, используя &amp;lt;code&amp;gt;DTXHttpRequestEventData&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Основное использование ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Swift&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import Astromkey&lt;br /&gt;
&lt;br /&gt;
// Создание данных запроса с указанием URL-адреса и метода HTTP&lt;br /&gt;
let requestData = DTXHttpRequestEventData(url: &amp;quot;https://api.example.com/data&amp;quot;, method: &amp;quot;GET&amp;quot;)&lt;br /&gt;
    .withDuration(250) // Длительность в миллисекундах&lt;br /&gt;
    .withStatusCode(200) // Код состояния HTTP&lt;br /&gt;
    .withBytesSent(128) // Отправлено байтов&lt;br /&gt;
    .withBytesReceived(4096) // Получено байтов&lt;br /&gt;
&lt;br /&gt;
// Отправка события веб-запроса&lt;br /&gt;
Astromkey.sendHttpRequestEvent(requestData)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Objective-C&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@import Astromkey;&lt;br /&gt;
&lt;br /&gt;
// Создание данных запроса с указанием URL-адреса и метода HTTP&lt;br /&gt;
DTXHttpRequestEventData *requestData = [[[[[[DTXHttpRequestEventData alloc]&lt;br /&gt;
    initWithURL:@&amp;quot;https://api.example.com/data&amp;quot; method:@&amp;quot;GET&amp;quot;]&lt;br /&gt;
    withDuration:@250] // Длительность в миллисекундах&lt;br /&gt;
    withStatusCode:@200] // Код состояния HTTP&lt;br /&gt;
    withBytesSent:@128] // Отправлено байтов&lt;br /&gt;
    withBytesReceived:@4096]; // Получено байтов&lt;br /&gt;
&lt;br /&gt;
// Отправка события веб-запроса&lt;br /&gt;
[Astromkey sendHttpRequestEvent:requestData];&lt;br /&gt;
&amp;lt;/pre&amp;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;Swift&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let requestData = DTXHttpRequestEventData(url: &amp;quot;https://api.example.com/data&amp;quot;, method: &amp;quot;POST&amp;quot;)&lt;br /&gt;
    .withDuration(1500)&lt;br /&gt;
    .withError(error as NSError)&lt;br /&gt;
&lt;br /&gt;
Astromkey.sendHttpRequestEvent(requestData)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Objective-C&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTXHttpRequestEventData *requestData = [[[[DTXHttpRequestEventData alloc]&lt;br /&gt;
    initWithURL:@&amp;quot;https://api.example.com/data&amp;quot; method:@&amp;quot;POST&amp;quot;]&lt;br /&gt;
    withDuration:@1500]&lt;br /&gt;
    withError:error];&lt;br /&gt;
&lt;br /&gt;
[Astromkey sendHttpRequestEvent:requestData];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Включить контекст трассировки ===&lt;br /&gt;
&lt;br /&gt;
Для сопоставления запросов, сообщенных вручную, с распределенными трассировками, добавьте заголовок &amp;lt;code&amp;gt;traceparent&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Совмещение ручной и автоматической передачи контекста трассировки для одного и того же запроса не поддерживается. Не устанавливайте заголовок &amp;lt;code&amp;gt;traceparent&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;tracestate&amp;lt;/code&amp;gt; самостоятельно, пока активна автоматическая инструментация веб-запросов. Чтобы установить заголовки вручную, сначала отключите автоматическую передачу контекста трассировки.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Swift&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Сообщить о событии с помощью трассировки (traceparent)&lt;br /&gt;
let requestData = DTXHttpRequestEventData(url: url, method: &amp;quot;GET&amp;quot;)&lt;br /&gt;
    .withDuration(duration)&lt;br /&gt;
    .withStatusCode(statusCode)&lt;br /&gt;
    .withTraceparentHeader(traceparent)&lt;br /&gt;
&lt;br /&gt;
Astromkey.sendHttpRequestEvent(requestData)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Objective-C&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Сообщить о событии с помощью трассировки (traceparent)&lt;br /&gt;
DTXHttpRequestEventData *requestData = [[[[[DTXHttpRequestEventData alloc]&lt;br /&gt;
    initWithURL:url method:@&amp;quot;GET&amp;quot;]&lt;br /&gt;
    withDuration:duration]&lt;br /&gt;
    withStatusCode:statusCode]&lt;br /&gt;
    withTraceparentHeader:traceparent];&lt;br /&gt;
&lt;br /&gt;
[Astromkey sendHttpRequestEvent:requestData];&lt;br /&gt;
&amp;lt;/pre&amp;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;Swift&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let requestData = DTXHttpRequestEventData(url: url, method: &amp;quot;POST&amp;quot;)&lt;br /&gt;
    .withDuration(300)&lt;br /&gt;
    .withStatusCode(201)&lt;br /&gt;
    .addEventProperty(&amp;quot;event_properties.api_version&amp;quot;, value: &amp;quot;v2&amp;quot;)&lt;br /&gt;
    .addEventProperty(&amp;quot;event_properties.endpoint&amp;quot;, value: &amp;quot;users&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Astromkey.sendHttpRequestEvent(requestData)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Objective-C&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTXHttpRequestEventData *requestData = [[[[[[DTXHttpRequestEventData alloc]&lt;br /&gt;
    initWithURL:url method:@&amp;quot;POST&amp;quot;]&lt;br /&gt;
    withDuration:@300]&lt;br /&gt;
    withStatusCode:@201]&lt;br /&gt;
    addEventProperty:@&amp;quot;event_properties.api_version&amp;quot; value:@&amp;quot;v2&amp;quot;]&lt;br /&gt;
    addEventProperty:@&amp;quot;event_properties.endpoint&amp;quot; value:@&amp;quot;users&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
[Astromkey sendHttpRequestEvent:requestData];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ключи пользовательских свойств должны иметь префикс &amp;lt;code&amp;gt;event_properties.&amp;lt;/code&amp;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;Swift&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let subscriber = Astromkey.addHttpEventModifier { event, context in&lt;br /&gt;
    // Получение сведений о запросе из контекста&lt;br /&gt;
    if let request = context?.request {&lt;br /&gt;
        // Добавьте пользовательские заголовки или информацию запроса в качестве свойств&lt;br /&gt;
        if let customHeader = request.value(forHTTPHeaderField: &amp;quot;X-Custom-Header&amp;quot;) {&lt;br /&gt;
            event.fields[&amp;quot;event_properties.custom_header&amp;quot;] = customHeader&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Доступ к подробностям ответа&lt;br /&gt;
    if let httpResponse = context?.response as? HTTPURLResponse {&lt;br /&gt;
        if let serverTiming = httpResponse.value(forHTTPHeaderField: &amp;quot;Server-Timing&amp;quot;) {&lt;br /&gt;
            event.fields[&amp;quot;event_properties.server_timing&amp;quot;] = serverTiming&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Возвращает событие изменения (или nil, чтобы его отбросить)&lt;br /&gt;
    return event&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Objective-C&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTXModifyEventSubscriber *subscriber = [Astromkey addHttpEventModifier:^DTXModifyableEvent *(DTXModifyableEvent *event, DTXHttpRequestEventContext *context) {&lt;br /&gt;
    // Получение сведений о запросе из контекста&lt;br /&gt;
    if (context.request) {&lt;br /&gt;
        // Добавьте пользовательские заголовки или информацию запроса в качестве свойств&lt;br /&gt;
        NSString *customHeader = [context.request valueForHTTPHeaderField:@&amp;quot;X-Custom-Header&amp;quot;];&lt;br /&gt;
        if (customHeader) {&lt;br /&gt;
            event.fields[@&amp;quot;event_properties.custom_header&amp;quot;] = customHeader;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Доступ к подробностям ответа&lt;br /&gt;
    if ([context.response isKindOfClass:[NSHTTPURLResponse class]]) {&lt;br /&gt;
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)context.response;&lt;br /&gt;
        NSString *serverTiming = httpResponse.allHeaderFields[@&amp;quot;Server-Timing&amp;quot;];&lt;br /&gt;
        if (serverTiming) {&lt;br /&gt;
            event.fields[@&amp;quot;event_properties.server_timing&amp;quot;] = serverTiming;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Возвращает событие изменения (или nil, чтобы его отбросить)&lt;br /&gt;
    return event;&lt;br /&gt;
}];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Доступные свойства контекста ===&lt;br /&gt;
&lt;br /&gt;
Предоставляет &amp;lt;code&amp;gt;DTXHttpRequestEventContext&amp;lt;/code&amp;gt; доступ к:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Свойство !! Тип !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;request&amp;lt;/code&amp;gt; || URLRequest || Первоначальный запрос&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; || URLResponse? || Ответ сервера (если имеется)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;responseBody&amp;lt;/code&amp;gt; || Data? || Данные ответа (если получены)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; || NSError? || Сообщение об ошибке (если запрос не удался)&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;Swift&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Astromkey.removeEventModifier(subscriber)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Objective-C&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Astromkey removeEventModifier:subscriber];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Фильтрация запросов ===&lt;br /&gt;
&lt;br /&gt;
Верните значение &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; из модификатора, чтобы предотвратить отправку события:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Swift&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let subscriber = Astromkey.addHttpEventModifier { event, context in&lt;br /&gt;
    // Не сообщать о запросах к точкам аналитики&lt;br /&gt;
    if let url = context?.request.url?.absoluteString,&lt;br /&gt;
       url.contains(&amp;quot;analytics.example.com&amp;quot;) {&lt;br /&gt;
        return nil&lt;br /&gt;
    }&lt;br /&gt;
    return event&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Objective-C&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTXModifyEventSubscriber *subscriber = [Astromkey addHttpEventModifier:^DTXModifyableEvent *(DTXModifyableEvent *event, DTXHttpRequestEventContext *context) {&lt;br /&gt;
    // Не сообщать о запросах к точкам аналитики&lt;br /&gt;
    NSString *url = context.request.URL.absoluteString;&lt;br /&gt;
    if (url &amp;amp;&amp;amp; [url containsString:@&amp;quot;analytics.example.com&amp;quot;]) {&lt;br /&gt;
        return nil;&lt;br /&gt;
    }&lt;br /&gt;
    return event;&lt;br /&gt;
}];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
</feed>