diff --git a/generic-examples/README.md b/generic-examples/README.md index 9bd1564..ab70585 100644 --- a/generic-examples/README.md +++ b/generic-examples/README.md @@ -55,4 +55,5 @@ Traits configuration will be very helpful to fine tune your `Integration`. Here |---|---|---| | Container | How to customize with `container` trait| [see examples](./traits/container/)| | Health | How to customize with `health` trait| [see examples](./traits/health/)| -| JVM | How to use `jvm` trait| [see examples](./traits/jvm/)| \ No newline at end of file +| JVM | How to use `jvm` trait| [see examples](./traits/jvm/)| +| Tracing (opentracing) | How to use `tracing` trait| [see examples](./traits/tracing/)| \ No newline at end of file diff --git a/generic-examples/traits/tracing/InventoryService.java b/generic-examples/traits/tracing/InventoryService.java index 8afbc70..be194fc 100644 --- a/generic-examples/traits/tracing/InventoryService.java +++ b/generic-examples/traits/tracing/InventoryService.java @@ -36,30 +36,28 @@ public class InventoryService extends RouteBuilder { @Override public void configure() throws Exception { - + restConfiguration() + .enableCORS(true) + .bindingMode(RestBindingMode.json); + rest() - .post("/notify/order") + .post("/notify/order/place") .to("direct:notify"); - JacksonDataFormat jacksonDataFormat = new JacksonDataFormat(); - jacksonDataFormat.setUnmarshalType(Map.class); JacksonDataFormat invDataFormat = new JacksonDataFormat(); invDataFormat.setUnmarshalType(InventoryNotification.class); - from("direct:notify") + .log("notifyorder--> ${body}") .setHeader(Exchange.CONTENT_TYPE, constant("application/json")) - .unmarshal(jacksonDataFormat) - .log("Inventory Notified ${body}") .bean(InventoryNotification.class, "getInventoryNotification(${body['orderId']},${body['itemId']},${body['quantity']} )") .marshal(invDataFormat) + .log("Inventory Notified ${body}") .convertBodyTo(String.class) ; - } - private static class InventoryNotification { private Integer orderId; private Integer itemId; diff --git a/generic-examples/traits/tracing/OrderService.java b/generic-examples/traits/tracing/OrderService.java index 2e3fa5e..f706927 100644 --- a/generic-examples/traits/tracing/OrderService.java +++ b/generic-examples/traits/tracing/OrderService.java @@ -36,118 +36,72 @@ public class OrderService extends RouteBuilder { public void configure() throws Exception { restConfiguration() - .component("undertow") - .apiContextPath("/api-doc") - .apiProperty("cors", "true") - .apiProperty("api.title", "Order API") - .apiProperty("api.version", "1.0") .enableCORS(true) - .port("8080") .bindingMode(RestBindingMode.json); - rest() + rest() .post("/place") .to("direct:placeorder"); JacksonDataFormat jacksonDataFormat = new JacksonDataFormat(); jacksonDataFormat.setUnmarshalType(Order.class); - - from("direct:placeorder") - .log("placeorder--> ${body}") + .log("-----IN ${headers}") .marshal(jacksonDataFormat) - //.unmarshal(jacksonDataFormat) - .setHeader("myinputBody",simple("${body}")) - .log("inputBody 1 --> ${headers.myinputBody}") - .removeHeader("CamelHttp*").setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http.HttpMethods.POST)) - .setBody(simple("${headers.myinputBody}")) - - .multicast(new GroupedBodyAggregationStrategy()) - .to("http://inventory/notify/order?bridgeEndpoint=true&chunked=false", - "http://invoice/notify/order?bridgeEndpoint=true&chunked=false") - .end() + .log("inputBody --> ${body}") + .to("http://inventory/notify/order?bridgeEndpoint=true") .removeHeaders("*") - .log("return from parallelProcessing ${body}") + .log("responseBody from inventory --> ${body}") .setHeader(Exchange.CONTENT_TYPE, constant("application/json")) - .setBody(simple("{\"inventory\":${body[0]},\"invoice\":${body[1]}}")) + .setBody(simple("{\"inventory\":${body}}")) .unmarshal().json() - .log("-----DONE ${headers}") - ; - - - } - - private static class Order implements java.io.Serializable{ private static final long serialVersionUID = 1L; private Integer orderId; private Integer itemId; - private String orderItemName; private Integer quantity; + + private String orderItemName; private Integer price; - private String address; - private Integer zipCode; - private String datetime; - private String department; - public void setDepartment(String department){ - this.department = department; - } - public String getDepartment(){ - return "Inventory"; - } - public void setDatetime(String datetime){ - this.datetime = datetime; - } - public String getDatetime(){ - return "2019-08-08 22:19:99"; - } public void setOrderId(Integer orderId){ this.orderId=orderId; } public void setItemId(Integer itemId){ this.itemId=itemId; } - public void setOrderItemName(String orderItemName){ - this.orderItemName=orderItemName; - } public void setQuantity(Integer quantity){ this.quantity=quantity; } + + public void setOrderItemName(String orderItemName){ + this.orderItemName=orderItemName; + } public void setPrice(Integer price){ this.price=price; } - public void setAddress(String address){ - this.address=address; - } - public void setZipCode(Integer zipCode){ - this.zipCode=zipCode; - } + public Integer getOrderId(){ return this.orderId; } public Integer getItemId(){ return this.itemId; } - public String getOrderItemName(){ - return this.orderItemName; - } public Integer getQuantity(){ return this.quantity; } + + public String getOrderItemName(){ + return this.orderItemName; + } public Integer getPrice(){ return this.price; } - public String getAddress(){ - return this.address; - } - public Integer getZipCode(){ - return this.zipCode; - } + } } \ No newline at end of file diff --git a/generic-examples/traits/tracing/README.md b/generic-examples/traits/tracing/README.md index 9c4b080..274af50 100644 --- a/generic-examples/traits/tracing/README.md +++ b/generic-examples/traits/tracing/README.md @@ -8,43 +8,81 @@ The Tracing trait can be used to automatically publish tracing information of in 1. Enable Ingress addon in Minikube - $ minikube addons enable ingress +```sh +$ minikube addons enable ingress +``` 2. Add Minikube IP to /etc/hosts: - $ echo "$(minikube ip) example.com" | sudo tee -a /etc/hosts +```sh +$ echo "$(minikube ip) example.com" | sudo tee -a /etc/hosts +``` -3. To install Jaeger, make sure the Jaeger operator is installed: +3. Make sure Jaeger operator is available (see https://www.jaegertracing.io/docs for installation details) - $ kubetcl apply -f tracing/instance.yaml +4. To use Jaeger, you can install the AllInOne image: -4. Apply the Jaeger All-in-one Template: +```sh +$ kubetcl apply -f instance.yaml +``` - $ kubectl apply -f https://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/all-in-one/jaeger-all-in-one-template.yml +5. Check the presence of the Jaeger instance +```sh +$ kubectl get jaeger +NAME STATUS VERSION STRATEGY STORAGE AGE +instances Running 1.40.0 allinone memory 9m16s +``` ## Enable OpenTracing and trace a REST API call in Camel K Route Tracing is an important approach for controlling and monitoring the experience of users. We  will be creating two distributed services: `Order` which is a rest service, and `Inventory` which is also a rest service. -Quarkus OpenTracing extension in Camel automatically creates a Camel OpenTracingTracer and binds it to the Camel registry. Simply configure the properties to enable open tracing. +Quarkus OpenTracing extension in Camel automatically creates a Camel OpenTracingTracer and binds it to the Camel registry. Simply declare the traits to enable open tracing. -See `quarkus.properties` for details. - kamel run InventoryService.java --name inventory -d mvn:org.apache.camel.quarkus:camel-quarkus-opentracing -d camel-jackson --property-file quarkus.properties -t quarkus.enabled=true +```sh +kamel run InventoryService.java --name inventory \ + -d camel-jackson \ + -t tracing.enabled=true \ + -t tracing.sampler-type=const \ + -t tracing.sampler-param=1 +``` -Let's inject the Opentracing Tracer to the camel OrderService.java application. Let's start the inventory service. +This will : +* enable tracing +* automaticly discover of jaeger tracing endpoint +* sample all traces + +To specify the endpoint use the following trait configuration `-t tracing.endpoint=http://instance-collector:14268/api/traces` -See `customizers/OpentracingCustomizer.java` for more details. +Let's inject the Opentracing Tracer to the camel OrderService.java application. Let's start the inventory service. - kamel run --name order OrderService.java customizers/OpentracingCustomizer.java -d camel-opentracing -d mvn:io.jaegertracing:jaeger-client:1.2.0 -d camel-jackson -d camel-undertow -d camel-swagger-java --property-file application.properties +```sh +kamel run OrderService.java --name order \ + -d camel-jackson \ + -t tracing.enabled=true \ + -t tracing.sampler-type=const \ + -t tracing.sampler-param=1 +``` ## View the Jaeger UI - minikube service jaeger-query --url +If you installed the Jaeger Operator as describred, you should be able to access Jaeger interface on minikube : http://example.com. In the Jaeger interface we can see the details as: ![Jeager Tracing Interface](interface/jaegerInterface.png) -You can make a few requests the REST Service with custom transaction values defined by curl. +You can make a few requests the REST Service with custom transaction values defined by curl, provided you made the `order` and `inventory` services available (using the **Service** trait is an easy way). + +```sh +curl http:///place -d ' +{ + "orderId":58, + "itemId":12, + "quantity":1, + "orderItemName":"awesome item", + "price":99 +}' -v -H "Content-Type: application/json" +``` diff --git a/generic-examples/traits/tracing/application.properties b/generic-examples/traits/tracing/application.properties deleted file mode 100644 index b2cb50f..0000000 --- a/generic-examples/traits/tracing/application.properties +++ /dev/null @@ -1 +0,0 @@ -jaeger.endpoint=http://jaeger-all-in-one-inmemory-collector:14268/api/tracess \ No newline at end of file diff --git a/generic-examples/traits/tracing/customizers/OpentracingCustomizer.java b/generic-examples/traits/tracing/customizers/OpentracingCustomizer.java deleted file mode 100644 index 5bdbd5b..0000000 --- a/generic-examples/traits/tracing/customizers/OpentracingCustomizer.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package customizers; - -// camel-k: language=java - -import org.apache.camel.BindToRegistry; -import org.apache.camel.CamelContext; -import org.apache.camel.PropertyInject; -import org.apache.camel.opentracing.OpenTracingTracer; - -import io.opentracing.Tracer; - -import io.jaegertracing.Configuration; -import io.jaegertracing.Configuration.ReporterConfiguration; -import io.jaegertracing.Configuration.SamplerConfiguration; -import io.jaegertracing.Configuration.SenderConfiguration; - -public class OpentracingCustomizer { - - @BindToRegistry - public static OpenTracingTracer tracer( - CamelContext ctx, - @PropertyInject("env:CAMEL_K_INTEGRATION") String name, - @PropertyInject("jaeger.endpoint") String endpoint) { - - OpenTracingTracer openTracingTracer = new OpenTracingTracer(); - openTracingTracer.setTracer(new Configuration(name) - .withReporter(new ReporterConfiguration() - .withSender(new SenderConfiguration() - .withEndpoint(endpoint) - ) - ) - .withSampler(new SamplerConfiguration() - .withType("const") - .withParam(1) - ) - .getTracer() - ); - openTracingTracer.init(ctx); - return openTracingTracer; - } - -} \ No newline at end of file diff --git a/generic-examples/traits/tracing/quarkus.properties b/generic-examples/traits/tracing/quarkus.properties deleted file mode 100644 index 74ff912..0000000 --- a/generic-examples/traits/tracing/quarkus.properties +++ /dev/null @@ -1,4 +0,0 @@ -quarkus.jaeger.service-name=inventory -quarkus.jaeger.sampler-type=const -quarkus.jaeger.sampler-param=1 -quarkus.jaeger.endpoint=http://jaeger-all-in-one-inmemory-collector:14268/api/traces \ No newline at end of file