コネクタのトラブルシューティング

Snowflake Connector for ServiceNow® V2は、 Snowflakeコネクタ規約 に従うものとします。

このトピックでは、 Snowflake Connector for ServiceNow®V2 の問題をトラブルシューティングするためのガイドラインを提供します。

このトピックの内容:

注釈

次のセクションでは、 コネクタのアプリケーション の PUBLIC スキーマで定義されているストアドプロシージャについて説明します。これらのストアドプロシージャを呼び出す前に、そのアプリケーションをセッションに使用するデータベースとして選択します。

たとえば、そのアプリケーションの名前が my_connector_servicenow の場合、次のコマンドを実行して TEST_CONNECTION コネクタプロシージャを呼び出します。

USE APPLICATION my_connector_servicenow;
CALL TEST_CONNECTION();
Copy

コネクタのインストール中に発生する問題の解決

コネクタのインストール中に発生する最も一般的な問題は、 sys_db_objectsys_dictionarysys_glide_object などのメタデータテーブルに設定された一連の ACLs に関連しています。さらに、コネクタは、正しいインジェスチョン戦略を決定するために sys_table_rotation テーブルにアクセスし、オプションでデータ削除を伝播するためにジャーナルテーブル(通常は sys_audit_delete)にアクセスする必要があります。

認証ステップのエラー

インストールウィザードで ServiceNow に接続 するとき、または SET_CONNECTION_CONFIGURATION プロシージャを手動で実行するときに問題が発生する可能性があります。このステップでエラーが発生した場合は、コネクタのインストールに使用したユーザーが sys_db_object テーブルにアクセスできることを確認してください。

SET_CONNECTION_CONFIGURATION プロシージャから返される JSON オブジェクトの中で、 ACL の問題に関連する可能性のあるエラーステータスコードは次のとおりです。

  • 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®インスタンスの名前を指定します。

username および password

ServiceNow®インスタンスの認証情報を指定します。

応答例

  • 少なくとも一部のフィールドが返される - ユーザーにはテーブルにアクセスするために必要な権限があります。

  • 応答が空である - ユーザーにはテーブルにアクセスする権限がありますが、処理された記録にアクセスする権限はありません。これは後で問題になる可能性があります。

  • 応答にエラーが含まれている - ユーザーにテーブルにアクセスするための必要な権限がありません。

ソースステップのエラーの検証

インストールウィザードで ソースを検証 するとき、または FINALIZE_CONNECTOR_CONFIGURATION プロシージャを手動で実行するときに問題が発生する可能性があります。このステップでエラーが発生した場合は、コネクタのインストールに使用したユーザーがメタデータテーブルにアクセスするために必要な権限を持っていることを確認してください。

FINALIZE_CONNECTOR_CONFIGURATION プロシージャから返される JSON オブジェクトの中で、 ACL の問題に関連する可能性のあるエラーステータスコードは次のとおりです。

  • 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®インスタンスの名前を指定します。

username および password

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 で、フィルターは適用されません。このパラメーターを使用すると、ServiceNow®で最近作成されたけれども、まだSnowflakeにインジェストされていない記録を考慮せずに、すでにSnowflakeにインジェストされた記録のカウントのみを比較することができます。

次の例は、 CHECK_ROW_COUNT パラメーターを使用して max_sys_created_on ストアドプロシージャを呼び出す方法を示しています。

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

audit および no_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®データ(イベントログ または 生データ のテーブル)を含むテーブルの1つがドロップされ、 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®列メタデータの可用性を表示します

フラット化されたビューで列が見つからないのは、列のメタデータがコネクタによってインジェストされないためである可能性があります。これは、 sys_dictionary テーブルの行が API テーブルから返されるのを防いでいる ACLs が原因である可能性があります。もう1つの原因として考えられるのは、 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サポート までご連絡ください。コネクタが動作する状態に戻すには、 手動コネクタ再インストール も実行する必要があります。以前にインジェストされたデータが失われることはなく、コネクタは以前に停止した場所からインジェスチョンを続行できます。