

# Monitorar as APIs de WebSocket no API Gateway
<a name="websocket-api-monitor"></a>

É possível usar métricas do CloudWatch e o CloudWatch Logs para monitorar APIs WebSocket. Combinando logs e métricas, você pode registrar erros em log e monitorar o desempenho da API.

**nota**  
O API Gateway pode não gerar logs e métricas nos seguintes casos:  
Erros 413 de entidade de solicitação muito grande
Erros 429 de muitas solicitações excessivos
Erros da série 400 de solicitações enviadas a um domínio personalizado que não tem mapeamento de API
Erros da série 500 causados por falhas internas

**Topics**
+ [

# Monitorar a execução de APIs de WebSocket com métricas do CloudWatch
](apigateway-websocket-api-logging.md)
+ [

# Configurar o registro em log para APIs de WebSocket no API Gateway
](websocket-api-logging.md)

# Monitorar a execução de APIs de WebSocket com métricas do CloudWatch
<a name="apigateway-websocket-api-logging"></a>

É possível usar as métricas do [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) para monitorar as APIs WebSocket. A configuração é semelhante à usada para APIs REST. Para obter mais informações, consulte [Monitorar a execução da API REST com métricas do Amazon CloudWatch](monitoring-cloudwatch.md).

As métricas a seguir são compatíveis com APIs WebSocket:


| Métrica | Descrição | 
| --- | --- | 
| ConnectCount | O número de mensagens enviadas à integração de rotas \$1connect. | 
| MessageCount | O número de mensagens enviadas à API WebSocket do cliente e vice-versa. | 
| IntegrationError | O número de solicitações que retornam uma resposta 4XX/5XX da integração. | 
| ClientError | O número de solicitações que têm uma resposta 4XX retornada pelo API Gateway antes de a integração ser invocada. | 
| ExecutionError | Erros que ocorreram durante a chamada da integração. | 
| IntegrationLatency | A diferença de hora entre o envio da solicitação para integração por parte do API Gateway e o recebimento da resposta da integração por parte do API Gateway. Supressão para retornos de chamada e integrações simuladas. | 

É possível usar as dimensões na tabela a seguir para filtrar métricas do API Gateway.


| Dimensão | Descrição | 
| --- | --- | 
| ApiId | Filtra as métricas do API Gateway para uma API com o ID de API especificado. | 
| ID da API, estágio | Filtra métricas do API Gateway para um estágio de API com o ID da API especificada e o ID do estágio. | 
| ApiId, método, recurso, estágio |  Filtra métricas do API Gateway para um método de API com o ID da API especificada, ID do estágio, caminho do recurso e ID da rota. O API Gateway não enviará essas métricas a menos que você tenha habilitado explicitamente métricas detalhadas do CloudWatch. Isso pode ser feito ao chamar a ação [UpdateStage](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis-apiid-stages-stagename.html) da API REST V2 do API Gateway para atualizar a propriedade `detailedMetricsEnabled` como `true`. Como alternativa, você pode chamar o comando [update-stage](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/update-stage.html) da AWS CLI para atualizar a propriedade `DetailedMetricsEnabled` para `true`. Permitir essas métricas incorrerá em cobranças adicionais na conta. Para obter informações de definição de preço, consulte [Definição de preço do Amazon CloudWatch](https://aws.amazon.com/cloudwatch/pricing/).  | 

# Configurar o registro em log para APIs de WebSocket no API Gateway
<a name="websocket-api-logging"></a>

É possível habilitar o registro em log para gravar logs no CloudWatch Logs. Há dois tipos de registro de API em logs no CloudWatch: registro de execução e de acesso. No registro de execução, o API Gateway gerencia o CloudWatch Logs. O processo inclui a criação de grupos de log e fluxos de log, além de relatórios aos fluxos de log sobre solicitações e respostas de qualquer autor da chamada. 

Para melhorar seu procedimento de segurança, recomendamos que você use o registro em log de execução no nível `ERROR` ou `INFO`. Você pode precisar fazer isso para cumprir vários requisitos de conformidade. Para ter mais informações, consulte [Amazon API Gateway controls](https://docs.aws.amazon.com/securityhub/latest/userguide/apigateway-controls.html) no *Guia do usuário do AWS Security Hub*.

No registro de acessos, você, assim como um desenvolvedor de API, registra quem acessou sua API e como o autor da chamada acessou a API. Você pode criar seu próprio grupo de logs ou escolher um existente que possa ser gerenciado pelo API Gateway. Para especificar os detalhes de acesso, selecione variáveis `$context` (expressas em um formato de sua escolha) e selecione um grupo de logs como o destino.

Para obter instruções sobre como configurar o registro em log do CloudWatch, consulte [Configurar o registro em log da API do CloudWatch usando o console do API Gateway](set-up-logging.md#set-up-access-logging-using-console).

Quando você especifica o **Formato de registro**, é possível escolher em quais variáveis de contexto se registrar. As seguintes variáveis são compatíveis.


| Parâmetro | Descrição | 
| --- | --- | 
| \$1context.apiId |  O identificador que o API Gateway atribui à sua API.  | 
| \$1context.authorize.error | A mensagem de erro de autorização. | 
| \$1context.authorize.latency | A latência de autorização em ms. | 
| \$1context.authorize.status | O código de status retornado de uma tentativa de autorização. | 
| \$1context.authorizer.error | A mensagem de erro retornada de um autorizador. | 
| \$1context.authorizer.integrationLatency | A latência do autorizador do Lambda em ms. | 
| \$1context.authorizer.integrationStatus | O código de status retornado de um autorizador do Lambda. | 
| \$1context.authorizer.latency | A latência de autorizador em ms. | 
| \$1context.authorizer.requestId | O ID da solicitação do endpoint da AWS. | 
| \$1context.authorizer.status | O código de status retornado de um autorizador. | 
| \$1context.authorizer.principalId |  A identificação do usuário principal associada ao token enviado pelo cliente e retornado de uma função do Lambda do autorizador do Lambda do API Gateway. (Anteriormente, um autorizador do Lambda era conhecido como um autorizador personalizado.)  | 
| \$1context.authorizer.property |  O valor transformado em string do par de chave/valor especificado do mapa `context` retornado de uma função de autorizador do Lambda do API Gateway. Por exemplo, se o autorizador retornar o seguinte mapa `context`:  <pre>"context" : {<br />                            "key": "value",<br />                            "numKey": 1,<br />                            "boolKey": true<br />                            }</pre> chamar `$context.authorizer.key` retornará a string `"value"`, chamar `$context.authorizer.numKey` retornará a string `"1"` e chamar `$context.authorizer.boolKey` retornará a string `"true"`.  | 
| \$1context.authenticate.error | A mensagem de erro retornada de uma tentativa de autenticação. | 
| \$1context.authenticate.latency | A latência de autenticação em ms. | 
| \$1context.authenticate.status | O código de status retornado de uma tentativa de autenticação. | 
| \$1context.connectedAt |  O tempo de conexão formatado em [Epoch](https://en.wikipedia.org/wiki/Unix_time).  | 
| \$1context.connectionId |  Um ID exclusivo para a conexão que pode ser utilizado para fazer uma chamada ao cliente.  | 
| \$1context.domainName |  Um nome de domínio para a API WebSocket. Pode ser usado para fazer um retorno de chamada ao cliente (em vez de um valor codificado).  | 
| \$1context.error.message |  Uma string que contém uma mensagem de erro do API Gateway.  | 
| \$1context.error.messageString | O valor citado de \$1context.error.message, ou seja, "\$1context.error.message". | 
| \$1context.error.responseType |  O tipo de resposta de erro.  | 
| \$1context.error.validationErrorString |  Uma string que contém uma mensagem de erro de validação detalhada.  | 
| \$1context.eventType |  O tipo de evento: `CONNECT`, `MESSAGE` ou `DISCONNECT`.  | 
| \$1context.extendedRequestId | Equivale a \$1context.requestId. | 
| \$1context.identity.accountId |  O ID da conta da AWS associado à solicitação.  | 
| \$1context.identity.apiKey |  A chave do proprietário da API associada à solicitação de API habilitada por chave.  | 
| \$1context.identity.apiKeyId | O ID da chave da API associada à solicitação de API habilitada por chave | 
| \$1context.identity.caller |  O identificador da entidade do autor da chamada que assinou a solicitação. Compatível com rotas que usam a autorização do IAM.  | 
| \$1context.identity.cognitoAuthenticationProvider |  Uma lista separada por vírgulas de todos os provedores de autenticação do Amazon Cognito usados pelo autor da chamada que faz a solicitação. Disponível somente se a solicitação foi assinada com credenciais do Amazon Cognito.  Por exemplo, para uma identidade de um grupo de usuários do Amazon Cognito, `cognito-idp. region.amazonaws.com/user_pool_id,cognito-idp.region.amazonaws.com/user_pool_id:CognitoSignIn:token subject claim` Consulte informações sobre os provedores de autenticação do Amazon Cognito disponível em [Using Federated Identities](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html) no *Guia do desenvolvedor do Amazon Cognito*. | 
| \$1context.identity.cognitoAuthenticationType |  O tipo de autenticação do Amazon Cognito do autor da chamada que faz a solicitação. Disponível somente se a solicitação foi assinada com credenciais do Amazon Cognito. Os valores possíveis incluem `authenticated` para identidades autenticadas e `unauthenticated` para identidades não autenticadas. | 
| \$1context.identity.cognitoIdentityId |  O ID de identidade do Amazon Cognito do autor da chamada que faz a solicitação. Disponível somente se a solicitação foi assinada com credenciais do Amazon Cognito.  | 
| \$1context.identity.cognitoIdentityPoolId |  O ID do grupo de identidades do Amazon Cognito do autor da chamada que faz a solicitação. Disponível somente se a solicitação foi assinada com credenciais do Amazon Cognito.  | 
| \$1context.identity.principalOrgId |  O [ID da organização da AWS](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_details.html). Compatível com rotas que usam a autorização do IAM.  | 
| \$1context.identity.sourceIp |  O endereço IP de origem da conexão TCP que está fazendo a solicitação para ao API Gateway.  | 
| \$1context.identity.user |  O identificador da entidade do usuário que será autorizado contra o acesso a recursos. Compatível com rotas que usam a autorização do IAM.  | 
| \$1context.identity.userAgent |  O agente de usuário do autor da chamada da API.  | 
| \$1context.identity.userArn |  O Nome do Recurso Amazon (ARN) do usuário efetivo identificado após a autenticação.  | 
| \$1context.integration.error | A mensagem de erro retornada de uma integração. | 
| \$1context.integration.integrationStatus | Para a integração de proxy do Lambda, o código de status retornado pelo AWS Lambda, e não pelo código de função do Lambda de backend. | 
| \$1context.integration.latency | A latência de integração em ms. Equivale a \$1context.integrationLatency. | 
| \$1context.integration.requestId | O ID da solicitação do endpoint da AWS. Equivale a \$1context.awsEndpointRequestId. | 
| \$1context.integration.status | O código de status retornado de uma integração. Para integrações de proxy do Lambda, esse é o código de status que seu código de função do Lambda retorna. Equivale a \$1context.integrationStatus. | 
| \$1context.integrationLatency | A latência de integração em ms, disponível somente para registro de log de acesso. | 
| \$1context.messageId |  Um ID exclusivo do servidor para uma mensagem. Disponível apenas quando o `$context.eventType` é `MESSAGE`.  | 
| \$1context.requestId |  Igual a `$context.extendedRequestId`.  | 
| \$1context.requestTime | O horário da solicitação [CLF](https://httpd.apache.org/docs/current/logs.html#common) formatado (dd/MMM/yyyy:HH:mm:ss \$1-hhmm). | 
| \$1context.requestTimeEpoch | O tempo de solicitação formatado em [Epoch](https://en.wikipedia.org/wiki/Unix_time), em milissegundos. | 
| \$1context.routeKey |  A chave de roteamento selecionada.  | 
| \$1context.stage |  O estágio de implantação da chamada da API (por exemplo, beta ou prod).  | 
| \$1context.status |  O status da resposta.  | 
| \$1context.waf.error | A mensagem de erro retornada pelo AWS WAF. | 
| \$1context.waf.latency | A latência do AWS WAF em ms. | 
| \$1context.waf.status | O código de status retornado pelo AWS WAF. | 

Exemplos de alguns formatos de log de acesso comumente usados são mostrados no console do API Gateway e estão listados a seguir.
+ `CLF` ([Formato de log comum](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
  ```

  Os caracteres de continuação (`\`) têm o objetivo de ajuda visual. O formato do log deve ser uma única linha. É possível adicionar um caractere de nova linha (`\n`) no final do formato de log para incluir uma nova linha no final de cada entrada de log.
+  `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"
  }
  ```

  Os caracteres de continuação (`\`) têm o objetivo de ajuda visual. O formato do log deve ser uma única linha. É possível adicionar um caractere de nova linha (`\n`) no final do formato de log para incluir uma nova linha no final de cada entrada de log.
+ `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>
  ```

  Os caracteres de continuação (`\`) têm o objetivo de ajuda visual. O formato do log deve ser uma única linha. É possível adicionar um caractere de nova linha (`\n`) no final do formato de log para incluir uma nova linha no final de cada entrada de log.
+ `CSV` (valores separados por vírgula):

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

  Os caracteres de continuação (`\`) têm o objetivo de ajuda visual. O formato do log deve ser uma única linha. É possível adicionar um caractere de nova linha (`\n`) no final do formato de log para incluir uma nova linha no final de cada entrada de log.