Analytics データが Qpidd のデッドレター キューでスタックする

ここに表示されているのは Apigee Edge のドキュメントです。
Go to the Apigee X のドキュメントに移動します。
info

症状

Qpidd サーバーが分析メッセージを PostgreSQL に転送しないため、新しい Edge UI に分析データが表示されません。Edge では、edge-qpid-server コンポーネントが Qpidd サーバーに対応します。

Qpidd は、分析グループごとに 2 つのキューを保持します。

  • ax-q-axgroup001-consumer-group-001

    このキューには、Message Processor と Router から push された分析メッセージが保持されます。メッセージは edge-qpid-server によってここから pull され、解析されて PostgreSQL に挿入されます。メッセージが正常に処理されると、キューから削除されます。

  • ax-q-axgroup001-consumer-group-001-dl

    このキューはデッドレター キューです。edge-qpid-server が処理に失敗したメッセージの宛先として機能するため、受信されなくなります。通常、これは最大配信回数を超えた場合、またはランタイム エラーが原因で PostgreSQL が新しいデータの挿入を拒否した場合に設定されます。

エラー メッセージ

根本原因は、edge-qpid-server コンポーネントからのさまざまなランタイム エラーが考えられます。通常、edge-qpid-server が PostgreSQL からランタイム エラーを受信すると、デッドレター キューが存在しない場合は作成し、次のメッセージを送信します。

yyyy-MM-dd HH:mm:ss,SSS ax-q-axgroup001-consumer-group-001-persistpool-thread-6 WARN c.a.a.m.MessageConsumer - MessageConsumer.process() : Sending message batch to the DLQ.

考えられる原因

原因 説明 トラブルシューティング手順の適用対象
メッセージが qpidd のデッドレター キューでスタックしている edge-qpid-server が Qpidd ブローカーから読み取ったメッセージを理解できなかったか、メッセージを PostgreSQL に保持できませんでした。 Edge Private Cloud ユーザー

共通の診断手順

Qpid ノードで次のコマンドを実行して、Qpidd キューの統計情報を表示します。

/opt/apigee/apigee-qpidd/bin/qpid-stat -q

出力には、ブローカーに登録されているキューのセットが返されます。名前が -dl で終わるキューにメッセージが入力されている場合(Edge for Private Cloud 4.53.00 以降では Q-Depth(Messages)、Edge for Private Cloud 4.52.x 以前では msg)、メッセージはデッドレター キューでスタックしています。

Edge for Private Cloud 4.53.00 以降(4.54.00、Apache Qpid Broker-J を含む)の出力例:

+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+
|               Queue Name              | Messages Enqueued | Total Enqueued(B) | Messages Dequeued | Total Dequeued(B) | Consumers | Bindings | Q-Depth(Messages) | Q-Depth(B) |
+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+
|   ax-q-axgroup001-consumer-group-001  |        185        |      13800000     |        185        |      13800000     |     6     |    1     |         0         |     0      |
+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+
| ax-q-axgroup001-consumer-group-001-dl |         70        |      3900000      |         0         |         0         |     0     |    1     |         70        |  3900000   |
+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+

Edge for Private Cloud 4.52.x 以前(従来の C++ qpidd ブローカー)の出力例:

Queues
  queue                                     dur  autoDel  excl  msg   msgIn  msgOut  bytes  bytesIn  bytesOut   cons  bind
  ========================================================================================================================
  ax-q-axgroup-001-consumer-group-001       Y                   0     185    185     0       13.8m   13.8m      6      2
  ax-q-axgroup-001-consumer-group-001-dl    Y                   0     70     70      0        3.9m    3.9m      0      2

原因: メッセージが qpidd のデッドレター キューでスタックしている

診断

この状態は、次のような場合に発生することがあります。

  1. 過去にアップグレードが行われ、その際に PostgreSQL がダウンしていた。
  2. ネットワークの問題により、PostgreSQL が一時的に停止した。
  3. edge-qpid-server が PostgreSQL にメッセージを送信しようとしたが、PostgreSQL がランタイム エラーを返した。

解決策

Edge for Private Cloud のバージョンに応じて、デッドレター キューからメインの分析キューにスタックしたメッセージを移動する手順を行います。

Edge for Private Cloud 4.53.00 以降(4.54.00 を含む)

Edge for Private Cloud 4.53.00 以降(4.54.00 を含む)では、Apache Qpid Broker-J(4.54.00 では 10.0.1、4.53.x では 8.0.6)を使用します。従来の qpid-tool CLI は Edge for Private Cloud 4.53.00 以降で削除され、使用できません。 代わりに、Apache Qpid Broker-J HTTP Management REST API(moveMessages)または Qpid Web Management Console を使用して、デッドレター キューからメインの分析キューにメッセージを移動します。

  1. 共通の診断手順の出力から、メインキューとデッドレター キューの正確な名前をメモします(例: ax-q-axgroup001-consumer-group-001 と ax-q-axgroup001-consumer-group-001-dl、または ax-q-axgroup-001-consumer-group-001 と ax-q-axgroup-001-consumer-group-001-dl)。

  2. Qpid ノードで次の curl コマンドを実行して、Qpid Broker-J HTTP Management API(デフォルトではポート 8090)を介してデッドレター キューで moveMessages オペレーションを呼び出します。

    curl -u QPID_USER:QPID_PASSWORD -X POST \
      -H "Content-Type: application/json" \
      -d '{"destination": "ax-q-axgroup001-consumer-group-001"}' \
      http://127.0.0.1:8090/api/latest/queue/default/default/ax-q-axgroup001-consumer-group-001-dl/moveMessages

    ここで

    • QPID_USER と QPID_PASSWORD は、/opt/apigee/customer/application/qpidd.properties または /opt/apigee/token/application/qpidd.properties で構成された Qpid 管理認証情報です(デフォルトは guest:guest)。
    • `qpid-stat -q` の分析キュー名が異なる場合は、ax-q-axgroup001-consumer-group-001 と ax-q-axgroup001-consumer-group-001-dl qpid-stat -q を置き換えます。
    • メッセージをバッチで移動するには、JSON リクエストの本文に "limit" を含めます (例: "limit": 100000)。
    • Qpid Management API で SSL/TLS が有効になっている場合(conf_qpidd_qpid_management.https.enabled=true)、https:// を使用して、curl に --cacert(または -k)を渡します。
  3. コマンド出力を確認します。呼び出しが成功すると、移動された内部メッセージ ID の JSON 配列が返されます。

    [ 3, 4, 5 ]

    返された配列が空の場合([])、移動するデッドレター キューにメッセージはありませんでした。

  4. 5 分待ってから、 共通の診断手順から /opt/apigee/apigee-qpidd/bin/qpid-stat -q を実行します。メインキュー(ax-q-axgroup001-consumer-group-001)のメッセージ が処理され、デッドレター キュー (ax-q-axgroup001-consumer-group-001-dl)の Q-Depth(Messages) が 0 のままになっていることを確認します。

Edge for Private Cloud 4.52.x 以前

  1. 共通の診断手順でキューの名前をメモします。次に例を示します。

    • ax-q-axgroup-001-consumer-group-001
    • ax-q-axgroup-001-consumer-group-001-dl
  2. qpid-tool コマンドを実行して、インタラクティブな qpid プロンプトを入力します。

    qpid-tool

    このコマンドを実行すると、次のようなフィード レスポンスが返されます。

    Management Tool for QPID
    qpid:
  3. list broker を実行して、アクティブなブローカーのリストを取得します。

    list broker

    このコマンドを実行すると、次のようなフィード レスポンスが返されます。

    Object Summary:
    ID   Created   Destroyed  Index
    =======================================
    125  21:00:00  -          amqp-broker

    ここで、ID 列はブローカーの ID を指定します。

  4. ブローカーの ID をメモします。この例では 125 です。

  5. 次のコマンドを実行して、デッドレター キューから実際のキューにメッセージを移動します。

    call 125 queueMoveMessages ax-q-axgroup-001-consumer-group-001-dl ax-q-axgroup-001-consumer-group-001 100000 {}

    このコマンドを実行すると、次のようなフィード レスポンスが返されます。

    OK (0) - {}

    出力がない場合は、何も行う必要がないことを意味します。つまり、移動するメッセージはありません。OK (0) が表示されない場合は、Apigee Edge サポートにお問い合わせください。

  6. qpid-tool ターミナルを終了します。

    quit
  7. 5 分待ってから、 共通の診断手順で診断手順を再度実行します。実際のキューのメッセージが処理されていることを確認し、デッドレターの msg カウントが 0 のままになっていることを確認します。

問題が解決しない場合は、次のセクションに進みます。

診断情報の収集が必要な場合

上記の手順を行っても問題が解決しない場合は、次の診断情報を収集して Apigee Edge サポートにご提供ください。

  • Qpidd ログ: /opt/apigee/var/log/apigee-qpidd/qpidd.log(Edge for Private Cloud 4.53.00 以降)と /opt/apigee/var/log/apigee-qpidd/apigee-qpidd.log
  • PostgreSQL ログ: /opt/apigee/var/log/apigee-postgresql/apigee-postgresql.log
  • Edge-qpid-server ログ: /opt/apigee/var/log/edge-qpid-server/logs/system.log
  • Edge-postgres-server ログ: /opt/apigee/var/log/edge-postgres-server/logs/system.log
  • Qpidd キューの統計情報:

    /opt/apigee/apigee-qpidd/bin/qpid-stat -q
  • 次の curl コマンドで返される分析グループ:

    curl -u sysadminEmail:password http://mgmt:8080/v1/analytics/groups/ax