This post is a continuation of my series about using Application Insights in ASP.NET Core. Today we will explore the concept of Cloud Role and why it's an important thing to get right for your application.
In any application that involves more than a single server process/service, the concept of Cloud Role becomes really important in Application Insights. A Cloud Role roughly represents a process that runs somewhere on a server or possibly on a number of servers. A cloud role made up of 2 things: a cloud role name and a cloud role instance.
Cloud Role Name
The cloud role name is a logical name for a particular process. For example, I might have a cloud role name of "Front End" for my front end web server and a name of "Weather Service" for a service that is responsible for providing weather data.
When a cloud role name is set, it will appear as a node in the Application Map. Here is an example showing a Front End role and a Weather Service role.
However, when Cloud Role Name is not set, we end up with a misleading visual representation of how our services communicate.
By default, the application insights SDK attempts to set the cloud role name for you. For example, when you're running in Azure App Service, the name of the web app is used. However, when you are running in an on-premise VM, the cloud role name is often blank.
Cloud Role Instance
The cloud role instance tells us which specific server the cloud role is running on. This is important when scaling out your application. For example, if my Front End web server was running 2 instances behind a load balancer, I might have a cloud role instance of "frontend_prod_1" and another instance of "frontend_prod_2".
The application insights SDK sets the cloud role instance to the name of the server hosting the service. For example, the name of the VM or the name of the underlying compute instance hosting the app in App Service. In my experience, the SDK does a good job here and I don't usually need to override the cloud role instance.
Setting Cloud Role Name using a Telemetry Initializer
Telemetry Initializers are a powerful mechanism for customizing the telemetry that is collected by the Application Insights SDK. By creating and registering a telemetry initializer, you can overwrite or extend the properties of any piece of telemetry collected by Application Insights.
To set the Cloud Role Name, create a class that implements
ITelemetryInitializer and in the
Initialize method set the
telemetry.Context.Cloud.RoleName to the cloud role name for the current application.
public class CloudRoleNameTelemetryInitializer : ITelemetryInitializer
Next, in the
Startup.ConfigureServices method, register that telemetry initializer as a singleton.
For those who learn by watching, I have recorded a video talking about using telemetry initializers to customize application insights.
Using a Nuget Package
Creating a custom telemetry initializer to set the cloud role name is a simple enough, but it's something I've done so many times that I decided to publish a Nuget package to simplify it even further.
First, add the
AspNetMonsters.ApplicationInsights.AspNetCore Nuget package:
dotnet add package AspNetMonsters.ApplicationInsights.AspNetCore
Next, in call
AddCloudRoleNameInitializer in your application's
Filtering by Cloud Role
Setting the Cloud Role Name / Instance is about a lot more than seeing your services laid out properly in the Application Map. It's also really important when you starting digging in to the performance and failures tabs in the Application Insights portal. In fact, on most of the sections of the portal, you'll see this Roles filter.
The default setting is all. When you click on it, you have the option to select any combination of your application's role names / instances. For example, maybe I'm only interested in the FrontEnd service and WeatherService that were running on the dave_yoga920 instance.
These filters are extremely useful when investigating performance or errors on a specific server or within a specific service. The more services your application is made up of, the more useful and essential this filtering become. These filters really help focus in on specific areas of an application within the Application Insights portal.
In this post, we saw how to customize telemetry data using telemetry initializers. Setting the cloud role name is a simple customization that can help you navigate the massive amount of telemetry that application insights collects. In the next post, we will explore a more in complex example of using telemetry initializers.