Snowflake Postgres 指标

Snowflake Postgres 会自动收集实例指标并将其存储在您账户的活动 事件表 中。监控代理大约每 5-30 秒对指标进行一次采样,具体取决于指标类型,并将其写入 SNOWFLAKE.TELEMETRY.EVENTS,且 RECORD_TYPE = 'METRIC'

您可以直接在 Snowflake 中查询这些指标,也可以将其转发到外部可观察性平台,例如 Grafana 或 Observe。

备注

有关从事件表中查询 Postgres 日志 数据的信息,请参阅 Snowflake Postgres 日志记录

可用指标

Postgres 指标

指标

类型

描述

postgres_connections

gauge

活动后端连接数

postgres_databases_size_bytes

gauge

所有数据库的总大小(字节)

postgres_wal_size_bytes

gauge

WAL 目录大小(字节)

postgres_log_size_bytes

gauge

日志目录大小(字节)

postgres_tmp_size_bytes

gauge

临时文件大小(字节)

postgres_locking_transactions

gauge

授予的锁数量

postgres_locked_transactions

gauge

等待/被阻塞的锁数量

server_version

gauge

整数形式的 Postgres 版本(例如,180003 = 18.0.3)

Postgres 进程指标

指标

类型

单位

维度

process.cpu.time

sum

seconds

state (user, system, wait) process.command, process.executable.name, process.owner, process.pid, process.parent_pid

process.memory.usage

sum

bytes

process.command, process.executable.name, process.owner, process.pid, process.parent_pid

process.memory.virtual

sum

bytes

process.command, process.executable.name, process.owner, process.pid, process.parent_pid

备注

每个 Postgres 进程会针对每一种 CPU 状态有一个 process.cpu.time 行,并且分别针对 process.memory.usageprocess.memory.virtual 各有一行。

process.* 维度属性位于每一行的 resource_attributes 列中。与其他指标的 state 值一样,state 维度属性位于 record_attributes 列中。

CPU 指标

指标

类型

单位

维度

system.cpu.time

sum

seconds

state: user, system, wait, idle, nice, interrupt, softirq, steal cpu: cpu#

system.cpu.load_average.1m

gauge

threads

---

system.cpu.load_average.5m

gauge

threads

---

system.cpu.load_average.15m

gauge

threads

---

备注

每个 cpu#(例如 cpu0 和 cpu2)都会针对每一种 system.cpu.time 状态生成一个 CPU 行。

system.cpu.time 是累积计数器。要获得百分比,请计算连续样本之间的增量,然后除以经过的时间间隔。

内存指标

指标

类型

单位

维度

system.memory.usage

sum

bytes

state: used, free, cached, buffered, slab_reclaimable, slab_unreclaimable

备注

每一种状态都会对应一个 system.memory.usage 行。

磁盘指标

指标

类型

单位

维度

system.filesystem.usage

sum

bytes

mountpoint, device, state (used, free), type, mode

备注

每一种状态都会对应一个 system.filesystem.usage 行。

网络指标

指标

类型

单位

维度

system.network.io

sum

bytes

device, direction (transmit, receive)

备注

每个设备(“eth0”和“lo”)都会针对每个方向各有一个 system.network.io 行。

分页指标

指标

类型

单位

维度

system.paging.usage

sum

bytes

device, state (used, free)

备注

每一种状态都会对应一个 system.paging.usage 行。

资源属性

每个指标行在 RESOURCE_ATTRIBUTES 中都包含以下字段:

属性

描述

示例

instance_id

Postgres 实例标识符

4jypgsndvzd5ta6ufaryx6owja

host_name

服务器主机名

df6m4y5m5fgfpb5idy2pj67xrm

host.id

EC2 实例 ID

i-0f6724aef472706a3

host.type

实例系列

m8g.medium

cloud.region

AWS 区域

us-west-2

cloud.availability_zone

可用区

us-west-2b

application

始终为 postgres

postgres

os.type

始终为 linux

linux

查询指标

给定的 Snowflake Postgres 实例可以在任何给定时间运行多个服务器,例如主服务器及其 HA 服务器,或是等待实例的维护时段切换到位的升级替换。由于每个服务器都会报告实例给定 instance_id 的指标,因此您还需要实例当前活动服务器的服务器 host_name

要查找 Postgres 实例的 instance_id,请使用 DESCRIBE POSTGRES INSTANCE

DESCRIBE POSTGRES INSTANCE my_instance
  ->> SELECT "value"
      FROM $1
      WHERE "property" = 'host';

实例的 instance_id 是返回 host 值的第一段(第一个句点之前的所有内容)。

备注

您可以使用 SHOW POSTGRES INSTANCES 命令输出的 host 列,查看账户中所有正在运行的 Snowflake Postgres 实例的实例主机值。

要查找实例的当前服务器 host_name,可以对该实例的 DNS 值执行简单的 CNAME host 查询。

假设返回的 host 值为“4jypgsndvzd5ta6ufaryx6owja.sfengineering-pgtest.preprod.us-west-2.aws.postgres.snowflake.app”(因此我们知道实例的 instance_id 是“4jypgsndvzd5ta6ufaryx6owja”)。

以下是使用 dig CLI 工具执行 DNS CNAME 查找的示例:

$ dig cname +short 4jypgsndvzd5ta6ufaryx6owja.sfengineering-pgtest.preprod.us-west-2.aws.postgres.snowflake.app
df6m4y5m5fgfpb5idy2pj67xrm.4jypgsndvzd5ta6ufaryx6owja.sfengineering-pgtest.preprod.us-west-2.aws.postgres.snowflake.app.

以下是使用 Python 的 dns.resolver 模块的示例:

>>> import dns.resolver
>>> answer = dns.resolver.resolve('4jypgsndvzd5ta6ufaryx6owja.sfengineering-pgtest.preprod.us-west-2.aws.postgres.snowflake.app', 'CNAME')
>>> print(answer[0].target.to_text())
df6m4y5m5fgfpb5idy2pj67xrm.4jypgsndvzd5ta6ufaryx6owja.sfengineering-pgtest.preprod.us-west-2.aws.postgres.snowflake.app.

host_name 值是该返回值的第一段,即上述示例中的“df6m4y5m5fgfpb5idy2pj67xrm”。

以下查询返回过去 5 分钟内收集的每个指标的最新值:

SELECT TIMESTAMP as time,
  RECORD['metric']['name']::VARCHAR as metric,
  RESOURCE_ATTRIBUTES,
  RECORD_ATTRIBUTES,
  ROUND(VALUE::FLOAT, 2) AS value
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE RESOURCE_ATTRIBUTES['application'] = 'postgres'
  AND record_type = 'METRIC'
  AND RESOURCE_ATTRIBUTES['instance_id']::VARCHAR = '<your_instance_id>'
  AND RESOURCE_ATTRIBUTES['host_name']::VARCHAR = '<instance_current_host_name>'
  AND TIMESTAMP > CURRENT_TIMESTAMP() - INTERVAL '5 MINUTES'
QUALIFY ROW_NUMBER() OVER (PARTITION BY record, record_attributes ORDER BY timestamp desc, record, record_attributes) = 1
ORDER BY timestamp desc, metric, record_attributes;

备注

上述查询使用的是账户的默认事件表 SNOWFLAKE.TELEMETRY.EVENTS。如果您设置了自定义事件表,请适当调整查询。

指标查询示例

活动连接

SELECT
    TIMESTAMP,
    VALUE::FLOAT AS connections
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE RECORD_TYPE = 'METRIC'
  AND RECORD['metric']['name']::VARCHAR = 'postgres_connections'
  AND RESOURCE_ATTRIBUTES['instance_id']::VARCHAR = '<your_instance_id>'
  AND RESOURCE_ATTRIBUTES['host_name']::VARCHAR = '<instance_current_host_name>'
  AND TIMESTAMP > CURRENT_TIMESTAMP() - INTERVAL '1 hour'
ORDER BY TIMESTAMP DESC;

按状态划分的内存使用量

SELECT
    TIMESTAMP,
    RECORD_ATTRIBUTES['state']::VARCHAR AS state,
    ROUND(VALUE::FLOAT / (1024*1024*1024), 2) AS usage_gb
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE RECORD_TYPE = 'METRIC'
  AND RECORD['metric']['name']::VARCHAR = 'system.memory.usage'
  AND RECORD_ATTRIBUTES['state']::VARCHAR IN ('used', 'cached', 'buffered', 'free')
  AND RESOURCE_ATTRIBUTES['instance_id']::VARCHAR = '<your_instance_id>'
  AND RESOURCE_ATTRIBUTES['host_name']::VARCHAR = '<instance_current_host_name>'
  AND TIMESTAMP > CURRENT_TIMESTAMP() - INTERVAL '1 hour'
ORDER BY TIMESTAMP DESC;

CPU 负载平均值

SELECT
    TIMESTAMP,
    RECORD['metric']['name']::VARCHAR AS metric,
    VALUE::FLOAT AS load_avg
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE RECORD_TYPE = 'METRIC'
  AND RECORD['metric']['name']::VARCHAR IN (
      'system.cpu.load_average.1m',
      'system.cpu.load_average.5m',
      'system.cpu.load_average.15m'
  )
  AND RESOURCE_ATTRIBUTES['instance_id']::VARCHAR = '<your_instance_id>'
  AND RESOURCE_ATTRIBUTES['host_name']::VARCHAR = '<instance_current_host_name>'
  AND TIMESTAMP > CURRENT_TIMESTAMP() - INTERVAL '1 hour'
ORDER BY TIMESTAMP;

数据库大小

SELECT
    TIMESTAMP,
    ROUND(VALUE::FLOAT / (1024*1024), 1) AS size_mb
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE RECORD_TYPE = 'METRIC'
  AND RECORD['metric']['name']::VARCHAR = 'postgres_databases_size_bytes'
  AND RESOURCE_ATTRIBUTES['instance_id']::VARCHAR = '<your_instance_id>'
  AND RESOURCE_ATTRIBUTES['host_name']::VARCHAR = '<instance_current_host_name>'
  AND TIMESTAMP > DATEADD('hour', -1, CURRENT_TIMESTAMP())
ORDER BY TIMESTAMP DESC
LIMIT 1;

将指标转发到外部工具

由于指标存储在标准 Snowflake 表中,因此您可以将其转发到任何支持 Snowflake 连接的可观察性平台。有关使用特定工具的分步设置,请参阅: