Grafik Rute untuk Apache Camel


Pada artikel ini saya akan memberi tahu Anda tentang bagaimana Anda bisa membuat grafik rute untuk aplikasi dengan Apache Camel, melacak status rute-rute ini dan mengumpulkan metrik untuk mereka.
Kami menggunakan Apache Camel di aplikasi musim semi dan di Apache ServiceMix. Dan jika rute dalam layanan terpisah dapat dimengerti dan mudah dilihat, maka di dalam bus data, di mana ada banyak rute seperti itu, itu tidak begitu sederhana.


Apa itu Apache ServiceMix

Apache Camel adalah kerangka kerja sumber terbuka untuk mengintegrasikan aplikasi melalui penggunaan dsl sederhana dan serangkaian komponen akses data siap pakai.


Apache ServiceMix adalah solusi open source yang didasarkan pada Apache ActiveMQ, Camel, CXF, Karaf, yang memungkinkan Anda membangun platform untuk solusi integrasi. Apache ServiceMix dapat digunakan sebagai bus layanan perusahaan. Unta dalam hal ini akan menyederhanakan pembuatan rute di bus menggunakan dsl dalam bentuk xml, java, scala, dll. Misalnya, jika kita perlu mentransfer pesan dari satu antrian ke antrian lainnya (jangan pikirkan mengapa kita membutuhkan ini), kita dapat menggambarkan rute dalam file xml (contoh di bawah), memasukkannya ke direktori layanan yang diinginkan dan itu akan digunakan.


<?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> 

Rute yang dijelaskan mentransfer file dari satu direktori ke direktori lainnya.


Selama bertahun-tahun digunakan, ban telah mengumpulkan lebih dari seratus rute dengan berbagai kompleksitas, dan kami telah memahami bahwa semakin sulit untuk mengingat semua koneksi ini. Menggambar skema rute dengan tangan Anda atau menggambarkannya dalam bentuk tabel tidak lagi menjadi solusi yang nyaman dan mudah didukung. Tetapi mulai tampak bahwa konstruksi otomatis dari grafik rute akan menyelamatkan semua orang.


Untuk membuat grafik, Anda perlu simpul dan tepian. Dan dari semua ini, kita membutakan sesuatu yang indah!


Elemen Rute


Titik masuk (satu) untuk rute dijelaskan oleh pernyataan from dengan indikasi titik akhir. Yaitu untuk


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

endpoint akan berupa file:camel/input . Dia memberi tahu kita bahwa pada awal rute file akan diambil dari direktori camel/input .


Titik keluar dari rute (ada banyak dari mereka, itulah sebabnya saya menunjukkan jamak) ditentukan secara berbeda - tergantung pada template pesan juga dengan titik akhir yang ditunjukkan. Dalam contoh di atas, titik seperti itu dijelaskan oleh to . Yaitu untuk


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

endpoint akan berupa file:camel/output . Dia memberi tahu kita bahwa pada akhir rute, file akan disimpan ke direktori camel/output .


Titik akhir adalah puncak yang kita butuhkan. Tulang rusuk akan menentukan rute sendiri.


Mendapatkan deskripsi rute


Servicemix menyediakan kemampuan untuk mengakses berbagai informasi menggunakan JMX dan kami akan menggunakan jolokia untuk mengakses informasi ini melalui http.


Sebagai contoh, ambil deskripsi rute ini


 <?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> 

Daftar Rute


Metode http://host:8181/jolokia/read/org.apache.camel:type=routes,* mengembalikan daftar rute dengan detail.


Contoh mengembalikan data untuk rute 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": "" } 

Ada banyak RouteId dan di antaranya, RouteId , Context , EndpointUri , State , Uptime sangat menarik untuk konstruksi grafik.


Penting untuk menyebutkan bahwa metode mengembalikan metrik sepanjang rute: ExchangesTotal , ExchangesCompleted , ExchangesFailed , ExchangesInflight , dll.


Metode di atas mencakup 90% dari kebutuhan data kami, tetapi yang tidak kembali adalah informasi tentang titik keluar dari rute. Untuk mendapatkan informasi ini, Anda perlu menggunakan metode untuk memperoleh rincian rute dan metode untuk mendapatkan skema. Salah satu metode tidak cukup, karena dalam beberapa kasus metode tidak mengembalikan semua data yang diperlukan untuk membentuk daftar titik keluar.


Detail Rute


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


Contoh data yang dikembalikan:


 { "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 } 

Peta rute


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


Metode mengembalikan diagram rute dalam bentuk xml hanya jika sudah dibuat di dalamnya. Misalnya, jika rute dijelaskan menggunakan org.apache.camel.builder.RouteBuilder (digunakan untuk menggambarkan rute dalam aplikasi pegas), maka metode ini tidak akan mengembalikan apa pun.


Contoh data yang dikembalikan:


 { "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 } 

Gambar sebuah grafik


Menggabungkan semua informasi yang diterima, Anda dapat dengan aman menggambar grafik, saya menggunakan vis.js dan mendapatkan hasil ini

Poin adalah titik masuk dan keluar, tepi adalah rute, dan angka abu-abu pada rute adalah metrik ExchangesTotal .


Grafik untuk beberapa layanan


Pendekatan yang dijelaskan untuk konstruksi grafik juga cocok untuk kasus ketika unta digunakan tidak hanya dalam bus data, tetapi juga dalam aplikasi. Misalnya, setelah menggambarkan rute dalam aplikasi dengan cara ini:


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

Anda dapat menggabungkan semua data pada rute dari servicemix dan aplikasi dan menggambar grafik umum

Perhatikan bahwa rute baru dari jms:topic:timer to bean:service muncul pada diagram.


Kesimpulan


Dengan menerapkan pendekatan yang dijelaskan untuk membangun grafik rute, kami dapat memperoleh gambaran keseluruhan untuk bus dan layanan terintegrasi. Sebenarnya grafik ban kami terlihat seperti ini

Bukti aplikasi konsep dapat dilihat di sini - github

Source: https://habr.com/ru/post/id435594/


All Articles