Apache Camelのルートグラフ







この記事では、Apache Camelを使用してアプリケーションのルートグラフを作成し、これらのルートのステータスを追跡し、それらのメトリックを収集する方法について説明します。

Apache Camelは、春のアプリケーションとApache ServiceMixで使用します。 そして、別のサービスのルートが理解可能であり、簡単に見える場合、そのようなルートが多数あるデータバス内では、それほど単純ではありません。







Apache ServiceMixとは

Apache Camelは、シンプルなdslと豊富な既製のデータアクセスコンポーネントを使用してアプリケーションを統合するためのオープンソースフレームワークです。







Apache ServiceMixは、Apache ActiveMQ、Camel、CXF、Karafに基づくオープンソースソリューションであり、統合ソリューションのプラットフォームを構築できます。 Apache ServiceMixは、エンタープライズサービスバスとして使用できます。 この場合のCamelは、xml、java、scalaなどの形式のdslを使用して、バスでのルートの作成を簡素化します。 たとえば、あるキューから別のキューにメッセージを転送する必要がある場合(これが必要な理由を考えないでください)、xmlファイルにルートを記述し(下の例を参照)、目的のサービスディレクトリにドロップして展開します。







<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> <camelContext xmlns="http://camel.apache.org/schema/blueprint"> <route> <from uri="file:camel/input"/> <log message="Moving ${file:name} to the output directory"/> <to uri="file:camel/output"/> </route> </camelContext> </blueprint>
      
      





説明したルートは、ファイルをあるディレクトリから別のディレクトリに転送します。







長年の使用により、タイヤにはさまざまな複雑さの100以上のルートが蓄積され、これらすべての接続を覚えるのがますます難しくなっていることがわかりました。 ルートスキームを手で描いたり、テーブル形式で記述したりするのは、便利で簡単にサポートできるソリューションのように見えなくなりました。 しかし、ルートグラフの自動構築は全員を救うように思われ始めました。







グラフを作成するには、頂点とエッジが必要です。 そして、これらのうち、私たちは美しいものを盲目にします!







ルート要素



ルートのエントリポイント(1つ)は、エンドポイントを示すfrom



ステートメントで記述されます。 つまり のために







 <from uri="file:camel/input"/>
      
      





エンドポイントはfile:camel/input



なりfile:camel/input



。 彼は、ルートの最初に、ファイルがcamel/input



ディレクトリから取得されることを教えてくれます。







ルートからの出口点(それらが多数あるため、複数を指定した理由)は異なる方法で定義されます-エンドポイントが指定されているメッセージングテンプレートによっても異なります。 上記の例では、このようなポイントはto



で記述されto



ます。 つまり のために







 <to uri="file:camel/output"/>
      
      





エンドポイントはfile:camel/output



なりfile:camel/output



。 彼はルートの最後に、ファイルはcamel/output



ディレクトリに保存されると言っています。







エンドポイントは必要な頂点です。 リブはルート自体を決定します。







ルートの説明を取得する



ServicemixはJMXを使用してさまざまな情報にアクセスする機能を提供します。jolokiaを使用して、httpを介してこの情報にアクセスします。







例として、このルートの説明を取り上げます







 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route id="the-clock-is-ticking"> <from uri="timer://foo?fixedRate=true&amp;period=1000"/> <to uri="jms:topic:timer?connectionFactory=demo"/> </route> <route id="service-a"> <from uri="jms:topic:timer?connectionFactory=demo"/> <to uri="jms:queue:service-a?connectionFactory=demo"/> </route> <route id="service-a-log"> <from uri="jms:queue:service-a?connectionFactory=demo"/> <to uri="log:service-a"/> </route> </camelContext> </beans>
      
      





ルートリスト



メソッドhttp://host:8181/jolokia/read/org.apache.camel:type=routes,*



は、詳細なルートのリストを返します。







service-a



ルートの戻りデータの例:







 "org.apache.camel:context=a.xml,name=\"service-a\",type=routes": { "StatisticsEnabled": true, "EndpointUri": "jms:\/\/topic:timer?connectionFactory=demo", "CamelManagementName": "a.xml", "ExchangesCompleted": 173, "LastProcessingTime": 2, "ExchangesFailed": 0, "Description": null, "FirstExchangeCompletedExchangeId": "ID-...", "StartTimestamp": "2018-12-17T07:01:12Z", "FirstExchangeCompletedTimestamp": "2018-12-17T07:01:13Z", "LastExchangeFailureTimestamp": null, "MaxProcessingTime": 35, "LastExchangeCompletedTimestamp": "2018-12-17T07:04:05Z", "Load15": "", "DeltaProcessingTime": -8, "OldestInflightDuration": null, "ExternalRedeliveries": 0, "ExchangesTotal": 173, "ResetTimestamp": "2018-12-17T07:01:12Z", "ExchangesInflight": 0, "MeanProcessingTime": 4, "LastExchangeFailureExchangeId": null, "FirstExchangeFailureExchangeId": null, "Uptime": "2 minutes", "CamelId": "camel-3", "TotalProcessingTime": 827, "FirstExchangeFailureTimestamp": null, "RouteId": "service-a", "RoutePolicyList": "", "FailuresHandled": 0, "MessageHistory": true, "Load05": "", "OldestInflightExchangeId": null, "State": "Started", "InflightExchanges": 0, "Redeliveries": 0, "MinProcessingTime": 0, "LastExchangeCompletedExchangeId": "ID-...", "Tracing": false, "Load01": "" }
      
      





多くのRouteId



あり、その中でもRouteId



Context



EndpointUri



State



Uptime



は、グラフの構築に特に重要です。







メソッドがルートに沿ってメトリックを返すことに注意することが重要です: ExchangesTotal



ExchangesCompleted



ExchangesFailed



ExchangesInflight



など。







上記の方法はデータニーズの90%をカバーしますが、返されないのは、ルートからの出口点に関する情報です。 この情報を取得するには、ルートの詳細を取得する方法とスキームを取得する方法を使用する必要があります。 場合によっては、メソッドが出口点のリストを形成するために必要なすべてのデータを返さないため、メソッドの1つでは十分ではありません。







ルートの詳細



ルートの詳細はメソッドから取得されます。

http://host:8181/jolokia/exec/org.apache.camel:context=a.xml,type=routes,name="service-a"/createRouteStaticEndpointJson(boolean)/true









返されるデータの例:







 { "request": { "mbean": "org.apache.camel:context=a.xml,name=\"service-a\",type=routes", "arguments": ["true"], "type": "exec", "operation": "createRouteStaticEndpointJson(boolean)" }, "value": "{\"routes\": { \"service-a\": { \"inputs\": [ { \"uri\": \"jms:\/\/topic:timer?connectionFactory=demo\" } ], \"outputs\": [ { \"uri\": \"jms:\/\/queue:service-a?connectionFactory=demo\" } ] }}\n}\n", "timestamp": 1545040570, "status": 200 }
      
      





ルートマップ



ルート図はメソッドから取得されます

http://host:8181/jolokia/exec/org.apache.camel:context=a.xml,type=routes,name="service-a"/dumpRouteAsXml(boolean)/true









このメソッドは、ルート図が作成された場合にのみ、xml形式でルート図を返します。 たとえば、 org.apache.camel.builder.RouteBuilder



を使用してルートが記述されている場合(スプリングアプリケーションでルートを記述するために使用される)、メソッドは何も返しません。







返されるデータの例:







 { "request": { "mbean": "org.apache.camel:context=a.xml,name=\"service-a\",type=routes", "arguments": ["true"], "type": "exec", "operation": "dumpRouteAsXml(boolean)" }, "value": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<route customId=\"true\" id=\"service-a\" xmlns=\"http:\/\/camel.apache.org\/schema\/spring\">\n <from uri=\"jms:topic:timer?connectionFactory=demo\"\/>\n <to uri=\"jms:queue:service-a?connectionFactory=demo\" id=\"to5\"\/>\n<\/route>\n", "timestamp": 1545040727, "status": 200 }
      
      





グラフを描く



受け取ったすべての情報を組み合わせて、グラフを安全に描画できますvis.js



を使用してこの結果を得ました



ポイントはエントリポイントと出口ポイント、エッジはルート、ルートのグレーの数字はExchangesTotal



メトリックです。







複数のサービスのグラフ化



グラフの構築について説明したアプローチは、データバスだけでなくアプリケーションでもラクダを使用する場合に適しています。 たとえば、アプリケーションのルートを次のように記述します。







 @Component public class EventRoutes extends RouteBuilder { @Override public void configure() throws Exception { from("jms:topic:timer") .inOnly("bean:service?method=handle"); } }
      
      





servicemix



とアプリケーションからのルート上のすべてのデータを組み合わせて、共通のグラフを描くことができます



jms:topic:timer



to bean:service



からの新しいルートが図に表示されていることに注意してください。







おわりに



ルートグラフを構築するための上記のアプローチを実装することにより、バスと統合サービスの両方の全体像を把握することができました。 実際、タイヤのグラフは次のようになります



コンセプトアプリの証明はここで見ることができます-github








All Articles