Riesgo de que falten eventos en el registro de ETW con EventSource

Estoy instrumentando mis aplicaciones .NET 4.5 para emitir eventos ETW usando elEventSource clase. El objetivo es poder capturar algunos de estos eventos (los eventos de nivel de error) para el registro de errores.

Después de leer y realizar pruebas, me preocupa la confiabilidad de este enfoque para el registro de errores, específicamente con respecto a la posibilidad de eventos perdidos o perdidos. Si mi registro de errores no funciona, necesito que la aplicación se cierre (en mi caso, no es seguro que se ejecute con errores no reportados). Al usar ETW yEventSource, ¿cómo puedo estar seguro de que mis errores se están registrando correctamente?

Obviamente, parte de la respuesta dependerá de lo que esté escuchando los eventos. En mi caso, planeo usar el "Bloque de aplicaciones de registro semántico" de la última biblioteca de MS Enterprise.

Aquí hay una fuente donde Microsoft habla sobre las posibles causas de eventos perdidos:Sobre el seguimiento de eventos

Allí se listan estas posibles causas de eventos perdidos.

El tamaño total del evento es mayor que 64K. Esto incluye el encabezado ETW más los datos o la carga útil. Un usuario no tiene control sobre estos eventos faltantes, ya que el tamaño del evento está configurado por la aplicación.

El tamaño del búfer de ETW es más pequeño que el tamaño total del evento. Un usuario no tiene control sobre estos eventos faltantes ya que el tamaño del evento es configurado por la aplicación que registra los eventos.

Para el registro en tiempo real, el consumidor en tiempo real no está consumiendo eventos lo suficientemente rápido o no está presente por completo y luego el archivo de respaldo se está llenando. Esto puede ocurrir si el servicio de registro de eventos se detiene y se inicia cuando se están registrando eventos. Un usuario no tiene control sobre estos eventos que faltan.

Al iniciar sesión en un archivo, el disco es demasiado lento para mantenerse al día con la velocidad de registro.

Para ver si estas inquietudes se mitigaron de alguna manera utilizando la clase EventSource (por ejemplo, si trunca las cargas útiles grandes) hice algunas pruebas. Intenté registrar cadenas largas y me fallaron entre 30,000 y 35,000 caracteres (justo en línea con la carga útil máxima del evento de 64KB). Simplemente no hace nada por lo que puedo decir de las cadenas demasiado grandes, no hay eventos en absoluto en mi registro de Bloqueo de aplicaciones de registro semántico. Los eventos antes y después fueron escritos como de costumbre.

Entonces, ¿cada vez que tengo una cadena en mi carga útil tengo que pasarla a través de algún truncador? ¿Tendré que evitar manualmente la generación de eventos "demasiado rápido" también (y cómo sería eso posible)?

Se supone que los patrones y prácticas de Microsoft nos llevarán a buenos ... patrones y prácticas ... así que tal vez me esté perdiendo algo aquí.

Actualizar:

Bueno, aparentemente hay algún aviso en la aplicación de consumo para la condición "Eventos demasiado rápidos". Recibí esto hoy por primera vez:

Nivel: Advertencia, Mensaje: Algunos eventos se perderán debido a desbordamientos del búfer o retrasos en la sincronización del esquema en la sesión de rastreo: Microsoft-SemanticLogging-Etw-svcRuntime

Y luego al cerrar la sesión:

Nivel: Advertencia, Mensaje: Se detectó la pérdida de 1 eventos en la sesión de seguimiento 'Microsoft-SemanticLogging-Etw-svcRuntime'.

Actualización2:

losGuía para desarrolladores de bibliotecas empresariales describe el comportamiento que acabo de mencionar.

Debe supervisar los mensajes de registro generados por el Bloque de aplicaciones de registro semántico para detectar cualquier indicio de que los búferes se hayan desbordado y que haya perdido mensajes. Por ejemplo, los mensajes de registro con los id. De evento 900 y 901 indican que los buffers internos de un sumidero se han desbordado; En el escenario fuera de proceso, los identificadores de evento 806 y 807 indican que los buffers de ETW se han desbordado. Puede modificar las opciones de configuración del búfer para los sumideros para reducir la posibilidad de que los búferes se desborden con sus cargas de trabajo típicas.

Mi pregunta sigue siendo, ¿puedo usar el registro semántico y asegurar que mi aplicación no se ejecute si se están eliminando los errores? Los eventos de rastreo normal se podrían eliminar ...

Mi pensamiento actual es registrar errores "críticos" con una clase separada que usa técnicas de registro anticuadas y mantener los errores menos críticos (así como los eventos de tipo depuración) que pasan por la tubería de ETW. Eso no sería tan malo en realidad ... podría publicarlo como una solución si no puedo encontrar una mejor sugerencia.

Actualización 3:

La advertencia de "eventos perdidos" que recibí no tuvo nada que ver con los desbordamientos de búfer, resulta que este es el mensaje que recibe si pasa un nulostring como un valor de carga útil.

Respuestas a la pregunta(3)

Su respuesta a la pregunta