Открытая телеметрия Azure: активность равна нулю через несколько минут после запуска приложенияC#

Место общения программистов C#
Ответить
Anonymous
 Открытая телеметрия Azure: активность равна нулю через несколько минут после запуска приложения

Сообщение Anonymous »

У меня есть служба Windows, которая обрабатывает сообщения служебной шины Azure. Когда я развертываю этот код на сервере контроля качества, первые несколько сообщений получены, телеметрия работает отлично. Я вижу всю информацию, включая теги, которые ожидаю увидеть. Затем, если в течение, скажем, 15 минут не публикуются сообщения, любое сообщение, полученное через 15 минут, не содержит данных телеметрии. Есть ли какой-то тайм-аут простоя или что-то еще, что мне не хватает?
Я могу подтвердить, что объект 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»