如何基于 Cloud Monitoring 告警空闲连接数?

解读

在国内金融、电商与政企云项目中,空闲连接数(idle connections) 是衡量 Cloud SQL 实例健康度的关键指标。空闲连接长期占用后端进程与内存,会导致:

  1. 新连接无法建立,触发 “too many connections” 错误;
  2. 连接池膨胀,引发 OOM 风险
  3. 高并发场景下 连接风暴 被误判为业务高峰,造成资源浪费。

面试官希望候选人能闭环回答:指标来源 → 阈值设计 → 告警通道 → 自动化处置,并体现 “可观测性+可运维性” 的云原生思维。

知识点

  1. Cloud SQL 自身指标database/postgresql/num_backendsdatabase/mysql/threads_connecteddatabase/sqlserver/connections;它们包含 idle + active 总量,需配合 state = 'idle' 的自定义指标或代理层指标。
  2. Cloud Monitoring 指标类型:GAUGE,采样周期 60 s,支持 reducer = MAX 聚合。
  3. MQL(Monitoring Query Language):国内大厂面试常要求手写,用于 过滤 idle 连接 并计算比例。
  4. 告警策略四要素:条件窗口、阈值、通知渠道(短信/钉钉/飞书 webhook)、文档化 Runbook。
  5. 合规要求:央行《金融云规范》要求 7×24 可观测,告警须 双通道(邮件+短信)并落库审计。
  6. 自动化响应:通过 Cloud Functions 调用 Cloud SQL Admin API 执行 pg_terminate_backend()mysql_kill,实现 自愈

答案

步骤一:暴露空闲连接指标
PostgreSQL 示例:

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

在 Cloud Monitoring 使用 MQL 自定义指标:

fetch gce_instance
| metric 'workload.googleapis.com/postgresql.idle_connections'
| filter (metric.database_id == 'project:region:instance-id')
| group_by 1m, [value_idle_connections_mean: mean(value.idle_connections)]
| every 1m

MySQL 可通过 performance_schema.threads 计算 PROCESSLIST_COMMAND='Sleep' 的数量,同样推送自定义指标。

步骤二:创建告警策略

  1. Cloud Console → Monitoring → Alerting → Create Policy
  2. 选择 “User-defined metric” 作为条件;
  3. 设置 窗口期 5 分钟、阈值 ≥ 200 个 idle 连接(可根据实例规格 max_connections × 20% 调整);
  4. 配置通知渠道:
    • 国内短信:绑定 阿里云短信网关 的 webhook;
    • 飞书群机器人:URL 填入 飞书自定义机器人
  5. 撰写 Runbook 链接(Confluence 页面),包含一键 kill 脚本与值班 escalation 表。

步骤三:自动化处置
部署 Cloud Functions(2nd gen),监听 Pub/Sub 告警 topic:

from google.cloud.sql.connector import Connector
import google.auth
def kill_idle(event, context):
    credentials, project = google.auth.default()
    connector = Connector()
    conn = connector.connect(
        "project:region:instance",
        "pg8000",
        user="cloudsqlsuperuser",
        db="postgres"
    )
    with conn.cursor() as cur:
        cur.execute("""
          SELECT pg_terminate_backend(pid)
          FROM pg_stat_activity
          WHERE state = 'idle'
            AND state_change < now() - interval '30 min'
          LIMIT 50;
        """)

函数通过 IAM 条件角色 roles/cloudsql.editor 授权,遵循 最小权限 原则。

步骤四:灰度与回滚
非生产环境 先压测,确认 kill 操作不会破坏长事务;使用 Terraform 管理告警策略,实现 GitOps 回滚

拓展思考

  1. 连接池治理:结合 HikariCPidleTimeoutmaxLifetime 参数,与 Cloud SQL 告警形成 双层防护
  2. 容量预测:利用 Cloud Monitoring 的 Forecasting API,提前 24 h 预测 idle 连接趋势,触发 自动扩容 read replica
  3. 多引擎统一观测:用 Grafana Cloud 侧加载 Cloud SQL 插件,把 MySQL、PostgreSQL、SQL Server 的 idle 指标归一到 “idle_conn_ratio” 一个面板,满足 混合云审计
  4. 成本优化:idle 连接长期高水位会抬高 最小 vCPU 计费基线,通过 Alert + Cloud Scheduler 每周生成 资源浪费报告,推动业务方整改,实现 FinOps 闭环。