Condividi tramite


Usare Application Insights per i dati di telemetria di .NET Aspire

Azure Application Insights, una funzionalità di Azure Monitor, eccelle nella gestione delle prestazioni delle applicazioni (APM) per le applicazioni web attive. I progetti .NET Aspire sono progettati per utilizzare OpenTelemetry per i dati di telemetria dell'applicazione. OpenTelemetry supporta un modello di estensione per supportare l'invio di dati a diverse API. .NET .NET Aspire usa OTLP per impostazione predefinita per l'esportazione dei dati di telemetria, che viene usata dal dashboard durante lo sviluppo. Azure Monitor non supporta ancora OTLP, quindi le applicazioni devono essere modificate per utilizzare l'esportatore Azure Monitor e configurate con la stringa di connessione.

Per usare Application Insights, si specifica la configurazione nel progetto host dell'app e si usa la distribuzione Azure Monitor nel progetto del servizio predefinito.

Scelta del metodo di provisioning di Application Insights

.NET Aspire ha la possibilità di effettuare il provisioning delle risorse cloud come parte della distribuzione cloud, incluso Application Insights. Nel progetto di .NET Aspire, è possibile decidere se si vuole che .NET Aspire effettui il provisioning di una risorsa Application Insights quando si distribuisce su Azure. È anche possibile selezionare di usare una risorsa di Application Insights esistente specificandone la stringa di connessione. Le informazioni di connessione sono gestite dalla configurazione delle risorse nel progetto host dell'app.

Erogazione di Application Insights durante la distribuzione di Azure

Con questa opzione, un'istanza di Application Insights verrà creata per te quando l'applicazione viene distribuita usando il Azure Developer CLI (azd).

Per usare il provisioning automatico, specificare una dipendenza nel progetto host dell'app e farvi riferimento in ogni progetto/risorsa che deve inviare dati di telemetria a Application Insights. I passaggi includono:

  • Aggiungere un riferimento al pacchetto NuGet a Aspire.Hosting.Azure.ApplicationInsights nel progetto host dell'app.

  • Aggiornare il codice host dell'app per usare la risorsa Application Insights e farvi riferimento da ogni progetto:

var builder = DistributedApplication.CreateBuilder(args);

// Automatically provision an Application Insights resource
var insights = builder.AddAzureApplicationInsights("MyApplicationInsights");

// Reference the resource from each project 
var apiService = builder.AddProject<Projects.ApiService>("apiservice")
    .WithReference(insights);

builder.AddProject<Projects.Web>("webfrontend")
    .WithReference(apiService)
    .WithReference(insights);

builder.Build().Run();

Seguire la procedura descritta in Distribuire un progetto di .NET Aspire per Azure Container Apps usando la Azure Developer CLI (guida dettagliata) per distribuire l'applicazione in Azure Container Apps. azd creerà una risorsa Application Insights come parte dello stesso gruppo di risorse e configurerà la stringa di connessione per ogni contenitore.

Provisioning manuale della risorsa di Application Insights

Application Insights usa una stringa di connessione per dire all'esportatore OpenTelemetry dove inviare i dati di telemetria. La stringa di connessione è specifica dell'istanza di Application Insights a cui inviare i dati di telemetria. È disponibile nella pagina Panoramica dell'istanza di Application Insights.

posizionamento della stringa di connessione nell'interfaccia utente del portale di AzureApplication Insights.

Se si vuole usare un'istanza di Application Insights di cui è stato eseguito il provisioning manualmente, è necessario usare l'API AddConnectionString nel progetto host dell'app per indicare ai progetti/contenitori dove inviare i dati di telemetria. La distribuzione di Azure Monitor prevede che la variabile di ambiente sia APPLICATIONINSIGHTS_CONNECTION_STRING, in modo che sia necessario impostare in modo esplicito quando si definisce la stringa di connessione.

var builder = DistributedApplication.CreateBuilder(args);

var insights = builder.AddConnectionString(
    "myInsightsResource",
    "APPLICATIONINSIGHTS_CONNECTION_STRING");

var apiService = builder.AddProject<Projects.ApiService>("apiservice")
    .WithReference(insights);

builder.AddProject<Projects.Web>("webfrontend")
    .WithReference(apiService)
    .WithReference(insights);

builder.Build().Run();

Utilizzo delle risorse durante lo sviluppo

Quando si esegue il progetto .NET.NET Aspire localmente, il codice precedente legge la stringa di connessione dalla configurazione. Poiché si tratta di un segreto, è necessario archiviare il valore nei segreti dell'app . Fare clic con il pulsante destro del mouse sul progetto host dell'app e scegliere Gestisci segreti dal menu di scelta rapida per aprire il file dei segreti del progetto host dell'app. Nel file aggiungere la chiave e la stringa di connessione specifica, l'esempio seguente è a scopo illustrativo.

{
  "ConnectionStrings": {
    "myInsightsResource": "InstrumentationKey=12345678-abcd-1234-abcd-1234abcd5678;IngestionEndpoint=https://westus3-1.in.applicationinsights.azure.com"
  }
}

Nota

Il name specificato nel codice host dell'app deve corrispondere a una chiave all'interno della sezione ConnectionStrings nel file delle impostazioni.

Utilizzo delle risorse durante la distribuzione

Quando la distribuzione di un'applicazione Aspire con Azure Developer CLI (azd), riconoscerà la risorsa stringa di connessione e richiederà un valore. In questo modo è possibile usare una risorsa diversa per la distribuzione dal valore usato per lo sviluppo locale.

Distribuzione mista

Se si vuole usare un meccanismo di distribuzione diverso per ogni contesto di esecuzione, usare l'API appropriata in modo condizionale. Ad esempio, il codice seguente usa una connessione pre-fornita in fase di sviluppo e una risorsa di cui è stato effettuato automaticamente il provisioning in fase di distribuzione.

var builder = DistributedApplication.CreateBuilder(args);

var insights = builder.ExecutionContext.IsPublishMode
    ? builder.AddAzureApplicationInsights("myInsightsResource")
    : builder.AddConnectionString("myInsightsResource", "APPLICATIONINSIGHTS_CONNECTION_STRING");

var apiService = builder.AddProject<Projects.ApiService>("apiservice")
    .WithReference(insights);

builder.AddProject<Projects.Web>("webfrontend")
    .WithReference(apiService)
    .WithReference(insights);

builder.Build().Run();

Suggerimento

Il codice precedente richiede di fornire le informazioni sulla stringa di connessione nei segreti dell'app per l'uso durante lo sviluppo, e a azd verrà richiesto di fornire la stringa di connessione in fase di distribuzione.

Utilizzare la distribuzione Azure Monitor

Per rendere più semplice l'esportazione in Azure Monitor, questo esempio utilizza il repo esportatore Azure Monitor. Si tratta di un pacchetto wrapper del pacchetto Azure Monitor OpenTelemetry Exporter che semplifica l'esportazione in Azure Monitor con un set di valori predefiniti comuni.

Aggiungere il pacchetto seguente al progetto ServiceDefaults, in modo che venga incluso in ognuno dei servizi .NET.NET Aspire. Per altre informazioni, vedere impostazioni predefinite del servizio .NET.NET Aspire.

<PackageReference Include="Azure.Monitor.OpenTelemetry.AspNetCore" 
                  Version="*" />

Aggiungi un'istruzione using all'inizio del progetto.

using Azure.Monitor.OpenTelemetry.AspNetCore;

Rimuovere il commento dalla riga in AddOpenTelemetryExporters per utilizzare l'utilità di esportazione Azure Monitor:

private static IHostApplicationBuilder AddOpenTelemetryExporters(
    this IHostApplicationBuilder builder)
{
    // Omitted for brevity...

    // Uncomment the following lines to enable the Azure Monitor exporter 
    // (requires the Azure.Monitor.OpenTelemetry.AspNetCore package)
    if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
    {
        builder.Services.AddOpenTelemetry().UseAzureMonitor();
    }
    return builder;
}

È possibile personalizzare ulteriormente l'esportatore Azure Monitor, inclusa la personalizzazione del nome della risorsa e la modifica del campionamento. Per ulteriori informazioni, vedere Personalizza l'esportatore di monitor Azure. Usando la versione senza parametri di UseAzureMonitor(), la stringa di connessione verrà presa dalla variabile di ambiente APPLICATIONINSIGHTS_CONNECTION_STRING, che abbiamo configurato tramite il progetto host dell'app.