Monitorare Funzioni di AzureMonitor Azure Functions

PanoramicaOverview

Funzioni di Azure offre l'integrazione predefinita con Azure Application Insights per il monitoraggio delle funzioni.Azure Functions offers built-in integration with Azure Application Insights for monitoring functions. Questo articolo illustra come configurare Funzioni per inviare i dati di telemetria ad Application Insights.This article shows how to configure Functions to send telemetry data to Application Insights.

Esplora metriche di Application Insights

Funzioni dispone anche di funzionalità di monitoraggio incorporate che non usano Application Insights.Functions also has built-in monitoring that doesn't use Application Insights. Si consiglia di usare Application Insights perché offre un numero maggiore di dati e modalità di analisi dei dati migliori.We recommend Application Insights because it offers more data and better ways to analyze the data. Per informazioni sul monitoraggio predefinito, vedere l'ultima sezione di questo articolo.For information about the built-in monitoring, see the last section of this article.

Abilitare l'integrazione di Application InsightsEnable Application Insights integration

Affinché un'app per le funzioni invii dati ad Application Insights, è necessario conoscere la chiave di strumentazione di un'istanza di Application Insights.For a function app to send data to Application Insights, it needs to know the instrumentation key of an Application Insights instance. Esistono due modi per realizzare tale connessione nel portale di Azure:There are two ways to make that connection in the Azure portal:

Nuova app per le funzioniNew function app

Abilitare Application Insights nella pagina Crea dell'app per le funzioni:Enable Application Insights on the Function App Create page:

  1. Impostare l'interruttore di Application Insights su On (Attivo).Set the Application Insights switch On.

  2. Selezionare una Località di Application Insights.Select an Application Insights Location.

    Abilitare Application Insights mentre si crea un'app per le funzioni

App per le funzioni esistenteExisting function app

Ottenere la chiave di strumentazione e salvarla in un'app per le funzioni:Get the instrumentation key and save it in a function app:

  1. Creare l'istanza di Application Insights.Create the Application Insights instance. Impostare il tipo di applicazione su Generale.Set application type to General.

    Creare un'istanza di Application Insights di tipo Generale

  2. Copiare la chiave di strumentazione dalla pagina Informazioni di base dell'istanza di Application Insights.Copy the instrumentation key from the Essentials page of the Application Insights instance. Passare il mouse sulla parte finale del valore della chiave visualizzata per far comparire il pulsante Fare clic per copiare.Hover over the end of the displayed key value to get a Click to copy button.

    Copiare la chiave di strumentazione di Application Insights

  3. Nella pagina Impostazioni applicazione dell'app per le funzioni aggiungere un'impostazione applicazione facendo clic su Aggiungi nuova impostazione.In the function app's Application settings page, add an app setting by clicking Add new setting. Denominare la nuova impostazione APPINSIGHTS_INSTRUMENTATIONKEY e incollare la chiave di strumentazione copiata.Name the new setting APPINSIGHTS_INSTRUMENTATIONKEY and paste the copied instrumentation key.

    Aggiungere la chiave di strumentazione alle impostazioni dell'app

  4. Fare clic su Save.Click Save.

Disabilitare la registrazione predefinitaDisable built-in logging

Se si abilita Application Insights, è consigliabile disabilitare la registrazione predefinita che usa Archiviazione di Azure.If you enable Application Insights, we recommend that you disable the built-in logging that uses Azure storage. La registrazione predefinita risulta utile per i test con i carichi di lavoro leggeri, ma non è destinata all'uso in ambienti di produzione con carichi elevati.The built-in logging is useful for testing with light workloads but is not intended for high-load production use. Per il monitoraggio della produzione, è consigliabile usare Application Insights.For production monitoring, Application Insights is recommended. Se la registrazione predefinita viene usata in ambienti di produzione, è possibile che il record di registrazione non sia completo a causa delle limitazioni a livello di Archiviazione di Azure.If built-in logging is used in production, the logging record may be incomplete due to throttling on Azure Storage.

Per disabilitare la registrazione predefinita, eliminare l'impostazione app AzureWebJobsDashboard.To disable built-in logging, delete the AzureWebJobsDashboard app setting. Per informazioni su come eliminare le impostazioni app nel portale di Azure, vedere la sezione relativa alle impostazioni dell'applicazione in Come gestire un'app per le funzioni nel portale di Azure.For information about how to delete app settings in the Azure portal, see the Application settings section of How to manage a function app.

Quando si abilita Application Insights e si disabilita la registrazione predefinita, la scheda Monitoraggio per una funzione nel portale di Azure consente di passare ad Application Insights.When you enable Application Insights and disable built-in logging, the Monitor tab for a function in the Azure portal takes you to Application Insights.

Visualizzare i dati di telemetriaView telemetry data

Per passare da un'app per le funzioni nel portale all'istanza connessa di Application Insights, selezionare il collegamento Application Insights nella pagina Panoramica dell'app per le funzioni.To navigate to the connected Application Insights instance from a function app in the portal, select the Application Insights link on the function app's Overview page.

Per informazioni su come usare Application Insights, vedere la documentazione su Application Insights.For information about how to use Application Insights, see the Application Insights documentation. Questa sezione mostra alcuni esempi su come visualizzare i dati in Application Insights.This section shows some examples of how to view data in Application Insights. Se si ha già familiarità con Application Insights, è possibile passare direttamente alle sezioni sulla configurazione e la personalizzazione dei dati di telemetria.If you are already familiar with Application Insights, you can go directly to the sections about configuring and customizing the telemetry data.

In Esplora metriche è possibile creare grafici e avvisi in base alle metriche ad esempio numero di chiamate alla funzione, tempo di esecuzione e percentuale di successo.In Metrics Explorer, you can create charts and alerts based on metrics such as number of function invocations, execution time, and success rate.

Esplora metriche

Nella scheda Errori è possibile creare grafici e avvisi in base agli errori di funzione e alle eccezioni del server.On the Failures tab, you can create charts and alerts based on function failures and server exceptions. Il nome dell'operazione corrisponde al nome della funzione.The Operation Name is the function name. Gli errori nelle dipendenze non vengono mostrati a meno che non si implementino i dati di telemetria personalizzati per le dipendenze.Failures in dependencies are not shown unless you implement custom telemetry for dependencies.

Errori

Nella scheda Prestazioni è possibile analizzare i problemi di prestazioni.On the Performance tab, you can analyze performance issues.

Prestazioni

La scheda Server mostra l'uso delle risorse e la velocità effettiva per ogni server.The Servers tab shows resource utilization and throughput per server. Questi dati possono essere utili negli scenari di debug in cui le funzioni bloccano le risorse sottostanti.This data can be useful for debugging scenarios where functions are bogging down your underlying resources. I server sono denominati Istanze del ruolo del cloud.Servers are referred to as Cloud role instances.

Server

La scheda Live Metrics Stream mostra i dati delle metriche man mano che vengono creati in tempo reale.The Live Metrics Stream tab shows metrics data as it is created in real time.

Live stream

Query sui dati di telemetriaQuery telemetry data

Analytics di Application Insights consente di accedere a tutti i dati di telemetria sotto forma di tabelle in un database.Application Insights Analytics gives you access to all of the telemetry data in the form of tables in a database. Analytics offre un linguaggio di query per l'estrazione, la manipolazione e la visualizzazione dei dati.Analytics provides a query language for extracting, manipulating, and visualizing the data.

Selezionare Analytics

Esempio di Analytics

Di seguito è riportato un esempio di query,Here's a query example. che mostra la distribuzione delle richieste per ruolo di lavoro negli ultimi 30 minuti.This one shows the distribution of requests per worker over the last 30 minutes.

requests
| where timestamp > ago(30m) 
| summarize count() by cloud_RoleInstance, bin(timestamp, 1m)
| render timechart

Le tabelle disponibili vengono mostrate nella scheda Schema del riquadro a sinistra.The tables that are available are shown in the Schema tab of the left pane. Nelle tabelle seguenti è possibile trovare i dati generati dalle chiamate alla funzione:You can find data generated by function invocations in the following tables:

  • tracce: log creato dal runtime e dal codice della funzione.traces - Logs created by the runtime and by function code.
  • richieste: uno per ogni chiamata alla funzione.requests - One for each function invocation.
  • eccezioni: tutte le eccezioni generate dal runtime.exceptions - Any exceptions thrown by the runtime.
  • customMetrics: numero di chiamate con esito positivo e negativo, percentuale di successo, durata.customMetrics - Count of successful and failing invocations, success rate, duration.
  • customEvents: eventi rilevati dal runtime, ad esempio richieste HTTP che attivano una funzione.customEvents - Events tracked by the runtime, for example: HTTP requests that trigger a function.
  • performanceCounters: informazioni sulle prestazioni dei server su cui sono in esecuzione le funzioni.performanceCounters - Info about the performance of the servers that the functions are running on.

Le altre tabelle sono riservate ai test di disponibilità e ai dati di telemetria del browser o del client.The other tables are for availability tests and client/browser telemetry. È possibile implementare i dati di telemetria personalizzati per aggiungerne altri.You can implement custom telemetry to add data to them.

All'interno di ogni tabella alcuni dati specifici per Funzioni si trovano nel campo customDimensions.Within each table, some of the Functions-specific data is in a customDimensions field. Ad esempio, la query seguente recupera tutte le tracce con livello di registrazione Error.For example, the following query retrieves all traces that have log level Error.

traces 
| where customDimensions.LogLevel == "Error"

Il runtime indica customDimensions.LogLevel e customDimensions.Category.The runtime provides customDimensions.LogLevel and customDimensions.Category. È possibile specificare campi aggiuntivi nei log in cui si scrive il codice funzione.You can provide additional fields in logs you write in your function code. Vedere la sezione Registrazione strutturata più avanti in questo articolo.See Structured logging later in this article.

Configurare le categorie e i livelli di registrazioneConfigure categories and log levels

È possibile usare Application Insights senza una configurazione personalizzata, ma la configurazione predefinita può creare volumi elevati di dati.You can use Application Insights without any custom configuration, but the default configuration can result in high volumes of data. Se si usa una sottoscrizione di Azure di Visual Studio, si potrebbe raggiunge il limite d'uso dati per Application Insights.If you're using a Visual Studio Azure subscription, you might hit your data cap for Application Insights. La parte rstante di questo articolo illustra come configurare e personalizzare i dati inviati dalle funzioni ad Application Insights.The remainder of this article shows how to configure and customize the data that your functions send to Application Insights.

CategorieCategories

Il logger di Funzioni di Azure include un categoria per ogni log.The Azure Functions logger includes a category for every log. La categoria indica quale parte del codice runtime o del codice funzione è stata scritta dal log.The category indicates which part of the runtime code or your function code wrote the log.

Il runtime di Funzioni crea log con una categoria che inizia con "Host".The Functions runtime creates logs that have a category beginning with "Host". Ad esempio i log "funzione avviata," "funzione eseguita" e "funzione completata" rientrano nella categoria "Host.Executor".For example, the "function started," "function executed," and "function completed" logs have category "Host.Executor".

Se si scrivono i log nel codice funzione, la categoria è "Function".If you write logs in your function code, their category is "Function".

Livelli di registrazioneLog levels

Il logger delle funzioni di Azure include anche un livello di registrazione per ogni log.The Azure functions logger also includes a log level with every log. LogLevel è un'enumerazione e il codice integer ne indica la relativa importanza:LogLevel is an enumeration, and the integer code indicates relative importance:

LogLevelLogLevel CodiceCode
TraceTrace 00
DebugDebug 11
InformazioniInformation 22
AvvisoWarning 33
Tipi di erroreError 44
CriticoCritical 55
NessunaNone 66

Il livello di registrazione None è illustrato nella sezione successiva.Log level None is explained in the next section.

Configurare la registrazione nel file host.jsonConfigure logging in host.json

Il file host.json configura il numero di registrazioni che un'app per le funzioni invia ad Application Insights.The host.json file configures how much logging a function app sends to Application Insights. Per ogni categoria, si indica il livello di registrazione minimo da inviare.For each category, you indicate the minimum log level to send. Ad esempio:Here's an example:

{
  "logger": {
    "categoryFilter": {
      "defaultLevel": "Information",
      "categoryLevels": {
        "Host.Results": "Error",
        "Function": "Error",
        "Host.Aggregator": "Information"
      }
    }
  }
}

In questo esempio vengono impostate due regole:This example sets up the following rules:

  1. Per i log con categoria "Host.Results" o "Function", inviare ad Application Insights solo i log di livello Error e livelli superiori.For logs with category "Host.Results" or "Function", send only Error level and above to Application Insights. I log di livello Warning e livelli inferiori vengono ignorati.Logs for Warning level and below are ignored.
  2. Per i log con categoria Host.For logs with category Host. Aggregator, inviare ad Application Insights solo i log di livello Information e superiori.Aggregator, send only Information level and above to Application Insights. I log di livello Debug e livelli inferiori vengono ignorati.Logs for Debug level and below are ignored.
  3. Per tutti gli altri log, inviare ad Application Insights solo i log di livello Information e superiori.For all other logs, send only Information level and above to Application Insights.

Il valore della categoria in host.json controlla la registrazione di tutte le categorie che iniziano con lo stesso valore.The category value in host.json controls logging for all categories that begin with the same value. Ad esempio, "Host" in host.json controlla la registrazione di "Host.General", "Host.Executor", "Host.Results" e così via.For example, "Host" in host.json controls logging for "Host.General", "Host.Executor", "Host.Results", and so forth.

Se host.json include più categorie che iniziano con la stessa stringa, viene rilevata prima la corrispondenza con quelle più lunghe.If host.json includes multiple categories that start with the same string, the longer ones are matched first. Ad esempio, si supponga di volere che tutti gli elementi dalla fase di runtime, ad eccezione di "Host.Aggregator", siano registrati al livello Error mentre i log "Host.Aggregator" vengono registrati al livello Information:For example, suppose you want everything from the runtime except "Host.Aggregator" to log at Error level, while "Host.Aggregator" logs at Information level:

{
  "logger": {
    "categoryFilter": {
      "defaultLevel": "Information",
      "categoryLevels": {
        "Host": "Error",
        "Function": "Error",
        "Host.Aggregator": "Information"
      }
    }
  }
}

Per eliminare tutti i log di una categoria, è possibile usare il livello di registrazione None.To suppress all logs for a category, you can use log level None. Nessun log viene scritto con quella categoria e non vi è alcun livello di registrazione superiore.No logs are written with that category and there is no log level above it.

Le sezioni seguenti descrivono le categorie principali di log create dal runtime.The following sections describe the main categories of logs that the runtime creates.

Categoria Host.ResultsCategory Host.Results

Questi log vengono visualizzati come "richieste" in Application Insights.These logs show as "requests" in Application Insights. Indicano l'esito positivo o negativo di una funzione.They indicate success or failure of a function.

Grafico delle richieste

Tutti questi log vengono scritti al livello Information, pertanto se si applica un filtro al livello Warning o superiore, questi dati non verranno visualizzati.All of these logs are written at Information level, so if you filter at Warning or above, you won't see any of this data.

Categoria Host.AggregatorCategory Host.Aggregator

Questi log indicano il numero e le medie di chiamate alla funzione in un periodo di tempo configurabile.These logs provide counts and averages of function invocations over a configurable period of time. Il periodo predefinito è 30 secondi o 1000 risultati, ovvero quello che viene prima.The default period is 30 seconds or 1,000 results, whichever comes first.

I log sono disponibili nella tabella customMetrics in Application Insights.The logs are available in the customMetrics table in Application Insights. Gli esempi indicano il numero di esecuzioni, la percentuale di successo e la durata.Examples are number of runs, success rate, and duration.

query customMetrics

Tutti questi log vengono scritti al livello Information, pertanto se si applica un filtro al livello Warning o superiore, questi dati non verranno visualizzati.All of these logs are written at Information level, so if you filter at Warning or above, you won't see any of this data.

Altre categorieOther categories

Tutti i log per le categorie diverse da quelle già elencate sono disponibili nella tabella tracce in Application Insights.All logs for categories other than the ones already listed are available in the traces table in Application Insights.

query di tracce

Tutti i log con le categorie che iniziano con "Host" vengono scritti dal runtime di Funzioni.All logs with categories that begin with "Host" are written by the Functions runtime. I log "Funzione avviata e "Funzione completata" rientrano nella categoria "Host.Executor".The "Function started" and "Function completed" logs have category "Host.Executor". Affinché vengano eseguiti correttamente, questi log devono avere il livello Information, mentre le eccezioni vengono registrate al livello Error.For successful runs, these logs are Information level; exceptions are logged at Error level. Il runtime crea anche il livello di registrazione Warning, ad esempio: messaggi di coda inviati alla coda non elaborabile.The runtime also creates Warning level logs, for example: queue messages sent to the poison queue.

I log scritti dal codice funzione rientrano nella categoria "Function" e possono avere qualsiasi livello di registrazione.Logs written by your function code have category "Function" and may be any log level.

Configurare l'aggregatoreConfigure the aggregator

Come indicato nella sezione precedente, il runtime aggrega i dati sulle esecuzioni di funzioni in un periodo di tempo.As noted in the previous section, the runtime aggregates data about function executions over a period of time. Il periodo predefinito è 30 secondi o 1000 esecuzioni, ovvero quello che viene prima.The default period is 30 seconds or 1,000 runs, whichever comes first. È possibile configurare questa impostazione nel file host.json.You can configure this setting in the host.json file. Ad esempio:Here's an example:

{
    "aggregator": {
      "batchSize": 1000,
      "flushTimeout": "00:00:30"
    }
}

Configurare il campionamentoConfigure sampling

Application Insights ha una funzionalità di campionamento che consente di evitare la produzione di un numero eccessivo di dati di telemetria nei picchi di carico.Application Insights has a sampling feature that can protect you from producing too much telemetry data at times of peak load. Quando il numero degli elementi di telemetria supera una frequenza specificata, Application Insights inizia a ignorare in modo casuale alcuni degli elementi in ingresso.When the number of telemetry items exceeds a specified rate, Application Insights starts to randomly ignore some of the incoming items. È possibile configurare il campionamento nel file host.json.You can configure sampling in host.json. Ad esempio:Here's an example:

{
  "applicationInsights": {
    "sampling": {
      "isEnabled": true,
      "maxTelemetryItemsPerSecond" : 5
    }
  }
}

Scrivere i log nelle funzioni C#Write logs in C# functions

È possibile scrivere log nel codice funzione che vengono visualizzati come tracce in Application Insights.You can write logs in your function code that appear as traces in Application Insights.

ILoggerILogger

Usare il parametro ILogger nelle funzioni anziché il parametro TraceWriter.Use an ILogger parameter in your functions instead of a TraceWriter parameter. I log creati con TraceWriter passano in Application Insights, ma ILogger consente di eseguire una registrazione strutturata.Logs created by using TraceWriter do go to Application Insights, but ILogger lets you do structured logging.

Con un oggetto ILogger è possibile chiamare i metodi di estensione ILogger Log<level> per creare i log.With an ILogger object you call Log<level> extension methods on ILogger to create logs. Ad esempio, il codice seguente scrive i log Information con la categoria "Function".For example, the following code writes Information logs with category "Function".

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger logger)
{
    logger.LogInformation("Request for item with key={itemKey}.", id);

Registrazione strutturataStructured logging

I parametri usati nel messaggio del log sono determinati dall'ordine dei segnaposto, non dai nomi.The order of placeholders, not their names, determines which parameters are used in the log message. Ad esempio, si supponga di disporre del codice seguente:For example, suppose you have the following code:

string partitionKey = "partitionKey";
string rowKey = "rowKey";
logger.LogInformation("partitionKey={partitionKey}, rowKey={rowKey}", partitionKey, rowKey);

Se si mantenere la stessa stringa del messaggio e si inverte l'ordine dei parametri, il testo del messaggio risultante mostrerebbe i valori in maniera errata.If you keep the same message string and reverse the order of the parameters, the resulting message text would have the values in the wrong places.

I segnaposto vengono gestiti in modo da poter eseguire la registrazione strutturata.Placeholders are handled this way so that you can do structured logging. Oltre alla stringa del messaggio, Application Insights archivia le coppie nome-valore del parametro.Application Insights stores the parameter name-value pairs in addition to the message string. Il risultato è che gli argomenti del messaggio diventano campi su cui è possibile eseguire delle query.The result is that the message arguments become fields that you can query on.

Ad esempio, se la chiamata al metodo del logger è simile all'esempio precedente, è possibile eseguire una query per il campo customDimensions.prop__rowKey.For example, if your logger method call looks like the previous example, you could query the field customDimensions.prop__rowKey. Il prefisso prop__ viene aggiunto per verificare che non ci siano conflitti tra i campi aggiunti dal runtime e i campi aggiunti dal codice funzione.The prop__ prefix is added to ensure that there are no collisions between fields the runtime adds and fields your function code adds.

È anche possibile eseguire query sulla stringa del messaggio originale facendo riferimento al campo customDimensions.prop__{OriginalFormat}.You can also query on the original message string by referencing the field customDimensions.prop__{OriginalFormat}.

Ecco una rappresentazione JSON di esempio dei dati customDimensions:Here's a sample JSON representation of customDimensions data:

{
  customDimensions: {
    "prop__{OriginalFormat}":"C# Queue trigger function processed: {message}",
    "Category":"Function",
    "LogLevel":"Information",
    "prop__message":"c9519cbf-b1e6-4b9b-bf24-cb7d10b1bb89"
  }
}

Registrazione delle metriche personalizzateLogging custom metrics

Nelle funzioni di script C# è possibile usare il metodo di estensione LogMetric su ILogger per creare metriche personalizzate in Application Insights.In C# script functions, you can use the LogMetric extension method on ILogger to create custom metrics in Application Insights. Ecco un esempio di chiamata al metodo:Here's a sample method call:

logger.LogMetric("TestMetric", 1234); 

Questo codice è un'alternativa alla chiamata di TrackMetric con l'API di Application Insights per .NET.This code is an alternative to calling TrackMetric using the Application Insights API for .NET.

Scrivere i log in funzioni JavaScriptWrite logs in JavaScript functions

Nelle funzioni di Node.js usare context.log per scrivere i log.In Node.js functions, use context.log to write logs. La registrazione strutturata non è abilitata.Structured logging is not enabled.

context.log('JavaScript HTTP trigger function processed a request.' + context.invocationId);

Registrazione delle metriche personalizzateLogging custom metrics

Nelle funzioni Node.js è possibile usare il metodo di estensione context.log.metric per creare metriche personalizzate in Application Insights.In Node.js functions, you can use the context.log.metric method to create custom metrics in Application Insights. Ecco un esempio di chiamata al metodo:Here's a sample method call:

context.log.metric("TestMetric", 1234); 

Questo codice è un'alternativa alla chiamata di trackMetric con l'SDK di Node.js per Application Insights.This code is an alternative to calling trackMetric using the Node.js SDK for Application Insights.

Dati di telemetria personalizzata nelle funzioni C#Custom telemetry in C# functions

È possibile usare il pacchetto NuGet Microsoft.ApplicationInsights per inviare i dati di telemetria personalizzati ad Application Insights.You can use the Microsoft.ApplicationInsights NuGet package to send custom telemetry data to Application Insights.

Di seguito è riportato un esempio di codice C# che usa l'API di telemetria personalizzata.Here's an example of C# code that uses the custom telemetry API. L'esempio fa riferimento a una libreria di classi .NET, ma il codice di Application Insights è lo stesso per lo script C#.The example is for a .NET class library, but the Application Insights code is the same for C# script.

using System;
using System.Net;
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Azure.WebJobs;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System.Linq;

namespace functionapp0915
{
    public static class HttpTrigger2
    {
        private static string key = TelemetryConfiguration.Active.InstrumentationKey = 
            System.Environment.GetEnvironmentVariable(
                "APPINSIGHTS_INSTRUMENTATIONKEY", EnvironmentVariableTarget.Process);

        private static TelemetryClient telemetryClient = 
            new TelemetryClient() { InstrumentationKey = key };

        [FunctionName("HttpTrigger2")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
            HttpRequestMessage req, ExecutionContext context, ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
            DateTime start = DateTime.UtcNow;

            // parse query parameter
            string name = req.GetQueryNameValuePairs()
                .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
                .Value;

            // Get request body
            dynamic data = await req.Content.ReadAsAsync<object>();

            // Set name to query string or body data
            name = name ?? data?.name;

            // Track an Event
            var evt = new EventTelemetry("Function called");
            UpdateTelemetryContext(evt.Context, context, name);
            telemetryClient.TrackEvent(evt);

            // Track a Metric
            var metric = new MetricTelemetry("Test Metric", DateTime.Now.Millisecond);
            UpdateTelemetryContext(metric.Context, context, name);
            telemetryClient.TrackMetric(metric);

            // Track a Dependency
            var dependency = new DependencyTelemetry
                {
                    Name = "GET api/planets/1/",
                    Target = "swapi.co",
                    Data = "https://swapi.co/api/planets/1/",
                    Timestamp = start,
                    Duration = DateTime.UtcNow - start,
                    Success = true
                };
            UpdateTelemetryContext(dependency.Context, context, name);
            telemetryClient.TrackDependency(dependency);

            return name == null
                ? req.CreateResponse(HttpStatusCode.BadRequest, 
                    "Please pass a name on the query string or in the request body")
                : req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
        }

        // This correllates all telemetry with the current Function invocation
        private static void UpdateTelemetryContext(TelemetryContext context, ExecutionContext functionContext, string userName)
        {
            context.Operation.Id = functionContext.InvocationId.ToString();
            context.Operation.ParentId = functionContext.InvocationId.ToString();
            context.Operation.Name = functionContext.FunctionName;
            context.User.Id = userName;
        }
    }    
}

Non chiamare TrackRequest o StartOperation<RequestTelemetry>, in quanto compariranno le richieste di duplicazione per una chiamata alla funzione.Don't call TrackRequest or StartOperation<RequestTelemetry>, because you'll see duplicate requests for a function invocation. Il runtime di Funzioni rileva automaticamente le richieste.The Functions runtime automatically tracks requests.

Non impostare telemetryClient.Context.Operation.Id.Don't set telemetryClient.Context.Operation.Id. Questa è un'impostazione globale e causerà errori di correlazione quando molte funzioni vengono eseguite contemporaneamente.This is a global setting and will cause incorrect correllation when many functions are running simultaneously. Creare invece una nuova istanza di telemetria (DependencyTelemetry, EventTelemetry) e modificare la relativa proprietà Context.Instead, create a new telemetry instance (DependencyTelemetry, EventTelemetry) and modify its Context property. Passare quindi l'istanza di telemetria al metodo Track corrispondente TelemetryClient in (TrackDependency(), TrackEvent()).Then pass in the telemetry instance to the corresponding Track method on TelemetryClient (TrackDependency(), TrackEvent()). Questo assicura che la telemetria disponga dei dettagli di correlazione corretti per la chiamata di funzione corrente.This ensures that the telemetry has the correct correllation details for the current function invocation.

Dati di telemetria personalizzati nelle funzioni JavaScriptCustom telemetry in JavaScript functions

L'SDK di Node.js per Application Insights è attualmente in versione beta.The Application Insights Node.js SDK is currently in beta. Di seguito è riportato un codice di esempio che invia i dati di telemetria personalizzati ad Application Insights:Here's some sample code that sends custom telemetry to Application Insights:

const appInsights = require("applicationinsights");
appInsights.setup();
const client = appInsights.defaultClient;

module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    client.trackEvent({name: "my custom event", tagOverrides:{"ai.operation.id": context.invocationId}, properties: {customProperty2: "custom property value"}});
    client.trackException({exception: new Error("handled exceptions can be logged with this method"), tagOverrides:{"ai.operation.id": context.invocationId}});
    client.trackMetric({name: "custom metric", value: 3, tagOverrides:{"ai.operation.id": context.invocationId}});
    client.trackTrace({message: "trace message", tagOverrides:{"ai.operation.id": context.invocationId}});
    client.trackDependency({target:"http://dbname", name:"select customers proc", data:"SELECT * FROM Customers", duration:231, resultCode:0, success: true, dependencyTypeName: "ZSQL", tagOverrides:{"ai.operation.id": context.invocationId}});
    client.trackRequest({name:"GET /customers", url:"http://myserver/customers", duration:309, resultCode:200, success:true, tagOverrides:{"ai.operation.id": context.invocationId}});

    if (req.query.name || (req.body && req.body.name)) {
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
    context.done();
};

Il parametro tagOverrides imposta operation_Id sull'ID di chiamata alla funzione.The tagOverrides parameter sets operation_Id to the function's invocation ID. Questa impostazione consente di correlare tutti i dati di telemetria personalizzati e generati automaticamente per una chiamata alla funzione specifica.This setting enables you to correlate all of the automatically-generated and custom telemetry for a given function invocation.

Problemi notiKnown issues

DependenciesDependencies

Le dipendenze tra la funzione e gli altri servizi non vengono visualizzate automaticamente, ma è possibile scrivere codice personalizzato per visualizzarle.Dependencies that the function has to other services don't show up automatically, but you can write custom code to show the dependencies. Il codice di esempio nella sezione relativa ai dati di telemetria personalizzati C# ne illustra le modalità.The sample code in the C# custom telemetry section shows how. Il codice di esempio crea una mappa dell'applicazione in Application Insights simile alla seguente:The sample code results in an application map in Application Insights that looks like this:

Mappa delle applicazioni

Segnalare i problemiReport issues

Per segnalare un problema con l'integrazione di Application Insights in Funzioni o per inviare un suggerimento o una richiesta, creare un problema in GitHub.To report an issue with Application Insights integration in Functions, or to make a suggestion or request, create an issue in GitHub.

Monitoraggio senza Application InsightsMonitoring without Application Insights

Si consiglia di usare Application Insights per monitorare le funzioni perché offre un numero maggiore di dati e modalità di analisi dei dati migliori.We recommend Application Insights for monitoring functions because it offers more data and better ways to analyze the data. Ma è anche possibile trovare dati di telemetria e registrazione nelle pagine del portale di Azure per un'app per le funzioni.But you can also find logs and telemetry data in the Azure portal pages for a Function app.

Registrazione per l'archiviazioneLogging to storage

La registrazione predefinita usa l'account di archiviazione specificato dalla stringa di connessione nell'impostazione app AzureWebJobsDashboard.Built-in logging uses the storage account specified by the connection string in the AzureWebJobsDashboard app setting. Se questa impostazione app viene configurata, è possibile visualizzare i dati di registrazione nel portale di Azure.If that app setting is configured, you can see the logging data in the Azure portal. Nella risorsa di archiviazione, passare a File, selezionare il servizio file per la funzione e quindi passare a LogFiles > Application > Functions > Function > your_function per visualizzare il file di log.In the Storage resource, go to Files, select the file service for the function, and then go to LogFiles > Application > Functions > Function > your_function to see the log file. Nella pagina di un'app per le funzioni selezionare la scheda Monitoraggio per ottenere un elenco di esecuzioni della funzione.In a function app page, select a function and then select the Monitor tab, and you get a list of function executions. Selezionare l'esecuzione della funzione per esaminare la durata, i dati di input, gli errori e i file di log associati.Select a function execution to review the duration, input data, errors, and associated log files.

Se si usa Application Insights ed è stata disabilitata la registrazione predefiniti, la scheda Monitoraggio consente di passare ad Application Insights.If you use Application Insights and have built-in logging disabled, the Monitor tab takes you to Application Insights.

Monitoraggio in tempo realeReal-time monitoring

È possibile trasmettere in streaming i file di log a una sessione della riga di comando su una workstation locale usando l'interfaccia della riga di comando di Azure 2.0 o Azure PowerShell.You can stream log files to a command-line session on a local workstation using the Azure Command Line Interface (CLI) 2.0 or Azure PowerShell.

Per l'interfaccia della riga di comando di Azure 2.0 usare i comandi seguenti per eseguire l'accesso, scegliere la sottoscrizione e trasmettere in streaming i file di log:For Azure CLI 2.0, use the following commands to sign in, choose your subscription, and stream log files:

az login
az account list
az account set <subscriptionNameOrId>
az appservice web log tail --resource-group <resource group name> --name <function app name>

Per Azure PowerShell usare i comandi seguenti per aggiungere l'account di Azure, scegliere la sottoscrizione e trasmettere in streaming i file di log:For Azure PowerShell, use the following commands to add your Azure account, choose your subscription, and stream log files:

PS C:\> Add-AzureAccount
PS C:\> Get-AzureSubscription
PS C:\> Get-AzureSubscription -SubscriptionName "<subscription name>" | Select-AzureSubscription
PS C:\> Get-AzureWebSiteLog -Name <function app name> -Tail

Per altre informazioni, vedere Procedura: Eseguire lo streaming dei log.For more information, see How to stream logs.

Visualizzazione dei file di log in localeViewing log files locally

Quando l'host di Funzioni viene eseguito in locale, scrive i log nel percorso seguente:When the Functions host runs locally, it writes logs to the following path:

<DefaultTempDirectory>\LogFiles\Application\Functions

In Windows <DefaultTempDirectory> è il primo valore trovato delle variabili di ambiente TMP, TEMP, USERPROFILE o la directory di Windows.On Windows, <DefaultTempDirectory> is the first found value of the TMP, TEMP, USERPROFILE environment variables, or the Windows directory. In MacOS o Linux <DefaultTempDirectory> è la variabile di ambiente TMPDIR.On MacOS or Linux, <DefaultTempDirectory> is the TMPDIR environment variable.

Nota

Quando l'host di Funzioni viene avviato, sovrascrive la struttura di file esistente nella directory.When the Functions host starts, it overwrites the existing file structure in the directory.

Passaggi successiviNext steps

Per altre informazioni, vedere le seguenti risorse:For more information, see the following resources: