Supervisión de registros en Azure Container Apps con Log Analytics

Azure Container Apps se integra con Azure Monitor Log Analytics para ayudarle a supervisar y analizar los registros de la aplicación contenedora. Al seleccionar esta solución para la supervisión de registros, el entorno de Container Apps incluye un área de trabajo de Log Analytics que proporciona un lugar común para almacenar los datos del registro del sistema y de la aplicación de todas las aplicaciones contenedoras que se ejecutan en el entorno.

Puede acceder a las entradas de registro consultando las tablas de Log Analytics a través del portal de Azure o desde una línea de comandos mediante CLI de Azure.

Azure Container Apps proporciona tres tipos de registro para ayudarle a supervisar y solucionar problemas:

  • Registros de consola: la aplicación genera estos registros.
  • Registros del sistema: el servicio Container Apps genera estos registros.
  • Registros HTTP: la capa de entrada emite estos registros cuando el registro HTTP está habilitado a través de la configuración de diagnóstico.

Registros del sistema

El servicio Container Apps proporciona mensajes de registro del sistema en el nivel de aplicación de contenedor. Los registros del sistema emiten los siguientes mensajes:

Fuente Tipo Mensaje
Dapr Información Se creó correctamente el componente de Dapr <component-name> con ámbito <dapr-component-scope>.
Dapr Información Se actualizó correctamente el componente de Dapr <component-name> con ámbito <component-type>.
Dapr Error Error al crear el componente de Dapr <component-name>.
Montajes de volumen Información Se ha montado correctamente el volumen <volume-name> para la revisión <revision-scope>.
Montajes de volumen Error Error al montar el volumen <volume-name>
Vinculación de dominio Información Dominio <domain> enlazado correctamente a la aplicación contenedora <container app name>
Autenticación Información Autenticación habilitada en la aplicación. Creación de la configuración de autenticación
Autenticación Información Configuración de autenticación creada correctamente
Peso del tráfico Información Establecimiento de un peso de tráfico de <percentage>% para la revisión <revision-name\>
Aprovisionamiento de revisiones Información Creación de una revisión: <revision-name>
Aprovisionamiento de revisiones Información La revisión <name> se ha aprovisionado correctamente.
Aprovisionamiento de revisiones Información Desactivación de revisiones antiguas desde 'ActiveRevisionsMode=Single'
Aprovisionamiento de revisiones Error Error al aprovisionar la revisión <revision-name>. ErrorCode: <[ErrImagePull]|[Timeout]|[ContainerCrashing]>

Puede acceder a los datos de registro del sistema consultando la ContainerAppSystemLogs_CL tabla. Las columnas específicas de Container Apps más usadas en la tabla son:

Columna Descripción
ContainerAppName_s Nombre de la aplicación de contenedor
EnvironmentName_s Nombre del entorno de Container Apps
Log_s Mensaje de registro
RevisionName_s Nombre de la revisión

Registros de consola

Los registros de consola se originan a partir de los mensajes stderr y stdout de los contenedores de la aplicación de contenedor y los sidecars de Dapr. Puede ver los registros de la consola consultando la tabla ContainerAppConsoleLogs_CL.

Sugerencia

Instrumentar tu código con mensajes de registro bien definidos puede ayudarte a comprender qué rendimiento tiene tu código y a depurar problemas. Para obtener más información sobre los procedimientos recomendados, consulte Diseño para operaciones.

Las columnas específicas de Container Apps más utilizadas en ContainerAppConsoleLogs_CL incluyen:

Columna Descripción
ContainerAppName_s Nombre de la aplicación de contenedor
ContainerGroupName_g Nombre de la réplica
ContainerId_s Identificador del contenedor
ContainerImage_s Nombre de imagen de contenedor
EnvironmentName_s Nombre del entorno de Container Apps
Log_s Mensaje de registro
RevisionName_s Nombre de la revisión

Registros de HTTP

Azure Container Apps puede emitir registros HTTP mediante la configuración de diagnóstico de Azure Monitor en el entorno administrado de Container Apps.

Use registros HTTP para inspeccionar el volumen de solicitudes, las rutas de acceso, los métodos y los resultados de respuesta al diagnosticar el comportamiento de la API y el tráfico web.

El ContainerAppHTTPLogs esquema contiene los siguientes campos y descripciones:

Campo Tipo Descripción
Solicitud
Method string Método de solicitud HTTP (por ejemplo, GET, POST).
Path string Ruta de la solicitud, incluyendo la cadena de consulta. Los valores confidenciales, como tokens o claves de API, pueden aparecer aquí si los clientes los pasan en la consulta, así que controle en consecuencia.
Authority string La cabecera HTTP Host (o la pseudocabecera HTTP/2 :authority) enviada por el cliente.
Protocol string Versión del protocolo observada por la entrada, una de HTTP/1.1, HTTP/2o HTTP/3.
UserAgent string Encabezado del cliente User-Agent.
XForwardedFor string Cadena de IP del cliente del encabezado X-Forwarded-For. Contiene direcciones IP de usuario final, por lo que trata como PII.
BytesReceived long Tamaño del cuerpo de la solicitud recibido del cliente, en bytes(%BYTES_RECEIVED%).
Respuesta
StatusCode int Código de estado de respuesta HTTP devuelto al cliente. 0 indica el cliente desconectado antes de la respuesta iniciada(%RESPONSE_CODE%).
ResponseCodeDetails string Token corto que explica quién establece el código de estado y por qué. Por ejemplo, via_upstream, direct_response, route_not_found, upstream_per_try_timeout(lista completa).
ResponseFlags string Uno o varios códigos cortos que describen las condiciones de nivel de transporte. Por ejemplo, - (ninguno), UH (sin upstream disponible), UT (tiempo de espera del upstream agotado), NR (sin ruta) (lista completa).
BytesSent long Tamaño del cuerpo de la respuesta enviado al cliente, en bytes(%BYTES_SENT%).
Timing
StartTime fecha y hora La entrada de hora (UTC) comenzó a procesar la solicitud (%START_TIME%).
RequestDuration long Tiempo total, en milisegundos, desde el inicio de la solicitud hasta el último byte de respuesta enviado(%DURATION%).
Identificadores
RequestId string Solicitar id. de correlación. Refleja el x-request-id encabezado si el cliente proporcionó uno; de lo contrario, la entrada genera un valor. No se garantiza que sea un UUID.
ConnectionId string Identificador de la conexión descendente por la que llegó esta solicitud. Varias solicitudes en la misma conexión comparten este valor(%CONNECTION_ID%).
Aplicación / Enrutamiento
ContainerAppName string Aplicación de contenedor que procesó la solicitud.
RevisionName string Revisión de la aplicación de contenedor que procesó la solicitud.
ReplicaName string Réplica (pod) que atendió la solicitud.
EnvironmentName string Entorno de Container Apps que hospeda la aplicación.
upstream
UpstreamHost string Dirección (IP:port) del extremo upstream que atendió la solicitud(%UPSTREAM_HOST%).
UpstreamRequestAttemptCount int Número de veces que se intentó procesar la solicitud en sentido ascendente, incluidos los reintentos. 0 significa que nunca se intentó.
Diagnósticos de entrada
EnvoyPodName string Nombre del pod de entrada que generó este registro. Resulta útil para cotejar los registros de entrada durante la investigación de incidentes.
EnvoyContainerId string Id. de contenedor de la instancia de entrada. Resulta útil para cotejar los registros de entrada durante la investigación de incidentes.

Nota:

Después de habilitar los registros HTTP, la tabla ContainerAppHTTPLogs puede tardar varios minutos en aparecer en Log Analytics.

Consulta de registros HTTP en Log Analytics

Use primero las siguientes consultas centradas en la evaluación de prioridades y, a continuación, use los ejemplos de análisis adicionales siguientes.

Visualización de errores HTTP recientes

Utilice esta consulta cuando vea tasas de error elevadas en sus paneles de control, los clientes informen de fallos o quiera hacer un triaje rápido de qué está fallando ahora mismo.

ContainerAppHTTPLogs
| where TimeGenerated > ago(1h)
| where StatusCode >= 400
| project TimeGenerated, ContainerAppName, RevisionName, Method, Path,
  StatusCode, ResponseCodeDetails, RequestDuration, RequestId
| order by TimeGenerated desc
| take 100

Sugerencia

Compruebe ResponseCodeDetails por qué se produjo un error en una solicitud. Por ejemplo, route_not_found indica un error de configuración de enrutamiento, mientras que via_upstream significa que el error lo devolvió el propio contenedor.

Búsqueda de solicitudes lentas

Use esta consulta cuando la aplicación se sienta lenta, está investigando una queja de latencia o desea comprobar una corrección de rendimiento.

ContainerAppHTTPLogs
| where TimeGenerated > ago(1h)
| where ContainerAppName == "<app-name>"
| top 50 by RequestDuration desc
| project TimeGenerated, Method, Path, StatusCode, RequestDuration,
  ReplicaName, UpstreamRequestAttemptCount, RequestId

Sugerencia

RequestDuration se expresa en milisegundos. Si observa valores altos junto con UpstreamRequestAttemptCount > 1, la solicitud se ha reintentado, lo que aumenta el tiempo total.

Seguimiento del volumen de solicitudes y la tasa de errores por revisión

Utilice esta consulta cuando haya implementado una nueva revisión y desee comprobar que funciona correctamente, o cuando esté llevando a cabo una implementación azul/verde y desee comparar dos revisiones en paralelo.

ContainerAppHTTPLogs
| where TimeGenerated > ago(6h)
| where ContainerAppName == "<app-name>"
| summarize Requests = count(),
  Errors = countif(StatusCode >= 500),
  ErrorRatePct = round(100.0 * countif(StatusCode >= 500) / count(), 2),
  P95DurationMs = percentile(RequestDuration, 95)
  by RevisionName, bin(TimeGenerated, 5m)
| order by TimeGenerated desc
| render timechart

Sugerencia

Que una revisión nueva empiece de repente a atender peticiones de 0 suele significar que hay un problema con la ponderación del tráfico en la configuración de entrada. Una nueva revisión con una tasa de errores mayor o P95 que la anterior es una regresión de implementación; considere la posibilidad de revertir.

Rastrea una única solicitud de principio a fin

Utiliza esta consulta cuando un cliente informe de una transacción fallida concreta y te facilite su identificador de solicitud (el valor del encabezado x-request-id que vio). Debe encontrar esa solicitud exacta y los registros de aplicaciones relacionados.

let _requestId = "<request-id>";
ContainerAppHTTPLogs
| where TimeGenerated > ago(24h)
| where RequestId == _requestId
| project TimeGenerated, ContainerAppName, RevisionName, ReplicaName,
  Method, Path, StatusCode, ResponseCodeDetails, ResponseFlags,
  RequestDuration, UpstreamHost, UserAgent, XForwardedFor

Sugerencia

Una vez que tenga el ReplicaName de la fila anterior, combínalo con ContainerAppConsoleLogs_CL filtrado por la misma réplica y una pequeña ventana de tiempo alrededor de TimeGenerated para ver las líneas de registro de tu propia aplicación para esa solicitud.

Identifique sus principales endpoints con fallos

Use esta consulta cuando vea muchos errores, pero no sepa dónde centrarse primero. Esta consulta muestra qué rutas de acceso son responsables de la mayoría de los errores, por lo que puede priorizar las correcciones por impacto.

ContainerAppHTTPLogs
| where TimeGenerated > ago(24h)
| where StatusCode >= 400
| summarize Errors = count(),
  DistinctClientIPs = dcount(XForwardedFor),
  SampleStatusCodes = make_set(StatusCode, 5),
  ExampleDetails = take_any(ResponseCodeDetails)
  by ContainerAppName, Method, Path
| order by Errors desc
| take 20

Sugerencia

Un recuento alto de DistinctClientIPs, junto con los errores, sugiere un problema real y de amplio impacto. Un recuento bajo suele indicar que hay un único cliente que no funciona correctamente (por ejemplo, un escáner o un bucle de reintentos defectuoso).

Inspección de registros HTTP recientes

Use esta consulta para inspeccionar los registros de registro HTTP recientes:

ContainerAppHTTPLogs
| where TimeGenerated > ago(2h)
| project TimeGenerated, Method, Path, StatusCode, ContainerAppName, EnvironmentName
| order by TimeGenerated desc
| take 100

Use los ejemplos siguientes para escenarios comunes de análisis de registros HTTP.

Distribución de código de estado

ContainerAppHTTPLogs
| where TimeGenerated > ago(24h)
| summarize Count = count() by toint(StatusCode)
| order by Count desc

Vista centrada en errores (4xx/5xx)

ContainerAppHTTPLogs
| where TimeGenerated > ago(2h)
| extend StatusCodeInt = toint(StatusCode)
| where StatusCodeInt >= 400
| project
    Time=TimeGenerated,
    StatusCode=StatusCodeInt,
    Method,
    Path,
    Details=ResponseCodeDetails,
    EnvName=EnvironmentName,
    AppName=ContainerAppName,
    Revision=RevisionName
| top 100 by Time desc

Latencia (P50/P95/P99) por aplicación y ruta de acceso

ContainerAppHTTPLogs
| where TimeGenerated > ago(2h)
| summarize
    Requests = count(),
    P50 = percentile(RequestDuration, 50),
    P95 = percentile(RequestDuration, 95),
    P99 = percentile(RequestDuration, 99)
  by ContainerAppName, Path
| order by P95 desc

Consultar registros usando Log Analytics

Log Analytics es una herramienta de Azure Portal que puede usar para ver y analizar los datos de registro. Mediante el uso de Log Analytics, puede escribir consultas de Kusto y, a continuación, ordenar, filtrar y visualizar los resultados en gráficos para detectar tendencias e identificar problemas. Puede trabajar de forma interactiva con los resultados de la consulta o utilizarlos con otras características, como las alertas, los paneles y los libros.

Portal de Azure

Abra Log Analytics desde Registros en el menú de la barra lateral de la página de la aplicación contenedora. También puede iniciar Log Analytics desde Monitor > Logs.

Consulte los registros mediante las tablas enumeradas en la categoría Registros personalizados de la pestaña Tablas . Las tablas de esta categoría son ContainerAppSystemLogs_CL y ContainerAppConsoleLogs_CL.

Captura de pantalla de la página de consulta de Log Analytics que muestra tablas de registro personalizadas.

La siguiente consulta de Kusto muestra entradas de registro de consola para la aplicación contenedora denominada album-api.

ContainerAppConsoleLogs_CL
| where ContainerAppName_s == 'album-api'
| project Time=TimeGenerated, AppName=ContainerAppName_s, Revision=RevisionName_s, Container=ContainerName_s, Message=Log_s
| take 100

La siguiente consulta de Kusto muestra entradas de registro del sistema para la aplicación contenedora denominada album-api.

ContainerAppSystemLogs_CL
| where ContainerAppName_s == 'album-api'
| project Time=TimeGenerated, EnvName=EnvironmentName_s, AppName=ContainerAppName_s, Revision=RevisionName_s, Message=Log_s
| take 100

Para obtener más información sobre las consultas de registro y Log Analytics, consulte el tutorial Log Analytics.

CLI de Azure o PowerShell

Puede consultar los registros de Container Apps mediante CLI de Azure.

En este ejemplo, las consultas de la CLI de Azure generan una tabla que contiene entradas de registros para el nombre de la aplicación de contenedor album-api. Los parámetros después del project operador especifican las columnas de tabla. La variable $WORKSPACE_CUSTOMER_ID tiene el GUID del área de trabajo de Log Analytics.

En este ejemplo se consulta la tabla ContainerAppConsoleLogs_CL:

az monitor log-analytics query --workspace $WORKSPACE_CUSTOMER_ID --analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'album-api' | project Time=TimeGenerated, AppName=ContainerAppName_s, Revision=RevisionName_s, Container=ContainerName_s, Message=Log_s, LogLevel_s | take 5" --out table

En este ejemplo se consulta la tabla ContainerAppSystemLogs_CL:

az monitor log-analytics query --workspace $WORKSPACE_CUSTOMER_ID --analytics-query "ContainerAppSystemLogs_CL | where ContainerAppName_s == 'album-api' | project Time=TimeGenerated, AppName=ContainerAppName_s, Revision=RevisionName_s, Message=Log_s, LogLevel_s | take 5" --out table

Pasos siguientes