Este guia explica alguns dos problemas que podem surgir ao usar a API Monitoring.
A API Monitoring faz parte do conjunto de APIs do Cloud. Essas APIs compartilham um conjunto comum de códigos de erro. Para receber uma lista de códigos de erro definidos pelas APIs do Cloud e sugestões gerais sobre como processar os erros, consulte Como processar os erros.
Usar o APIs Explorer para depuração
As APIs Explorer é um widget integrado às páginas de referência dos métodos de API. Ele permite que você invoque o método preenchendo campos; não exige que você para escrever o código.
Se você estiver com problemas para invocar um método, use o widget das APIs Explorer (Try this API) na página de referência desse método para depurar o problema. Para mais informações, consulte APIs Explorer.
Erros gerais da API
Estes são alguns erros e mensagens da API Monitoring que você pode ver nas suas chamadas de API:
404 NOT_FOUND
com "O URL solicitado não foi encontrado neste servidor": parte do URL está incorreta. Compare o URL com o URL do método mostrado na página de referência do método. Esse erro pode significar que há um erro de ortografia, como "projeto", em vez de "projetos" ou um erro de capitalização, como "TimeSeries" em vez de "timeSeries".401 UNAUTHENTICATED
com "O usuário não está autorizado a acessar o projeto". (ou métrica)": esse código de erro normalmente indica um problema de autorização. mas pode significar que há um erro no ID do projeto ou no tipo de métrica nome. Verifique a ortografia e as letras maiúsculas.Se você não estiver usando o APIs Explorer, tente usá-lo. Quando a chamada de API funciona no API Explorer, provavelmente há um problema de autorização no ambiente em que você está fazendo a chamada de API. Acesse a página do gerenciador de APIs para verificar se a API Monitoring está ativada para seu projeto.
400 INVALID_ARGUMENT
com "O filtro de campo tinha um valor inválido": verifique o a ortografia e a formatação do filtro de monitoramento. Para mais informações, consulte Filtros de monitoramento.400 INVALID_ARGUMENT
com "A solicitação não tinha o campo interval.endTime": Você vê essa mensagem quando o horário de término está ausente ou quando está presente, mas não formatado corretamente. Se você estiver usando o APIs Explorer, não cite o valor do campo de tempo.Confira alguns exemplos de especificações de hora válidas:
2024-05-11T01:23:45Z 2024-05-11T01:23:45.678Z 2024-05-11T01:23:45.678+05:00 2024-05-11T01:23:45.678-04:30
Resultados ausentes
Quando uma chamada de API retornar o código de status 200
e uma resposta vazia, considere o seguinte:
- Quando a chamada usa um filtro, ele pode não ter correspondido
a nada. A correspondência de filtro diferencia maiúsculas de minúsculas. Para resolver o filtro
problemas, comece especificando apenas um componente de filtro, como
metric.type
e verifique se os resultados são exibidos. Adicione os outros componentes do filtro, um por um, para criar sua solicitação.
- Ao trabalhar com uma métrica personalizada, verifique se o projeto que define se a métrica é especificada.
Existem vários motivos pelos quais os pontos de dados podem estar ausentes quando você usa o parâmetro
Método timeSeries.list
:
Os dados podem ter envelhecido. Para mais informações, consulte Retenção de dados.
Talvez os dados ainda não tenham sido propagados para o Monitoring. Para saber mais, consulte Latência dos dados de métrica.
O intervalo é inválido:
- Verifique se o horário de término está correto.
- Verifique se o horário de início está correto e é anterior ao
de término. Quando o horário de início está ausente ou malformado, a API define o
horário de início ao de término. Para métricas
GAUGE
, somente este intervalo de tempo corresponde a pontos cujos horários de início e término são exatamente os horário de término. Para as métricasCUMULATIVE
ouDELTA
, que medem entre intervalos de tempo, nenhum ponto é correspondido. Para mais informações, consulte Intervalos de tempo.
Como repetir erros de API
Dois dos códigos de erro das APIs do Cloud indicam circunstâncias em que pode ser útil repetir a solicitação:
503 UNAVAILABLE
: novas tentativas são úteis quando o problema é uma condição de curta duração ou temporária.429 RESOURCE_EXHAUSTED
: após um atraso, as novas tentativas só serão úteis para jobs de segundo plano de longa duração com cota de tempo, como n chamadas por t segundos. As novas tentativas não são úteis quando o problema é uma condição de curta duração ou transitória ou quando você esgotou uma cota baseada em volume. Para condições temporárias, considere tolerar a falha. Para cotas problemas, considere reduzir o uso da cota ou solicitar um aumento dela.
Ao escrever um código que possa repetir solicitações, primeiro verifique se é seguro repeti-las.
É seguro repetir a solicitação?
Se a solicitação for idempotente, é seguro tentar novamente. Uma ação idempotente é aquela em que qualquer alteração no estado não depende do estado atual. Exemplo:
- A leitura de x é idempotente, não haverá alteração no valor.
- Definir x como 10 é idempotente. Isso pode alterar o estado, se o valor já não for 10, mas não importa qual é o valor atual e nem quantas vezes você tenta definir o valor.
- Fazer um acréscimo em x não é idempotente. O novo valor depende do valor atual.
Repetição com espera exponencial
Ao implementar o código para repetir solicitações, você não quer emitir novas solicitações rápidas indefinidamente. Se um sistema estiver sobrecarregado, essa abordagem contribui para o problema.
Em vez disso, use uma abordagem de espera exponencial truncada. Quando as solicitações falham devido a sobrecargas temporárias em vez de indisponibilidade real, a solução é reduzir a carga. Uma espera exponencial truncada segue este padrão geral:
Estabeleça quanto tempo você pretende esperar ao tentar novamente ou quantas tentativas você pretende fazer. Quando esse limite for excedido, considere o serviço indisponível e lide com essa condição do aplicativo da maneira apropriada. Isso é o que cria a espera truncada, você parar de tentar novamente em algum momento.
Tente fazer a solicitação novamente com pausas cada vez mais longas para aumentar a espera da frequência das novas tentativas. Tente novamente até que a solicitação seja bem-sucedida ou o limite estabelecido seja atingido.
O intervalo normalmente é aumentado por alguma função da potência da contagem de novas tentativas, tornando-a uma espera exponencial.
Há muitas maneiras de implementar uma espera exponencial. Confira a seguir um exemplo que adiciona um atraso de espera crescente a um atraso mínimo de 1.000 ms. O atraso inicial é de 2 ms e aumenta para 2retry_count ms a cada tentativa.
A tabela a seguir mostra os intervalos de repetição usando os valores iniciais:
- Atraso mínimo = 1 s = 1.000 ms
- Espera inicial = 2 ms
Contagem de repetições | Atraso adicional (ms) | Repetir após (ms) |
---|---|---|
0 | 20 = 1 | 1001 |
1 | 21 = 2 | 1002 |
2 | 22 = 4 | 1004 |
3 | 23 = 8 | 1008 |
4 | 24 = 16 | 1016 |
… | ... | … |
n | 2n | 1.000 + 2n |
É possível truncar o ciclo de repetição ao parar após n tentativas ou quando o tempo gasto exceder um valor razoável para seu aplicativo.
Para mais informações, consulte o artigo da Wikipédia Exponential backoff (em inglês).