Поделиться через


Создание трассировки пользовательского кода

Помимо включения трассировки в конфигурации для сбора данных инструментирования, созданных Windows Communication Foundation (WCF), можно также программным образом выдавать трассировки в пользовательском коде. Таким образом можно заранее создавать данные инструментирования для их последующего использования в диагностических целях. В этом разделе описывается, как это сделать.

Кроме того, пример трассировки расширения включает весь код, показанный в следующих разделах.

Создание источника трассировки

Можно использовать следующий код для создания пользовательского источника трассировки.

TraceSource ts = new TraceSource("myUserTraceSource");

Создание действий

Действия являются логическим блоком обработки. Для каждого основного блока обработки, в котором требуется сгруппировать трассировки, можно создать одно действие. Например, для каждого запроса к службе можно создать одно действие. Для этого выполните следующие действия.

  1. Сохраните идентификатор действия в области.

  2. Создайте новый идентификатор действия.

  3. Выполните перенаправление от действия в области к новому действию, настройте новое действие в области и создайте трассировку запуска действий для данного действия.

В следующем коде показано, как это сделать.

Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");

Создание трассировок в действии пользователя

В следующем коде показано создание трассировок в действии пользователя.

double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + result + "'");

Остановка действий

Чтобы остановить действия, выполните перенаправление к прежнему действию, остановите текущее действие и сбросьте идентификатор прежнего действия в области.

В следующем коде показано, как это сделать.

ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;

Распространение идентификатора действия на службу

Если задать атрибуту propagateActivity значение true для источника трассировки System.ServiceModel и в файле конфигурации клиента, и в файле конфигурации службы, служба обработки запроса на добавление будет присутствовать в том же действии, что и определено в клиенте. Если служба определяет собственные действия и перенаправления, трассировки службы не содержатся в распространенном клиентом действии. Вместо этого они содержатся в действии, связанном трассировками перенаправления с действием, идентификатор которого распространяется клиентом.

Примечание.

propagateActivity Если атрибут установлен true как в клиенте, так и в службе, внешние действия в операции область службы задаются WCF.

Следующий код можно использовать для проверка, было ли действие задано в область WCF.

// Check if an activity was set in scope by WCF, if it was
// propagated from the client. If not, ( ambient activity is
// equal to Guid.Empty), create a new one.
if(Trace.CorrelationManager.ActivityId == Guid.Empty)
{
    Guid newGuid = Guid.NewGuid();
    Trace.CorrelationManager.ActivityId = newGuid;
}
// Emit your Start trace.
ts.TraceEvent(TraceEventType.Start, 0, "Add Activity");

// Emit the processing traces for that request.
serviceTs.TraceInformation("Service receives Add "
                            + n1 + ", " + n2);
// double result = n1 + n2;
serviceTs.TraceInformation("Service sends Add result" + result);

// Emit the Stop trace and exit the method scope.
ts.TraceEvent(TraceEventType.Stop, 0, "Add Activity");
// return result;

Трассировка вызванных в коде исключений

При вызове исключения в коде можно также выполнить трассировку исключения на пороге предупреждений или следующем уровне посредством следующего кода.

ts.TraceEvent(TraceEventType.Warning, 0, "Throwing exception " + "exceptionMessage");

Просмотр пользовательских трассировок в программе Service Trace Viewer

В этом разделе содержатся снимки экрана трассировок, созданные с помощью примера расширения трассировки при просмотре с помощью средства просмотра трассировки службы (SvcTraceViewer.exe).

На следующей схеме на левой панели выбрано действие "Добавить запрос". Это действие входит в список с тремя другими математическими действиями ("Вычесть", "Умножить" и "Разделить"), образующими клиентское приложение. Во избежание потенциального появления ошибок в разных запросах в пользовательском коде для каждой операции определяется одно новое действие.

Чтобы продемонстрировать использование передачи в примере трассировки расширения, также создается действие калькулятора, инкапсулирующее четыре запроса операции. Для каждого запроса существует перенаправление в прямом и обратном направлениях от действия "Калькулятор" к действию запроса (на рисунке трассировка выделена на верхней правой панели).

Когда на левой панели выбирается действие, на верхней правой панели отображаются трассировки, включаемые этим действием. Если propagateActivity в true каждой конечной точке пути запроса трассировки в действии запроса находятся во всех процессах, участвующих в запросе. В этом примере в четвертом столбце панели представлены и трассировки, происходящие из клиента, и трассировки, происходящие из службы.

В этом действии следующий порядок обработки.

  1. Клиент отправляет сообщение, которое требуется "Добавить".

  2. Служба получает сообщение запроса "Добавить".

  3. Служба отправляет ответ "Добавить".

  4. Клиент получает ответ "Добавить".

Все эти шаги выполнены на уровне "Данные". При выборе трассировки в верхней правой панели в нижней правой панели отображаются сведения об этой трассировке.

На следующей схеме представлены трассировки перенаправлений из и в действие "Калькулятор", а также две пары трассировок "Запуск" и "Остановка" для действий запроса - одна для клиента и одна для службы (по одной для каждого источника трассировки).

Trace Viewer: Emitting User-code traces Список действий по времени создания (левая панель) и вложенные действия (верхняя правая панель)

Если код службы создает исключение, по причине которого клиент также создает исключение (например, когда клиент не получает ответ на запрос), для непосредственной корреляции предупреждения службы и клиента или сообщения об ошибке появляются в одном и том же действии. На следующем изображении служба создает исключение, которое утверждает, что служба отказывается обрабатывать этот запрос в пользовательском коде. Клиент также создает исключение, которое указывает, что сервер не смог обработать запрос из-за внутренней ошибки.

На следующих изображениях показано, что ошибки между конечными точками для данного запроса отображаются в том же действии, если идентификатор действия запроса был распространен:

Screenshot that shows errors across endpoints for a given request.

При двойном нажатии на действии "Умножить" на левой панели отображается следующий граф, содержащий трассировки действия "Умножить" для каждого задействованного процесса. Видно, что сперва предупреждение возникло в службе (создано исключение), затем последовали предупреждения и ошибки в клиенте вызванные тем, что запрос не может быть обработан. Таким образом можно сделать вывод о причинной взаимосвязи ошибок между конечными точками и выявить основную причину ошибки.

На следующем рисунке показано представление графа корреляции ошибок:

Screenshot that shows the graph view of error correlation.

Для получения предыдущих трассировок мы задаем значение ActivityTracing пользовательским источникам трассировки и значение propagateActivity=true источнику трассировки System.ServiceModel. Мы не задали значение ActivityTracing источнику трассировки System.ServiceModel, чтобы включить пользовательский код в распространение действий пользовательского кода. (Если трассировка действий ServiceModel включена, идентификатор действия, определенный в клиенте, не распространяется весь путь к пользовательскому коду службы; Однако передача данных сопоставляет действия клиента и пользователя службы с промежуточными действиями WCF.)

Определение действий и распространение идентификатора действия позволяет осуществить непосредственную корреляцию ошибок в конечных точках. Это ускоряет выявление основной причины ошибки.

См. также