Я могу подтвердить, что объект handleMessageActivity имеет значение null, а ActivitySource по-прежнему выглядит действительным объектом.
Та же проблема происходит как в ActivitySource?.CreateActivity, так и в ActivitySource?.StartActivity
Я не могу понять, почему ActivitySource является допустимым объектом, когда объект сначала развертывается, а затем становится null.
Если это поможет, я также вставил в конец часть настройки Windsor DI.
Это приложение для платформы 4.6.1
Мой код для настройки телеметрии
Код: Выделить всё
public class AzureOpenTelemetryLoggerService : IDisposable
{
private Dictionary ActivitySourceCollection;
private bool disposedValue;
private readonly TracerProvider _tracerProvider;
public AzureOpenTelemetryLoggerService(string connectionString)
{
var sourcesArray = System.Enum.GetNames(typeof(ActivitySourceEnum));
AppContext.SetSwitch("Azure.Experimental.EnableActivitySource", true);
_tracerProvider = Sdk
.CreateTracerProviderBuilder()
.AddSource(sourcesArray)
.SetSampler(new AlwaysOnSampler())
.SetResourceBuilder(
ResourceBuilder.CreateDefault().AddService(
serviceName: "MyApp.Backend",
serviceVersion: "1.0.0")
)
.AddConsoleExporter(configure =>
{
})
.AddAzureMonitorTraceExporter(configure =>
{
configure.ConnectionString = connectionString;
})
.Build();
InitializeActivitySources();
}
private void InitializeActivitySources()
{
ActivitySourceCollection =
new Dictionary();
foreach (var activitySourceItem
in Enum
.GetValues(typeof(ActivitySourceEnum))
.Cast())
{
ActivitySourceCollection.Add(
activitySourceItem,
new ActivitySource(activitySourceItem.ToString())
);
};
var activityListener = new ActivityListener
{
ShouldListenTo = s => true,
SampleUsingParentId =
(ref ActivityCreationOptions activityOptions)
=> ActivitySamplingResult.AllData,
Sample =
(ref ActivityCreationOptions activityOptions)
=> ActivitySamplingResult.AllData
};
ActivitySource.AddActivityListener(activityListener);
}
public ActivitySource GetActivitySource(ActivitySourceEnum activitySource)
{
return ActivitySourceCollection[activitySource];
}
public enum ActivitySourceEnum
{
SomeActivitySourceToListenTo
}
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
_tracerProvider.Dispose();
}
disposedValue = true;
}
}
public void Dispose()
{
// Do not change this code.
// Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
Примечание. Я внедряю AzureOpenTelemetryLoggerService через Windsor DI, который работает как положено.
Код: Выделить всё
public Task Handle(SomeChangeMessage message, IMessageHandlerContext context)
{
using (var activitySource
= _azureOpenTelemetryLoggerService
.GetActivitySource(AzureOpenTelemetryLoggerService
.ActivitySourceEnum
.SomeActivitySourceToListenTo))
{
// this is always a valid object
Log.Debug("activitySource is created {@activitySource}", activitySource);
using (var handleMessageActivity
= activitySource?
.CreateActivity($"Handle SomeChangeMessage message",
ActivityKind.Internal))
{
// first time is valid object.
// after 10-15 min when I process another message,
// his object and below is null
// so no temetry gets written
Log.Debug("handleMessageActivity " +
"is created {@handleMessageActivity}",
handleMessageActivity);
handleMessageActivity?.SetTag("Tag1", "someVal");
ActivityContext? linkedContext = handleMessageActivity?.Context;
var links = new List();
if (linkedContext.HasValue)
{
links.Add(new ActivityLink(linkedContext.Value));
}
foreach (var personId in message.SomeList.Select(a => a.personId)
.Distinct())
{
using (var processPartyActivity = activitySource?
.StartActivity(kind: ActivityKind.Client,
links: links, name: "process party"))
{
Log.Information("Process start for {personId}", personId);
// more stuff
Log.Information("Process complete for {personId}", personId);
}
}
}
}
return Task.CompletedTask;
}
Код: Выделить всё
container.Register(
Component.For()
.ImplementedBy()
.DependsOn(
Dependency.OnAppSettingsValue("connectionString",
"AzureAppInsightsConnectionString"))
.LifestyleSingleton())

< /p>
Результат второго вызова:

Подробнее здесь: https://stackoverflow.com/questions/758 ... -app-start
Мобильная версия