Skip to content

Commit 271cbff

Browse files
igorbernstein2zhangkun83
authored andcommitted
core: Migrate to new OpenCensus method & status tags (#5996)
Fixes #5593 and supersedes #5601 Now that census-instrumentation/opencensus-java#1854 has been merged & released as 0.21.0. We can start using the method & status tags. Background: Opencensus introduced new tags for status and method (census-instrumentation/opencensus-java#1115). The old views that used those tags were deprecated and new views were created that used the new tags. However grpc-java wasn't updated to use the new tags due to concern of breaking existing metrics. This resulted in the old views being deprecated while the new views were broken (goomics #50). census-instrumentation/opencensus-java#1854 added a compatibility layer to opencensus that would remap new tags to old tags for old views. This should unblock grpc to switching to the new tags while allowing old views to still be populated. That commit was released as part of opencensus 0.21, which grpc currently uses
1 parent b8933fa commit 271cbff

5 files changed

Lines changed: 192 additions & 77 deletions

File tree

β€Žcore/build.gradleβ€Ž

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ dependencies {
2626
project(':grpc-api').sourceSets.test.output,
2727
project(':grpc-testing'),
2828
project(':grpc-grpclb'),
29-
libraries.guava_testlib
29+
libraries.guava_testlib,
30+
libraries.opencensus_impl
3031

3132
signature "org.codehaus.mojo.signature:java17:1.0@signature"
3233
signature "net.sf.androidscents.signature:android-api-level-14:4.0_r4@signature"

β€Žcore/src/main/java/io/grpc/internal/CensusStatsModule.javaβ€Ž

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ static final class ClientCallTracer extends ClientStreamTracer.Factory {
356356
this.parentCtx = checkNotNull(parentCtx);
357357
TagValue methodTag = TagValue.create(fullMethodName);
358358
this.startCtx = module.tagger.toBuilder(parentCtx)
359-
.putLocal(DeprecatedCensusConstants.RPC_METHOD, methodTag)
359+
.putLocal(RpcMeasureConstants.GRPC_CLIENT_METHOD, methodTag)
360360
.build();
361361
this.stopwatch = module.stopwatchSupplier.get().start();
362362
if (module.recordStartedRpcs) {
@@ -442,7 +442,7 @@ void callEnded(Status status) {
442442
module
443443
.tagger
444444
.toBuilder(startCtx)
445-
.putLocal(DeprecatedCensusConstants.RPC_STATUS, statusTag)
445+
.putLocal(RpcMeasureConstants.GRPC_CLIENT_STATUS, statusTag)
446446
.build());
447447
}
448448
}
@@ -647,7 +647,7 @@ public void streamClosed(Status status) {
647647
module
648648
.tagger
649649
.toBuilder(parentCtx)
650-
.putLocal(DeprecatedCensusConstants.RPC_STATUS, statusTag)
650+
.putLocal(RpcMeasureConstants.GRPC_SERVER_STATUS, statusTag)
651651
.build());
652652
}
653653

@@ -672,7 +672,7 @@ public ServerStreamTracer newServerStreamTracer(String fullMethodName, Metadata
672672
parentCtx =
673673
tagger
674674
.toBuilder(parentCtx)
675-
.putLocal(DeprecatedCensusConstants.RPC_METHOD, methodTag)
675+
.putLocal(RpcMeasureConstants.GRPC_SERVER_METHOD, methodTag)
676676
.build();
677677
return new ServerTracer(CensusStatsModule.this, parentCtx);
678678
}

β€Žcore/src/main/java/io/grpc/internal/DeprecatedCensusConstants.javaβ€Ž

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,11 @@
2020
import io.opencensus.contrib.grpc.metrics.RpcMeasureConstants;
2121
import io.opencensus.stats.Measure.MeasureDouble;
2222
import io.opencensus.stats.Measure.MeasureLong;
23-
import io.opencensus.tags.TagKey;
2423

2524
/** Holder class for the deprecated OpenCensus constants. */
2625
@SuppressWarnings("deprecation")
2726
@VisibleForTesting
2827
public final class DeprecatedCensusConstants {
29-
30-
public static final TagKey RPC_STATUS = RpcMeasureConstants.RPC_STATUS;
31-
public static final TagKey RPC_METHOD = RpcMeasureConstants.RPC_METHOD;
32-
3328
public static final MeasureLong RPC_CLIENT_ERROR_COUNT =
3429
RpcMeasureConstants.RPC_CLIENT_ERROR_COUNT;
3530
public static final MeasureDouble RPC_CLIENT_REQUEST_BYTES =

β€Žcore/src/test/java/io/grpc/internal/CensusModulesTest.javaβ€Ž

Lines changed: 146 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.grpc.internal;
1818

1919
import static com.google.common.truth.Truth.assertThat;
20+
import static com.google.common.truth.Truth.assertWithMessage;
2021
import static java.util.concurrent.TimeUnit.MILLISECONDS;
2122
import static org.junit.Assert.assertEquals;
2223
import static org.junit.Assert.assertFalse;
@@ -40,6 +41,7 @@
4041
import static org.mockito.Mockito.verifyZeroInteractions;
4142
import static org.mockito.Mockito.when;
4243

44+
import com.google.common.collect.ImmutableList;
4345
import io.grpc.Attributes;
4446
import io.grpc.CallOptions;
4547
import io.grpc.Channel;
@@ -61,8 +63,19 @@
6163
import io.grpc.internal.testing.StatsTestUtils.FakeTagger;
6264
import io.grpc.internal.testing.StatsTestUtils.MockableSpan;
6365
import io.grpc.testing.GrpcServerRule;
66+
import io.opencensus.common.Function;
67+
import io.opencensus.common.Functions;
6468
import io.opencensus.contrib.grpc.metrics.RpcMeasureConstants;
69+
import io.opencensus.contrib.grpc.metrics.RpcViewConstants;
70+
import io.opencensus.impl.stats.StatsComponentImpl;
71+
import io.opencensus.stats.AggregationData;
72+
import io.opencensus.stats.AggregationData.CountData;
73+
import io.opencensus.stats.AggregationData.LastValueDataDouble;
74+
import io.opencensus.stats.AggregationData.LastValueDataLong;
75+
import io.opencensus.stats.AggregationData.SumDataDouble;
6576
import io.opencensus.stats.Measure;
77+
import io.opencensus.stats.StatsComponent;
78+
import io.opencensus.stats.View;
6679
import io.opencensus.tags.TagContext;
6780
import io.opencensus.tags.TagValue;
6881
import io.opencensus.trace.BlankSpan;
@@ -288,8 +301,8 @@ public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
288301

289302
StatsTestUtils.MetricsRecord record = statsRecorder.pollRecord();
290303
assertNotNull(record);
291-
TagValue methodTagOld = record.tags.get(DeprecatedCensusConstants.RPC_METHOD);
292-
assertEquals(method.getFullMethodName(), methodTagOld.asString());
304+
TagValue methodTag = record.tags.get(RpcMeasureConstants.GRPC_CLIENT_METHOD);
305+
assertEquals(method.getFullMethodName(), methodTag.asString());
293306
if (nonDefaultContext) {
294307
TagValue extraTag = record.tags.get(StatsTestUtils.EXTRA_TAG);
295308
assertEquals("extra value", extraTag.asString());
@@ -322,10 +335,10 @@ public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
322335
// The intercepting listener calls callEnded() on ClientCallTracer, which records to Census.
323336
record = statsRecorder.pollRecord();
324337
assertNotNull(record);
325-
methodTagOld = record.tags.get(DeprecatedCensusConstants.RPC_METHOD);
326-
assertEquals(method.getFullMethodName(), methodTagOld.asString());
327-
TagValue statusTagOld = record.tags.get(DeprecatedCensusConstants.RPC_STATUS);
328-
assertEquals(Status.Code.PERMISSION_DENIED.toString(), statusTagOld.asString());
338+
methodTag = record.tags.get(RpcMeasureConstants.GRPC_CLIENT_METHOD);
339+
assertEquals(method.getFullMethodName(), methodTag.asString());
340+
TagValue statusTag = record.tags.get(RpcMeasureConstants.GRPC_CLIENT_STATUS);
341+
assertEquals(Status.Code.PERMISSION_DENIED.toString(), statusTag.asString());
329342
if (nonDefaultContext) {
330343
TagValue extraTag = record.tags.get(StatsTestUtils.EXTRA_TAG);
331344
assertEquals("extra value", extraTag.asString());
@@ -384,8 +397,8 @@ private void subtestClientBasicStatsDefaultContext(
384397
assertNotNull(record);
385398
assertNoServerContent(record);
386399
assertEquals(1, record.tags.size());
387-
TagValue methodTagOld = record.tags.get(DeprecatedCensusConstants.RPC_METHOD);
388-
assertEquals(method.getFullMethodName(), methodTagOld.asString());
400+
TagValue methodTag = record.tags.get(RpcMeasureConstants.GRPC_CLIENT_METHOD);
401+
assertEquals(method.getFullMethodName(), methodTag.asString());
389402
assertEquals(
390403
1, record.getMetricAsLongOrFail(DeprecatedCensusConstants.RPC_CLIENT_STARTED_COUNT));
391404
} else {
@@ -446,10 +459,10 @@ private void subtestClientBasicStatsDefaultContext(
446459
StatsTestUtils.MetricsRecord record = statsRecorder.pollRecord();
447460
assertNotNull(record);
448461
assertNoServerContent(record);
449-
TagValue methodTagOld = record.tags.get(DeprecatedCensusConstants.RPC_METHOD);
450-
assertEquals(method.getFullMethodName(), methodTagOld.asString());
451-
TagValue statusTagOld = record.tags.get(DeprecatedCensusConstants.RPC_STATUS);
452-
assertEquals(Status.Code.OK.toString(), statusTagOld.asString());
462+
TagValue methodTag = record.tags.get(RpcMeasureConstants.GRPC_CLIENT_METHOD);
463+
assertEquals(method.getFullMethodName(), methodTag.asString());
464+
TagValue statusTag = record.tags.get(RpcMeasureConstants.GRPC_CLIENT_STATUS);
465+
assertEquals(Status.Code.OK.toString(), statusTag.asString());
453466
assertEquals(
454467
1, record.getMetricAsLongOrFail(DeprecatedCensusConstants.RPC_CLIENT_FINISHED_COUNT));
455468
assertNull(record.getMetric(DeprecatedCensusConstants.RPC_CLIENT_ERROR_COUNT));
@@ -488,11 +501,16 @@ private void assertRealTimeMetric(
488501
assertNotNull(record);
489502
if (clientSide) {
490503
assertNoServerContent(record);
504+
505+
TagValue methodTag = record.tags.get(RpcMeasureConstants.GRPC_CLIENT_METHOD);
506+
assertEquals(method.getFullMethodName(), methodTag.asString());
491507
} else {
492508
assertNoClientContent(record);
509+
510+
TagValue methodTag = record.tags.get(RpcMeasureConstants.GRPC_SERVER_METHOD);
511+
assertEquals(method.getFullMethodName(), methodTag.asString());
493512
}
494-
TagValue methodTagOld = record.tags.get(DeprecatedCensusConstants.RPC_METHOD);
495-
assertEquals(method.getFullMethodName(), methodTagOld.asString());
513+
496514
assertEquals(expectedValue, record.getMetricAsLongOrFail(measure));
497515
}
498516

@@ -564,8 +582,8 @@ public void clientStreamNeverCreatedStillRecordStats() {
564582
assertNotNull(record);
565583
assertNoServerContent(record);
566584
assertEquals(1, record.tags.size());
567-
TagValue methodTagOld = record.tags.get(DeprecatedCensusConstants.RPC_METHOD);
568-
assertEquals(method.getFullMethodName(), methodTagOld.asString());
585+
TagValue methodTag = record.tags.get(RpcMeasureConstants.GRPC_CLIENT_METHOD);
586+
assertEquals(method.getFullMethodName(), methodTag.asString());
569587
assertEquals(
570588
1,
571589
record.getMetricAsLongOrFail(DeprecatedCensusConstants.RPC_CLIENT_STARTED_COUNT));
@@ -574,10 +592,10 @@ public void clientStreamNeverCreatedStillRecordStats() {
574592
record = statsRecorder.pollRecord();
575593
assertNotNull(record);
576594
assertNoServerContent(record);
577-
methodTagOld = record.tags.get(DeprecatedCensusConstants.RPC_METHOD);
578-
assertEquals(method.getFullMethodName(), methodTagOld.asString());
579-
TagValue statusTagOld = record.tags.get(DeprecatedCensusConstants.RPC_STATUS);
580-
assertEquals(Status.Code.DEADLINE_EXCEEDED.toString(), statusTagOld.asString());
595+
methodTag = record.tags.get(RpcMeasureConstants.GRPC_CLIENT_METHOD);
596+
assertEquals(method.getFullMethodName(), methodTag.asString());
597+
TagValue statusTag = record.tags.get(RpcMeasureConstants.GRPC_CLIENT_STATUS);
598+
assertEquals(Status.Code.DEADLINE_EXCEEDED.toString(), statusTag.asString());
581599
assertEquals(
582600
1,
583601
record.getMetricAsLongOrFail(DeprecatedCensusConstants.RPC_CLIENT_FINISHED_COUNT));
@@ -668,8 +686,8 @@ private void subtestStatsHeadersPropagateTags(boolean propagate, boolean recordS
668686
assertNotNull(clientRecord);
669687
assertNoServerContent(clientRecord);
670688
assertEquals(2, clientRecord.tags.size());
671-
TagValue clientMethodTagOld = clientRecord.tags.get(DeprecatedCensusConstants.RPC_METHOD);
672-
assertEquals(method.getFullMethodName(), clientMethodTagOld.asString());
689+
TagValue clientMethodTag = clientRecord.tags.get(RpcMeasureConstants.GRPC_CLIENT_METHOD);
690+
assertEquals(method.getFullMethodName(), clientMethodTag.asString());
673691
TagValue clientPropagatedTag = clientRecord.tags.get(StatsTestUtils.EXTRA_TAG);
674692
assertEquals("extra-tag-value-897", clientPropagatedTag.asString());
675693
}
@@ -690,7 +708,7 @@ private void subtestStatsHeadersPropagateTags(boolean propagate, boolean recordS
690708
assertEquals(
691709
tagger.toBuilder(clientCtx)
692710
.putLocal(
693-
DeprecatedCensusConstants.RPC_METHOD,
711+
RpcMeasureConstants.GRPC_SERVER_METHOD,
694712
TagValue.create(method.getFullMethodName()))
695713
.build(),
696714
io.opencensus.tags.unsafe.ContextUtils.getValue(serverContext));
@@ -704,19 +722,19 @@ private void subtestStatsHeadersPropagateTags(boolean propagate, boolean recordS
704722
assertNotNull(serverRecord);
705723
assertNoClientContent(serverRecord);
706724
assertEquals(2, serverRecord.tags.size());
707-
TagValue serverMethodTagOld = serverRecord.tags.get(DeprecatedCensusConstants.RPC_METHOD);
708-
assertEquals(method.getFullMethodName(), serverMethodTagOld.asString());
725+
TagValue serverMethodTag = serverRecord.tags.get(RpcMeasureConstants.GRPC_SERVER_METHOD);
726+
assertEquals(method.getFullMethodName(), serverMethodTag.asString());
709727
TagValue serverPropagatedTag = serverRecord.tags.get(StatsTestUtils.EXTRA_TAG);
710728
assertEquals("extra-tag-value-897", serverPropagatedTag.asString());
711729

712730
// Server completion record
713731
serverRecord = statsRecorder.pollRecord();
714732
assertNotNull(serverRecord);
715733
assertNoClientContent(serverRecord);
716-
serverMethodTagOld = serverRecord.tags.get(DeprecatedCensusConstants.RPC_METHOD);
717-
assertEquals(method.getFullMethodName(), serverMethodTagOld.asString());
718-
TagValue serverStatusTagOld = serverRecord.tags.get(DeprecatedCensusConstants.RPC_STATUS);
719-
assertEquals(Status.Code.OK.toString(), serverStatusTagOld.asString());
734+
serverMethodTag = serverRecord.tags.get(RpcMeasureConstants.GRPC_SERVER_METHOD);
735+
assertEquals(method.getFullMethodName(), serverMethodTag.asString());
736+
TagValue serverStatusTag = serverRecord.tags.get(RpcMeasureConstants.GRPC_SERVER_STATUS);
737+
assertEquals(Status.Code.OK.toString(), serverStatusTag.asString());
720738
assertNull(serverRecord.getMetric(DeprecatedCensusConstants.RPC_SERVER_ERROR_COUNT));
721739
serverPropagatedTag = serverRecord.tags.get(StatsTestUtils.EXTRA_TAG);
722740
assertEquals("extra-tag-value-897", serverPropagatedTag.asString());
@@ -731,10 +749,10 @@ private void subtestStatsHeadersPropagateTags(boolean propagate, boolean recordS
731749
StatsTestUtils.MetricsRecord clientRecord = statsRecorder.pollRecord();
732750
assertNotNull(clientRecord);
733751
assertNoServerContent(clientRecord);
734-
TagValue clientMethodTagOld = clientRecord.tags.get(DeprecatedCensusConstants.RPC_METHOD);
735-
assertEquals(method.getFullMethodName(), clientMethodTagOld.asString());
736-
TagValue clientStatusTagOld = clientRecord.tags.get(DeprecatedCensusConstants.RPC_STATUS);
737-
assertEquals(Status.Code.OK.toString(), clientStatusTagOld.asString());
752+
TagValue clientMethodTag = clientRecord.tags.get(RpcMeasureConstants.GRPC_CLIENT_METHOD);
753+
assertEquals(method.getFullMethodName(), clientMethodTag.asString());
754+
TagValue clientStatusTag = clientRecord.tags.get(RpcMeasureConstants.GRPC_CLIENT_STATUS);
755+
assertEquals(Status.Code.OK.toString(), clientStatusTag.asString());
738756
assertNull(clientRecord.getMetric(DeprecatedCensusConstants.RPC_CLIENT_ERROR_COUNT));
739757
TagValue clientPropagatedTag = clientRecord.tags.get(StatsTestUtils.EXTRA_TAG);
740758
assertEquals("extra-tag-value-897", clientPropagatedTag.asString());
@@ -911,8 +929,8 @@ private void subtestServerBasicStatsNoHeaders(
911929
assertNotNull(record);
912930
assertNoClientContent(record);
913931
assertEquals(1, record.tags.size());
914-
TagValue methodTagOld = record.tags.get(DeprecatedCensusConstants.RPC_METHOD);
915-
assertEquals(method.getFullMethodName(), methodTagOld.asString());
932+
TagValue methodTag = record.tags.get(RpcMeasureConstants.GRPC_SERVER_METHOD);
933+
assertEquals(method.getFullMethodName(), methodTag.asString());
916934
assertEquals(
917935
1,
918936
record.getMetricAsLongOrFail(DeprecatedCensusConstants.RPC_SERVER_STARTED_COUNT));
@@ -926,7 +944,7 @@ private void subtestServerBasicStatsNoHeaders(
926944
tagger
927945
.emptyBuilder()
928946
.putLocal(
929-
DeprecatedCensusConstants.RPC_METHOD,
947+
RpcMeasureConstants.GRPC_SERVER_METHOD,
930948
TagValue.create(method.getFullMethodName()))
931949
.build(),
932950
statsCtx);
@@ -980,10 +998,10 @@ private void subtestServerBasicStatsNoHeaders(
980998
StatsTestUtils.MetricsRecord record = statsRecorder.pollRecord();
981999
assertNotNull(record);
9821000
assertNoClientContent(record);
983-
TagValue methodTagOld = record.tags.get(DeprecatedCensusConstants.RPC_METHOD);
984-
assertEquals(method.getFullMethodName(), methodTagOld.asString());
985-
TagValue statusTagOld = record.tags.get(DeprecatedCensusConstants.RPC_STATUS);
986-
assertEquals(Status.Code.CANCELLED.toString(), statusTagOld.asString());
1001+
TagValue methodTag = record.tags.get(RpcMeasureConstants.GRPC_SERVER_METHOD);
1002+
assertEquals(method.getFullMethodName(), methodTag.asString());
1003+
TagValue statusTag = record.tags.get(RpcMeasureConstants.GRPC_SERVER_STATUS);
1004+
assertEquals(Status.Code.CANCELLED.toString(), statusTag.asString());
9871005
assertEquals(
9881006
1, record.getMetricAsLongOrFail(DeprecatedCensusConstants.RPC_SERVER_FINISHED_COUNT));
9891007
assertEquals(
@@ -1148,4 +1166,92 @@ private static void assertNoClientContent(StatsTestUtils.MetricsRecord record) {
11481166
assertNull(record.getMetric(DeprecatedCensusConstants.RPC_CLIENT_UNCOMPRESSED_REQUEST_BYTES));
11491167
assertNull(record.getMetric(DeprecatedCensusConstants.RPC_CLIENT_UNCOMPRESSED_RESPONSE_BYTES));
11501168
}
1169+
1170+
@Deprecated
1171+
@Test
1172+
public void newTagsPopulateOldViews() throws InterruptedException {
1173+
StatsComponent localStats = new StatsComponentImpl();
1174+
1175+
// Test views that contain both of the remap tags: method & status.
1176+
localStats.getViewManager().registerView(RpcViewConstants.RPC_CLIENT_ERROR_COUNT_VIEW);
1177+
localStats.getViewManager().registerView(RpcViewConstants.GRPC_CLIENT_COMPLETED_RPC_VIEW);
1178+
1179+
CensusStatsModule localCensusStats = new CensusStatsModule(
1180+
tagger, tagCtxSerializer, localStats.getStatsRecorder(), fakeClock.getStopwatchSupplier(),
1181+
false, false, true, false /* real-time */);
1182+
1183+
CensusStatsModule.ClientCallTracer callTracer =
1184+
localCensusStats.newClientCallTracer(
1185+
tagger.empty(), method.getFullMethodName());
1186+
1187+
callTracer.newClientStreamTracer(STREAM_INFO, new Metadata());
1188+
fakeClock.forwardTime(30, MILLISECONDS);
1189+
callTracer.callEnded(Status.PERMISSION_DENIED.withDescription("No you don't"));
1190+
1191+
// Give OpenCensus a chance to update the views asynchronously.
1192+
Thread.sleep(100);
1193+
1194+
assertWithMessage("Legacy error count view had unexpected count")
1195+
.that(
1196+
getAggregationValueAsLong(
1197+
localStats,
1198+
RpcViewConstants.RPC_CLIENT_ERROR_COUNT_VIEW,
1199+
ImmutableList.of(
1200+
TagValue.create("PERMISSION_DENIED"),
1201+
TagValue.create(method.getFullMethodName()))))
1202+
.isEqualTo(1);
1203+
1204+
assertWithMessage("New error count view had unexpected count")
1205+
.that(
1206+
getAggregationValueAsLong(
1207+
localStats,
1208+
RpcViewConstants.GRPC_CLIENT_COMPLETED_RPC_VIEW,
1209+
ImmutableList.of(
1210+
TagValue.create(method.getFullMethodName()),
1211+
TagValue.create("PERMISSION_DENIED"))))
1212+
.isEqualTo(1);
1213+
}
1214+
1215+
@Deprecated
1216+
private long getAggregationValueAsLong(StatsComponent localStats, View view,
1217+
List<TagValue> dimension) {
1218+
AggregationData aggregationData = localStats.getViewManager()
1219+
.getView(view.getName())
1220+
.getAggregationMap()
1221+
.get(dimension);
1222+
1223+
return aggregationData.match(
1224+
new Function<SumDataDouble, Long>() {
1225+
@Override
1226+
public Long apply(SumDataDouble arg) {
1227+
return (long) arg.getSum();
1228+
}
1229+
},
1230+
Functions.<Long>throwAssertionError(),
1231+
new Function<CountData, Long>() {
1232+
@Override
1233+
public Long apply(CountData arg) {
1234+
return arg.getCount();
1235+
}
1236+
},
1237+
Functions.<Long>throwAssertionError(),
1238+
new Function<LastValueDataDouble, Long>() {
1239+
@Override
1240+
public Long apply(LastValueDataDouble arg) {
1241+
return (long) arg.getLastValue();
1242+
}
1243+
},
1244+
new Function<LastValueDataLong, Long>() {
1245+
@Override
1246+
public Long apply(LastValueDataLong arg) {
1247+
return arg.getLastValue();
1248+
}
1249+
},
1250+
new Function<AggregationData, Long>() {
1251+
@Override
1252+
public Long apply(AggregationData arg) {
1253+
return ((io.opencensus.stats.AggregationData.MeanData) arg).getCount();
1254+
}
1255+
});
1256+
}
11511257
}

0 commit comments

Comments
 (0)