Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
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