← Back to DevBytes

Monitoring Spanner: Metrics, Alarms, and Dashboards

Monitoring Spanner: Metrics, Alarms, and Dashboards

Google Cloud Spanner is a fully managed, mission-critical relational database service that offers global consistency and horizontal scalability. While Spanner handles much of the operational heavy lifting automatically, effective monitoring remains essential for cost control, performance tuning, and early problem detection. This tutorial covers the metrics landscape, how to build alarms, and how to construct informative dashboards for your Spanner instances.

What Monitoring Surfaces Are Available

Spanner exposes monitoring data through three primary channels:

Key Metrics You Need to Know

Spanner metrics fall into several logical groups. Understanding these categories helps you build targeted dashboards and alarms.

Compute and Capacity Metrics

Throughput and Latency Metrics

Storage Metrics

Transaction and Lock Metrics

Why Monitoring Matters for Spanner

Unlike self-managed databases where you might monitor disk I/O or replication lag directly, Spanner abstracts away much of the infrastructure. Yet monitoring remains critical for three reasons:

How to Use Cloud Monitoring with Spanner

1. Accessing Built-in Spanner Dashboards

The Cloud Console provides a per-instance overview. Navigate to Spanner → Instances → [Your Instance] → Metrics. You'll see pre-built charts for CPU, operations, latency, and storage. This is the quickest way to spot-check instance health.

For a broader view, open Cloud Monitoring → Dashboards → Spanner. This dashboard aggregates metrics across all your Spanner instances, giving you a fleet-wide perspective.

2. Building Custom Dashboards with MQL

Monitoring Query Language (MQL) lets you fetch, filter, and aggregate Spanner metrics with precision. You can create custom dashboards that surface exactly what your team needs.

Here's an MQL query that retrieves CPU utilization for a specific instance, aggregated over 1-minute windows:

# Fetch CPU utilization for a specific Spanner instance
fetch spanner_instance
| metric 'spanner.googleapis.com/instance/cpu/utilization'
| filter resource.instance_id == 'my-production-instance'
| group_by 1m, [value_utilization_mean: mean(value.utilization)]
| every 1m
| window 5m

To create this dashboard via the gcloud CLI, first define the dashboard JSON:

{
  "displayName": "Spanner CPU Overview",
  "dashboardFilters": [],
  "mosaicLayout": {
    "columns": 2,
    "tiles": [
      {
        "title": "CPU Utilization - Prod Instance",
        "widget": {
          "timeSeriesQuery": {
            "timeSeriesQueryLanguage": "fetch spanner_instance\n| metric 'spanner.googleapis.com/instance/cpu/utilization'\n| filter resource.instance_id == 'my-production-instance'\n| group_by 1m, [value_utilization_mean: mean(value.utilization)]\n| every 1m\n| window 5m"
          },
          "plotType": "LINE"
        }
      }
    ]
  }
}

Then apply it with:

gcloud monitoring dashboards create --config dashboard.json

3. Querying Spanner Introspection Tables for Deeper Insights

Spanner exposes built-in introspection tables that provide transaction-level detail, lock statistics, and query performance data. These are queried directly via SQL and complement the Cloud Monitoring metrics.

-- Find the most frequently executed queries in the last 7 days
SELECT 
  query_text,
  request_count,
  avg_latency_seconds,
  avg_cpu_seconds
FROM spanner_sys.query_stats_top_mins(
  60,  -- minutes of history to analyze
  10   -- top N results
)
ORDER BY request_count DESC;

-- Inspect active lock conflicts in real time
SELECT 
  lock_table,
  lock_column,
  transaction_tag,
  wait_time_seconds
FROM spanner_sys.lock_stats_top_tables
ORDER BY wait_time_seconds DESC;

You can schedule a Cloud Function or Dataflow job to periodically query these tables and push derived metrics into Cloud Monitoring as custom metrics, enabling alerting on query-level regressions.

4. Creating Alarms (Alerting Policies)

Alerts turn passive monitoring into active protection. Spanner alerts are configured in Cloud Monitoring under Alerting → Policies. The most impactful alarms for Spanner fall into three tiers:

Tier 1 – Resource Saturation Alarms

Tier 2 – Performance Degradation Alarms

Tier 3 – Availability Alarms

Here's how to create a CPU utilization alert using gcloud:

gcloud alpha monitoring policies create \
  --display-name="Spanner High CPU - Production" \
  --condition="resource.type=\"spanner_instance\" metric.name=\"spanner.googleapis.com/instance/cpu/utilization\" filter=\"resource.instance_id==\"my-production-instance\"\" aggregations=\"duration=300s,alignment=mean,perSeriesAligner=mean\" comparison=\"COMPARISON_GT\" threshold=0.8 trigger=\"trigger_count=1,trigger_fraction=0.0\" duration=\"300s\"" \
  --notification-channels="projects/my-project/notificationChannels/123456789" \
  --alert-strategy="notification-prompts=OPENED,CLOSED"

For a more readable approach, define the alert in YAML and apply it:

# alert-policy.yaml
displayName: "Spanner High CPU - Production"
conditions:
  - displayName: "CPU utilization above 80% for 5 minutes"
    conditionThreshold:
      filter: >
        resource.type="spanner_instance"
        AND metric.name="spanner.googleapis.com/instance/cpu/utilization"
        AND resource.labels.instance_id="my-production-instance"
      aggregations:
        - alignmentPeriod: 300s
          perSeriesAligner: ALIGN_MEAN
      comparison: COMPARISON_GT
      thresholdValue: 0.8
      duration: 300s
      trigger:
        count: 1
notificationChannels:
  - "projects/my-project/notificationChannels/123456789"
alertStrategy:
  notificationPrompts:
    - OPENED
    - CLOSED

Apply with:

gcloud alpha monitoring policies create --policy-from-file=alert-policy.yaml

5. Setting Up Log-Based Metrics and Alerts

Some Spanner events appear only in audit logs, not in standard metrics. For example, autoscaler decisions, schema change completions, or IAM policy modifications. You can create log-based metrics to track and alert on these.

# Create a log-based metric for autoscaler scale-up events
gcloud logging metrics create spanner-autoscaler-scale-up \
  --description="Count of Spanner autoscaler scale-up events" \
  --log-filter='resource.type="spanner_instance" 
    protoPayload.methodName="google.spanner.admin.instance.v1.InstanceAdmin.Merge" 
    AND protoPayload.entity.metadata.instance.autoscaling="true"'

Once the metric exists, you can create an alerting policy on it just like any built-in metric. This lets you get notified when the autoscaler triggers, helping you correlate cost changes with capacity events.

Building a Comprehensive Spanner Dashboard

A well-designed dashboard tells a story. For Spanner, organize tiles into rows that answer key operational questions:

Here's an MQL snippet for a latency heatmap tile showing p95 read latency across multiple instances:

fetch spanner_instance
| metric 'spanner.googleapis.com/instance/read_latency'
| filter 
    resource.instance_id == 'instance-a' ||
    resource.instance_id == 'instance-b' ||
    resource.instance_id == 'instance-c'
| group_by 1m, [value_p95: percentile(95, value.latency)]
| every 1m
| window 10m

Best Practices for Spanner Monitoring

Automating Dashboard and Alert Deployment with Terraform

Managing monitoring configuration manually becomes unsustainable as your Spanner footprint grows. Terraform's Google Cloud provider supports both dashboard and alerting policy resources:

# terraform spanner-monitoring.tf

resource "google_monitoring_dashboard" "spanner_fleet" {
  dashboard_json = jsonencode({
    displayName = "Spanner Fleet Overview"
    mosaicLayout = {
      columns = 2
      tiles = [
        {
          title   = "CPU Utilization - All Prod"
          widget = {
            timeSeriesQuery = {
              timeSeriesQueryLanguage = <

Conclusion

Monitoring Spanner effectively requires a layered approach: lean on Cloud Monitoring's built-in metrics for infrastructure-level visibility, augment with introspection table queries for application-level insight, and wrap it all in alerting policies that surface problems before users feel them. By version-controlling your dashboards and alerts, tuning alarm thresholds to avoid noise, and continuously correlating metrics with cost data, you turn monitoring from a reactive chore into a proactive engineering practice. Start with the CPU and latency fundamentals covered here, then expand into SLO-based alerting and introspection-driven dashboards as your operational maturity grows.

🚀 Need a reliable AI agent for your project?

Deploy Hermes Agent in 10 minutes. Managed hosting, zero DevOps.

Get Started — $23.99/mo
← Back to all articles