|
28 | 28 | import com.google.cloud.opentelemetry.detection.AttributeKeys;
|
29 | 29 | import com.google.cloud.opentelemetry.detection.DetectedPlatform;
|
30 | 30 | import com.google.cloud.opentelemetry.detection.GCPPlatformDetector;
|
| 31 | +import com.google.common.annotations.VisibleForTesting; |
31 | 32 | import com.google.common.cache.Cache;
|
32 | 33 | import com.google.common.cache.CacheBuilder;
|
33 | 34 | import com.google.common.hash.HashFunction;
|
|
44 | 45 | import java.util.HashMap;
|
45 | 46 | import java.util.Map;
|
46 | 47 | import java.util.UUID;
|
47 |
| -import java.util.concurrent.ExecutionException; |
48 | 48 | import java.util.logging.Level;
|
49 | 49 | import java.util.logging.Logger;
|
50 | 50 | import javax.annotation.Nullable;
|
51 | 51 |
|
52 | 52 | final class BuiltInOpenTelemetryMetricsProvider {
|
53 | 53 |
|
54 |
| - static BuiltInOpenTelemetryMetricsProvider INSTANCE = new BuiltInOpenTelemetryMetricsProvider(); |
| 54 | + public static BuiltInOpenTelemetryMetricsProvider INSTANCE = |
| 55 | + new BuiltInOpenTelemetryMetricsProvider(); |
55 | 56 |
|
56 | 57 | private static final Logger logger =
|
57 | 58 | Logger.getLogger(BuiltInOpenTelemetryMetricsProvider.class.getName());
|
58 | 59 |
|
| 60 | + private final Cache<String, Map<String, String>> clientAttributesCache = |
| 61 | + CacheBuilder.newBuilder().maximumSize(1000).build(); |
| 62 | + |
59 | 63 | private static String taskId;
|
60 | 64 |
|
61 | 65 | private OpenTelemetry openTelemetry;
|
62 | 66 |
|
63 |
| - private final Cache<String, Map<String, String>> clientAttributesCache = |
64 |
| - CacheBuilder.newBuilder().maximumSize(1000).build(); |
| 67 | + private Map<String, String> clientAttributes; |
| 68 | + |
| 69 | + private boolean isInitialized; |
65 | 70 |
|
66 |
| - private BuiltInOpenTelemetryMetricsProvider() {} |
| 71 | + private BuiltInOpenTelemetryMetricsRecorder builtInOpenTelemetryMetricsRecorder; |
| 72 | + |
| 73 | + private BuiltInOpenTelemetryMetricsProvider() {}; |
| 74 | + |
| 75 | + void initialize( |
| 76 | + String projectId, |
| 77 | + String client_name, |
| 78 | + @Nullable Credentials credentials, |
| 79 | + @Nullable String monitoringHost) { |
67 | 80 |
|
68 |
| - OpenTelemetry getOrCreateOpenTelemetry( |
69 |
| - String projectId, @Nullable Credentials credentials, @Nullable String monitoringHost) { |
70 | 81 | try {
|
71 |
| - if (this.openTelemetry == null) { |
72 |
| - SdkMeterProviderBuilder sdkMeterProviderBuilder = SdkMeterProvider.builder(); |
73 |
| - BuiltInOpenTelemetryMetricsView.registerBuiltinMetrics( |
74 |
| - SpannerCloudMonitoringExporter.create(projectId, credentials, monitoringHost), |
75 |
| - sdkMeterProviderBuilder); |
76 |
| - SdkMeterProvider sdkMeterProvider = sdkMeterProviderBuilder.build(); |
77 |
| - this.openTelemetry = OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build(); |
78 |
| - Runtime.getRuntime().addShutdownHook(new Thread(sdkMeterProvider::close)); |
| 82 | + if (!isInitialized) { |
| 83 | + this.openTelemetry = createOpenTelemetry(projectId, credentials, monitoringHost); |
| 84 | + this.clientAttributes = createClientAttributes(projectId, client_name); |
| 85 | + this.builtInOpenTelemetryMetricsRecorder = |
| 86 | + new BuiltInOpenTelemetryMetricsRecorder(openTelemetry, clientAttributes); |
| 87 | + isInitialized = true; |
79 | 88 | }
|
80 |
| - return this.openTelemetry; |
81 |
| - } catch (IOException ex) { |
| 89 | + } catch (Exception ex) { |
82 | 90 | logger.log(
|
83 | 91 | Level.WARNING,
|
84 |
| - "Unable to get OpenTelemetry object for client side metrics, will skip exporting client side metrics", |
| 92 | + "Unable to initialize OpenTelemetry object or attributes for client side metrics, will skip exporting client side metrics", |
85 | 93 | ex);
|
86 |
| - return null; |
87 | 94 | }
|
88 | 95 | }
|
89 | 96 |
|
90 |
| - Map<String, String> createOrGetClientAttributes(String projectId, String client_name) { |
91 |
| - try { |
92 |
| - String key = projectId + client_name; |
93 |
| - return clientAttributesCache.get( |
94 |
| - key, |
95 |
| - () -> { |
96 |
| - Map<String, String> clientAttributes = new HashMap<>(); |
97 |
| - clientAttributes.put(LOCATION_ID_KEY.getKey(), detectClientLocation()); |
98 |
| - clientAttributes.put(PROJECT_ID_KEY.getKey(), projectId); |
99 |
| - clientAttributes.put(INSTANCE_CONFIG_ID_KEY.getKey(), "unknown"); |
100 |
| - clientAttributes.put(CLIENT_NAME_KEY.getKey(), client_name); |
101 |
| - String clientUid = getDefaultTaskValue(); |
102 |
| - clientAttributes.put(CLIENT_UID_KEY.getKey(), clientUid); |
103 |
| - clientAttributes.put(CLIENT_HASH_KEY.getKey(), generateClientHash(clientUid)); |
104 |
| - return clientAttributes; |
105 |
| - }); |
106 |
| - } catch (ExecutionException executionException) { |
107 |
| - logger.log( |
108 |
| - Level.WARNING, |
109 |
| - "Unable to get Client Attributes for client side metrics, will skip exporting client side metrics", |
110 |
| - executionException); |
111 |
| - return null; |
112 |
| - } |
| 97 | + OpenTelemetry getOpenTelemetry() { |
| 98 | + return this.openTelemetry; |
| 99 | + } |
| 100 | + |
| 101 | + Map<String, String> getClientAttributes() { |
| 102 | + return this.clientAttributes; |
| 103 | + } |
| 104 | + |
| 105 | + BuiltInOpenTelemetryMetricsRecorder getBuiltInOpenTelemetryMetricsRecorder() { |
| 106 | + return this.builtInOpenTelemetryMetricsRecorder; |
| 107 | + } |
| 108 | + |
| 109 | + @VisibleForTesting |
| 110 | + void reset() { |
| 111 | + isInitialized = false; |
| 112 | + } |
| 113 | + |
| 114 | + private Map<String, String> createClientAttributes(String projectId, String client_name) { |
| 115 | + Map<String, String> clientAttributes = new HashMap<>(); |
| 116 | + clientAttributes.put(LOCATION_ID_KEY.getKey(), detectClientLocation()); |
| 117 | + clientAttributes.put(PROJECT_ID_KEY.getKey(), projectId); |
| 118 | + clientAttributes.put(INSTANCE_CONFIG_ID_KEY.getKey(), "unknown"); |
| 119 | + clientAttributes.put(CLIENT_NAME_KEY.getKey(), client_name); |
| 120 | + String clientUid = getDefaultTaskValue(); |
| 121 | + clientAttributes.put(CLIENT_UID_KEY.getKey(), clientUid); |
| 122 | + clientAttributes.put(CLIENT_HASH_KEY.getKey(), generateClientHash(clientUid)); |
| 123 | + return clientAttributes; |
| 124 | + } |
| 125 | + |
| 126 | + private OpenTelemetry createOpenTelemetry( |
| 127 | + String projectId, @Nullable Credentials credentials, @Nullable String monitoringHost) |
| 128 | + throws IOException { |
| 129 | + OpenTelemetry openTelemetry; |
| 130 | + SdkMeterProviderBuilder sdkMeterProviderBuilder = SdkMeterProvider.builder(); |
| 131 | + BuiltInOpenTelemetryMetricsView.registerBuiltinMetrics( |
| 132 | + SpannerCloudMonitoringExporter.create(projectId, credentials, monitoringHost), |
| 133 | + sdkMeterProviderBuilder); |
| 134 | + SdkMeterProvider sdkMeterProvider = sdkMeterProviderBuilder.build(); |
| 135 | + openTelemetry = OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build(); |
| 136 | + Runtime.getRuntime().addShutdownHook(new Thread(sdkMeterProvider::close)); |
| 137 | + return openTelemetry; |
113 | 138 | }
|
114 | 139 |
|
115 | 140 | /**
|
|
0 commit comments