Exemple #1
0
        private bool IsInterestingTrace(TraceEvent data)
        {
            // vshub.exe internally uses ApplicationInsights
            if (data.PayloadNames.Length > 1 && data.PayloadString(1) == "vshub.exe")
            {
                return(false);
            }

            bool result = true;

            if (data.PayloadNames.Length > 0)
            {
                int id = (int)data.ID;

                // Not system event
                if ((id > 0) && (id < 65534))
                {
                    string domainName = data.PayloadString(data.PayloadNames.Length - 1);
                    result = domainName.StartsWith("/LM/W3SVC") || domainName.StartsWith("ConsoleApp");
                }
            }
            else
            {
                TraceAssert.IsTrue(false, "Trace must have at least 1 parameter - appDomain name");
                this.FailureDetected = true;
            }

            return(result);
        }
Exemple #2
0
        public static string ToJson(this TraceEvent traceEvent)
        {
            var names = traceEvent.PayloadNames;
            var count = names.Length;

            using (var stringWriter = new StringWriter())
                using (var jsonWriter = new TinyJsonWriter(stringWriter))
                {
                    jsonWriter.WriteStartObject();

                    for (var i = 0; i < count; i++)
                    {
                        var name  = names[i];
                        var value = traceEvent.PayloadString(i);

                        jsonWriter.WritePropertyName(name);
                        jsonWriter.WriteValue(value);
                    }

                    jsonWriter.WriteEndObject();

                    stringWriter.Flush();

                    return(stringWriter.ToString());
                }
        }
Exemple #3
0
        // Create 1 line that embodies the data in event 'data'

        private static string Parse(TraceEvent data)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("EVENT ");
            sb.Append(data.TimeStampRelativeMSec.ToString("n3")).Append(": ");
            sb.Append(data.ProviderName).Append("/").Append(data.EventName).Append(" ");

            sb.Append("PID=").Append(data.ProcessID).Append("; ");
            sb.Append("TID=").Append(data.ThreadID).Append("; ");
            sb.Append("PName=").Append(data.ProcessName).Append("; ");
            sb.Append("ProceNum=").Append(data.ProcessorNumber).Append("; ");
            sb.Append("DataLen=").Append(data.EventDataLength).Append("; ");

            string[] payloadNames = data.PayloadNames;
            for (int i = 0; i < payloadNames.Length; i++)
            {
                // Keep the value size under control and remove newlines.
                string value = (data.PayloadString(i));

                // To debug this set first chance exeption handing before calling PayloadString above.
                Assert.IsFalse(value.Contains("EXCEPTION_DURING_VALUE_LOOKUP"), "Exception during event Payload Processing");

                if (value.Length > 20)
                {
                    value = value.Substring(0, 20) + "...";
                }
                value = value.Replace("\n", "\\n").Replace("\r", "\\r");

                sb.Append(payloadNames[i]).Append('=').Append(value).Append("; ");
            }

            return(sb.ToString());
        }
Exemple #4
0
        public static string DumpPayload(this TraceEvent traceEvent)
        {
            var names = traceEvent.PayloadNames;

            var stringBuilder = new StringBuilder();

            stringBuilder.Append("{");

            var count = names.Length;

            for (var i = 0; i < count; i++)
            {
                if (i != 0)
                {
                    stringBuilder.Append(", ");
                }

                var name  = names[i];
                var value = traceEvent.PayloadString(i);
                stringBuilder.Append(name).Append(": ").Append(value);
            }

            stringBuilder.Append("}");

            return(stringBuilder.ToString());
        }
Exemple #5
0
        private void ServiceFabricTraceEvent(TraceEvent data)
        {
            var eventId         = (ushort)data.ID;
            var eventIsRelevant =
                (
                    (data.Level <= TraceEventLevel.Error && data.Level >= TraceEventLevel.Critical) ||
                    (
                        ServiceFabricEtw.Operational.ClusterEventsFilter(eventId, data) ||
                        ServiceFabricEtw.Operational.NodeEventsFilter(eventId, data)
                    ));

            if (!eventIsRelevant)
            {
                return;
            }

            var properties = data.PayloadNames
                             .Select((name, index) =>
            {
                if (data.PayloadValue(index) is DateTime dateTimeValue)
                {
                    return(new KeyValuePair <string, string>(name, dateTimeValue.ToString("o")));
                }
                return(new KeyValuePair <string, string>(name, data.PayloadString(index, Culture)));
            })
                             .ToDictionary(x => x.Key, x => x.Value);

            properties.Add("eventID", data.ID.ToString());
            properties.Add("name", data.EventName);
            properties.Add("timeStamp", data.TimeStamp.ToString("o"));

            AppInsightsClient.TrackTrace(data.FormattedMessage, data.ToSeverityLevel(), properties);
        }
Exemple #6
0
        private IDictionary <string, string> GetPayload(TraceEvent data)
        {
            var payload = new Dictionary <string, string>();

            foreach (var name in data.PayloadNames)
            {
                var index = data.PayloadIndex(name);
                payload.Add(name, data.PayloadString(index));
            }

            return(payload);
        }
        // Create 1 line that embodies the data in event 'data'

        internal static string Parse(TraceEvent data)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("EVENT ");
            sb.Append(data.TimeStampRelativeMSec.ToString("n3")).Append(": ");
            sb.Append(data.ProviderName).Append("/").Append(data.EventName).Append(" ");

            sb.Append("PID=").Append(data.ProcessID).Append("; ");
            sb.Append("TID=").Append(data.ThreadID).Append("; ");
            sb.Append("PName=").Append(data.ProcessName).Append("; ");
            sb.Append("ProceNum=").Append(data.ProcessorNumber).Append("; ");
            sb.Append("DataLen=").Append(data.EventDataLength).Append("; ");

            string[] payloadNames = data.PayloadNames;
            for (int i = 0; i < payloadNames.Length; i++)
            {
                // Normalize DateTime to UTC so tests work in any timezone.
                object value = data.PayloadValue(i);
                string valueStr;
                if (value is DateTime)
                {
                    valueStr = ((DateTime)value).ToUniversalTime().ToString("yy/MM/dd HH:mm:ss.ffffff");
                }
                else
                {
                    valueStr = (data.PayloadString(i));
                }

                // To debug this set first chance exeption handing before calling PayloadString above.
                Assert.False(valueStr.Contains("EXCEPTION_DURING_VALUE_LOOKUP"), "Exception during event Payload Processing");

                // Keep the value size under control and remove newlines.
                if (valueStr.Length > 20)
                {
                    valueStr = valueStr.Substring(0, 20) + "...";
                }

                valueStr = valueStr.Replace("\n", "\\n").Replace("\r", "\\r");

                sb.Append(payloadNames[i]).Append('=').Append(valueStr).Append("; ");
            }

            if (data.ContainerID != null)
            {
                sb.Append("ContainerID=").Append(data.ContainerID).Append("; ");
            }

            return(sb.ToString());
        }
Exemple #8
0
        private bool IsInterestingTrace(TraceEvent data)
        {
            // vshub.exe internally uses ApplicationInsights
            if (data.PayloadNames.Length > 1 && data.PayloadString(1) == "vshub.exe")
            {
                return(false);
            }

            bool result = false;

            if (data.PayloadNames.Length > 0)
            {
                int id = (int)data.ID;

                // Not system event
                if ((id > 0) && (id < 65534))
                {
                    string domainName = data.PayloadString(data.PayloadNames.Length - 1);
                    result = domainName.StartsWith("/LM/W3SVC");
                }
            }

            return(result);
        }
        private void TestAppDomainNameIsTheLastPayloadParameter(TraceEvent data)
        {
            if (data.PayloadNames.Length > 0)
            {
                int id = (int)data.ID;

                // Not system event
                if ((id > 0) && (id < 65534))
                {
                    string domainName  = data.PayloadString(data.PayloadNames.Length - 1);
                    bool   correctName = TraceAssert.IsTrue(
                        domainName.StartsWith("/LM/W3SVC"),
                        "Every message must have application name as the last parameter to enable StatusMonitor integration: " +
                        domainName);

                    this.FailureDetected = !correctName || this.FailureDetected;
                }
            }
            else
            {
                TraceAssert.IsTrue(false, "Trace must have at least 1 parameter - appDomain name");
                this.FailureDetected = true;
            }
        }
Exemple #10
0
            internal ETWEventRecord(ETWEventSource source, TraceEvent data, Dictionary <string, int> columnOrder, int nonRestFields, double durationMSec)
                : base(nonRestFields)
            {
                m_source      = source;
                m_name        = data.ProviderName + "/" + data.EventName;
                m_processName = data.ProcessName;
                if (!m_processName.StartsWith("("))
                {
                    m_processName += " (" + data.ProcessID + ")";
                }

                m_timeStampRelativeMSec = data.TimeStampRelativeMSec;
                m_idx = data.EventIndex;

                // Compute the data column
                var restString = new StringBuilder();

                // Deal with the special HasStack, ThreadID and ActivityID, DataLength fields;
                var hasStack = data.CallStackIndex() != CallStackIndex.Invalid;

                if (hasStack)
                {
                    AddField("HasStack", hasStack.ToString(), columnOrder, restString);
                }

                var asCSwitch = data as CSwitchTraceData;

                if (asCSwitch != null)
                {
                    AddField("HasBlockingStack", (asCSwitch.BlockingStack() != CallStackIndex.Invalid).ToString(), columnOrder, restString);
                }

                AddField("ThreadID", data.ThreadID.ToString("n0"), columnOrder, restString);
                AddField("ProcessorNumber", data.ProcessorNumber.ToString(), columnOrder, restString);

                if (0 < durationMSec)
                {
                    AddField("DURATION_MSEC", durationMSec.ToString("n3"), columnOrder, restString);
                }

                var payloadNames = data.PayloadNames;

                if (payloadNames.Length == 0 && data.EventDataLength != 0)
                {
                    // WPP events look classic and use the EventID as their discriminator
                    if (data.IsClassicProvider && data.ID != 0)
                    {
                        AddField("EventID", ((int)data.ID).ToString(), columnOrder, restString);
                    }

                    AddField("DataLength", data.EventDataLength.ToString(), columnOrder, restString);
                }

                try
                {
                    for (int i = 0; i < payloadNames.Length; i++)
                    {
                        AddField(payloadNames[i], data.PayloadString(i), columnOrder, restString);
                    }
                }
                catch (Exception e)
                {
                    AddField("ErrorParsingFields", e.Message, columnOrder, restString);
                }

                var message = data.FormattedMessage;

                if (message != null)
                {
                    AddField("FormattedMessage", message, columnOrder, restString);
                }

                if (source.m_needsComputers)
                {
                    TraceThread thread = data.Thread();
                    if (thread != null)
                    {
                        TraceActivity activity = source.m_activityComputer.GetCurrentActivity(thread);
                        if (activity != null)
                        {
                            string id = activity.ID;
                            if (Math.Abs(activity.StartTimeRelativeMSec - m_timeStampRelativeMSec) < .0005)
                            {
                                id = "^" + id;              // Indicates it is at the start of the task.
                            }

                            AddField("ActivityInfo", id, columnOrder, restString);
                        }

                        var startStopActivity = source.m_startStopActivityComputer.GetCurrentStartStopActivity(thread, data);
                        if (startStopActivity != null)
                        {
                            string name       = startStopActivity.Name;
                            string parentName = "$";
                            if (startStopActivity.Creator != null)
                            {
                                parentName = startStopActivity.Creator.Name;
                            }

                            AddField("StartStopActivity", name + "/P=" + parentName, columnOrder, restString);
                        }
                    }
                }

                // We pass 0 as the process ID for creating the activityID because we want uniform syntax.
                if (data.ActivityID != Guid.Empty)
                {
                    AddField("ActivityID", StartStopActivityComputer.ActivityPathString(data.ActivityID), columnOrder, restString);
                }

                Guid relatedActivityID = data.RelatedActivityID;

                if (relatedActivityID != Guid.Empty)
                {
                    AddField("RelatedActivityID", StartStopActivityComputer.ActivityPathString(data.RelatedActivityID), columnOrder, restString);
                }

                if (data.ContainerID != null)
                {
                    AddField("ContainerID", data.ContainerID, columnOrder, restString);
                }

                m_asText = restString.ToString();
            }
Exemple #11
0
        private void LogMessage(TraceEvent data)
        {
            const int Message       = 0;
            const int Context       = Message + 1;
            const int Member        = Context + 1;
            const int HttpRequest   = Member + 1;
            const int HttpResponse  = HttpRequest + 1;
            const int HttpClient    = HttpResponse + 1;
            const int Socket        = HttpClient + 1;
            const int SecureChannel = Socket + 1;

            var buffer  = new StringBuilder();
            var indexes = new int[SecureChannel + 1];

            indexes[Message]       = data.PayloadIndex("message");
            indexes[Context]       = data.PayloadIndex("thisOrContextObject");
            indexes[Member]        = data.PayloadIndex("memberName");
            indexes[HttpRequest]   = data.PayloadIndex("httpRequestHash");
            indexes[HttpResponse]  = data.PayloadIndex("httpResponseHash");
            indexes[HttpClient]    = data.PayloadIndex("httpClientHash");
            indexes[Socket]        = data.PayloadIndex("socketHash");
            indexes[SecureChannel] = data.PayloadIndex("secureChannelHash");

            if (indexes[Context] >= 0)
            {
                buffer.AppendFormat("[{0}", data.PayloadString(indexes[Context]));
                if (indexes[Member] >= 0)
                {
                    buffer.AppendFormat("::{0}", data.PayloadString(indexes[Member]));
                }
                buffer.Append("] ");
            }
            else
            {
                if (indexes[HttpRequest] >= 0)
                {
                    buffer.AppendFormat("[HttpRequest#{0}] ", data.PayloadValue(indexes[HttpRequest]));
                }
                if (indexes[HttpResponse] >= 0)
                {
                    buffer.AppendFormat("[HttpResponse#{0}] ", data.PayloadValue(indexes[HttpResponse]));
                }
                if (indexes[HttpClient] >= 0)
                {
                    buffer.AppendFormat("[HttpClient#{0}] ", data.PayloadValue(indexes[HttpClient]));
                }
                if (indexes[Socket] >= 0)
                {
                    buffer.AppendFormat("[Socket#{0}] ", data.PayloadValue(indexes[Socket]));
                }
                if (indexes[SecureChannel] >= 0)
                {
                    buffer.AppendFormat("[SecureChannel#{0}] ", data.PayloadValue(indexes[SecureChannel]));
                }
            }
            if (indexes[Message] >= 0)
            {
                buffer.AppendFormat("{0} ", data.PayloadString(indexes[Message]));
            }

            var braceOpened = false;

            for (var i = 0; i < data.PayloadNames.Length; i++)
            {
                if (Array.IndexOf(indexes, i) >= 0)
                {
                    continue; // skip
                }
                if (!braceOpened)
                {
                    buffer.Append("{");
                    braceOpened = true;
                }
                buffer.AppendFormat(" {0}:{1}", data.PayloadNames[i], data.PayloadValue(i));
            }
            if (braceOpened)
            {
                buffer.Append(" }");
            }

            traceOutput.Write(data.TimeStampRelativeMSec, data.ProcessID, data.ThreadID,
                              data.EventName, buffer.ToString());
        }
Exemple #12
0
            public QueuePacketWdatEntry(TraceEvent data) : base(data)
            {
                AddField("opcode", data.Opcode.ToString("d"));
                AddField("ctx", NormalizeBase(data.PayloadString(0)));
                AddField("ptype", data.PayloadString(1));
                AddField("seq", NormalizeBase(data.PayloadString(2)));

                switch (data.Opcode)
                {
                case Microsoft.Diagnostics.Tracing.TraceEventOpcode.Start:
                    int type = (int)data.PayloadValue(1);
                    // not all events have these fields ?
                    if (type == 100)
                    {
                        AddField("dmabufsize", NormalizeBase(data.PayloadString(3)));
                        AddField("alloclistsize", NormalizeBase(data.PayloadString(4)));
                        AddField("patchloclistsize", NormalizeBase(data.PayloadString(5)));
                        AddField("present", data.PayloadString(6));
                        AddField("dmabuf", NormalizeBase(data.PayloadString(7)));
                        AddField("packet", NormalizeBase(data.PayloadString(8)));
                        AddField("afence", NormalizeBase(data.PayloadString(9)));
                    }
                    break;

                case Microsoft.Diagnostics.Tracing.TraceEventOpcode.Info:
                    // No extra fields
                    break;

                case Microsoft.Diagnostics.Tracing.TraceEventOpcode.Stop:
                    AddField("preempted", data.PayloadString(3));
                    AddField("timedout", data.PayloadString(4));
                    AddField("packet", NormalizeBase(data.PayloadString(5)));
                    break;
                }
            }
Exemple #13
0
 public VsyncWdatEntry(TraceEvent data) : base(data)
 {
     AddField("adapter", NormalizeBase(data.PayloadString(0)));
     AddField("display", NormalizeBase(data.PayloadString(1)));
     AddField("address", NormalizeBase(data.PayloadString(2)));
 }
Exemple #14
0
 public SteamVRWdatEntry(TraceEvent data) : base(data)
 {
     AddField("vrevent", data.PayloadString(0));
 }