Monitor Azure FunctionsMonitor Azure Functions

Azure Functions ofrece integración incorporada con Azure Application Insights para supervisar las funciones.Azure Functions offers built-in integration with Azure Application Insights to monitor functions. En este artículo se muestra cómo configurar Azure Functions para enviar archivos de registro generados por el sistema a Application Insights.This article shows you how to configure Azure Functions to send system-generated log files to Application Insights.

Se recomienda usar Application Insights porque recopila datos de errores, de rendimiento y de registros.We recommend using Application Insights because it collects log, performance, and error data. Detecta automáticamente anomalías en el rendimiento e incluye herramientas de análisis eficaces que ayudan a diagnosticar problemas y comprender cómo se usan las funciones.It automatically detects performance anomalies and includes powerful analytics tools to help you diagnose issues and to understand how your functions are used. Está diseñado para ayudarle a mejorar continuamente el rendimiento y la facilidad de uso.It's designed to help you continuously improve performance and usability. Incluso puede usar Application Insights durante el desarrollo local de proyectos de aplicación de función.You can even use Application Insights during local function app project development. Para más información, consulte ¿Qué es Application Insights?For more information, see What is Application Insights?.

Dado que la instrumentación de Application Insights necesaria está integrada en Azure Functions, todo lo que necesita es una clave de instrumentación válida para conectar la aplicación de función a un recurso de Application Insights.As the required Application Insights instrumentation is built into Azure Functions, all you need is a valid instrumentation key to connect your function app to an Application Insights resource.

Precios y límites de Application InsightsApplication Insights pricing and limits

Puede probar la integración de Application Insights con instancias de Function App de forma gratuita.You can try out Application Insights integration with Function Apps for free. Hay un límite diario para la cantidad de datos que se puede procesar de forma gratuita.There's a daily limit to how much data can be processed for free. Podría alcanzar este límite durante las pruebas.You might hit this limit during testing. Azure proporciona notificaciones del portal y por correo electrónico cuando se aproxima al límite diario.Azure provides portal and email notifications when you're approaching your daily limit. Si pasa por alto esas alertas y llega al límite, los nuevos registros no aparecerán en las consultas de Application Insights.If you miss those alerts and hit the limit, new logs won't appear in Application Insights queries. Tenga en cuenta el límite para evitar el tiempo que puede perder, de forma innecesaria, solucionando problemas.Be aware of the limit to avoid unnecessary troubleshooting time. Para más información, consulte Administración de precios y volúmenes de datos de Application Insights.For more information, see Manage pricing and data volume in Application Insights.

Habilitación de la integración de Application InsightsEnable Application Insights integration

Para que una aplicación de función envíe datos a Application Insights tiene que conocer la clave de instrumentación de un recurso de Application Insights.For a function app to send data to Application Insights, it needs to know the instrumentation key of an Application Insights resource. La clave tiene que estar en un valor de configuración de la aplicación llamado APPINSIGHTS_INSTRUMENTATIONKEY.The key must be in an app setting named APPINSIGHTS_INSTRUMENTATIONKEY.

Nueva aplicación de función en el portalNew function app in the portal

Cuando crea la aplicación de función en Azure Portal, la integración de Application Insights está habilitada de forma predeterminada.When you create your function app in the Azure portal, Application Insights integration is enabled by default. El recurso de Application Insights tiene el mismo nombre que la aplicación de función, y se crea en la misma región o en la región más cercana.The Application Insights resource has the same name as your function app, and it's created either in the same region or in nearest region.

Para revisar el recurso de Application Insights que se está creando, selecciónelo para expandir la ventana Application Insights.To review the Application Insights resource being created, select it to expand the Application Insights window. Puede cambiar el valor de Nuevo nombre de recurso o elegir otro valor en Ubicación en la ubicación geográfica de Azure donde quiera almacenar los datos.You can change the New resource name or choose a different Location in an Azure geography where you want to store your data.

Habilitar Application Insights al crear una aplicación de función

Cuando elige Crear, se crea un recurso de Application Insights con la aplicación de función, que tiene APPINSIGHTS_INSTRUMENTATIONKEY establecido en la configuración de la aplicación.When you choose Create, an Application Insights resource is created with your function app, which has the APPINSIGHTS_INSTRUMENTATIONKEY set in application settings. Todo está listo para funcionar.Everything is ready to go.

Adición a una aplicación de función existenteAdd to an existing function app

Cuando crea una aplicación de función con la CLI de Azure, Visual Studio o Visual Studio Code, debe crear el recurso de Application Insights.When you create a function app using the Azure CLI, Visual Studio, or Visual Studio Code, you must create the Application Insights resource. Luego, puede agregar la clave de instrumentación desde ese recurso como configuración de aplicación en la aplicación de función.You can then add the instrumentation key from that resource as an application setting in your function app.

Functions simplifica el proceso de agregar la integración de Application Insights a una aplicación de función desde Azure Portal.Functions makes it easy to add Application Insights integration to a function app from the Azure portal.

  1. En el portal, seleccione Todos los servicios> Aplicaciones de función, seleccione su aplicación de función y, luego, elija el banner Application Insights de la parte superior de la ventanaIn the portal, select All services > Function Apps, select your function app, and then select the Application Insights banner at the top of the window

    Habilitación de Application Insights desde el portal

  2. Cree un recurso de Application Insights mediante la configuración especificada en la tabla que hay debajo de la imagen.Create an Application Insights resource by using the settings specified in the table below the image.

    Creación de recursos en Application Insights

    ConfiguraciónSetting Valor sugeridoSuggested value DescripciónDescription
    NombreName Nombre de aplicación únicoUnique app name Lo más fácil es usar el mismo nombre que usa para la aplicación de función, que debe ser único en su suscripción.It's easiest to use the same name as your function app, which must be unique in your subscription.
    UbicaciónLocation Europa occidentalWest Europe Si es posible, use la misma región que la aplicación de función o una que esté cerca de esa región.If possible, use the same region as your function app, or one that's close to that region.
  3. Seleccione Aceptar.Select OK. El recurso de Application Insights se crea en el mismo grupo de recursos y suscripción que su aplicación de función.The Application Insights resource is created in the same resource group and subscription as your function app. Después de crear el recurso, cierre la ventana Application Insights.After the resource is created, close the Application Insights window.

  4. De vuelta en la aplicación de función, seleccione Configuración de la aplicacióny desplácese hacia abajo hasta Configuración de la aplicación.Back in your function app, select Application settings, and then scroll down to Application settings. Si ve una configuración denominada APPINSIGHTS_INSTRUMENTATIONKEY, significa que la integración de Application Insights está habilitada para la aplicación de función que se ejecuta en Azure.If you see a setting named APPINSIGHTS_INSTRUMENTATIONKEY, Application Insights integration is enabled for your function app running in Azure.

Las primeras versiones de Functions usaban la supervisión integrada, que ya no se recomienda.Early versions of Functions used built-in monitoring, which is no longer recommended. Al habilitar la integración de Application Insights para una aplicación de función tal, también debe deshabilitar el registro integrado.When enabling Application Insights integration for such a function app, you must also disable built-in logging.

Visualización de datos de telemetría en la pestaña SupervisarView telemetry in Monitor tab

Con la integración de Application Insights habilitada, puede ver los datos de telemetría en la pestaña Supervisar.With Application Insights integration enabled, you can view telemetry data in the Monitor tab.

  1. En la página de la aplicación de función, seleccione una función que se haya ejecutado por lo menos una vez después de que se configurase Application Insights.In the function app page, select a function that has run at least once after Application Insights was configured. Luego seleccione la pestaña Supervisar.Then select the Monitor tab.

    Selección de la pestaña Supervisar

  2. Seleccione Actualizar periódicamente hasta que aparezca la lista de las invocaciones de funciones.Select Refresh periodically, until the list of function invocations appears.

    La lista puede tardar hasta cinco minutos en aparecer, mientras el cliente de telemetría agrupa los datos en lotes para su transmisión al servidor.It can take up to five minutes for the list to appear while the telemetry client batches data for transmission to the server. (Este retraso no se aplica a Live Metrics Stream.(The delay doesn't apply to the Live Metrics Stream. Este servicio se conecta al host de Functions cuando se carga la página, por lo que los registros se transmiten directamente a la página).That service connects to the Functions host when you load the page, so logs are streamed directly to the page.)

    Lista de invocaciones

  3. Para ver los registros de una invocación de función determinada, seleccione el vínculo de la columna Fecha para esa invocación.To see the logs for a particular function invocation, select the Date column link for that invocation.

    Vínculo de detalles de la invocación

    La salida del registro para esa invocación aparece en una nueva página.The logging output for that invocation appears in a new page.

    Detalles de la invocación

Puede ver que ambas páginas tienen un vínculo Ejecutar en Application Insights a la consulta de Análisis de Application Insights que recupera los datos.You can see that both pages have a Run in Application Insights link to the Application Insights Analytics query that retrieves the data.

Ejecución en Application Insights

Se muestra la siguiente consulta.The following query is displayed. Puede ver que la lista de invocación se limita a los últimos 30 días.You can see that the invocation list is limited to the last 30 days. La lista no muestra más de 20 filas (where timestamp > ago(30d) | take 20).The list shows no more than 20 rows (where timestamp > ago(30d) | take 20). La lista de detalles de invocación es para los últimos 30 días sin límite.The invocation details list is for the last 30 days with no limit.

Lista de invocación del análisis de Application Insights

Para más información, consulte la sección Consultar datos de telemetría que se encuentra más adelante en este artículo.For more information, see Query telemetry data later in this article.

Visualización de la telemetría en Application InsightsView telemetry in Application Insights

Para abrir Application Insights desde una aplicación de función en Azure Portal, vaya a la página Información general de la aplicación de función.To open Application Insights from a function app in the Azure portal, go to the function app's Overview page. En Características configuradas, seleccione Application Insights.Under Configured features, select Application Insights.

Abra Application Insights desde la página Información general de la aplicación de función

Para obtener más información acerca de Application Insights, consulte Documentación de Application Insights.For information about how to use Application Insights, see the Application Insights documentation. En esta sección se muestran algunos ejemplos de cómo ver los datos de Application Insights.This section shows some examples of how to view data in Application Insights. Si ya está familiarizado con Application Insights, puede ir directamente a las secciones sobre cómo configurar y personalizar los datos de telemetría.If you're already familiar with Application Insights, you can go directly to the sections about how to configure and customize the telemetry data.

Pestaña Información general de Application Insights

Las siguientes áreas de Application Insights pueden ser útiles al evaluar el comportamiento, el rendimiento y los errores de las funciones:The following areas of Application Insights can be helpful when evaluating the behavior, performance, and errors in your functions:

TabuladorTab DESCRIPCIÓNDescription
ErroresFailures Cree alertas y gráficos basados en errores de funciones y excepciones del servidor.Create charts and alerts based on function failures and server exceptions. Nombre de la operación es el nombre de la función.The Operation Name is the function name. Los errores en las dependencias no se muestran, a no ser que se implemente telemetría personalizada para las dependencias.Failures in dependencies aren't shown unless you implement custom telemetry for dependencies.
RendimientoPerformance Analice los problemas de rendimiento.Analyze performance issues.
ServidoresServers Consulte la utilización de recursos y el rendimiento por servidor.View resource utilization and throughput per server. Estos datos pueden ser útiles para la depuración de escenarios en los que las funciones están dificultando los recursos subyacentes.This data can be useful for debugging scenarios where functions are bogging down your underlying resources. Los servidores se conocen como Instancias de rol en la nube.Servers are referred to as Cloud role instances.
MétricasMetrics Cree gráficos y alertas basados en métricas.Create charts and alerts that are based on metrics. Las métricas incluyen el número de invocaciones de función, el tiempo de ejecución y las tasas de éxito.Metrics include the number of function invocations, execution time, and success rates.
Secuencia de métricas en directoLive Metrics Stream Vea los datos de métricas a medida que se crean en tiempo real.View metrics data as it's created in real time.

Consultar datos de telemetríaQuery telemetry data

El Análisis de Application Insights proporciona acceso a todos los datos de telemetría en forma de tabla en una base de datos.Application Insights Analytics gives you access to all telemetry data in the form of tables in a database. Analytics ofrece un lenguaje de consulta para extraer, manipular y visualizar los datos.Analytics provides a query language for extracting, manipulating, and visualizing the data.

Seleccione Analytics

Ejemplo de Analytics

Este es un ejemplo de consulta que muestra la distribución de solicitudes por trabajador durante los últimos 30 minutos.Here's a query example that 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

Las tablas que están disponibles se muestran en la pestaña Esquema de la izquierda.The tables that are available are shown in the Schema tab on the left. Encontrará los datos generados por las invocaciones de función en las tablas siguientes:You can find data generated by function invocations in the following tables:

TablaTable DESCRIPCIÓNDescription
tracestraces Registros creados por el tiempo de ejecución y por el código de la función.Logs created by the runtime and by function code.
requestsrequests Una solicitud por cada invocación de función.One request for each function invocation.
exceptionsexceptions Cualquier excepción que produzca el tiempo de ejecución.Any exceptions thrown by the runtime.
customMetricscustomMetrics Recuento de invocaciones correctas y erróneas, tasa de éxito y duración.The count of successful and failing invocations, success rate, and duration.
customEventscustomEvents Eventos registrados por el tiempo de ejecución, por ejemplo: solicitudes HTTP que desencadenan una función.Events tracked by the runtime, for example: HTTP requests that trigger a function.
performanceCountersperformanceCounters Información acerca del rendimiento de los servidores en los que se ejecutan las funciones.Information about the performance of the servers that the functions are running on.

El resto de las tablas son para pruebas de disponibilidad, y telemetría de explorador y de cliente.The other tables are for availability tests, and client and browser telemetry. Puede implementar telemetría personalizada para agregarles datos.You can implement custom telemetry to add data to them.

Dentro de cada tabla, algunos de los datos específicos de Functions están en un campo customDimensions.Within each table, some of the Functions-specific data is in a customDimensions field. Por ejemplo, la consulta siguiente recupera todos los seguimientos que tienen el nivel de registro Error.For example, the following query retrieves all traces that have log level Error.

traces 
| where customDimensions.LogLevel == "Error"

El tiempo de ejecución proporciona los campos customDimensions.LogLevel y customDimensions.Category.The runtime provides the customDimensions.LogLevel and customDimensions.Category fields. Puede proporcionar campos adicionales en los registros que escriba en el código de función.You can provide additional fields in logs that you write in your function code. Consulte Registro estructurado más adelante en este artículo.See Structured logging later in this article.

Configurar categorías y niveles de registroConfigure categories and log levels

Puede usar Application Insights sin ninguna configuración personalizada.You can use Application Insights without any custom configuration. La configuración predeterminada puede dar lugar a grandes volúmenes de datos.The default configuration can result in high volumes of data. Si usa una suscripción de Visual Studio Azure, es posible que alcance su límite de datos para Application Insights.If you're using a Visual Studio Azure subscription, you might hit your data cap for Application Insights. Más adelante en este artículo verá cómo configurar y personalizar los datos que envían las funciones a Application Insights.Later in this article, you learn how to configure and customize the data that your functions send to Application Insights. Para una aplicación de función, el registro se configura en el archivo host.json.For a function app, logging is configured in the host.json file.

CategoríasCategories

El registrador de Azure Functions incluye una categoría para cada registro.The Azure Functions logger includes a category for every log. La categoría indica qué parte del código de tiempo de ejecución o del código de la función escribió el registro.The category indicates which part of the runtime code or your function code wrote the log.

El tiempo de ejecución de Functions crea registros con una categoría que empieza con "Host".The Functions runtime creates logs with a category that begin with "Host." En la versión 1.x, los registros function started, function executed y function completed tienen la categoría Host.Executor.In version 1.x, the function started, function executed, and function completed logs have the category Host.Executor. A partir de la versión 2.x, estos registros tienen la categoría Function.<YOUR_FUNCTION_NAME>.Starting in version 2.x, these logs have the category Function.<YOUR_FUNCTION_NAME>.

Si escribe registros en el código de la función, la categoría es Function en la versión 1.x del entorno de ejecución de Functions.If you write logs in your function code, the category is Function in version 1.x of the Functions runtime. En la versión 2.x, la categoría es Function.<YOUR_FUNCTION_NAME>.User.In version 2.x, the category is Function.<YOUR_FUNCTION_NAME>.User.

Niveles de registroLog levels

El registrador de Azure Functions también incluye un nivel de registro con cada registro.The Azure Functions logger also includes a log level with every log. LogLevel es una enumeración y el código entero indica la importancia relativa:LogLevel is an enumeration, and the integer code indicates relative importance:

LogLevelLogLevel CódigoCode
SeguimientoTrace 00
DepurarDebug 11
InformationInformation 22
AdvertenciaWarning 33
ErrorError 44
CríticoCritical 55
NoneNone 66

El nivel de registro None se explica en la sección siguiente.Log level None is explained in the next section.

Configuración del registro en host.jsonLog configuration in host.json

El archivo host.json configura la cantidad de registro que envía una aplicación de la función a Application Insights.The host.json file configures how much logging a function app sends to Application Insights. Para cada categoría, debe indicar el nivel de registro mínimo para enviar.For each category, you indicate the minimum log level to send. Hay dos ejemplos: el primero tiene como destino el tiempo de ejecución de Functions versión 2.x (.NET Core); y el segundo, el tiempo de ejecución de la versión 1.x.There are two examples: the first example targets the Functions version 2.x runtime (.NET Core) and the second example is for the version 1.x runtime.

Versión 2.xVersion 2.x

El entorno de ejecución de v2.x emplea ahora la jerarquía de filtro de registro de .NET Core.The v2.x runtime uses the .NET Core logging filter hierarchy.

{
  "logging": {
    "fileLoggingMode": "always",
    "logLevel": {
      "default": "Information",
      "Host.Results": "Error",
      "Function": "Error",
      "Host.Aggregator": "Trace"
    }
  }
}

Versión 1.xVersion 1.x

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

En el ejemplo siguiente se configuran las reglas siguientes:This example sets up the following rules:

  • Para los registros con la categoría Host.Results o Function, envíe solo el nivel Error y superior a Application Insights.For logs with category Host.Results or Function, send only Error level and above to Application Insights. Los registros del nivel Warning e inferiores se omiten.Logs for Warning level and below are ignored.
  • Para los registros con la categoría Host.Aggregator, envíe todos los registros a Application Insights.For logs with category Host.Aggregator, send all logs to Application Insights. El nivel de registro Trace es el mismo que algunos registradores llaman Verbose, pero usa Trace en el archivo host.json.The Trace log level is the same as what some loggers call Verbose, but use Trace in the host.json file.
  • Para el resto de registros, envíe solo el nivel Information y superior a Application Insights.For all other logs, send only Information level and above to Application Insights.

El valor de categoría de host.json controla el registro de todas las categorías que comienzan con el mismo valor.The category value in host.json controls logging for all categories that begin with the same value. Host en host.json controla el registro de Host.General, Host.Executor, Host.Results y así sucesivamente.Host in host.json controls logging for Host.General, Host.Executor, Host.Results, and so on.

Si host.json incluye varias categorías que comienzan con la misma cadena, las más largas se asignan primero.If host.json includes multiple categories that start with the same string, the longer ones are matched first. Imagine que quiere que todo el tiempo de ejecución excepto Host.Aggregator se registre en el nivel Error, pero que Host.Aggregator lo haga en el nivel Information:Suppose you want everything from the runtime except Host.Aggregator to log at Error level, but you want Host.Aggregator to log at the Information level:

Versión 2.xVersion 2.x

{
  "logging": {
    "fileLoggingMode": "always",
    "logLevel": {
      "default": "Information",
      "Host": "Error",
      "Function": "Error",
      "Host.Aggregator": "Information"
    }
  }
}

Versión 1.xVersion 1.x

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

Para eliminar todos los registros de una categoría, puede usar el nivel de registro None.To suppress all logs for a category, you can use log level None. No hay ningún registro escrito con esa categoría y no existe ningún nivel de registro por encima de él.No logs are written with that category and there's no log level above it.

En las secciones siguientes se describen las categorías principales de registros que crea el tiempo de ejecución.The following sections describe the main categories of logs that the runtime creates.

Categoría Host.ResultsCategory Host.Results

Estos registros se muestran como "requests" en Application Insights,These logs show as "requests" in Application Insights. e indican el éxito o fracaso de una función.They indicate success or failure of a function.

Gráfico de solicitudes

Todos estos registros se escriben en el nivel Information.All of these logs are written at Information level. Si filtra por Warning o superior, no verá ninguno de estos datos.If you filter at Warning or above, you won't see any of this data.

Categoría Host.AggregatorCategory Host.Aggregator

Estos registros proporcionan los recuentos y promedios de las invocaciones de función en un período de tiempo configurable.These logs provide counts and averages of function invocations over a configurable period of time. El período predeterminado es 30 segundos o 1000 resultados, lo que ocurra primero.The default period is 30 seconds or 1,000 results, whichever comes first.

Los registros están disponibles en la tabla customMetrics de Application Insights.The logs are available in the customMetrics table in Application Insights. Algunos ejemplos son el número de ejecuciones, la tasa de éxito y la duración.Examples are the number of runs, success rate, and duration.

Consulta customMetrics

Todos estos registros se escriben en el nivel Information.All of these logs are written at Information level. Si filtra por Warning o superior, no verá ninguno de estos datos.If you filter at Warning or above, you won't see any of this data.

Otras categoríasOther categories

Todos los registros de categorías diferentes a las que ya se muestran están disponibles en la tabla traces en Application Insights.All logs for categories other than the ones already listed are available in the traces table in Application Insights.

Consulta traces

Todos los registros con categorías que comienzan por Host los escribe el tiempo de ejecución de Functions.All logs with categories that begin with Host are written by the Functions runtime. Los registros "Función iniciada" y "Función concluida" tienen la categoría Host.Executor.The "Function started" and "Function completed" logs have category Host.Executor. Para las ejecuciones correctas, estos registros son de nivel Information.For successful runs, these logs are Information level. Las excepciones se registran en el nivel Error.Exceptions are logged at Error level. El tiempo de ejecución también crea registros del nivel Warning; por ejemplo, poner en cola los mensajes enviados a la cola de dudosos.The runtime also creates Warning level logs, for example: queue messages sent to the poison queue.

Los registros escritos por el código de función tienen la categoría Function y pueden tener cualquier nivel de registro.Logs written by your function code have category Function and can be any log level.

Configurar el agregadorConfigure the aggregator

Como se indicó en la sección anterior, el tiempo de ejecución agrega datos acerca de las ejecuciones de la función durante un período de tiempo.As noted in the previous section, the runtime aggregates data about function executions over a period of time. El período predeterminado es 30 segundos o 1000 ejecuciones, lo que ocurra primero.The default period is 30 seconds or 1,000 runs, whichever comes first. Puede configurar este valor en el archivo host.json.You can configure this setting in the host.json file. Este es un ejemplo:Here's an example:

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

Configurar el muestreoConfigure sampling

Application Insights tiene una característica de muestreo que le puede ayudar a impedir que se recopilen demasiados datos de telemetría sobre las ejecuciones completadas en los momentos de picos de carga.Application Insights has a sampling feature that can protect you from producing too much telemetry data on completed executions at times of peak load. Cuando tasa de ejecuciones entrantes supera un umbral especificado, Application Insights empieza a omitir aleatoriamente algunas de las ejecuciones entrantes.When the rate of incoming executions exceeds a specified threshold, Application Insights starts to randomly ignore some of the incoming executions. La configuración predeterminada para el número máximo de ejecuciones por segundo es de 20 (cinco en la versión 1.x).The default setting for maximum number of executions per second is 20 (five in version 1.x). Puede configurar el muestreo en host.json.You can configure sampling in host.json. Este es un ejemplo:Here's an example:

Versión 2.xVersion 2.x

{
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "maxTelemetryItemsPerSecond" : 20
      }
    }
  }
}

Versión 1.xVersion 1.x

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

Nota

El muestreo está habilitado de forma predeterminada.Sampling is enabled by default. Si parece que faltan datos, es posible que simplemente deba ajustar la configuración de muestreo para adaptarla a su escenario de supervisión en particular.If you appear to be missing data, you might need to adjust the sampling settings to fit your particular monitoring scenario.

Escribir registros en funciones de C#Write logs in C# functions

Puede escribir registros en el código de función que aparecen como seguimientos de Application Insights.You can write logs in your function code that appear as traces in Application Insights.

ILoggerILogger

Use un parámetro ILogger en las funciones en lugar de un parámetro TraceWriter.Use an ILogger parameter in your functions instead of a TraceWriter parameter. Los registros creados con TraceWriter se dirigen a Application Insights, pero ILogger le permite hacer un registro estructurado.Logs created by using TraceWriter go to Application Insights, but ILogger lets you do structured logging.

Con un objeto ILogger, llamará al Log<level> métodos de extensión en ILogger para crear registros.With an ILogger object, you call Log<level> extension methods on ILogger to create logs. El código siguiente escribe registros Information con la categoría "Function".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);

Registro estructuradoStructured logging

El orden de los marcadores de posición, no sus nombres, determina qué parámetros se usan en el mensaje del registro.The order of placeholders, not their names, determines which parameters are used in the log message. Supongamos que tiene el siguiente código:Suppose you have the following code:

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

Si mantiene la misma cadena de mensaje e invierte el orden de los parámetros, el texto del mensaje resultante tendrá los valores en los lugares incorrectos.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.

Los marcadores de posición se controlan de esta forma para que pueda hacer el registro estructurado.Placeholders are handled this way so that you can do structured logging. Application Insights almacena los pares de nombre-valor del parámetro y la cadena de mensaje.Application Insights stores the parameter name-value pairs and the message string. Como resultado, los argumentos del mensaje se convierten en campos que puede consultar.The result is that the message arguments become fields that you can query on.

Si la llamada de método del registrador tiene un aspecto similar al ejemplo anterior, puede consultar el campo customDimensions.prop__rowKey.If your logger method call looks like the previous example, you can query the field customDimensions.prop__rowKey. Se agrega el prefijo prop__ para asegurar que no haya ninguna colisión entre los campos que agrega el tiempo de ejecución y los campos que agrega el código de la función.The prop__ prefix is added to ensure there are no collisions between fields the runtime adds and fields your function code adds.

También puede consultar la cadena del mensaje original haciendo referencia al campo customDimensions.prop__{OriginalFormat}.You can also query on the original message string by referencing the field customDimensions.prop__{OriginalFormat}.

Esta es una representación de JSON de ejemplo de los datos 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"
  }
}

Registro de métricas personalizadasCustom metrics logging

En funciones de secuencia de comandos de C#, puede usar el método de extensión LogMetric en ILogger para crear métricas personalizadas en Application Insights.In C# script functions, you can use the LogMetric extension method on ILogger to create custom metrics in Application Insights. Este es un ejemplo de una llamada de método:Here's a sample method call:

logger.LogMetric("TestMetric", 1234);

Este código es una alternativa a llamar a TrackMetric con la API de Application Insights para .NET.This code is an alternative to calling TrackMetric by using the Application Insights API for .NET.

Escribir registros en las funciones de JavaScriptWrite logs in JavaScript functions

En las funciones de Node.js, use context.log para escribir los registros.In Node.js functions, use context.log to write logs. El registro estructurado no está habilitado.Structured logging isn't enabled.

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

Registro de métricas personalizadasCustom metrics logging

Cuando ejecuta la versión 1.x del sistema en tiempo de ejecución de Functions, las funciones de Node.js pueden usar el método context.log.metric para crear métricas personalizadas en Application Insights.When you're running on version 1.x of the Functions runtime, Node.js functions can use the context.log.metric method to create custom metrics in Application Insights. Este método no se admite actualmente en la versión 2.x.This method isn't currently supported in version 2.x. Este es un ejemplo de una llamada de método:Here's a sample method call:

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

Este código es una alternativa a llamar a trackMetric con el SDK de Node.js de Application Insights.This code is an alternative to calling trackMetric by using the Node.js SDK for Application Insights.

Registrar telemetría personalizada en funciones de C#Log custom telemetry in C# functions

Puede usar el paquete NuGet Microsoft.ApplicationInsights para enviar datos de telemetría personalizada a Application Insights.You can use the Microsoft.ApplicationInsights NuGet package to send custom telemetry data to Application Insights. En el siguiente ejemplo de C# se usa la API de telemetría personalizada.The following C# example uses the custom telemetry API. El ejemplo es para una biblioteca de clases. NET, pero el código de Application Insights es el mismo para la secuencia de comandos de C#.The example is for a .NET class library, but the Application Insights code is the same for C# script.

Versión 2.xVersion 2.x

El entorno de ejecución de la versión 2.x usa características más recientes de Application Insights para correlacionar automáticamente la telemetría con la operación actual.The version 2.x runtime uses newer features in Application Insights to automatically correlate telemetry with the current operation. No es necesario establecer manualmente los campos de operación Id, ParentId o Name.There's no need to manually set the operation Id, ParentId, or Name fields.

using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace functionapp0915
{
    public class HttpTrigger2
    {
        private readonly TelemetryClient telemetryClient;

        /// Using dependency injection will guarantee that you use the same configuration for telemetry collected automatically and manually.
        public HttpTrigger2(TelemetryConfiguration telemetryConfiguration)
        {
            this.telemetryClient = new TelemetryClient(telemetryConfiguration);
        }

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

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

            // Track an Event
            var evt = new EventTelemetry("Function called");
            evt.Context.User.Id = name;
            this.telemetryClient.TrackEvent(evt);

            // Track a Metric
            var metric = new MetricTelemetry("Test Metric", DateTime.Now.Millisecond);
            metric.Context.User.Id = name;
            this.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
            };
            dependency.Context.User.Id = name;
            this.telemetryClient.TrackDependency(dependency);

            return Task.FromResult<IActionResult>(new OkResult());
        }
    }
}

Versión 1.xVersion 1.x

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);
        }
        
        // Correlate 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;
        }
    }    
}

No llame a TrackRequest ni a StartOperation<RequestTelemetry>, ya que verá solicitudes duplicadas de invocaciones de función.Don't call TrackRequest or StartOperation<RequestTelemetry> because you'll see duplicate requests for a function invocation. El tiempo de ejecución de Functions realiza un seguimiento automático de las solicitudes.The Functions runtime automatically tracks requests.

No establezca telemetryClient.Context.Operation.Id.Don't set telemetryClient.Context.Operation.Id. Esta configuración global provoca una correlación incorrecta cuando muchas funciones se ejecuten de manera simultánea.This global setting causes incorrect correlation when many functions are running simultaneously. En su lugar, cree una instancia de telemetría nueva (DependencyTelemetry, EventTelemetry) y modifique su propiedad Context.Instead, create a new telemetry instance (DependencyTelemetry, EventTelemetry) and modify its Context property. Luego, pase la instancia de telemetría al método Track correspondiente en TelemetryClient (TrackDependency(), TrackEvent()).Then pass in the telemetry instance to the corresponding Track method on TelemetryClient (TrackDependency(), TrackEvent()). Este método garantiza que la telemetría tenga los detalles de correlación correctos para la invocación actual de la función.This method ensures that the telemetry has the correct correlation details for the current function invocation.

Registrar telemetría personalizada en funciones de JavaScriptLog custom telemetry in JavaScript functions

A continuación, se muestra un fragmento de código de ejemplo que envía telemetría personalizada con el SDK de Node.js para Application Insights:Here is a sample code snippet that sends custom telemetry with the Application Insights Node.js SDK:

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}});

    context.done();
};

El parámetro tagOverrides establece operation_Id en el identificador de invocación de la función.The tagOverrides parameter sets the operation_Id to the function's invocation ID. Esta configuración le permite correlacionar toda la telemetría personalizada y generada automáticamente para una determinada invocación de función.This setting enables you to correlate all of the automatically generated and custom telemetry for a given function invocation.

DependenciasDependencies

Functions v2 recopila automáticamente las dependencias de solicitudes HTTP, ServiceBus y SQL.Functions v2 automatically collects dependencies for HTTP requests, ServiceBus, and SQL.

Puede escribir código personalizado para mostrar las dependencias.You can write custom code to show the dependencies. Para ver ejemplos, consulte el código de ejemplo en la sección de telemetría personalizada de C#.For examples, see the sample code in the C# custom telemetry section. El código de ejemplo da como resultado un mapa de aplicación de Application Insights, que tiene un aspecto como el de la siguiente imagen:The sample code results in an application map in Application Insights that looks like the following image:

Mapa de aplicación

Informar de problemasReport issues

Para notificar un problema con la integración de Application Insights en Functions o para realizar una solicitud o sugerencia cree un problema en GitHub.To report an issue with Application Insights integration in Functions, or to make a suggestion or request, create an issue in GitHub.

Registros de transmisiónStreaming Logs

Al implementar una aplicación, suele resultar útil ver la información de registro casi en tiempo real.While developing an application, it is often useful to see logging information in near-real time. Puede ver una secuencia de archivos de registro que generan las funciones en Azure Portal o en una sesión de línea de comandos en el equipo local.You can view a stream of log files being generated by your functions either in the Azure portal or in a command-line session on your local computer.

Esto equivale a la salida que se ve cuando se depuran las funciones durante el desarrollo local.This is equivalent to the output seen when you debug your functions during local development. Para más información, vea How to: Stream logs (Cómo: Transmitir registros).For more information, see How to stream logs.

Nota

Los registros de secuencias admiten una sola instancia del host de Functions.Streaming logs support only a single instance of the Functions host. Cuando la función se escala a varias instancias, no se muestran los datos de otras instancias en la secuencia de registro.When your function is scaled to multiple instances, data from other instances are not shown in the log stream. Live Metrics Stream en Application Insights admite varias instancias.The Live Metrics Stream in Application Insights does supported multiple instances. Si bien también funciona casi en tiempo real, el análisis de secuencias también se basa en datos muestreados.While also in near real time, streaming analytics are also based on sampled data.

PortalPortal

Para ver los registros de secuencias en el portal, seleccione la pestaña Características de la plataforma en la aplicación de función.To view streaming logs in the portal, select the Platform features tab in your function app. Luego, en Supervisión, elija Secuencias de registro.Then, under Monitoring, choose Log streaming.

Habilitar los registros de secuencias en el portal

Esto conecta la aplicación con el servicio de secuencias de registro, y los registros de aplicación se muestran en la ventana.This connects your app to the log streaming service and application logs are displayed in the window. Puede alternar entre Registros de aplicaciones y Registros de servidor web.You can toggle between Application logs and Web server logs.

Ver los registros de secuencias en el portal

Visual Studio CodeVisual Studio Code

Para activar los registros de streaming de su aplicación de funciones en Azure:To turn on the streaming logs for your function app in Azure:

  1. Seleccione F1 para abrir la paleta de comandos, y busque y ejecute el comando Azure Functions: Start Streaming Logs (Azure Functions: iniciar registros de streaming).Select F1 to open the command palette, and then search for and run the command Azure Functions: Start Streaming Logs.

  2. Seleccione su aplicación de funciones en Azure y seleccione Yes (Sí) para habilitar el registro de aplicaciones de la aplicación de funciones.Select your function app in Azure, and then select Yes to enable application logging for the function app.

  3. Desencadene las funciones en Azure.Trigger your functions in Azure. Observará que los datos de registro se muestran en la ventana de salida de Visual Studio Code.Notice that log data is displayed in the Output window in Visual Studio Code.

  4. Cuando haya terminado, recuerde ejecutar el comando Azure Functions: Stop Streaming Logs (Azure Functions: detener los registros de streaming) para deshabilitar el registro de la aplicación de funciones.When you're done, remember to run the command Azure Functions: Stop Streaming Logs to disable logging for the function app.

CLI de AzureAzure CLI

Puede habilitar los registros de secuencias con la CLI de Azure.You can enable streaming logs by using the Azure CLI. Use los siguientes comandos para iniciar sesión, elija su suscripción y transmita los archivos de registro:Use the following commands to sign in, choose your subscription, and stream log files:

az login
az account list
az account set --subscription <subscriptionNameOrId>
az webapp log tail --resource-group <RESOURCE_GROUP_NAME> --name <FUNCTION_APP_NAME>

Azure PowerShellAzure PowerShell

Puede habilitar los registros de secuencias con Azure PowerShell.You can enable streaming logs by using Azure PowerShell. Para PowerShell, use los siguientes comandos para agregar su cuenta de Azure, elegir su suscripción y transmitir los archivos de registro:For PowerShell, use the following commands to add your Azure account, choose your subscription, and stream log files:

Add-AzAccount
Get-AzSubscription
Get-AzSubscription -SubscriptionName "<subscription name>" | Select-AzSubscription
Get-AzWebSiteLog -Name <FUNCTION_APP_NAME> -Tail

Deshabilitar el registro integradoDisable built-in logging

Cuando habilite Application Insights, deshabilite el registro integrado que usa Azure Storage.When you enable Application Insights, disable the built-in logging that uses Azure Storage. El registro integrado es útil para realizar pruebas con cargas de trabajo ligeras, pero no está diseñado para su uso en producción de alta carga.The built-in logging is useful for testing with light workloads, but isn't intended for high-load production use. Para la supervisión de producción, se recomienda Application Insights.For production monitoring, we recommend Application Insights. Si el registro integrado se usa en producción, el registro resultante podría estar incompleto debido a la limitación de Azure Storage.If built-in logging is used in production, the logging record might be incomplete because of throttling on Azure Storage.

Para deshabilitar el registro integrado, elimine la configuración de la aplicación AzureWebJobsDashboard.To disable built-in logging, delete the AzureWebJobsDashboard app setting. Para obtener información acerca de cómo eliminar la configuración de la aplicación en Azure Portal, consulte la sección Application settings (Configuración de la aplicación) en How to manage a function app (Cómo administrar una aplicación de función).For information about how to delete app settings in the Azure portal, see the Application settings section of How to manage a function app. Antes de eliminar el valor de configuración de la aplicación, asegúrese de que no haya ninguna función existente en la misma aplicación de función que utilice dicho valor para los desencadenadores o enlaces de Azure Storage.Before you delete the app setting, make sure no existing functions in the same function app use the setting for Azure Storage triggers or bindings.

Pasos siguientesNext steps

Para obtener más información, consulte los siguientes recursos:For more information, see the following resources: