|
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