Dépannage du connecteur

Snowflake Connector pour ServiceNow® V2 est soumis aux Conditions de Snowflake Connector.

Ce chapitre fournit des lignes directrices pour la résolution des problèmes liés au Snowflake Connector for ServiceNow®V2.

Dans ce chapitre :

Note

Les sections suivantes décrivent les procédures stockées définies dans le schéma PUBLIC de l”application de connecteur. Avant d’appeler ces procédures stockées, sélectionnez cette application comme base de données à utiliser pour la session.

Par exemple, si cette application est nommée my_connector_servicenow, appelez la procédure de connecteur TEST_CONNECTION via les commandes suivantes :

USE APPLICATION my_connector_servicenow;
CALL TEST_CONNECTION();
Copy

Résolution des problèmes lors de l’installation du connecteur

Les problèmes les plus courants lors de l’installation du connecteur sont liés aux ACLs définies sur les tables de métadonnées telles que sys_db_object, sys_dictionary et sys_glide_object. De plus, le connecteur nécessite un accès à la table sys_table_rotation pour déterminer la stratégie d’ingestion correcte et éventuellement à la table de journaux (généralement sys_audit_delete) pour propager la suppression des données.

Erreurs d’étape d’authentification

Des problèmes peuvent survenir lors de la connexion à ServiceNow dans l’assistant d’installation ou lors de l’exécution manuelle de la procédure SET_CONNECTION_CONFIGURATION. Si vous rencontrez des erreurs lors de cette étape, assurez-vous que l’utilisateur employé pour installer le connecteur a accès à la table sys_db_object.

Les codes de statut d’erreur susceptibles d’être associés à des problèmes d’ACL dans l’objet JSON renvoyé par la procédure SET_CONNECTION_CONFIGURATION sont les suivants :

  • REQUEST_FAILED

Vous pouvez effectuer la requête ci-dessous similaire à celle du connecteur pour vérifier l’accès. Tant que la requête ne renvoie pas le résultat prévu, il ne sera pas possible d’installer le connecteur. Par exemple, si vous utilisez curl pour envoyer la requête 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
Où :
servicenow_instance

Spécifie le nom de votre instance ServiceNow®.

username et password

Spécifiez les identifiants de connexion de votre instance ServiceNow®.

Exemples de réponse :

  • Au moins certains champs sont renvoyés - l’utilisateur dispose des autorisations nécessaires pour accéder à la table.

  • La réponse est vide - l’utilisateur est autorisé à accéder à la table, mais pas à l’enregistrement traité. Cela pourrait causer des problèmes ultérieurement.

  • La réponse contient une erreur - l’utilisateur n’a pas les autorisations nécessaires pour accéder à la table.

Valider les erreurs d’étapes associées à la source

Des problèmes peuvent survenir lors de la validation de la source dans l’assistant d’installation ou lors de l’exécution manuelle de la procédure FINALIZE_CONNECTOR_CONFIGURATION. Si vous rencontrez des erreurs lors de cette étape, assurez-vous que l’utilisateur employé pour installer le connecteur dispose des autorisations nécessaires pour accéder aux tables de métadonnées.

Les codes de statut d’erreur susceptibles d’être associés à des problèmes d’ACL dans l’objet JSON renvoyé par la procédure FINALIZE_CONNECTOR_CONFIGURATION sont les suivants :

  • METADATA_TABLE_ACCESS_VALIDATION_ERROR

  • JOURNAL_TABLE_ACCESS_VALIDATION_ERROR

Vous pouvez effectuer les requêtes ci-dessous similaires à celles du connecteur pour vérifier l’accès. Tant que les requêtes ne renvoient pas les résultats prévus, il ne sera pas possible d’installer le connecteur. Par exemple, si vous utilisez curl pour envoyer la requête 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
Où :
servicenow_instance

Spécifie le nom de votre instance ServiceNow®.

username et password

Spécifiez les identifiants de connexion de votre instance ServiceNow®.

journal_table

Spécifie le nom de votre table ServiceNow® utilisée pour l’audit des suppressions. La valeur est généralement sys_audit_delete.

Exemples de réponse :

  • Tous les champs prévus sont présents dans la réponse - l’utilisateur dispose des autorisations nécessaires.

  • Il manque certains des champs prévus - l’utilisateur ne dispose pas des autorisations nécessaires sur toutes les colonnes.

  • La réponse est vide - l’utilisateur ne dispose pas des autorisations nécessaires sur toutes les lignes.

  • La réponse contient une erreur - l’utilisateur ne dispose pas des autorisations nécessaires sur la table.

Vérification de la connexion à l’instance ServiceNow®

Pour vérifier que Snowflake Connector for ServiceNow®V2 peut accéder à l’instance ServiceNow®, appelez la procédure stockée TEST_CONNECTION :

CALL TEST_CONNECTION();
Copy

Si le connecteur est correctement configuré, la procédure stockée renvoie la réponse suivante :

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

Vérification de l’accès à la table spécifique dans l’instance ServiceNow®

Pour vérifier que Snowflake Connector for ServiceNow®V2 peut accéder aux données de la table spécifique dans l’instance ServiceNow®, appelez la procédure stockée TEST_TABLE_ACCESS :

CALL TEST_TABLE_ACCESS('<table_name>');
Copy

Où :

table_name

Spécifie le nom d’une table dans l’instance ServiceNow®.

Si le connecteur est correctement configuré et que les données sont disponibles pour l’utilisateur utilisé par le connecteur, la procédure stockée renvoie la réponse suivante :

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

Note

Si la table est vide ou si toutes les lignes sont masquées au connecteur à cause d’ACLs, le message indiquera : Test request to ServiceNow® succeeded but it didn't return any record.. Dans ce cas, assurez-vous que la table est réellement vide. Si des lignes sont visibles depuis l’UI, cela signifie que le connecteur n’est pas en mesure de les ingérer.

Comparaison des nombres de lignes des tables dans ServiceNow® et Snowflake

Pour comparer le nombre de lignes actuel d’une table dans ServiceNow® et dans Snowflake, appelez la procédure CHECK_ROW_COUNT :

CALL CHECK_ROW_COUNT('<table_name>');
Copy

ou

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

Où :

table_name

Spécifie le nom d’une table dans l’instance ServiceNow®.

max_sys_created_on

Spécifie un filtre facultatif supplémentaire sur la valeur maximale de la colonne sys_created_on. Seules les lignes correspondant à ce filtre seront comptabilisées. La valeur par défaut de ce paramètre est NULL, ce qui signifie que le filtre ne sera pas appliqué. Ce paramètre permet de comparer uniquement les comptes d’enregistrements déjà ingérés dans Snowflake, sans tenir compte des enregistrements récemment créés dans ServiceNow®, mais pas encore ingérés dans Snowflake.

L’exemple suivant montre comment appeler la procédure stockée CHECK_ROW_COUNT avec le paramètre max_sys_created_on :

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

Si la procédure expire, c’est qu’elle n’a pas pu utiliser l’API stats pour déterminer le nombre de lignes de la table dans ServiceNow®. Cela peut signifier que le nombre de lignes de cette table est trop important pour être compté par cette API.

Note

Le nombre de lignes renvoyé peut varier. Une table ServiceNow® peut contenir plus de lignes que la table Snowflake équivalente. Cela peut être dû aux règles des listes de contrôle d’accès (ACLs) définies pour une table donnée dans ServiceNow®.

Le connecteur utilise différents points de terminaison pour récupérer des informations sur le nombre de lignes d’une table ServiceNow®. Le connecteur utilise stats pour les informations relatives à une table, notamment le nombre de lignes. Il utilise table pour ingérer les données dans Snowflake.

Vérification du statut de l’ingestion d’une ligne

Pour vérifier le statut de l’ingestion d’une ligne à tous les endroits possibles dans ServiceNow® et Snowflake, appelez la procédure CHECK_RECORD_HISTORY :

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

Où :

table_name

Spécifie le nom d’une table dans l’instance ServiceNow®.

sys_id

Spécifie le sys_id de la ligne à vérifier.

La procédure renvoie un objet JSON contenant les propriétés suivantes :

Propriété

Description

table_name

Nom de la table.

sys_id

Identificateur unique de la ligne dans ServiceNow®.

status

Statut de l’ingestion de la ligne.

is_present_in_servicenow

true si la ligne est présente dans la table dans ServiceNow® ; false dans le cas contraire.

is_present_in_servicenow_audit_table

true si la ligne est suivie dans la table d’audit dans ServiceNow® ; false dans le cas contraire.

is_present_in_snowflake_destination_table

true si la ligne a déjà été ingérée et est disponible dans la base de données dest_db de Snowflake ; false dans le cas contraire.

event_log_records

Tableau d’objets JSON représentant les entrées dans le journal des événements pour la ligne avec ce sys_id.

Chaque objet contient les propriétés suivantes, qui correspondent aux colonnes du tableau de journal des événements qui spécifient les horodatages et les types d’événements de la modification des données :

  • sys_updated_on

  • event_date

  • event_type

Déterminer si une table fait l’objet d’un audit de suppression

Le Snowflake Connector for ServiceNow®V2 s’appuie sur l’audit pour propager la suppression des enregistrements à Snowflake.

Pour vérifier qu’une table donnée dans ServiceNow® est configurée de sorte à auditer la suppression d’enregistrements, appelez la procédure stockée CHECK_IF_AUDIT_ENABLED :

CALL CHECK_IF_AUDIT_ENABLED('<table_name>');
Copy

Où :

table_name

Spécifie le nom d’une table dans l’instance ServiceNow®.

La procédure renvoie un objet JSON contenant les propriétés suivantes :

Propriété

Description

response_code

Valeur OK si la procédure a fonctionné correctement ou code de l’erreur en cas d’échec.

audit

Valeur de l’attribut audit de la table vérifiée. Si cette valeur est définie sur true, l’audit est activé sur la table.

no_audit_delete

Valeur de l’attribut no_audit_delete de la table vérifiée. En cas d’activation, cela remplace la valeur du champ audit pour supprimer des événements.

summary

Explication lisible par l’homme indiquant si l’audit est activé sur la table en fonction des valeurs des champs audit et no_audit_delete. L’audit est activé sur la table lorsque :

  • le champ audit est défini sur true et no_audit_delete n’est pas défini sur true.

  • no_audit_delete est défini sur false.

Obtention des données de dépannage

Pour obtenir des données de dépannage, appelez la procédure stockée GET_TROUBLESHOOTING_DATA :

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

Où :

from_timestamp

Spécifie le début de la plage de dates (dans le fuseau horaire UTC) pour laquelle les données doivent être extraites.

to_timestamp

Spécifie la fin de la plage de dates (dans le fuseau horaire UTC) pour laquelle les données doivent être extraites.

Cette procédure stockée renvoie les données suivantes sous forme de tableau :

  • Informations sur la configuration

  • Erreurs rencontrées par le connecteur

  • Historique d’ingestion

L’exemple suivant montre comment appeler cette procédure stockée :

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

Vous pouvez enregistrer les données renvoyées au format CSV pour les envoyer à l’assistance de Snowflake.

Récupération d’un objet inaccessible

Le connecteur requiert plusieurs objets de base de données qui sont externes à l’application de connecteur. Si ces objets ne sont pas disponibles, le connecteur échouera ou cessera de fonctionner correctement. Les situations dans lesquelles les objets peuvent devenir indisponibles sont les suivantes :

  • Destruction d’un objet.

  • Recréation d’un objet sans conservation ou restauration des autorisations requises.

  • Révocation des autorisations nécessaires à l’utilisation de ces objets par le connecteur.

Dans la plupart des cas, vous pouvez restaurer ces objets manuellement en les recréant et en leur accordant les privilèges nécessaires. Les sections suivantes décrivent comment restaurer différents objets.

Restauration de l’entrepôt de connecteur

Si le connecteur perd l’accès à son entrepôt, configurez-en un nouveau en appelant la procédure stockée UPDATE_WAREHOUSE.

Restauration de la base de données et du schéma des données ServiceNow®

Si la base de données ou le schéma des données ServiceNow® est supprimé, la seule façon de récupérer cet élément est d’exécuter la commande UNDROP. Si cette commande n’est pas disponible, vous devez réinstaller le connecteur et ingérer de nouveau les données ServiceNow®.

Si une vue contenant les données ServiceNow® est supprimée, elle devrait être automatiquement recréée lors de l’exécution suivante de la tâche d’arrière-plan responsable de sa création.

Si l’une des tables contenant les données ServiceNow® (soit les tables de journaux d’événements, soit les tables de données brutes) est supprimée et que vous ne pouvez pas utiliser la commande UNDROP TABLE pour la récupérer, procédez comme suit pour redémarrer l’ingestion de la table ServiceNow® :

Restauration de l’intégration de notification du connecteur

Si le connecteur perd l’accès à l’objet d’intégration de notification, effectuez à nouveau les procédures de configuration des alertes en recréant l’objet d’intégration de notification si nécessaire.

Si les notifications par e-mail sont configurées via Snowsight il suffit de les désactiver et de les réactiver pour restaurer les objets externes nécessaires.

Détermination de la raison pour laquelle il manque des colonnes dans les vues aplaties

Le connecteur crée des vues aplaties dans le schéma de destination en fonction des métadonnées ServiceNow®. Il existe plusieurs raisons pour lesquelles il peut manquer une colonne côté Snowflake.

Vérification de la présence de métadonnées de colonne dans Snowflake

Pour vérifier si les métadonnées de colonne sont présentes dans la table sys_dictionary sur Snowflake, exécutez la requête suivante :

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

Si la table que vous étudiez a des tables parentes (héritées d’une autre table dans ServiceNow®) et que la colonne que vous recherchez a été ajoutée à la table parente, vous devez utiliser le nom de la table parente à la place.

Pour obtenir la liste de toutes les tables dont hérite la table qui vous intéresse, utilisez la requête suivante :

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

Si des lignes sont renvoyées, cela signifie que les métadonnées de la colonne ont été correctement ingérées dans Snowflake, mais que la vue n’a pas encore été actualisée. Vérifiez le statut et si :

  • la vue a été actualisée récemment, mais que la colonne n’est toujours pas présente, contactez l’assistance.

  • la vue n’a pas encore été actualisée, attendez la planification d’ingestion suivante.

Si un résultat vide est renvoyé, cela signifie que le connecteur n’a pas encore ingéré de métadonnées pour cette colonne. Vous devez valider côté ServiceNow® que l’enregistrement est visible par le connecteur et que son horodatage est correct.

Afficher le statut d’actualisation

Pour savoir quand les vues d’une table donnée ont été actualisées pour la dernière fois et si l’opération s’est effectuée correctement, exécutez la requête suivante :

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

Si la dernière actualisation a échoué, il peut être souhaitable d’interroger la table d’événements et de rechercher les erreurs signalées par le connecteur.

Afficher la disponibilité des métadonnées des colonnes ServiceNow®

Il est possible que l’absence de certaines colonnes dans la vue aplatie s’explique par le fait que les métadonnées des colonnes ne peuvent pas être ingérées par le connecteur. Cela peut être dû au fait que les ACLs empêchent le renvoi de la ligne de la table sys_dictionary par l’API Table. Une autre raison possible est une valeur d’horodatage passée dans la colonne sys_updated_on. Il peut également arriver que la définition de la colonne/table ait été importée d’une autre instance de ServiceNow®. Pour déterminer si le connecteur peut accéder aux métadonnées des colonnes, exécutez la requête GET au point de terminaison suivant :

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

Si un résultat vide est renvoyé, cela signifie que le connecteur ne peut pas accéder à la colonne. La colonne peut être protégée par une ACL ou ne pas être présente.

Si une définition de colonne a été renvoyée, examinez la valeur du champ sys_updated_on. Confirmez que la date correspond à l’heure prévue de l’ajout de la colonne à la table. Si elle a été importée d’une autre instance, elle peut indiquer le moment où la colonne a été créée. Le mécanisme CDC (mises à jour incrémentielles) du connecteur peut ne pas remarquer que l’enregistrement daté dans le passé a été ajouté. Dans ce cas, déclenchez un rechargement de la table sys_dictionary.

Le connecteur n’est pas disponible

Le connecteur peut passer à l’état ERROR pour diverses raisons. Par exemple, en raison d’une erreur de connecteur interne, qui ne peut pas être résolue. Dans de telles situations, le message d’erreur Connector unavailable s’affichera lors de l’examen de l’état du connecteur.

Actuellement, il n’existe aucun mécanisme de récupération automatique pour cet état. Cependant, vous pouvez continuer à exécuter plusieurs fonctions de connecteur, notamment la procédure EXPORT_CONNECTOR_STATE.

Pour vérifier si le connecteur se trouve à l’état ERROR, exécutez la requête :

CALL GET_CONNECTOR_STATUS();
Copy

Contactez également l”Assistance Snowflake pour nous aider à mieux comprendre le problème ou à déterminer comment il peut être éventuellement évité. Vous devez également exécuter une réinstallation manuelle du connecteur afin de remettre le connecteur en état de fonctionnement. Notez que les données précédemment ingérées ne sont pas perdues et que le connecteur peut poursuivre l’ingestion là où il s’était arrêté précédemment.