3232import com .google .cloud .opentelemetry .detection .AttributeKeys ;
3333import com .google .cloud .opentelemetry .detection .DetectedPlatform ;
3434import com .google .cloud .opentelemetry .detection .GCPPlatformDetector ;
35+ import com .google .common .base .Strings ;
3536import com .google .common .hash .HashFunction ;
3637import com .google .common .hash .Hashing ;
3738import io .grpc .ManagedChannelBuilder ;
4344import io .opentelemetry .sdk .metrics .SdkMeterProvider ;
4445import io .opentelemetry .sdk .metrics .SdkMeterProviderBuilder ;
4546import io .opentelemetry .sdk .resources .Resource ;
47+ import java .io .BufferedReader ;
4648import java .io .IOException ;
49+ import java .io .InputStream ;
50+ import java .io .InputStreamReader ;
4751import java .lang .management .ManagementFactory ;
4852import java .lang .reflect .Method ;
53+ import java .net .HttpURLConnection ;
4954import java .net .InetAddress ;
55+ import java .net .URL ;
5056import java .net .UnknownHostException ;
57+ import java .nio .charset .StandardCharsets ;
5158import java .util .HashMap ;
5259import java .util .Map ;
5360import java .util .UUID ;
@@ -79,7 +86,9 @@ OpenTelemetry getOrCreateOpenTelemetry(
7986 SpannerCloudMonitoringExporter .create (
8087 projectId , credentials , monitoringHost , universeDomain ),
8188 sdkMeterProviderBuilder );
82- sdkMeterProviderBuilder .setResource (Resource .create (createResourceAttributes (projectId )));
89+ String location = quickCheckIsRunningOnGcp () ? null : "global" ;
90+ sdkMeterProviderBuilder .setResource (
91+ Resource .create (createResourceAttributes (projectId , location )));
8392 SdkMeterProvider sdkMeterProvider = sdkMeterProviderBuilder .build ();
8493 this .openTelemetry = OpenTelemetrySdk .builder ().setMeterProvider (sdkMeterProvider ).build ();
8594 Runtime .getRuntime ().addShutdownHook (new Thread (sdkMeterProvider ::close ));
@@ -95,6 +104,36 @@ OpenTelemetry getOrCreateOpenTelemetry(
95104 }
96105 }
97106
107+ // TODO: Remove when
108+ // https://github.com/GoogleCloudPlatform/opentelemetry-operations-java/issues/421
109+ // has been fixed.
110+ static boolean quickCheckIsRunningOnGcp () {
111+ int timeout = 500 ;
112+ try {
113+ timeout =
114+ Integer .parseInt (System .getProperty ("spanner.check_is_running_on_gcp_timeout" , "500" ));
115+ } catch (NumberFormatException ignore ) {
116+ // ignore
117+ }
118+ try {
119+ URL url = new URL ("http://metadata.google.internal/computeMetadata/v1/project/project-id" );
120+ HttpURLConnection connection = (HttpURLConnection ) url .openConnection ();
121+ connection .setConnectTimeout (timeout );
122+ connection .setRequestProperty ("Metadata-Flavor" , "Google" );
123+ if (connection .getResponseCode () == 200
124+ && ("Google" ).equals (connection .getHeaderField ("Metadata-Flavor" ))) {
125+ InputStream input = connection .getInputStream ();
126+ try (BufferedReader reader =
127+ new BufferedReader (new InputStreamReader (input , StandardCharsets .UTF_8 ))) {
128+ return !Strings .isNullOrEmpty (reader .readLine ());
129+ }
130+ }
131+ } catch (IOException ignore ) {
132+ // ignore
133+ }
134+ return false ;
135+ }
136+
98137 void enableGrpcMetrics (
99138 InstantiatingGrpcChannelProvider .Builder channelProviderBuilder ,
100139 String projectId ,
@@ -122,14 +161,14 @@ void enableGrpcMetrics(
122161 });
123162 }
124163
125- Attributes createResourceAttributes (String projectId ) {
164+ Attributes createResourceAttributes (String projectId , String location ) {
126165 AttributesBuilder attributesBuilder =
127166 Attributes .builder ()
128167 .put (PROJECT_ID_KEY .getKey (), projectId )
129168 .put (INSTANCE_CONFIG_ID_KEY .getKey (), "unknown" )
130169 .put (CLIENT_HASH_KEY .getKey (), generateClientHash (getDefaultTaskValue ()))
131170 .put (INSTANCE_ID_KEY .getKey (), "unknown" )
132- .put (LOCATION_ID_KEY .getKey (), detectClientLocation ());
171+ .put (LOCATION_ID_KEY .getKey (), location == null ? detectClientLocation () : location );
133172
134173 return attributesBuilder .build ();
135174 }
0 commit comments