Snowflake Postgresメトリック

Snowflake Postgresはインスタンスメトリックを自動的に収集し、アカウントのアクティブな イベントテーブル にそれらを格納します。モニタリングエージェントは、メトリックのタイプに応じて約5~30秒ごとにメトリックをサンプリングし、それらを RECORD_TYPE = 'METRIC' とともに SNOWFLAKE.TELEMETRY.EVENTS に書き込みます。

これらのメトリックは、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

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 状態に対して1つの process.cpu.time 行があり、各 process.memory.usage および process.memory.virtual に対して1つの行があります。

process.* ディメンション属性は、各行の resource_attributes 列にあります。他のメトリックの state 値と同様に、 state ディメンション属性は record_attributes 列にあります。

CPU メトリック

メトリック

単位

ディメンション

system.cpu.time

sum

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など)には、各 CPU 状態に対して1つの system.cpu.time 行があります。

system.cpu.time は累積カウンターです。パーセンテージを取得するには、連続するサンプル間のデルタを計算し、経過間隔で除算します。

メモリメトリック

メトリック

単位

ディメンション

system.memory.usage

sum

bytes

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

注釈

各状態に対して1つの system.memory.usage 行。

ディスクメトリック

メトリック

単位

ディメンション

system.filesystem.usage

sum

bytes

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

注釈

各状態に対して1つの system.filesystem.usage 行。

ネットワークメトリック

メトリック

単位

ディメンション

system.network.io

sum

bytes

device、direction (transmit、receive)

注釈

各デバイス(「eth0」と「lo」)には各方向に対して1つの system.network.io 行があります。

ページングメトリック

メトリック

単位

ディメンション

system.paging.usage

sum

bytes

device、state (used、free)

注釈

各状態に対して1つの 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 を見つけるには、インスタンスの host 値の単純な DNS CNAME ルックアップを使用します。

返された 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接続をサポートする任意の可観測性プラットフォームに転送することができます。特定のツールを使ったステップごとの設定については、以下をご参照ください。