Имя свойства |
Description |
Diagnostic-Id |
Уникальный идентификатор внешнего вызова от производителя к очереди. Ознакомьтесь с родительским заголовком трассировки трассировки W3C Trace-Context для формата |
Автоматическая трассировка клиента .NET служебной шины
Класс ServiceBusProcessor
клиента служебной шины Microsoft Azure для .NET предоставляет точки инструментария трассировки, которые можно обработать с помощью систем трассировки или фрагмента кода клиента. Инструментирование позволяет отслеживать все вызовы в службу обмена сообщениями служебной шины со стороны клиента. Если обработка сообщений выполняется с помощью ProcessMessageAsync
ServiceBusProcessor
(шаблона обработчика сообщений), она также будет инструментирована.
Отслеживание с помощью Azure Application Insights
Microsoft Application Insights предоставляет широкие возможности мониторинга производительности, включая автоматическое создание запросов и отслеживание зависимостей.
В зависимости от типа проекта установите пакет SDK для Application Insights:
- ASP.NET: установите версию 2.5-beta2 или более позднюю.
- ASP.NET Core: установите версию 2.2.0-beta2 или более позднюю.
Эти ссылки содержат подробные сведения об установке пакета SDK, создании ресурсов и настройке пакета SDK (при необходимости). Сведения для приложений без ASP.NET см. в статье Application Insights for .NET console applications (Application Insights для консольных приложений .NET).
Если вы используете ProcessMessageAsync
ServiceBusProcessor
(шаблона обработчика сообщений) для обработки сообщений, то обработка сообщений также будет инструментирована. Все вызовы служебной шины, выполненные вашей службой, автоматически отслеживаются и связываются с другими элементами телеметрии. В противном случае ознакомьтесь с указанным ниже примером для отслеживания обработки сообщений вручную.
Обработка сообщений трассировки
async Task ProcessAsync(ProcessMessageEventArgs args)
{
ServiceBusReceivedMessage message = args.Message;
if (message.ApplicationProperties.TryGetValue("Diagnostic-Id", out var objectId) && objectId is string diagnosticId)
{
var activity = new Activity("ServiceBusProcessor.ProcessMessage");
activity.SetParentId(diagnosticId);
// If you're using Microsoft.ApplicationInsights package version 2.6-beta or higher, you should call StartOperation<RequestTelemetry>(activity) instead
using (var operation = telemetryClient.StartOperation<RequestTelemetry>("Process", activity.RootId, activity.ParentId))
{
telemetryClient.TrackTrace("Received message");
try
{
// process message
}
catch (Exception ex)
{
telemetryClient.TrackException(ex);
operation.Telemetry.Success = false;
throw;
}
telemetryClient.TrackTrace("Done");
}
}
}
В этом примере телеметрия запроса выводится для каждого обработанного сообщения вместе с меткой времени, продолжительностью и результатом (успешно). Данные телеметрии также имеют набор свойств корреляции. Вложенные трассировки и исключения, обнаруженные во время обработки сообщения, также имеют свойства корреляции, представляя их в качестве дочерних элементов RequestTelemetry
.
Если вы отправили вызовы к поддерживаемым внешним компонентам во время обработки сообщения, они также будут автоматически отслеживаться и коррелироваться. Дополнительные сведения о выполнении отслеживания и корреляции вручную см. в статье Отслеживание пользовательских операций с помощью пакета SDK Application Insights для .NET.
Если кроме пакета SDK для Application Insights вы используете какой-либо внешний код, при просмотре журналов Application Insights может увеличиться время ожидания.
![Более длительное время ожидания для журнала Application Insights](media/service-bus-end-to-end-tracing/longer-duration.png)
Это не значит, что во время получения сообщения произошла задержка. В этом сценарии сообщение уже получено, поскольку оно передается в качестве параметра в код пакета SDK. Кроме того, тег name в журналах App Insights (Process) указывает на то, что сообщение теперь обрабатывается с помощью внешнего кода обработки событий. Эта проблема не связана с Azure. Наоборот, эти метрики указывают на эффективность вашего внешнего кода при условии, что сообщение уже получено из служебной шины.
Отслеживание с помощью OpenTelemetry
Клиентская библиотека .NET версии 7.5.0 и выше Служебной шины поддерживает OpenTelemetry в экспериментальном режиме. Дополнительные сведения см. в статье "Распределенная трассировка" в пакете SDK для .NET.
Отслеживание без системы трассировки
Если система трассировки не поддерживает автоматическое отслеживание вызовов служебная шина, вы можете добавить такую поддержку в систему трассировки или в приложение. В этом разделе описываются события диагностики, отправленные клиентом .NET служебной шины.
Клиент .NET служебной шины инструментируется с помощью примитивов трассировки .NET System.Diagnostics.Activity и System.Diagnostics.DiagnosticSource.
Activity
используется как контекст трассировки, в то время как DiagnosticSource
— это механизм уведомлений.
Если для событий DiagnosticSource нет прослушивателя, инструментирование будет отключено, чтобы за него не взималась плата. DiagnosticSource передает весь контроль прослушивателю:
- прослушиватель определяет, какие источники и события следует прослушивать;
- прослушиватель контролирует частоту событий и выборку;
- события отправляются вместе с полезными данными, которые предоставляют полный контекст, чтобы вы могли получить доступ к объекту сообщения во время события и изменить его.
Ознакомьтесь с руководством пользователя DiagnosticSource, прежде чем приступить к реализации.
Давайте создадим прослушиватель для событий служебной шины в приложении ASP.NET Core, который записывает журналы с помощью Microsoft.Extension.Logger.
Он использует библиотеку System.Reactive.Core, чтобы подписаться на DiagnosticSource (на DiagnosticSource можно также легко подписаться без прослушивателя).
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory factory, IApplicationLifetime applicationLifetime)
{
// configuration...
var serviceBusLogger = factory.CreateLogger("Azure.Messaging.ServiceBus");
IDisposable innerSubscription = null;
IDisposable outerSubscription = DiagnosticListener.AllListeners.Subscribe(delegate (DiagnosticListener listener)
{
// subscribe to the Service Bus DiagnosticSource
if (listener.Name == "Azure.Messaging.ServiceBus")
{
// receive event from Service Bus DiagnosticSource
innerSubscription = listener.Subscribe(delegate (KeyValuePair<string, object> evnt)
{
// Log operation details once it's done
if (evnt.Key.EndsWith("Stop"))
{
Activity currentActivity = Activity.Current;
serviceBusLogger.LogInformation($"Operation {currentActivity.OperationName} is finished, Duration={currentActivity.Duration}, Id={currentActivity.Id}, StartTime={currentActivity.StartTimeUtc}");
}
});
}
});
applicationLifetime.ApplicationStopping.Register(() =>
{
outerSubscription?.Dispose();
innerSubscription?.Dispose();
});
}
В этом примере прослушиватель записывает длительность, результат, уникальный идентификатор и время начала для каждой операции служебной шины.
События
Все события будут иметь следующие свойства, соответствующие спецификации OpenTelemetry: https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/api.md.
message_bus.destination
— очередь, раздел и путь к подписке;
peer.address
— пространство полных имен;
kind
— производитель, потребитель или клиент (производитель используется при отправке сообщений, потребитель — при получении, а клиент —при сопоставлении);
component
– servicebus
Все события также имеют Entity
и Endpoint
свойства.
Entity
— имя сущности (очередь, раздел и т. д.)
Endpoint
— URL-адрес конечной точки служебной шины.
Инструментированные операции
Ниже приведен полный список инструментированных операций.
Имя операции |
Отслеживаемый API |
ServiceBusSender.Send |
ServiceBusSender.SendMessageAsync ServiceBusSender.SendMessagesAsync |
ServiceBusSender.Schedule |
ServiceBusSender.ScheduleMessageAsync ServiceBusSender.ScheduleMessagesAsync |
ServiceBusSender.Cancel |
ServiceBusSender.CancelScheduledMessageAsync ServiceBusSender.CancelScheduledMessagesAsync |
ServiceBusReceiver.Receive |
ServiceBusReceiver.ReceiveMessageAsync ServiceBusReceiver.ReceiveMessagesAsync |
ServiceBusReceiver.ReceiveDeferred |
ServiceBusReceiver.ReceiveDeferredMessagesAsync |
ServiceBusReceiver.Peek |
ServiceBusReceiver.PeekMessageAsync ServiceBusReceiver.PeekMessagesAsync |
ServiceBusReceiver.Abandon |
ServiceBusReceiver.AbandonMessagesAsync |
ServiceBusReceiver.Complete |
ServiceBusReceiver.CompleteMessagesAsync |
ServiceBusReceiver.DeadLetter |
ServiceBusReceiver.DeadLetterMessagesAsync |
ServiceBusReceiver.Defer |
ServiceBusReceiver.DeferMessagesAsync |
ServiceBusReceiver.RenewMessageLock |
ServiceBusReceiver.RenewMessageLockAsync |
ServiceBusSessionReceiver.RenewSessionLock |
ServiceBusSessionReceiver.RenewSessionLockAsync |
ServiceBusSessionReceiver.GetSessionState |
ServiceBusSessionReceiver.GetSessionStateAsync |
ServiceBusSessionReceiver.SetSessionState |
ServiceBusSessionReceiver.SetSessionStateAsync |
ServiceBusProcessor.ProcessMessage |
Для обратного вызова процессора задано значение ServiceBusProcessor. Свойство ProcessMessageAsync |
ServiceBusSessionProcessor.ProcessSessionMessage |
Для обратного вызова процессора задано значение ServiceBusSessionProcessor. Свойство ProcessMessageAsync |
Фильтрация и выборка
В некоторых случаях предпочтительно зарегистрировать только часть событий, чтобы снизить потери производительности и уровень использования хранилища. Вы можете зарегистрировать только события Stop (как показано в предыдущем примере) или процент выборок событий.
DiagnosticSource
предоставляет способ реализации этих возможностей с помощью предиката IsEnabled
. Дополнительные сведения см. в разделе Фильтрация на основе контекста.
IsEnabled
может вызываться несколько раз для одной операции, чтобы свести к минимуму влияние на производительность.
IsEnabled
вызывается в следующей последовательности:
IsEnabled(<OperationName>, string entity, null)
, например, IsEnabled("ServiceBusSender.Send", "MyQueue1")
. Обратите внимание, что в конце нет события Start или Stop. Используйте его, чтобы отфильтровать конкретные операции или очереди. Если метод обратного вызова возвращает значение false
, события для операции не отправляются.
- Для операций Process и ProcessSession вы также получите обратный вызов
IsEnabled(<OperationName>, string entity, Activity activity)
. С помощью него можно фильтровать события на основе activity.Id
или свойства тегов.
IsEnabled(<OperationName>.Start)
, например, IsEnabled("ServiceBusSender.Send.Start")
. Проверяет, следует ли вызывать событие Start. Результат влияет только на событие Start, но дальнейшее инструментирование от него не зависит.
Для события Stop отсутствует IsEnabled
.
Если результатом некоторых операций является исключение, вызывается IsEnabled("ServiceBusSender.Send.Exception")
. Вы можете только подписаться на события Exception и запретить остальное инструментирование. В этом случае вам по-прежнему следует обработать такие исключения. После отключения других операций инструментирования не следует ожидать, что контекст трассировки будет передаваться с сообщением от потребителя к производителю.
Вы также можете использовать IsEnabled
, который также реализует стратегии выборки. Выборка на основе Activity.Id
или Activity.RootId
гарантирует согласованную выборку на всех ресурсах (при условии, что она распространяется системой трассировки или вашим кодом).
При наличии нескольких прослушивателей DiagnosticSource
для одного источника будет достаточно, чтобы событие принял один из них, поэтому IsEnabled
вызывать необязательно.
30 сентября 2026 г. мы удалим библиотеки пакета SDK Служебная шина Azure WindowsAzure.ServiceBus, Microsoft.Azure.ServiceBus и com.microsoft.azure.servicebus, которые не соответствуют рекомендациям по пакету SDK Azure. Мы также завершим поддержку протокола SBMP, поэтому вы больше не сможете использовать этот протокол после 30 сентября 2026 года. Перейдите в последние библиотеки пакета SDK Azure, которые предлагают критически важные обновления системы безопасности и улучшенные возможности до этой даты.
Хотя старые библиотеки по-прежнему могут использоваться после 30 сентября 2026 года, они больше не будут получать официальную поддержку и обновления от Майкрософт. Дополнительные сведения см. в объявлении о выходе на пенсию в службу поддержки.
Имя свойства |
Description |
Diagnostic-Id |
Уникальный идентификатор внешнего вызова от производителя к очереди. Обоснование, рекомендации и сведения о формате см. в разделе Request-Id протокола HTTP. |
Correlation-Context |
Контекст операции, который распространяется на все службы, участвующие в обработке операции. Дополнительные сведения см. в разделе Correlation-Context протокола HTTP. |
Автоматическая трассировка клиента .NET служебной шины
Начиная с версии 3.0.0, клиент служебной шины Microsoft Azure для .NET предоставляет точки инструментария трассировки, которые можно обработать с помощью систем трассировки или фрагмента кода клиента.
Инструментирование позволяет отслеживать все вызовы в службу обмена сообщениями служебной шины со стороны клиента. Если обработка сообщений выполняется с помощью шаблона обработчика сообщений, она также будет инструментирована.
Отслеживание с помощью Azure Application Insights
Microsoft Application Insights предоставляет широкие возможности мониторинга производительности, включая автоматическое создание запросов и отслеживание зависимостей.
В зависимости от типа проекта установите пакет SDK для Application Insights:
- ASP.NET: установите версию 2.5-beta2 или более позднюю.
- ASP.NET Core: установите версию 2.2.0-beta2 или более позднюю.
Эти ссылки содержат подробные сведения об установке пакета SDK, создании ресурсов и настройке пакета SDK (при необходимости). Сведения для приложений без ASP.NET см. в статье Application Insights for .NET console applications (Application Insights для консольных приложений .NET).
Если вы используете шаблон обработчика сообщений для обработки, больше ничего делать не нужно: все вызовы служебной шины, выполненные вашей службой, автоматически отслеживаются и связываются с другими элементами телеметрии. В противном случае ознакомьтесь с указанным ниже примером для отслеживания обработки сообщений вручную.
Обработка сообщений трассировки
private readonly TelemetryClient telemetryClient;
async Task ProcessAsync(Message message)
{
var activity = message.ExtractActivity();
// If you're using Microsoft.ApplicationInsights package version 2.6-beta or higher, you should call StartOperation<RequestTelemetry>(activity) instead
using (var operation = telemetryClient.StartOperation<RequestTelemetry>("Process", activity.RootId, activity.ParentId))
{
telemetryClient.TrackTrace("Received message");
try
{
// process message
}
catch (Exception ex)
{
telemetryClient.TrackException(ex);
operation.Telemetry.Success = false;
throw;
}
telemetryClient.TrackTrace("Done");
}
}
В этом примере RequestTelemetry
выводится для каждого обработанного сообщения вместе с меткой времени, продолжительностью и результатом (успешно). Данные телеметрии также имеют набор свойств корреляции.
Вложенные трассировки и исключения, обнаруженные во время обработки сообщения, также имеют свойства корреляции, представляя их в качестве дочерних элементов RequestTelemetry
.
Если вы отправили вызовы к поддерживаемым внешним компонентам во время обработки сообщения, они также будут автоматически отслеживаться и коррелироваться. Дополнительные сведения о выполнении отслеживания и корреляции вручную см. в статье Отслеживание пользовательских операций с помощью пакета SDK Application Insights для .NET.
Если кроме пакета SDK для Application Insights вы используете какой-либо внешний код, при просмотре журналов Application Insights может увеличиться время ожидания.
![Более длительное время ожидания для журнала Application Insights](media/service-bus-end-to-end-tracing/longer-duration.png)
Это не значит, что во время получения сообщения произошла задержка. В этом сценарии сообщение уже получено, поскольку оно передается в качестве параметра в код пакета SDK. Кроме того, тег name в журналах App Insights (Process) указывает на то, что сообщение теперь обрабатывается с помощью внешнего кода обработки событий. Эта проблема не связана с Azure. Наоборот, эти метрики указывают на эффективность вашего внешнего кода при условии, что сообщение уже получено из служебной шины. См. этот файл в GitHub, чтобы узнать, где создается и назначается тег Process после получения сообщения от служебной шины.
Отслеживание без системы трассировки
Если система трассировки не поддерживает автоматическое отслеживание вызовов служебная шина, вы можете добавить такую поддержку в систему трассировки или в приложение. В этом разделе описываются события диагностики, отправленные клиентом .NET служебной шины.
Клиент .NET служебной шины инструментируется с помощью примитивов трассировки .NET System.Diagnostics.Activity и System.Diagnostics.DiagnosticSource.
Activity
используется как контекст трассировки, в то время как DiagnosticSource
— это механизм уведомлений.
Если для событий DiagnosticSource нет прослушивателя, инструментирование будет отключено, чтобы за него не взималась плата. DiagnosticSource передает весь контроль прослушивателю:
- прослушиватель определяет, какие источники и события следует прослушивать;
- прослушиватель контролирует частоту событий и выборку;
- события отправляются вместе с полезными данными, которые предоставляют полный контекст, чтобы вы могли получить доступ к объекту сообщения во время события и изменить его.
Ознакомьтесь с руководством пользователя DiagnosticSource, прежде чем приступить к реализации.
Давайте создадим прослушиватель для событий служебной шины в приложении ASP.NET Core, который записывает журналы с помощью Microsoft.Extension.Logger.
Он использует библиотеку System.Reactive.Core, чтобы подписаться на DiagnosticSource (на DiagnosticSource можно также легко подписаться без прослушивателя).
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory factory, IApplicationLifetime applicationLifetime)
{
// configuration...
var serviceBusLogger = factory.CreateLogger("Microsoft.Azure.ServiceBus");
IDisposable innerSubscription = null;
IDisposable outerSubscription = DiagnosticListener.AllListeners.Subscribe(delegate (DiagnosticListener listener)
{
// subscribe to the Service Bus DiagnosticSource
if (listener.Name == "Microsoft.Azure.ServiceBus")
{
// receive event from Service Bus DiagnosticSource
innerSubscription = listener.Subscribe(delegate (KeyValuePair<string, object> evnt)
{
// Log operation details once it's done
if (evnt.Key.EndsWith("Stop"))
{
Activity currentActivity = Activity.Current;
TaskStatus status = (TaskStatus)evnt.Value.GetProperty("Status");
serviceBusLogger.LogInformation($"Operation {currentActivity.OperationName} is finished, Duration={currentActivity.Duration}, Status={status}, Id={currentActivity.Id}, StartTime={currentActivity.StartTimeUtc}");
}
});
}
});
applicationLifetime.ApplicationStopping.Register(() =>
{
outerSubscription?.Dispose();
innerSubscription?.Dispose();
});
}
В этом примере прослушиватель записывает длительность, результат, уникальный идентификатор и время начала для каждой операции служебной шины.
События
Для каждой операции отправляются два события: запуск и остановка.
Скорее всего, вы заинтересованы только в событиях Stop. Они отображают результат операции, а также время начала и длительность в качестве свойств Activity.
Полезные данные события предоставляют прослушиватель с контекстом операции. Он реплицирует входящие параметры API и возвращаемое значение. Полезные данные события Stop имеют все свойства полезных данных события Start. Таким образом, вы можете полностью игнорировать событие Start.
Все события также имеют свойства Entity и Endpoint.
string Entity
— имя сущности (очередь, раздел и т. д.)
Uri Endpoint
— URL-адрес конечной точки служебной шины.
Каждое событие Stop имеет свойство Status
с асинхронной операцией TaskStatus
, с помощью которой оно завершилось. Для простоты она также указана в таблице ниже.
Ниже приведен полный список инструментированных операций.
Имя операции |
Отслеживаемый API |
Определенные свойства полезных данных |
Microsoft.Azure.ServiceBus.Send |
MessageSender.SendAsync |
IList<Message> Messages — список отправляемых сообщений. |
Microsoft.Azure.ServiceBus.ScheduleMessage |
MessageSender.ScheduleMessageAsync |
Message Message — обрабатываемое сообщение.
DateTimeOffset ScheduleEnqueueTimeUtc — смещение запланированных сообщений.
long SequenceNumber — порядковый номер запланированного сообщения (полезные данные события Stop). |
Microsoft.Azure.ServiceBus.Cancel |
MessageSender.CancelScheduledMessageAsync |
long SequenceNumber — Порядковый номер сообщения, который требуется отменить |
Microsoft.Azure.ServiceBus.Receive |
MessageReceiver.ReceiveAsync |
int RequestedMessageCount — максимальное количество сообщений, которые можно получить.
IList<Message> Messages — список полученных сообщений (полезные данные события Stop). |
Microsoft.Azure.ServiceBus.Peek |
MessageReceiver.PeekAsync |
int FromSequenceNumber — отправная точка, с которой нужно начинать просмотр сообщений.
int RequestedMessageCount — число извлекаемых сообщений.
IList<Message> Messages — список полученных сообщений (полезные данные события Stop). |
Microsoft.Azure.ServiceBus.ReceiveDeferred |
MessageReceiver.ReceiveDeferredMessageAsync |
IEnumerable<long> SequenceNumbers — список, содержащий порядковые номера для получения.
IList<Message> Messages — список полученных сообщений (полезные данные события Stop). |
Microsoft.Azure.ServiceBus.Complete |
MessageReceiver.CompleteAsync |
IList<string> LockTokens — список, содержащий маркеры блокировки соответствующих сообщений для выполнения. |
Microsoft.Azure.ServiceBus.Abandon |
MessageReceiver.AbandonAsync |
string LockToken — маркер блокировки соответствующего сообщения для отказа. |
Microsoft.Azure.ServiceBus.Defer |
MessageReceiver.DeferAsync |
string LockToken — маркер блокировки соответствующего сообщения для откладывания. |
Microsoft.Azure.ServiceBus.DeadLetter |
MessageReceiver.DeadLetterAsync |
string LockToken — маркер блокировки соответствующего сообщения для недоставленных сообщений. |
Microsoft.Azure.ServiceBus.RenewLock |
MessageReceiver.RenewLockAsync |
string LockToken — маркер блокировки соответствующего сообщения для продления блокировки.
DateTime LockedUntilUtc — новые дата и время истечения срока действия маркера блокировки в формате UTC. (Полезные данные события Stop) |
Microsoft.Azure.ServiceBus.Process |
Лямбда-функция обработчика сообщений, указанная в IReceiverClient.RegisterMessageHandler |
Message Message — обрабатываемое сообщение. |
Microsoft.Azure.ServiceBus.ProcessSession |
Лямбда-функция обработчика сеанса обмена сообщений, указанная в IQueueClient.RegisterSessionHandler |
Message Message — обрабатываемое сообщение.
IMessageSession Session — обрабатываемый сеанс. |
Microsoft.Azure.ServiceBus.AddRule |
SubscriptionClient.AddRuleAsync |
RuleDescription Rule — описание правила, которое определяет правило для добавления. |
Microsoft.Azure.ServiceBus.RemoveRule |
SubscriptionClient.RemoveRuleAsync |
string RuleName — имя правила для удаления. |
Microsoft.Azure.ServiceBus.GetRules |
SubscriptionClient.GetRulesAsync |
IEnumerable<RuleDescription> Rules — все правила, связанные с подпиской. (только полезные данные Stop) |
Microsoft.Azure.ServiceBus.AcceptMessageSession |
ISessionClient.AcceptMessageSessionAsync |
string SessionId — идентификатор сеанса, присутствующий в сообщениях. |
Microsoft.Azure.ServiceBus.GetSessionState |
IMessageSession.GetStateAsync |
string SessionId — идентификатор сеанса, присутствующий в сообщениях.
byte [] State — состояние сеанса (полезные данные события Stop). |
Microsoft.Azure.ServiceBus.SetSessionState |
IMessageSession.SetStateAsync |
string SessionId — идентификатор сеанса, присутствующий в сообщениях.
byte [] State — состояние сеанса. |
Microsoft.Azure.ServiceBus.RenewSessionLock |
IMessageSession.RenewSessionLockAsync |
string SessionId — идентификатор сеанса, присутствующий в сообщениях. |
Microsoft.Azure.ServiceBus.Exception |
любой инструментированный API |
Exception Exception — экземпляр исключения. |
В каждом событии вы можете получить доступ к Activity.Current
, где содержится контекст текущей операции.
Ведение журнала для дополнительных свойств
Activity.Current
предоставляет подробные сведения о контексте текущей операции и ее родительских объектов. Дополнительные сведения см. в документации по свойству Activity.
Инструментирование служебной шины предоставляет дополнительные сведения в Activity.Current.Tags
. Они удерживают MessageId
и SessionId
каждый раз, когда они доступны.
Действия, отслеживающие события Receive, Peek и ReceiveDeferred, также могут иметь RelatedTo
тег. Он содержит список уникальных значений Diagnostic-Id
для сообщений, полученных в качестве результата.
Такая операция может привести к получению нескольких несвязанных сообщений. Кроме того, при запуске операции Diagnostic-Id
неизвестен, поэтому операции Receive могут быть сопоставлены с операциями Process с использованием только этого тега. Это удобно при анализе проблем с производительностью, чтобы иметь возможность проверить, сколько времени потребовалось для получения сообщения.
Эффективный способ зарегистрировать теги — выполнить их итерацию. Процесс добавления тегов к предыдущему примеру выглядит примерно так:
Activity currentActivity = Activity.Current;
TaskStatus status = (TaskStatus)evnt.Value.GetProperty("Status");
var tagsList = new StringBuilder();
foreach (var tags in currentActivity.Tags)
{
tagsList.Append($", {tags.Key}={tags.Value}");
}
serviceBusLogger.LogInformation($"{currentActivity.OperationName} is finished, Duration={currentActivity.Duration}, Status={status}, Id={currentActivity.Id}, StartTime={currentActivity.StartTimeUtc}{tagsList}");
Фильтрация и выборка
В некоторых случаях предпочтительно зарегистрировать только часть событий, чтобы снизить потери производительности и уровень использования хранилища. Вы можете зарегистрировать только события Stop (как показано в предыдущем примере) или процент выборок событий.
DiagnosticSource
предоставляет способ реализации этих возможностей с помощью предиката IsEnabled
. Дополнительные сведения см. в разделе Фильтрация на основе контекста.
IsEnabled
может вызываться несколько раз для одной операции, чтобы свести к минимуму влияние на производительность.
IsEnabled
вызывается в следующей последовательности:
IsEnabled(<OperationName>, string entity, null)
, например, IsEnabled("Microsoft.Azure.ServiceBus.Send", "MyQueue1")
. Обратите внимание, что в конце нет события Start или Stop. Используйте его, чтобы отфильтровать конкретные операции или очереди. Если метод обратного вызова возвращает значение false
, события для операции не отправляются
- Для операций Process и ProcessSession вы также получите обратный вызов
IsEnabled(<OperationName>, string entity, Activity activity)
. С помощью него можно фильтровать события на основе activity.Id
или свойства тегов.
IsEnabled(<OperationName>.Start)
, например, IsEnabled("Microsoft.Azure.ServiceBus.Send.Start")
. Проверяет, следует ли вызывать событие Start. Результат влияет только на событие Start, но дальнейшее инструментирование от него не зависит.
Для события Stop отсутствует IsEnabled
.
Если результатом некоторых операций является исключение, вызывается IsEnabled("Microsoft.Azure.ServiceBus.Exception")
. Вы можете только подписаться на события Exception и запретить остальное инструментирование. В этом случае вам по-прежнему следует обработать такие исключения. После отключения других операций инструментирования не следует ожидать, что контекст трассировки будет передаваться с сообщением от потребителя к производителю.
Вы также можете использовать IsEnabled
, который также реализует стратегии выборки. Выборка на основе Activity.Id
или Activity.RootId
гарантирует согласованную выборку на всех ресурсах (при условии, что она распространяется системой трассировки или вашим кодом).
При наличии нескольких прослушивателей DiagnosticSource
для одного источника будет достаточно, чтобы событие принял один из них, поэтому IsEnabled
вызывать необязательно.