Compartir a través de


Emisión de trazas del código de usuario

Además de habilitar el seguimiento en la configuración para recopilar datos de instrumentación generados por Windows Communication Foundation (WCF), también puede emitir seguimientos mediante programación en el código de usuario. De este modo, puede crear de forma proactiva los datos de instrumentación que puede examinar más adelante para fines de diagnóstico. En este tema se describe cómo puede hacerlo.

Además, el ejemplo Extensión del seguimiento incluye todo el código que se muestra en las secciones siguientes.

Creación de un origen de seguimiento

Puede usar el código siguiente para crear un origen de seguimiento de usuario.

TraceSource ts = new TraceSource("myUserTraceSource");

Crear actividades

Las actividades son una unidad lógica de procesamiento. Puede crear una actividad para cada unidad de procesamiento principal en la que desea agrupar los rastros. Por ejemplo, puede crear una actividad para cada solicitud al servicio. Para ello, realice los pasos siguientes.

  1. Guarde el id. de actividad dentro del ámbito.

  2. Cree un nuevo identificador de actividad.

  3. Realice una transferencia desde la actividad del ámbito a la nueva actividad, establezca ésta última dentro del ámbito, y emita un seguimiento de traza de inicio para esa actividad.

En el código siguiente se muestra cómo hacerlo.

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");

Emisión de seguimiento de trazas en una actividad de usuario

El código siguiente emite rastros en una actividad de usuario.

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 + "'");

Detener las actividades

Para detener la actividad, regrese a la actividad anterior, detenga el identificador de actividad actual y restablezca el identificador de actividad anterior en su ámbito.

En el código siguiente se muestra cómo hacerlo.

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

Propagación del id. de la actividad a un servicio

Si establece el atributo propagateActivity en true para el origen de seguimiento System.ServiceModel en los archivos de configuración del cliente y del servicio, el procesamiento del servicio para la solicitud de "Add" se produce en la misma actividad que la definida en el cliente. Si el servicio define sus propias actividades y transferencias, los seguimientos del servicio no aparecen en la actividad propagada por el cliente. En su lugar, aparecen en una actividad que las trazas de la transferencia ponen en correlación con la actividad cuyo id. propaga el cliente.

Nota:

Si el atributo propagateActivity está establecido en true en el cliente y el servicio, WCF establece la actividad de ambiente en el ámbito de la operación del servicio.

Puede usar el código siguiente para comprobar si WCF estableció una actividad dentro del ámbito.

// 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;

Seguimiento de traza de las excepciones iniciadas en código

Cuando se inicia una excepción en el código, también puede hacerse un seguimiento de traza de la excepción en el nivel de advertencia, o en un nivel superior, utilizando el código siguiente.

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

Ver las trazas de usuario en la herramienta del visor de seguimiento de traza del servicio

Esta sección contiene capturas de pantalla de trazas generadas mediante la ejecución del ejemplo Extensión del seguimiento cuando se visualizan mediante la herramienta del visor de seguimiento de servicio (SvcTraceViewer.exe).

En el diagrama siguiente, la actividad "Agregar solicitud" creada anteriormente se selecciona en el panel izquierdo. Está listado junto a otras tres actividades de operaciones matemáticas (Dividir, Restar, Multiplicar) que forman parte del programa cliente de la aplicación. El código de usuario ha definido una nueva actividad para cada operación para aislar posibles repeticiones de errores en distintas solicitudes.

Para mostrar el uso de transferencias en el ejemplo Extensión del seguimiento, también se crea una actividad de cálculo que encapsula las cuatro solicitudes de operación. Para cada solicitud, se realiza una transferencia de ida y vuelta entre la actividad Calculadora y la actividad de solicitud (el rastro se resalta en el panel ubicado en la parte superior derecha de la figura).

Al seleccionar una actividad en el panel izquierdo, los rastros incluidos en esta actividad se muestran en el panel superior derecho. Si propagateActivity está true en todos los puntos finales de la ruta de la solicitud, los seguimientos de la actividad de la solicitud proceden de todos los procesos que participan en ella. En este ejemplo, puede ver seguimientos tanto del cliente como del servicio en la 4ª columna del panel.

Esta actividad muestra el siguiente orden de procesamiento:

  1. El cliente envía un mensaje a Agregar.

  2. El servicio recibe el mensaje Agregar solicitud.

  3. El servicio envía una respuesta Add.

  4. El cliente recibe la respuesta Agregar.

Todas estas trazas se emiten en el nivel de información. Al hacer clic en una traza en el panel superior derecho, se muestran los detalles de esa traza en el panel inferior derecho.

En el diagrama siguiente, también vemos rastros de transferencia desde y hacia la actividad Calculadora, así como dos pares de rastros de inicio y finalización por actividad de solicitud, uno para el cliente y otro para el servicio (uno para cada fuente de rastro).

Visualizador de trazas: generación de trazas de código de usuario Lista de actividades por momento de creación (panel izquierdo) y sus actividades anidadas (panel superior derecho)

Si el código de servicio genera una excepción que hace que el cliente también lance una (por ejemplo, cuando el cliente no recibió la respuesta a su solicitud), tanto los mensajes de advertencia o error del servicio como del cliente ocurren en la misma actividad para una correlación directa. En la imagen siguiente, el servicio produce una excepción que indica "El servicio se niega a procesar esta solicitud en el código de usuario". El cliente también produce una excepción que indica "El servidor no pudo procesar la solicitud debido a un error interno".

En las imágenes siguientes se muestra que los errores en los puntos de conexión de una solicitud determinada aparecen en la misma actividad si se propagó el identificador de actividad de solicitud:

Captura de pantalla que muestra los errores entre los puntos de conexión de una solicitud determinada.

Al hacer doble clic en la actividad Multiplicar del panel izquierdo se muestra el gráfico siguiente, con los seguimientos de la actividad Multiplicar para cada proceso implicado. Primero podemos observar una advertencia en el servicio (excepción lanzada), seguida de advertencias y errores en el cliente porque no se pudo procesar la solicitud. Por lo tanto, podemos implicar la relación de error causal entre los puntos de conexión y derivar la causa principal del error.

En la imagen siguiente se muestra una vista de gráfico de correlación de errores:

Captura de pantalla que muestra la vista de gráfico de correlación de errores.

Para obtener las trazas anteriores, se establece ActivityTracing para los orígenes del seguimiento de traza del usuario, y propagateActivity=true para el origen de seguimiento de traza System.ServiceModel. No se estableció ActivityTracing para el origen del seguimiento de traza System.ServiceModel para permitir habilitar el código de usuario a la propagación de actividad del código de usuario. (Cuando el seguimiento de la actividad ServiceModel está activado, el identificador de actividad definido en el cliente no se propaga hasta el código de usuario del servicio; sin embargo, las transferencias correlan las actividades de código de usuario del cliente y servicio con las actividades intermedias de WCF).

La definición de actividades y la propagación del identificador de actividad nos permite realizar una correlación directa de errores entre puntos de conexión. De este modo, podemos localizar la causa principal de un error más rápidamente.

Consulte también