Cloud Monitoring ListTimeSeries Request Generator
Use this skill to translate any Cloud Monitoring metric descriptor into valid,
production-ready ListTimeSeries REST API query parameters (name, filter,
interval.startTime, interval.endTime, aggregation.*, view).
CRITICAL RULES
- Mandatory Project ID Clarification: You MUST ensure the GCP Project ID
is present in the user prompt, input payload, or environment context (such
as via
gcloud config get-value project). If the Project ID is missing and
cannot be resolved, you MUST ask the user to clarify it before generating or
executing ListTimeSeries requests. Do NOT use placeholders for project
names.
Workflow
Inspect Metric Metadata
- Use Provided Metric Metadata First: If the user's prompt already
includes metric metadata such as
metric.type, metricKind, valueType,
resource types, or label keys, use those values directly instead of calling
API tools.
- Discover Missing Metadata: If exact metric descriptors including
metric.type, metricKind, and valueType are missing or underspecified,
resolve the target metric's descriptor using one of these paths:
- Vague Query: If the prompt is vague, such as asking for VM CPU
usage, use the
cloud-monitoring-metric-selection skill first to
identify the specific metric type.
- Known Metric Type: If you already have the specific metric type name
such as
compute.googleapis.com/instance/cpu/utilization, but need its
descriptor, call the list_metric_descriptors MCP tool. If the tool is
missing, refer to the cloud-monitoring-metric-selection skill to
configure the Cloud Monitoring MCP server.
- Fallback: If the MCP tool cannot be configured, fall back to making
a direct Cloud Monitoring API call.
- Identify Key Fields: From the retrieved descriptor, identify key schema
attributes:
type: The Cloud Monitoring metric type string.
metricKind: GAUGE, DELTA, or CUMULATIVE.
valueType: INT64, DOUBLE, DISTRIBUTION, or BOOL.
monitoredResourceTypes: Compatible resource.type strings, for
example ["cloudsql_database", "cloudsql_instance"]. If multiple
resource types are listed, select the specific resource.type that
matches the target granularity of the user's request.
Construct Monitoring Filter
The filter parameter is a mandatory string in Cloud Monitoring syntax that
restricts the query to a single metric.type and optional resource and metric
labels:
Single Metric Type Restriction: Every filter MUST specify exactly one
metric.type clause using an equality operator. For example:
metric.type = "compute.googleapis.com/instance/cpu/utilization"
Monitored Resource Type Filter: MUST include the resource.type filter
when the target resource granularity is known, preventing collisions across
services that share metric types or sub-resources. For example:
metric.type = "cloudsql.googleapis.com/database/cpu/utilization" AND resource.type = "cloudsql_database"
Preserve User Literals and IDs: You MUST use literal resource names,
IDs, zones, and project parameters provided by the user without alteration.
Do NOT override or replace user-specified identifiers with active resources
found during metric metadata discovery unless explicitly requested.
Label Type Prefixing:
- Prefix resource-level dimensions, such as instance ID, zone, project,
database ID, or subscription ID, with the
resource.labels. prefix. For
example:
resource.labels.instance_id = "123456789"
resource.labels.database_id = "my-project:my-instance"
- Prefix metric-level dimensions, such as state, command, response code,
or instance name metadata when stored on the metric, with the
metric.labels. prefix. For example:
metric.labels.state != "free"
metric.labels.instance_name = "instance-1"
Resource Name versus ID Resolution:
- If the user specifies a human-readable GCE VM instance name such as
"instance-1", but resource.labels.instance_id expects a numeric ID,
you MUST filter using either metric.labels.instance_name = "instance-1" or metadata.system_labels.name = "instance-1".
- Do NOT use
resource.metadata.name or resource.metadata.*. This
prefix is invalid in Cloud Monitoring filter syntax.
- Do NOT assign a string instance name directly to
resource.labels.instance_id unless the resource type explicitly uses
string IDs.
Database Identifier Labels: Database labels such as database_id for
Cloud SQL and Spanner, or dataset_id for BigQuery, use composite keys
formatted as <project_id>:<instance_name>. For example:
resource.labels.database_id = "my-project:foo".
Ops Agent Metrics State Label Filtering: For
agent.googleapis.com/memory/percent_used and
agent.googleapis.com/disk/percent_used metrics, you MUST use
metric.labels.state != "free". Do NOT filter by metric.labels.state = "used".
Choose Aggregation Structure
Select the perSeriesAligner, crossSeriesReducer, groupByFields, and
alignmentPeriod according to the metric properties and visualization goal:
- Consult the Aggregations Reference: You MUST include both
perSeriesAligner and crossSeriesReducer in the aggregation query
parameters of every request. Read and follow the
Cloud Monitoring ListTimeSeries Basic Aggregations Reference
to select the exact perSeriesAligner and crossSeriesReducer combinations
for your metric's Metric Kind and Value Type pairing, and to apply mandatory
SRE rules for utilization metrics, counters, distributions, and state-based
gauges such as memory filtered by state != "free".
- Grouping Fields and Resource Granularity: When
crossSeriesReducer is
specified as anything other than REDUCE_NONE, list the exact labels to
preserve. When querying multi-instance resources like VMs, databases, or
subscriptions, include the primary resource identifier in groupByFields.
For example, use resource.labels.instance_id for VMs or
resource.labels.database_id for databases. This prevents collapsing
separate resource streams into a single global aggregate.
- Alignment Period Determination: Calculate the query lookback duration
from
endTime minus startTime, ensuring startTime precedes endTime.
If endTime <= startTime, flag an error before computing duration. Set
alignmentPeriod according to Cloud Console default fine granularity
standards:
- Duration <= 110 minutes: Set
alignmentPeriod = "60s".
- Duration <= 23 hours: Set
alignmentPeriod = "300s".
- Duration <= 6 days: Set
alignmentPeriod = "3600s".
- Duration <= 23 days: Set
alignmentPeriod = "10800s".
- Duration <= 80 days: Set
alignmentPeriod = "21600s".
- Duration <= 180 days: Set
alignmentPeriod = "43200s".
- Duration <= 350 days: Set
alignmentPeriod = "86400s".
- Duration <= 500 days: Set
alignmentPeriod = "172800s".
- Omission Rule:
alignmentPeriod is omitted only when
perSeriesAligner is set to ALIGN_NONE.
Format Valid Request
Present the generated ListTimeSeries REST query parameters. For example:
{
"name": "projects/<project_id>",
"filter": "metric.type = \"<metric_type>\" AND resource.type = \"<resource_type>\"",
"interval": {
"startTime": "<iso_8601_start>",
"endTime": "<iso_8601_end>"
},
"aggregation": {
"alignmentPeriod": "60s",
"perSeriesAligner": "ALIGN_RATE",
"crossSeriesReducer": "REDUCE_SUM",
"groupByFields": [
"resource.labels.zone"
]
},
"view": "FULL"
}
- Aggregation Requirements: Populate the
aggregation parameters with the
perSeriesAligner, crossSeriesReducer, alignmentPeriod, and optional
groupByFields values determined during aggregation selection.
- Interval Requirements:
startTime and endTime MUST be valid RFC 3339
and ISO 8601 timestamps such as "YYYY-MM-DDTHH:MM:SSZ". If not explicitly
provided by the user, dynamically compute a one-hour lookback interval
ending at the current time, where endTime is the present moment and
startTime is one hour prior. Do NOT hardcode static dates from examples.
- Alignment Period Requirement: Determine
alignmentPeriod from the
lookback duration of endTime minus startTime using the mapping above.
For the default one-hour lookback interval, alignmentPeriod is "60s".
- View Requirement: MUST default to
"FULL" when time series data points
are needed, or "HEADERS" when inspecting metadata and series identities
only.
Validate Request via list_timeseries MCP Tool
You MUST validate the generated request parameters against live Cloud Monitoring
telemetry before returning the final output. Call the list_timeseries MCP tool
passing all generated query parameters (name, filter, interval,
aggregation). When validating you MUST set view="HEADERS" to minimize
latency and payload size while verifying request structure. A response without
API errors confirms that your filter and aggregation settings are valid.
If the list_timeseries tool is unavailable, fall back to a direct API call.
References
1---2name: cloud-monitoring-list-time-series-request3description: Generates valid Cloud Monitoring ListTimeSeries requests and aggregation specifications from metric descriptors and resource parameters. Use when asked to create, generate, format, or build ListTimeSeries requests, JSON payloads, filter expressions, or aligner/reducer aggregations for Cloud Monitoring metrics and charts. Don't use for metric discovery or metric selection.4---56# Cloud Monitoring ListTimeSeries Request Generator78Use this skill to translate any Cloud Monitoring metric descriptor into valid,9production-ready `ListTimeSeries` REST API query parameters (`name`, `filter`,10`interval.startTime`, `interval.endTime`, `aggregation.*`, `view`).1112## CRITICAL RULES1314* **Mandatory Project ID Clarification**: You MUST ensure the GCP Project ID15 is present in the user prompt, input payload, or environment context (such16 as via `gcloud config get-value project`). If the Project ID is missing and17 cannot be resolved, you MUST ask the user to clarify it before generating or18 executing `ListTimeSeries` requests. Do NOT use placeholders for project19 names.2021## Workflow2223### Inspect Metric Metadata24251. **Use Provided Metric Metadata First**: If the user's prompt already26 includes metric metadata such as `metric.type`, `metricKind`, `valueType`,27 resource types, or label keys, use those values directly instead of calling28 API tools.292. **Discover Missing Metadata**: If exact metric descriptors including30 `metric.type`, `metricKind`, and `valueType` are missing or underspecified,31 resolve the target metric's descriptor using one of these paths:32 * **Vague Query**: If the prompt is vague, such as asking for VM CPU33 usage, use the `cloud-monitoring-metric-selection` skill first to34 identify the specific metric type.35 * **Known Metric Type**: If you already have the specific metric type name36 such as `compute.googleapis.com/instance/cpu/utilization`, but need its37 descriptor, call the `list_metric_descriptors` MCP tool. If the tool is38 missing, refer to the `cloud-monitoring-metric-selection` skill to39 configure the Cloud Monitoring MCP server.40 * **Fallback**: If the MCP tool cannot be configured, fall back to making41 a direct Cloud Monitoring API call.423. **Identify Key Fields**: From the retrieved descriptor, identify key schema43 attributes:44 * **`type`**: The Cloud Monitoring metric type string.45 * **`metricKind`**: `GAUGE`, `DELTA`, or `CUMULATIVE`.46 * **`valueType`**: `INT64`, `DOUBLE`, `DISTRIBUTION`, or `BOOL`.47 * **`monitoredResourceTypes`**: Compatible `resource.type` strings, for48 example `["cloudsql_database", "cloudsql_instance"]`. If multiple49 resource types are listed, select the specific `resource.type` that50 matches the target granularity of the user's request.5152--------------------------------------------------------------------------------5354### Construct Monitoring Filter5556The `filter` parameter is a mandatory string in Cloud Monitoring syntax that57restricts the query to a single `metric.type` and optional resource and metric58labels:59601. **Single Metric Type Restriction**: Every `filter` MUST specify exactly one61 `metric.type` clause using an equality operator. For example:62 * `metric.type = "compute.googleapis.com/instance/cpu/utilization"`632. **Monitored Resource Type Filter**: MUST include the `resource.type` filter64 when the target resource granularity is known, preventing collisions across65 services that share metric types or sub-resources. For example:66 * `metric.type = "cloudsql.googleapis.com/database/cpu/utilization" AND67 resource.type = "cloudsql_database"`683. **Preserve User Literals and IDs**: You MUST use literal resource names,69 IDs, zones, and project parameters provided by the user without alteration.70 Do NOT override or replace user-specified identifiers with active resources71 found during metric metadata discovery unless explicitly requested.72734. **Label Type Prefixing**:7475 * Prefix resource-level dimensions, such as instance ID, zone, project,76 database ID, or subscription ID, with the `resource.labels.` prefix. For77 example:78 * `resource.labels.instance_id = "123456789"`79 * `resource.labels.database_id = "my-project:my-instance"`80 * Prefix metric-level dimensions, such as state, command, response code,81 or instance name metadata when stored on the metric, with the82 `metric.labels.` prefix. For example:83 * `metric.labels.state != "free"`84 * `metric.labels.instance_name = "instance-1"`85865. **Resource Name versus ID Resolution**:8788 * If the user specifies a human-readable GCE VM instance name such as89 `"instance-1"`, but `resource.labels.instance_id` expects a numeric ID,90 you MUST filter using either `metric.labels.instance_name =91 "instance-1"` or `metadata.system_labels.name = "instance-1"`.92 * Do NOT use `resource.metadata.name` or `resource.metadata.*`. This93 prefix is invalid in Cloud Monitoring filter syntax.94 * Do NOT assign a string instance name directly to95 `resource.labels.instance_id` unless the resource type explicitly uses96 string IDs.97986. **Database Identifier Labels**: Database labels such as `database_id` for99 Cloud SQL and Spanner, or `dataset_id` for BigQuery, use composite keys100 formatted as `<project_id>:<instance_name>`. For example:101 `resource.labels.database_id = "my-project:foo"`.1021037. **Ops Agent Metrics State Label Filtering**: For104 `agent.googleapis.com/memory/percent_used` and105 `agent.googleapis.com/disk/percent_used` metrics, you MUST use106 `metric.labels.state != "free"`. Do NOT filter by `metric.labels.state =107 "used"`.108109--------------------------------------------------------------------------------110111### Choose Aggregation Structure112113Select the `perSeriesAligner`, `crossSeriesReducer`, `groupByFields`, and114`alignmentPeriod` according to the metric properties and visualization goal:1151161. **Consult the Aggregations Reference**: You MUST include both117 `perSeriesAligner` and `crossSeriesReducer` in the `aggregation` query118 parameters of every request. Read and follow the119 [Cloud Monitoring ListTimeSeries Basic Aggregations Reference](references/basic_aggregations.md)120 to select the exact `perSeriesAligner` and `crossSeriesReducer` combinations121 for your metric's Metric Kind and Value Type pairing, and to apply mandatory122 SRE rules for utilization metrics, counters, distributions, and state-based123 gauges such as memory filtered by `state != "free"`.1242. **Grouping Fields and Resource Granularity**: When `crossSeriesReducer` is125 specified as anything other than `REDUCE_NONE`, list the exact labels to126 preserve. When querying multi-instance resources like VMs, databases, or127 subscriptions, include the primary resource identifier in `groupByFields`.128 For example, use `resource.labels.instance_id` for VMs or129 `resource.labels.database_id` for databases. This prevents collapsing130 separate resource streams into a single global aggregate.1313. **Alignment Period Determination**: Calculate the query lookback duration132 from `endTime` minus `startTime`, ensuring `startTime` precedes `endTime`.133 If `endTime <= startTime`, flag an error before computing duration. Set134 `alignmentPeriod` according to Cloud Console default fine granularity135 standards:136 * **Duration <= 110 minutes**: Set `alignmentPeriod = "60s"`.137 * **Duration <= 23 hours**: Set `alignmentPeriod = "300s"`.138 * **Duration <= 6 days**: Set `alignmentPeriod = "3600s"`.139 * **Duration <= 23 days**: Set `alignmentPeriod = "10800s"`.140 * **Duration <= 80 days**: Set `alignmentPeriod = "21600s"`.141 * **Duration <= 180 days**: Set `alignmentPeriod = "43200s"`.142 * **Duration <= 350 days**: Set `alignmentPeriod = "86400s"`.143 * **Duration <= 500 days**: Set `alignmentPeriod = "172800s"`.144 * **Omission Rule**: `alignmentPeriod` is omitted only when145 `perSeriesAligner` is set to `ALIGN_NONE`.146147--------------------------------------------------------------------------------148149### Format Valid Request150151Present the generated `ListTimeSeries` REST query parameters. For example:152153```json154{155 "name": "projects/<project_id>",156 "filter": "metric.type = \"<metric_type>\" AND resource.type = \"<resource_type>\"",157 "interval": {158 "startTime": "<iso_8601_start>",159 "endTime": "<iso_8601_end>"160 },161 "aggregation": {162 "alignmentPeriod": "60s",163 "perSeriesAligner": "ALIGN_RATE",164 "crossSeriesReducer": "REDUCE_SUM",165 "groupByFields": [166 "resource.labels.zone"167 ]168 },169 "view": "FULL"170}171```172173* **Aggregation Requirements**: Populate the `aggregation` parameters with the174 `perSeriesAligner`, `crossSeriesReducer`, `alignmentPeriod`, and optional175 `groupByFields` values determined during aggregation selection.176* **Interval Requirements**: `startTime` and `endTime` MUST be valid RFC 3339177 and ISO 8601 timestamps such as `"YYYY-MM-DDTHH:MM:SSZ"`. If not explicitly178 provided by the user, dynamically compute a one-hour lookback interval179 ending at the current time, where `endTime` is the present moment and180 `startTime` is one hour prior. Do NOT hardcode static dates from examples.181* **Alignment Period Requirement**: Determine `alignmentPeriod` from the182 lookback duration of `endTime` minus `startTime` using the mapping above.183 For the default one-hour lookback interval, `alignmentPeriod` is `"60s"`.184* **View Requirement**: MUST default to `"FULL"` when time series data points185 are needed, or `"HEADERS"` when inspecting metadata and series identities186 only.187188--------------------------------------------------------------------------------189190### Validate Request via list_timeseries MCP Tool191192You MUST validate the generated request parameters against live Cloud Monitoring193telemetry before returning the final output. Call the `list_timeseries` MCP tool194passing all generated query parameters (`name`, `filter`, `interval`,195`aggregation`). When validating you MUST set `view="HEADERS"` to minimize196latency and payload size while verifying request structure. A response without197API errors confirms that your filter and aggregation settings are valid.198199If the `list_timeseries` tool is unavailable, fall back to a direct API call.200201--------------------------------------------------------------------------------202203## References204205* [Cloud Monitoring ListTimeSeries Basic Aggregations Reference](references/basic_aggregations.md)206* [Cloud Monitoring Monitored Resource Types Reference](https://docs.cloud.google.com/monitoring/api/resources.md.txt)207* [Cloud Monitoring Filter Syntax](https://docs.cloud.google.com/monitoring/api/v3/filters.md.txt)208* [Cloud Monitoring REST API Reference: projects.timeSeries.list](https://docs.cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list.md.txt)