Telemetrikanaler i Application Insights

Telemetrikanaler är en integrerad del av Application Insights SDK:er. De hanterar buffring och överföring av telemetri till Application Insights-tjänsten. .NET- och .NET Core-versionerna av SDK:erna har två inbyggda telemetrikanaler: InMemoryChannel och ServerTelemetryChannel. Den här artikeln beskriver varje kanal och visar hur du anpassar kanalbeteendet.

Kommentar

Följande dokumentation förlitar sig på det klassiska API:et Application Insights. Den långsiktiga planen för Application Insights är att samla in data med OpenTelemetry. Mer information finns i Aktivera Azure Monitor OpenTelemetry för .NET-, Node.js-, Python- och Java-program och vår OpenTelemetry-översikt. Migreringsvägledning är tillgänglig för .NET, Node.js och Python.

Vad är telemetrikanaler?

Telemetrikanaler ansvarar för buffring av telemetriobjekt och skickar dem till Application Insights-tjänsten, där de lagras för frågor och analys. En telemetrikanal är alla klasser som implementerar Microsoft.ApplicationInsights.ITelemetryChannel gränssnittet.

Metoden Send(ITelemetry item) för en telemetrikanal anropas när alla telemetriinitierare och telemetriprocessorer anropas. Därför når inte alla objekt som tappas av en telemetriprocessor kanalen. Metoden Send() skickar vanligtvis inte objekten till serverdelen direkt. Vanligtvis buffrar den dem i minnet och skickar dem i batchar för effektiv överföring.

Live Metrics Stream har också en anpassad kanal som driver direktuppspelning av telemetri. Den här kanalen är oberoende av den vanliga telemetrikanalen och det här dokumentet gäller inte för den.

Inbyggda telemetrikanaler

Application Insights .NET och .NET Core SDK:er levereras med två inbyggda kanaler:

  • InMemoryChannel: En lätt kanal som buffrar objekt i minnet tills de skickas. Objekt buffrad i minnet och töms en gång var 30:e sekund, eller när 500 objekt buffrats. Den här kanalen ger minimala tillförlitlighetsgarantier eftersom den inte försöker skicka telemetri igen efter ett fel. Den här kanalen behåller inte heller objekt på disken. Så alla osedda objekt går förlorade permanent vid programavstängning, oavsett om det är graciöst eller inte. Den här kanalen implementerar en Flush() metod som kan användas för att tvinga bort alla minnesinterna telemetriobjekt synkront. Den här kanalen passar bra för kortvariga program där en synkron tömning är idealisk.

    Den här kanalen är en del av det större Microsoft.ApplicationInsights NuGet-paketet och är standardkanalen som SDK använder när inget annat har konfigurerats.

  • ServerTelemetryChannel: En mer avancerad kanal som har återförsöksprinciper och möjligheten att lagra data på en lokal disk. Den här kanalen försöker skicka telemetri igen om tillfälliga fel inträffar. Den här kanalen använder också lokal disklagring för att hålla objekt på disk under nätverksstopp eller stora telemetrivolymer. På grund av dessa mekanismer för återförsök och lokal disklagring anses den här kanalen vara mer tillförlitlig. Vi rekommenderar det för alla produktionsscenarier. Den här kanalen är standard för ASP.NET och ASP.NET Core-program som konfigureras enligt den officiella dokumentationen. Den här kanalen är optimerad för serverscenarier med tidskrävande processer. Metoden Flush() som implementeras av den här kanalen är inte synkron.

    Den här kanalen levereras som NuGet-paketet Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel och hämtas automatiskt när du använder antingen Microsoft.ApplicationInsights.Web eller Microsoft.ApplicationInsights.AspNetCore NuGet-paketet.

Konfigurera en telemetrikanal

Du konfigurerar en telemetrikanal genom att ställa in den på den aktiva telemetrikonfigurationen. För ASP.NET program innebär konfigurationen att du ställer in telemetrikanalinstansen till eller genom att TelemetryConfiguration.Active ApplicationInsights.configändra . För ASP.NET Core-program innebär konfigurationen att du lägger till kanalen i containern för beroendeinmatning.

I följande avsnitt visas exempel på hur du konfigurerar StorageFolder inställningen för kanalen i olika programtyper. StorageFolder är bara en av de konfigurerbara inställningarna. En fullständig lista över konfigurationsinställningar finns i avsnittet Konfigurerbara inställningar i kanaler senare i den här artikeln.

Konfiguration med hjälp av ApplicationInsights.config för ASP.NET program

I följande avsnitt från ApplicationInsights.config visas kanalen ServerTelemetryChannel som konfigurerats med StorageFolder inställd på en anpassad plats:

    <TelemetrySinks>
        <Add Name="default">
            <TelemetryProcessors>
                <!-- Telemetry processors omitted for brevity  -->
            </TelemetryProcessors>
            <TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel">
                <StorageFolder>d:\temp\applicationinsights</StorageFolder>
            </TelemetryChannel>
        </Add>
    </TelemetrySinks>

Konfiguration i kod för ASP.NET program

Följande kod konfigurerar en ServerTelemetryChannel instans med StorageFolder inställd på en anpassad plats. Lägg till den här koden i början av programmet, vanligtvis i Application_Start() metoden i Global.aspx.cs.

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;
protected void Application_Start()
{
    var serverTelemetryChannel = new ServerTelemetryChannel();
    serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
    serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
    TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;
}

Konfiguration i kod för ASP.NET Core-program

ConfigureServices Ändra -metoden för Startup.cs klassen enligt följande:

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;

public void ConfigureServices(IServiceCollection services)
{
    // This sets up ServerTelemetryChannel with StorageFolder set to a custom location.
    services.AddSingleton(typeof(ITelemetryChannel), new ServerTelemetryChannel() {StorageFolder = @"d:\temp\applicationinsights" });

    services.AddApplicationInsightsTelemetry();
}

Viktigt!

Det går inte att konfigurera kanalen med hjälp TelemetryConfiguration.Active av ASP.NET Core-program.

Konfiguration i kod för .NET/.NET Core-konsolprogram

För konsolappar är koden densamma för både .NET och .NET Core:

var serverTelemetryChannel = new ServerTelemetryChannel();
serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;

Driftinformation om ServerTelemetryChannel

ServerTelemetryChannel lagrar ankommande objekt i en minnesintern buffert. Objekten serialiseras, komprimeras och lagras i en instans en Transmission gång var 30:e sekund eller när 500 objekt har buffrats. En enskild Transmission instans innehåller upp till 500 objekt och representerar en batch telemetri som skickas via ett enda HTTPS-anrop till Application Insights-tjänsten.

Som standard kan högst 10 Transmission instanser skickas parallellt. Om telemetrin anländer snabbare, eller om nätverket eller Application Insights-serverdelen är långsam, Transmission lagras instanser i minnet. Standardkapaciteten för den här minnesinterna Transmission bufferten är 5 MB. När minnesintern kapacitet har överskridits Transmission lagras instanser på en lokal disk upp till en gräns på 50 MB.

Transmission instanser lagras på den lokala disken även när det finns nätverksproblem. Endast de objekt som lagras på en lokal disk överlever en programkrasch. De skickas när programmet startar igen. Om nätverksproblem kvarstår ServerTelemetryChannel använder du en exponentiell backoff-logik som sträcker sig från 10 sekunder till 1 timme innan du försöker skicka telemetri igen.

Konfigurerbara inställningar i kanaler

Den fullständiga listan över konfigurerbara inställningar för varje kanal finns i:

Här är de vanligaste inställningarna för ServerTelemetryChannel:

  • MaxTransmissionBufferCapacity: Den maximala mängden minne, i byte, som används av kanalen för att buffrar överföringar i minnet. När den här kapaciteten nås lagras nya objekt direkt på den lokala disken. Standardvärdet är 5 MB. Att ange ett högre värde leder till mindre diskanvändning, men kom ihåg att objekt i minnet går förlorade om programmet kraschar.
  • MaxTransmissionSenderCapacity: Det maximala antalet Transmission instanser som skickas till Application Insights samtidigt. Standardvärdet är 10. Den här inställningen kan konfigureras till ett högre tal, vilket vi rekommenderar när en stor mängd telemetri genereras. Hög volym inträffar vanligtvis under belastningstestning eller när samplingen är avstängd.
  • StorageFolder: Den mapp som används av kanalen för att lagra objekt på disk efter behov. I Windows används antingen %LOCALAPPDATA% eller %TEMP% om ingen annan sökväg uttryckligen anges. I andra miljöer än Windows måste du ange en giltig plats, annars lagras inte telemetri på den lokala disken.

Vilken kanal ska jag använda?

Vi rekommenderar för ServerTelemetryChannel de flesta produktionsscenarier som omfattar långvariga program. Metoden Flush() som implementeras av ServerTelemetryChannel är inte synkron. Det garanterar inte heller att alla väntande objekt skickas från minne eller disk.

Om du använder den här kanalen i scenarier där programmet håller på att stängas av kan du lägga till en viss fördröjning när du anropar Flush(). Den exakta fördröjning som du kan behöva är inte förutsägbar. Det beror på faktorer som hur många objekt eller Transmission instanser som finns i minnet, hur många som finns på disken, hur många som överförs till serverdelen och om kanalen befinner sig mitt i exponentiella säkerhetskopieringsscenarier.

Om du behöver göra en synkron tömning använder du InMemoryChannel.

Vanliga frågor och svar

Det här avsnittet innehåller svar på vanliga frågor.

Garanterar Application Insights-kanalen leverans av telemetri? Om inte, vilka är de scenarier där telemetri kan gå förlorad?

Det korta svaret är att ingen av de inbyggda kanalerna erbjuder en transaktionstypgaranti för telemetrileverans till serverdelen. ServerTelemetryChannel är mer avancerat jämfört med InMemoryChannel för tillförlitlig leverans, men det gör också bara ett bästa försök att skicka telemetri. Telemetri kan fortfarande gå förlorad i flera situationer, inklusive följande vanliga scenarier:

  • Objekt i minnet går förlorade när programmet kraschar.
  • Telemetri går förlorad under längre perioder av nätverksproblem. Telemetri lagras på lokal disk under nätverksfel eller när problem uppstår med Application Insights-serverdelen. Objekt som är äldre än 48 timmar tas dock bort.
  • Standarddiskplatserna för lagring av telemetri i Windows är %LOCALAPPDATA% eller %TEMP%. Dessa platser är vanligtvis lokala för datorn. Om programmet migreras fysiskt från en plats till en annan går all telemetri som lagras på den ursprungliga platsen förlorad.
  • I Azure Web Apps i Windows är standardplatsen för disklagring D:\local\LocalAppData. Den här platsen finns inte kvar. Den rensas i omstarter av appar, utskalningar och andra sådana åtgärder, vilket leder till förlust av telemetri som lagras där. Du kan åsidosätta standardinställningen och ange lagring till en bevarad plats som D:\home. Sådana bevarade platser hanteras dock av fjärrlagring och kan därför vara långsamma.

Även om det är mindre troligt är det också möjligt att kanalen kan orsaka dubbletter av telemetriobjekt. Det här beteendet inträffar när ServerTelemetryChannel återförsök på grund av nätverksfel eller timeout, när telemetrin levererades till serverdelen, men svaret gick förlorat på grund av nätverksproblem eller om tidsgränsen uppnåddes.

Fungerar ServerTelemetryChannel på andra system än Windows?

Även om namnet på paketet och namnområdet innehåller "WindowsServer" stöds den här kanalen på andra system än Windows, med följande undantag. På andra system än Windows skapar kanalen inte en lokal lagringsmapp som standard. Du måste skapa en lokal lagringsmapp och konfigurera kanalen så att den används. När lokal lagring har konfigurerats fungerar kanalen på samma sätt på alla system.

Kommentar

Med version 2.15.0-beta3 och senare skapas nu lokal lagring automatiskt för Linux, Mac och Windows. För icke-Windows-system skapar SDK automatiskt en lokal lagringsmapp baserat på följande logik:

  • ${TMPDIR}: Om ${TMPDIR} miljövariabeln har angetts används den här platsen.
  • /var/tmp: Om den tidigare platsen inte finns försöker /var/tmpvi .
  • /tmp: Om båda de tidigare platserna inte finns försöker tmpvi .
  • Om ingen av dessa platser finns skapas inte lokal lagring och manuell konfiguration krävs fortfarande. Fullständig implementeringsinformation finns i den här GitHub-lagringsplatsen.

Skapar SDK:et tillfällig lokal lagring? Krypteras data i lagringen?

SDK lagrar telemetriobjekt i lokal lagring under nätverksproblem eller under begränsning. Dessa data krypteras inte lokalt.

För Windows-system skapar SDK automatiskt en tillfällig lokal mapp i katalogen %TEMP% eller %LOCALAPPDATA% och begränsar åtkomsten till administratörer och endast den aktuella användaren.

För andra system än Windows skapas ingen lokal lagring automatiskt av SDK:n, så inga data lagras lokalt som standard.

Kommentar

Med version 2.15.0-beta3 och senare skapas nu lokal lagring automatiskt för Linux, Mac och Windows.

Du kan skapa en lagringskatalog själv och konfigurera kanalen så att den används. I det här fallet ansvarar du för att säkerställa att katalogen skyddas. Läs mer om dataskydd och sekretess.

SDK med öppen källkod

Precis som alla SDK:er för Application Insights är kanaler öppen källkod. Läsa och bidra till kod- eller rapportproblem på den officiella GitHub-lagringsplatsen.

Nästa steg