Skip to content

Latest commit

 

History

History
147 lines (105 loc) · 4.45 KB

File metadata and controls

147 lines (105 loc) · 4.45 KB

Apache CXF REST services - Spring Boot example

Abstract

This example illustrates how to use Spring Boot with Camel and Apache CXF implementing REST services using bottom-up approach.

Introduction

If you are using REST services directly from Camel and you want to use OpenTelemetry please refer to the dedicated example

There are 3 services which communicate each other, starting from the random service:

  • random: the main service, exposes the entry point REST service and store the results

  • even: the service that verifies the even numbers

  • odd: the service that verifies the odd numbers

moreover there is a common module containing common classes

overview

Build

You can build this example using the following command; it will also download the OpenTelemetry agent used to instrument the applications:

$ mvn package -Potel-agent

Run

Run docker-compose to start all the needed services:

$ docker-compose -f containers/docker-compose.yml up -d

the command runs:

Run each services on separated terminals:

$ source containers/env.sh \
    && java -javaagent:target/opentelemetry-javaagent.jar \
    -Dotel.service.name=random \
    -jar rest-cxf-otel-random/target/*.jar
$ source containers/env.sh \
    && java -javaagent:target/opentelemetry-javaagent.jar \
    -Dotel.service.name=even \
    -Dserver.port=8081 \
    -jar rest-cxf-otel-even/target/*.jar
$ source containers/env.sh \
    && java -javaagent:target/opentelemetry-javaagent.jar \
    -Dotel.service.name=odd \
    -Dserver.port=8082 \
    -jar rest-cxf-otel-odd/target/*.jar

After the Spring Boot applications have been started, you can open the following URL in your web browser http://localhost:8080/services/ to access the list of services, including WADL definition

You can also access the REST endpoint from the command line:

i.e. to generate 5 random numbers run:

$ curl -X POST http://localhost:8080/services/api/play/5 -s | jq .

The command will produce an output like:

{
  "result": {
    "ODD": [
      {
        "number": 229,
        "type": "ODD"
      },
      {
        "number": 585,
        "type": "ODD"
      }
    ],
    "EVEN": [
      {
        "number": 648,
        "type": "EVEN"
      },
      {
        "number": 670,
        "type": "EVEN"
      },
      {
        "number": 846,
        "type": "EVEN"
      }
    ]
  },
  "evenCount": 3,
  "oddCount": 2
}

Now in the Jaeger UI http://localhost:16686 the traces will be available, both from Camel and from CXF instrumentation

jaeger

The services can be stopped pressing [CTRL] + [C] in the shell, and the containers can be stopped with

$ docker-compose -f containers/docker-compose.yml down

Explain the code

The dependency org.apache.cxf:cxf-integration-tracing-opentelemetry provides org.apache.cxf.tracing.opentelemetry.jaxrs.OpenTelemetryFeature that instruments the OpenTelemetry API implemented in the java agent.

The feature is injected in the Spring context

link:rest-cxf-otel-common/src/main/java/org/apache/camel/example/springboot/cxf/otel/CxfConfig.java[role=include]

and then it is configured in the Camel route as provider in the cxfrs endpoint

link:rest-cxf-otel-random/src/main/java/org/apache/camel/example/springboot/cxf/otel/CamelRouter.java[role=include]

When the feature is enabled it is possible to add custom tags or logs using TracerContext from CXF

link:rest-cxf-otel-random/src/main/java/org/apache/camel/example/springboot/cxf/otel/RandomService.java[role=include]
link:rest-cxf-otel-random/src/main/java/org/apache/camel/example/springboot/cxf/otel/RandomServiceImpl.java[role=include]

Help and contributions

If you hit any problem using Camel or have some feedback, then please let us know.

We also love contributors, so get involved :-)

The Camel riders!