81
81
import io .grpc .MethodDescriptor ;
82
82
import io .grpc .Status ;
83
83
import io .grpc .protobuf .ProtoUtils ;
84
+ import io .opentelemetry .api .OpenTelemetry ;
84
85
import java .io .Closeable ;
85
86
import java .io .IOException ;
86
87
import java .io .InputStream ;
88
+ import java .io .ObjectInputStream ;
87
89
import java .io .Serializable ;
88
90
import java .net .URI ;
89
91
import java .nio .ByteBuffer ;
@@ -119,6 +121,7 @@ public final class GrpcStorageOptions extends StorageOptions
119
121
private final boolean grpcClientMetricsManuallyEnabled ;
120
122
private final GrpcInterceptorProvider grpcInterceptorProvider ;
121
123
private final BlobWriteSessionConfig blobWriteSessionConfig ;
124
+ private transient OpenTelemetry openTelemetry ;
122
125
123
126
private GrpcStorageOptions (Builder builder , GrpcStorageDefaults serviceDefaults ) {
124
127
super (builder , serviceDefaults );
@@ -135,6 +138,7 @@ private GrpcStorageOptions(Builder builder, GrpcStorageDefaults serviceDefaults)
135
138
this .grpcClientMetricsManuallyEnabled = builder .grpcMetricsManuallyEnabled ;
136
139
this .grpcInterceptorProvider = builder .grpcInterceptorProvider ;
137
140
this .blobWriteSessionConfig = builder .blobWriteSessionConfig ;
141
+ this .openTelemetry = builder .openTelemetry ;
138
142
}
139
143
140
144
@ Override
@@ -157,6 +161,11 @@ StorageSettings getStorageSettings() throws IOException {
157
161
return resolveSettingsAndOpts ().x ();
158
162
}
159
163
164
+ private void readObject (ObjectInputStream in ) throws IOException , ClassNotFoundException {
165
+ in .defaultReadObject ();
166
+ this .openTelemetry = HttpStorageOptions .getDefaultInstance ().getOpenTelemetry ();
167
+ }
168
+
160
169
/**
161
170
* We have to perform several introspections and detections to cross-wire/support several features
162
171
* that are either gapic primitives, ServiceOption primitives or GCS semantic requirements.
@@ -349,6 +358,13 @@ private Tuple<StorageSettings, Opts<UserProject>> resolveSettingsAndOpts() throw
349
358
return Tuple .of (builder .build (), defaultOpts );
350
359
}
351
360
361
+ /** @since 2.47.0 This new api is in preview and is subject to breaking changes. */
362
+ @ BetaApi
363
+ @ Override
364
+ public OpenTelemetry getOpenTelemetry () {
365
+ return openTelemetry ;
366
+ }
367
+
352
368
/** @since 2.14.0 */
353
369
@ Override
354
370
public GrpcStorageOptions .Builder toBuilder () {
@@ -364,6 +380,7 @@ public int hashCode() {
364
380
enableGrpcClientMetrics ,
365
381
grpcInterceptorProvider ,
366
382
blobWriteSessionConfig ,
383
+ openTelemetry ,
367
384
baseHashCode ());
368
385
}
369
386
@@ -382,6 +399,7 @@ public boolean equals(Object o) {
382
399
&& Objects .equals (terminationAwaitDuration , that .terminationAwaitDuration )
383
400
&& Objects .equals (grpcInterceptorProvider , that .grpcInterceptorProvider )
384
401
&& Objects .equals (blobWriteSessionConfig , that .blobWriteSessionConfig )
402
+ && Objects .equals (openTelemetry , that .openTelemetry )
385
403
&& this .baseEquals (that );
386
404
}
387
405
@@ -423,6 +441,7 @@ public static final class Builder extends StorageOptions.Builder {
423
441
GrpcStorageDefaults .INSTANCE .grpcInterceptorProvider ();
424
442
private BlobWriteSessionConfig blobWriteSessionConfig =
425
443
GrpcStorageDefaults .INSTANCE .getDefaultStorageWriterConfig ();
444
+ private OpenTelemetry openTelemetry = GrpcStorageDefaults .INSTANCE .getDefaultOpenTelemetry ();
426
445
427
446
private boolean grpcMetricsManuallyEnabled = false ;
428
447
@@ -437,6 +456,7 @@ public static final class Builder extends StorageOptions.Builder {
437
456
this .enableGrpcClientMetrics = gso .enableGrpcClientMetrics ;
438
457
this .grpcInterceptorProvider = gso .grpcInterceptorProvider ;
439
458
this .blobWriteSessionConfig = gso .blobWriteSessionConfig ;
459
+ this .openTelemetry = gso .openTelemetry ;
440
460
}
441
461
442
462
/**
@@ -619,6 +639,19 @@ public GrpcStorageOptions.Builder setBlobWriteSessionConfig(
619
639
return this ;
620
640
}
621
641
642
+ /**
643
+ * Enable OpenTelemetry Tracing and provide an instance for the client to use.
644
+ *
645
+ * @param openTelemetry User defined instance of OpenTelemetry to be used by the library
646
+ * @since 2.47.0 This new api is in preview and is subject to breaking changes.
647
+ */
648
+ @ BetaApi
649
+ public GrpcStorageOptions .Builder setOpenTelemetry (OpenTelemetry openTelemetry ) {
650
+ requireNonNull (openTelemetry , "openTelemetry must be non null" );
651
+ this .openTelemetry = openTelemetry ;
652
+ return this ;
653
+ }
654
+
622
655
/** @since 2.14.0 */
623
656
@ Override
624
657
public GrpcStorageOptions build () {
@@ -695,6 +728,12 @@ public GrpcInterceptorProvider grpcInterceptorProvider() {
695
728
public BlobWriteSessionConfig getDefaultStorageWriterConfig () {
696
729
return BlobWriteSessionConfigs .getDefault ();
697
730
}
731
+
732
+ /** @since 2.47.0 This new api is in preview and is subject to breaking changes. */
733
+ @ BetaApi
734
+ public OpenTelemetry getDefaultOpenTelemetry () {
735
+ return OpenTelemetry .noop ();
736
+ }
698
737
}
699
738
700
739
/**
@@ -751,22 +790,27 @@ public Storage create(StorageOptions options) {
751
790
new InternalZeroCopyGrpcStorageStub (
752
791
stubSettings , clientContext , grpcStorageCallableFactory );
753
792
StorageClient client = new InternalStorageClient (stub );
754
- return new GrpcStorageImpl (
755
- grpcStorageOptions ,
756
- client ,
757
- stub .getObjectMediaResponseMarshaller ,
758
- grpcStorageOptions .blobWriteSessionConfig .createFactory (Clock .systemUTC ()),
759
- defaultOpts );
793
+ GrpcStorageImpl grpcStorage =
794
+ new GrpcStorageImpl (
795
+ grpcStorageOptions ,
796
+ client ,
797
+ stub .getObjectMediaResponseMarshaller ,
798
+ grpcStorageOptions .blobWriteSessionConfig .createFactory (Clock .systemUTC ()),
799
+ defaultOpts );
800
+ return OtelStorageDecorator .decorate (
801
+ grpcStorage , options .getOpenTelemetry (), Transport .GRPC );
760
802
} else {
761
803
StorageClient client = StorageClient .create (storageSettings );
762
- return new GrpcStorageImpl (
763
- grpcStorageOptions ,
764
- client ,
765
- ResponseContentLifecycleManager .noop (),
766
- grpcStorageOptions .blobWriteSessionConfig .createFactory (Clock .systemUTC ()),
767
- defaultOpts );
804
+ GrpcStorageImpl grpcStorage =
805
+ new GrpcStorageImpl (
806
+ grpcStorageOptions ,
807
+ client ,
808
+ ResponseContentLifecycleManager .noop (),
809
+ grpcStorageOptions .blobWriteSessionConfig .createFactory (Clock .systemUTC ()),
810
+ defaultOpts );
811
+ return OtelStorageDecorator .decorate (
812
+ grpcStorage , options .getOpenTelemetry (), Transport .GRPC );
768
813
}
769
-
770
814
} catch (IOException e ) {
771
815
throw new IllegalStateException (
772
816
"Unable to instantiate gRPC com.google.cloud.storage.Storage client." , e );
0 commit comments