Miroslav Holec
Premium

Application Insights v ASP.NET Core aplikacích

Miroslav Holec   27. dubna 2017  update 19. června 2017

Tento článek byl napsán v roce 2017. Vývojářské technologie se neustále inovují a článek již nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.

V minulosti jsem napsal rozsáhlý článek o sběru telemetrií v Application Insights. Protože ASP.NET Core dokráčel do podoby, ve které už je relativně dobře použitelný i v produkčním prostředí, začaly se hromadit dotazy o tom, jak a kde provést konfiguraci služby. Nastavení Application Insights v ASP.NET Core kompletně popisuji v tomto článku.

Související článek

Pokud si chcete o Application Insigts udělat skutečně kompletní přehled, doporučuji začít článkem níže, ve kterém popisuji jak a kde se vytváří telemetrie a jak jsou zpracovávány.

Pokud již používáte Application Insights a máte problémy vejít se do kvót (během dne se vám přestanou sbírat telemetrie), pak doporučuji článek:

a pokud to nemáte daleko do Bratislavy, přijďte 13. května na konferenci DevDays 2017, kde budu o diagnostice webových aplikací mluvit.

devdays-bslava-2017

Základní konfigurace v ASP.NET Core

Prvním krokem je instalace NuGet balíčku:

Microsoft.ApplicationInsights.AspNetCore

Tento balíček si s sebou stáhne tradičně mraky závislostí. Kromě některých společných závislostí, které už jsou známé z minulosti (DependencyCollector, PerfCounterCollector) si stáhne i třídy s podpůrnými extension metodami typickými pro ASP.NET Core.

Registrace služby a předání konfigurace

Samotná registrace lze provést ve Startup.cs v metodě ConfigureServices:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
	services.AddApplicationInsightsTelemetry(Configuration);
}

Configuration je property, kterou si plním v konstruktoru třídy Startup.cs. Pravděpodobně už ve vlastním kódu naleznete něco takového:

private IConfigurationRoot Configuration { get; }

public Startup(.......)
{
	var builder = new ConfigurationBuilder()..........
	Configuration = builder.Build();
}

Pro správné fungování je nezbytné předat také instrumentační klíč ze služby Application Insights. Standardní (doporučená) cesta je rozšířit si konfigurační soubor appsettings.json o novou sekci:

{
	"ApplicationInsights" : {
		"InstrumentationKey" : "0000000000000000000"
	},
	"AppSettings" : {
		"ApplicationName" : "xxx",
	}
}

Tím, že metoda AddApplicationInsightsTelemetry dostane přímo Configuration objekt, při nastavení služby se předpokládá výše uvedená struktura JSON souboru.

FAQ

A teď přichází na řadu plno otázek, na které už odpovím formou FAQ.

Je možné předat instrumentační klíč odjinud?

Ano. Místo předání objektu Configuration do metody AddApplicationInsightsTelemetry lze předat přímo intrumentační klíč nebo konfigurační objekt typu ApplicationInsightsServiceOptions.

Dá se nastavit přes appsettings.json i něco dalšího?

Zmíněná třída ApplicationInsightsServiceOptions obsahuje všechna konfigurační nastavení, která jsou z JSONu deserializována. Vlastností, které lze nastavit, je celá řada:

  • EnableQuickPulseMetricStream:bool
  • EnableAdaptiveSampling:bool
  • IntrumentationKey:string
  • ApplicationVersion:string
  • DeveloperMode:bool?
  • atd...

ApplicationVersion doporučuji nenastavovat. Verze se resolvuje automaticky z AssemblyInfo.Version.

Naše aplikace nemůže posílat data do Azure, lze to nějak řešit?

Jedno z konfiguračních nastavení ApplicationInsightsServiceOptions je stringová vlastnost EndpointAddress. Na explicitně nastavenou URL pak TelemetryChannel odesílá telemetrie, které by standardně posílal do Azure. Lze tak telemetrie posílat na vlastní interní službu (proxy) a z ní je dále přeposílat do Azure nebo někam jinam.

Je nutné konfigurovat sběr závislostí nebo performance telemetrií?

Není to potřeba. Zavoláním AddApplicationInsightsTelemetry se automaticky registrují interní TelemetryInicializers a TelemetryModules, mezi kterými je i PerformanceCollectorModule a DependencyCollectorModule. Všechny tyto moduly se včetně samotné služby registrují se singleton lifestylem.

K čemu slouží metody UseApplicationInsightsRequestTelemetry a UseApplicationInsightsExceptionTelemetry, které vídám v příkladech na internetu?

K ničemu. Jedná se o starý způsob registrace ve formě middlewarů. V nových SDK jsou již tyto metody Obsolete a není je nutné (ani žádoucí) registrovat.

Mohu nějakým způsobem změnit konfiguraci za běhu?

Při registraci služeb se registruje i třída TelemetryClient a s ní související TelemetryConfiguration. Aktuální konfiguraci lze získat odkudkoliv voláním:

TelemetryConfiguration config = TelemetryConfiguration.Active;

Přesně toto volání bychom našli i v konstruktoru třídy TelemetryClient. Obě třídy jsou singleton a právě třídu TelemetryClient si vývojář injectuje na místa, kde chce explicitně něco logovat. K aktuální konfiguraci lze přistoupit následně:

public MyClass
{
	public MyClass(TelemetryContext telemetryContext)
	{
		TelemetryConfiguration.Active.InstrumentationKey = "";
		TelemetryConfiguration.Active.DisableTelemetry = true;
	}
}

Ještě jednou upozorňuji, že všechny instance jsou singletonem a změna konfigurace za běhu je statická a zároveň nezaručená (např.: při restartu aplikace se znovu provede výchozí konfigurace).

Jak si registruji vlastní telemetry procesory?

Doporučené místo je třída Startup.cs. Zde je možné přistoupit opět na aktuální konfiguraci Application Insights (viz. bod výše) a doregistrovat potřebné procesory.

var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder;
builder.Use((next) => new SuccessfulDependencyFilter(next));
builder.Build();

Napadají vás další otázky ohledně Application Insights v ASP.NET Core? Zeptejte se v diskusi pod článkem.

ADNP
ASOCIACE