A step-by-step guide to deploying the OpenTelemetry Collector, exporting OTLP data to JJHub OBSERVE, and auto-instrumenting a Java service. Covers verification steps and common pitfalls so you get end-to-end tracing in about 15 minutes.
Before you start, make sure of three things: JJHub OBSERVE is deployed and you have the OTLP endpoint (something like https://obs.example.com/otlp); you have a Java 8+ service to instrument; and the server can reach the Collector over the network.
The architecture is simple: the application pushes trace data to the Collector via the OTLP protocol, and the Collector handles buffering, redaction, and sampling before exporting to JJHub OBSERVE.
Spin up an OpenTelemetry Collector. Docker is the fastest route:
receivers:
otlp:
protocols:
grpc:
http:
exporters:
otlphttp:
endpoint: https://obs.example.com/otlp
service:
pipelines:
traces:
receivers: [otlp]
exporters: [otlphttp]
Mount the config and run:
docker run -p 4317:4317 -p 4318:4318 \
-v $PWD/otel-config.yaml:/etc/otelcol/config.yaml \
otel/opentelemetry-collector-contrib
Port 4317 is gRPC, 4318 is HTTP. For a quick trial you can skip the Collector and point the app straight at OBSERVE's OTLP endpoint. In production, keep the Collector — it's the single place where buffering, redaction, and sampling all happen.
Use the Java agent for zero-code instrumentation. Download opentelemetry-javaagent.jar and add it at startup:
java -javaagent:opentelemetry-javaagent.jar \
-Dotel.service.name=order-service \
-Dotel.exporter.otlp.endpoint=http://localhost:4317 \
-Dotel.traces.exporter=otlp \
-Dotel.metrics.exporter=none \
-jar app.jar
service.name is how the service shows up in traces, so give it a meaningful name — we recommend an "environment-service" format. The agent instruments Spring MVC, HTTP clients, JDBC drivers, Redis, Kafka, and most common libraries with no business-code changes.
Fire a few requests, then open the Tracing page in OBSERVE:
order-service and you should see requests.Common problems:
endpoint includes the http:// prefix.By default everything is sampled, which will drown you under load. Add a probabilistic_sampler in the Collector and keep 10–20%, raising it temporarily during incidents. The value of tracing is in locating the problem, not in how much you store.