コネクタのトラブルシューティング¶
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();
コネクタのインストール中に発生する問題の解決¶
コネクタのインストール中に発生する最も一般的な問題は、 sys_db_object
、 sys_dictionary
、 sys_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"
- 条件:
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"
- 条件:
servicenow_instance
ServiceNow®インスタンスの名前を指定します。
username
およびpassword
ServiceNow®インスタンスの認証情報を指定します。
journal_table
削除監査に使用する ServiceNow®テーブルの名前を指定します。通常、この値は
sys_audit_delete
になります。
応答例
期待されるフィールドがすべて応答に存在する - ユーザーには必要な権限があります。
期待されるフィールドの一部が欠落している - ユーザーにはすべての列に対する必要な権限がありません。
応答が空である - ユーザーにはすべての行に対する必要な権限がありません。
応答にエラーが含まれている - ユーザーにはテーブルに対する必要な権限がありません。
ServiceNow®インスタンスへの接続の検証¶
Snowflake Connector for ServiceNow®V2 が ServiceNow®インスタンスにアクセスできることを検証するには、 TEST_CONNECTION
ストアドプロシージャを呼び出します。
CALL TEST_CONNECTION();
コネクタが正しく設定されている場合、ストアドプロシージャは以下の応答を返します。
{
"responseCode": "OK",
"message": "Test request to ServiceNow succeeded."
}
ServiceNow®インスタンス内の特定テーブルへのアクセスの検証¶
Snowflake Connector for ServiceNow®V2 が ServiceNow®インスタンスにある特定のテーブルからのデータにアクセスできることを検証するには、 TEST_TABLE_ACCESS
ストアドプロシージャを呼び出します。
CALL TEST_TABLE_ACCESS('<table_name>');
条件:
table_name
ServiceNow®インスタンス内のテーブルの名前を指定します。
コネクタが正しく設定され、コネクタによって使用されるユーザーがデータを利用できる場合、ストアドプロシージャは以下の応答を返します。
{
"responseCode": "OK",
"message": "Test request to ServiceNow® succeeded."
}
注釈
テーブルが空であるか、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>');
または
CALL CHECK_ROW_COUNT('<table_name>', <max_sys_created_on>);
条件:
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');
プロシージャがタイムアウトした場合は、プロシージャが 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>');
条件:
table_name
ServiceNow®インスタンス内のテーブルの名前を指定します。
sys_id
チェックする行の
sys_id
を指定します。
このプロシージャは、次のプロパティを含む JSON オブジェクトを返します。
プロパティ |
説明 |
---|---|
|
テーブルの名前。 |
|
ServiceNow®の行の一意な識別子。 |
|
行のインジェスチョンのステータス。 |
|
行が ServiceNow®のテーブルに存在する場合は |
|
行が ServiceNow の監査テーブルで追跡されている場合は |
|
行がすでにインジェストされており、Snowflakeの |
|
この 各オブジェクトには、データ変更のタイムスタンプとイベント型を指定するイベントログテーブルの列に対応する、次のプロパティが含まれています。
|
テーブル削除が監査済みかどうかの判断¶
Snowflake Connector for ServiceNow®V2 は、記録の削除をSnowflakeに反映させるために監査に依存しています。
ServiceNow®内の特定のテーブルが記録の削除を監査するように構成されていることを確認するには、 CHECK_IF_AUDIT_ENABLED
ストアドプロシージャを呼び出します。
CALL CHECK_IF_AUDIT_ENABLED('<table_name>');
条件:
table_name
ServiceNow®インスタンス内のテーブルの名前を指定します。
このプロシージャは、次のプロパティを含む JSON オブジェクトを返します。
プロパティ |
説明 |
---|---|
|
プロシージャが成功した場合は |
|
チェックしたテーブルの |
|
チェックしたテーブルの |
|
|
トラブルシューティングデータの取得¶
トラブルシューティングデータを取得するには、 GET_TROUBLESHOOTING_DATA
ストアドプロシージャを呼び出します。
CALL GET_TROUBLESHOOTING_DATA(<from_timestamp>, <to_timestamp>);
条件:
from_timestamp
データを取得する日付範囲の開始日を指定します(UTC タイムゾーン)。
to_timestamp
データを取得する日付範囲の終了日を指定します(UTC タイムゾーン)。
このストアドプロシージャは、データを表形式で返します。
構成情報
コネクタで発生したエラー
インジェスチョン履歴
次の例は、このストアドプロシージャを呼び出す方法を示しています。
CALL GET_TROUBLESHOOTING_DATA('2024-02-05 10:00:00', '2024-02-10 22:30:00');
返されたデータを CSV 形式で保存して、 Snowflake サポート に送信できます。
アクセスできないオブジェクトの復元¶
コネクタには、コネクタのアプリケーションの外部にある複数のデータベースオブジェクトが必要です。これらのオブジェクトが使用できない場合、コネクタは失敗するか、正しく動作しなくなります。オブジェクトが使用できなくなる状況には、次のものがあります。
オブジェクトをドロップする。
必要な付与を保持または復元せずにオブジェクトを再作成する。
コネクタがこれらのオブジェクトを使用するために必要な付与を取り消す。
ほとんどの場合、これらのオブジェクトを再作成して必要な権限を付与することにより、これらのオブジェクトを手動で復元できます。次のセクションでは、さまざまなオブジェクトを復元する方法について説明します。
コネクタのウェアハウスの復元¶
コネクタがそのウェアハウスにアクセスできなくなった場合は、 UPDATE_WAREHOUSE ストアドプロシージャを呼び出して新しいものを構成します。
ServiceNow®データのデータベースおよびスキーマの復元¶
ServiceNow®データのデータベースまたはスキーマ がドロップされた場合、復元する唯一の方法は UNDROP コマンドを実行することです。このコマンドを使用できない場合は、コネクタを再インストールして ServiceNow®データを再度インジェストする必要があります。
ServiceNow®データを含むビュー がドロップされた場合は、それらの作成を担当するバックグラウンドタスクが次に実行されたときに、ビューが自動的に再作成されます。
ServiceNow®データ(イベントログ または 生データ のテーブル)を含むテーブルの1つがドロップされ、 UNDROP TABLE コマンドを使用して復元できない場合は、以下を実行して ServiceNow®テーブルのインジェスチョンを再度開始します。
この ServiceNow®テーブルのイベントログと生データテーブルの両方がドロップされていることを確認します。
ServiceNow®テーブルを無効 にします。
DELETE_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>';
調査対象のテーブルに親テーブル(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;
行が返された場合、列のメタデータはSnowflakeに正しくインジェストされましたが、ビューはまだリフレッシュされていません。ステータスを確認し、もし:
最近表示がリフレッシュされたけれども列が存在しない場合、サポートに連絡してください。
表示がまだリフレッシュされていない場合、次のインジェスチョンスケジュールをお待ちください。
空の結果が返された場合は、コネクタがこの列のメタデータをまだインジェストしていないことを意味します。記録がコネクタに表示され、タイムスタンプが正しいかどうかを ServiceNow®側で検証する必要があります。
リフレッシュステータスの表示¶
指定したテーブルの表示が最後にリフレッシュされたのはいつか、その操作が成功したかどうかを検証するには、以下のクエリを実行します。
SELECT flattened_views_status, flattened_views_last_updated FROM tables_state WHERE table_name = '<table_name>';
最後のリフレッシュに失敗した場合は、イベントテーブルをクエリし、コネクタから報告されたエラーを検索します。
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>
空の結果が返された場合、コネクタはその列にアクセスできません。列は、ACL で保護されている場合と、存在しない場合があります。
列定義が返された場合は、 sys_updated_on
フィールドの値を調べます。日付がテーブルに列が追加された推定時刻と一致していることを確認します。他のインスタンスからインポートされた場合は、列が作成された時点が表示される場合があります。コネクタの CDC (増分更新)メカニズムは、過去の日付の記録が追加されたことに気づかないことがあります。この場合、 sys_dictionary
テーブルのリロードをトリガーします。