Skip to content

Commit 1c44d72

Browse files
committed
added exemplar support in exporter
1 parent f90cdc2 commit 1c44d72

File tree

2 files changed

+13
-76
lines changed

2 files changed

+13
-76
lines changed

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

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -77,31 +77,10 @@ OpenTelemetry getOrCreateOpenTelemetry(
7777
try {
7878
if (this.openTelemetry == null) {
7979
SdkMeterProviderBuilder sdkMeterProviderBuilder = SdkMeterProvider.builder();
80-
// BuiltInMetricsView.registerBuiltinMetrics(
81-
// SpannerCloudMonitoringExporter.create(projectId, credentials, monitoringHost),
82-
// sdkMeterProviderBuilder);
83-
84-
// Use GoogleCloudMetricExporter with service time series as the current custom exporter
85-
// does not export exemplars
86-
// GoogleCloudMetricExporter expect to pass the resource labels at the time of creating
87-
// exporter. Hence we need to hardcode instance_id here.
88-
MonitoredResourceDescription monitoredResourceDescription =
89-
new MonitoredResourceDescription(
90-
SPANNER_RESOURCE_TYPE,
91-
ImmutableSet.of(
92-
"project_id", "instance_id", "location", "instance_config", "client_hash"));
93-
94-
MetricExporter metricExporter =
95-
GoogleCloudMetricExporter.createWithConfiguration(
96-
MetricConfiguration.builder()
97-
.setProjectId(projectId)
98-
.setMonitoredResourceDescription(monitoredResourceDescription)
99-
.setInstrumentationLibraryLabelsEnabled(false)
100-
.setMetricServiceEndpoint("monitoring.googleapis.com:443")
101-
.setPrefix("spanner.googleapis.com/internal/client")
102-
.setUseServiceTimeSeries(true)
103-
.build());
104-
BuiltInMetricsView.registerBuiltinMetrics(metricExporter, sdkMeterProviderBuilder);
80+
BuiltInMetricsView.registerBuiltinMetrics(
81+
SpannerCloudMonitoringExporter.create(projectId, credentials, monitoringHost),
82+
sdkMeterProviderBuilder);
83+
10584
sdkMeterProviderBuilder.setResource(Resource.create(createResourceAttributes(projectId)));
10685
SdkMeterProvider sdkMeterProvider = sdkMeterProviderBuilder.build();
10786

@@ -150,8 +129,7 @@ Attributes createResourceAttributes(String projectId) {
150129
.put(INSTANCE_CONFIG_ID_KEY.getKey(), "unknown")
151130
.put(CLIENT_HASH_KEY.getKey(), generateClientHash(getDefaultTaskValue()))
152131
.put(INSTANCE_ID_KEY.getKey(), "unknown")
153-
.put(LOCATION_ID_KEY.getKey(), detectClientLocation())
154-
.put("gcp.resource_type", SPANNER_RESOURCE_TYPE);
132+
.put(LOCATION_ID_KEY.getKey(), detectClientLocation());
155133

156134
return attributesBuilder.build();
157135
}

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

Lines changed: 8 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
import static com.google.api.MetricDescriptor.ValueType.DISTRIBUTION;
2323
import static com.google.api.MetricDescriptor.ValueType.DOUBLE;
2424
import static com.google.api.MetricDescriptor.ValueType.INT64;
25+
26+
import com.google.monitoring.v3.DroppedLabels;
27+
import com.google.monitoring.v3.SpanContext;
28+
import com.google.protobuf.Any;
29+
import com.google.protobuf.Timestamp;
2530
import static com.google.cloud.spanner.BuiltInMetricsConstant.GAX_METER_NAME;
2631
import static com.google.cloud.spanner.BuiltInMetricsConstant.GRPC_METER_NAME;
2732
import static com.google.cloud.spanner.BuiltInMetricsConstant.PROJECT_ID_KEY;
@@ -103,8 +108,7 @@ static List<TimeSeries> convertToSpannerTimeSeries(
103108
metricData.getData().getPoints().stream()
104109
.map(
105110
pointData ->
106-
convertPointToSpannerTimeSeries(
107-
metricData, pointData, monitoredResourceBuilder, projectId))
111+
convertPointToSpannerTimeSeries(metricData, pointData, monitoredResourceBuilder))
108112
.forEach(allTimeSeries::add);
109113
}
110114
return allTimeSeries;
@@ -113,8 +117,7 @@ static List<TimeSeries> convertToSpannerTimeSeries(
113117
private static TimeSeries convertPointToSpannerTimeSeries(
114118
MetricData metricData,
115119
PointData pointData,
116-
MonitoredResource.Builder monitoredResourceBuilder,
117-
String projectId) {
120+
MonitoredResource.Builder monitoredResourceBuilder) {
118121
TimeSeries.Builder builder =
119122
TimeSeries.newBuilder()
120123
.setMetricKind(convertMetricKind(metricData))
@@ -210,8 +213,7 @@ private static Point createPoint(
210213
return builder
211214
.setValue(
212215
TypedValue.newBuilder()
213-
.setDistributionValue(
214-
convertHistogramData((HistogramPointData) pointData, projectId))
216+
.setDistributionValue(convertHistogramData((HistogramPointData) pointData))
215217
.build())
216218
.build();
217219
case DOUBLE_GAUGE:
@@ -241,49 +243,6 @@ private static Distribution convertHistogramData(HistogramPointData pointData, S
241243
BucketOptions.newBuilder()
242244
.setExplicitBuckets(Explicit.newBuilder().addAllBounds(pointData.getBoundaries())))
243245
.addAllBucketCounts(pointData.getCounts())
244-
.addAllExemplars(
245-
pointData.getExemplars().stream()
246-
.map(e -> mapExemplar(e, projectId))
247-
.collect(Collectors.toList()))
248-
.build();
249-
}
250-
251-
private static Distribution.Exemplar mapExemplar(ExemplarData exemplar, String projectId) {
252-
double value = 0;
253-
if (exemplar instanceof DoubleExemplarData) {
254-
value = ((DoubleExemplarData) exemplar).getValue();
255-
} else if (exemplar instanceof LongExemplarData) {
256-
value = ((LongExemplarData) exemplar).getValue();
257-
}
258-
259-
Distribution.Exemplar.Builder exemplarBuilder =
260-
Distribution.Exemplar.newBuilder()
261-
.setValue(value)
262-
.setTimestamp(mapTimestamp(exemplar.getEpochNanos()));
263-
if (exemplar.getSpanContext().isValid()) {
264-
exemplarBuilder.addAttachments(
265-
Any.pack(
266-
SpanContext.newBuilder()
267-
.setSpanName(
268-
makeSpanName(
269-
projectId,
270-
exemplar.getSpanContext().getTraceId(),
271-
exemplar.getSpanContext().getSpanId()))
272-
.build()));
273-
}
274-
if (!exemplar.getFilteredAttributes().isEmpty()) {
275-
exemplarBuilder.addAttachments(
276-
Any.pack(mapFilteredAttributes(exemplar.getFilteredAttributes())));
277-
}
278-
return exemplarBuilder.build();
279-
}
280-
281-
static final long NANO_PER_SECOND = (long) 1e9;
282-
283-
private static Timestamp mapTimestamp(long epochNanos) {
284-
return Timestamp.newBuilder()
285-
.setSeconds(epochNanos / NANO_PER_SECOND)
286-
.setNanos((int) (epochNanos % NANO_PER_SECOND))
287246
.build();
288247
}
289248

0 commit comments

Comments
 (0)