Uso do CloudWatch para monitorar e registrar dados da API GraphQL - AWS AppSync GraphQL

Uso do CloudWatch para monitorar e registrar dados da API GraphQL

Você pode registrar e depurar sua API GraphQL usando métricas e logs do CloudWatch. Essas ferramentas permitem que os desenvolvedores monitorem o desempenho, solucionem problemas e otimizem suas operações do GraphQL de forma eficaz.

Métricas do CloudWatch é uma ferramenta que fornece uma ampla variedade de métricas para monitorar o desempenho e o uso da API. Essas métricas são classificadas em categorias principais:

  1. Métricas gerais de API: incluem 4XXError e 5XXError para rastrear erros do cliente e do servidor, Latency para medir os tempos de resposta, Requests para monitorar o total de chamadas de API e TokensConsumed para rastrear o uso de recursos.

  2. Métricas de assinatura em tempo real: essas métricas se concentram nas conexões WebSocket e nas atividades de assinatura. Elas incluem métricas para solicitações de conexão, conexões bem-sucedidas, registros de assinaturas, publicação de mensagens e conexões e assinaturas ativas.

O guia também apresenta as métricas aprimoradas, que oferecem dados mais granulares sobre desempenho do resolvedor, interações com fontes de dados e operações individuais do GraphQL. Essas métricas fornecem insights mais profundos, mas têm custos adicionais.

CloudWatch Logs é uma ferramenta que habilita recursos de log para suas APIs GraphQL. Os logs podem ser definidos em dois níveis da API:

  1. Logs em nível de solicitação: capturam informações gerais da solicitação, incluindo cabeçalhos HTTP, consultas GraphQL, resumos de operações e registros de assinaturas.

  2. Logs em nível de campo: fornecem informações detalhadas sobre resoluções de campo individuais, incluindo mapeamentos de solicitações e respostas e informações de rastreamento para cada campo.

Você pode configurar o log, interpretar as entradas e usar os dados do log para solução de problemas e otimização. O AWS AppSync fornece vários tipos de log que revelam os dados de execução, análise, validação e resolução de campo da consulta.

Definição e configuração

Para ativar o registro automático em uma API GraphQL, use o console do AWS AppSync.

  1. Faça login no Console de gerenciamento da AWS e abra o console do AppSync.

  2. Na página APIs, escolha o nome de uma API GraphQL.

  3. Na página inicial da sua API, no painel de navegação, selecione Configurações.

  4. Em Registro em log, faça o seguinte:

    1. Ative a opção Ativar logs.

    2. Para obter um registro em log detalhado no nível da solicitação, marque a caixa de seleção em Incluir conteúdo detalhado. (opcional)

    3. Em Nível de log do resolvedor de campo, escolha o nível de registro em log no nível do campo preferido (Nenhum, Erro, Informações, Depuração ou Todos). (opcional)

    4. Em Criar ou usar um perfil existente, selecione Novo perfil para criar um novo AWS Identity and Access Management (IAM) que permita ao AWS AppSync gravar logs no CloudWatch. Você também pode selecionar Perfil existente para selecionar o nome do recurso da Amazon (ARN) de um perfil do IAM existente em sua conta da AWS.

  5. Selecione Salvar.

Configuração de perfil do IAM manual

Se você optar por usar um perfil do IAM existente, a função deverá conceder ao AWS AppSync as permissões necessárias para gravar logs no CloudWatch. Para configurar isso, é necessário fornecer um ARN do perfil de serviço para que o AWS AppSync possa assumir esse perfil ao gravar os logs.

No console do IAM, crie uma nova política com o nome AWSAppSyncPushToCloudWatchLogsPolicy que tenha a seguinte definição:

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ] }

Em seguida, crie um novo perfil com o nome AWSAppSyncPushToCloudWatchLogsRole e anexe a política acima para essa função. Edite a relação de confiança desse perfil da seguinte forma:

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "appsync.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

Copie o ARN do perfil e use-o ao configurar o registro em uma API GraphQL do AWS AppSync.

métricas do CloudWatch

Você pode usar as métricas do CloudWatch para monitorar e fornecer alertas sobre eventos específicos que podem resultar em códigos de status HTTP ou em latência. As seguintes métricas são emitidas:

4XXError

Erros resultantes de solicitações que não são válidas devido a uma configuração incorreta do cliente. Normalmente, esses erros acontecem em qualquer lugar fora do processamento do GraphQL. Por exemplo, esses erros podem ocorrer quando a solicitação inclui uma carga JSON incorreta ou uma consulta incorreta, quando o serviço passa por controle de utilização ou quando as configurações de autenticação estão definidas incorretamente.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências desses erros.

5XXError

Erros encontrados durante a execução de uma consulta do GraphQL. Por exemplo, isso pode ocorrer ao invocar uma consulta para um esquema vazio ou incorreto. Também pode ocorrer quando o ID do grupo de usuários do Amazon Cognito ou a região da AWS são inválidos. Isso também pode acontecer se o AWS AppSync encontrar um problema durante o processamento de uma solicitação.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências desses erros.

Latency

O tempo desde quando o AWS AppSync recebe uma solicitação de um cliente e retorna uma resposta para o cliente. Isso não inclui a latência da rede encontrada para que uma resposta alcance os dispositivos finais.

Unidade: milissegundo. Use a estatística Média para avaliar as latências esperadas.

Requests

O número de solicitações (consultas + mutações) que todas as APIs da sua conta processaram, por região.

Unidade: Contagem. O número de todas as solicitações processadas em uma região específica.

TokensConsumed

Os tokens são alocados para Requests com base na quantidade de recursos (tempo de processamento e memória usada) que uma Request consome. Normalmente, cada Request consome um token. No entanto, tokens adicionais são alocados a uma Request que consome grandes quantidades de recursos, conforme necessário.

Unidade: Contagem. O número de todos os tokens alocados em uma região específica.

NetworkBandwidthOutAllowanceExceeded
nota

No console do AWS AppSync, na página de configurações de cache, a opção Métricas de integridade do cache permite que você habilite essa métrica de integridade relacionada ao cache.

Os pacotes de rede foram descartados porque o throughput excedeu o limite de largura de banda agregada. Isso é útil para diagnosticar gargalos em uma configuração de cache. Os dados são registrados para uma API em particular especificando o API_Id na métrica appsyncCacheNetworkBandwidthOutAllowanceExceeded.

Unidade: Contagem. O número de pacotes descartados após exceder o limite de largura de banda de uma API especificada pelo ID.

EngineCPUUtilization
nota

No console do AWS AppSync, na página de configurações de cache, a opção Métricas de integridade do cache permite que você habilite essa métrica de integridade relacionada ao cache.

A utilização da CPU (porcentagem) alocada para o processo do Redis OSS. Isso é útil para diagnosticar gargalos em uma configuração de cache. Os dados são registrados para uma API em particular especificando o API_Id na métrica appsyncCacheEngineCPUUtilization.

Unidade: porcentagem. A porcentagem de CPU atualmente em uso pelo processo do Redis OSS para uma API especificada por ID.

Assinaturas em tempo real

Todas as métricas são emitidas em uma dimensão: GraphQLAPIId. Isso significa que todas as métricas são acopladas com IDs de API do GraphQL. As seguintes métricas estão relacionadas às assinaturas do GraphQL em WebSockets puros:

ConnectRequests

O número de solicitações de conexão do WebSocket feitas ao AWS AppSync, incluindo tentativas bem-sucedidas e malsucedidas.

Unidade: Contagem. Use a estatística de soma para mostrar o número total de solicitações de conexão.

ConnectSuccess

O número de conexões bem-sucedidas do WebSocket com o AWS AppSync. É possível ter conexões sem assinaturas.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências das conexões bem-sucedidas.

ConnectClientError

O número de conexões do WebSocket que foram rejeitadas pelo AWS AppSync devido a erros no lado do cliente. Isso pode significar que o serviço está passando por controle de utilização ou que as configurações de autorização estão incorretas.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências dos erros de conexão no lado do cliente.

ConnectServerError

O número de erros originados do AWS AppSync ao processar conexões. Isso geralmente acontece quando ocorre um problema inesperado no lado do servidor.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências dos erros de conexão no lado do servidor.

DisconnectSuccess

O número de desconexões bem-sucedidas do WebSocket com o AWS AppSync.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências das desconexões bem-sucedidas.

DisconnectClientError

O número de erros de cliente originados do AWS AppSync ao desconectar conexões do WebSocket.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências de erros de desconexão.

DisconnectServerError

O número de erros de servidor originados do AWS AppSync ao desconectar conexões do WebSocket.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências de erros de desconexão.

SubscribeSuccess

O número de assinaturas que foram registradas com êxito no AWS AppSync pelo WebSocket. É possível ter conexões sem assinaturas, mas não é possível ter assinaturas sem conexões.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências de assinaturas bem-sucedidas.

SubscribeClientError

O número de assinaturas que foram rejeitadas pelo AWS AppSync devido a erros no lado do cliente. Isso pode ocorrer quando uma carga JSON está incorreta, o serviço é limitado ou as configurações de autorização estão incorretas.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências de erros de assinatura no lado do cliente.

SubscribeServerError

O número de erros originados do AWS AppSync ao processar assinaturas. Isso geralmente acontece quando ocorre um problema inesperado no lado do servidor.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências de erros de assinatura no lado do servidor.

UnsubscribeSuccess

O número de solicitações de cancelamento da assinatura que foram processadas com êxito.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências das solicitações de cancelamento de assinatura bem-sucedidas.

UnsubscribeClientError

O número de solicitações de cancelamento de assinatura que foram rejeitadas pelo AWS AppSync devido a erros no lado do cliente.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências de erros de solicitação de cancelamento de assinatura no lado do cliente.

UnsubscribeServerError

O número de erros originados do AWS AppSync ao processar solicitações de cancelamento de assinatura. Isso geralmente acontece quando ocorre um problema inesperado no lado do servidor.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências de erros de solicitação de cancelamento de assinatura no lado do servidor.

PublishDataMessageSuccess

O número de mensagens de evento de assinatura que foram publicadas com êxito.

Unidade: Contagem. Use a estatística Soma para obter o total das mensagens de evento de assinatura publicadas com êxito.

PublishDataMessageClientError

O número de mensagens de evento de assinatura que apresentaram falha na publicação devido a erros no lado do cliente.

Unit: Contagem. Use a estatística Soma para obter o total de ocorrências de erros de eventos de publicação de assinatura no lado do cliente.

PublishDataMessageServerError

O número de erros originados do AWS AppSync ao publicar mensagens de evento de assinatura. Isso geralmente acontece quando ocorre um problema inesperado no lado do servidor.

Unidade: Contagem. Use a estatística Soma para obter o total de ocorrências de erros de eventos de publicação de assinatura no lado do servidor.

PublishDataMessageSize

O tamanho das mensagens de evento de assinatura publicadas.

Unidade: Bytes.

ActiveConnections

O número de conexões do WebSocket simultâneas de clientes para o AWS AppSync em um minuto.

Unidade: Contagem. Use a estatística Soma para obter o total de conexões abertas.

ActiveSubscriptions

O número de assinaturas simultâneas de clientes em um minuto.

Unidade: Contagem. Use a estatística Soma para obter o total de assinaturas ativas.

ConnectionDuration

A quantidade de tempo em que a conexão permanece aberta.

Unidade: Milissegundos. Use a estatística Média para avaliar a duração da conexão.

OutboundMessages

O número de mensagens medidas publicadas com sucesso. Uma mensagem medida equivale a 5 kB de dados entregues.

Unidade: Contagem. Use a estatística de soma para mostrar o número total de mensagens medidas publicadas.

InboundMessageSuccess

O número de mensagens de entrada processadas com êxito. Cada tipo de assinatura invocado por uma mutação gera uma mensagem de entrada.

Unidade: Contagem. Use a estatística de soma para mostrar o número total de mensagens de entrada processadas.

InboundMessageError

O número de mensagens de entrada que falharam no processamento devido a solicitações de API inválidas, como exceder o limite de tamanho da carga útil da assinatura de 240 kB.

Unidade: Contagem. Use a estatística de soma para mostrar o número total de mensagens de entrada com falhas de processamento relacionadas a API.

InboundMessageFailure

O número de mensagens de entrada que falharam no processamento devido a erros do AWS AppSync.

Unidade: Contagem. Use a estatística de soma para mostrar o número total de mensagens de entrada com falhas de processamento relacionadas ao AWS AppSync.

InboundMessageDelayed

O número de mensagens de entrada atrasadas. As mensagens de entrada podem ser atrasadas quando a cota da taxa de mensagens de entrada ou a cota da taxa de mensagens de saída é violada.

Unidade: Contagem. Use a estatística Sum para obter o número total de mensagens de entrada que atrasaram.

InboundMessageDropped

O número de mensagens de entrada descartadas. As mensagens de entrada podem ser descartadas quando a cota da taxa de mensagens de entrada ou a cota da taxa de mensagens de saída é violada.

Unidade: Contagem. Use a estatística Sum para obter o número total de mensagens de entrada que foram descartadas.

InvalidationSuccess

O número de assinaturas invalidadas com sucesso (assinatura cancelada) por uma mutação com $extensions.invalidateSubscriptions().

Unidade: Contagem. Use a estatística Soma para recuperar o número total de assinaturas que foram canceladas com sucesso.

InvalidationRequestSuccess

O número de solicitações de invalidação processadas com êxito.

Unidade: Contagem. Use a estatística de soma para mostrar o número total de solicitações de invalidação processadas.

InvalidationRequestError

O número de solicitações de invalidação que falharam no processamento devido a solicitações de API inválidas.

Unidade: Contagem. Use a estatística de soma para mostrar o número total de solicitações de invalidação com falhas de processamento relacionadas a API.

InvalidationRequestFailure

O número de solicitações de invalidação que falharam no processamento devido a erros do AWS AppSync.

Unidade: Contagem. Use a estatística de soma para mostrar o número total de solicitações de invalidação com falhas de processamento relacionadas ao AWS AppSync.

InvalidationRequestDropped

O número de solicitações de invalidação perdidas quando a cota da solicitação de invalidação foi excedida.

Unidade: Contagem. Use a estatística de soma para mostrar o número total de solicitações de invalidação reduzidas.

Comparar mensagens de entrada e de saída

Quando uma mutação é executada, os campos de assinatura com a diretiva @aws_subscribe para essa mutação são invocados. Cada invocação de assinatura gera uma mensagem de entrada. Por exemplo, se dois campos de assinatura especificarem a mesma mutação em @aws_subscribe, duas mensagens de entrada serão geradas quando essa mutação for chamada.

Uma mensagem de saída equivale a 5 kB de dados entregues aos clientes do WebSocket. Por exemplo, enviar 15 kB de dados para 10 clientes gera 30 mensagens de saída (15 kB * 10 clientes/5 kB por mensagem = 30 mensagens).

É possível solicitar aumentos de cota para mensagens de entrada ou de saída. Para obter mais informações, consulte Endpoints e cotas do AWS AppSync no guia Referência geral da AWS e as instruções de Solicitação de aumento de cota no Guia do usuário sobre Service Quotas.

Métricas aprimoradas

As métricas aprimoradas emitem dados granulares sobre o uso e o desempenho da API, como contagens de solicitações e erros do AWS AppSync, latência e acertos/erros do cache. Todos os dados de métricas aprimoradas são enviados para sua conta do CloudWatch, e você pode configurar os tipos de dados que serão enviados.

nota

Cobranças adicionais são aplicadas ao usar métricas aprimoradas. Para obter mais informações, consulte os níveis de preços de monitoramento detalhado em Definição de preço do Amazon CloudWatch.

Essas métricas podem ser encontradas em várias páginas de configurações no console do AWS AppSync. Na página de configurações da API, a seção Métricas aprimoradas permite ativar ou desativar os seguintes itens:

Comportamento das métricas de resolvedores: essas opções controlam como métricas adicionais para resolvedores são coletadas. Você pode optar por ativar as métricas de resolvedores de solicitações completas (métricas ativadas para todos os resolvedores de solicitações) ou métricas para cada resolvedor (métricas ativadas somente para resolvedores em que a configuração está definida como ativada). As seguintes opções estão disponíveis:

GraphQL errors per resolver (GraphQLError)

O número de erros do GraphQL que ocorreram por resolvedor.

Dimensão da métrica: API_Id, Resolver

Unidade: Contagem.

Requests per resolver (Request)

O número de invocações que ocorreram durante uma solicitação. Isso é registrado por resolvedor.

Dimensão da métrica: API_Id, Resolver

Unidade: Contagem.

Latency per resolver (Latency)

O tempo para concluir uma invocação do resolvedor. A latência é medida em milissegundos e registrada por resolvedor.

Dimensão da métrica: API_Id, Resolver

Unidade: milissegundo.

Cache hits per resolver (CacheHit)

O número de acertos do cache durante uma solicitação. Isso só será emitido se um cache for usado. Os acertos ao cache são registrados por resolvedor.

Dimensão da métrica: API_Id, Resolver

Unidade: Contagem.

Cache misses per resolver (CacheMiss)

O número de erros do cache durante uma solicitação. Isso só será emitido se um cache for usado. Os erros do cache são registrados por resolvedor.

Dimensão da métrica: API_Id, Resolver

Unidade: Contagem.

Comportamento das métricas de fontes de dados: essas opções controlam como métricas adicionais para fontes de dados são coletadas. Você pode optar por ativar as métricas de fontes de dados de solicitações completas (métricas ativadas para todas as fontes de dados de solicitações) ou as métricas para cada fonte de dados (métricas ativadas somente para as fontes de dados em que a configuração está definida como ativada). As seguintes opções estão disponíveis:

Requests per data source (Request)

O número de invocações que ocorreram durante uma solicitação. As solicitações são registradas por fonte de dados. Se as solicitações completas estiverem ativadas, cada fonte de dados terá sua própria entrada no CloudWatch.

Dimensão da métrica: API_Id, Datasource

Unidade: Contagem.

Latency per data source (Latency)

O tempo para concluir uma invocação de fonte de dados. A latência é registrada por fonte de dados.

Dimensão da métrica: API_Id, Datasource

Unidade: milissegundo.

Errors per data source (GraphQLError)

O número de erros que ocorreram durante uma invocação de fonte de dados.

Dimensão da métrica: API_Id, Datasource

Unidade: Contagem.

Métricas de operação: ativa métricas em nível operacional do GraphQL.

Requests per operation (Request)

O número de vezes que uma operação especificada do GraphQL foi chamada.

Dimensão da métrica: API_Id, Operation

Unidade: Contagem.

GraphQL errors per operation (GraphQLError)

O número de erros do GraphQL que ocorreram durante uma operação especificada do GraphQL.

Dimensão da métrica: API_Id, Operation

Unidade: Contagem.

CloudWatch logs

Você pode configurar dois tipos de registro em log em qualquer API GraphQL nova ou existente: nível de solicitação e nível de campo.

Logs a nível de solicitação

Quando o registro em log a nível de solicitação (Incluir conteúdo detalhado) é configurado, as seguintes informações são registradas em log:

  • O número de tokens consumidos

  • Os cabeçalhos HTTP da solicitação e resposta

  • A consulta do GraphQL que está sendo executada na solicitação

  • O resumo geral da operação

  • Assinaturas do GraphQL novas e existentes registradas

Logs a nível de campo

Quando o registro log a nível de campo é configurado, as seguintes informações são registradas em log:

  • Mapeamento de solicitação gerado com origem e argumentos para cada campo

  • O Mapeamento da resposta transformado para cada campo, que inclui os dados como resultado da resolução desse campo

  • Informações de rastreamento para cada campo

Se você ativar o registro, o AWS AppSync 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 com esses logs.

Ao ativar o registro em log em uma API GraphQL e fazer solicitações, o AWS AppSync cria um grupo de logs e registra os fluxos no grupo de logs. O grupo de logs é chamado seguindo o formato /aws/appsync/apis/{graphql_api_id}. Dentro de cada grupo de logs, os logs são subdivididos em fluxos de log. Esses são ordenados por Hora do último evento conforme os dados registrados em log são reportados.

Cada evento de log é marcado com o x-amzn-RequestId dessa solicitação. Isso ajuda você a filtrar os eventos de log no CloudWatch para obter todas as informações registradas em log relativas a essa solicitação. Você pode obter o RequestId dos cabeçalhos da resposta de cada solicitação do AWS AppSync do GraphQL.

O registro em log a nível de campo é configurado com os seguintes níveis de log:

  • Nenhum: nenhum log no nível do campo é capturado.

  • Erro: registra em log as seguintes informações apenas para os campos que estejam na categoria de erro:
    • A seção de erro na resposta do servidor

    • Os erros a nível de campo

    • As funções de solicitação/resposta geradas que foram resolvidas para campos de erro

  • Informações: registra em log as seguintes informações apenas para os campos que estejam nas categorias de informações e erro:
    • Mensagens no nível de informações

    • As mensagens do usuário enviadas por meio de $util.log.info e console.log

    • Os logs de rastreamento e mapeamento no nível do campo não são mostrados.

    • Se o registro em log no nível do campo estiver definido como INFO ou superior com conteúdo detalhado incluído, AWS AppSync adicionará as mensagens de registro em log do modelo de mapeamento transformado. Isso conterá todas as informações adicionadas ao modelo de mapeamento transformado, ou à saída do resolvedor ou ao código JavaScript executado pela função, e não deverá ser usado se você estiver planejando enviar informações confidenciais, como senhas ou cabeçalhos de autorização, para fontes de dados posteriores e não quiser essas informações nos logs.

  • Depuração: registra em log as seguintes informações apenas para os campos que estejam nas categorias de depuração, informações e erro:
    • Mensagens no nível de depuração

    • As mensagens do usuário enviadas por meio de $util.log.info, $util.log.debug, console.log e console.debug

    • Os logs de rastreamento e mapeamento no nível do campo não são mostrados.

  • Todos – As informações a seguir são registradas em log para todos os campos na consulta:
    • Informações de rastreamento a nível de campo

    • As funções de solicitação/resposta geradas que foram resolvidas para cada campo

Benefícios do monitoramento

É possível usar o registro em log e as métricas para identificar, solucionar problemas e otimizar as consultas do GraphQL. Por exemplo, isso ajudará a depurar problemas de latência usando as informações de rastreamento registradas em log para cada campo na consulta. Para demonstrar isso, suponha que você está usando um ou mais resolvedores aninhados em uma consulta do GraphQL. Um exemplo de operação de campo no CloudWatch Logs pode ser semelhante ao seguinte:

{ "path": [ "singlePost", "authors", 0, "name" ], "parentType": "Post", "returnType": "String!", "fieldName": "name", "startOffset": 416563350, "duration": 11247 }

Isso pode corresponder a um esquema do GraphQL, semelhante ao seguinte:

type Post { id: ID! name: String! authors: [Author] } type Author { id: ID! name: String! } type Query { singlePost(id:ID!): Post }

Nos resultados do log acima, o path mostra um único item nos dados retornados da execução de uma consulta chamada singlePost(). Nesse exemplo, ele representa o campo nome no primeiro índice (0). O startOffset fornece um desvio do início da operação da consulta do GraphQL. A duração é o tempo total para resolver o campo. Esses valores podem ser úteis para entender por que os dados de uma fonte de dados particular podem estar com execução mais lenta que o esperado, ou se um campo específico está atrasando toda a consulta. Por exemplo, é possível aumentar um throughput provisionado para uma tabela do Amazon DynamoDB ou remover um campo específico de uma consulta que está fazendo com que a execução global tenha um desempenho insatisfatório.

A partir de 8 de maio de 2019, o AWS AppSync gera eventos de log como JSON totalmente estruturado. Isso pode ajudar você a usar serviços de análise de log, como o CloudWatch Logs Insights e o Amazon OpenSearch Service, para compreender o desempenho das solicitações do GraphQL e as características de uso dos campos de esquema. Por exemplo, é possível identificar facilmente resolvedores com grandes latências que podem ser a causa raiz de um problema de desempenho. Também é possível identificar os campos mais e menos usados no esquema e avaliar o impacto de desativar campos do GraphQL.

Detecção de conflitos e registro em log de sincronização

Se uma API do AWS AppSync tiver o registro em log no CloudWatch Logs configurado com o Nível de log do resolvedor de campo definido como Tudo, o AWS AppSync emitirá informações de detecção e resolução de conflitos para o grupo de logs. Isso fornece um insight granular de como a API do AWS AppSync respondeu a um conflito. Para ajudar você a interpretar a resposta, as seguintes informações são fornecidas nos logs:

conflictType

Detalhes em caso de conflito devido a uma incompatibilidade de versão ou à condição fornecida pelo cliente.

conflictHandlerConfigured

Afirma o handler de conflitos configurado no resolvedor no momento da solicitação.

message

Fornece informações sobre como o conflito foi detectado e resolvido.

syncAttempt

O número de tentativas do servidor de sincronizar os dados antes de finalmente rejeitar a solicitação.

data

Se o handler de conflitos configurado foi Automerge, esse campo será preenchido de modo a mostrar a decisão que o Automerge tomou para cada campo. As ações fornecidas podem ser:

  • REJEITADO - Quando o Automerge rejeita o valor do campo de entrada em função do valor no servidor.

  • ADICIONADO - Quando o Automerge adicionada o campo recebido devido a não haver valor preexistente no servidor.

  • ANEXADO - Quando o Automerge anexa os valores de entrada aos valores da Lista que existe no servidor.

  • MESCLADO - Quando o Automerge mescla os valores de entrada aos valores do Conjunto que existe no servidor.

Usar contagens de tokens para otimizar suas solicitações

As solicitações que consomem menos ou igual a 1.500 KB por segundo de memória e tempo de vCPU recebem um token. As solicitações com consumo de recursos superior a 1.500 KB por segundo recebem tokens adicionais. Por exemplo, se uma solicitação consumir 3.350 KB por segundo, o AWS AppSync aloca três tokens (arredondados para o próximo valor inteiro) à solicitação. Por padrão, o AWS AppSync aloca no máximo 5.000 ou 10.000 tokens de solicitação por segundo para as APIs da sua conta, dependendo da região da AWS em que é exibida. Se cada uma das suas APIs usar uma média de dois tokens por segundo, você terá o limite de 2.500 ou 5.000 solicitações por segundo, respectivamente. Se você precisar de mais tokens por segundo do que o valor alocado, poderá enviar uma solicitação para aumentar a cota padrão da taxa de tokens de solicitação. Para obter mais informações, consulte Endpoints e cotas do AWS AppSync Guia do Referência geral da AWS e Solicitar um aumento da cota no Guia do usuário do Service Quotas.

Uma alta contagem de tokens por solicitação pode indicar que há uma oportunidade de otimizar suas solicitações e melhorar o desempenho da sua API. Os fatores que podem aumentar sua contagem de tokens por solicitação incluem:

  • O tamanho e a complexidade do seu esquema GraphQL.

  • A complexidade dos modelos de mapeamento de solicitações e respostas.

  • O número de invocações do resolvedor por solicitação.

  • A quantidade de dados retornados pelos resolvedores.

  • A latência das fontes de dados downstream.

  • Projetos de esquemas e consultas que exigem chamadas sucessivas à fonte de dados (em oposição às chamadas paralelas ou em lote).

  • Configuração de logs, particularmente conteúdo de log detalhado e em nível de campo.

nota

Além das métricas e logs do AWS AppSync, os clientes podem acessar o número de tokens consumidos em uma solicitação por meio do cabeçalho de resposta x-amzn-appsync-TokensConsumed.

Limites de tamanho de log

Por padrão, se o registro em log estiver ativado, o AWS AppSync enviará até 1 MB de logs por solicitação. Logs que excederem esse tamanho serão truncados. Para reduzir tamanhos de log, escolha o nível de registro em log de ERROR para logs em nível de campo e desative o registro em log de VERBOSE, ou desative totalmente os logs em nível de campo se não forem necessários. Como alternativa ao nível de log de ALL, você pode usar métricas aprimoradas para obter métricas de resolvedores, fontes de dados ou operações do GraphQL específicos, ou usar os utilitários de registro em log fornecidos pelo AppSync para registrar somente as informações necessárias.

Referência de tipo de log

RequestSummary

  • requestId: identificador exclusivo da solicitação.

  • graphQLAPIId: ID da API GraphQL que está fazendo a solicitação.

  • statusCode: resposta do código de status HTTP.

  • latency: latência de ponta a ponta da solicitação, em nanossegundos, como um número inteiro.

{ "logType": "RequestSummary", "requestId": "dbe87af3-c114-4b32-ae79-8af11f3f96f1", "graphQLAPIId": "pmo28inf75eepg63qxq4ekoeg4", "statusCode": 200, "latency": 242000000 }

ExecutionSummary

  • requestId: identificador exclusivo da solicitação.

  • graphQLAPIId: ID da API GraphQL que está fazendo a solicitação.

  • startTime: o timestamp de início do processamento do GraphQL para a solicitação, no formato RFC 3339.

  • endTime: o timestamp de término do processamento do GraphQL para a solicitação, no formato RFC 3339.

  • duration: o tempo total do processamento do GraphQL, em nanossegundos, como um valor inteiro.

  • version: a versão do esquema do ExecutionSummary.

  • parsing:
    • startOffset: o deslocamento inicial para análise, em nanossegundos, em relação ao início da invocação, como um valor inteiro.

    • duration: o tempo gasto na análise, em nanossegundos, como um valor inteiro.

  • validation:
    • startOffset: o deslocamento inicial para validação, em nanossegundos, em relação ao início da invocação, como um valor inteiro.

    • duration: o tempo gasto na execução da validação, em nanossegundos, como um valor inteiro.

{ "duration": 217406145, "logType": "ExecutionSummary", "requestId": "dbe87af3-c114-4b32-ae79-8af11f3f96f1", "startTime": "2019-01-01T06:06:18.956Z", "endTime": "2019-01-01T06:06:19.174Z", "parsing": { "startOffset": 49033, "duration": 34784 }, "version": 1, "validation": { "startOffset": 129048, "duration": 69126 }, "graphQLAPIId": "pmo28inf75eepg63qxq4ekoeg4" }

Rastreamento

  • requestId: identificador exclusivo da solicitação.

  • graphQLAPIId: ID da API GraphQL que está fazendo a solicitação.

  • startOffset: o deslocamento inicial para a resolução do campo, em nanossegundos, em relação ao início da invocação, como um valor inteiro.

  • duration: o tempo gasto na resolução do campo, em nanossegundos, como um valor inteiro.

  • fieldName: o nome do campo que está sendo resolvido.

  • parentType: o tipo pai do campo que está sendo resolvido.

  • returnType: o tipo de retorno do campo que está sendo resolvido.

  • path: uma lista de segmentos de caminho, começando pela raiz da resposta e terminando com o campo que está sendo resolvido.

  • resolverArn: o ARN do resolvedor usado para resolução do campo. Pode não estar presente em campos aninhados.

{ "duration": 216820346, "logType": "Tracing", "path": [ "putItem" ], "fieldName": "putItem", "startOffset": 178156, "resolverArn": "arn:aws:appsync:us-east-1:111111111111:apis/pmo28inf75eepg63qxq4ekoeg4/types/Mutation/fields/putItem", "requestId": "dbe87af3-c114-4b32-ae79-8af11f3f96f1", "parentType": "Mutation", "returnType": "Item", "graphQLAPIId": "pmo28inf75eepg63qxq4ekoeg4" }

Analisar logs com o CloudWatch Logs Insights

Veja a seguir exemplos de consultas que você pode executar para obter insights práticos sobre o desempenho e a integridade das operações do GraphQL. Esses exemplos estão disponíveis como consultas de exemplo no console do CloudWatch Logs Insights. No console do CloudWatch, escolha Logs Insights, selecione o grupo de logs do AWS AppSync para sua API GraphQL e escolha consultas do AWS AppSync em Consultas de exemplo.

A consulta a seguir retorna as 10 principais solicitações do GraphQL com o máximo de tokens consumidos:

filter @message like "Tokens Consumed" | parse @message "* Tokens Consumed: *" as requestId, tokens | sort tokens desc | display requestId, tokens | limit 10

A consulta a seguir retorna os 10 principais resolvedores com latência máxima:

fields resolverArn, duration | filter logType = "Tracing" | limit 10 | sort duration desc

A consulta a seguir retorna os resolvedores invocados com mais frequência:

fields ispresent(resolverArn) as isRes | stats count() as invocationCount by resolverArn | filter isRes and logType = "Tracing" | limit 10 | sort invocationCount desc

A consulta a seguir retorna resolvedores com a maioria dos erros em modelos de mapeamento:

fields ispresent(resolverArn) as isRes | stats count() as errorCount by resolverArn, logType | filter isRes and (logType = "RequestMapping" or logType = "ResponseMapping") and fieldInError | limit 10 | sort errorCount desc

A consulta a seguir retorna estatísticas de latência do resolvedor:

fields ispresent(resolverArn) as isRes | stats min(duration), max(duration), avg(duration) as avg_dur by resolverArn | filter isRes and logType = "Tracing" | limit 10 | sort avg_dur desc

A consulta a seguir retorna estatísticas de latência de campo:

stats min(duration), max(duration), avg(duration) as avg_dur by concat(parentType, '/', fieldName) as fieldKey | filter logType = "Tracing" | limit 10 | sort avg_dur desc

Os resultados das consultas do CloudWatch Logs Insights podem ser exportados para painéis do CloudWatch.

Analisar seus registros com o OpenSearch Service

É possível pesquisar, analisar e visualizar seus logs do AWS AppSync com o Amazon OpenSearch Service para identificar gargalos de desempenho e as causas raiz de problemas operacionais. É possível identificar resolvedores com a latência máxima e os erros. Além disso, você pode usar Painéis do OpenSearch para criar painéis com visualizações avançadas. Os Painéis do OpenSearch é uma ferramenta de visualização e exploração de dados de código aberto disponível no OpenSearch Service. Com os Painéis do OpenSearch, é possível monitorar continuamente o desempenho e a integridade das operações do GraphQL. Por exemplo, você pode criar painéis para visualizar a latência P90 das solicitações do GraphQL e analisar as latências P90 de cada resolvedor.

Ao usar o OpenSearch Service, use “cwl*” como padrão de filtro para pesquisar índices do OpenSearch. O OpenSearch Service indexa os logs transmitidos do CloudWatch Logs com um prefixo "cwl-". Para diferenciar logs da API do AWS AppSync de outros logs do CloudWatch enviados para o OpenSearch Service, recomendamos adicionar uma expressão de filtro adicional de graphQLAPIID.keyword=YourGraphQLAPIID à sua pesquisa.

Migração do formato de log

Os eventos de log gerados pelo AWS AppSync em 8 de maio de 2019 ou posterior são formatados como JSON totalmente estruturado. Para analisar solicitações do GraphQL antes de 8 de maio de 2019, poderá migrar logs mais antigos para JSON totalmente estruturado usando um script disponível no Exemplo do GitHub. Se for necessário usar o formato de log antes de 8 de maio de 2019, crie um tíquete de suporte com as seguintes configurações: defina Tipo como Gerenciamento de contas e, depois, defina Categoria como Pergunta geral sobre a conta.

Você também pode usar filtros de métrica no CloudWatch para transformar os dados de log em métricas numéricas do CloudWatch, que podem ser usadas para criar um gráfico ou definir um alarme.