Search code examples
azureazure-application-insightsazure-container-apps

How can I get cloudRoleName and cloudRoleInstance logged with Application Insights with a .NET Azure Container App?


When hosting an ASP.NET Core application on Azure Container Apps, cloudRoleName and cloudRoleInstance are currently not logged (or left empty) with Application Insights.


Solution

  • When initializing add a custom initializer like:

    using Microsoft.ApplicationInsights.Extensibility;
    using Microsoft.AspNetCore.Mvc;
    using Models;
    using Utils;
    
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddApplicationInsightsTelemetry();
    builder.Services.Configure<TelemetryConfiguration>((o) =>
    {
        o.TelemetryInitializers.Add(new AppInsightsTelemetryInitializer());
    });
    

    and then initialize with

    using Microsoft.ApplicationInsights.Channel;
    using Microsoft.ApplicationInsights.Extensibility;
    
    namespace Utils
    {
    
        public class AppInsightsTelemetryInitializer : ITelemetryInitializer
        {
            public void Initialize(ITelemetry telemetry)
            {
                if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
                {
                    telemetry.Context.Cloud.RoleName = System.Environment.GetEnvironmentVariable("CONTAINER_APP_NAME") ?? "CONTAINER_APP_NAME-not-set";
                }
                if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleInstance))
                {
                    telemetry.Context.Cloud.RoleInstance = System.Environment.GetEnvironmentVariable("HOSTNAME") ?? "HOSTNAME-not-set";
                }
            }
        }
    
    }