Snowflake Postgres 메트릭

Snowflake Postgres는 인스턴스 메트릭을 자동으로 수집하여 계정의 활성 이벤트 테이블 에 저장합니다. 모니터링 에이전트는 메트릭 유형에 따라 약 5~30초마다 메트릭을 샘플링하여 RECORD_TYPE = 'METRIC'SNOWFLAKE.TELEMETRY.EVENTS 이벤트에 씁니다.

이러한 메트릭을 Snowflake에서 직접 쿼리하거나 Grafana 또는 Observe와 같은 외부 가시성 플랫폼으로 전달할 수 있습니다.

참고

이벤트 테이블에서 Postgres 로그 데이터를 쿼리하는 방법에 대한 자세한 내용은 Snowflake Postgres 로깅 섹션을 참조하세요.

사용 가능한 메트릭

Postgres 메트릭

메트릭

타입

설명

postgres_connections

게이지

활성 백엔드 연결 수

postgres_databases_size_bytes

게이지

모든 데이터베이스의 총 크기(바이트)

postgres_wal_size_bytes

게이지

WAL 디렉터리 크기(바이트)

postgres_log_size_bytes

게이지

로그 디렉터리 크기(바이트)

postgres_tmp_size_bytes

게이지

임시 파일 크기(바이트)

postgres_locking_transactions

게이지

부여된 잠금 수

postgres_locked_transactions

게이지

대기 중/차단된 잠금 수

server_version

게이지

정수형 Postgres 버전(예: 180003 = 18.0.3)

Postgres 프로세스 메트릭

메트릭

타입

단위

Dimensions

process.cpu.time

합계

상태(사용자, 시스템, 대기) process.command, process.executable.name, process.owner, process.pid, process.parent_pid

process.memory.usage

합계

bytes

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

process.memory.virtual

합계

bytes

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

참고

각 Postgres 프로세스에는 각 CPU 상태와 process.memory.usageprocess.memory.virtual 각각에 대해 하나의 process.cpu.time 이 있습니다.

process.* 차원 특성은 각 행의 resource_attributes 열에서 찾을 수 있습니다. 다른 메트릭의 state 와 마찬가지로, state 차원 특성은 record_attributes 열에 있습니다.

CPU 메트릭

메트릭

타입

단위

Dimensions

system.cpu.time

합계

상태: 사용자, 시스템, 대기, 유휴, 양호, 인터럽트, softirq, cpu 도용: cpu#

system.cpu.load_average.1m

게이지

스레드

-–

system.cpu.load_average.5m

게이지

스레드

-–

system.cpu.load_average.15m

게이지

스레드

-–

참고

각 CPU#(예: cpu0 및 cpu2)는 각 CPU 상태에 대해 하나의 system.cpu.time 이 있습니다.

system.cpu.time 은 누적 카운터입니다. 백분율을 얻으려면 연속 샘플 간의 델타를 계산하고 경과 간격으로 나눕니다.

메모리 메트릭

메트릭

타입

단위

Dimensions

system.memory.usage

합계

bytes

상태: 사용됨, 사용 가능, 캐시됨, 버퍼링됨, slab_reclaimable, slab_unreclaimable

참고

각 주에 대한 하나의 system.memory.usage 행입니다.

디스크 메트릭

메트릭

타입

단위

Dimensions

system.filesystem.usage

합계

bytes

마운트 지점, 디바이스, 상태(사용됨, 사용 가능), 유형, 모드

참고

각 주에 대한 하나의 system.filesystem.usage 행입니다.

네트워크 메트릭

메트릭

타입

단위

Dimensions

system.network.io

합계

bytes

디바이스, 방향(전송, 수신)

참고

각 디바이스(‘eth0’ 및 ‘lo’)에는 각 방향에 대해 하나의``system.network.io`` 가 있습니다.

페이징 메트릭

메트릭

타입

단위

Dimensions

system.paging.usage

합계

bytes

디바이스, 상태(사용됨, 사용 가능)

참고

각 주에 대한 하나의 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 연결을 지원하는 모든 가시성 플랫폼으로 전달할 수 있습니다. 특정 도구를 사용한 단계별 설정은 다음을 참조하세요.