Application Insights is an excellent tool to capture telemetry for your application but it may be too verbose. On this post we will review how to exclude unnecessary requests.
Photo by Michael Dziedzic on Unsplash |
On a previous post we learned how to add Application Insights telemetry to ASP.NET applications. Turns out that we also saw that a lot of unnecessary telemetry was being sent. How to filter some of that telemetry?
On this post we will explain how to suppress telemetry by using AppInsights' DependencyTelemetry and ITelemetryProcessor.
Understanding telemetry pre-processing
You can write and configure plug-ins for the Application Insights API to customize how telemetry can be enriched and processed before it's sent to the Application Insights service in four different ways:- Sampling - reduces the volume of telemetry without affecting statistics. Keeps together related data points so we can navigate between points when diagnosing a problem.
- Filtering with Telemetry Processors - filters out telemetry before it is sent to the server. For example, you could reduce the volume of telemetry by excluding requests from robots. Filtering is a more basic approach to reducing traffic than sampling. It allows you more control over what is transmitted, but affects your statistics.
- Telemetry Initializers - lets you add or modify properties to any telemetry sent from your app. For example, you could add calculated values; or version numbers by which to filter the data in the portal.
Suppressing Dependencies
So let's create a custom filter that will suppress some of that telemetry. For example, below I show all the telemetry that was automatically sent from my application to Azure with just one line of code. Our code will suppress the data shown in yellow.Creating a Telemetry Processor
There are different types of telemetry filters being RequestTelemetry and DependencyTelemetry the most common. These classes contain properties that are useful for our logic. So let's create a filter that excludes requests to favicon.ico, bootstrap, jquery, site.css and site.js.To get rid of some of these requests, we will implement a custom filter that I named SuppressStaticResourcesFilter to ignore requests those static resources. Our telemetry processor should implement the interface ITelemetryProcessor. Note the logic to exclude requests in the Process method:
Registering a Telemetry Processor
Now, we just need to wire it up on the initialization of our app. As stated on this document, the initialization is different for ASP.NET Core and ASP.NET MVC. Let's take a look at each of them.The registration of a telemetry processor in ASP.NET Core is done in Startup.cs:
Configuring a telemetry processor on ASP.NET is done in Global.asax:
Wait a couple of minutes for the telemetry to show up online. You should no longer see those requests targeting static resources:
How many filters?
Well, that's up to you. You could create as many filters as you want. The only change would be on the initialization. For example, assuming For ASP.NET Core web apps, it would look like:
public void ConfigureServices(IServiceCollection services)
{
services.AddApplicationInsightsTelemetry();
services.AddApplicationInsightsTelemetryProcessor<SuppressStaticResourcesFilter>();
services.AddApplicationInsightsTelemetryProcessor<YourOtherFilter1>();
services.AddApplicationInsightsTelemetryProcessor<YourOtherFilter2>();
services.AddControllersWithViews();
}
For classic ASP.NET MVC Web, the initialization would be:
{
services.AddApplicationInsightsTelemetry();
services.AddApplicationInsightsTelemetryProcessor<SuppressStaticResourcesFilter>();
services.AddApplicationInsightsTelemetryProcessor<YourOtherFilter1>();
services.AddApplicationInsightsTelemetryProcessor<YourOtherFilter2>();
services.AddControllersWithViews();
}
var builder = TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder;
builder.Use((next) => new SuppressStaticResourcesFilter(next));
builder.Use((next) => new YourOtherFilter1(next));
builder.Use((next) => new YourOtherFilter2(next));
builder.Build();
builder.Use((next) => new SuppressStaticResourcesFilter(next));
builder.Use((next) => new YourOtherFilter1(next));
builder.Use((next) => new YourOtherFilter2(next));
builder.Build();
Enabling based on LogLevel
To finish up, we could extend the solution above by enabling the telemetry processors based on your LogLevel. For example, the code below wouldn't register processors to suppress data if LogLevel == debug:
public void ConfigureServices(IServiceCollection services)
{
services.AddApplicationInsightsTelemetry();
if (logLevel != "debug")
{
services.AddApplicationInsightsTelemetryProcessor<SuppressStaticResourcesFilter>();
}
services.AddControllersWithViews();
}
{
services.AddApplicationInsightsTelemetry();
if (logLevel != "debug")
{
services.AddApplicationInsightsTelemetryProcessor<SuppressStaticResourcesFilter>();
}
services.AddControllersWithViews();
}
Conclusion
On this post we extended the discussion on How to add Application Insights telemetry to ASP.NET websites and reviewed how to suppress some of that telemetry. I hope it's clear how to register your telemetry processor and how/when to use RequestTelemetry and DependencyTelemetry.If you're using Azure, AppInsights may be a valuable asset for your organization as it provides a simple, fast, centralized and customizable service to access your logs. For more information about AppInisights, check the official documentation.
References
- Filtering and preprocessing telemetry in the Application Insights SDK
- Application Insights API for custom events and metrics
- DependencyTelemetry Class
- ITelemetryProcessor
More about AppInsights
Want to know more about Application Insights? Consider reading previous articles on the same topic:- Adding Application Insights telemetry to your ASP.NET Core website
- Monitor ASP.NET applications using Application Insights and Azure Alerts
- How to profile ASP.NET apps using Application Insights
Source Code
The source code used on this article is available on GitHub on the telemetry branch.See Also
- Microservices in ASP.NET
- My journey to 1 million articles read
- Creating ASP.NET Core websites with Docker
- Send emails from ASP.NET Core websites using SendGrid and Azure
- Hosting NuGet packages on GitHub
- Configuration in .NET Core console applications
- Deploying Docker images to Azure App Services
- Building and Running ASP.NET Core apps on Linux
- Running NServiceBus on Azure WebJobs
- Enabling ASP.NET error pages using Azure Serial Console
- How to create a Ubuntu Desktop instance on Azure
- Why I use Fedora Linux
- Windows Subsystem for Linux, the best way to learn Linux on Windows
- How I fell in love with i3