Esta página foi traduzida pela API Cloud Translation.
Switch to English

Como criar gráficos de métricas de distribuição

Esta página descreve como criar e interpretar um gráfico para exibir dados de métricas que têm um tipo de valor Distribution. Esse tipo de valor é usado pelos serviços quando há muitas medições individuais para serem coletadas, mas informações estatísticas, como médias ou percentis, sobre essas medições são valiosas.

Por exemplo, considere um serviço que mede a latência HTTP de solicitações. Os designers optam por relatar os dados de latência para solicitações HTTP concluídas usando um tipo de valor de distribuição. Os dados são informados a cada minuto. O serviço define um conjunto de buckets em que cada bucket define um intervalo de valores de latência. Quando uma solicitação HTTP é concluída, o serviço incrementa a contagem no bucket cujo intervalo inclui o valor de latência da solicitação. Essas contagens por bucket criam um histograma de valores para esse minuto.

Se os buckets forem [0, 4), [4, 8), [8, 12) e [12, 16) e se as latências das solicitações em um intervalo de um minuto forem cinco, 1, 5, 5, 6, 10 e 14, o histograma desses dados é [2, 3, 1, 1]:

Bucket Medições de latência Número de valores no bucket
[0,4) 1, 3 2
[4,8) 5, 5, 6 3
[8,12) 10 1
[12, 16) 14 1

Quando esses dados são gravados na série temporal, um objeto Point é criado. Para métricas com um valor de distribuição, esse objeto inclui o histograma de valores. Para esse período de amostragem, o Point conterá [2, 3, 1, 1]. As medições individuais não são gravadas na série temporal.

Como esses dados HTTP são relatados a cada minuto, uma série temporal pode incluir os seguintes histogramas:

Bucket Histograma para
1h
Histograma para
1:01
Histograma para
1:02
Histograma para
1:03
[0, 4) 2 6 10 3
[4, 8) 3 1 1 8
[8,12) 1 0 2 2
[12, 16) 1 6 0 1

Gráficos de mapa de calor

Os gráficos de mapa de calor são projetados para exibir uma única série temporal com valores de distribuição. Para esses gráficos, o eixo X representa o tempo, o eixo Y representa os buckets e o valor é representado por cor. Quanto mais clara for a cor, um valor mais alto será exibido. Por exemplo, as áreas escuras do mapa de calor indicam contagens de bucket inferiores às áreas amarelas ou brancas.

A próxima figura é uma representação de um mapa de calor para o exemplo. Neste exemplo, as somas variam de 0 a 10. Quando o valor é zero, a cor é preta. Quando o valor for 10, a cor estará amarela. Para um valor intermediário, como seis, a cor é laranja.

Gráfico de mapa de calor para o exemplo.

Como os gráficos de mapa de calor podem representar apenas uma série temporal, defina as opções de agregação para combinar todas as séries temporais em apenas uma:

  • Verifique se o campo Agrupar por está vazio.
  • Selecione sum para a função de agrupamento por.

Gráficos de linhas e barras

Os gráficos de linhas, de linhas empilhadas e de barras empilhadas não podem exibir valores de distribuição. Se tiver uma métrica com um valor de distribuição e quiser exibi-la usando um desses tipos de gráfico, converta o histograma em um Point. Por exemplo, [2, 3, 1, 1], em um valor numérico. Há várias maneiras de realizar essa conversão. Por exemplo, é possível calcular a soma ou selecionar um percentil.

Considere os dados de exemplo que informam as latências de solicitações HTTP usando uma métrica de distribuição. A tabela a seguir ilustra o histograma da série temporal como uma função de tempo. A última coluna exibe a soma das contagens de histograma. Essa última coluna pode ser traçada usando um gráfico x-y:

Momento Histograma1 Soma dos valores do histograma
1:00 [2, 3, 1, 1] 7
1:01 [6, 1, 0, 6] 13
1:02 [10, 1, 2, 0] 13
1:03 [3, 8, 2, 1] 14

1Os buckets do histograma são [0, 4), [4, 8), [8, 12) e [12, 16). O histograma [2, 3, 1, 1] indica duas amostras no intervalo [0, 4).

Neste exemplo, a soma é uma medida significativa, já que pode ser considerada como a taxa de conclusão da solicitação HTTP:

Gráfico de linhas do exemplo.

Métricas de agregação e distribuição

Agregação, os processos de regularização de pontos dentro de uma série temporal e da combinação de várias séries temporais são iguais para métricas de tipo de distribuição e para métricas que têm um tipo de valor inteiro ou duplo. No entanto, o tipo de gráfico aplica alguns requisitos às opções usadas para alinhar e agrupar séries temporais.

Gráficos de mapa de calor

As funções de alinhamento e de agrupamento precisam ser selecionadas de modo que o resultado seja uma única série temporal com um valor de distribuição.

Para a função de alinhamento, selecione sum ou delta. Essas funções combinam, no nível do bucket, todas as amostras de uma única série temporal que estão no mesmo período de alinhamento, e o resultado é um valor de distribuição. Por exemplo, se duas amostras adjacentes de uma série temporal forem [2, 3, 1, 1] e [2, 5, 4, 1], a função de alinhamento do sum produz [4, 8, 5, 2].

Para a função de agrupamento, a única opção é sum. Essa função adiciona os valores dos mesmos buckets para as diferentes séries temporais. O resultado é um valor de distribuição. Por exemplo, se na hora 1:00 o histograma de séries temporais-A for
[2, 3, 1, 1] e o histograma de séries temporais-B for [1, 5, 2, 2], somando esses histogramas resultará em [3, 8, 3, 3].

Gráficos de linhas

As funções de alinhamento e de agrupamento precisam ser selecionadas de forma que, após a conclusão da agregação, os valores de distribuição sejam convertidos em valores numéricos. É possível converter um valor de distribuição em um valor numérico com a função de alinhamento ou com a função de agrupamento.

  • Se você selecionar um percentil para a função de alinhamento, durante o estágio de alinhamento de agregação, cada valor de distribuição será convertido em um valor numérico. A série temporal de agrupamento é opcional.

    Por exemplo, para exibir o 99º percentil de todas as séries temporais, defina a função de alinhamento como 99th percentile, verifique se as opções de agrupamento estão vazias e defina a função de agrupamento comonone. Com essa configuração, o gráfico pode exibir várias linhas, uma para cada série temporal.

  • Se você selecionar sum ou delta como a função de alinhamento, no final da fase de alinhamento cada amostra conterá um valor de distribuição. Com essas funções de alinhamento, é preciso selecionar uma função de agrupamento. A função de agrupamento converte o valor de distribuição em um valor numérico.

    Por exemplo, para exibir o 99o percentil de todas as séries temporais, defina a função de alinhamento como sum, verifique se as opções de agrupamento estão vazias e defina a função de agrupamento como 99th percentile. Como as opções de agrupamento estão vazias, a função de agrupamento combina os valores de distribuição de todas as séries temporais em um novo valor de distribuição e seleciona o 99o percentil. Com essa configuração, o gráfico exibe uma única linha.

Noções básicas sobre percentis de distribuição

Ao representar graficamente uma métrica de valor de distribuição no mapa de calor, você tem a opção de sobrepor o 50º percentil, o 95º percentil e o 99º percentil. Se exibir uma métrica com valor de distribuição em um gráfico de linhas, terá que convertê-la em uma métrica numérica e, em seguida, selecionar um percentil. O que não está claro é como interpretar esses percentis ou como eles são gerados.

O percentil é um valor calculado. O cálculo considera o número, a largura dos buckets e a contagem total de amostras. Como os valores reais medidos não são conhecidos, o cálculo do percentil não pode se basear nesses dados.

Exemplo com dados sintéticos

Considere um modelo de bucket Exponential com uma escala de 1 e um fator de crescimento de 2. Isso gera uma série de buckets em que o bucket (i+1)th é duas vezes maior do que o bucket ith.

Caso 1: o número total de amostras é 1.

Suponha que o histograma de medições seja igual ao mostrado nesta tabela:

Bucket count
[0, 1) 0
[1, 2) 0
[2, 4) 0
[4, 8) 0
[8, 16) 0
[16, 32) 0
[32, 64) 0
[64, 128) 0
[128, 256) 1

Para calcular o 50º percentil:

  1. Você usa as contagens de bucket para determinar que o bucket [128, 256) contém o 50º percentil.
  2. Suponha que os valores medidos no bucket selecionado sejam distribuídos de maneira uniforme e, portanto, a melhor estimativa para o 50º percentil é o ponto médio do bucket.

Ao usar a mesma lógica, é possível calcular qualquer percentil para qualquer bucket:

Percentil bucket valor
50º [128, 256) 192
95º [128, 256) 249,6
99º [128, 256) 254,7

Quando há uma única medição, os três valores do percentil são diferentes, mas mostram apenas o 50º, o 95º e o 99º percentil do mesmo bucket. O erro entre a estimativa e as medições reais não pode ser determinado porque a medição não é conhecida. Isso é conhecido porque havia uma leitura única cujo valor estava no intervalo [128, 256). Esse valor pode ter sido 128 ou 255.

Caso 2: o número total de amostras é 10.

Suponha que o histograma de medições seja igual ao mostrado nesta tabela:

Bucket count
[0, 1) 4
[1, 2) 2
[2, 4) 1
[4, 8) 1
[8, 16) 1
[16, 32) 0
[32, 64) 0
[64, 128) 0
[128, 256) 1

Ao usar o processo descrito anteriormente, os percentis podem ser calculados e mostrados nesta tabela:

Percentil bucket valor erro máximo
50º [1, 2) 1.5 0,5
95º [128, 256) 249,6 121,6
99º [128, 256) 254,7 126,7

Conforme ilustrado neste exemplo, quando há 10 amostras, o 50º percentil pode estar em um intervalo diferente dos 95º e 99º percentis. No entanto, ainda não há medições suficientes para que os 95º e 99º percentis estejam em buckets diferentes.

Exemplo com dados reais

Nesta seção, você verá um exemplo detalhado que mostra como determinar o modelo de bucket usado por uma métrica e como avaliar o possível erro nos valores do percentil calculado.

Como determinar o modelo do bucket

Para determinar os buckets usados para essa métrica, use o método projects.timeSeries/list da API Cloud Monitoring.

Neste exemplo, os dados exibidos foram extraídos de um projeto atual do Google Cloud usando o API Explorer com as seguintes configurações:

  • Filtro de métricas: metric.type="networking.googleapis.com/google-service/backend_latencies" resource.type="google_service_gce_client" resource.label."zone"="us-central1-f"
  • Horário de término: 2020-11-03T10:06:36-05:00
  • Horário de início: 2020-11-03T10:04:00-05:00

A resposta a esta consulta inclui o modelo-bucket e o número de amostras na distribuição:

{
  "timeSeries": [
    {
      "metric": {
        "labels": {
          "service_name": "monitoring.googleapis.com",
          "protocol": "HTTP/2.0",
          "response_code_class": "200",
          "service_region": "us-central1"
        },
        "type": "networking.googleapis.com/google-service/backend_latencies"
      },
      "resource": {
          [redacted]
        }
      },
      "metricKind": "DELTA",
      "valueType": "DISTRIBUTION",
      "points": [
        {
          "interval": {
            "startTime": "2020-11-03T15:05:00Z",
            "endTime": "2020-11-03T15:06:00Z"
          },
          "value": {
            "distributionValue": {
              "count": "3",
              "mean": 25.889,
              "bucketOptions": {
                "exponentialBuckets": {
                  "numFiniteBuckets": 66,
                  "growthFactor": 1.4,
                  "scale": 1
                }
              },
              "bucketCounts": [
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "3"
              ]
            }
          }
        },

Este resultado mostra que o Service Networking grava os dados de latência do back-end usando um modelo exponencial com 66 buckets, a escala é 1 e o fator de crescimento é 1.4. A resposta da API mostra que, para o intervalo de tempo de 1 minuto especificado, houve três medições com um valor médio de 25,889.

Os buckets dessa métrica, com o ponto médio de cada bucket e a contribuição do percentil, são mostrados na seguinte tabela:

intervalo ith Limite inferior1 Limite superior2 Ponto médio Cada contribuição de percentil
0 -infinito 0 n/a
1 0 1.4 0,7 0,014
2 1.4 1,96 1,58 0,0056
9 14,75 20,66 17,7 0,0591
10 20,66 28,93 24,78 0,0827
11 28,9 40,5 34,7 0,116

1 Limite inferior = escala * (fator de crescimento)^(i-1)
2 Limite superior = escala * (fator de crescimento)^i

Com base na análise anterior, esperamos que, se o 50º percentil estiver no bucket número 10, o valor do 50º percentil será 24,78.

Como verificar os cálculos do percentil

Para recuperar os valores para os 50º, 95º e 99º percentis, use o método de API projects.timeSeries/list e inclua um período de alinhamento e um alinhador. Neste exemplo, as configurações a seguir foram selecionadas:

  • Alinhador: ALIGN_50, ALIGN_95 ou ALIGN_99
  • Período de alinhamento: 60s

Para a seleção ALIGN_50, os seguintes dados foram retornados pelo método API:

{
  "timeSeries": [
    {
      "metric": {
         [redacted]
      },
      "resource": {
         [redacted]
         }
      },
      "metricKind": "GAUGE",
      "valueType": "DOUBLE",
      "points": [
        {
          "interval": {
            "startTime": "2020-11-03T15:06:36Z",
            "endTime": "2020-11-03T15:06:36Z"
          },
          "value": {
            "doubleValue": 24.793256140799986
          }
        },
        {
          "interval": {
            "startTime": "2020-11-03T15:05:36Z",
            "endTime": "2020-11-03T15:05:36Z"
          },
          "value": {
            "doubleValue": 34.710558597119977
          }
        },
        {
          "interval": {
            "startTime": "2020-11-03T15:04:36Z",
            "endTime": "2020-11-03T15:04:36Z"
          },
          "value": {
            "doubleValue": 24.793256140799986
          }
        }
      ]
    },

Depois de executar os comandos dos alinhadores do 95º e 99º percentis, temos os seguintes dados:

Estatística Amostra @ 15:06 Amostra @ 15:05 Amostra @ 15:04
média1 25,889 33,7435 Indisponível.
50º percentil 24,79 34,71 24,79
95º percentil 28,51 39,91 28,51
99º percentil 28,84 40,37 28,84

1 A média é informada com os detalhes do bucket.

Os valores do percentil correspondem ao esperado. Os valores de 50º percentil são todos os pontos intermediários de um intervalo. Da mesma forma, se você sabe que 99º percentil está no bucket 10, o valor dele percentil precisa ser de cerca de 20,66 +(99*0,0827) ou 28,84. Isso corresponde ao valor informado.

Nesses dados, os valores médios dos dados relatados às 15:05 e 15:06 são muito semelhantes a 50% dos valores do percentil. Isso proporciona confiança de que, se o número de amostras no histograma for grande o suficiente, o 50º percentil será uma estimativa razoável da média da população.

Resumo

Nesta página, apresentamos uma introdução aos gráficos de métricas com valores de distribuição. Para essas métricas, cada Point contém um intervalo de tempo e um Distribution. O Distribution define os buckets e inclui um histograma das contagens associadas a cada bucket.

Você pode traçar métricas com valores de distribuição usando um mapa de calor. Se você quiser usar gráficos de linha, será necessário converter o histograma em um valor numérico. Uma maneira de realizar essa conversão é traçar um percentil específico da distribuição.

Os valores do percentil para métricas de distribuição são calculados e o algoritmo depende das contagens de bucket, das larguras do bucket e da forma do histograma:

  • Os valores para os 50º, 95º e 99º percentis são sempre diferentes. No entanto, eles podem estar exibindo percentis diferentes dentro do mesmo bucket.
  • Os percentis não são gerados a partir de medições, porque esses valores não estão disponíveis.
  • A largura do bucket determina o erro máximo entre o percentil calculado e as medições.
  • O número de amostras em um histograma é importante. Por exemplo, se esse número for menor que 20, os 95 º e 99º percentis sempre estarão no mesmo bucket.
  • Para qualquer métrica de distribuição, é possível usar a API Cloud Monitoring para identificar o modelo de bucket usado para essa métrica. Como esse modelo tem carimbo de data/hora, um serviço pode alterar o modelo de bucket.