Solução de problemas do conector

O Snowflake Connector para ServiceNow® V2 está sujeito aos Termos do Snowflake Connector.

Este tópico fornece diretrizes para a solução de problemas com o Snowflake Connector for ServiceNow®V2.

Neste tópico:

Nota

As seções a seguir descrevem procedimentos armazenados definidos no esquema PUBLIC do aplicativo conector. Antes de chamar esses procedimentos armazenados, selecione esse aplicativo como o banco de dados a ser usado para a sessão.

Por exemplo, se esse aplicativo for nomeado my_connector_servicenow e você chamar o procedimento do conector TEST_CONNECTION executando os seguintes comandos:

USE APPLICATION my_connector_servicenow;
CALL TEST_CONNECTION();
Copy

Resolução de problemas durante a instalação do conector

Os problemas mais comuns durante a instalação do conector estão relacionados ao conjunto de ACLs nas tabelas de metadados, como sys_db_object, sys_dictionary e sys_glide_object. Além disso, o conector requer acesso à tabela sys_table_rotation para determinar a estratégia de ingestão correta e, opcionalmente, à tabela de diário (geralmente sys_audit_delete) para propagar a exclusão de dados.

Erros da etapa de autenticação

Podem ocorrer problemas ao conectar-se ao ServiceNow no assistente de instalação ou ao executar manualmente o procedimento SET_CONNECTION_CONFIGURATION. Caso encontre erros durante esta etapa, certifique-se de que o usuário que instalou o conector tenha acesso à tabela sys_db_object.

Os códigos de status de erro que podem estar relacionados a problemas de ACL no objeto JSON retornado do procedimento SET_CONNECTION_CONFIGURATION são os seguintes:

  • REQUEST_FAILED

É possível executar a consulta abaixo semelhante à do conector para verificar o acesso. Até que a solicitação retorne o resultado esperado, não será possível instalar o conector. Por exemplo, se você estiver usando curl para enviar a solicitação HTTP:

# checking access to the sys_db_object table
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/sys_db_object?sysparm_limit=1"
Copy
Onde:
servicenow_instance

Especifica o nome de sua instância do ServiceNow®.

username e password

Especifique as credenciais para sua instância do ServiceNow®.

Respostas de exemplo:

  • Pelo menos alguns campos são retornados – o usuário tem as permissões necessárias para acessar a tabela.

  • A resposta está vazia – o usuário tem permissão para acessar a tabela, mas não o registro processado. Isso pode causar problemas mais tarde.

  • A resposta contém um erro – o usuário não tem as permissões necessárias para acessar a tabela.

Validação de erros de etapa de origem

Podem ocorrer problemas ao validar a origem no assistente de instalação ou ao executar manualmente o procedimento FINALIZE_CONNECTOR_CONFIGURATION. Se encontrar erros durante esta etapa, certifique-se de que o usuário usado para instalar o conector tenha as permissões necessárias para acessar as tabelas de metadados.

Os códigos de status de erro que podem estar relacionados a problemas de ACL no objeto JSON retornado do procedimento FINALIZE_CONNECTOR_CONFIGURATION são os seguintes:

  • METADATA_TABLE_ACCESS_VALIDATION_ERROR

  • JOURNAL_TABLE_ACCESS_VALIDATION_ERROR

É possível executar consultas abaixo semelhantes às do conector para verificar o acesso. Até que as solicitações retornem os resultados esperados, não será possível instalar o conector. Por exemplo, se você estiver usando curl para enviar a solicitação HTTP:

# checking access to the sys_db_object table
# expected fields in the result object: sys_id, super_class, name
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/sys_db_object?sysparm_fields=sys_id,super_class,name&sysparm_limit=1&sysparm_query=name=sys_db_object"

# checking access to the sys_dictionary table
# expected fields in the result object: sys_id, name, element, internal_type
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/sys_dictionary?sysparm_fields=sys_id,name,element,internal_type&sysparm_limit=1&sysparm_query=name=sys_dictionary"

# checking access to the sys_glide_object table
# expected fields in the result object: sys_id, name, scalar_type
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/sys_glide_object?sysparm_fields=sys_id,name,scalar_type&sysparm_limit=1&sysparm_query=name=datetime"

# checking access to the sys_table_rotation table
# expected fields in the result object: sys_id, name
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/sys_table_rotation?sysparm_fields=sys_id,name&sysparm_limit=1&sysparm_query=name=syslog"

# (optional) - check only if deletions auditing is going to be used
# checking access to the journal table
# if known, "&sysparm_query=tablename=<table_name>" or "&sysparm_query=documentkey=<sys_id>" can be appended to the request
# expected fields in the result object: sys_id, sys_created_on, documentkey, tablename
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/<journal_table>?sysparm_fields=sys_id,sys_created_on,documentkey,tablename&sysparm_limit=1"
Copy
Onde:
servicenow_instance

Especifica o nome de sua instância do ServiceNow®.

username e password

Especifique as credenciais para sua instância do ServiceNow®.

journal_table

Especifica o nome de sua tabela ServiceNow® usada para auditoria de exclusões. Normalmente isso tem valor de sys_audit_delete.

Respostas de exemplo:

  • Todos os campos esperados estão presentes na resposta – o usuário tem as permissões necessárias.

  • Alguns dos campos esperados estão ausentes – o usuário não tem as permissões necessárias para todas as colunas.

  • A resposta está vazia – o usuário não tem as permissões necessárias para todas as linhas.

  • A resposta contém um erro – o usuário não tem as permissões necessárias para a tabela.

Verificação da conexão com a instância do ServiceNow®

Para verificar se Snowflake Connector for ServiceNow®V2 pode acessar a instância de ServiceNow®, chame o procedimento armazenado TEST_CONNECTION:

CALL TEST_CONNECTION();
Copy

Se o conector estiver configurado corretamente, o procedimento armazenado retornará a seguinte resposta:

{
  "responseCode": "OK",
  "message": "Test request to ServiceNow succeeded."
}
Copy

Verificação do acesso à tabela específica na instância do ServiceNow®

Para verificar se Snowflake Connector for ServiceNow®V2 pode acessar dados da tabela específica na instância de ServiceNow®, chame o procedimento armazenado TEST_TABLE_ACCESS:

CALL TEST_TABLE_ACCESS('<table_name>');
Copy

Onde:

table_name

Especifica o nome de uma tabela na instância do ServiceNow®.

Se o conector estiver configurado corretamente e os dados estiverem disponíveis para o usuário utilizado pelo conector, o procedimento armazenado retornará a seguinte resposta:

{
  "responseCode": "OK",
  "message": "Test request to ServiceNow® succeeded."
}
Copy

Nota

Se a tabela estiver vazia ou todas as linhas estiverem ocultas do conector devido a ACLs, a mensagem dirá: Test request to ServiceNow® succeeded but it didn't return any record. Nessa situação, certifique-se de que a tabela esteja realmente vazia. Se alguma linha estiver visível na UI, significa que o conector não é capaz de ingeri-las.

Comparação de contagem de linhas de tabela no ServiceNow® e no Snowflake

Para comparar a contagem atual de linhas de uma tabela no ServiceNow® e Snowflake, chame o procedimento CHECK_ROW_COUNT:

CALL CHECK_ROW_COUNT('<table_name>');
Copy

ou

CALL CHECK_ROW_COUNT('<table_name>', <max_sys_created_on>);
Copy

Onde:

table_name

Especifica o nome de uma tabela na instância do ServiceNow®.

max_sys_created_on

Especifica filtro opcional adicional no valor máximo da coluna sys_created_on. Somente linhas que corresponderem a este filtro serão contadas. O valor padrão deste parâmetro é NULL, o que significa que o filtro não será aplicado. Este parâmetro ajuda a comparar apenas contagens de registros já ingeridos no Snowflake, sem levar em conta os registros criados recentemente no ServiceNow®, mas ainda não ingeridos no Snowflake.

O exemplo a seguir mostra como chamar o procedimento armazenado CHECK_ROW_COUNT com o parâmetro max_sys_created_on:

CALL CHECK_ROW_COUNT('sys_db_object', '2021-09-10 12:34:56');
Copy

Se o tempo do procedimento expirar, o procedimento não poderia usar a stats API para determinar a contagem de linhas da tabela no ServiceNow®. Isto pode significar que o número de linhas nesta tabela seja muito grande para ser contado por esta API.

Nota

O número de linhas retornadas pode variar. Uma tabela do ServiceNow® pode conter mais linhas que a tabela equivalente do Snowflake. Isto pode ser causado pelas regras da lista de controle de acesso (ACLs) definida para uma determinada tabela no ServiceNow®.

O conector usa diferentes pontos de extremidade para recuperar informações sobre o número de linhas em uma tabela do ServiceNow®. O conector usa stats para informações sobre uma tabela, incluindo o número de linhas. Ele usa table para ingerir dados no Snowflake.

Verificação do status da ingestão de uma linha

Para verificar o status da ingestão de uma linha em todos os lugares possíveis no ServiceNow® e Snowflake, chame o procedimento CHECK_RECORD_HISTORY:

CALL CHECK_RECORD_HISTORY('<table_name>', '<sys_id>');
Copy

Onde:

table_name

Especifica o nome de uma tabela na instância do ServiceNow®.

sys_id

Especifica o sys_id da linha a ser verificada.

O procedimento devolve um objeto JSON contendo as seguintes propriedades:

Propriedade

Descrição

table_name

Nome da tabela.

sys_id

Identificador exclusivo para a linha no ServiceNow®.

status

Status da ingestão da linha.

is_present_in_servicenow

true se a linha estiver presente na tabela no ServiceNow®; caso contrário, false.

is_present_in_servicenow_audit_table

true se a linha for rastreada na tabela de auditoria no ServiceNow®; caso contrário, false.

is_present_in_snowflake_destination_table

true se a linha já tiver sido ingerida e estiver disponível no banco de dados dest_db no Snowflake; caso contrário, false.

event_log_records

Conjunto de objetos JSON que representam entradas no log de eventos para a linha com este sys_id.

Cada objeto contém as seguintes propriedades, que correspondem às colunas na tabela de log de eventos que especificam os carimbos de data/hora e os tipos de eventos da alteração de dados:

  • sys_updated_on

  • event_date

  • event_type

Como determinar se uma tabela foi auditada para exclusão

O Snowflake Connector for ServiceNow®V2 depende de auditoria para propagar a exclusão de registros para o Snowflake.

Para verificar se uma determinada tabela no ServiceNow® está configurada para auditar a exclusão de registros, chame o procedimento armazenado CHECK_IF_AUDIT_ENABLED:

CALL CHECK_IF_AUDIT_ENABLED('<table_name>');
Copy

Onde:

table_name

Especifica o nome de uma tabela na instância do ServiceNow®.

O procedimento devolve um objeto JSON contendo as seguintes propriedades:

Propriedade

Descrição

response_code

O valor OK se o procedimento foi bem-sucedido ou um código do erro em caso de falha.

audit

Valor do atributo audit para a tabela verificada. Se definido como verdadeiro, a auditoria será habilitada na tabela.

no_audit_delete

Valor do atributo no_audit_delete para a tabela verificada. Se estiver definido, ele substituirá o valor do campo audit para eventos de exclusão.

summary

Explicação legível para humanos sobre se a auditoria está habilitada na tabela com base nos valores dos campos audit e no_audit_delete. A auditoria é habilitada na tabela quando:

  • O campo audit está definido como verdadeiro e no_audit_delete não está definido como verdadeiro.

  • no_audit_delete está definido como falso.

Obtenção de dados para solução de problemas

Para obter dados de solução de problemas, chame o procedimento armazenado GET_TROUBLESHOOTING_DATA:

CALL GET_TROUBLESHOOTING_DATA(<from_timestamp>, <to_timestamp>);
Copy

Onde:

from_timestamp

Especifica o início do intervalo de datas (no fuso horário UTC) para o qual os dados devem ser buscados.

to_timestamp

Especifica o fim do intervalo de datas (no fuso horário UTC) para o qual os dados devem ser buscados.

Este procedimento armazenado retorna os seguintes dados em formato tabular:

  • Informações de configuração

  • Erros experimentados pelo conector

  • Histórico de ingestão

O exemplo a seguir mostra como chamar este procedimento armazenado:

CALL GET_TROUBLESHOOTING_DATA('2024-02-05 10:00:00', '2024-02-10 22:30:00');
Copy

Você pode salvar os dados retornados no formato CSV para enviar para o suporte Snowflake.

Recuperação de um objeto inacessível

O conector requer vários objetos de banco de dados que são externos ao aplicativo do conector. Se esses objetos não estiverem disponíveis, o conector falhará ou deixará de funcionar corretamente. Situações em que os objetos podem ficar indisponíveis incluem:

  • Descarte de objetos.

  • Recriação de um objeto sem manter ou restaurar as concessões necessárias.

  • Revogação das concessões necessárias para que o conector utilize esses objetos.

Na maioria dos casos, você pode restaurar estes objetos manualmente recriando-os e concedendo os privilégios necessários. As seções a seguir descrevem como restaurar diferentes objetos.

Restauração do warehouse do conector

Se o conector perder o acesso a seu warehouse, configure um novo chamando o procedimento armazenado UPDATE_WAREHOUSE.

Restauração do banco de dados e esquema para os dados do ServiceNow®

Se o banco de dados ou esquema para os dados do ServiceNow® for descartado, a única maneira de recuperá-lo é executando o comando UNDROP. Se este comando não estiver disponível, você deverá reinstalar o conector e fazer a ingestão dos dados do ServiceNow® novamente.

Se uma exibição contendo os dados do ServiceNow® for descartada, ela deverá ser recriada automaticamente na próxima vez em que a tarefa em segundo plano responsável pela sua criação for executada.

Se uma das tabelas contendo os dados do ServiceNow® (a tabela de logs de eventos ou dados brutos) for descartada e não for possível usar o comando UNDROP TABLE para recuperá-la, faça o seguinte para iniciar a ingestão da tabela do ServiceNow® novamente:

Restauração da integração da notificação do conector

Se o conector perder o acesso ao objeto de integração de notificação, faça os procedimentos para configurar novamente os alertas, recriando o objeto de integração de notificação, se necessário.

Se as notificações por e-mail forem configuradas via Snowsight, então você pode simplesmente desativá-las e reativá-las para restaurar os objetos externos necessários.

Determinação do motivo da ausência de colunas em exibições niveladas

O conector cria exibições niveladas no esquema de destino com base nos metadados do ServiceNow®. Há vários motivos pelos quais uma coluna pode estar ausente no lado do Snowflake.

Como verificar se os metadados da coluna estão presentes no Snowflake

Para verificar se os metadados da coluna estão presentes na tabela sys_dictionary no Snowflake, execute a seguinte consulta:

SELECT * FROM <dest_db>.<dest_schema>.sys_dictionary__view WHERE name = '<table_name>' AND element = '<column_name>';
Copy

Se a tabela que você estiver investigando tiver tabelas pai (herdadas de outra tabela no ServiceNow®) e a coluna que você estiver procurando tiver sido adicionada à tabela pai, você deve usar o nome da tabela pai.

Para listar todas as tabelas das quais a tabela de seu interesse herda, use a seguinte consulta:

SELECT
    sys_id,
    name,
    PARSE_JSON(super_class):value::string AS super_class_sys_id
FROM <dest_db>.<dest_schema>.sys_db_object__view
START WITH name = '<table_name>'
CONNECT BY sys_id = PRIOR super_class_sys_id;
Copy

Se linhas forem retornadas, os metadados da coluna foram corretamente ingeridos no Snowflake, mas a exibição ainda não foi atualizada. Verifique o status e se:

  • a visualização foi atualizada recentemente, mas a coluna ainda não está presente. Entre em contato com o suporte.

  • a visualização ainda não foi atualizada, aguarde o próximo cronograma de ingestão.

Se um resultado vazio for retornado, significa que o conector ainda não ingeriu os metadados para esta coluna. Você precisa validar no lado do ServiceNow® se o registro está visível para o conector e tem o carimbo de data/hora correto.

Exibição do status de atualização

Para validar quando as visualizações de uma determinada tabela foram atualizadas pela última vez e se a operação foi bem-sucedida, execute a seguinte consulta:

SELECT flattened_views_status, flattened_views_last_updated FROM tables_state WHERE table_name = '<table_name>';
Copy

Se a última atualização tiver falhado, talvez você queira consultar a tabela de eventos e procurar por erros relatados pelo conector.

Visualização de disponibilidade dos metadados da coluna do ServiceNow®

É possível que o motivo das colunas estarem ausentes na exibição nivelada seja que os metadados da coluna não podem ser ingeridos pelo conector. Isso pode estar sendo causado por ACLs impedindo a linha na tabela sys_dictionary de ser retornada pela API da tabela. Outra razão possível é um valor de carimbo de data/hora anterior na coluna sys_updated_on. Também pode ser o caso de a definição da coluna/tabela ter sido importada de uma instância diferente do ServiceNow®. Para determinar se o conector pode acessar metadados de coluna, execute a solicitação GET para o seguinte ponto de extremidade:

https://<servicenow_instance>.service-now.com/api/now/table/sys_dictionary?sysparm_query=name=<table_name>^element=<column_name>
Copy

Se um resultado vazio for retornado, o conector não poderá acessar a coluna. A coluna pode estar protegida por uma ACL ou não estar presente.

Se uma definição de coluna tiver sido retornada, examine o valor do campo sys_updated_on. Confirme se a data corresponde ao horário esperado em que a coluna foi adicionada à tabela. Se a importação foi feita de outra instância, será possível mostrar o momento em que a coluna foi criada. O mecanismo de CDC (atualizações incrementais) no conector pode não perceber que o registro datado no passado foi adicionado. Neste caso, acione uma recarga da tabela sys_dictionary.

Conector indisponível

O conector pode entrar em um estado de ERROR, o que pode acontecer por vários motivos. Por exemplo, o erro interno do conector, que não pode ser recuperado. Nessas situações, a mensagem de erro Connector unavailable será exibida ao examinar o estado do conector.

Atualmente, não há mecanismo de recuperação automática para esse estado. No entanto, ainda é possível executar diversas funções de conector, incluindo o procedimento EXPORT_CONNECTOR_STATE.

Para examinar se o conector está em um estado ERROR, execute a consulta:

CALL GET_CONNECTOR_STATUS();
Copy

Além disso, entre em contato com o suporte Snowflake para nos ajudar a entender melhor o problema ou determinar como ele pode ser evitado. Também é necessário executar a reinstalação manual do conector para restaurar o conector para um estado de funcionamento. Observe que os dados ingeridos anteriormente não são perdidos e o conector pode continuar a ingestão de onde parou anteriormente.