Solução de problemas do conector¶
O Snowflake Connector for ServiceNow® está sujeito aos Termos do Snowflake Connector.
Este tópico fornece diretrizes para a solução de problemas com o Snowflake Connector for ServiceNow®.
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();
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"
- Onde:
servicenow_instance
Especifica o nome de sua instância do ServiceNow®.
username
epassword
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"
- Onde:
servicenow_instance
Especifica o nome de sua instância do ServiceNow®.
username
epassword
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® pode acessar a instância de ServiceNow®, chame o procedimento armazenado TEST_CONNECTION
:
CALL TEST_CONNECTION();
Se o conector estiver configurado corretamente, o procedimento armazenado retornará a seguinte resposta:
{
"responseCode": "OK",
"message": "Test request to ServiceNow succeeded."
}
Verificação do acesso à tabela específica na instância do ServiceNow®¶
Para verificar se Snowflake Connector for ServiceNow® 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>');
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."
}
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>');
ou
CALL CHECK_ROW_COUNT('<table_name>', <max_sys_created_on>);
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');
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>');
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 |
---|---|
|
Nome da tabela. |
|
Identificador exclusivo para a linha no ServiceNow®. |
|
Status da ingestão da linha. |
|
|
|
|
|
|
|
Conjunto de objetos JSON que representam entradas no log de eventos para a linha com este 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:
|
Como determinar se uma tabela foi auditada para exclusão¶
O Snowflake Connector for ServiceNow® 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>');
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 |
---|---|
|
O valor |
|
Valor do atributo |
|
Valor do atributo |
|
Explicação legível para humanos sobre se a auditoria está habilitada na tabela com base nos valores dos campos
|
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>);
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');
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:
Certifique-se de que os logs de eventos e as tabelas de dados brutos desta tabela do ServiceNow® sejam descartados.
Use o procedimento DELETE_TABLE.
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.
Erro ao ingerir dados da tabela. A solicitação para ServiceNow® falhou após 2 tentativas.¶
O erro ocorre devido a uma falha na ingestão da tabela. Você pode verificar isso na exibição CONNECTOR_ERRORS
. A mensagem de erro pode incluir as seguintes frases:
Erro ao ingerir dados da tabela
O tamanho mínimo de página de 1 foi atingido
A solicitação para ServiceNow® falhou após 2 tentativas
Solicitação para ServiceNow® com tempo esgotado
O erro significa que o conector tentou realizar solicitações para ServiceNow® API. ServiceNow® API não conseguiu responder corretamente a nenhuma dessas solicitações. Isso geralmente indica um problema de desempenho com a API. Há várias soluções possíveis para esse problema:
Aumentar o tempo limite da API no lado do ServiceNow®:
Faça login na instância do ServiceNow®.
Navegue até o painel Transaction Quota Rules.
Localize e abra a regra REST Table API request timeout.
Aumente o valor de Maximum Duration (seconds). A duração máxima que o conector pode suportar é de 120 segundos. Valores de duração mais altos não são compatíveis e resultarão em tempos limite no lado do conector.
Certifique-se de que não haja ACLs desnecessários na tabela. Os ACLs têm um grande impacto no desempenho da API. O ideal é que o usuário do conector não tenha ACLs definidos na tabela. Se houver necessidade de omitir algumas linhas da tabela ingerida, considere o uso da filtragem de linhas.
Na tabela do ServiceNow®, crie um índice composto nas colunas sys_updated_on e sys_id ou nas colunas sys_created_on e sys_id, se a coluna sys_updated_on não estiver presente.
Investigue os registros do ServiceNow® para descobrir por que a API demorou a responder. Um bom ponto de partida é o registro de transações no ServiceNow®. Para ver as solicitações de conectores:
Faça login na instância do ServiceNow®.
Navegue até o painel System Logs > Transactions (all user).
Filtre a tabela pela coluna Created by definida como usuário do conector e pela coluna URL que contém o nome da tabela ingerida.
Verifique se a coluna Response time apresenta um tempo de resposta anormalmente alto, superior ao tempo limite de solicitação da API da tabela REST definido na etapa anterior.
Investigue outras transações suspeitas para identificar possíveis gargalos.
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>';
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;
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>';
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>
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
. Após a conclusão do recarregamento, aguarde a próxima ingestão programada para recriar a exibição com a lista correta de colunas.
Tabela com cronograma contínuo desativada pelo conector¶
O conector desativa automaticamente as tabelas com cronograma contínuo quando detecta que a ingestão nessa tabela falhou por 10 vezes consecutivas, e a causa de todas as execuções de ingestão com falha está relacionada à instância do ServiceNow®. Esse mecanismo evita a sobrecarga da instância do ServiceNow® quando muitas tabelas com cronograma contínuo são ativadas e permite que a instância do ServiceNow® se recupere depois que a tabela é desativada. O conector não habilita a tabela novamente de forma automática, ela deve ser habilitada manualmente pelo usuário.
A informação de que uma tabela está automaticamente desativada fica visível na exibição CONNECTOR_ERRORS
ao filtrar pelo código TABLE_INGESTION_DISABLED
. Quando o erro ocorrer, investigue por que as execuções de ingestão na tabela falharam. Você pode encontrar informações detalhadas sobre os erros na exibição CONNECTOR_ERRORS
após filtrar pelo código INGESTION_FAILED
.
Depois que a causa do erro for investigada e resolvida, a tabela poderá ser habilitada novamente chamando o procedimento ENABLE_TABLE
ou ENABLE_TABLES
.