Make EventSource log errors to eventpipe
authorDavid Mason <davmason@microsoft.com>
Thu, 23 Apr 2020 22:16:00 +0000 (15:16 -0700)
committerDavid Mason <davmason@microsoft.com>
Mon, 27 Apr 2020 23:29:23 +0000 (16:29 -0700)
src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventProvider.cs
src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeMetadataGenerator.cs
src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs

index 52b9e4d..d2e33d5 100644 (file)
@@ -8,6 +8,8 @@ namespace System.Diagnostics.Tracing
     {
         // The EventPipeProvider handle.
         private IntPtr m_provHandle = IntPtr.Zero;
+        private object m_createEventLock = new object();
+        private IntPtr m_writeEventStringeEventHandle = IntPtr.Zero;
 
         // Register an event provider.
         unsafe uint IEventProvider.EventRegister(
@@ -69,6 +71,30 @@ namespace System.Diagnostics.Tracing
                 }
                 EventPipeInternal.WriteEventData(eventHandle, userData, (uint)userDataCount, activityId, relatedActivityId);
             }
+            else
+            {
+                if (m_writeEventStringeEventHandle == IntPtr.Zero)
+                {
+                    lock (m_createEventLock)
+                    {
+                        if (m_writeEventStringeEventHandle == IntPtr.Zero)
+                        {
+                            string eventName = "WriteEventString";
+                            EventParameterInfo paramInfo = default(EventParameterInfo);
+                            paramInfo.SetInfo("message", typeof(string));
+                            byte[]? metadata = EventPipeMetadataGenerator.Instance.GenerateMetadata(0, eventName, 0, (uint)EventLevel.LogAlways, 0, new EventParameterInfo[] { paramInfo });
+                            uint metadataLength = (metadata != null) ? (uint)metadata.Length : 0;
+
+                            fixed (byte* pMetadata = metadata)
+                            {
+                                m_writeEventStringeEventHandle = ((IEventProvider)this).DefineEventHandle(0, eventName, 0, 0, (uint)EventLevel.LogAlways, pMetadata, metadataLength);
+                            }
+                        }
+                    }
+                }
+
+                EventPipeInternal.WriteEventData(m_writeEventStringeEventHandle, userData, (uint)userDataCount, activityId, relatedActivityId);
+            }
             return EventProvider.WriteEventErrorCode.NoError;
         }
 
index 428543c..fd81d05 100644 (file)
@@ -55,7 +55,7 @@ namespace System.Diagnostics.Tracing
             return GenerateMetadata(eventId, eventName, (long)keywords, (uint)level, version, eventParams);
         }
 
-        private unsafe byte[]? GenerateMetadata(
+        internal unsafe byte[]? GenerateMetadata(
             int eventId,
             string eventName,
             long keywords,
index f59c2be..7ffb21c 100644 (file)
@@ -2152,18 +2152,18 @@ namespace System.Diagnostics.Tracing
         private unsafe void WriteEventString(EventLevel level, long keywords, string msgString)
         {
 #if FEATURE_MANAGED_ETW || FEATURE_PERFTRACING
+            bool allAreNull = true;
 #if FEATURE_MANAGED_ETW
-            if (m_etwProvider == null)
-            {
-                return;
-            }
+            allAreNull &= (m_etwProvider == null);
 #endif // FEATURE_MANAGED_ETW
 #if FEATURE_PERFTRACING
-            if (m_eventPipeProvider == null)
+            allAreNull &= (m_eventPipeProvider == null);
+#endif // FEATURE_PERFTRACING
+            if (allAreNull)
             {
                 return;
             }
-#endif // FEATURE_PERFTRACING
+
             const string EventName = "EventSourceMessage";
             if (SelfDescribingEvents)
             {