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();
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®V2 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®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>');
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®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>');
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.
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
.