#c# #azure-application-insights
#c# #azure-application-insights
Вопрос:
Я пытаюсь добавить имя cloud_RoleName в телеметрию моего приложения Insights в службе Windows .NET 4.8 Framework (например, консольное приложение и т.д.). Я использую пакет nuget Microsoft.Права приложения.WindowsServer и ApplicationInsights.config для настройки всего, но я просто не могу заполнить RoleName.
Я пытался использовать это:
<TelemetryInitializers>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer"/>
</TelemetryInitializers>
но это вызывает исключение:
Unexpcted Exception During Runtime Startup:
System.TypeInitializationException: The type initializer for '<Module>' threw an exception. ---> <CrtImplementationDetails>.ModuleLoadException: The C module failed to load while attempting to initialize the default appdomain.
---> System.Runtime.InteropServices.COMException: Invalid operation. (Exception from HRESULT: 0x80131022)
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at <CrtImplementationDetails>.GetDefaultDomain()
at <CrtImplementationDetails>.DoCallBackInDefaultDomain(IntPtr function, Void* cookie)
at <CrtImplementationDetails>.LanguageSupport.InitializeDefaultAppDomain(LanguageSupport* )
at <CrtImplementationDetails>.LanguageSupport._Initialize(LanguageSupport* )
at <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* )
--- End of inner exception stack trace ---
at <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* )
at .cctor()
--- End of inner exception stack trace ---
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeEnvironment()
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment..cctor()
Я использую несколько других приложений, работающих в одной и той же среде и регистрирующихся в одном и том же InstrumentationKey, но без заполненного RoleName трудно определить, какое приложение регистрирует какие данные, и моя карта приложений выглядит следующим образом:
Является ли использование RoleName правильным подходом здесь, и если да, то как мне заставить AzureRoleEnvironmentTelemetryInitializer вести себя?
—==ОБНОВИТЬ==—
Мне удалось исправить исключение с помощью useLegacyV2RuntimeActivationPolicy=»true» в app.config программы. И теперь у меня новая ошибка:
Microsoft.WindowsAzure.ServiceRuntime Information: 100 : Role environment . INITIALIZING
Microsoft.WindowsAzure.ServiceRuntime Information: 100 : Role environment . INITIALED RETURNED. HResult=-2147024894
Microsoft.WindowsAzure.ServiceRuntime Error: 102 : Role environment . FAILED TO INITIALIZE. hr: -2147024894
Ошибка -2147024894, похоже, ошибка типа «Файл не найден»
Имя роли облака по-прежнему пусто
Ответ №1:
Хорошо, у меня есть решение для загрузки инициализатора AzureRoleEnvironmentTelemetryInitializer без ошибок, но, к сожалению, он, похоже, не заполняет cloud RoleName, поэтому мне пришлось попробовать что-то еще (ниже).
Исправления были:
1 — Специальный атрибут в app.config
<startup useLegacyV2RuntimeActivationPolicy="true">
2 — Должна быть определена специальная переменная среды
Environment.SetEnvironmentVariable("WEBSITE_SITE_NAME", "UndocumentedEnvironmentVariablesAreNotGreat");
и это помогает загрузить инициализатор AzureRoleEnvironmentTelemetryInitializer (больше ошибок нет), но не решает мою актуальную проблему с пустым именем роли.
Мне пришлось добавить некоторый пользовательский код, чтобы заставить это работать:
public class MyWebTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
telemetry.Context.Cloud.RoleName = "MyRoleName";
}
}
А затем добавьте пользовательский инициализатор ITelemetryInitializer в ApplicationInsights.config:
<TelemetryInitializers>
<Add Type="MyNamespace.MyWebTelemetryInitializer, FrameworkConsoleApp3"/>
...
</TelemetryInitializers>
и теперь «ai.cloud.role»: «MyRoleName» находится в телеметрии = Радость! Похоже, это также исправляет «Карту приложений» — у меня больше нет узла с вызовами к самому себе, как показано на изображении выше!
Мне все еще интересно, как это сделать «правильным способом», если кто-нибудь может сказать мне, я был бы признателен!