private void ProcessServicePackageInactiveEvent(
            EventRecord eventRecord,
            string taskName,
            string eventName,
            EtwEventTimestamp eventTimestamp,
            bool implicitlyInactive)
        {
            ApplicationDataReader reader = new ApplicationDataReader(
                eventRecord.UserData,
                eventRecord.UserDataLength);

            // Verify event version
            int eventVersion = reader.ReadInt32();

            if (eventVersion > MaxServicePackageDeactivatedEventVersion)
            {
                Utility.TraceSource.WriteError(
                    TraceType,
                    "Unexpected version {0} encountered for event name {1}. Event will be ignored.",
                    eventVersion,
                    eventName);
                return;
            }

            // Get the node name
            string nodeName = reader.ReadUnicodeString();

            // Get the application instance ID
            string appInstanceId = reader.ReadUnicodeString();

            // Get the service package name
            string servicePackageName = reader.ReadUnicodeString();

            Utility.TraceSource.WriteInfo(
                TraceType,
                "ETW event received. Task {0}, event {1}, node name: {2}, application instance ID: {3}, service package name: {4}.",
                taskName,
                eventName,
                nodeName,
                appInstanceId,
                servicePackageName);

            // Delete record from service package table
            this.RemoveServicePackageHandler(nodeName, appInstanceId, servicePackageName, eventTimestamp, true, implicitlyInactive);
        }
Пример #2
0
        private Dictionary <string, string> ConvertEventToKvp(EventRecord eventRecord, EventDefinition eventDefinition)
        {
            var keyValueDictionary = new Dictionary <string, string>();

            try
            {
                var dataReader = new ApplicationDataReader(eventRecord.UserData, eventRecord.UserDataLength);

                foreach (FieldDefinition fieldDef in eventDefinition.Fields)
                {
                    string propertyValue = null;
                    switch (fieldDef.Type)
                    {
                    case FieldDefinition.FieldType.UnicodeString:
                    {
                        propertyValue = dataReader.ReadUnicodeString();
                        break;
                    }

                    case FieldDefinition.FieldType.AnsiString:
                    {
                        propertyValue = dataReader.ReadAnsiString();
                        break;
                    }

                    case FieldDefinition.FieldType.Boolean:
                    {
                        propertyValue = dataReader.ReadBoolean().ToString();
                        break;
                    }

                    case FieldDefinition.FieldType.UInt8:
                    {
                        propertyValue = dataReader.ReadUInt8().ToString();
                        break;
                    }

                    case FieldDefinition.FieldType.UInt16:
                    {
                        propertyValue = dataReader.ReadUInt16().ToString();
                        break;
                    }

                    case FieldDefinition.FieldType.UInt32:
                    {
                        unchecked
                        {
                            propertyValue = dataReader.ReadUInt32().ToString();
                        }
                        break;
                    }

                    case FieldDefinition.FieldType.UInt64:
                    {
                        unchecked
                        {
                            propertyValue = dataReader.ReadUInt64().ToString();
                        }
                        break;
                    }

                    case FieldDefinition.FieldType.Int8:
                    {
                        propertyValue = dataReader.ReadInt8().ToString();
                        break;
                    }

                    case FieldDefinition.FieldType.Int16:
                    {
                        propertyValue = dataReader.ReadInt16().ToString();
                        break;
                    }

                    case FieldDefinition.FieldType.Int32:
                    {
                        propertyValue = dataReader.ReadInt32().ToString();
                        break;
                    }

                    case FieldDefinition.FieldType.Int64:
                    {
                        propertyValue = dataReader.ReadInt64().ToString();
                        break;
                    }

                    case FieldDefinition.FieldType.HexInt32:
                    {
                        unchecked
                        {
                            propertyValue = dataReader.ReadUInt32().ToString();
                        }
                        break;
                    }

                    case FieldDefinition.FieldType.HexInt64:
                    {
                        unchecked
                        {
                            propertyValue = dataReader.ReadUInt64().ToString();
                        }
                        break;
                    }

                    case FieldDefinition.FieldType.Float:
                    {
                        propertyValue = dataReader.ReadFloat().ToString();
                        break;
                    }

                    case FieldDefinition.FieldType.Double:
                    {
                        propertyValue = dataReader.ReadDouble().ToString();
                        break;
                    }

                    case FieldDefinition.FieldType.DateTime:
                    {
                        propertyValue = dataReader.ReadFileTime().ToString("yyyy-dd-M--HH-mm-ss");
                        break;
                    }

                    case FieldDefinition.FieldType.Guid:
                    {
                        propertyValue = dataReader.ReadGuid().ToString();
                        break;
                    }

                    default:
                    {
                        this.traceSource.WriteError(
                            logSourceId,
                            "Event of type {0}.{1} has an unsupported field of type {2}.",
                            eventDefinition.TaskName,
                            eventDefinition.EventName,
                            fieldDef.Type);
                        break;
                    }
                    }

                    if (propertyValue != null)
                    {
                        keyValueDictionary[fieldDef.Name] = propertyValue;
                    }
                }
            }
            catch (Exception e)
            {
                this.traceSource.WriteError(
                    logSourceId,
                    "Failed to get all the fields of event of type {0}.{1}. Exception info: {2}.",
                    eventDefinition.TaskName,
                    eventDefinition.EventName,
                    e);

                return(null);
            }

            // our Platform event can't have a field names TimeStamp today. Still keeping this check till we add a unit test for that.
            if (!keyValueDictionary.ContainsKey(TimeStampFieldName))
            {
                keyValueDictionary.Add(TimeStampFieldName, DateTime.FromFileTimeUtc(eventRecord.EventHeader.TimeStamp).ToString(TimeStampFormat));
            }

            return(keyValueDictionary);
        }
        private void ProcessServicePackageActiveEvent(EventRecord eventRecord, string taskName, string eventName, EtwEventTimestamp eventTimestamp, int maxVersion)
        {
            ApplicationDataReader reader = new ApplicationDataReader(
                eventRecord.UserData,
                eventRecord.UserDataLength);

            // Verify event version
            int eventVersion = reader.ReadInt32();

            if (eventVersion > maxVersion)
            {
                Utility.TraceSource.WriteError(
                    TraceType,
                    "Unexpected version {0} encountered for event name {1}. Event will be ignored.",
                    eventVersion,
                    eventName);
                return;
            }

            // Get the node name
            string nodeName = reader.ReadUnicodeString();

            // Get the root directory for the run layout
            string runLayoutRoot = reader.ReadUnicodeString();

            // Get the application instance ID
            string appInstanceId = reader.ReadUnicodeString();

            // Get the application rollout version
            string appRolloutVersion = reader.ReadUnicodeString();

            // Get the service package name
            string servicePackageName = reader.ReadUnicodeString();

            // Get the service package rollout version
            string serviceRolloutVersion = reader.ReadUnicodeString();

            // Create a record for the application data table
            ServicePackageTableRecord record = new ServicePackageTableRecord(
                nodeName,
                appInstanceId,
                appRolloutVersion,
                servicePackageName,
                serviceRolloutVersion,
                runLayoutRoot,
                default(DateTime));

            Utility.TraceSource.WriteInfo(
                TraceType,
                "ETW event received. Task {0}, event {1}, node name: {2}, application instance ID: {3}, application rollout version: {4}, service package name: {5}, service rollout version: {6}.",
                taskName,
                eventName,
                nodeName,
                record.ApplicationInstanceId,
                record.ApplicationRolloutVersion,
                record.ServicePackageName,
                record.ServiceRolloutVersion);

            // Add or update record in service package table
            this.AddOrUpdateServicePackageHandler(
                nodeName,
                appInstanceId,
                eventTimestamp.Timestamp,
                servicePackageName,
                record,
                eventTimestamp,
                true);
        }
Пример #4
0
        // returns an object that would be either a string or a double, or null if failed
        private static object GetEtwEventRecordValue(ApplicationDataReader reader, FieldDefinition fieldDef, string logSourceId)
        {
            object value = null;

            switch (fieldDef.Type)
            {
            case FieldDefinition.FieldType.UnicodeString:
                value = reader.ReadUnicodeString();
                break;

            case FieldDefinition.FieldType.AnsiString:
                value = reader.ReadAnsiString();
                break;

            case FieldDefinition.FieldType.Boolean:
                value = reader.ReadBoolean() ? "true" : "false";
                break;

            case FieldDefinition.FieldType.UInt8:
                value = (double)reader.ReadUInt8();
                break;

            case FieldDefinition.FieldType.UInt16:
                value = (double)reader.ReadUInt16();
                break;

            case FieldDefinition.FieldType.UInt32:
                value = (double)reader.ReadUInt32();
                break;

            case FieldDefinition.FieldType.UInt64:
                value = (double)reader.ReadUInt64();
                break;

            case FieldDefinition.FieldType.Int8:
                value = (double)reader.ReadInt8();
                break;

            case FieldDefinition.FieldType.Int16:
                value = (double)reader.ReadInt16();
                break;

            case FieldDefinition.FieldType.Int32:
                value = (double)reader.ReadInt32();
                break;

            case FieldDefinition.FieldType.Int64:
                value = (double)reader.ReadInt64();
                break;

            case FieldDefinition.FieldType.HexInt32:
                value = (double)reader.ReadUInt32();
                break;

            case FieldDefinition.FieldType.HexInt64:
                value = (double)reader.ReadUInt64();
                break;

            case FieldDefinition.FieldType.Float:
                value = (double)reader.ReadFloat();
                break;

            case FieldDefinition.FieldType.Double:
                value = (double)reader.ReadDouble();
                break;

            case FieldDefinition.FieldType.DateTime:
                value = reader.ReadFileTime().ToString();
                break;

            case FieldDefinition.FieldType.Guid:
                value = reader.ReadGuid().ToString();
                break;

            default:
                Utility.TraceSource.WriteError(
                    logSourceId,
                    "Unsupported field of type {0}.",
                    fieldDef.Type);
                break;
            }

            return(value);
        }