Tracing Providers
Direct OTEL
Export standard OTLP/HTTP traces directly to Judgment.
Use Direct OTEL when your application, framework, or collector already exports OpenTelemetry traces. Judgment accepts standard OTLP/HTTP protobuf trace payloads, so you can send spans directly without a Judgment SDK wrapper.
Connection Details
| Setting | Value |
|---|---|
| Endpoint | https://api.judgmentlabs.ai/otel/v1/traces |
| Protocol | OTLP HTTP/protobuf |
| Header | Authorization: Bearer <JUDGMENT_API_KEY> |
| Header | X-Organization-Id: <JUDGMENT_ORG_ID> |
| Header | X-Project-Id: <JUDGMENT_PROJECT_ID> |
Examples
pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-httpimport os
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
provider = TracerProvider(
resource=Resource.create({"service.name": "my-service"})
)
provider.add_span_processor(
BatchSpanProcessor(
OTLPSpanExporter(
endpoint="https://api.judgmentlabs.ai/otel/v1/traces",
headers={
"Authorization": f"Bearer {os.environ['JUDGMENT_API_KEY']}",
"X-Organization-Id": os.environ["JUDGMENT_ORG_ID"],
"X-Project-Id": os.environ["JUDGMENT_PROJECT_ID"],
},
)
)
)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("direct_otel_example"):
pass
provider.force_flush()npm install @opentelemetry/api @opentelemetry/exporter-trace-otlp-http @opentelemetry/resources @opentelemetry/sdk-trace-nodeimport { trace } from "@opentelemetry/api";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { resourceFromAttributes } from "@opentelemetry/resources";
import {
BatchSpanProcessor,
NodeTracerProvider,
} from "@opentelemetry/sdk-trace-node";
const exporter = new OTLPTraceExporter({
url: "https://api.judgmentlabs.ai/otel/v1/traces",
headers: {
Authorization: `Bearer ${process.env.JUDGMENT_API_KEY}`,
"X-Organization-Id": process.env.JUDGMENT_ORG_ID ?? "",
"X-Project-Id": process.env.JUDGMENT_PROJECT_ID ?? "",
},
});
const provider = new NodeTracerProvider({
resource: resourceFromAttributes({
"service.name": "my-service",
}),
spanProcessors: [new BatchSpanProcessor(exporter)],
});
provider.register();
const tracer = trace.getTracer("direct-otel-example");
const span = tracer.startSpan("direct_otel_example");
span.end();
await provider.forceFlush();go get go.opentelemetry.io/otel go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp go.opentelemetry.io/otel/sdkpackage main
import (
"context"
"os"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
func main() {
ctx := context.Background()
exporter, err := otlptracehttp.New(
ctx,
otlptracehttp.WithEndpointURL("https://api.judgmentlabs.ai/otel/v1/traces"),
otlptracehttp.WithHeaders(map[string]string{
"Authorization": "Bearer " + os.Getenv("JUDGMENT_API_KEY"),
"X-Organization-Id": os.Getenv("JUDGMENT_ORG_ID"),
"X-Project-Id": os.Getenv("JUDGMENT_PROJECT_ID"),
}),
)
if err != nil {
panic(err)
}
provider := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(resource.NewWithAttributes(
"",
attribute.String("service.name", "my-service"),
)),
)
defer func() {
if err := provider.Shutdown(ctx); err != nil {
panic(err)
}
}()
otel.SetTracerProvider(provider)
tracer := otel.Tracer("direct-otel-example")
_, span := tracer.Start(ctx, "direct_otel_example")
span.End()
}