Skip to content

Commit 3389325

Browse files
chore: decouple Otel from CallLabels (#9747)
1 parent c291101 commit 3389325

File tree

8 files changed

+224
-134
lines changed

8 files changed

+224
-134
lines changed

bigtable/bigtable-proxy/src/main/java/com/google/cloud/bigtable/examples/proxy/core/CallLabels.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,9 @@
1717
package com.google.cloud.bigtable.examples.proxy.core;
1818

1919
import com.google.auto.value.AutoValue;
20-
import com.google.cloud.bigtable.examples.proxy.metrics.MetricsImpl;
2120
import io.grpc.Metadata;
2221
import io.grpc.Metadata.Key;
2322
import io.grpc.MethodDescriptor;
24-
import io.opentelemetry.api.common.Attributes;
2523
import java.net.URLDecoder;
2624
import java.nio.charset.StandardCharsets;
2725
import java.util.Optional;
@@ -70,15 +68,13 @@ static ResourceName create(ResourceNameType type, String value) {
7068
}
7169
}
7270

73-
abstract Optional<String> getApiClient();
71+
public abstract Optional<String> getApiClient();
7472

7573
public abstract Optional<String> getResourceName();
7674

7775
public abstract Optional<String> getAppProfileId();
7876

79-
abstract String getMethodName();
80-
81-
public abstract Attributes getOtelAttributes();
77+
public abstract String getMethodName();
8278

8379
public static CallLabels create(MethodDescriptor<?, ?> method, Metadata headers) {
8480
Optional<String> apiClient = Optional.ofNullable(headers.get(API_CLIENT));
@@ -96,15 +92,9 @@ public static CallLabels create(
9692
Optional<String> apiClient,
9793
Optional<String> resourceName,
9894
Optional<String> appProfile) {
99-
Attributes otelAttrs =
100-
Attributes.builder()
101-
.put(MetricsImpl.API_CLIENT_KEY, apiClient.orElse("<missing>"))
102-
.put(MetricsImpl.RESOURCE_KEY, resourceName.orElse("<missing>"))
103-
.put(MetricsImpl.APP_PROFILE_KEY, appProfile.orElse("<missing>"))
104-
.put(MetricsImpl.METHOD_KEY, method.getFullMethodName())
105-
.build();
95+
10696
return new AutoValue_CallLabels(
107-
apiClient, resourceName, appProfile, method.getFullMethodName(), otelAttrs);
97+
apiClient, resourceName, appProfile, method.getFullMethodName());
10898
}
10999

110100
private static Optional<ResourceName> extractResourceName(String[] encodedKvPairs) {

bigtable/bigtable-proxy/src/main/java/com/google/cloud/bigtable/examples/proxy/metrics/Metrics.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,30 @@
1717
package com.google.cloud.bigtable.examples.proxy.metrics;
1818

1919
import com.google.cloud.bigtable.examples.proxy.core.CallLabels;
20+
import com.google.cloud.bigtable.examples.proxy.metrics.Metrics.MetricsAttributes;
2021
import io.grpc.Status;
2122
import java.time.Duration;
2223

2324
public interface Metrics {
25+
MetricsAttributes createAttributes(CallLabels callLabels);
2426

25-
void recordCallStarted(CallLabels labels);
27+
void recordCallStarted(MetricsAttributes attrs);
2628

27-
void recordCredLatency(CallLabels labels, Status status, Duration duration);
29+
void recordCredLatency(MetricsAttributes attrs, Status status, Duration duration);
2830

29-
void recordQueueLatency(CallLabels labels, Duration duration);
31+
void recordQueueLatency(MetricsAttributes attrs, Duration duration);
3032

31-
void recordRequestSize(CallLabels labels, long size);
33+
void recordRequestSize(MetricsAttributes attrs, long size);
3234

33-
void recordResponseSize(CallLabels labels, long size);
35+
void recordResponseSize(MetricsAttributes attrs, long size);
3436

35-
void recordGfeLatency(CallLabels labels, Duration duration);
37+
void recordGfeLatency(MetricsAttributes attrs, Duration duration);
3638

37-
void recordGfeHeaderMissing(CallLabels labels);
39+
void recordGfeHeaderMissing(MetricsAttributes attrs);
3840

39-
void recordCallLatency(CallLabels labels, Status status, Duration duration);
41+
void recordCallLatency(MetricsAttributes attrs, Status status, Duration duration);
4042

4143
void updateChannelCount(int delta);
44+
45+
interface MetricsAttributes {}
4246
}

bigtable/bigtable-proxy/src/main/java/com/google/cloud/bigtable/examples/proxy/metrics/MetricsImpl.java

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.google.cloud.bigtable.examples.proxy.metrics;
1818

1919
import com.google.auth.Credentials;
20+
import com.google.auto.value.AutoValue;
2021
import com.google.cloud.bigtable.examples.proxy.core.CallLabels;
2122
import com.google.cloud.opentelemetry.metric.GoogleCloudMetricExporter;
2223
import com.google.cloud.opentelemetry.metric.MetricConfiguration;
@@ -28,6 +29,7 @@
2829
import io.opentelemetry.api.metrics.LongHistogram;
2930
import io.opentelemetry.api.metrics.LongUpDownCounter;
3031
import io.opentelemetry.api.metrics.Meter;
32+
import io.opentelemetry.api.metrics.MeterProvider;
3133
import io.opentelemetry.contrib.gcp.resource.GCPResourceProvider;
3234
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
3335
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
@@ -56,7 +58,7 @@ public class MetricsImpl implements Closeable, Metrics {
5658
public static final String METRIC_PRESENCE_DESC = "Number of proxy processes";
5759
public static final String METRIC_PRESENCE_UNIT = "{process}";
5860

59-
private final SdkMeterProvider meterProvider;
61+
private final MeterProvider meterProvider;
6062

6163
private final DoubleHistogram gfeLatency;
6264
private final LongCounter gfeResponseHeadersMissing;
@@ -75,7 +77,11 @@ public class MetricsImpl implements Closeable, Metrics {
7577
() -> Resource.create(new GCPResourceProvider().getAttributes());
7678

7779
public MetricsImpl(Credentials credentials, String projectId) throws IOException {
78-
meterProvider = createMeterProvider(credentials, projectId);
80+
this(createMeterProvider(credentials, projectId));
81+
}
82+
83+
MetricsImpl(MeterProvider meterProvider) {
84+
this.meterProvider = meterProvider;
7985
Meter meter =
8086
meterProvider
8187
.meterBuilder(INSTRUMENTATION_SCOPE_INFO.getName())
@@ -172,8 +178,21 @@ public MetricsImpl(Credentials credentials, String projectId) throws IOException
172178
}
173179

174180
@Override
175-
public void close() {
176-
meterProvider.close();
181+
public void close() throws IOException {
182+
if (meterProvider instanceof Closeable) {
183+
((Closeable) meterProvider).close();
184+
}
185+
}
186+
187+
@Override
188+
public MetricsAttributesImpl createAttributes(CallLabels callLabels) {
189+
return new AutoValue_MetricsImpl_MetricsAttributesImpl(
190+
Attributes.builder()
191+
.put(MetricsImpl.API_CLIENT_KEY, callLabels.getApiClient().orElse("<missing>"))
192+
.put(MetricsImpl.RESOURCE_KEY, callLabels.getResourceName().orElse("<missing>"))
193+
.put(MetricsImpl.APP_PROFILE_KEY, callLabels.getAppProfileId().orElse("<missing>"))
194+
.put(MetricsImpl.METHOD_KEY, callLabels.getMethodName())
195+
.build());
177196
}
178197

179198
private static SdkMeterProvider createMeterProvider(Credentials credentials, String projectId) {
@@ -194,49 +213,49 @@ private static SdkMeterProvider createMeterProvider(Credentials credentials, Str
194213
}
195214

196215
@Override
197-
public void recordCallStarted(CallLabels labels) {
198-
serverCallsStarted.add(1, labels.getOtelAttributes());
216+
public void recordCallStarted(MetricsAttributes attrs) {
217+
serverCallsStarted.add(1, unwrap(attrs));
199218

200219
int outstanding = numOutstandingRpcs.incrementAndGet();
201220
maxSeen.updateAndGet(n -> Math.max(outstanding, n));
202221
}
203222

204223
@Override
205-
public void recordCredLatency(CallLabels labels, Status status, Duration duration) {
224+
public void recordCredLatency(MetricsAttributes attrs, Status status, Duration duration) {
206225
Attributes attributes =
207-
labels.getOtelAttributes().toBuilder().put(STATUS_KEY, status.getCode().name()).build();
226+
unwrap(attrs).toBuilder().put(STATUS_KEY, status.getCode().name()).build();
208227
clientCredLatencies.record(duration.toMillis(), attributes);
209228
}
210229

211230
@Override
212-
public void recordQueueLatency(CallLabels labels, Duration duration) {
213-
clientQueueLatencies.record(duration.toMillis(), labels.getOtelAttributes());
231+
public void recordQueueLatency(MetricsAttributes attrs, Duration duration) {
232+
clientQueueLatencies.record(duration.toMillis(), unwrap(attrs));
214233
}
215234

216235
@Override
217-
public void recordRequestSize(CallLabels labels, long size) {
218-
requestSizes.record(size, labels.getOtelAttributes());
236+
public void recordRequestSize(MetricsAttributes attrs, long size) {
237+
requestSizes.record(size, unwrap(attrs));
219238
}
220239

221240
@Override
222-
public void recordResponseSize(CallLabels labels, long size) {
223-
responseSizes.record(size, labels.getOtelAttributes());
241+
public void recordResponseSize(MetricsAttributes attrs, long size) {
242+
responseSizes.record(size, unwrap(attrs));
224243
}
225244

226245
@Override
227-
public void recordGfeLatency(CallLabels labels, Duration duration) {
228-
gfeLatency.record(duration.toMillis(), labels.getOtelAttributes());
246+
public void recordGfeLatency(MetricsAttributes attrs, Duration duration) {
247+
gfeLatency.record(duration.toMillis(), unwrap(attrs));
229248
}
230249

231250
@Override
232-
public void recordGfeHeaderMissing(CallLabels labels) {
233-
gfeResponseHeadersMissing.add(1, labels.getOtelAttributes());
251+
public void recordGfeHeaderMissing(MetricsAttributes attrs) {
252+
gfeResponseHeadersMissing.add(1, unwrap(attrs));
234253
}
235254

236255
@Override
237-
public void recordCallLatency(CallLabels labels, Status status, Duration duration) {
256+
public void recordCallLatency(MetricsAttributes attrs, Status status, Duration duration) {
238257
Attributes attributes =
239-
labels.getOtelAttributes().toBuilder().put(STATUS_KEY, status.getCode().name()).build();
258+
unwrap(attrs).toBuilder().put(STATUS_KEY, status.getCode().name()).build();
240259

241260
clientCallLatencies.record(duration.toMillis(), attributes);
242261
numOutstandingRpcs.decrementAndGet();
@@ -246,4 +265,13 @@ public void recordCallLatency(CallLabels labels, Status status, Duration duratio
246265
public void updateChannelCount(int delta) {
247266
channelCounter.add(delta);
248267
}
268+
269+
static Attributes unwrap(MetricsAttributes wrapped) {
270+
return ((MetricsAttributesImpl) wrapped).getAttributes();
271+
}
272+
273+
@AutoValue
274+
abstract static class MetricsAttributesImpl implements MetricsAttributes {
275+
abstract Attributes getAttributes();
276+
}
249277
}

bigtable/bigtable-proxy/src/main/java/com/google/cloud/bigtable/examples/proxy/metrics/NoopMetrics.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,28 +23,33 @@
2323
public class NoopMetrics implements Metrics {
2424

2525
@Override
26-
public void recordCallStarted(CallLabels labels) {}
26+
public MetricsAttributes createAttributes(CallLabels callLabels) {
27+
return null;
28+
}
2729

2830
@Override
29-
public void recordCredLatency(CallLabels labels, Status status, Duration duration) {}
31+
public void recordCallStarted(MetricsAttributes attrs) {}
3032

3133
@Override
32-
public void recordQueueLatency(CallLabels labels, Duration duration) {}
34+
public void recordCredLatency(MetricsAttributes attrs, Status status, Duration duration) {}
3335

3436
@Override
35-
public void recordRequestSize(CallLabels labels, long size) {}
37+
public void recordQueueLatency(MetricsAttributes attrs, Duration duration) {}
3638

3739
@Override
38-
public void recordResponseSize(CallLabels labels, long size) {}
40+
public void recordRequestSize(MetricsAttributes attrs, long size) {}
3941

4042
@Override
41-
public void recordGfeLatency(CallLabels labels, Duration duration) {}
43+
public void recordResponseSize(MetricsAttributes attrs, long size) {}
4244

4345
@Override
44-
public void recordGfeHeaderMissing(CallLabels labels) {}
46+
public void recordGfeLatency(MetricsAttributes attrs, Duration duration) {}
4547

4648
@Override
47-
public void recordCallLatency(CallLabels labels, Status status, Duration duration) {}
49+
public void recordGfeHeaderMissing(MetricsAttributes attrs) {}
50+
51+
@Override
52+
public void recordCallLatency(MetricsAttributes attrs, Status status, Duration duration) {}
4853

4954
@Override
5055
public void updateChannelCount(int delta) {}

bigtable/bigtable-proxy/src/main/java/com/google/cloud/bigtable/examples/proxy/metrics/Tracer.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.google.cloud.bigtable.examples.proxy.metrics;
1818

1919
import com.google.cloud.bigtable.examples.proxy.core.CallLabels;
20+
import com.google.cloud.bigtable.examples.proxy.metrics.Metrics.MetricsAttributes;
2021
import com.google.common.base.Stopwatch;
2122
import io.grpc.CallOptions;
2223
import io.grpc.CallOptions.Key;
@@ -40,17 +41,19 @@ public class Tracer extends ClientStreamTracer {
4041

4142
private final Metrics metrics;
4243
private final CallLabels callLabels;
44+
private final MetricsAttributes attrs;
4345
private final Stopwatch stopwatch;
4446
private volatile Optional<Duration> grpcQueueDuration = Optional.empty();
4547
private final AtomicLong responseSize = new AtomicLong();
4648

4749
public Tracer(Metrics metrics, CallLabels callLabels) {
4850
this.metrics = metrics;
4951
this.callLabels = callLabels;
52+
this.attrs = metrics.createAttributes(callLabels);
5053

5154
stopwatch = Stopwatch.createStarted();
5255

53-
metrics.recordCallStarted(callLabels);
56+
metrics.recordCallStarted(attrs);
5457
}
5558

5659
public CallOptions injectIntoCallOptions(CallOptions callOptions) {
@@ -77,7 +80,7 @@ public void outboundMessageSent(int seqNo, long optionalWireSize, long optionalU
7780

7881
@Override
7982
public void outboundUncompressedSize(long bytes) {
80-
metrics.recordRequestSize(callLabels, bytes);
83+
metrics.recordRequestSize(attrs, bytes);
8184
}
8285

8386
@Override
@@ -94,19 +97,18 @@ public void inboundHeaders(Metadata headers) {
9497
.map(Long::parseLong)
9598
.map(Duration::ofMillis)
9699
.ifPresentOrElse(
97-
d -> metrics.recordGfeLatency(callLabels, d),
98-
() -> metrics.recordGfeHeaderMissing(callLabels));
100+
d -> metrics.recordGfeLatency(attrs, d), () -> metrics.recordGfeHeaderMissing(attrs));
99101
}
100102

101103
public void onCallFinished(Status status) {
102-
grpcQueueDuration.ifPresent(d -> metrics.recordQueueLatency(callLabels, d));
103-
metrics.recordResponseSize(callLabels, responseSize.get());
104+
grpcQueueDuration.ifPresent(d -> metrics.recordQueueLatency(attrs, d));
105+
metrics.recordResponseSize(attrs, responseSize.get());
104106
metrics.recordCallLatency(
105-
callLabels, status, Duration.ofMillis(stopwatch.elapsed(TimeUnit.MILLISECONDS)));
107+
attrs, status, Duration.ofMillis(stopwatch.elapsed(TimeUnit.MILLISECONDS)));
106108
}
107109

108110
public void onCredentialsFetch(Status status, Duration duration) {
109-
metrics.recordCredLatency(callLabels, status, duration);
111+
metrics.recordCredLatency(attrs, status, duration);
110112
}
111113

112114
public CallLabels getCallLabels() {

0 commit comments

Comments
 (0)