Captura de mensagens de exceções não tratadas

Por padrão, quando você configura uma tabela de eventos, o Snowflake registra automaticamente exceções não tratadas nos manipuladores de UDF procedimento na tabela de eventos. A captura dessas mensagens não requer a inclusão de código de manipulador específico para criação de log ou rastreamento. Você pode desabilitar este recurso para que as exceções não tratadas não sejam registradas automaticamente.

Importante

As mensagens de erro podem conter informações confidenciais. Considere desabilitar esse recurso se não quiser que informações potencialmente confidenciais sejam capturadas em uma tabela de eventos. Para saber mais, consulte Proteção de dados confidenciais.

Nota

Atualmente, esse recurso é compatível com código de manipulador escrito apenas em Java ou Python.

Configuração do registro em log e o rastreamento para capturar exceções não tratadas

Defina o nível de log ou rastreamento para que o Snowflake capture entradas para exceções não tratadas. Você pode capturar entradas como entradas de log, entradas de eventos de rastreamento ou ambas.

Dados capturados para exceções não tratadas

Você pode capturar dados de mensagens como uma entrada de log, um evento de rastreamento ou ambos. Os dados capturados serão diferentes entre entradas de eventos de log e de rastreamento.

Dados capturados em uma entrada de log

Por padrão, o Snowflake registra o seguinte na tabela de eventos para exceções não tratadas em manipuladores de UDF e procedimento:

Coluna

Dados

Coluna RECORD

Um atributo severity_text cujo valor é o nível de erro de maior gravidade para o ambiente de execução da linguagem atual. Por exemplo, para um manipulador escrito em Python, o valor é FATAL.

Coluna RECORD_ATTRIBUTES

Os atributos a seguir são registrados para uma exceção não tratada.

  • exception.message – A mensagem de erro.

  • exception.type – O nome da classe de exceção.

  • exception.stacktrace – O rastreamento de pilha da exceção formatado por um tempo de execução de linguagem.

  • exception.escapedtrue se esta entrada for de uma exceção não tratada.

Coluna VALUE

A cadeia de caracteres exception.

Exemplo

O código no exemplo a seguir consulta uma tabela de eventos em busca de dados de log registrados para uma exceção não tratada de um manipulador de UDF.

Para obter mais informações sobre como consultar dados de log em uma tabela de eventos, consulte Acesso a dados de mensagens registradas.

SET event_table_name = 'my_db.public.my_event_table';

SELECT
  RECORD['severity_text'] AS severity,
  RECORD_ATTRIBUTES['exception.message'] AS error_message,
  RECORD_ATTRIBUTES['exception.type'] AS exception_type,
  RECORD_ATTRIBUTES['exception.stacktrace'] AS stacktrace
FROM
  my_event_table
WHERE
  RECORD_TYPE = 'LOG';
Copy

A seguir está a saída possível da consulta.

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SEVERITY | ERROR_MESSAGE                                        | EXCEPTION_TYPE | STACKTRACE                                                                                                                                          |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| "FATAL"  | "could not convert string to float: '$1,000,000.00'" | "ValueError"   | "Traceback (most recent call last):\n  File \"_udf_code.py\", line 6, in compute\nValueError: could not convert string to float: '$1,000,000.00'\n" |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Dados capturados em uma entrada de evento de rastreamento

Por padrão, o Snowflake registra o seguinte na tabela de eventos para exceções não tratadas em manipuladores de UDF e procedimento:

Coluna

Dados

Coluna RECORD

Um atributo name cujo valor é exception e um atributo status cujo valor é STATUS_CODE_ERROR.

Coluna RECORD_ATTRIBUTES

Os atributos a seguir são registrados para uma exceção não tratada.

  • exception.message – A mensagem de erro.

  • exception.type – O nome da classe de exceção.

  • exception.stacktrace – O rastreamento de pilha da exceção formatado por um tempo de execução de linguagem.

  • exception.escapedtrue se esta entrada for de uma exceção não tratada.

Exemplos

O código nos exemplos a seguir consulta uma tabela de eventos para obter dados de eventos de rastreamento registrados para uma exceção não tratada de um manipulador de UDF.

Para obter mais informações sobre como consultar dados de eventos de rastreamento em uma tabela de eventos, consulte Acesso a dados de rastreamento.

Exemplo de span
SET event_table_name = 'my_db.public.my_event_table';

SELECT
  RECORD['status']['code'] AS span_status
FROM
  my_event_table
WHERE
  record_type = 'SPAN';
Copy

A seguir está a saída possível da consulta.

-----------------------
| SPAN_STATUS         |
-----------------------
| "STATUS_CODE_ERROR" |
-----------------------
Exemplo de evento de span
SET event_table_name = 'my_db.public.my_event_table';

SELECT
  RECORD['name'] AS event_name,
  RECORD_ATTRIBUTES['exception.message'] AS error_message,
  RECORD_ATTRIBUTES['exception.type'] AS exception_type,
  RECORD_ATTRIBUTES['exception.stacktrace'] AS stacktrace
FROM
  my_event_table
WHERE
  RECORD_TYPE = 'SPAN_EVENT';
Copy

A seguir está a saída possível da consulta.

-----------------------------------------------------------------------------------------------------------------------------------------
| EVENT_NAME  | ERROR_MESSAGE                                        | EXCEPTION_TYPE | STACKTRACE                                      |
-----------------------------------------------------------------------------------------------------------------------------------------
| "exception" | "could not convert string to float: '$1,000,000.00'" | "ValueError"   | "  File \"_udf_code.py\", line 6, in compute\n" |
-----------------------------------------------------------------------------------------------------------------------------------------

Proteção de dados confidenciais

Dado que as mensagens de log e rastreamento de exceções não tratadas podem incluir dados confidenciais, considere fazer o seguinte para proteger esses dados:

  • Tome medidas para proteger dados confidenciais, fazendo o seguinte:

    • Melhore seu código de tratamento de exceções para minimizar o risco de exceções não tratadas.

    • Aplique políticas de acesso a linhas à sua tabela de eventos para restringir o acesso a linhas que contenham informações de identificação pessoal (PII).

    • Crie uma exibição na parte superior da tabela de eventos e aplique políticas de mascaramento a ela para mascarar ou excluir informações de identificação pessoal (PII).

  • Desative o registro de exceções não tratadas definindo o parâmetro ENABLE_UNHANDLED_EXCEPTIONS_REPORTING como false.