Métricas do Snowflake Postgres

O Snowflake Postgres coleta automaticamente métricas de instância e as armazena na tabela de eventos ativa da sua conta. Um agente de monitoramento amostra métricas aproximadamente a cada 5 a 30 segundos, dependendo do tipo de métrica, e as grava em SNOWFLAKE.TELEMETRY.EVENTS com RECORD_TYPE = 'METRIC'.

É possível consultar essas métricas diretamente no Snowflake ou encaminhá-las para uma plataforma de observabilidade externa, como Grafana ou Observe.

Nota

Para obter informações sobre como consultar dados de log do Postgres na tabela de eventos, consulte Registro em log do Snowflake Postgres.

Métricas disponíveis

Métricas do Postgres

Métrica

Tipo

Descrição

postgres_connections

gauge

Número de conexões de back-end ativas

postgres_databases_size_bytes

gauge

Tamanho total de todos os bancos de dados (bytes)

postgres_wal_size_bytes

gauge

Tamanho do diretório WAL (bytes)

postgres_log_size_bytes

gauge

Tamanho do diretório de logs (bytes)

postgres_tmp_size_bytes

gauge

Tamanho do arquivo temporário (bytes)

postgres_locking_transactions

gauge

Número de bloqueios concedidos

postgres_locked_transactions

gauge

Número de bloqueios em espera/bloqueados

server_version

gauge

Versão do Postgres como um número inteiro (por exemplo, 180003 = 18.0.3)

Métricas de processo do Postgres

Métrica

Tipo

Unidade

Dimensões

process.cpu.time

soma

segundos

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

process.memory.usage

soma

bytes

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

process.memory.virtual

soma

bytes

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

Nota

Cada processo do Postgres terá uma linha process.cpu.time para cada estado de CPU e uma para cada um destes: process.memory.usage e process.memory.virtual.

Os atributos da dimensão process.* são encontrados na coluna resource_attributes de cada linha. Assim como os valores state para outras métricas, os atributos da dimensão state estão na coluna record_attributes.

Métricas de CPU

Métrica

Tipo

Unidade

Dimensões

system.cpu.time

soma

segundos

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

-–

Nota

Cada cpu# (como cpu0 e cpu2) terá uma linha system.cpu.time para cada estado de CPU.

system.cpu.time é um contador cumulativo. Para obter uma porcentagem, calcule o delta entre amostras consecutivas e divida pelo intervalo decorrido.

Métricas de memória

Métrica

Tipo

Unidade

Dimensões

system.memory.usage

soma

bytes

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

Nota

Uma linha system.memory.usage para cada estado.

Métricas de disco

Métrica

Tipo

Unidade

Dimensões

system.filesystem.usage

soma

bytes

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

Nota

Uma linha system.filesystem.usage para cada estado.

Métricas de rede

Métrica

Tipo

Unidade

Dimensões

system.network.io

soma

bytes

device, direction (transmit, receive)

Nota

Cada dispositivo (“eth0” e “lo”) terá uma linha system.network.io para cada direção.

Métricas de paginação

Métrica

Tipo

Unidade

Dimensões

system.paging.usage

soma

bytes

device, state (used, free)

Nota

Uma linha system.paging.usage para cada estado.

Atributos de recursos

Cada linha de métrica inclui os seguintes campos em RESOURCE_ATTRIBUTES:

Atributo

Descrição

Exemplo

instance_id

Identificador da instância do Postgres

4jypgsndvzd5ta6ufaryx6owja

host_name

Nome do host do servidor

df6m4y5m5fgfpb5idy2pj67xrm

host.id

ID da instância EC2

i-0f6724aef472706a3

host.type

Família de instâncias

m8g.medium

cloud.region

Região da AWS

us-west-2

cloud.availability_zone

Zona de disponibilidade

us-west-2b

application

Sempre postgres

postgres

os.type

Sempre linux

linux

Consulta de métricas

Uma determinada instância do Snowflake Postgres pode ter vários servidores em execução a qualquer momento, como um servidor primário e o servidor de HA dele ou uma substituição de atualização aguardando a janela de manutenção da instância para ser ativada. Como cada um desses servidores reportará métricas para o instance_id da instância, você também precisa do host_name do servidor atualmente ativo da instância.

Para encontrar o instance_id da sua instância do Postgres, use DESCRIBE POSTGRES INSTANCE:

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

O instance_id da instância é o primeiro segmento do valor host retornado (tudo antes do primeiro ponto).

Nota

Você pode usar a coluna host da saída do comando SHOW POSTGRES INSTANCES para ver os valores do host da instância para todas as instâncias do Snowflake Postgres em execução na sua conta.

Para encontrar o host_name do servidor atual da instância, use uma pesquisa DNS CNAME simples do valor host da instância.

Digamos que o valor host retornado foi “4jypgsndvzd5ta6ufaryx6owja.sfengineering-pgtest.preprod.us-west-2.aws.postgres.snowflake.app” (então sabemos que o instance_id da instância é “4jypgsndvzd5ta6ufaryx6owja”).

Aqui está um exemplo usando o utilitário dig CLI para fazer a pesquisa 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.

E aqui está um exemplo usando o módulo dns.resolver do Python:

>>> 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.

O valor host_name é o primeiro segmento do valor retornado, “df6m4y5m5fgfpb5idy2pj67xrm” nos exemplos acima.

A consulta a seguir retorna o valor mais recente para cada métrica coletada nos últimos 5 minutos:

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;

Nota

A consulta acima usa a tabela de eventos padrão da conta, SNOWFLAKE.TELEMETRY.EVENTS. Se você configurou uma tabela de eventos personalizada, ajuste a consulta adequadamente.

Consultas de métricas de exemplo

Conexões ativas

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;

Uso de memória por estado

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;

Médias de carga do 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;

Tamanho do banco de dados

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;

Encaminhando métricas para ferramentas externas

Como as métricas são armazenadas em uma tabela padrão do Snowflake, é possível encaminhá-las para qualquer plataforma de observabilidade que seja compatível com uma conexão Snowflake. Para obter uma configuração passo a passo com ferramentas específicas, consulte: