# Solucionar problemas de Real-Time Metrics

Esta página lista os sintomas que [Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/) mostra em um dashboard no Azion Console ou em uma resposta da API GraphQL, cada um com a sua causa e a sua correção. Os sintomas dos gráficos vêm primeiro: pontos baixos ou ausentes, gráficos vazios e com falha, a tag de variação, totais que diferem de Billing, o tooltip, a legenda, queries copiadas e o campo de query. Os erros que a API GraphQL retorna encerram a página.

---

## Os pontos mais recentes de um gráfico ficam abaixo dos demais

Os últimos pontos de uma linha ficam abaixo do tráfego que você espera e sobem quando você atualiza o dashboard alguns minutos depois.

O Console não plota o último bucket quando o intervalo termina no minuto atual. Os buckets anteriores a ele ainda podem estar em agregação, por até 10 minutos, então podem ficar baixos, como [Agregação e atraso](/pt-br/documentacao/plataforma/real-time-metrics/como-funciona/#agregacao-e-atraso) explica.

- **Termine o intervalo 10 minutos antes**: na aba **Absolute** do seletor de intervalo de tempo, defina **End date** para um horário pelo menos 10 minutos no passado e selecione **Apply**.
- **Atualize depois do atraso**: selecione **Refresh** quando os minutos mais recentes terminarem a agregação.
- **Em uma query GraphQL**: defina o `end` de `tsRange` pelo menos 10 minutos antes de a query rodar. A mesma query enviada duas vezes dentro desses 10 minutos retorna valores diferentes para os seus buckets mais recentes, pelo mesmo motivo.

Todo ponto de um intervalo que terminou há 10 minutos ou mais é final e retorna o mesmo valor a cada atualização.

---

## Um gráfico mostra No data available

Um card de gráfico mostra `No data available` no lugar do gráfico, em um gráfico ou em todos os gráficos de uma aba de produto.

O dataset não tem métricas para o intervalo e os filtros selecionados. Três casos causam isso: o produto que registra as métricas não está ativo na sua conta, nenhum tráfego chegou a esse produto no intervalo ou um filtro aplicado não corresponde a nenhum tráfego.

- **Ative o produto por trás do gráfico**: Real-Time Metrics lê apenas o que esses produtos registram.

| Aba ou gráfico                                                              | Requisito                                                                                                                                                       |
| --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Gráfico **Edge Cache**, **Build** › **Applications** › **Data Transferred** | [Cache](/pt-br/documentacao/plataforma/applications/#cache) ativo na sua conta                                                                                  |
| **Build** › **Tiered Cache**                                                | [Tiered Cache](/pt-br/documentacao/plataforma/applications/cache/tiered-cache/) ativo na sua conta                                                              |
| **Build** › **Functions**                                                   | [Functions](/pt-br/documentacao/plataforma/functions/) ativo na sua conta                                                                                       |
| **Build** › **Image Processor**                                             | [Image Processor](/pt-br/documentacao/plataforma/applications/#image-processor) ativo na sua conta                                                              |
| **Secure** › **Edge DNS**                                                   | [Edge DNS](/pt-br/documentacao/plataforma/edge-dns/) ativo na sua conta                                                                                         |
| **Secure** › **Bot Manager**                                                | Uma assinatura de [Bot Manager](/pt-br/documentacao/plataforma/firewall/#bot-manager), contratada por meio do [Technical Support](/pt-br/documentacao/suporte/) |
| **Observe** › **Data Stream**                                               | [Data Stream](/pt-br/documentacao/plataforma/data-stream/) ativo, com pelo menos um stream configurado                                                          |

- **Amplie o intervalo de tempo**: o intervalo inicial, **Last 5 minutes**, fica vazio quando nenhuma requisição chegou nesses minutos. Selecione um preset como **Last 24 hours**.
- **Remova um filtro**: selecione o ícone de remoção em cada chip de filtro aplicado até o gráfico plotar.
- **Leia um array vazio como ausência de dados**: pela API, um dataset sem métricas para o intervalo retorna `200` e um array vazio, não um erro. Uma query `tieredCacheMetrics` em uma conta sem tráfego de Tiered Cache retorna:

```json
{
  "data": {
    "tieredCacheMetrics": []
  }
}
```

Quando o produto registra tráfego no intervalo, o gráfico o plota, e um bucket sem eventos dentro do intervalo é plotado como zero.

---

## Uma query para um intervalo antigo retorna um array vazio

Uma query GraphQL para um intervalo antigo retorna `200` e um array vazio, enquanto a mesma query para um intervalo recente retorna linhas.

Real-Time Metrics mantém cada dataset por um período fixo e, depois desse período, não retorna linhas nem erro. O período varia por dataset, então um dataset de breakdown pode não retornar nada para um intervalo que outro dataset ainda responde.

Uma query para um intervalo em 2023 retorna:

```json
{
  "data": {
    "httpMetrics": []
  }
}
```

- **Comece o intervalo dentro do período de retenção** do dataset, que [Retenção de dados](/pt-br/documentacao/plataforma/real-time-metrics/limites/#retencao-de-dados) lista.
- **Espere que intervalos parciais retornem o que é mantido**: um intervalo que começa antes do período de retenção ainda retorna as linhas dentro dele, sem erro.
- **Armazene o que você precisa manter por mais tempo**: consulte um período quando ele estiver completo e salve o resultado, como [Boas práticas para Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/boas-praticas/) descreve.

Dentro do período de retenção, a query retorna as linhas que contêm dados.

---

## Um gráfico mostra The chart can't be plotted

Um card de gráfico mostra `The chart can't be plotted. There was an issue loading the data.` no lugar da sua linha de tags de agregação.

Cada gráfico envia a sua própria query para a API GraphQL, e a query deste gráfico retornou um erro em vez de dados. Os outros gráficos do dashboard ainda podem plotar.

- **Envie a query de novo**: selecione **Refresh**.
- **Reduza o intervalo ou adicione um filtro**: a API recusa uma query que ultrapassa a sua taxa de requisições ou as linhas que ela lê, como [Limites de Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/limites/#api-graphql) mostra.
- **Leia o erro você mesmo**: no menu **More options** do gráfico, selecione **Copy query** e execute a query no [Playground GraphiQL](/pt-br/documentacao/devtools/graphql/playground-graphql/). A resposta traz a mensagem que o gráfico não mostra.

Depois da correção, o gráfico plota os seus pontos, ou a resposta nomeia um dos erros em [A API GraphQL recusa uma query](/pt-br/documentacao/plataforma/real-time-metrics/solucao-de-problemas/#a-api-graphql-recusa-uma-query).

---

## A tag de variação mostra Can't compare

A tag de variação de um gráfico mostra **Can't compare**, em uma cor de alerta com um ícone de triângulo, em vez de uma porcentagem.

A tag compara o intervalo selecionado com a janela de mesma duração imediatamente anterior a ele. Ela mostra **Can't compare** quando a mudança fica entre –0,01% e +0,01%, quando alguma das janelas não tem valor ou quando a janela anterior é 0.

- **Leia uma mudança dentro de ±0,01% como ausência de mudança**: os totais das duas janelas diferem em menos de 0,01%.
- **Escolha um intervalo cuja janela anterior teve tráfego**: por exemplo, se uma aplicação começou a servir tráfego há 30 minutos, **Last 1 hour** compara com uma hora que não teve requisições.
- **Compare janelas completas**: termine o intervalo pelo menos 10 minutos no passado, para que nenhuma das janelas tenha buckets ainda em agregação.

Quando as duas janelas têm valor e a mudança passa de 0,01%, a tag mostra a mudança como uma porcentagem com duas casas decimais, como [Tag de variação](/pt-br/documentacao/plataforma/real-time-metrics/filtros-e-intervalo-de-tempo/#tag-de-variacao) descreve.

---

## Os totais de Real-Time Metrics diferem de Billing

O total de um dashboard ou de uma query para um período difere do uso que Azion Billing informa para o mesmo período.

Real-Time Metrics conta cada evento no máximo uma vez, enquanto Billing conta cada evento exatamente uma vez, então Real-Time Metrics pode perder um evento que Billing conta. Em média, os dois diferem em menos de 1%, como [Contagem e Billing](/pt-br/documentacao/plataforma/real-time-metrics/como-funciona/#contagem-e-billing) explica.

- **Use o valor de Billing para cobranças**: quando os dois diferem, Billing é a referência, como [Real-Time Metrics e faturamento](/pt-br/documentacao/fundamentos/billing-and-subscriptions/#real-time-metrics-e-faturamento) descreve.
- **Use Real-Time Metrics para operações**: leia os dashboards para ver uma mudança de tráfego em minutos, não para resolver uma cobrança.
- **Compare períodos completos**: termine o intervalo pelo menos 10 minutos no passado, para que nenhum bucket do total ainda esteja em agregação.

Uma diferença de cerca de 1% entre os dois é a diferença esperada, não uma falha de nenhum deles.

---

## Um gráfico não mostra tooltip

Um gráfico plota, mas não mostra valores quando você passa o cursor sobre uma série.

Azion Console mostra o tooltip de um gráfico apenas em uma janela de navegador com mais de 540 px de largura. Com 540 px ou menos, nenhum gráfico mostra tooltip.

- **Amplie a janela do navegador** para mais de 540 px.
- **Leia os totais na legenda**: cada entrada mostra o nome da série e o seu total no intervalo.
- **Exporte os pontos**: no menu **More options** do gráfico, selecione **Export CSV** para baixar os pontos como foram plotados.

Em uma janela com mais de 540 px, o tooltip lista o nome e o valor de cada série no ponto sob o cursor.

---

## A legenda de um gráfico para em 16 séries

Um gráfico que divide os seus dados em muitas séries, como uma por domínio, desenha 16 delas, e a sua legenda lista 16 entradas.

Um gráfico plota no máximo 16 séries. Nenhuma série depois da 16ª é adicionada ao gráfico nem à sua legenda.

- **Filtre as séries de que você precisa**: adicione um filtro em **Domain** ou **Workload**, o rótulo que a sua conta mostrar, com o operador **In** e os valores que você compara.
- **Consulte todas as séries pela API**: selecione **Copy query** no menu **More options** do gráfico e execute a query com um `limit` alto o bastante para todas as linhas, até 10.000. A query copiada mantém o `limit` do próprio gráfico.

Com o filtro aplicado, o gráfico desenha cada série que o filtro mantém, até 16, e a API retorna uma linha para cada série.

---

## Uma query copiada não roda no GraphiQL

Uma query colada de **Copy query** no Playground GraphiQL não roda do jeito que foi colada.

**Copy query** copia um bloco de texto, não uma requisição: a linha `# QUERY`, a query, a linha `# VARIABLES` e as variáveis como um objeto JSON. A query lê os seus valores de filtro dessas variáveis, então o JSON vai no painel de variáveis, não no editor de query.

Para executar a query copiada no Playground GraphiQL:

1. **Cole o texto copiado no editor de query**

2. **Recorte o objeto JSON que segue o comentário VARIABLES**

   O objeto começa depois da linha `# VARIABLES`.

3. **Cole o objeto JSON no painel de variáveis**

4. **Execute a query**

A resposta contém um objeto `data` com o nome do dataset, com as linhas por trás do gráfico. Para o formato da área de transferência, consulte [Copy query](/pt-br/documentacao/plataforma/real-time-metrics/filtros-e-intervalo-de-tempo/#copy-query), e para o playground, [Playground GraphiQL](/pt-br/documentacao/devtools/graphql/playground-graphql/).

---

## O campo de query recusa um filtro

Uma mensagem aparece abaixo do campo do Azion Query Language na linha de filtros, e **Refresh** fica desabilitado.

A expressão quebra uma regra de sintaxe do campo ou nomeia um campo que o dataset do dashboard atual não tem. Os campos dependem do dashboard, então uma expressão que funciona em um dashboard pode falhar em outro.

- **Separe o operador com espaços**: escreva `status = 200`, não `status=200`.
- **Coloque entre aspas os nomes de mais de uma palavra**: escreva `"Upstream Status"`.
- **Feche as listas entre parênteses**: escreva `domain in (domain1, domain2)`, sem vírgula depois do último valor.
- **Dê ao between dois valores diferentes**: escreva `status between (200, 300)`.
- **Escolha os campos pelas sugestões**: `Ctrl` + `Space`, ou `Cmd` + `Space`, lista apenas os campos do dashboard atual.

Quando a expressão é válida, a mensagem desaparece e `Enter` a aplica ao dashboard. Cada mensagem, literal, está listada em [Mensagens de validação](/pt-br/documentacao/plataforma/real-time-metrics/filtros-e-intervalo-de-tempo/#mensagens-de-validacao).

---

## A API GraphQL recusa uma query

A API GraphQL responde em `https://api.azion.com/v4/metrics/graphql`. Quando recusa uma query, ela retorna um corpo JSON cujo campo `detail` contém a mensagem. Cada entrada cita o corpo que a API retorna. Para cada status code e mensagem da API, consulte [Mensagens de erro da API GraphQL](/pt-br/documentacao/devtools/graphql/mensagens-erro/).

### Uma query é recusada com Authentication credentials were not provided

A API responde `401` com este corpo:

```json
{
  "detail": "Authentication credentials were not provided."
}
```

A requisição não leva o header `Authorization`, e toda query para a API precisa de um personal token.

- **Envie um personal token** no header `Authorization: Token [TOKEN VALUE]`. Para criar um, consulte [Como criar um personal token](/pt-br/documentacao/guias/plataforma/conta-e-billing/personal-tokens/). Teste-o com uma query mínima:

```bash
curl -X POST 'https://api.azion.com/v4/metrics/graphql' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Token [TOKEN VALUE]' \
  -d '{"query":"{ __typename }"}'
```

- **Substitua um token inválido ou expirado**: a API responde `401` com outras mensagens, listadas em [Mensagens de erro da API GraphQL](/pt-br/documentacao/devtools/graphql/mensagens-erro/).

Com um token válido, a API responde `200`:

```json
{
  "data": {
    "__typename": "Query"
  }
}
```

### Uma query é recusada por não ter intervalo de tempo

A API responde `400` com este corpo:

```json
{
  "detail": "To execute queries it is mandatory to provide the desired time interval."
}
```

Toda query precisa definir um intervalo de tempo no seu `filter`, e esta não define nenhum.

- **Adicione `tsRange` ao filtro**: por exemplo, `filter: { tsRange: { begin: "2026-01-01T12:00:00", end: "2026-01-02T12:00:00" } }`.
- **Ou defina `tsGt` e `tsLt`** para o início e o fim do intervalo.

Com um intervalo de tempo, a query retorna `200` e as linhas desse intervalo.

### Uma query é recusada com You have exceeded the limit amount allowed for selected fields

A API responde `400` com este corpo:

```json
{
  "detail": "You have exceeded the limit amount allowed for selected fields (37 fields)."
}
```

A query seleciona mais campos do que uma query aceita. O campo `ts` conta para o limite, e uma saída agregada como `sum` não conta, como [Limites de Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/limites/#api-graphql) mostra.

- **Remova os campos que você não lê**, incluindo `ts` quando você não agrupa por tempo.
- **Divida a seleção em duas queries** sobre o mesmo intervalo e o mesmo filtro.

Dentro do limite, a query retorna `200` com todos os campos selecionados.

### Uma query é recusada com The value for the query limit is invalid

A API responde `400` com este corpo:

```json
{
  "detail": "The value for the query limit is invalid (must be between 0 to 10000 rows)."
}
```

O argumento `limit` está acima de 10.000 ou abaixo de 0.

- **Defina `limit` entre 0 e 10.000.**
- **Para mais linhas, encurte o intervalo** ou percorra as linhas em páginas com `offset`, como [Recursos da API GraphQL](/pt-br/documentacao/devtools/graphql/recursos/) descreve.
- **Não remova `limit` para evitar o erro**: uma query sem ele não é recusada, mas retorna 10 linhas.

Com um `limit` válido, a query retorna até esse número de linhas.

### Uma query é recusada com Cannot query field

A API responde `400` quando o nome de um dataset ou de um campo não existe. Para um dataset, a mensagem sugere os nomes mais próximos:

```json
{
  "detail": "Cannot query field \"imageProcessedMetrics\" on type \"Query\". Did you mean \"imagesProcessedMetrics\", \"edgeStorageMetrics\", \"ingestMetrics\" or \"dataStreamedMetrics\"?"
}
```

A query nomeia um dataset ou um campo que a API não tem, como `imageProcessedMetrics` para o dataset `imagesProcessedMetrics`. Para um campo, a mensagem nomeia o tipo em que ele foi procurado, como `Cannot query field "wafThreatFamilies" on type "HttpMetricsAggregatedFieldsLogType".`

- **Use o nome de dataset que a mensagem sugere**, como `imagesProcessedMetrics`.
- **Confira o campo no seu dataset**: [Campos da API GraphQL do Real-Time Metrics](/pt-br/documentacao/devtools/graphql/campos-gql-real-time-metrics/) lista os campos de cada dataset.

Com nomes que a API conhece, a query retorna `200`.

### Uma query é recusada com Argument has invalid value

A API responde `400` quando `groupBy` ou `aggregate` nomeia um campo que ela não aceita naquele dataset:

```json
{
  "detail": "Argument \"groupBy\" has invalid value [remoteAddress].\nIn element #0: Expected type \"HttpMetricsGroupByFields\", found remoteAddress."
}
```

`groupBy` aceita apenas as dimensões do seu próprio dataset, e `remoteAddress` é uma dimensão de `httpBreakdownMetrics`, não de `httpMetrics`. Um campo calculado não precisa de `aggregate`, então `sum: uniqueSessions` em `connectedUsersMetrics` retorna uma mensagem que começa com `Argument "aggregate" has invalid value {sum: uniqueSessions}.`

- **Consulte o dataset que tem a dimensão**: agrupe por `remoteAddress` em `httpBreakdownMetrics`, como [Encontre as principais origens de ameaças do WAF](/pt-br/documentacao/guias/plataforma/observabilidade/encontrar-principais-origens-de-ameacas-waf/) faz.
- **Selecione um campo calculado diretamente**: remova `aggregate` e liste o campo, como `uniqueSessions`, entre os campos selecionados.

Com campos que o dataset aceita, a query retorna `200`.

### Uma query é recusada com You have reached the request rate limit

A API responde `429` com a mensagem `You have reached the request rate limit!`.

Mais requisições chegaram à API em um minuto do que ela aceita, como [Limites de Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/limites/#api-graphql) mostra.

- **Espere e envie a requisição de novo.**
- **Envie menos requisições**: consulte um período completo uma vez e guarde o resultado, em vez de consultar o mesmo período de novo.
- **Selecione vários campos em uma query** em vez de uma query por campo.

Abaixo do limite de taxa, cada requisição volta a retornar os seus dados.

### Uma chamada ao host legado da API responde 403 Forbidden

Uma query enviada para `https://api.azionapi.net/metrics/graphql` responde `403` com uma página HTML intitulada `Azion - Default error page` que diz `Forbidden`, não com JSON.

`api.azionapi.net` é o host legado da API. As queries de Real-Time Metrics vão para o endpoint v4.

- **Envie a query para `https://api.azion.com/v4/metrics/graphql`**, com o header `Authorization: Token [TOKEN VALUE]`.
- **Atualize um data source do Grafana que usa a URL legada**, como [Importe o dashboard Data Transferred](/pt-br/documentacao/guias/plataforma/observabilidade/data-transferred-dash/) mostra.

No endpoint v4 com um token válido, a query retorna `200` e um corpo JSON.

---

## Recursos relacionados

- [Limites de Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/limites.md): A retenção de cada dataset e cada limite a que as correções desta página se referem.
- [Como Real-Time Metrics funciona](/pt-br/documentacao/plataforma/real-time-metrics/como-funciona.md): Como a agregação, a resolução e a contagem definem o valor de cada ponto.
- [Filtros e intervalo de tempo](/pt-br/documentacao/plataforma/real-time-metrics/filtros-e-intervalo-de-tempo.md): O seletor de intervalo de tempo, os operadores de filtro, os estados do gráfico e o menu do gráfico.
- [Mensagens de erro da API GraphQL](/pt-br/documentacao/devtools/graphql/mensagens-erro.md): Cada status code e mensagem que a API GraphQL retorna, com a sua causa.
