in BASE/src/Microsoft.ApplicationInsights/Extensibility/Implementation/RichPayloadEventSource.TelemetryHandler.cs [598:691]
private Action<ITelemetry> CreateHandlerForExceptionTelemetry(EventSource eventSource, MethodInfo writeGenericMethod, Type eventSourceOptionsType, PropertyInfo eventSourceOptionsKeywordsProperty)
{
var eventSourceOptions = Activator.CreateInstance(eventSourceOptionsType);
var keywords = Keywords.Exceptions;
eventSourceOptionsKeywordsProperty.SetValue(eventSourceOptions, keywords);
var dummyExceptionData = new ExceptionData();
var dummyExceptionDetails = new ExceptionDetails();
var dummyStackFrame = new External.StackFrame();
var writeMethod = writeGenericMethod.MakeGenericMethod(new
{
PartA_iKey = this.dummyPartAiKeyValue,
PartA_Tags = this.dummyPartATagsValue,
PartB_ExceptionData = new
{
// The properties and layout should be the same as ExceptionData_types.cs
dummyExceptionData.ver,
exceptions = new[]
{
new
{
// The properties and layout should be the same as ExceptionDetails_types.cs
dummyExceptionDetails.id,
dummyExceptionDetails.outerId,
dummyExceptionDetails.typeName,
dummyExceptionDetails.message,
dummyExceptionDetails.hasFullStack,
dummyExceptionDetails.stack,
parsedStack = new[]
{
new
{
// The properties and layout should be the same as StackFrame_types.cs
dummyStackFrame.level,
dummyStackFrame.method,
dummyStackFrame.assembly,
dummyStackFrame.fileName,
dummyStackFrame.line,
},
}.AsEnumerable(),
},
}.AsEnumerable(),
dummyExceptionData.severityLevel,
dummyExceptionData.problemId,
dummyExceptionData.properties,
dummyExceptionData.measurements,
},
PartA_flags = this.dummyPartAFlagsValue,
}.GetType());
return (item) =>
{
if (this.EventSourceInternal.IsEnabled(EventLevel.Verbose, keywords))
{
var telemetryItem = item as ExceptionTelemetry;
CopyGlobalPropertiesIfRequired(item, telemetryItem.Properties);
item.Sanitize();
var data = telemetryItem.Data.Data;
var extendedData = new
{
// The properties and layout should be the same as the anonymous type in the above MakeGenericMethod
PartA_iKey = telemetryItem.Context.InstrumentationKey,
PartA_Tags = telemetryItem.Context.SanitizedTags,
PartB_ExceptionData = new
{
data.ver,
exceptions = data.exceptions.Select(i => new
{
i.id,
i.outerId,
i.typeName,
i.message,
i.hasFullStack,
i.stack,
parsedStack = i.parsedStack.Select(j => new
{
j.level,
j.method,
j.assembly,
j.fileName,
j.line,
}),
}),
data.severityLevel,
data.problemId,
data.properties,
data.measurements,
},
PartA_flags = telemetryItem.Context.Flags,
};
writeMethod.Invoke(eventSource, new object[] { ExceptionTelemetry.EtwEnvelopeName, eventSourceOptions, extendedData });
}
};
}