以下の内容はhttps://rheb.hatenablog.com/entry/cac20251207より取得しました。


Debugging Camel

Apache Camel Advent Calendar 7日目の記事は、サポート担当古市が担当します。 テーマは、「Debugging Camel」

基本的には、以下の流れで camel route のデバッグをすすめていくことをお勧めします。

  • Camel trace を使い、ルーティングの状況を把握
  • ログレベルを変更し、より詳細な情報を把握
  • デバッガーを使い、ソースコードレベルの調査
Camel trace

想定通りにルーティングされない場合、exchange の状態と、どの経路でルーティングされたかを把握する必要があります。 実際、製品サポートの現場でかなり大掛かりな camelルートに関する調査をする場合も、traceログからピンポイントで調査が必要な箇所を絞り混みます。

CamelContext の trace アトリビュートを有効にすることで、これらルーティング情報の詳細がログ出力されます。 (どのエンドポイントで処理されるかが、exchange の内容とセットで把握できます。)

camel.apache.org

実は、camel-jbang にも trace 機能が提供されており、手元でサクッと検証する場合には便利です。 camel-jbang をご存知ない方は、まずこちらの記事をご覧ください。

rheb.hatenablog.com

camel-jbang は稼働中のインテグレーション(camel ルート)の統計を取得することも可能です。まずは、バックグラウンドでインテグレーションを実行します。

camel init Hello.java
camel run Hello.java --background

稼働中のインテグレーションの trace status は "Standby" になっています。この状態ではまだトレースが開始されていません。 action オプションを使い、trace status を "started" に変更します。

% camel trace
 PID   NAME   AGE  STATUS   TOTAL  QUEUE  FILTER  PATTERN 
 4795  Hello   6s  Standby      0      0                  
% camel trace --action=start
% camel trace
 PID   NAME    AGE   STATUS   TOTAL  QUEUE  FILTER  PATTERN 
 4795  Hello  2m15s  Started     12      8                  
% 

トレーシングが開始されました。actoinオプションを使い、トレース情報を出力します。

% camel trace --action=dump
2025-08-15 09:35:43.895   4795 --- [ thread #5 - timer://java]                              route1/*--> :     1 - Created
  Endpoint    timer://java?period=1000 
  Exchange    (DefaultExchange)  InOnly  97F301CDA23540D-0000000000000081 
  Message     (DefaultMessage) 
  Body        (null) 
2025-08-15 09:35:43.895   4795 --- [ thread #5 - timer://java]                          route1/setBody1 :     2 - Processed (0ms)
  Exchange    (DefaultExchange)  InOnly  97F301CDA23540D-0000000000000081 
  Message     (DefaultMessage) 
  Body        (null) 
2025-08-15 09:35:43.899   4795 --- [ thread #5 - timer://java]                              route1/log1 :     3 - Processed (0ms)
  Exchange    (DefaultExchange)  InOnly  97F301CDA23540D-0000000000000081 
  Message     (DefaultMessage) 
  Body        (String) (bytes: 23) 
  Hello Camel from route1 
2025-08-15 09:35:43.895   4795 --- [ thread #5 - timer://java]                              route1/*<-- :     4 - Completed (success) (1ms)
  Endpoint    timer://java?period=1000 
  Exchange    (DefaultExchange)  InOnly  97F301CDA23540D-0000000000000081 
  Message     (DefaultMessage) 
  Body        (String) (bytes: 23) 
  Hello Camel from route1 
~~省略~~

トレース情報は収集され続けるので、収集を止める場合は "Standby"ステータスへ変更します。

camel trace --action=stop

収集したトレース情報は、保持され続けています。消去することも可能です。

camel trace --action=clear

出力されたトレース情報を確認すると、どのように exchangeがルーティングされているか把握できるかと思います。 exchange id (先ほど掲示した例では、 97F301CDA23540D-0000000000000081)も重要な情報です。後述するログを確認する際、camel trace で特定した exchange id を使いログの絞り込みが可能だからです。

トレース情報にはエンドポイント情報(例: route1/setBody1)も出力されますが、ファイルの行番号で出力することも可能です。

camel trace --source -action=dump

exchange の property や variable も合わせて出力させることも可能です。

camel trace --show-exchange-properties --show-exchange-variables --action=dump

他にも色々とオプションがありますので、詳細は --help でご確認ください。

camel trace --help

いきなりアプリケーションログの解析やデバッガーによるデバッグをせず、一旦 camel trace を使ったルーティング状況の把握を強くお勧めします。

ログレベルの変更

アプリケーションログレベルの変更はデバッグをする上で一般的だと思います。camel trace で問題箇所を調べることができれば、ルートログレベルの変更ではなく、パッケージを指定したログレベルの変更をお勧めします。 camel-jbang を使い、camel全般のログレベルを変更する方法はこちらです。

camel run Hello.java --logging-category=org.apache.camel=DEBUG

camel のログを読み解くにはソースコードレベルの読解が必要となります。無理に DEBUG/TRACE レベルログの解析に時間を使わず、製品サポートへ問い合わせる方法をお勧めします。調査の過程でログレベルの変更をお願いすることもありますので、ご留意ください。

breakpoint を使って止める

camel-jbang は、camel engine レベルでのデバッガーも提供しています。例えば、特定の endpoint にブレイクポイントをセットし、ステップ実行ができます。 exchange の内容も出力されるので、traceログ出力して後から読むのではなく、こちらの方法で調査しても良いかもしれません。

camel debug Hello.java --brakpoint=setBody

このコマンドでは、setBody() 実行箇所にブレイクポイントをセットし実行しています。camel ルートの実行後、自動でデバッグメニューが出力されます。

Source: Hello.java                                                                  History
--------------------------------------------------------------------------------    ------------------------------------------------------------------------------------------
   4:                                                                                     ---> route1/from1                 7:   from("timer:java?period=1000")
   5:          @Override                                                            
   6:          public void configure() throws Exception {                           
   7: *-->         from("timer:java?period=1000")                                   
   8:                  .setBody()                                                   
   9:                      .simple("Hello Camel from ${routeId}")                   
  10:                  .log("${body}");                                             
  11:          }                                                                    
  12:      }                                                                        
                                                                                    
                                                                                    
2025-08-19 09:09:27.979   4135 --- [ thread #6 - timer://java]                              route1/*--> :     1 - Created
 Exchange    (DefaultExchange)  InOnly  1296773E4359222-0000000000000000 
 Message     (DefaultMessage) 
 Body        (null) 


    Breakpoint suspended (i = step into (default), o = step over). Press ENTER to continue.

豊富なオプションが用意されていますので、最新バージョンの camel-jbang を用意し、ヘルプコマンドでオプション内容を確認することを推奨します。

camel debug --help

camel は vscode extensionも用意しており、VSCode が提供する GUI を使いデバッグすることも可能です。 marketplace.visualstudio.com

marketplace.visualstudio.com

camel engine レベルではなく Javaレベルでのデバッグももちろん可能ですが、traceログなど各種リソースを取得した時点で一旦製品サポート窓口へお問い合わせいただき、camelのデバッグではなくビジネスロジックの開発にリソースを集中していただければと思います。

明日の advent calendar 8日目では、「Camel File コンポーネント」 についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com




以上の内容はhttps://rheb.hatenablog.com/entry/cac20251207より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14