

# Supervisión de las API de WebSocket en API Gateway
<a name="websocket-api-monitor"></a>

Puede utilizar las métricas de CloudWatch y CloudWatch Logs para monitorear las API de WebSocket. Al combinar registros y métricas, puede registrar errores y monitorear el rendimiento de su API.

**nota**  
API Gateway podría no generar registros y métricas en los siguientes casos:  
Errores 413: Entidad de solicitud demasiado grande
Errores 429: Demasiadas Solicitudes
Errores de la serie 400 de solicitudes enviadas a un dominio personalizado que no tiene asignación de API
Errores de la serie 500 causados por errores internos

**Topics**
+ [Supervisión de la ejecución de la API de WebSocket con métricas de CloudWatch](apigateway-websocket-api-logging.md)
+ [Configuración del registro de las API de WebSocket en API Gateway](websocket-api-logging.md)

# Supervisión de la ejecución de la API de WebSocket con métricas de CloudWatch
<a name="apigateway-websocket-api-logging"></a>

Puede usar métricas de [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) para monitorear las API de WebSocket. La configuración es similar a la utilizada para las API de REST. Para obtener más información, consulte [Supervisión de la ejecución de la API de REST con métricas de Amazon CloudWatch](monitoring-cloudwatch.md).

Las siguientes métricas se admiten para las API de WebSocket:


| Métrica | Descripción | 
| --- | --- | 
| ConnectCount | El número de mensajes enviados a la integración de ruta \$1connect. | 
| MessageCount | El número de mensajes enviados a la API de WebSocket, con origen o destino en el cliente. | 
| IntegrationError | El número de solicitudes que devuelven una respuesta 4XX/5XX desde la integración. | 
| ClientError | El número de solicitudes para las que API Gateway devuelve una respuesta 4XX antes de que se invoque la integración. | 
| ExecutionError | Errores que se han producido al llamar a la integración. | 
| IntegrationLatency | El tiempo que transcurre entre el momento en que API Gateway envía la solicitud a la integración y el momento en que API Gateway recibe la respuesta de la integración. Se suprime para devoluciones de llamada e integraciones simuladas. | 

Puede usar las dimensiones de la tabla siguiente para filtrar las métricas de API Gateway.


| Dimensión | Descripción | 
| --- | --- | 
| ApiId | Filtra las métricas de API Gateway para una API con el ID de API especificado. | 
| ApiId, Stage | Filtra las métricas de API Gateway para una etapa de API cuyos ID de API y de etapa se hayan especificado. | 
| ApiId, método, recurso, etapa |  Filtra las métricas de API Gateway para un método de API con el ID de API, el ID de etapa, la ruta de recursos y el ID de enrutamiento específicos. API Gateway no enviará estas métricas a menos que haya habilitado explícitamente las métricas detalladas de CloudWatch. Puede hacerlo mediante una llamada a la acción [UpdateStage](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis-apiid-stages-stagename.html) de la API de REST de API Gateway V2 para actualizar la propiedad `detailedMetricsEnabled` en `true`. También puede llamar al comando [update-stage](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/update-stage.html) AWS CLI para actualizar la propiedad `DetailedMetricsEnabled` a `true`. Si activa estas métricas, se le cobrarán cargos adicionales en su cuenta. Para obtener más información sobre precios, consulte [Precios de Amazon CloudWatch](https://aws.amazon.com/cloudwatch/pricing/).  | 

# Configuración del registro de las API de WebSocket en API Gateway
<a name="websocket-api-logging"></a>

Puede habilitar el registro para escribir registros en CloudWatch Logs. Existen dos tipos de registro de API en CloudWatch: los registros de ejecución y los registros de acceso. En el registro de ejecución, API Gateway administra los CloudWatch Logs. El proceso incluye la creación de grupos y flujos de registros y la notificación a los flujos de registro de las solicitudes y respuestas del intermediario. 

Para aumentar la seguridad, le recomendamos que utilice el registro de ejecución en el nivel `INFO` o `ERROR`. Es probable que deba hacerlo para asegurar el cumplimiento de diversos marcos normativos. Para obtener más información, consulte [Controles de Amazon API Gateway](https://docs.aws.amazon.com/securityhub/latest/userguide/apigateway-controls.html) en la *Guía del usuario de AWS Security Hub*.

En los registros de acceso, tanto usted como el desarrollador de la API pretenden registrar quién ha obtenido acceso a la API y cómo el intermediario ha obtenido acceso a la API. Puede crear su propio grupo de registros o elegir un grupo de registros existente, que podría administrarse a través de API Gateway. Para especificar los detalles de acceso, seleccione variables `$context` (expresadas en un formato que elija) y elija un grupo de registro como destino.

Para ver instrucciones sobre cómo configurar el registro de CloudWatch, consulte [Configuración del registro de API de CloudWatch mediante la consola de API Gateway](set-up-logging.md#set-up-access-logging-using-console).

Al especificar el **Log Format (Formato de registro)**, puede elegir las variables de contexto que deben registrarse. Se admiten las siguientes variables.


| Parámetro | Descripción | 
| --- | --- | 
| \$1context.apiId |  El identificador que API Gateway asigna a su API.  | 
| \$1context.authorize.error | El mensaje de error de autorización. | 
| \$1context.authorize.latency | La latencia de autorización en ms. | 
| \$1context.authorize.status | El código de estado devuelto por un intento de autorización. | 
| \$1context.authorizer.error | El mensaje de error devuelto por un autorizador. | 
| \$1context.authorizer.integrationLatency | La latencia del autorizador de Lambda en ms. | 
| \$1context.authorizer.integrationStatus | El código de estado que devuelve un autorizador de Lambda. | 
| \$1context.authorizer.latency | La latencia del autorizador en ms. | 
| \$1context.authorizer.requestId | El ID de solicitud del punto de conexión de AWS. | 
| \$1context.authorizer.status | El código de estado devuelto por un autorizador. | 
| \$1context.authorizer.principalId |  La identificación de usuario principal que está asociada con el token que envía el cliente y devuelve la función de Lambda del autorizador personalizado de Lambda de API Gateway. (El autorizador de Lambda se conocía anteriormente como “autorizador personalizado”).  | 
| \$1context.authorizer.property |  El valor en forma de cadena del par clave-valor especificado de la asignación `context` que devuelve la función de Lambda del autorizador de Lambda de API Gateway. Por ejemplo, si el autorizador devuelve la siguiente asignación de `context`:  <pre>"context" : {<br />                            "key": "value",<br />                            "numKey": 1,<br />                            "boolKey": true<br />                            }</pre> la llamada a `$context.authorizer.key` devuelve la cadena `"value"`, la llamada a `$context.authorizer.numKey` devuelve la cadena `"1"` y la llamada a `$context.authorizer.boolKey` devuelve la cadena `"true"`.  | 
| \$1context.authenticate.error | El mensaje de error devuelto por un intento de autorización. | 
| \$1context.authenticate.latency | La latencia de autenticación en ms. | 
| \$1context.authenticate.status | El código de estado devuelto por un intento de autenticación. | 
| \$1context.connectedAt |  Hora de la conexión en [formato de tiempo Unix](https://en.wikipedia.org/wiki/Unix_time).  | 
| \$1context.connectionId |  Identificador único para la conexión que se puede utilizar para realizar una devolución de llamada al cliente.  | 
| \$1context.domainName |  Nombre de dominio para la API de WebSocket. Se puede utilizar para realizar una devolución de llamada al cliente (en lugar de un valor de código rígido).  | 
| \$1context.error.message |  Una cadena que contiene un mensaje de error de API Gateway.  | 
| \$1context.error.messageString | El valor entrecomillado de \$1context.error.message, es decir, "\$1context.error.message". | 
| \$1context.error.responseType |  El tipo de respuesta de error.  | 
| \$1context.error.validationErrorString |  Una cadena que contiene un mensaje de error de validación detallado.  | 
| \$1context.eventType |  El tipo de evento: `CONNECT`, `MESSAGE` o `DISCONNECT`.  | 
| \$1context.extendedRequestId | Es igual que \$1context.requestId. | 
| \$1context.identity.accountId |  El ID de cuenta de AWS asociado con la solicitud.  | 
| \$1context.identity.apiKey |  Clave del propietario de API asociada a la solicitud de API habilitada para claves.  | 
| \$1context.identity.apiKeyId | ID de clave de API asociado a la solicitud de API habilitada para claves | 
| \$1context.identity.caller |  El identificador principal del intermediario que firmó la solicitud. Compatible con rutas que utilizan la autorización de IAM.  | 
| \$1context.identity.cognitoAuthenticationProvider |  Una lista separada por comas de todos los proveedores de autenticación de Amazon Cognito utilizados por el intermediario que realiza la solicitud. Solo está disponible si la solicitud se firmó con las credenciales de Amazon Cognito.  Por ejemplo, para una identidad de un grupo de usuarios de Amazon Cognito, `cognito-idp. region.amazonaws.com/user_pool_id,cognito-idp.region.amazonaws.com/user_pool_id:CognitoSignIn:token subject claim` Consulte [Uso de las identidades federadas](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html) en la *Guía para desarrolladores de Amazon Cognito* para obtener información sobre los proveedores de autenticación de Amazon Cognito disponibles. | 
| \$1context.identity.cognitoAuthenticationType |  El tipo de autenticación de Amazon Cognito del intermediario que realiza la solicitud. Solo está disponible si la solicitud se firmó con las credenciales de Amazon Cognito. Los valores posibles incluyen `authenticated` para identidades autenticadas y `unauthenticated` para identidades no autenticadas. | 
| \$1context.identity.cognitoIdentityId |  El ID de identidad de Amazon Cognito del intermediario que realiza la solicitud. Solo está disponible si la solicitud se firmó con las credenciales de Amazon Cognito.  | 
| \$1context.identity.cognitoIdentityPoolId |  El ID del grupo de identidades de Amazon Cognito del intermediario que realiza la solicitud. Solo está disponible si la solicitud se firmó con las credenciales de Amazon Cognito.  | 
| \$1context.identity.principalOrgId |  El [ID de organización de AWS](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_details.html). Compatible con rutas que utilizan la autorización de IAM.  | 
| \$1context.identity.sourceIp |  La dirección IP de origen de la conexión TCP que realiza la solicitud de API Gateway.  | 
| \$1context.identity.user |  El identificador principal del usuario que se autorizará a acceder al recurso. Compatible con rutas que utilizan la autorización de IAM.  | 
| \$1context.identity.userAgent |  El agente de usuario del intermediario de la API.  | 
| \$1context.identity.userArn |  El Nombre de recurso de Amazon (ARN) del usuario identificado después de la autenticación.  | 
| \$1context.integration.error | El mensaje de error devuelto por una integración. | 
| \$1context.integration.integrationStatus | Para la integración de proxy de Lambda, el código de estado que se devuelve desde AWS Lambda, y no desde el código de función de Lambda del backend. | 
| \$1context.integration.latency | La latencia de integración en ms. Es igual que \$1context.integrationLatency. | 
| \$1context.integration.requestId | El ID de solicitud del punto de conexión de AWS. Es igual que \$1context.awsEndpointRequestId. | 
| \$1context.integration.status | El código de estado devuelto por una integración. Para integraciones de proxy de Lambda, este es el código de estado que devuelve su código de la función de Lambda. Es igual que \$1context.integrationStatus. | 
| \$1context.integrationLatency | La latencia de integración en ms, disponible únicamente para el registro de acceso. | 
| \$1context.messageId |  Un ID único del lado del servidor para un mensaje. Solo está disponible si `$context.eventType` es `MESSAGE`.  | 
| \$1context.requestId |  Igual que `$context.extendedRequestId`.  | 
| \$1context.requestTime | Hora de la solicitud en formato [CLF](https://httpd.apache.org/docs/current/logs.html#common)-(dd/MMM/yyyy:HH:mm:ss \$1-hhmm). | 
| \$1context.requestTimeEpoch | Hora de la solicitud en formato [Epoch](https://en.wikipedia.org/wiki/Unix_time) en milisegundos. | 
| \$1context.routeKey |  La clave de ruta seleccionada.  | 
| \$1context.stage |  La etapa de implementación de la llamada a la API (por ejemplo, beta o prod).  | 
| \$1context.status |  Estado de la respuesta.  | 
| \$1context.waf.error | El mensaje de error devuelto por AWS WAF. | 
| \$1context.waf.latency | La latencia de AWS WAF en ms. | 
| \$1context.waf.status | El código de estado devuelto por AWS WAF. | 

Algunos ejemplos de los formatos de registro de acceso que se utilizan habitualmente se muestran en la consola de API Gateway y se detallan a continuación.
+ `CLF` ([Common Log Format](https://httpd.apache.org/docs/current/logs.html#common)):

  ```
  $context.identity.sourceIp $context.identity.caller \
  $context.identity.user [$context.requestTime] "$context.eventType $context.routeKey $context.connectionId" \
  $context.status $context.requestId
  ```

  Los caracteres de continuación (`\`) deben entenderse como una ayuda visual. El formato de registro debe ser una sola línea. Puede agregar un carácter de nueva línea (`\n`) al final del formato de registro para incluir una nueva línea al final de cada entrada de registro.
+  `JSON`: 

  ```
  {
  "requestId":"$context.requestId", \
  "ip": "$context.identity.sourceIp", \
  "caller":"$context.identity.caller", \
  "user":"$context.identity.user", \
  "requestTime":"$context.requestTime", \
  "eventType":"$context.eventType", \
  "routeKey":"$context.routeKey", \
  "status":"$context.status", \
  "connectionId":"$context.connectionId"
  }
  ```

  Los caracteres de continuación (`\`) deben entenderse como una ayuda visual. El formato de registro debe ser una sola línea. Puede agregar un carácter de nueva línea (`\n`) al final del formato de registro para incluir una nueva línea al final de cada entrada de registro.
+ `XML`: 

  ```
  <request id="$context.requestId"> \
   <ip>$context.identity.sourceIp</ip> \
   <caller>$context.identity.caller</caller> \
   <user>$context.identity.user</user> \
   <requestTime>$context.requestTime</requestTime> \
   <eventType>$context.eventType</eventType> \
   <routeKey>$context.routeKey</routeKey> \
   <status>$context.status</status> \
   <connectionId>$context.connectionId</connectionId> \
  </request>
  ```

  Los caracteres de continuación (`\`) deben entenderse como una ayuda visual. El formato de registro debe ser una sola línea. Puede agregar un carácter de nueva línea (`\n`) al final del formato de registro para incluir una nueva línea al final de cada entrada de registro.
+ `CSV` (valores separados por comas):

  ```
  $context.identity.sourceIp,$context.identity.caller, \
  $context.identity.user,$context.requestTime,$context.eventType, \
  $context.routeKey,$context.connectionId,$context.status, \
  $context.requestId
  ```

  Los caracteres de continuación (`\`) deben entenderse como una ayuda visual. El formato de registro debe ser una sola línea. Puede agregar un carácter de nueva línea (`\n`) al final del formato de registro para incluir una nueva línea al final de cada entrada de registro.