Para recuperar los datos de costos y uso con la API de App Optimize, primero debes crear un informe. Este recurso actúa como una definición persistente de los datos que deseas analizar, y especifica parámetros como el alcance, las dimensiones, el período y los filtros.
Después de crear un informe, la API genera los datos solicitados de forma asíncrona. Luego, usa el nombre del recurso del informe para recuperar el conjunto de datos resultante.
Por lo tanto, el flujo de trabajo es el siguiente:
- Creas un informe en el que especificas tus criterios.
- El sistema procesa esta solicitud de forma asíncrona.
- Cuando se completa la operación, lees los datos resultantes.
En este documento, se detallan la estructura y los parámetros configurables de los informes de la API de App Optimize, incluidas las dimensiones, las métricas y las opciones de filtrado disponibles, y se explica el formato de los datos que se devuelven.
Para obtener información sobre las limitaciones de costos y uso, consulta Cómo comprender los datos.
Define un informe
Para crear un informe, debes definir un recurso Report con los siguientes parámetros de configuración, que se describen en las siguientes subsecciones:
| Parámetro | Tipo | Descripción |
|---|---|---|
scopes |
Arreglo | Es el proyecto o la aplicación de App Hub que se analizará. Debes proporcionar exactamente un elemento de alcance. |
dimensions |
Arreglo | Son los atributos por los que se recuperan y agrupan los datos, incluidos los agrupamientos basados en el tiempo. |
metrics |
Arreglo | Son las mediciones específicas que se devolverán. |
filter |
String | Es una expresión de Common Expression Language (CEL) para reducir los datos, incluidos los períodos. |
Permisos
El campo scopes define el conjunto de recursos que analizará la API de App Optimize. Aunque el campo es un array, debes especificar exactamente un elemento, que puede ser un proyecto o una aplicación de App Hub:
project: Es una cadena que representa un proyecto de Google Cloud . Debe tener el siguiente formato:projects/PROJECT_IDReemplaza
PROJECT_IDpor el ID de tu proyecto de Google Cloud . Por ejemplo,projects/my-project-1.application: Es una cadena que representa el nombre completo del recurso de una aplicación del App Hub. Debe tener el siguiente formato:projects/PROJECT_ID/locations/LOCATION/applications/APPLICATION_IDReemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto host del Centro de aplicaciones.LOCATION: Es la región de la aplicación de App Hub, comous-central1.APPLICATION_ID: Es el ID de la aplicación de App Hub.
Por ejemplo,
projects/my-host-proj/locations/us-central1/applications/my-app.
A continuación, se muestran ejemplos de arrays scopes en JSON para una solicitud de creación de informes, en los que se muestra un solo elemento de alcance:
Delimitación del alcance por proyecto:
"scopes": [ { "project": "projects/my-project-1" } ]Alcance por aplicación:
"scopes": [ { "application": "projects/my-host-proj/locations/us-central1/applications/my-app" } ]
Dimensiones
Las dimensiones determinan qué datos se devuelven y cómo se agrupan.
Por ejemplo, si seleccionas project y product_display_name, el resultado contendrá una fila para cada combinación única de valores de nombre del proyecto y nombre del producto que se encuentren en los datos.
A continuación, se incluye una tabla de las dimensiones admitidas:
| Dimensión | Tipo | Descripción | Valor de ejemplo |
|---|---|---|---|
project |
STRING | ID del proyecto Google Cloud | projects/my-project |
application |
STRING | Es la aplicación de App Hub. | projects/my-project/locations/us-central1/applications/my-app |
service_or_workload |
STRING | Es el servicio o la carga de trabajo de App Hub. | projects/my-project/locations/us-central1/applications/my-app/services/my-service |
resource |
STRING | Es el nombre completo del recurso. | //compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/vm-1 |
resource_type |
STRING | Es el tipo de recurso de la API. | compute.googleapis.com/Instance |
location |
STRING | Es la Google Cloud región o multirregión. | us-east1 |
sku |
STRING | Es el ID del SKU de facturación. | 4496-8C0D-228F |
product_display_name |
STRING | Es el nombre del producto Google Cloud . | Compute Engine |
month |
STRING | El año y el mes. | 2024-01 |
day |
STRING | El año, el mes y el día. | 2024-01-10 |
hour |
STRING | Año, mes, día y hora. | 2024-01-10T00 |
La dimensión location representa la Google Cloud región o multirregión
a la que se atribuyen los costos y el uso. La forma en que se informa esta ubicación depende de la configuración de ubicación de los recursos incluidos en el alcance del informe:
- En el caso de los recursos implementados en una zona específica, como
us-central1-a, los costos y el uso se agregan y se atribuyen a la región principal. En este ejemplo, la dimensiónlocationmostraríaus-central1. - En el caso de los recursos implementados en una región, como
us-central1, la dimensiónlocationrefleja esa región específica. - En el caso de los recursos implementados o configurados para una región múltiple, como
us, la dimensiónlocationrefleja esa región múltiple.
Dimensiones de tiempo
Para agregar los resultados por período, incluye al menos una dimensión de tiempo, como month, day o hour, en la lista dimensions. Ten en cuenta lo siguiente:
- Todas las dimensiones de tiempo usan la hora del Pacífico y respetan el horario de verano (DST).
- Los formatos siguen la norma ISO 8601.
- Si el período del
filterno se alinea perfectamente con la granularidad de la dimensión de tiempo seleccionada, el período se expande para abarcar los períodos completos. Por ejemplo, si filtras los datos para incluir parte de un día condimension: ["month"], se incluirán los datos de todo el mes.
Métricas
Las métricas son los valores cuantitativos que deseas medir para cada grupo definido por tus dimensiones. Las métricas admitidas son las siguientes:
| Métrica | Tipo | Descripción |
|---|---|---|
cost |
RECORD | Es el costo monetario en la moneda solicitada. |
cpu_mean_utilization |
FLOAT64 | Uso promedio de CPU (de 0.0 a 1.0). |
cpu_p95_utilization |
FLOAT64 | Uso de CPU del percentil 95 (de 0.0 a 1.0). |
cpu_usage_core_seconds |
INT64 | Es el trabajo total de la CPU realizado. |
cpu_allocation_core_seconds |
INT64 | Es la capacidad total de CPU aprovisionada. |
memory_mean_utilization |
FLOAT64 | Es el uso promedio de memoria (de 0.0 a 1.0). |
memory_p95_utilization |
FLOAT64 | Uso de memoria del percentil 95 (de 0.0 a 1.0). |
memory_usage_byte_seconds |
INT64 | Memoria total usada con el tiempo. |
memory_allocation_byte_seconds |
INT64 | Es la memoria total aprovisionada con el tiempo. |
Combinaciones válidas
No todas las dimensiones se pueden combinar con todas las métricas de la API de App Optimize. En la siguiente tabla, se muestran ejemplos de conjuntos de dimensiones válidos y las métricas que puedes usar con ellos. La API mostrará un error si se solicita una combinación no válida. Consulta ese error para conocer las combinaciones válidas.
| Dimensiones | Admite la métrica cost |
Admite la métrica cpu_mean_utilization |
|---|---|---|
application, product_display_name |
||
application |
||
location, product_display_name, project, resource, resource_type, sku |
||
location, product_display_name, project, resource, resource_type |
||
location, product_display_name, project, service_or_workload |
||
location, product_display_name, project y sku |
||
product_display_name, project |
||
product_display_name, resource_type |
||
product_display_name, resource |
||
product_display_name |
||
project |
Filtros
Usa el campo filter para acotar los datos con una cadena de CEL.
Puedes crear tus expresiones de filtro con cualquiera de los campos que se indican en la tabla Dimensiones.
El filtrado debe cumplir con estas restricciones:
- Todos los predicados de campos de cadena deben usar coincidencias exactas de cadenas. Por ejemplo,
location == 'us-east1'. - Los predicados múltiples que hacen referencia al mismo campo de cadena deben unirse con el operador lógico OR,
||. Por ejemplo,location == 'us-east1' || location == 'us-west1' - Todos los demás predicados deben unirse con el operador lógico AND,
&&. - Un predicado en una dimensión temporal, como
day, que especifica la hora de inicio debe usar la comparación mayor o igual que,>=. - Un predicado en una dimensión temporal que especifica la hora de finalización debe usar la comparación menor que,
<.
Intervalo de tiempo
Si filter omite las dimensiones de tiempo (month, day, hour), el informe se establece de forma predeterminada en un período de siete días que finaliza a la medianoche anterior (hora del Pacífico), respetando el horario de verano. El período máximo es de 90 días antes de la fecha actual, y la hora de inicio debe estar dentro del período de 90 días.
Por ejemplo, si la hora del Pacífico actual es 2026-01-05T12:00:00, el rango predeterminado es de 2025-12-29T00:00:00 a 2026-01-05T00:00:00, hora del Pacífico. La hora de inicio más temprana del intervalo es 2025-10-07T00:00:00.
Las métricas de Cloud Run solo están disponibles durante seis semanas antes de la fecha actual.
Filtros de ejemplo
A continuación, se incluyen algunos ejemplos de cómo puedes estructurar tus cadenas de filtro de CEL:
Para filtrar los datos del informe para un tipo de recurso específico, usa el operador
==en la dimensiónresource_type:resource_type == 'compute.googleapis.com/Instance'Para incluir solo los datos de una sola ubicación, aplica un filtro en la dimensión
location:location == 'us-east1'Para incluir datos de una lista específica de ubicaciones, usa el operador
||para combinar condiciones en la dimensiónlocation:location == 'us-east1' || location == 'us-west1'Para obtener datos dentro de un período específico con una granularidad por hora, puedes filtrar por la dimensión
hour. Este ejemplo incluye datos desde el inicio del 2024-01-01 hasta el 2024-02-01, sin incluir este último día:hour >= timestamp('2024-01-01T00:00:00Z') && hour < timestamp('2024-02-01T00:00:00Z')Para filtrar por días completos, usa la dimensión
day. Ten en cuenta que los límites de los días se interpretan en la hora del Pacífico, por lo que especificar el desplazamiento es una práctica recomendada. Este ejemplo incluye todos los datos del 15 y el 16 de marzo de 2024:day >= timestamp('2024-03-15T00:00:00-07:00') && day < timestamp('2024-03-17T00:00:00-07:00')Del mismo modo, puedes filtrar por meses calendario con la dimensión
month, teniendo en cuenta el horario del Pacífico para los límites exactos. En este ejemplo, se incluyen todos los datos de octubre y noviembre de 2025:month >= timestamp('2025-10-01T00:00:00-07:00') && month < timestamp('2025-12-01T00:00:00-08:00')Para obtener datos de las últimas 72 horas, usa las funciones
now()yduration()en la dimensiónhour:hour >= now() - duration('72h')Para obtener datos de los últimos siete días, puedes usar
duration()con la dimensiónhour:hour >= now() - duration('168h')Para filtrar por un mes calendario específico, como el anterior, es necesario calcular las marcas de tiempo de inicio y finalización en el código de la aplicación. Luego, insertas esas marcas de tiempo calculadas en la expresión CEL. Conceptualmente, podría verse así, con un filtro en la dimensión
day:day >= timestamp('START_OF_LAST_MONTH') && day < timestamp('START_OF_THIS_MONTH')Reemplaza lo siguiente:
START_OF_LAST_MONTH: Es la cadena de marca de tiempo ISO 8601 que representa el comienzo del mes anterior en la zona horaria del Pacífico, como2025-12-01T00:00:00-08:00.START_OF_THIS_MONTH: Es la cadena de marca de tiempo ISO 8601 que representa el comienzo del mes actual en la zona horaria del Pacífico, como2026-01-01T00:00:00-08:00.
Debes calcular estas cadenas de marcas de tiempo exactas en el código de tu aplicación, teniendo en cuenta la fecha actual, la zona horaria (hora del Pacífico) y las transiciones del horario de verano.
Puedes combinar filtros de cadena y de tiempo con el operador
&&. En este ejemplo, se filtran dos ubicaciones dentro de un período específico de dos meses:(location == 'us-east1' || location == 'us-west1') && hour >= timestamp('2023-12-01T00:00:00Z') && hour < timestamp('2024-02-01T00:00:00Z')Este es un ejemplo más complejo que combina
resource_type,projecty un rango de tiempo basado enday:resource_type == 'compute.googleapis.com/Instance' && project == 'projects/my-project' && day >= timestamp('2025-01-01T00:00:00-08:00') && day < timestamp('2025-02-01T00:00:00-08:00')
Estructura de los datos del informe
Cuando lees un informe correctamente, el servicio devuelve los datos como columns y rows.
Columnas
El array columns describe el esquema de los datos, en el orden en que aparece cada campo en rows. Cada objeto del array columns tiene un name, un type y, a veces, un columns anidado si el tipo es RECORD.
- Las dimensiones que solicitaste aparecen como campos con el tipo
STRING. - Las métricas que solicitaste aparecen como campos con tipos como
INT64,FLOAT64oRECORDpara tipos complejos comocost.
Por ejemplo, con la API de REST, si solicitas dimensions: ["application", "product_display_name"] y metrics: ["cost", "cpu_mean_utilization"], la API de App Optimize genera en la respuesta un array columns como el siguiente:
"columns": [
{
"name": "application",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "product_display_name",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "cost",
"type": "RECORD",
"mode": "NULLABLE",
"columns": [
{
"name": "currency_code",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "units",
"type": "INT64",
"mode": "NULLABLE"
},
{
"name": "nanos",
"type": "INT64",
"mode": "NULLABLE"
}
]
},
{
"name": "cpu_mean_utilization",
"type": "FLOAT64",
"mode": "NULLABLE"
}
]
Filas
El campo rows contiene los datos reales. Cada fila es un array de valores que representa un solo registro. El orden de los valores dentro de cada array interno corresponde directamente al orden de los campos definidos en el array columns.
Continuando con el ejemplo en el que se solicitaron application, product_display_name, cost y cpu_mean_utilization desde la API de REST, una sola fila en el array rows generado podría verse de la siguiente manera:
"rows": [
[
"//apphub.googleapis.com/projects/my-proj/locations/us-central1/applications/my-app",
"Compute Engine",
{
"currency_code": "USD",
"units": "12",
"nanos": 750000000
},
0.65
],
[
"//apphub.googleapis.com/projects/my-proj/locations/us-east1/applications/another-app",
"Cloud Storage",
{
"currency_code": "USD",
"units": "5",
"nanos": 200000000
},
0.15
]
]
En la siguiente tabla, se visualiza cómo se asignan los valores dentro de un array de una sola fila al esquema definido en el array columns, utilizando el índice del valor en el array de la fila:
| Índice dentro de la fila | Columna correspondiente | Tipo | Valor de ejemplo |
|---|---|---|---|
| 0 | application |
STRING | "//apphub.googleapis.com/.../applications/my-app" |
| 1 | product_display_name |
STRING | "Cloud Storage" |
| 2 | cost |
RECORD | { "currency_code": "USD", "units": "10", ... } |
| 3 | cpu_mean_utilization |
FLOAT64 | 0.65 |
Cada elemento de la lista rows es un array en el que el orden de los valores coincide con el orden de las definiciones de campo en el array columns. Por lo tanto, el valor en el índice n de cualquier array de filas determinado corresponde a la columna definida en el índice n del array columns.
Cómo interpretar las métricas de costos
Cuando un informe incluye la métrica cost, el valor se devuelve como un RECORD que contiene los siguientes campos, según el tipo estándar google.type.Money:
| Campo | Tipo | Descripción |
|---|---|---|
currency_code |
STRING | Es el código de moneda de tres letras según la norma ISO 4217, como "USD". |
units |
INT64 | La unidad entera del importe. |
nanos |
INT64 | Son las unidades de nano (10-9) de la cantidad. Debe ser un valor entre -999,999,999 y +999,999,999, inclusive. |
Para obtener el valor monetario completo, combina los campos units y nanos.
El campo nanos representa la parte fraccionaria del valor de la moneda.
Por ejemplo:
Si
currency_codees "USD",unitses106ynanoses321590000: El valor es 106 + (321,590,000 / 1,000,000,000) = 106.32159 USD.Si
currency_codees "EUR",unitses5ynanoses750000000, el valor es 5 + (750,000,000 / 1,000,000,000) = 5.75 EUR.
Por lo general, usarías una biblioteca de formato de moneda estándar para mostrar este valor en un formato fácil de usar, incluido el símbolo de moneda adecuado.
Para obtener más información sobre los datos que devuelve la API y comprender sus limitaciones, consulta Comprende los datos.
Vencimiento del informe
Cada informe se borra automáticamente del servicio de la API de App Optimize 24 horas después de su creación. Después de este tiempo, no se podrá recuperar el informe ni sus datos a través de la API. Para verificar la hora de vencimiento programada de un informe, obtén sus metadatos y consulta el campo expireTime.
¿Qué sigue?
- Cómo crear un informe
- Informes de listas
- Obtén los metadatos de un informe
- Cómo leer los datos de un informe
- Cómo borrar un informe