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);
Copy

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;
Copy

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"
    }
    
    Copy
  • RECORD_ATTRIBUTES: para um serviço Snowflake, ele identifica uma origem de erro (saída padrão ou erro padrão).

    { "log.iostream": "stdout" }
    
    Copy
  • 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>
    - ...
Copy

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;
Copy

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;
Copy

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.

  1. 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 campo platformMonitor 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;
    
    Copy
  2. 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;
    
    Copy

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étrica node_memory_capacity é do tipo gauge.

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