Snowpark Container Services: Serviços de monitoramento¶
Acessar logs de contêiner¶
O Snowflake coleta tudo o que seus contêineres de aplicativo enviam para a saída padrão e para o erro padrão. Certifique-se de que seu código produza informações úteis que você pode usar posteriormente para depurar seu serviço.
O Snowflake persiste os logs de contêiner na tabela de eventos para acesso posterior, a menos que você desative explicitamente. Para obter mais informações, consulte configuração da coleta de logs. O armazenamento de logs em tabelas de eventos permite a análise retrospectiva de serviços e trabalhos. Para obter mais informações, consulte Como usar tabela de evento.
Atualmente, você pode acessar logs de contêiner usando as seguintes opções:
Usar o método auxiliar de serviço: recomendamos chamar a função de tabela Como usar a função <service-name>!SPCS_GET_LOGS para recuperar logs de contêiner do serviço ou trabalho especificado, coletados pelo Snowflake na tabela de eventos.
Usar a tabela de eventos diretamente: se você tiver acesso total à tabela de eventos, poderá consultar a tabela de eventos diretamente para obter logs históricos.
Usar a função do sistema SYSTEM$GET_SERVICE_LOGS: chamada a SYSTEM$GET_SERVICE_LOGS para recuperar os logs do contêiner de serviço ou trabalho em execução no momento.
Como usar a função <service-name>!SPCS_GET_LOGS¶
a função de tabela <service_name>!SPCS_GET_LOGS retorna logs dos contêineres do trabalho especificado. Esses logs são coletados pelo Snowflake e são armazenados na tabela de eventos.
A lista a seguir explica as vantagens de usar esta função de tabela:
Você pode recuperar os logs de um serviço específico.
Você pode recuperar os logs dentro de um intervalo de tempo especificado.
O chamador não precisa de acesso a toda a tabela de eventos, o que pode ser útil para clientes com requisitos rigorosos de segurança da informação. Se a sessão atual incluir a função de proprietário do serviço, ela terá acesso a esses logs.
Para service_name
, você especifica o nome do serviço. A função retorna logs que o Snowflake coletou de contêineres desse serviço (consulte Acessar logs de contêiner).
Opcionalmente, você pode especificar um intervalo de datas. Por padrão, a função retorna logs de um dia. Por exemplo, a consulta recuperou os logs que o Snowflake coletou de contêineres do trabalho my_test_job
no último dia, que é o padrão.
SELECT * FROM TABLE(my_test_job!SPCS_GET_LOGS());Exemplo de saída:
+-------------------------+-------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+ | TIMESTAMP | INSTANCE_ID | CONTAINER_NAME | LOG | RECORD_ATTRIBUTES | |-------------------------+-------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------| | 2025-06-26 00:23:40.281 | 0 | main | job-tutorial - INFO - Job finished | { | | | | | | "log.iostream": "stdout" | | | | | | } | | 2025-06-26 00:23:38.787 | 0 | main | job-tutorial - INFO - Executing query [select current_time() as time,'hello'] and writing result to table [results] | { | | | | | | "log.iostream": "stdout" | | | | | | } | | 2025-06-26 00:23:38.787 | 0 | main | job-tutorial - INFO - Connection succeeded. Current session context: database="TUTORIAL_DB", schema="DATA_SCHEMA", warehouse="TUTORIAL_WAREHOUSE", role="TEST_ROLE" | { | | | | | | "log.iostream": "stdout" | | | | | | } | | 2025-06-26 00:23:36.852 | 0 | main | job-tutorial - INFO - Job started | { | | | | | | "log.iostream": "stdout" | | | | | | } | +-------------------------+-------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+
Para obter mais informações sobre como chamar este método, consulte <service_name>!SPCS_GET_LOGS.
Como usar tabela de evento¶
O Snowflake pode capturar logs enviados de contêineres para a saída padrão e fluxos de erro padrão na tabela de evento configurada para sua conta. Para obter mais informações sobre como configurar uma tabela de evento, consulte Registro, rastreamento e métricas.
Você controla quais fluxos são coletados (todos, somente erro padrão ou nenhum) para armazenar em uma tabela de evento, usando o campo spec.logExporters no arquivo de especificação de serviço.
É possível então consultar a tabela de evento para ver os eventos. Para localizar a tabela de eventos ativos da conta, use o comando SHOW PARAMETERS para verificar o valor do parâmetro EVENT_TABLE:
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
O parâmetro especifica a tabela de eventos ativa para a conta.
Em seguida, consulte essa tabela de eventos. O seguinte comando SELECT recupera os eventos de serviço e trabalho do Snowflake registrados na última hora:
SELECT TIMESTAMP, RESOURCE_ATTRIBUTES, RECORD_ATTRIBUTES, VALUE
FROM <current_event_table_for_your_account>
WHERE timestamp > dateadd(hour, -1, current_timestamp())
AND RESOURCE_ATTRIBUTES:"snow.service.name" = '<service_name>'
AND RECORD_TYPE = 'LOG'
ORDER BY timestamp DESC
LIMIT 10;
Snowflake recomenda incluir um carimbo de data/hora na cláusula WHERE das consultas da tabela de eventos, conforme mostrado neste exemplo. Isso é especialmente importante devido ao volume potencial de dados gerados por vários componentes do Snowflake. Ao aplicar filtros, você pode recuperar um subconjunto menor de dados, o que melhora o desempenho da consulta.
A tabela de evento inclui as seguintes colunas, que fornecem informações úteis sobre os logs coletados pelo Snowflake de seu contêiner:
TIMESTAMP: mostra quando o Snowflake coletou o log.
RESOURCE_ATTRIBUTES: Fornece um objeto JSON que identifica o serviço Snowflake e o contêiner no serviço que gerou a mensagem de log. Por exemplo, ele fornece detalhes como o nome do serviço, o nome do contêiner e o nome do pool de computação que foram especificados quando o serviço foi executado.
{ "snow.account.name": "SPCSDOCS1", "snow.compute_pool.id": 20, "snow.compute_pool.name": "TUTORIAL_COMPUTE_POOL", "snow.compute_pool.node.id": "a17e8157", "snow.compute_pool.node.instance_family": "CPU_X64_XS", "snow.database.id": 26, "snow.database.name": "TUTORIAL_DB", "snow.schema.id": 212, "snow.schema.name": "DATA_SCHEMA", "snow.service.container.instance": "0", "snow.service.container.name": "echo", "snow.service.container.run.id": "b30566", "snow.service.id": 114, "snow.service.name": "ECHO_SERVICE2", "snow.service.type": "Service" }
RECORD_ATTRIBUTES: para um serviço Snowflake, ele identifica uma origem de erro (saída padrão ou erro padrão).
{ "log.iostream": "stdout" }
VALUE: a saída padrão e o erro padrão são divididos em linhas e cada linha gera um registro na tabela de eventos.
"echo-service [2023-10-23 17:52:27,429] [DEBUG] Sending response: {'data': [[0, 'Joe said hello!']]}"
Como usar SYSTEM$GET_SERVICE_LOGS¶
A função SYSTEM$GET_SERVICE_LOGS retorna logs do contêiner de serviço atualmente em execução. Após a saída de um contêiner, você poderá continuar acessando os logs usando a função do sistema por um curto período. As funções do sistema são mais úteis durante o desenvolvimento e o teste, quando você está inicialmente criando um serviço ou um trabalho.
Forneça o nome do serviço, a ID da instância, o nome do contêiner e, opcionalmente, o número de linhas de log mais recentes a serem recuperadas. Se apenas uma instância de serviço estiver em execução, a ID da instância de serviço será 0. Por exemplo, o comando de instrução a seguir recupera as 10 linhas finais do log de um contêiner nomeado echo
que pertence à instância 0 de um serviço chamado echo_service
:
SELECT SYSTEM$GET_SERVICE_LOGS('echo_service', '0', 'echo', 10);
Exemplo de saída:
+--------------------------------------------------------------------------+
| SYSTEM$GET_SERVICE_LOGS |
|--------------------------------------------------------------------------|
| 10.16.6.163 - - [11/Apr/2023 21:44:03] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:08] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:13] "GET /healthcheck HTTP/1.1" 200 - |
| 10.16.6.163 - - [11/Apr/2023 21:44:18] "GET /healthcheck HTTP/1.1" 200 - |
+--------------------------------------------------------------------------+
1 Row(s) produced. Time Elapsed: 0.878s
Se você não tiver as informações sobre o serviço necessárias para chamar a função (como o ID da instância ou nome do contêiner), é possível primeiro executar o comando SHOW SERVICE CONTAINERS IN SERVICE para obter informações sobre as instâncias do serviço e os contêineres em execução em cada instância.
A função SYSTEM$GET_SERVICE_LOGS tem as seguintes limitações:
Ele realiza a fusão dos fluxos de saída padrão e de erro padrão. A função não indica de qual fluxo a saída veio.
Ele relata os dados capturados para um contêiner específico em uma única instância de serviço.
Ele relata apenas logs de um contêiner em execução. A função não pode buscar logs de um contêiner anterior que foi reiniciado ou de um contêiner de um serviço que foi interrompido ou excluído.
A função retorna até 100 KB de dados.
Métricas da plataforma de acesso¶
O Snowflake fornece métricas para pools de computação em sua conta e serviços em execução nesses pools de computação. Essas métricas, fornecidas pelo Snowflake, também são chamadas de métricas de plataforma.
Métricas de serviço da tabela de evento: Os serviços individuais publicam métricas. Elas são um subconjunto das métricas do pool de computação que fornecem informações específicas ao serviço. O caso de uso de destino para isso é observar a utilização de recurso de um serviço específico. Na especificação do serviço, você define quais métricas deseja que o Snowflake registre na tabela de evento enquanto o serviço estiver em execução.
Métricas do pool de computação: Cada pool de computação também publica métricas que fornecem informações sobre o que está acontecendo dentro desse pool de computação. O caso de uso de destino para isso é observar a utilização do pool de computação. Para acessar as métricas do pool de computação, será necessário escrever um serviço que use a API compatível com Prometheus para pesquisar as métricas publicadas pelo pool de computação.
Acesso a métricas de serviço de tabela de evento¶
Para registrar as métricas de um serviço na tabela de evento configurada para sua conta, inclua a seguinte seção na especificação do serviço:
platformMonitor:
metricConfig:
groups:
- <group 1>
- <group 2>
- ...
Onde cada group N
se refere a um grupo de métricas predefinido no qual você está interessado (por exemplo, system
, network
ou storage
). Para obter mais informações, consulte a seção do campo spec.platformMonitor na documentação sobre a especificação do serviço.
Enquanto o serviço estiver em execução, o Snowflake registra essas métricas na tabela de evento de sua conta. Você pode ler essas métricas das seguintes maneiras:
Usando o método auxiliar de serviço: a função de tabela <service_name>!SPCS_GET_METRICS retorna métricas coletadas pelo Snowflake para o serviço especificado. A lista a seguir explica as vantagens de usar esta função de tabela:
É possível recuperar métricas para um serviço específico.
Você pode recuperar métricas dentro de um intervalo de tempo especificado.
O autor da chamada não precisa de acesso a toda a tabela de eventos, o que pode ser útil para clientes com requisitos rigorosos de segurança da informação.
A instrução SELECT a seguir usa a função de tabela para recuperar eventos de plataforma para o serviço especificado que foi registrado na última hora:
SELECT * FROM TABLE(echo_service!SPCS_GET_METRICS(start_time => dateadd('hour', -1, current_timestamp())));
Consultar a tabela de eventos diretamente: é possível consultar a tabela de eventos para ler as métricas. A consulta a seguir recupera as métricas de serviço que foram registradas na última hora para o serviço
my_service
:SELECT timestamp, value FROM my_event_table_db.my_event_table_schema.my_event_table WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP()) AND RESOURCE_ATTRIBUTES:"snow.service.name" = 'MY_SERVICE' AND RECORD_TYPE = 'METRIC' ORDER BY timestamp DESC LIMIT 10;
Se você não souber o nome da tabela de eventos ativa para a conta, execute o comando SHOW PARAMETERS para exibir o valor do parâmetro EVENT_TABLE no nível da conta:
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
Para obter mais informações sobre tabelas de evento, consulte Como usar tabela de evento.
Exemplo
Para criar um serviço de exemplo que registre métricas na tabela de eventos configurada para sua conta, conclua as etapas a seguir.
Criação de um serviço denominado
echo_service
seguindo os passos no Tutorial 1, com uma alteração. Na etapa 3, onde você cria um serviço, use o seguinte comandoecho_service
:doc:`, que adiciona o campo </developer-guide/snowpark-container-services/tutorials/tutorial-1> na especificação de serviço modificada:CREATE SERVICE echo_service IN COMPUTE POOL tutorial_compute_pool FROM SPECIFICATION $$ spec: containers: - name: echo image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest env: SERVER_PORT: 8000 CHARACTER_NAME: Bob readinessProbe: port: 8000 path: /healthcheck endpoints: - name: echoendpoint port: 8000 public: true platformMonitor: metricConfig: groups: - system - system_limits $$ MIN_INSTANCES=1 MAX_INSTANCES=1;
Após iniciar a execução do serviço, o Snowflake começa a registrar as métricas nos grupos de métricas especificados na tabela de eventos.
Acessar as métricas chamando a função <service_name>!SPCS_GET_METRICS ou consultando a tabela de eventos. Por exemplo, recuperar métricas relatadas na última hora pelo serviço echo_service:
Usar a função <service_name>!SPCS_GET_METRICS auxiliar:
SELECT * FROM TABLE(echo_service!SPCS_GET_METRICS(START_TIME => DATEADD(“hour”, -1, CURRENT_TIMESTAMP())));
Consultar a tabela de eventos diretamente:
SELECT timestamp, value FROM my_events WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP()) AND RESOURCE_ATTRIBUTES:"snow.service.name" = 'ECHO_SERVICE' AND RECORD_TYPE = 'METRIC' AND RECORD:metric.name = 'container.cpu.usage' ORDER BY timestamp DESC LIMIT 100;
Acessar métricas do pool de computação¶
As métricas do pool de computação oferecem insights sobre os nós no pool de computação e os serviços em execução neles. Cada nó relata métricas específicas do nó, como a quantidade de memória disponível para contêineres, bem como métricas de serviço, como o uso de memória por contêineres individuais. As métricas do pool de computação fornecem informações da perspectiva de um nó.
Cada nó tem um publicador de métricas que escuta na porta TCP 9001. Outros serviços podem fazer uma solicitação HTTP GET com o caminho /metrics
para a porta 9001 no nó. Para descobrir o endereço IP do nó, recupere os registros SRV (ou registros A) do DNS para o nome de host discover.monitor.compute_pool_name.cp.spcs.internal
. Em seguida, crie outro serviço na conta que pesquise ativamente cada nó para recuperar as métricas.
O corpo na resposta fornece as métricas usando o formato Prometheus conforme mostrado nas métricas de exemplo a seguir:
# HELP node_memory_capacity Defines SPCS compute pool resource capacity on the node
# TYPE node_memory_capacity gauge
node_memory_capacity{snow_compute_pool_name="MY_POOL",snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"} 1
node_cpu_capacity{snow_compute_pool_name="MY_POOL",snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"} 7.21397383168e+09
Observe o seguinte:
O corpo da resposta começa com
# HELP
e# TYPE
, que fornecem uma breve descrição e o tipo da métrica. Neste exemplo, a métricanode_memory_capacity
é do tipogauge
.Em seguida, vem o nome da métrica, uma lista de rótulos que descrevem um recurso específico (ponto de dados) e seu valor. Neste exemplo, a métrica (nomeada
node_memory_capacity
) fornece informações de memória, indicando que o nó tem 7,2 GB de memória disponível. A métrica também inclui metadados na forma de rótulos, conforme mostrado:snow_compute_pool_name="MY_POOL", snow_compute_pool_node_instance_family="CPU_X64_S",snow_compute_pool_node_id="10.244.3.8"
É possível processar essas métricas da maneira que quiser; por exemplo, você pode armazenar métricas em um banco de dados e usar uma UI (como um painel do Grafana) para exibir as informações.
Nota
O Snowflake não fornece nenhuma agregação de métricas. Por exemplo, para obter métricas para um determinado serviço, é necessário consultar todos os nós que estão executando instâncias desse serviço.
O pool de computação deve ter um nome compatível com DNS para que você possa acessar as métricas.
O ponto de extremidade exposto por um pool de computação pode ser acessado por um serviço usando uma função que tenha o privilégio OWNERSHIP ou MONITOR no pool de computação.
Para obter uma lista de métricas de pool de computação disponíveis, consulte Métricas de plataforma disponíveis.
Exemplo
Para ver um exemplo de configuração do Prometheus para consultar métricas do pool de computação, consulte os tutoriais de métricas do pool de computação.
Métricas de plataforma disponíveis¶
A seguir está uma lista de grupos de métricas de plataforma disponíveis e métricas dentro de cada grupo. Observe que atualmente as métricas de armazenamento
são coletadas apenas de volumes de armazenamento em bloco.
Grupo da métrica . Nome da métrica |
Unidade |
Tipo |
Descrição |
---|---|---|---|
system . container.cpu.usage |
cpu cores |
gauges |
Número médio de núcleos de CPU usados desde a última medição. 1.0 indica utilização total de 1 núcleo de CPU. O valor máximo é o número de núcleos de CPU disponíveis para o contêiner. |
system . container.memory.usage |
bytes |
gauge |
Memória utilizada, em bytes. |
system . container.gpu.memory.usage |
bytes |
gauge |
Memória utilizada por GPU, em bytes. A GPU da fonte é indicada no atributo “gpu”. |
system . container.gpu.utilization |
ratio |
gauge |
Razão de uso por GPU em relação à capacidade. A GPU da fonte é indicada no atributo “gpu”. |
system_limits . container.cpu.limit |
cpu cores |
gauge |
Limite de recurso de CPU da especificação do serviço. Se nenhum limite for definido, o padrão será a capacidade do nó. |
system_limits . container.gpu.limit |
gpus |
gauge |
Limite de contagem de GPU da especificação do serviço. Se nenhum limite for definido, a métrica não será emitida. |
system_limits . container.memory.limit |
bytes |
gauge |
Limite de memória da especificação do serviço. Se nenhum limite for definido, o padrão será a capacidade do nó. |
system_limits . container.cpu.requested |
cpu cores |
gauge |
Solicitação de recurso de CPU da especificação do serviço. Se nenhum limite for definido, o padrão será um valor escolhido pelo Snowflake. |
system_limits . container.gpu.requested |
gpus |
gauge |
Contagem de GPU a partir da especificação do serviço. Se nenhum limite for definido, a métrica não será emitida. |
system_limits . container.memory.requested |
bytes |
gauge |
Solicitação de memória da especificação do serviço. Se nenhum limite for definido, o padrão será um valor escolhido pelo Snowflake. |
system_limits . container.gpu.memory.capacity |
bytes |
gauge |
Capacidade de memória por GPU. A GPU da fonte é indicada no atributo “gpu”. |
status . container.restarts |
restarts |
gauge |
Número de vezes que o Snowflake reiniciou o contêiner. |
status . container.state.finished |
booliano |
gauge |
Quando o contêiner estiver no estado “concluído”, esta métrica será emitida com o valor 1. |
status . container.state.last.finished.reason |
booliano |
gauge |
Se o contêiner tiver sido reiniciado anteriormente, esta métrica será emitida com o valor 1. O rótulo “motivo” descreve o motivo pelo qual o contêiner foi concluído pela última vez. |
status . container.state.last.finished.exitcode |
inteiro |
gauge |
Se um contêiner tiver sido reiniciado anteriormente, esta métrica conterá o código de saída da execução anterior. |
status . container.state.pending |
booliano |
gauge |
Quando um contêiner estiver no estado “pendente”, esta métrica será emitida com o valor 1. |
status . container.state.pending.reason |
booliano |
gauge |
Quando um contêiner estiver no estado “pendente”, esta métrica será emitida com o valor 1. O rótulo “motivo” descreve o motivo pelo qual o contêiner estava recentemente no estado pendente. |
status . container.state.running |
booliano |
gauge |
Quando um contêiner estiver no estado “em execução”, essa métrica terá valor 1. |
status . container.state.started |
booliano |
gauge |
Quando um contêiner estiver no estado “iniciado”, essa métrica terá valor 1. |
network . network.egress.denied.packets |
packets |
gauge |
Total de pacotes negados de saída de rede devido a falhas de validação de política. |
network . network.egress.received.bytes |
bytes |
gauge |
Total de bytes de saída de rede recebidos de destinos remoto. |
network . network.egress.received.packets |
packets |
gauge |
Total de pacotes de saída de rede recebidos de destinos remotos. |
network . network.egress.transmitted.bytes |
byte |
gauge |
Total de bytes de saída de rede transmitidos para destinos remoto. |
network . network.egress.transmitted.packets |
packets |
gauge |
Total de pacotes de saída de rede transmitidos para destinos remoto. |
storage . volume.capacity |
bytes |
gauge |
Tamanho do sistema de arquivos. |
storage . volume.io.inflight |
operations |
gauge |
Número de operações de E/S ativas do sistema de arquivos. |
storage . volume.read.throughput |
bytes/sec |
gauge |
O sistema de arquivos lê a taxa de transferência em bytes por segundo. |
storage . volume.read.iops |
operations/sec |
gauge |
Operações de leitura do sistema de arquivos por segundo. |
storage . volume.usage |
bytes |
gauge |
Número total de bytes usados no sistema de arquivos. |
storage . volume.write.throughput |
bytes/sec |
gauge |
Taxa de transferência de gravação do sistema de arquivos em bytes por segundo. |
storage . volume.write.iops |
operations/sec |
gauge |
Operações de gravação no sistema de arquivos por segundo. |
Publicar e acessar métricas de aplicativos¶
As métricas e os rastreamentos de aplicativos são gerados pelo seu serviço, ao contrário das métricas de plataforma geradas pelo Snowflake. Seus contêineres de serviço podem gerar métricas do OLTP ou do Prometheus, e o Snowflake as publica na tabela de eventos configurada para sua conta.
Observe que você deve garantir que o código do contêiner de serviço produza métricas com as unidades, a agregação e os tipos de instrumentação corretos para gerar métricas que sejam significativas e eficazes para a sua análise.
Publicar métricas e rastreamentos de aplicativos do OTLP¶
O Snowflake executa um coletor OTel que o seu contêiner de serviço pode usar para publicar métricas e rastreamentos de aplicativos do OTLP. Ou seja, um contêiner de serviço pode enviar métricas para os pontos de extremidade do coletor OTel, que o Snowflake grava na tabela de eventos configurada para a sua conta Snowflake junto com os detalhes do serviço de origem.
Funciona da seguinte maneira:
O Snowflake preenche automaticamente as seguintes variáveis de ambiente no seu contêiner de serviço que fornecem os pontos de extremidade do coletor OTel onde os contêineres podem publicar métricas e rastreamentos de aplicativos:
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
O cliente padrão do OTLP procura essas variáveis de ambiente para descobrir automaticamente o coletor OTel. Isso permite que o seu contêiner de serviço publique métricas e rastreamentos usando esse cliente.
Configurar Trace IDs do aplicativo do OTLP¶
Os rastreamentos devem usar o formato do Snowflake Trace ID para serem visualizados no Snowflake Trail e permitir uma pesquisa eficiente.
O Snowflake fornece bibliotecas Python e Java para simplificar a configuração do gerador do Trace ID. Os exemplos a seguir mostram como substituir o gerador padrão do OpenTelemetry Trace ID por essas bibliotecas.
from opentelemetry.sdk.trace import TracerProvider
from snowflake.telemetry.trace import SnowflakeTraceIdGenerator
trace_id_generator = SnowflakeTraceIdGenerator()
tracer_provider = TracerProvider(
resource=Resource.create({"service.name": SERVICE_NAME}),
id_generator=trace_id_generator
)
Para obter mais informações, consulte snowflake-telemetry-python no PyPI.
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import com.snowflake.telemetry.trace.SnowflakeTraceIdGenerator;
static OpenTelemetry initOpenTelemetry() {
return AutoConfiguredOpenTelemetrySdk.builder()
.addPropertiesSupplier(
() ->
Map.of(...config options...)
.addTracerProviderCustomizer(
(tracerProviderBuilder, configProperties) -> {
tracerProviderBuilder.setIdGenerator(SnowflakeTraceIdGenerator.INSTANCE);
return tracerProviderBuilder;
})
.build()
.getOpenTelemetrySdk();
Para obter mais informações sobre a instalação do com.snowflake.telemetry
, consulte Configuração do ambiente Java e Scala para usar a classe de telemetria.
Um gerador de Trace ID também pode ser implementado para qualquer outra linguagem de programação. O ID de 16 bytes (big endian) deve conter um carimbo de data/hora nos quatro bytes de ordem mais alta. Os outros bytes devem conter bits aleatórios. Para obter mais informações, consulte Implementação de referência do Python.
Publicar métricas de aplicativos do Prometheus¶
O Snowflake oferece suporte a métricas do Prometheus em que, em vez de enviar métricas do OTLP, seu aplicativo pode expor métricas do Prometheus para serem pesquisadas por um coletor fornecido pelo Snowflake. Para que o Snowflake colete essas métricas de aplicativo do seu serviço e as publique na tabela de eventos, siga estas etapas:
Faça com que seu serviço escute em uma porta que exponha suas métricas do Prometheus.
Inclua no seu serviço um contêiner fornecido pelo Snowflake (também chamado de contêiner «sidecar»), com a configuração necessária para extrair as métricas do seu contêiner de serviço.
O sidecar do Prometheus extrai as métricas do aplicativo do contêiner em uma frequência programada, converte o formato do Prometheus no formato do OTLP e envia as métricas para o coletor OTel. Em seguida, o coletor OTel publica essas métricas na tabela de eventos configurada para sua conta Snowflake.
Nota
O Snowflake não é compatível com o tipo de métrica Resumo do Prometheus, pois é obsoleto para o OpenTelemetry. Em vez disso, use o tipo Histograma.
Você adiciona o contêiner sidecar do Prometheus à especificação do serviço como outro contêiner e inclui um argumento para especificar o ponto de extremidade HTTP exposto pelo seu contêiner, usando o seguinte formato:
localhost:{PORT}/{METRICS_PATH}, {SCRAPE_FREQUENCY}
Ele especifica o número da porta, o caminho e a frequência com que o sidecar deve extrair as métricas.
Um exemplo de fragmento de especificação de serviço mostra o contêiner sidecar coletando métricas a cada minuto do seu contêiner de serviço a partir da porta 8000 e extraindo métricas do caminho «/metrics»:
spec:
containers:
- name: <name>
image: <image-name>
.....
- name: prometheus
image: /snowflake/images/snowflake_images/monitoring-prometheus-sidecar:0.0.1
args:
- "-e"
- "localhost:8000/metrics,1m"
Na especificação:
image
é a imagem do contêiner sidecar fornecido pelo Snowflake.args
fornece a configuração necessária para que o contêiner do Prometheus extraia as métricas:Da porta 8000 fornecida pelo seu contêiner. A porta é necessária nessa configuração do contêiner do Prometheus.
Usando o caminho «/metrics». É opcional. Se não for especificado, «/metrics» é o caminho padrão.
A cada minuto. É opcional. Se não for especificado, «1m» é o padrão.
Se você usar os padrões, essa é a configuração equivalente para a extração de métricas:
spec: ... args: - "-e" - "localhost:8000"
Nota
O contêiner sidecar do Prometheus é compatível apenas com serviços (não com trabalhos). Se você quiser coletar métricas de aplicativos para um trabalho, ele deverá enviar as métricas para o coletor OTel.
Acessar métricas e rastreamentos de aplicativos na tabela de eventos¶
Você pode consultar a tabela de eventos para obter métricas de aplicativos. A consulta a seguir recupera as métricas do aplicativo coletadas na última hora.
SELECT timestamp, record:metric.name, value
FROM <current_event_table_for_your_account>
WHERE timestamp > dateadd(hour, -1, CURRENT_TIMESTAMP())
AND resource_attributes:"snow.service.name" = <service_name>
AND scope:"name" != 'snow.spcs.platform'
AND record_type = 'METRIC'
ORDER BY timestamp DESC
LIMIT 10;
Para obter mais informações sobre tabelas de evento, consulte Visão geral da tabela de evento. Você pode visualizar essas métricas nos painéis do Snowflake.
Você também pode consultar a tabela de eventos para visualizar os rastreamentos do aplicativo. Por exemplo, para recuperar rastreamentos de aplicativos da última hora, na consulta anterior, substitua a condição record_type
da seguinte forma:
AND record_type = 'SPAN' OR record_type = 'SPAN_EVENT'
Os rastreamentos podem ser visualizados no visualizador do Snowflake trail
As métricas e os rastreamentos contêm atributos definidos pelo usuário e pelo Snowflake como atributos de recursos e registros. Observe que o prefixo snow.
é reservado para atributos gerados pelo Snowflake; o Snowflake ignora os atributos personalizados que usam esse prefixo. Para ver uma lista de atributos definidos pelo Snowflake, consulte Métricas de plataforma disponíveis.
O código de exemplo é fornecido em Python e Java e demonstra a instrumentação de um aplicativo com métricas e rastreamentos personalizados usando o OTLP SDK. Os exemplos mostram como configurar a geração do Snowflake Trace ID para compatibilidade com o visualizador do Snowflake Trail para rastreamentos.
Acessar eventos da plataforma¶
O Snowflake registra eventos que dão visibilidade ao status e ao histórico dos serviços. Esses eventos fornecidos pelo Snowflake são chamados de eventos de plataforma.
Por exemplo, se seu contêiner de serviço estiver em execução, mas foi reiniciado um dia antes devido a um erro fatal (como uma condição de falta de memória), você pode usar eventos de plataforma para visualizar esse evento histórico.
O Snowflake registra esses eventos da plataforma na tabela de eventos em sua conta. Por padrão, os eventos da plataforma não são registrados. Para ativar o registro de eventos da plataforma, defina o parâmetro LOG_LEVEL ao criar recursos (por exemplo, ao executar CREATE SERVICE) ou use instruções ALTER para atualizar o nível de log dos recursos existentes.
Nota
Se o parâmetro LOG_LEVEL não é definido no nível do recurso, o Snowflake pode herdar o valor do parâmetro que é definido em um nível superior. Para um serviço, o Snowflake pode herdar o valor do parâmetro LOG_LEVEL definido no esquema, banco de dados ou conta do serviço. Para obter mais informações, consulte Como o Snowflake determina o nível de efeito.
Você pode verificar o nível de log atual definido para um serviço executando SHOW PARAMETERS … IN SERVICE:
SHOW PARAMETERS LIKE 'LOG_LEVEL' IN SERVICE mydb.myschema.myservice;
O valor do parâmetro LOG_LEVEL determina a gravidade dos eventos que você deseja registrar na tabela de eventos. Na implementação atual, os valores LOG_LEVEL com suporte são: INFO
e ERROR
.
Se você quiser registrar apenas eventos ERROR na tabela de eventos, defina LOG_LEVEL como
ERROR
.Se você quiser eventos
INFO
eERROR
registrados na tabela de eventos, defina LOG_LEVEL comoINFO
.Se quiser parar de registrar eventos da plataforma na tabela de eventos, defina LOG_LEVEL como
OFF
.
Para obter mais informações, consulte Definição dos níveis de telemetria.
Eventos de plataforma de consulta¶
Depois de configurar o nível de log de seu recurso, o Snowflake registra os eventos da plataforma na tabela de eventos ativa de sua conta do Snowflake. É possível acessar esses eventos das seguintes maneiras:
Usando o método auxiliar de serviço: a função de tabela <service_name>!SPCS_GET_EVENTS retorna eventos coletados pelo Snowflake dos contêineres do serviço especificado.
A lista a seguir explica as vantagens de usar esta função de tabela:
Você pode recuperar eventos para um serviço específico.
É possível recuperar eventos dentro de um intervalo de tempo especificado.
O autor da chamada não precisa de acesso a toda a tabela de eventos, o que pode ser útil para clientes com requisitos rigorosos de segurança da informação.
A seguinte instrução SELECT usa a função de tabela para recuperar eventos de plataforma para o serviço especificado registrado na última hora:
SELECT * FROM TABLE(echo_service!SPCS_GET_EVENTS(START_TIME => DATEADD('hour', -1, CURRENT_TIMESTAMP())));
Usando a tabela de evento diretamente: você pode consultar a tabela de eventos diretamente. Para localizar a tabela de eventos ativos da conta, use o comando SHOW PARAMETERS para verificar o valor do parâmetro EVENT_TABLE:
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
O parâmetro especifica a tabela de eventos ativa para a conta.
Em seguida, consulte essa tabela de eventos. A seguinte instrução SELECT recupera eventos de plataforma para o serviço especificado que foi registrado na última hora:
SELECT TIMESTAMP, RESOURCE_ATTRIBUTES, RECORD, VALUE FROM <your_event_table> WHERE TIMESTAMP > DATEADD(hour, -1, CURRENT_TIMESTAMP()) AND RESOURCE_ATTRIBUTES:"snow.service.name" = '<your_service_name>' AND RECORD_TYPE = 'EVENT' AND SCOPE:"name" = 'snow.spcs.platform' ORDER BY TIMESTAMP DESC LIMIT 10;
Para obter mais informações sobre tabelas de evento, consulte Como usar tabela de evento.
As seguintes colunas na tabela de eventos fornecem informações úteis sobre os eventos de plataforma:
TIMESTAMP: mostra quando o evento foi registrado.
RESOURCE_ATTRIBUTES: fornece um objeto JSON com metadados sobre a origem do evento, como um serviço, um contêiner ou um pool de computação. O exemplo a seguir de um valor na coluna
resource_attribute
identifica um serviço específico para o qual o evento é registrado{ "snow.compute_pool.name": "TUTORIAL_COMPUTE_POOL", "snow.compute_pool.id": 123, "snow.database.name": "TUTORIAL_DB", "snow.database.id": 456, "snow.schema.name": "DATA_SCHEMA", "snow.schema.id": 789, "snow.service.container.name": "echo", "snow.service.name": "ECHO_SERVICE2", "snow.service.id": 212, "snow.service.type": "Service" }
SCOPE: indica a origem do evento. Para eventos de plataforma, o nome do escopo é
snow.spcs.platform
, conforme mostrado no exemplo a seguir:{ "name": "snow.spcs.platform" }
RECORD_TYPE: para eventos de plataforma, EVENT é o RECORD_TYPE.
RECORD: fornece metadados sobre o evento específico. Os metadados a seguir mostram o nome e o nível de gravidade do evento de plataforma:
{ "name": "CONTAINER.STATUS_CHANGE", "severity_text": "INFO" }
VALUE: fornece os detalhes do evento. O exemplo a seguir mostra o status e uma mensagem sobre o status do contêiner:
{ "message": "Running", "status": "READY" }
Eventos com suporte¶
Atualmente, o Snowflake oferece suporte apenas aos eventos de alteração de status do contêiner.
A tabela a seguir lista os eventos de plataforma que o Snowflake registra. RECORD
e VALUE
nos nomes das colunas se referem às colunas na tabela de eventos (explicadas na seção anterior).
RECORD:name |
RECORD:severity_text |
VALUE:message |
VALUE:status |
---|---|---|---|
CONTAINER.STATUS_CHANGE |
INFO |
Em execução |
READY |
CONTAINER.STATUS_CHANGE |
INFO |
A sonda de prontidão está falhando no caminho: <path>, porta: <port> |
PENDING |
CONTAINER.STATUS_CHANGE |
INFO |
Espera para começar |
PENDING |
CONTAINER.STATUS_CHANGE |
INFO |
Os nós do pool de computação estão sendo provisionados |
PENDING |
CONTAINER.STATUS_CHANGE |
ERROR |
Falha ao extrair a imagem |
PENDING |
CONTAINER.STATUS_CHANGE |
ERROR |
O nome de imagem fornecido usa um formato inválido |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
Erro fatal encontrado, tentando novamente |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
Erro fatal encontrado |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
Foi encontrado um erro fatal durante a execução, verifique os logs de contêiner |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
o contêiner era OOMKilled devido ao uso de recurso |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
Erro de aplicativo do usuário, verifique os logs de contêiner |
FAILED |
CONTAINER.STATUS_CHANGE |
ERROR |
Foi encontrado um erro fatal ao iniciar o contêiner |
FAILED |
CONTAINER.STATUS_CHANGE |
INFO |
Concluído com sucesso |
DONE |
Diretrizes e limitações¶
A taxa de transferência máxima para logs ingeridos na tabela de eventos por nó é de 1 MB/segundo para contas Snowflake no AWS e no Azure.
A taxa de transferência máxima combinada para métricas e rastreamentos ingeridos na tabela de eventos é de 1 MB/segundo por nó para o Azure e o AWS.
O tamanho máximo de registro para logs ingeridos na tabela de eventos é de 16 KiB.