Application Insights - Undefined Cloud Role Name with 2.4.0-beta3

Viewed 6158

We're trying out the app insights multi role preview as announced here:

https://azure.microsoft.com/en-us/blog/app-insights-microservices/

https://docs.microsoft.com/en-us/azure/application-insights/app-insights-monitor-multi-role-apps#use-cloudrolename-to-separate-components

We've added the 2.4.0-beta3 packages for appinsights & appinsights.windowsserver as the app we're using is hosted on prem (IIS) currently.

Our cloud_rolename seems to be undefined in our request telemetry. Is there anything further we need to do other than updating the packages?

We also found this:

AzureRoleEnvironmentTelemetryInitializer updates the RoleName and RoleInstance properties of the Device context for all telemetry items with information extracted from the Azure runtime environment.

..though our Cloud_RoleInstance property is being properly populated.

6 Answers

In web applications, Cloud_RoleName is a value of an environment variable WEBSITE_SITE_NAME which is set automatically when hosted in Azure.
For on-premises you can set this variable manually.
For debugging environment variables can be set in Project settings > Debug > Environment variables (example).

Source code of Application insights where Cloud_RoleName is retrieved.

If you are using @microsoft/applicationinsights-web npm package then shorter version would be:

const appInsights = new ApplicationInsights({
    config: {
        instrumentationKey: 'your instrumentation key'
    }
});
appInsights.loadAppInsights();
appInsights.addTelemetryInitializer((telemetryItem) => {
    telemetryItem.tags['ai.cloud.role'] = 'your app name';
});

This was an edit to Brian's answer but it was rejected which is illogical tbh.

If you want to include cloud role instance and name with the app insights js sdk, I had success doing this:

appInsights.queue.push(() => {
    appInsights.context.addTelemetryInitializer((envelope) => {
      envelope.tags["ai.cloud.role"] = "your role name";
      envelope.tags["ai.cloud.roleInstance"] = "your role isntance";
    });
});

You should add this in your layout/master pages with the Application Insights initialization script right before appInsights.trackPageView(); so it becomes:

var appInsights=window.appInsights||function(config)
{
    function r(config){ t[config] = function(){ var i = arguments; t.queue.push(function(){ t[config].apply(t, i)})} }
    var t = { config:config},u=document,e=window,o='script',s=u.createElement(o),i,f;for(s.src=config.url||'//az416426.vo.msecnd.net/scripts/a/ai.0.js',u.getElementsByTagName(o)[0].parentNode.appendChild(s),t.cookie=u.cookie,t.queue=[],i=['Event','Exception','Metric','PageView','Trace','Ajax'];i.length;)r('track'+i.pop());return r('setAuthenticatedUserContext'),r('clearAuthenticatedUserContext'),config.disableExceptionTracking||(i='onerror',r('_'+i),f=e[i],e[i]=function(config, r, u, e, o) { var s = f && f(config, r, u, e, o); return s !== !0 && t['_' + i](config, r, u, e, o),s}),t
}({
    instrumentationKey:'Instrumentation Key'
});

window.appInsights = appInsights;
appInsights.queue.push(() => {
    appInsights.context.addTelemetryInitializer((envelope) => {
      envelope.tags["ai.cloud.role"] = "your role name";
      envelope.tags["ai.cloud.roleInstance"] = "your role isntance";
    });
});
appInsights.trackPageView();    

Source1: Modifying and Filtering Telemetry with AppInsights JavaScript SDK Telemetry Initializer

Source2: Filtering and preprocessing telemetry in the Application Insights SDK

SDK Reference: addTelemetryInitializer

Related