Не задано имя облачной роли .NET Framework Windows Server

#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» находится в телеметрии = Радость! Похоже, это также исправляет «Карту приложений» — у меня больше нет узла с вызовами к самому себе, как показано на изображении выше!

Мне все еще интересно, как это сделать «правильным способом», если кто-нибудь может сказать мне, я был бы признателен!