Percentiles y métricas con valor de distribución

En este documento, se describe cómo comprender los percentiles y el modelo de histograma de datos de métrica con un tipo de valor Distribution. Una métrica de distribución define rangos de valores, llamados buckets, y registra el recuento de valores medidos que corresponden a cada bucket. Las métricas de distribución no informan los valores de medición individuales, sino que informan un histograma de recuentos en buckets. Los servicios usan este tipo de valor cuando las mediciones individuales son demasiado numerosas para recopilarse, pero la información estadística, como promedios o percentiles, sobre esas mediciones es valiosa.

Cuando grafiques una métrica con valores de distribución en un mapa de calor, puedes usar una opción de la barra de herramientas del gráfico para superponer los percentiles 50, 95 y 99. Para mostrar una métrica con valor de distribución en un gráfico de líneas, debes configurar el gráfico para convertir el valor de distribución en un valor numérico. Puedes realizar esta conversión con un alineador que seleccione un percentil.

En la siguiente sección de esta página, se usa un ejemplo sintético para mostrar cómo se determinan los percentiles. En el ejemplo, se muestra que los valores de percentiles dependen de la cantidad de buckets, el ancho de los buckets, la distribución de las mediciones y el recuento total de muestras. Los valores de percentil no dependen de los valores medidos reales porque esos valores no están disponibles en el histograma.

Ejemplo con datos sintéticos

Considera un modelo de bucket Exponential con una escala de 1, un factor de crecimiento de 2 y 10 buckets finitos. Este histograma contiene 12 buckets: los 10 buckets finitos, 1 bucket que solo especifica un límite superior y 1 que solo especifica un límite inferior. Para este ejemplo, el bucket finito con el índice n+1 es dos veces más ancho que el bucket finito con el índice n.

En los siguientes ejemplos, se muestra que el ancho del bucket determina el error máximo entre el percentil calculado y las mediciones. También muestran que la cantidad de muestras en un histograma es importante. Por ejemplo, si la cantidad de muestras es menor que 20, los percentiles 95 y 99 estarán siempre en el mismo bucket.

Caso 1: El número total de muestras es 1.

Cuando hay una sola medición, los tres valores de percentiles difieren, pero solo muestran los percentiles 50, 95 y 99 del mismo bucket. El error entre la estimación y las mediciones reales no se puede determinar porque la medición no se conoce.

Por ejemplo, supongamos que el histograma de mediciones se muestra en la siguiente tabla:

Número de bucket Límite inferior Límite superior Recuento Rango de percentiles
0 1 0 0
1 1 2 0 0
2 2 4 0 0
3 4 8 0 0
4 8 16 0 0
5 16 32 0 0
6 32 64 0 0
7 64 128 0 0
8 128 256 1 De 0 a 100
9 256 512 0 0
10 512 1024 0 0
11 1024 0 0

Para calcular el percentil 50, haz lo siguiente:

  1. Usa los recuentos de buckets para determinar el bucket que contiene el percentil 50. En este ejemplo, el bucket número 8 contiene el percentil 50.
  2. Calcula la estimación con la siguiente regla:

    pth percentage = bucket_low +
                    (bucket_up - bucket_low)*(p - p_low)/(p_up - p_low)
    

    En la expresión anterior, p_low y p_up son los límites inferior y superior del rango de percentiles del bucket. De manera similar, bucket_low y bucket_up son los límites inferior y superior del bucket. Los valores de p_low y p_up dependen de cómo se distribuyen los recuentos entre los diferentes buckets.

Por ejemplo, el percentil 50 se calcula de la siguiente manera:

   50th percentile = 128 + (256-128)*(50-0)/(100-0)
                   = 128 + 128 * 50 / 100
                   = 128 + 64
                   = 192

Para calcular el percentil 95, reemplaza 50 por 95 en la expresión anterior. Para este ejemplo en el que hay exactamente una muestra, los percentiles son los siguientes:

Percentil Número de bucket Valor
50 8 192
95 8 249.6
99.º 8 254.7

El error entre la estimación y las mediciones reales puede limitarse, pero no se puede determinar porque se desconoce la medición.

Caso 2: La cantidad total de muestras es 10.

Cuando hay 10 muestras, el percentil 50 puede estar en un bucket diferente que los percentiles 95 y 99. Sin embargo, no hay suficientes mediciones para permitir que los percentiles 95 y 99 estén en buckets diferentes.

Por ejemplo, supongamos que el histograma de mediciones se muestra en la siguiente tabla:

Número de bucket Límite inferior Límite superior Recuento Rango de percentiles
0 1 4 0 - 40
1 1 2 2 De 40 a 60
2 2 4 1 60 - 70
3 4 8 1 70 - 80
4 8 16 1 80 - 90
5 16 32 0 0
6 32 64 0 0
7 64 128 0 0
8 128 256 1 90 - 100
9 256 512 0 0
10 512 1024 0 0
11 1024 0 0

Puedes usar el procedimiento descrito anteriormente para calcular los percentiles 50, 95 y 99. Por ejemplo, el percentil 50, que está en el bucket número 1, se calcula de la siguiente manera:

50th percentile = 1 + (2-1)*(50-40)/(60-40)
                = 1 + (1 * 10 / 20)
                = 1 + 0.5
                = 1.5

De manera similar, el percentil 95 se calcula de la siguiente manera:

95th percentile = 128 + (256-128)*(95-90)/(100-90)
                = 128 + 128 * 5 / 10
                = 128 + 64
                = 192

Con el proceso descrito anteriormente, se pueden calcular los percentiles. Cada fila de la siguiente tabla enumera un percentil, el bucket correspondiente y el valor calculado:

Percentil Número de bucket Valor Cantidad máxima de errores
50 1 1.5 0.5
95 8 192 74
99.º 8 243,2 115,2

En este ejemplo y en el anterior, el percentil 95 está en el bucket número 8; sin embargo, el cálculo del percentil es diferente. La diferencia se debe a la forma en que se distribuyen las muestras. En el primer ejemplo, todas las muestras están en el mismo bucket, mientras que en el ejemplo más reciente, están en buckets diferentes.

Ejemplo con datos reales

En esta sección, se incluye un ejemplo que ilustra cómo puedes determinar el modelo de bucket que usa una métrica en particular. En esta sección, también se ilustra cómo puedes evaluar el posible error en los valores de percentiles calculados.

Identifica el modelo de bucket

Para determinar los buckets que se usan en una métrica durante un intervalo de tiempo específico, llama al método projects.timeSeries/list de la API de Cloud Monitoring.

Por ejemplo, para identificar el modelo de bucket para una métrica, haz lo siguiente:

  1. Ve a la página web de projects.timeSeries/list.
  2. En el Explorador de APIs, ingresa el filtro que especifica la métrica, una hora de inicio y una hora de finalización.

    Por ejemplo, para obtener información sobre la métrica que almacena latencias de solicitudes a la API, ingresa lo siguiente:

    metric.type="serviceruntime.googleapis.com/api/request_latencies"
    resource.type="consumed_api"
    

    En este ejemplo, el campo de filtro especifica un tipo de métrica y un tipo de recurso. Para obtener más información sobre estos filtros, consulta Filtros de supervisión.

  3. Haz clic en Ingresar.

La siguiente es la respuesta de la API de list para una métrica con valor de distribución que está disponible en un proyecto de Google Cloud:

{
  "timeSeries": [
    {
      "metric": {...},
      "resource": {...},
      },
      "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"
              ]
            }
          }
        },

En la respuesta de la API, el campo value describe los datos almacenados en el array points. Los campos count y mean informan que para el intervalo de tiempo especificado había 3 mediciones y su valor promedio fue de 25.889. En el campo bucketOptions, se muestra que el modelo exponencial está configurado para tener 66 buckets, una escala de 1 y un factor de crecimiento de 1.4.

Para calcular los límites inferior y superior del bucket con el índice n, usa las siguientes reglas:

  • Límite inferior (1 ≤ n < N) = escala * (factor de crecimiento)(n-1)
  • Límite superior (0 ≤ n < N-1) = escala * (factor de crecimiento)n

En las expresiones anteriores, N es la cantidad total de buckets.

Los buckets de esta métrica, junto con el punto medio de cada bucket, se muestran en la siguiente tabla:

nésimo bucket Límite inferior Límite superior Punto medio
0 1 No aplicable
1 1 1.40 1.20
2 1.40 1.96 1.68
...
9 14,76 20.66 17,71
10 20.66 28.93 24.79
11 28.93 40,50 34.71
...

Verifica los cálculos del percentil

Ahora que se conoce la configuración del bucket, puedes predecir los valores de los percentiles 50, 95 y 99 para cualquier conjunto de mediciones. Por ejemplo, si hay una muestra y está en el bucket número 10, el valor del percentil 50 es 24.79.

Para recuperar los valores de los percentiles 50, 95 y 99 de la métrica, puedes usar el método de la API projects.timeSeries/list y, luego, incluir un período de alineación y un alineador. En este ejemplo, se seleccionaron los siguientes parámetros de configuración:

  • Alineador: ALIGN_PERCENTILE_50, ALIGN_PERCENTILE_95 o ALIGN_PERCENTILE_99
  • Período de alineación: 60 segundos

En la selección ALIGN_PERCENTILE_50, cada valor de la serie temporal es el percentil 50 de un bucket:

{
  "timeSeries": [
    {
      "metric": {...},
      "resource": {...},
      "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
          }
        }
      ]
    },

Para dos de las muestras, el percentil 50 está en el bucket 10, mientras que la otra está en el bucket 11.

En la siguiente tabla, se muestran los resultados de la ejecución del método projects.timeSeries/list con diferentes alineadores. La primera fila corresponde al caso en el que no se especifica el alineador. Cuando no especificas un alineador, se muestran el modelo de bucket y los valores medios. En las siguientes tres filas, se enumeran los datos que se muestran cuando el alineador se configura en ALIGN_PERCENTILE_50, ALIGN_PERCENTILE_95 y ALIGN_PERCENTILE_99:

Estadística Muestra @ 15:06 Muestra @ 15:05 Muestra @ 15:04
Media 25.889 33.7435 No disponible
Percentil 50 24.79 34.71 24.79
Percentil 95 28.51 39.91 28.51
Percentil 99 28.84 40.37 28.84

Como se ilustra en los dos ejemplos con datos sintéticos, los valores de los percentiles dependen de cómo se distribuyan las muestras. Cuando todas las muestras están en el bucket de muestra, el percentil 50 es el punto medio de ese bucket. Sin embargo, cuando las muestras se encuentran en diferentes buckets, esa distribución afecta las estimaciones.

Para determinar si el percentil 50 es una estimación razonable de la media, puedes comparar el valor medio con el percentil 50. El valor medio se muestra con los detalles del bucket.

¿Qué sigue?

Si quieres obtener información para visualizar las métricas con valor de distribución, consulta Acerca de las métricas con valores de distribución.