メインコンテンツへスキップ
見出し画像

連携トラブルはまずここ:ECC Queue(ecc_queue)


    ServiceNow で Discovery(探索)を回したり、外部システムと連携したりすると、その裏ではメッセージのやり取りが発生しています。「サーバを調べてこい」という指示。「調べた結果はこれです」という応答。こうした1往復1往復を、ServiceNow は1件ずつレコードに残しています。その置き場が ECC Queue、テーブル名で言うと ecc_queue です。ECC は External Communication Channel(外部通信チャネル)の略です。ServiceNow と MID Server / 外部システムの間を流れるメッセージのキュー(待ち行列)を指します。

    この記事は、Discovery や Integration、MID Server 連携を触り始めて「連携がうまくいかないとき、まずどこを見ればいいのか」を知りたい管理者・開発者を想定しています。PDI(Zurich / OOTB)で ecc_queue を実際に開き、1行=1メッセージであること、queue フィールドで向き(input / output)が決まることを確かめました。あわせて state でメッセージの一生(ready → processing → processed / error)を追えること、PDI 実機での件数分布も見ています。

    この記事で分かること

    • ECC Queue は ecc_queue の1行=1メッセージで、ServiceNow と MID Server / 外部システムの間のやり取りを記録するキューであること

    • queue フィールドで向きが決まること(output=ServiceNow→外部、input=外部→ServiceNow)

    • メッセージの種類は topic、宛先は agent、本文は payload(最大約1MB)に入ること

    • state(ready / processing / processed / error)でメッセージの処理状態を追えること

    • PDI 実機の約1,400件すべてが output / processed / HeartbeatProbe だったこと

    • その理由が MID Server 未登録(ecc_agent が 0 件)にあること

    この記事の内容は ServiceNow の PDI(Personal Developer Instance)Zurich(ズーリッヒ)リリースの OOTB(初期設定)で確認した個人メモです。本番環境やカスタマイズ済み環境では、フィールド・選択肢・キューの中身が異なる場合があります。


    ECC Queue(ecc_queue)とは

    ECC Queue とは、ServiceNow が MID Server や外部システムとやり取りするメッセージを、1件=1レコードで残す待ち行列 です。たとえば Discovery で「この IP のサーバを調べてこい」という指示(プローブ)を出すと、その指示が ecc_queue に1行積まれ、MID Server がそれを取りに来ます。調査結果が返ってくると、今度は応答が ecc_queue にもう1行積まれます。

    下の実画面は、PDI の ecc_queue を topic(メッセージの種類)でグループ化したものです。


    画像

    このように、ECC Queue は連携の「通り道」であると同時に、連携がどこまで進んだかを後から追える証跡にもなります。だから連携トラブルの切り分けは、まず ecc_queue を開くところから始まります。PDI(Zurich / OOTB)の ecc_queue には、すでに約1,400件のメッセージが入っていました。


    1行=1メッセージ。queue が「向き」を決める

    ECC Queue では queue フィールドがメッセージの向きを決めます。


    画像
    • output(出力)… ServiceNow → 外部。Discovery のプローブや外部への指示など、ServiceNow が「送る」メッセージ。

    • input(入力)… 外部 → ServiceNow。MID Server や外部システムが返してきた応答を、ServiceNow が「受け取る」メッセージ。

    MID Server は、自分宛の output メッセージを定期的に取りに来て処理し、その結果を input として積み返します。この output と input が交互に積まれることで、1つの作業の往復が ecc_queue 上に並びます。往復のひも付けには response_to(応答元メッセージへの参照)が使われます。

    1件のメッセージが持つ主なフィールドは次の通りです。


    画像

    中でも連携の中身を決めるのは、宛先を表す agent、種類を表す topic、本文を表す payload の3つです。payload は最大で約1MB(1,048,576 文字)まで入る大きな文字列フィールドで、ここに実際の指示や結果が XML などの形で格納されます。フィールド一覧は次のURLで確認できます(先頭の <YourInstance> は自分のインスタンスに置き換えてください)。

    https://<YourInstance>/sys_dictionary_list.do?sysparm_query=name=ecc_queue^elementISNOTEMPTY


    画像

    外部を呼び出す入口としては 送信側 REST 連携(REST Message) もよく使われます。REST Message はインスタンスから直接 HTTP を投げます。ECC Queue が担うのは MID Server を介した非同期のやり取りで、そこに役割の違いがあります。


    state でメッセージの一生を追う

    もう1つの軸が state(処理状態) です。メッセージは積まれてから処理されるまで、いくつかの状態を通ります。


    画像
    • ready … キューに投入された直後。処理待ち。

    • processing … 処理中。

    • processed … 処理済み(正常完了)。

    • error … エラー。理由は error_string に入る。

    queue(向き)と state(状態)の選択肢は次の通りです。


    画像

    連携が止まっているとき、この2軸で絞り込むと原因に近づけます。たとえば output が ready のまま溜まっているなら、MID Server が取りに来ていない(落ちている)疑いがあります。error が並ぶなら、処理そのものが失敗しています。PDI で queue 別・state 別にグループ化すると、いまどの状態のメッセージがどれだけあるかが一目で分かります。


    画像


    画像

    PDI 実機:約1,400件すべてが「MID Server 探し」だった

    PDI の ecc_queue を分布で見ると、約1,400件すべてが queue=output / state=processed / topic=HeartbeatProbe でした。宛先の agent はすべて mid.server.\*(全 MID 宛のワイルドカード)で、payload は空です。流れていたメッセージは1種類だけでした。


    画像

    なぜこうなるのか。理由は MID Server が1台も登録されていないことにあります。MID Server の登録簿である ecc_agent テーブルは 0 件でした。


    画像

    ServiceNow は「MID Server はいませんか?」という生存確認(HeartbeatProbe)を5分ごとに output キューへ積みます。宛先は全 MID(mid.server.\*)です。ところが応答すべき MID Server がいないため、input(応答)は0件のままです。送った側は処理を終えるので state は processed になります。結果として「output / processed / HeartbeatProbe」だけが延々と積み上がっていました。


    画像

    この分布を表にすると、いまの PDI の ECC Queue の姿がはっきりします。


    画像

    裏を返せば、MID Server を1台登録してオンラインにすれば、この HeartbeatProbe には応答が返ります。input 側にもレコードが現れます。さらに Discovery を回せば、SSHCommand や JDBCProbe といった別の topic のメッセージが output / input を往復しはじめます。ただし、それらの topic がどんな payload で流れるか、件数がどうなるかは検証範囲外です。MID Server を立てていない今回の PDI では発生しません。今回確認できたのは、「MID Server がいない素の状態の ECC Queue」の姿です。


    実機で確認するときに見るべきURL

    今回見た画面を自分のインスタンスで開くためのURLは次の通りです(<YourInstance> は置き換えてください)。

    # ECC Queue を topic でグループ化
    https://<YourInstance>/ecc_queue_list.do?sysparm_query=GROUPBYtopic
    
    # ECC Queue を queue(向き)でグループ化
    https://<YourInstance>/ecc_queue_list.do?sysparm_query=GROUPBYqueue
    
    # ECC Queue を state(状態)でグループ化
    https://<YourInstance>/ecc_queue_list.do?sysparm_query=GROUPBYstate
    
    # ecc_queue のフィールド定義
    https://<YourInstance>/sys_dictionary_list.do?sysparm_query=name=ecc_queue^elementISNOTEMPTY
    
    # MID Server の登録簿
    https://<YourInstance>/ecc_agent_list.do

    ECC Queue の考え方は ServiceNow 公式の ECC Queue(Zurich) でも説明されています。


    まとめ

    • ECC Queue は ecc_queue の1行=1メッセージ。ServiceNow と MID Server / 外部システムの間を流れるメッセージのキュー。

    • queue フィールドが向きを決める。output=ServiceNow→外部、input=外部→ServiceNow。往復は response_to でひも付く。

    • メッセージの種類は topic、宛先は agent、本文は payload(最大約1MB)。状態は state(ready → processing → processed / error)で追える。

    • PDI 実機では 約1,400件すべてが output / processed / HeartbeatProbe。理由は MID Server 未登録(ecc_agent 0 件)で、生存確認だけが5分ごとに積まれ続けていたから。

    • 連携トラブルの切り分けは、まず ecc_queue を queue × state で絞るのが基本。

    ECC Queue が分かると、ServiceNow の外部連携が2系統で成り立っていることが見えてきます。「直接 HTTP を投げる経路」と「MID Server を介してキューでやり取りする経路」です。連携の入口は3つあります。REST 連携(Scripted REST API)は外部からデータを受け取る仕組みです。送信側 REST 連携(REST Message)は外部を呼び出す仕組みです。OAuth 設定(oauth_entity)は連携の認証を支える仕組みです。合わせて読むと、ServiceNow の連携の全体像がひとつにつながります。

     
     
    ServiceNowのPDI(Personal Developer Instance)を実機で観察して、Noteに記事を書いています 実装・運用・教育の現場視点で淡々と記録中です リクエストがあればその記事も書きます 個人の観察日記です

    あなたへのおすすめ