Las métricas con un tipo de valor Distribution en
Cloud Monitoring agrupan las mediciones de gran volumen en rangos de valores llamados
buckets en lugar de registrar cada dato individual. Registrar los recuentos de bucket como un histograma permite que los servicios resuman grandes conjuntos de mediciones para que puedas analizar estadísticas, como promedios y percentiles.
En los ejemplos de este documento, se muestra cómo el recuento de bucket, el ancho de bucket, la distribución de las mediciones y el tamaño de la muestra determinan los valores de percentil estimados sin almacenar mediciones individuales.
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. En este ejemplo, el bucket finito con el índice n+1 es el doble de 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 inferior a 20, los percentiles 95 y 99 siempre están en el mismo bucket.
Caso 1: La cantidad total de muestras es 1
Cuando hay una sola medición, los tres valores de percentil difieren, pero solo muestran los percentiles 50, 95 y 99 del mismo bucket. No se puede determinar el error entre la estimación y las mediciones reales porque no se conoce la medición.
Por ejemplo, supongamos que el histograma de mediciones es como 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 | 0 - 100 |
| 9 | 256 | 512 | 0 | 0 |
| 10 | 512 | 1024 | 0 | 0 |
| 11 | 1024 | 0 | 0 |
Para calcular el percentil 50, haz lo siguiente:
- 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.
Calcula la estimación con la siguiente regla:
pth percentile = bucket_low + (bucket_up - bucket_low)*(p - p_low)/(p_up - p_low)En la expresión anterior,
p_lowyp_upson los límites inferior y superior del rango de percentiles del bucket. Del mismo modo,bucket_lowybucket_upson los límites inferior y superior del bucket. Los valores dep_lowyp_updependen 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
= 192Para calcular el percentil 95, reemplaza 50 por 95 en la expresión
anterior. En 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 se puede limitar, pero no se puede determinar porque no se conoce 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 es como 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 | 40 - 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 antes para calcular los percentiles 50, 95 y 99. Por ejemplo, el percentil 50, que se encuentra 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
Del mismo modo, 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 muestra un percentil, el bucket correspondiente y el valor calculado:
| Percentil | Número de bucket | Valor | Error máximo |
|---|---|---|---|
| 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 se encuentra en el bucket número 8. Sin embargo, el cálculo del percentil es diferente. La diferencia se debe a cómo 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, las muestras 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 error potencial en los valores de percentil calculados.
Identifica el modelo de bucket
Para determinar los buckets que se usan para una métrica en 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 de una métrica, haz lo siguiente:
- Ve a la página web de
projects.timeSeries/list. 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 las latencias de las 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 Monitoring.
Haz clic en Ingresar.
A continuación, se muestra 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, hubo 3 mediciones y su valor promedio fue de 25.889. El campo bucketOptions 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:
| nth 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 de percentiles
Ahora que se conoce la configuración del bucket, para cualquier conjunto de mediciones, puedes predecir los valores de los percentiles 50, 95 y 99. 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,
además, 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_95oALIGN_PERCENTILE_99 - Período de alineación: 60 s
Para 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
}
}
]
},
En dos de las muestras, el percentil 50 se encuentra en el bucket 10; en la otra muestra, se encuentra en el bucket 11.
En la siguiente tabla, se muestran los resultados de ejecutar el 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 devuelven el modelo de bucket y los valores de la media. En las siguientes
tres filas, se enumeran los datos que se muestran cuando el alineador se establece 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 distribuyen las muestras. Cuando todas las muestras están en el mismo bucket, el percentil 50 es el punto medio de ese bucket. Sin embargo, cuando las muestras están 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 de la media con el percentil 50. El valor medio se devuelve con los detalles del bucket.