Skip to content

Commit 0010f8d

Browse files
committed
Save changes.
1 parent 2c8d0de commit 0010f8d

File tree

7 files changed

+121
-25
lines changed

7 files changed

+121
-25
lines changed

examples/example-opentelemetry/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ dependencies {
3333
implementation "io.opentelemetry:opentelemetry-sdk:${openTelemetryVersion}"
3434
implementation "io.opentelemetry:opentelemetry-sdk-metrics:${openTelemetryVersion}"
3535
implementation "io.opentelemetry:opentelemetry-exporter-logging:${openTelemetryVersion}"
36+
implementation "io.opentelemetry:opentelemetry-exporter-otlp:${openTelemetryVersion}"
37+
implementation "io.opentelemetry.semconv:opentelemetry-semconv:1.29.0-alpha"
3638
implementation "io.opentelemetry:opentelemetry-exporter-prometheus:${openTelemetryPrometheusVersion}"
3739
runtimeOnly "io.grpc:grpc-netty-shaded:${grpcVersion}"
3840
}

examples/example-opentelemetry/src/main/java/io/grpc/example/opentelemetry/OpenTelemetryClient.java

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,24 @@
2626
import io.grpc.examples.helloworld.HelloReply;
2727
import io.grpc.examples.helloworld.HelloRequest;
2828
import io.grpc.opentelemetry.GrpcOpenTelemetry;
29+
import io.grpc.opentelemetry.GrpcTraceBinContextPropagator;
30+
import io.opentelemetry.context.propagation.ContextPropagators;
31+
import io.opentelemetry.context.propagation.TextMapPropagator;
2932
import io.opentelemetry.exporter.prometheus.PrometheusHttpServer;
3033
import io.opentelemetry.sdk.OpenTelemetrySdk;
34+
import io.opentelemetry.api.common.Attributes;
3135
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
3236
import java.util.concurrent.TimeUnit;
3337
import java.util.concurrent.atomic.AtomicBoolean;
3438
import java.util.logging.Level;
3539
import java.util.logging.Logger;
40+
import io.opentelemetry.sdk.resources.Resource;
41+
import io.opentelemetry.sdk.trace.SdkTracerProvider;
42+
import io.opentelemetry.sdk.trace.SpanProcessor;
43+
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
44+
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
45+
import io.opentelemetry.semconv.ResourceAttributes;
46+
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
3647

3748
/**
3849
* A simple gRPC client that requests a greeting from the {@link HelloWorldServer} and
@@ -93,6 +104,35 @@ public static void main(String[] args) throws Exception {
93104

94105
Thread mainThread = Thread.currentThread();
95106

107+
108+
// Adds a PrometheusHttpServer to convert OpenTelemetry metrics to Prometheus format and
109+
// expose these via a HttpServer exporter to the SdkMeterProvider.
110+
SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder()
111+
.registerMetricReader(
112+
PrometheusHttpServer.builder().setPort(prometheusPort).build())
113+
.build();
114+
Resource resource = Resource.create(
115+
Attributes.of(ResourceAttributes.SERVICE_NAME, "client-service")
116+
);
117+
118+
// Configure the OTLP Span Exporter with the custom Collector endpoint
119+
OtlpGrpcSpanExporter spanExporter = OtlpGrpcSpanExporter.builder()
120+
.setEndpoint("http://localhost:7080") // Default OTLP gRPC port
121+
.build();
122+
SpanProcessor spanProcessor = SimpleSpanProcessor.create(spanExporter);
123+
124+
// Create the SdkTracerProvider
125+
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
126+
.addSpanProcessor(spanProcessor)
127+
.setResource(resource)
128+
.build();
129+
// Initialize OpenTelemetry SDK with MeterProvider configured with Prometeheus.
130+
OpenTelemetrySdk openTelemetrySdk =
131+
OpenTelemetrySdk.builder().setTracerProvider(sdkTracerProvider).setMeterProvider(sdkMeterProvider)
132+
.setPropagators(ContextPropagators.create(TextMapPropagator.composite(
133+
GrpcTraceBinContextPropagator.defaultInstance()
134+
)))
135+
.build();
96136
Runtime.getRuntime().addShutdownHook(new Thread() {
97137
@Override
98138
public void run() {
@@ -105,21 +145,12 @@ public void run() {
105145
} catch (InterruptedException e) {
106146
e.printStackTrace(System.err);
107147
}
148+
System.err.println("Closing the otel sdk");
149+
openTelemetrySdk.close();
108150
System.err.println("*** client shut down");
109151
}
110152
});
111153

112-
// Adds a PrometheusHttpServer to convert OpenTelemetry metrics to Prometheus format and
113-
// expose these via a HttpServer exporter to the SdkMeterProvider.
114-
SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder()
115-
.registerMetricReader(
116-
PrometheusHttpServer.builder().setPort(prometheusPort).build())
117-
.build();
118-
119-
// Initialize OpenTelemetry SDK with MeterProvider configured with Prometeheus.
120-
OpenTelemetrySdk openTelemetrySdk =
121-
OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build();
122-
123154
// Initialize gRPC OpenTelemetry.
124155
// Following client metrics are enabled by default :
125156
// 1. grpc.client.attempt.started
@@ -148,6 +179,7 @@ public void run() {
148179
} finally {
149180
channel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
150181
// Shut down OpenTelemetry SDK.
182+
logger.log(Level.INFO, "Closing the otel sdk");
151183
openTelemetrySdk.close();
152184
}
153185
}

examples/example-opentelemetry/src/main/java/io/grpc/example/opentelemetry/OpenTelemetryServer.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,22 @@
2323
import io.grpc.examples.helloworld.HelloReply;
2424
import io.grpc.examples.helloworld.HelloRequest;
2525
import io.grpc.opentelemetry.GrpcOpenTelemetry;
26+
import io.grpc.opentelemetry.GrpcTraceBinContextPropagator;
2627
import io.grpc.stub.StreamObserver;
28+
import io.opentelemetry.api.common.Attributes;
29+
import io.opentelemetry.context.propagation.ContextPropagators;
30+
import io.opentelemetry.context.propagation.TextMapPropagator;
2731
import io.opentelemetry.exporter.prometheus.PrometheusHttpServer;
2832
import io.opentelemetry.sdk.OpenTelemetrySdk;
2933
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
34+
import io.opentelemetry.sdk.resources.Resource;
35+
import io.opentelemetry.sdk.trace.SdkTracerProvider;
36+
import io.opentelemetry.sdk.trace.SpanProcessor;
37+
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
38+
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
39+
import io.opentelemetry.semconv.ResourceAttributes;
40+
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
41+
3042
import java.io.IOException;
3143
import java.util.concurrent.TimeUnit;
3244
import java.util.logging.Logger;
@@ -94,8 +106,28 @@ public static void main(String[] args) {
94106
.build();
95107

96108
// Initialize OpenTelemetry SDK with MeterProvider configured with Prometheus metrics exporter
109+
// Define resource attributes (e.g., service name)
110+
Resource resource = Resource.create(
111+
Attributes.of(ResourceAttributes.SERVICE_NAME, "server-service")
112+
);
113+
114+
// Configure the OTLP Span Exporter with the custom Collector endpoint
115+
OtlpGrpcSpanExporter spanExporter = OtlpGrpcSpanExporter.builder()
116+
.setEndpoint("http://localhost:7080") // Default OTLP gRPC port
117+
.build();
118+
119+
SpanProcessor spanProcessor = SimpleSpanProcessor.create(spanExporter);
120+
121+
// Create the SdkTracerProvider
122+
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
123+
.addSpanProcessor(spanProcessor)
124+
.setResource(resource)
125+
.build();
97126
OpenTelemetrySdk openTelemetrySdk =
98-
OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build();
127+
OpenTelemetrySdk.builder().setTracerProvider(sdkTracerProvider)
128+
.setPropagators(ContextPropagators.create(TextMapPropagator.composite(
129+
GrpcTraceBinContextPropagator.defaultInstance()
130+
))).setMeterProvider(sdkMeterProvider).build();
99131

100132
// Initialize gRPC OpenTelemetry.
101133
// Following client metrics are enabled by default :

examples/src/main/java/io/grpc/examples/helloworld/HelloWorldClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public void greet(String name) {
6363
public static void main(String[] args) throws Exception {
6464
String user = "world";
6565
// Access a service running on the local machine on port 50051
66-
String target = "localhost:50051";
66+
String target = "localhost:7080";
6767
// Allow passing in the user and target strings as command line arguments
6868
if (args.length > 0) {
6969
if ("--help".equals(args[0])) {

examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class HelloWorldServer {
3535
private Server server;
3636
private void start() throws IOException {
3737
/* The port on which the server should run */
38-
int port = 50051;
38+
int port = 7080;
3939
/*
4040
* By default gRPC uses a global, shared Executor.newCachedThreadPool() for gRPC callbacks into
4141
* your application. This is convenient, but can cause an excessive number of threads to be

interop-testing/src/main/java/io/opentelemetry/proto/collector/trace/v1/TraceServiceImpl.java

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package io.opentelemetry.proto.collector.trace.v1;
22

3+
import com.google.protobuf.ByteString;
34
import io.grpc.ServerServiceDefinition;
45
import io.opentelemetry.proto.collector.trace.v1.TraceServiceGrpc.AsyncService;
6+
import io.opentelemetry.proto.common.v1.KeyValue;
57
import io.opentelemetry.proto.trace.v1.ResourceSpans;
8+
import io.opentelemetry.proto.trace.v1.ScopeSpans;
9+
import io.opentelemetry.proto.trace.v1.Span;
610

711
import java.util.List;
812
import java.util.logging.Logger;
@@ -14,19 +18,44 @@ public ServerServiceDefinition bindService() {
1418
return TraceServiceGrpc.bindService(this);
1519
}
1620

21+
private String bytesToHex(ByteString bytes) {
22+
// OpenTelemetry trace IDs are 16 bytes (32 hex characters)
23+
final byte[] byteArray = bytes.toByteArray();
24+
final char[] hexChars = new char[byteArray.length * 2];
25+
for (int j = 0; j < byteArray.length; j++) {
26+
int v = byteArray[j] & 0xFF;
27+
// Convert to lowercase hex as per W3C Trace Context spec
28+
hexChars[j * 2] = Character.forDigit((v >>> 4) & 0x0F, 16);
29+
hexChars[j * 2 + 1] = Character.forDigit(v & 0x0F, 16);
30+
}
31+
return new String(hexChars);
32+
}
33+
1734
@Override
1835
public void export(io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest request,
1936
io.grpc.stub.StreamObserver<io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse> responseObserver) {
2037
List<ResourceSpans> resourceSpansList = request.getResourceSpansList();
21-
logger.info("Received ExportTraceServiceRequest with " + resourceSpansList.size() + " ResourceSpans");
22-
23-
for (ResourceSpans resourceSpans : resourceSpansList) {
24-
// Process the spans here (e.g., log them, store them, forward them)
25-
int spanCount = resourceSpans.getScopeSpansList().stream()
26-
.mapToInt(ss -> ss.getSpansList().size())
27-
.sum();
28-
logger.info(String.format("Resource has %d spans. Resource attributes: %s",
29-
spanCount, resourceSpans.getResource().getAttributesList()));
38+
39+
// Iterate over all resource spans in the request
40+
for (ResourceSpans resourceSpans : request.getResourceSpansList()) {
41+
List<KeyValue> resourceAttrs = resourceSpans.getResource().getAttributesList();
42+
for (KeyValue resourceAttr: resourceAttrs) {
43+
logger.info("Resource attr key: " + resourceAttr.getKey() + ", value: " + resourceAttr.getValue());
44+
}
45+
// Iterate over all instrumentation scope spans
46+
for (ScopeSpans scopeSpans : resourceSpans.getScopeSpansList()) {
47+
// Iterate over individual spans
48+
for (Span span : scopeSpans.getSpansList()) {
49+
// Get the trace ID as a ByteString
50+
ByteString traceIdBytes = span.getTraceId();
51+
52+
// Convert the byte array to a hex string
53+
String traceIdHex = bytesToHex(traceIdBytes);
54+
55+
logger.info("Extracted Trace ID: " + traceIdHex);
56+
logger.info("Span ID: " + bytesToHex(span.getSpanId()));
57+
}
58+
}
3059
}
3160

3261
// Create and send the response

interop-testing/src/main/java/io/opentelemetry/proto/collector/trace/v1/TraceServiceServer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.grpc.Server;
77
import io.grpc.ServerBuilder;
88

9+
import java.io.IOException;
910
import java.util.concurrent.Executors;
1011
import java.util.concurrent.ScheduledExecutorService;
1112
import java.util.concurrent.TimeUnit;
@@ -39,10 +40,10 @@ public void run() {
3940
server.blockUntilShutdown();
4041
}
4142

42-
private void start() {
43+
private void start() throws IOException {
4344
executor = Executors.newSingleThreadScheduledExecutor();
4445
server = Grpc.newServerBuilderForPort(port, InsecureServerCredentials.create())
45-
.addService(new TraceServiceImpl()).build();
46+
.addService(new TraceServiceImpl()).build().start();
4647
}
4748

4849
void stop() throws Exception {

0 commit comments

Comments
 (0)