## OpenTracing Javaagent ### Purpose The OpenTracing Java Agent contribution is designed to inject code directly to the JVM. It provides to developers a way to instrument their code, without modifying it. The Java Agent is a compiled Jar and it is added to the JVM using the `-javaagent` option. This contribution uses the [Byteman project](http://byteman.jboss.org/). The contribution provides a set of rules for instrumenting the code through a collection of `otarules.btm` files The contrib is basically able to serve 2 goals: - Instrumenting custom or legacy code without modifying it (extremely verbose and painful) - Inject the others OpenTracing contribution in your app (Spring Boot, JDBC wrapper, Jax-Rs, etc. ) and configure them on-fly. ### Run the demo 1. Check prerequisites [here](../../../raclette-java-examples/README.md) 2. Run the application from your IDE using `-javaagent:path/to/dd-java-agent.jar` ![](java-agent-ide.png) ### How it's working #### Instrumenting using the existing contributions The agent is used to load the contrib directly to the existing code. The behavior is pretty simple: the agent looks for all `otarules.otm` files in the classpath. Then, it loads each rule file and the instrumentation starts. For instrumenting the framework you are using, all you need to do is: * Provide the corresponding `otarules.btm` file for your framework. [Check existing contribution here](https://github.com/opentracing-contrib). * Attach the java agent to the running JVM * Initialise your tracer Let's see how to do that: First add the contrib to the dependencies. You can find them here: https://github.com/opentracing-contrib ```xml io.opentracing.contrib opentracing-agent-rules-java-net 0.0.11 ``` Datadog provides a way to initialise the tracer using a resolver. In order to configure it, you just have to edit the `dd-trace.yaml` file. ```yaml defaultServiceName: java-agent-app writer: type: DDAgentWriter host: localhost port: 8126 sampler: type: AllSampler ``` Then, attach the java agent to the JVM. ```bash java -javaagent:/path/to/opentracing-agent-x.y.z.jar ... ``` At this time, your code is instrumenting, and you can start to the traces in your APM. #### Instrumenting from scratch custom code (advanced users) If you want to instrument custom code, without using a contribution, you need 2 things: * A tracer * A `otarules.btm` file, describing your instrumentation In this project, we show you an instrumentation. We inject some code via A rule file. The BTM rule files describes when/where/how modify the legacy code. If you want to dig deeper, you have to refer to the [official documentation](http://byteman.jboss.org/docs.html) For instance, here is how to create a new span when the `method1` is called somewhere. Check the full class [code](src/main/java/org/javaagent/App.java). ```btm RULE start method1() CLASS org.javaagent.App METHOD method1() HELPER io.opentracing.contrib.agent.OpenTracingHelper AT ENTRY IF TRUE DO activateSpan(getTracer().buildSpan("method1").start()); ENDRULE ``` You have to add all rules necessary to instrument your code as you want. This is why (almost) nobody uses the agent in that way. Similarly to the previous example, the tracer is initialised through the yaml config file.