Skip to content

Commit 29240b1

Browse files
committed
fix: do a quick check if the application runs on GCP
The check whether the application runs on GCP did not use a timeout. This introduces a default 500ms timeout for that check. Fixes googleapis/java-spanner-jdbc#2250
1 parent 3a8f148 commit 29240b1

File tree

1 file changed

+42
-3
lines changed

1 file changed

+42
-3
lines changed

google-cloud-spanner/src/main/java/com/google/cloud/spanner/BuiltInMetricsProvider.java

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.google.cloud.opentelemetry.detection.AttributeKeys;
3333
import com.google.cloud.opentelemetry.detection.DetectedPlatform;
3434
import com.google.cloud.opentelemetry.detection.GCPPlatformDetector;
35+
import com.google.common.base.Strings;
3536
import com.google.common.hash.HashFunction;
3637
import com.google.common.hash.Hashing;
3738
import io.grpc.ManagedChannelBuilder;
@@ -43,11 +44,17 @@
4344
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
4445
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
4546
import io.opentelemetry.sdk.resources.Resource;
47+
import java.io.BufferedReader;
4648
import java.io.IOException;
49+
import java.io.InputStream;
50+
import java.io.InputStreamReader;
4751
import java.lang.management.ManagementFactory;
4852
import java.lang.reflect.Method;
53+
import java.net.HttpURLConnection;
4954
import java.net.InetAddress;
55+
import java.net.URL;
5056
import java.net.UnknownHostException;
57+
import java.nio.charset.StandardCharsets;
5158
import java.util.HashMap;
5259
import java.util.Map;
5360
import 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

Comments
 (0)