连接器故障排除

Snowflake Connector for ServiceNow® V2 受 Snowflake Connector 条款 的约束。

本主题提供了排查 Snowflake Connector for ServiceNow®V2 问题的指南。

本主题内容:

备注

以下部分介绍了存储过程,这些过程是在 连接器应用程序 的 PUBLIC 架构中定义的。在调用这些存储过程之前,选择该应用程序作为会话使用的数据库。

例如,如果该应用程序名为 my_connector_servicenow,请运行以下命令来调用 TEST_CONNECTION 连接器过程:

USE APPLICATION my_connector_servicenow;
CALL TEST_CONNECTION();
Copy

解决连接器安装过程中的问题

连接器安装过程中最常见的问题与元数据表上的 ACLs 设置有关,例如 sys_db_objectsys_dictionarysys_glide_object。此外,连接器需要访问 sys_table_rotation 表来确定正确的引入策略,并可选择访问日志表(通常为 sys_audit_delete)以传播数据删除。

身份验证步骤错误

在安装向导中 连接到 ServiceNow 或手动运行 SET_CONNECTION_CONFIGURATION 过程时,可能会出现问题。如果在此步骤中遇到错误,请确保用于安装连接器的用户有权访问 sys_db_object 表。

与 ACL 问题相关的错误状态码,可能出现在 SET_CONNECTION_CONFIGURATION 过程返回的 JSON 对象中,具体如下:

  • REQUEST_FAILED

您可以执行以下类似于连接器的查询来验证访问权限。在请求未返回预期结果之前,将无法安装连接器。例如,如果您使用 curl 发送 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
其中:
servicenow_instance

指定 ServiceNow® 实例的名称。

usernamepassword

为 ServiceNow® 实例指定凭据。

响应示例:

  • 至少返回了一些字段 - 用户具有访问表所需的权限。

  • 响应为空 - 用户有权访问表,但不能访问已处理的记录。它可能会在以后导致问题。

  • 响应包含错误 - 用户没有访问表所需的权限。

验证源步骤错误

在安装向导中 验证源 或手动运行 FINALIZE_CONNECTOR_CONFIGURATION 过程时,可能会出现问题。如果在此步骤中遇到错误,请确保用于安装连接器的用户具有访问元数据表所需的权限。

与 ACL 问题相关的错误状态码,可能出现在 FINALIZE_CONNECTOR_CONFIGURATION 过程返回的 JSON 对象中,具体如下:

  • METADATA_TABLE_ACCESS_VALIDATION_ERROR

  • JOURNAL_TABLE_ACCESS_VALIDATION_ERROR

您可以执行以下类似于连接器的查询来验证访问权限。在请求未返回预期结果之前,将无法安装连接器。例如,如果您使用 curl 发送 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
其中:
servicenow_instance

指定 ServiceNow® 实例的名称。

usernamepassword

为 ServiceNow® 实例指定凭据。

journal_table

指定 ServiceNow® 用于删除审计的表的名称。通常其值为 sys_audit_delete

响应示例:

  • 响应中存在所有预期字段 - 用户具有必要的权限。

  • 缺少某些预期字段 - 用户没有对所有列的必要权限。

  • 响应为空 - 用户没有对所有行的必要权限。

  • 响应包含错误 - 用户没有对表的必要权限。

验证与 ServiceNow® 实例的连接

要验证 Snowflake Connector for ServiceNow®V2 能否访问 ServiceNow® 实例,请调用 TEST_CONNECTION 存储过程:

CALL TEST_CONNECTION();
Copy

如果连接器设置正确,存储过程将返回以下响应:

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

验证与 ServiceNow® 实例中特定表的访问权限

要验证 Snowflake Connector for ServiceNow®V2 能否访问 ServiceNow® 实例中特定表中的数据,请调用 TEST_TABLE_ACCESS 存储过程:

CALL TEST_TABLE_ACCESS('<table_name>');
Copy

其中:

table_name

指定 ServiceNow 实例中的表的名称。

如果连接器设置正确,并且数据可供连接器使用的用户使用,则存储过程将返回以下响应:

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

备注

如果表为空,或者由于 ACLs,所有行都对连接器隐藏,则消息将显示为:Test request to ServiceNow® succeeded but it didn't return any record. 在这种情况下,请确保表确实为空。如果从 UI 中可以看到任何行,则意味着连接器无法引入它们。

比较 ServiceNow® 和 Snowflake 中的表行数

要比较 ServiceNow® 和 Snowflake 中某个表的当前行数,请调用 CHECK_ROW_COUNT 过程:

CALL CHECK_ROW_COUNT('<table_name>');
Copy

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

其中:

table_name

指定 ServiceNow 实例中的表的名称。

max_sys_created_on

sys_created_on 列的最大值指定其他可选的筛选器。只有与此筛选器匹配的行才会被计算在内。此参数的默认值为 NULL,意味着此时不会应用筛选器。此参数有助于仅比较已引入到 Snowflake 中的记录计数,而不考虑最近创建于 ServiceNow® 中但尚未引入到 Snowflake 的账户记录。

以下示例展示了如何使用 max_sys_created_on 参数调用 CHECK_ROW_COUNT 存储过程:

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

如果过程超时,则过程无法使用 stats API 确定 ServiceNow® 中表的行数。这可能意味着,该表中的行数太多而无法通过此 API 统计。

备注

返回的行数可能会有所不同。ServiceNow® 表包含的行可能比同等的 Snowflake 表更多。这可能是由为 ServiceNow® 中的指定表设置的访问控制列表规则 (ACLs) 导致的。

连接器使用不同的端点来检索有关 ServiceNow® 表中的行数的信息。连接器使用 stats 获取有关表的信息,包括行数。它用 table 将数据引入 Snowflake。

检查行的引入状态

要在 ServiceNow® 和 Snowflake 中的所有可能位置查看行的引入状态,请调用 CHECK_RECORD_HISTORY 过程:

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

其中:

table_name

指定 ServiceNow 实例中的表的名称。

sys_id

指定要检查的行的 sys_id

该过程会返回一个包含以下属性的 JSON 对象:

属性

描述

table_name

表的名称。

sys_id

ServiceNow® 中行的唯一标识符。

status

行的引入状态。

is_present_in_servicenow

如果该行存在于 ServiceNow® 中的表中,则为 true;否则为 false

is_present_in_servicenow_audit_table

如果该行在 ServiceNow® 的审计表中被跟踪,则为 true;否则为 false

is_present_in_snowflake_destination_table

如果行已引入且在 Snowflake 中的 dest_db 数据库中可用,则为 true ;否则为 false

event_log_records

代表 事件日志中的条目 (具有此 sys_id 的行的事件日志)的 JSON 对象数组。

每个对象均包含以下属性,这些属性对应于事件日志表中指定数据更改时间戳和事件类型的列:

  • sys_updated_on

  • event_date

  • event_type

确定表是否经过了删除审计

Snowflake Connector for ServiceNow®V2 依靠审计将记录删除操作传播到 Snowflake。

要验证 ServiceNow® 中的给定表是否配置为审计记录删除操作,请调用 CHECK_IF_AUDIT_ENABLED 存储过程:

CALL CHECK_IF_AUDIT_ENABLED('<table_name>');
Copy

其中:

table_name

指定 ServiceNow 实例中的表的名称。

该过程会返回一个包含以下属性的 JSON 对象:

属性

描述

response_code

如果过程成功,则为 OK 值;如果失败,则为错误代码。

audit

已检查表的 audit 属性值。如果设置为 True,则对表启用审计。

no_audit_delete

已检查表的 no_audit_delete 属性值。如果已设置,则会替换删除事件中 audit 字段的值。

summary

根据字段 auditno_audit_delete 的值判断表是否启用了审计功能的易懂说明。在以下情况下,在表上启用审计:

  • audit 字段设置为 True,并且 no_audit_delete 未设置为 True。

  • no_audit_delete 设置为 False。

获取故障排除数据

要获取故障排除数据,请调用 GET_TROUBLESHOOTING_DATA 存储过程:

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

其中:

from_timestamp

指定应提取数据的日期范围起始点(UTC 时区)。

to_timestamp

指定应提取数据的日期范围结束点(UTC 时区)。

此存储过程会以表格格式返回以下数据:

  • 配置信息

  • 连接器遇到的错误

  • 引入历史记录

以下示例展示了如何调用此存储过程:

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

您可以将返回的数据以 CSV 格式保存,并发送给 Snowflake 支持部门

恢复无法访问的对象

连接器需要连接器应用程序外部的多个数据库对象。如果这些对象不可用,连接器将出现故障或停止正常运行。对象可能不可用的情况包括:

  • 删除对象。

  • 重新创建对象而不保留或恢复所需的授权。

  • 撤销连接器使用这些对象所需的授权。

在大多数情况下,您可以通过重新创建这些对象并授予必要的权限来手动恢复这些对象。以下部分介绍了如何恢复不同的对象。

恢复连接器仓库

如果连接器失去对其仓库的访问权限,请通过调用 UPDATE_WAREHOUSE 存储过程来配置新仓库。

恢复 ServiceNow® 数据的数据库和架构

如果 ServiceNow® 数据的数据库或架构 被删除,则唯一的恢复方法是运行 UNDROP 命令。如果此命令不可用,则您必须重新安装连接器并再次引入 ServiceNow® 数据。

如果 包含 ServiceNow® 数据的视图 被删除,它应该会在下次负责创建它们的后台任务运行时自动重新创建。

如果包含 ServiceNow® 数据的其中一个表(事件日志原始数据 表)被删除,您无法使用 UNDROP TABLE 命令来恢复它,请执行以下操作来开始再次引入 ServiceNow 表:

恢复连接器的通知集成

如果连接器失去通知集成对象的访问权限,请再次执行 配置警报 过程,并根据需要重新创建通知集成对象。

如果电子邮件通知是通过 Snowsight 配置的,那么您只需禁用并重新启用它们,即可恢复必要的外部对象。

确定扁平化视图中缺少列的原因

连接器根据 ServiceNow® 元数据在目标架构中创建扁平化视图。Snowflake 端缺少列的原因有多种。

检查 Snowflake 中是否存在列元数据

要检查列元数据是否存在于 Snowflake 的 sys_dictionary 表上,请执行以下查询:

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

如果您正在调查的表有父表(继承自 ServiceNow®),并且您正在查找的列已添加到父表中,则应改用父表名称。

要列出您感兴趣的表从中继承的所有表,请执行以下查询:

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

如果返回行,则表示该列的元数据已正确引入到 Snowflake 中,但视图尚未刷新。检查状态以及是否:

  • 视图最近刷新,但列仍不存在,请联系支持人员。

  • 视图尚未刷新,请等待下一个引入计划。

如果返回空结果,则表示连接器尚未引入此列的元数据。您需要在 ServiceNow® 端验证记录是否对连接器可见,以及时间戳是否正确。

查看刷新状态

要验证给定表的视图上次刷新时间以及操作是否成功,请执行以下查询:

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

如果上次刷新失败,您可能需要查询事件表并查找连接器报告的错误。

查看 ServiceNow® 列元数据可用性

扁平化视图中缺少列的原因可能是连接器无法引入列元数据。这可能是因为 ACLs 阻止 sys_dictionary 表中的行被表 API 返回。另一个可能的原因是 sys_updated_on 列中的时间戳值过期。也可能是列/表定义是从不同的 ServiceNow® 实例导入的。要确定连接器是否可以访问列元数据,请执行 GET 请求到以下端点:

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

如果返回空结果,则连接器无法访问该列。该列可能受 ACL 保护或不存在。

如果返回了列定义,请检查 sys_updated_on 字段的值。确认日期与列添加到表中的预期时间匹配。如果它是从另一个实例导入的,则可能会显示列创建时的时间点。连接器中的 CDC (增量更新)机制可能不会注意到添加了日期为过去的记录。在这种情况下,触发 sys_dictionary 表的重新加载。

连接器不可用

连接器可能进入 ERROR 状态,这可能由于多种原因而发生。例如,无法恢复的内部连接器错误。在这种情况下,检查连接器状态时将显示 Connector unavailable 错误消息。

目前,此状态没有自动恢复机制。但是,您仍然可以执行多个连接器函数,包括 EXPORT_CONNECTOR_STATE 过程。

要检查连接器是否处于 ERROR 状态,请执行查询:

CALL GET_CONNECTOR_STATUS();
Copy

此外,请联系 Snowflake 支持部门 帮助我们更好地了解问题或确定如何避免问题。您还应该执行 手动重新安装 以便将连接器恢复到工作状态。请注意,以前引入的数据不会丢失,连接器可以从之前停止的位置继续引入。

语言: 中文