Snowpark Container Services: Serviços de monitoramento¶
Acesso aos 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. Você deve garantir que seu código produza informações úteis para depurar um serviço.
O Snowflake oferece duas maneiras de acessar esses logs de contêineres de serviço (incluindo serviço de trabalho):
Usando a função do sistema SYSTEM$GET_SERVICE_LOGS: dá acesso aos logs de um contêiner específico. 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. Para obter mais informações, consulte SYSTEM$GET_SERVICE_LOGS.
Como usar uma tabela de evento: A tabela de evento da conta fornece acesso a logs de vários contêineres para serviços que permitem a coleta de log em suas especificações. Snowflake persiste os logs na tabela de eventos para acesso posterior. As tabelas de eventos são melhor utilizadas para a análise retrospectiva de serviços e trabalhos. Para obter mais informações, consulte Como usar tabela de evento.
Como usar SYSTEM$GET_SERVICE_LOGS¶
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.
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. Por exemplo, a instrução SELECT a seguir recupera 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!']]}"
Acesso a métricas¶
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. É possível consultar a tabela de evento 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 evento 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
Siga estas etapas para criar um serviço de exemplo que registre métricas na tabela de evento configurada para sua conta.
Siga o Tutorial 1 para criar um serviço nomeado
echo_service
, com uma alteração. Na etapa 3, onde você cria um serviço, use o seguinte comando CREATE SERVICE para adicionar o campoplatformMonitor
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 a execução do serviço, o Snowflake começa a registrar as métricas nos grupos de métricas especificados na tabela de evento, que você pode consultar. A consulta a seguir recupera métricas relatadas na última hora pelo serviço Echo.
SELECT timestamp, value ROM my_events WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP()) AND RESOURCE_ATTRIBUTES:"snow.service.name" = 'ECHO_SERVICE' AND RECORD_TYPE = 'METRIC' ORDER BY timestamp, group DESC LIMIT 10;
Como acessar as 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.snowflakecomputing.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 |
booleano |
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 |
booleano |
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 . ontainer.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 |
booleano |
gauge |
Quando um contêiner estiver no estado “pendente”, esta métrica será emitida com o valor 1. |
status . container.state.pending.reason |
booleano |
gauge |
Quando um contêiner estiver no estado “pendente”, esta métrica será emitida com valor 1. O rótulo “motivo” descreve o motivo pelo qual o contêiner estava recentemente no estado pendente. |
status . container.state.running |
booleano |
gauge |
Quando um contêiner estiver no estado “em execução”, essa métrica terá valor 1. |
status . container.state.started |
booleano |
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. |