mirror of https://github.com/grpc/grpc-java.git
core: record real-time metrics to OpenCensus (updated to 1.18.0) (#5099)
Real-time metrics are total sent/received bytes and messages per method, and are updated as the events occur rather than at the end of RPCs.
This commit is contained in:
parent
2961857451
commit
b5acbedd55
|
|
@ -110,7 +110,7 @@ subprojects {
|
|||
protobufVersion = '3.5.1'
|
||||
protocVersion = '3.5.1-1'
|
||||
protobufNanoVersion = '3.0.0-alpha-5'
|
||||
opencensusVersion = '0.17.0'
|
||||
opencensusVersion = '0.18.0'
|
||||
|
||||
configureProtoCompilation = {
|
||||
String generatedSourcePath = "${projectDir}/src/generated"
|
||||
|
|
|
|||
|
|
@ -165,6 +165,7 @@ public abstract class AbstractManagedChannelImplBuilder
|
|||
private boolean statsEnabled = true;
|
||||
private boolean recordStartedRpcs = true;
|
||||
private boolean recordFinishedRpcs = true;
|
||||
private boolean recordRealTimeMetrics = false;
|
||||
private boolean tracingEnabled = true;
|
||||
|
||||
@Nullable
|
||||
|
|
@ -383,6 +384,14 @@ public abstract class AbstractManagedChannelImplBuilder
|
|||
recordFinishedRpcs = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable or enable real-time metrics recording. Effective only if {@link #setStatsEnabled} is
|
||||
* set to true. Disabled by default.
|
||||
*/
|
||||
protected void setStatsRecordRealTimeMetrics(boolean value) {
|
||||
recordRealTimeMetrics = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable or enable tracing features. Enabled by default.
|
||||
*
|
||||
|
|
@ -433,7 +442,8 @@ public abstract class AbstractManagedChannelImplBuilder
|
|||
CensusStatsModule censusStats = this.censusStatsOverride;
|
||||
if (censusStats == null) {
|
||||
censusStats = new CensusStatsModule(
|
||||
GrpcUtil.STOPWATCH_SUPPLIER, true, recordStartedRpcs, recordFinishedRpcs);
|
||||
GrpcUtil.STOPWATCH_SUPPLIER, true, recordStartedRpcs, recordFinishedRpcs,
|
||||
recordRealTimeMetrics);
|
||||
}
|
||||
// First interceptor runs last (see ClientInterceptors.intercept()), so that no
|
||||
// other interceptor can override the tracer factory we set in CallOptions.
|
||||
|
|
|
|||
|
|
@ -108,6 +108,7 @@ public abstract class AbstractServerImplBuilder<T extends AbstractServerImplBuil
|
|||
private boolean statsEnabled = true;
|
||||
private boolean recordStartedRpcs = true;
|
||||
private boolean recordFinishedRpcs = true;
|
||||
private boolean recordRealTimeMetrics = false;
|
||||
private boolean tracingEnabled = true;
|
||||
|
||||
@Nullable
|
||||
|
|
@ -239,6 +240,14 @@ public abstract class AbstractServerImplBuilder<T extends AbstractServerImplBuil
|
|||
recordFinishedRpcs = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable or enable real-time metrics recording. Effective only if {@link #setStatsEnabled} is
|
||||
* set to true. Disabled by default.
|
||||
*/
|
||||
protected void setStatsRecordRealTimeMetrics(boolean value) {
|
||||
recordRealTimeMetrics = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable or enable tracing features. Enabled by default.
|
||||
*/
|
||||
|
|
@ -266,7 +275,8 @@ public abstract class AbstractServerImplBuilder<T extends AbstractServerImplBuil
|
|||
CensusStatsModule censusStats = this.censusStatsOverride;
|
||||
if (censusStats == null) {
|
||||
censusStats = new CensusStatsModule(
|
||||
GrpcUtil.STOPWATCH_SUPPLIER, true, recordStartedRpcs, recordFinishedRpcs);
|
||||
GrpcUtil.STOPWATCH_SUPPLIER, true, recordStartedRpcs, recordFinishedRpcs,
|
||||
recordRealTimeMetrics);
|
||||
}
|
||||
tracerFactories.add(censusStats.getServerTracerFactory());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,6 +36,9 @@ import io.grpc.MethodDescriptor;
|
|||
import io.grpc.ServerStreamTracer;
|
||||
import io.grpc.Status;
|
||||
import io.grpc.StreamTracer;
|
||||
import io.opencensus.contrib.grpc.metrics.RpcMeasureConstants;
|
||||
import io.opencensus.stats.Measure.MeasureDouble;
|
||||
import io.opencensus.stats.Measure.MeasureLong;
|
||||
import io.opencensus.stats.MeasureMap;
|
||||
import io.opencensus.stats.Stats;
|
||||
import io.opencensus.stats.StatsRecorder;
|
||||
|
|
@ -67,7 +70,6 @@ import javax.annotation.Nullable;
|
|||
public final class CensusStatsModule {
|
||||
private static final Logger logger = Logger.getLogger(CensusStatsModule.class.getName());
|
||||
private static final double NANOS_PER_MILLI = TimeUnit.MILLISECONDS.toNanos(1);
|
||||
private static final ClientTracer BLANK_CLIENT_TRACER = new ClientTracer();
|
||||
|
||||
private final Tagger tagger;
|
||||
private final StatsRecorder statsRecorder;
|
||||
|
|
@ -77,18 +79,20 @@ public final class CensusStatsModule {
|
|||
private final boolean propagateTags;
|
||||
private final boolean recordStartedRpcs;
|
||||
private final boolean recordFinishedRpcs;
|
||||
private final boolean recordRealTimeMetrics;
|
||||
|
||||
/**
|
||||
* Creates a {@link CensusStatsModule} with the default OpenCensus implementation.
|
||||
*/
|
||||
CensusStatsModule(Supplier<Stopwatch> stopwatchSupplier,
|
||||
boolean propagateTags, boolean recordStartedRpcs, boolean recordFinishedRpcs) {
|
||||
boolean propagateTags, boolean recordStartedRpcs, boolean recordFinishedRpcs,
|
||||
boolean recordRealTimeMetrics) {
|
||||
this(
|
||||
Tags.getTagger(),
|
||||
Tags.getTagPropagationComponent().getBinarySerializer(),
|
||||
Stats.getStatsRecorder(),
|
||||
stopwatchSupplier,
|
||||
propagateTags, recordStartedRpcs, recordFinishedRpcs);
|
||||
propagateTags, recordStartedRpcs, recordFinishedRpcs, recordRealTimeMetrics);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -98,7 +102,8 @@ public final class CensusStatsModule {
|
|||
final Tagger tagger,
|
||||
final TagContextBinarySerializer tagCtxSerializer,
|
||||
StatsRecorder statsRecorder, Supplier<Stopwatch> stopwatchSupplier,
|
||||
boolean propagateTags, boolean recordStartedRpcs, boolean recordFinishedRpcs) {
|
||||
boolean propagateTags, boolean recordStartedRpcs, boolean recordFinishedRpcs,
|
||||
boolean recordRealTimeMetrics) {
|
||||
this.tagger = checkNotNull(tagger, "tagger");
|
||||
this.statsRecorder = checkNotNull(statsRecorder, "statsRecorder");
|
||||
checkNotNull(tagCtxSerializer, "tagCtxSerializer");
|
||||
|
|
@ -106,6 +111,7 @@ public final class CensusStatsModule {
|
|||
this.propagateTags = propagateTags;
|
||||
this.recordStartedRpcs = recordStartedRpcs;
|
||||
this.recordFinishedRpcs = recordFinishedRpcs;
|
||||
this.recordRealTimeMetrics = recordRealTimeMetrics;
|
||||
this.statsHeader =
|
||||
Metadata.Key.of("grpc-tags-bin", new Metadata.BinaryMarshaller<TagContext>() {
|
||||
@Override
|
||||
|
|
@ -154,6 +160,20 @@ public final class CensusStatsModule {
|
|||
return new StatsClientInterceptor();
|
||||
}
|
||||
|
||||
private void recordRealTimeMetric(TagContext ctx, MeasureDouble measure, double value) {
|
||||
if (recordRealTimeMetrics) {
|
||||
MeasureMap measureMap = statsRecorder.newMeasureMap().put(measure, value);
|
||||
measureMap.record(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
private void recordRealTimeMetric(TagContext ctx, MeasureLong measure, long value) {
|
||||
if (recordRealTimeMetrics) {
|
||||
MeasureMap measureMap = statsRecorder.newMeasureMap().put(measure, value);
|
||||
measureMap.record(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
private static final class ClientTracer extends ClientStreamTracer {
|
||||
|
||||
@Nullable private static final AtomicLongFieldUpdater<ClientTracer> outboundMessageCountUpdater;
|
||||
|
|
@ -209,6 +229,9 @@ public final class CensusStatsModule {
|
|||
inboundUncompressedSizeUpdater = tmpInboundUncompressedSizeUpdater;
|
||||
}
|
||||
|
||||
private final CensusStatsModule module;
|
||||
private final TagContext startCtx;
|
||||
|
||||
volatile long outboundMessageCount;
|
||||
volatile long inboundMessageCount;
|
||||
volatile long outboundWireSize;
|
||||
|
|
@ -216,6 +239,11 @@ public final class CensusStatsModule {
|
|||
volatile long outboundUncompressedSize;
|
||||
volatile long inboundUncompressedSize;
|
||||
|
||||
ClientTracer(CensusStatsModule module, TagContext startCtx) {
|
||||
this.module = checkNotNull(module, "module");
|
||||
this.startCtx = checkNotNull(startCtx, "startCtx");
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("NonAtomicVolatileUpdate")
|
||||
public void outboundWireSize(long bytes) {
|
||||
|
|
@ -224,6 +252,8 @@ public final class CensusStatsModule {
|
|||
} else {
|
||||
outboundWireSize += bytes;
|
||||
}
|
||||
module.recordRealTimeMetric(
|
||||
startCtx, RpcMeasureConstants.GRPC_CLIENT_SENT_BYTES_PER_METHOD, bytes);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -234,6 +264,8 @@ public final class CensusStatsModule {
|
|||
} else {
|
||||
inboundWireSize += bytes;
|
||||
}
|
||||
module.recordRealTimeMetric(
|
||||
startCtx, RpcMeasureConstants.GRPC_CLIENT_RECEIVED_BYTES_PER_METHOD, bytes);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -264,6 +296,8 @@ public final class CensusStatsModule {
|
|||
} else {
|
||||
inboundMessageCount++;
|
||||
}
|
||||
module.recordRealTimeMetric(
|
||||
startCtx, RpcMeasureConstants.GRPC_CLIENT_RECEIVED_MESSAGES_PER_METHOD, 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -274,6 +308,8 @@ public final class CensusStatsModule {
|
|||
} else {
|
||||
outboundMessageCount++;
|
||||
}
|
||||
module.recordRealTimeMetric(
|
||||
startCtx, RpcMeasureConstants.GRPC_CLIENT_SENT_MESSAGES_PER_METHOD, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -332,7 +368,7 @@ public final class CensusStatsModule {
|
|||
|
||||
@Override
|
||||
public ClientStreamTracer newClientStreamTracer(CallOptions callOptions, Metadata headers) {
|
||||
ClientTracer tracer = new ClientTracer();
|
||||
ClientTracer tracer = new ClientTracer(module, startCtx);
|
||||
// TODO(zhangkun83): Once retry or hedging is implemented, a ClientCall may start more than
|
||||
// one streams. We will need to update this file to support them.
|
||||
if (streamTracerUpdater != null) {
|
||||
|
|
@ -378,7 +414,7 @@ public final class CensusStatsModule {
|
|||
long roundtripNanos = stopwatch.elapsed(TimeUnit.NANOSECONDS);
|
||||
ClientTracer tracer = streamTracer;
|
||||
if (tracer == null) {
|
||||
tracer = BLANK_CLIENT_TRACER;
|
||||
tracer = new ClientTracer(module, startCtx);
|
||||
}
|
||||
MeasureMap measureMap = module.statsRecorder.newMeasureMap()
|
||||
// TODO(songya): remove the deprecated measure constants once they are completed removed.
|
||||
|
|
@ -502,6 +538,8 @@ public final class CensusStatsModule {
|
|||
} else {
|
||||
outboundWireSize += bytes;
|
||||
}
|
||||
module.recordRealTimeMetric(
|
||||
parentCtx, RpcMeasureConstants.GRPC_SERVER_SENT_BYTES_PER_METHOD, bytes);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -512,6 +550,8 @@ public final class CensusStatsModule {
|
|||
} else {
|
||||
inboundWireSize += bytes;
|
||||
}
|
||||
module.recordRealTimeMetric(
|
||||
parentCtx, RpcMeasureConstants.GRPC_SERVER_RECEIVED_BYTES_PER_METHOD, bytes);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -542,6 +582,8 @@ public final class CensusStatsModule {
|
|||
} else {
|
||||
inboundMessageCount++;
|
||||
}
|
||||
module.recordRealTimeMetric(
|
||||
parentCtx, RpcMeasureConstants.GRPC_SERVER_RECEIVED_MESSAGES_PER_METHOD, 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -552,6 +594,8 @@ public final class CensusStatsModule {
|
|||
} else {
|
||||
outboundMessageCount++;
|
||||
}
|
||||
module.recordRealTimeMetric(
|
||||
parentCtx, RpcMeasureConstants.GRPC_SERVER_SENT_MESSAGES_PER_METHOD, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -414,7 +414,7 @@ public class AbstractManagedChannelImplBuilderTest {
|
|||
new FakeTagContextBinarySerializer(),
|
||||
new FakeStatsRecorder(),
|
||||
GrpcUtil.STOPWATCH_SUPPLIER,
|
||||
true, true, true));
|
||||
true, true, true, true));
|
||||
}
|
||||
|
||||
Builder(SocketAddress directServerAddress, String authority) {
|
||||
|
|
@ -425,7 +425,7 @@ public class AbstractManagedChannelImplBuilderTest {
|
|||
new FakeTagContextBinarySerializer(),
|
||||
new FakeStatsRecorder(),
|
||||
GrpcUtil.STOPWATCH_SUPPLIER,
|
||||
true, true, true));
|
||||
true, true, true, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ public class AbstractServerImplBuilderTest {
|
|||
new FakeTagContextBinarySerializer(),
|
||||
new FakeStatsRecorder(),
|
||||
GrpcUtil.STOPWATCH_SUPPLIER,
|
||||
true, true, true));
|
||||
true, true, true, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -63,6 +63,8 @@ import io.grpc.internal.testing.StatsTestUtils.FakeTagContextBinarySerializer;
|
|||
import io.grpc.internal.testing.StatsTestUtils.FakeTagger;
|
||||
import io.grpc.internal.testing.StatsTestUtils.MockableSpan;
|
||||
import io.grpc.testing.GrpcServerRule;
|
||||
import io.opencensus.contrib.grpc.metrics.RpcMeasureConstants;
|
||||
import io.opencensus.stats.Measure;
|
||||
import io.opencensus.tags.TagContext;
|
||||
import io.opencensus.tags.TagValue;
|
||||
import io.opencensus.trace.BlankSpan;
|
||||
|
|
@ -192,7 +194,7 @@ public class CensusModulesTest {
|
|||
censusStats =
|
||||
new CensusStatsModule(
|
||||
tagger, tagCtxSerializer, statsRecorder, fakeClock.getStopwatchSupplier(),
|
||||
true, true, true);
|
||||
true, true, true, false /* real-time */);
|
||||
censusTracing = new CensusTracingModule(tracer, mockTracingPropagationHandler);
|
||||
}
|
||||
|
||||
|
|
@ -334,30 +336,36 @@ public class CensusModulesTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void clientBasicStatsDefaultContext_startsAndFinishes() {
|
||||
subtestClientBasicStatsDefaultContext(true, true);
|
||||
public void clientBasicStatsDefaultContext_starts_finishes_noRealTime() {
|
||||
subtestClientBasicStatsDefaultContext(true, true, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void clientBasicStatsDefaultContext_startsOnly() {
|
||||
subtestClientBasicStatsDefaultContext(true, false);
|
||||
public void clientBasicStatsDefaultContext_starts_noFinishes_noRealTime() {
|
||||
subtestClientBasicStatsDefaultContext(true, false, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void clientBasicStatsDefaultContext_finishesOnly() {
|
||||
subtestClientBasicStatsDefaultContext(false, true);
|
||||
public void clientBasicStatsDefaultContext_noStarts_finishes_noRealTime() {
|
||||
subtestClientBasicStatsDefaultContext(false, true, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void clientBasicStatsDefaultContext_neither() {
|
||||
subtestClientBasicStatsDefaultContext(false, true);
|
||||
public void clientBasicStatsDefaultContext_noStarts_noFinishes_noRealTime() {
|
||||
subtestClientBasicStatsDefaultContext(false, false, false);
|
||||
}
|
||||
|
||||
private void subtestClientBasicStatsDefaultContext(boolean recordStarts, boolean recordFinishes) {
|
||||
@Test
|
||||
public void clientBasicStatsDefaultContext_starts_finishes_realTime() {
|
||||
subtestClientBasicStatsDefaultContext(true, true, true);
|
||||
}
|
||||
|
||||
private void subtestClientBasicStatsDefaultContext(
|
||||
boolean recordStarts, boolean recordFinishes, boolean recordRealTime) {
|
||||
CensusStatsModule localCensusStats =
|
||||
new CensusStatsModule(
|
||||
tagger, tagCtxSerializer, statsRecorder, fakeClock.getStopwatchSupplier(),
|
||||
true, recordStarts, recordFinishes);
|
||||
true, recordStarts, recordFinishes, recordRealTime);
|
||||
CensusStatsModule.ClientCallTracer callTracer =
|
||||
localCensusStats.newClientCallTracer(
|
||||
tagger.empty(), method.getFullMethodName());
|
||||
|
|
@ -381,21 +389,48 @@ public class CensusModulesTest {
|
|||
tracer.outboundHeaders();
|
||||
|
||||
fakeClock.forwardTime(100, MILLISECONDS);
|
||||
|
||||
tracer.outboundMessage(0);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_CLIENT_SENT_MESSAGES_PER_METHOD, 1, recordRealTime, true);
|
||||
|
||||
tracer.outboundWireSize(1028);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_CLIENT_SENT_BYTES_PER_METHOD, 1028, recordRealTime, true);
|
||||
|
||||
tracer.outboundUncompressedSize(1128);
|
||||
|
||||
fakeClock.forwardTime(16, MILLISECONDS);
|
||||
|
||||
tracer.inboundMessage(0);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_CLIENT_RECEIVED_MESSAGES_PER_METHOD, 1, recordRealTime, true);
|
||||
|
||||
tracer.inboundWireSize(33);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_CLIENT_RECEIVED_BYTES_PER_METHOD, 33, recordRealTime, true);
|
||||
|
||||
tracer.inboundUncompressedSize(67);
|
||||
|
||||
tracer.outboundMessage(1);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_CLIENT_SENT_MESSAGES_PER_METHOD, 1, recordRealTime, true);
|
||||
|
||||
tracer.outboundWireSize(99);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_CLIENT_SENT_BYTES_PER_METHOD, 99, recordRealTime, true);
|
||||
|
||||
tracer.outboundUncompressedSize(865);
|
||||
|
||||
fakeClock.forwardTime(24, MILLISECONDS);
|
||||
tracer.inboundMessage(1);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_CLIENT_RECEIVED_MESSAGES_PER_METHOD, 1, recordRealTime, true);
|
||||
|
||||
tracer.inboundWireSize(154);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_CLIENT_RECEIVED_BYTES_PER_METHOD, 154, recordRealTime, true);
|
||||
|
||||
tracer.inboundUncompressedSize(552);
|
||||
tracer.streamClosed(Status.OK);
|
||||
callTracer.callEnded(Status.OK);
|
||||
|
|
@ -436,6 +471,24 @@ public class CensusModulesTest {
|
|||
}
|
||||
}
|
||||
|
||||
private void assertRealTimeMetric(
|
||||
Measure measure, long expectedValue, boolean recordRealTimeMetrics, boolean clientSide) {
|
||||
StatsTestUtils.MetricsRecord record = statsRecorder.pollRecord();
|
||||
if (!recordRealTimeMetrics) {
|
||||
assertNull(record);
|
||||
return;
|
||||
}
|
||||
assertNotNull(record);
|
||||
if (clientSide) {
|
||||
assertNoServerContent(record);
|
||||
} else {
|
||||
assertNoClientContent(record);
|
||||
}
|
||||
TagValue methodTagOld = record.tags.get(DeprecatedCensusConstants.RPC_METHOD);
|
||||
assertEquals(method.getFullMethodName(), methodTagOld.asString());
|
||||
assertEquals(expectedValue, record.getMetricAsLongOrFail(measure));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void clientBasicTracingDefaultSpan() {
|
||||
CensusTracingModule.ClientCallTracer callTracer =
|
||||
|
|
@ -597,7 +650,7 @@ public class CensusModulesTest {
|
|||
tagCtxSerializer,
|
||||
statsRecorder,
|
||||
fakeClock.getStopwatchSupplier(),
|
||||
propagate, recordStats, recordStats);
|
||||
propagate, recordStats, recordStats, recordStats);
|
||||
Metadata headers = new Metadata();
|
||||
CensusStatsModule.ClientCallTracer callTracer =
|
||||
census.newClientCallTracer(clientCtx, method.getFullMethodName());
|
||||
|
|
@ -813,30 +866,36 @@ public class CensusModulesTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void serverBasicStatsNoHeaders_startsAndFinishes() {
|
||||
subtestServerBasicStatsNoHeaders(true, true);
|
||||
public void serverBasicStatsNoHeaders_starts_finishes_noRealTime() {
|
||||
subtestServerBasicStatsNoHeaders(true, true, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void serverBasicStatsNoHeaders_startsOnly() {
|
||||
subtestServerBasicStatsNoHeaders(true, false);
|
||||
public void serverBasicStatsNoHeaders_starts_noFinishes_noRealTime() {
|
||||
subtestServerBasicStatsNoHeaders(true, false, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void serverBasicStatsNoHeaders_finishesOnly() {
|
||||
subtestServerBasicStatsNoHeaders(false, true);
|
||||
public void serverBasicStatsNoHeaders_noStarts_finishes_noRealTime() {
|
||||
subtestServerBasicStatsNoHeaders(false, true, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void serverBasicStatsNoHeaders_neither() {
|
||||
subtestServerBasicStatsNoHeaders(false, false);
|
||||
public void serverBasicStatsNoHeaders_noStarts_noFinishes_noRealTime() {
|
||||
subtestServerBasicStatsNoHeaders(false, false, false);
|
||||
}
|
||||
|
||||
private void subtestServerBasicStatsNoHeaders(boolean recordStarts, boolean recordFinishes) {
|
||||
@Test
|
||||
public void serverBasicStatsNoHeaders_starts_finishes_realTime() {
|
||||
subtestServerBasicStatsNoHeaders(true, true, true);
|
||||
}
|
||||
|
||||
private void subtestServerBasicStatsNoHeaders(
|
||||
boolean recordStarts, boolean recordFinishes, boolean recordRealTime) {
|
||||
CensusStatsModule localCensusStats =
|
||||
new CensusStatsModule(
|
||||
tagger, tagCtxSerializer, statsRecorder, fakeClock.getStopwatchSupplier(),
|
||||
true, recordStarts, recordFinishes);
|
||||
true, recordStarts, recordFinishes, recordRealTime);
|
||||
ServerStreamTracer.Factory tracerFactory = localCensusStats.getServerTracerFactory();
|
||||
ServerStreamTracer tracer =
|
||||
tracerFactory.newServerStreamTracer(method.getFullMethodName(), new Metadata());
|
||||
|
|
@ -867,20 +926,44 @@ public class CensusModulesTest {
|
|||
statsCtx);
|
||||
|
||||
tracer.inboundMessage(0);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_SERVER_RECEIVED_MESSAGES_PER_METHOD, 1, recordRealTime, false);
|
||||
|
||||
tracer.inboundWireSize(34);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_SERVER_RECEIVED_BYTES_PER_METHOD, 34, recordRealTime, false);
|
||||
|
||||
tracer.inboundUncompressedSize(67);
|
||||
|
||||
fakeClock.forwardTime(100, MILLISECONDS);
|
||||
tracer.outboundMessage(0);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_SERVER_SENT_MESSAGES_PER_METHOD, 1, recordRealTime, false);
|
||||
|
||||
tracer.outboundWireSize(1028);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_SERVER_SENT_BYTES_PER_METHOD, 1028, recordRealTime, false);
|
||||
|
||||
tracer.outboundUncompressedSize(1128);
|
||||
|
||||
fakeClock.forwardTime(16, MILLISECONDS);
|
||||
tracer.inboundMessage(1);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_SERVER_RECEIVED_MESSAGES_PER_METHOD, 1, recordRealTime, false);
|
||||
|
||||
tracer.inboundWireSize(154);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_SERVER_RECEIVED_BYTES_PER_METHOD, 154, recordRealTime, false);
|
||||
|
||||
tracer.inboundUncompressedSize(552);
|
||||
tracer.outboundMessage(1);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_SERVER_SENT_MESSAGES_PER_METHOD, 1, recordRealTime, false);
|
||||
|
||||
tracer.outboundWireSize(99);
|
||||
assertRealTimeMetric(
|
||||
RpcMeasureConstants.GRPC_SERVER_SENT_BYTES_PER_METHOD, 99, recordRealTime, false);
|
||||
|
||||
tracer.outboundUncompressedSize(865);
|
||||
|
||||
fakeClock.forwardTime(24, MILLISECONDS);
|
||||
|
|
|
|||
|
|
@ -228,7 +228,7 @@ public abstract class AbstractInteropTest {
|
|||
tagContextBinarySerializer,
|
||||
serverStatsRecorder,
|
||||
GrpcUtil.STOPWATCH_SUPPLIER,
|
||||
true, true, true));
|
||||
true, true, true, false /* real-time metrics */));
|
||||
try {
|
||||
server = builder.build().start();
|
||||
} catch (IOException ex) {
|
||||
|
|
@ -331,7 +331,7 @@ public abstract class AbstractInteropTest {
|
|||
protected final CensusStatsModule createClientCensusStatsModule() {
|
||||
return new CensusStatsModule(
|
||||
tagger, tagContextBinarySerializer, clientStatsRecorder, GrpcUtil.STOPWATCH_SUPPLIER,
|
||||
true, true, true);
|
||||
true, true, true, false /* real-time metrics */);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -62,6 +62,10 @@ public final class InternalNettyChannelBuilder {
|
|||
builder.setStatsRecordStartedRpcs(value);
|
||||
}
|
||||
|
||||
public static void setStatsRecordRealTimeMetrics(NettyChannelBuilder builder, boolean value) {
|
||||
builder.setStatsRecordRealTimeMetrics(value);
|
||||
}
|
||||
|
||||
public static ClientTransportFactory buildTransportFactory(NettyChannelBuilder builder) {
|
||||
return builder.buildTransportFactory();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,10 @@ public final class InternalNettyServerBuilder {
|
|||
builder.setStatsRecordStartedRpcs(value);
|
||||
}
|
||||
|
||||
public static void setStatsRecordRealTimeMetrics(NettyServerBuilder builder, boolean value) {
|
||||
builder.setStatsRecordRealTimeMetrics(value);
|
||||
}
|
||||
|
||||
public static void setTracingEnabled(NettyServerBuilder builder, boolean value) {
|
||||
builder.setTracingEnabled(value);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -471,6 +471,11 @@ public final class NettyChannelBuilder
|
|||
super.setStatsRecordStartedRpcs(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setStatsRecordRealTimeMetrics(boolean value) {
|
||||
super.setStatsRecordRealTimeMetrics(value);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
NettyChannelBuilder setTransportTracerFactory(TransportTracer.Factory transportTracerFactory) {
|
||||
this.transportTracerFactory = transportTracerFactory;
|
||||
|
|
|
|||
|
|
@ -228,6 +228,11 @@ public final class NettyServerBuilder extends AbstractServerImplBuilder<NettySer
|
|||
super.setStatsRecordStartedRpcs(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setStatsRecordRealTimeMetrics(boolean value) {
|
||||
super.setStatsRecordRealTimeMetrics(value);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
NettyServerBuilder setTransportTracerFactory(TransportTracer.Factory transportTracerFactory) {
|
||||
this.transportTracerFactory = transportTracerFactory;
|
||||
|
|
|
|||
|
|
@ -302,15 +302,15 @@ def io_netty_transport():
|
|||
def io_opencensus_api():
|
||||
native.maven_jar(
|
||||
name = "io_opencensus_opencensus_api",
|
||||
artifact = "io.opencensus:opencensus-api:0.17.0",
|
||||
sha1 = "0b9c91321f9c9f20f3a4627bfd9e3097164f85e6",
|
||||
artifact = "io.opencensus:opencensus-api:0.18.0",
|
||||
sha1 = "b89a8f8dfd1e1e0d68d83c82a855624814b19a6e",
|
||||
)
|
||||
|
||||
def io_opencensus_grpc_metrics():
|
||||
native.maven_jar(
|
||||
name = "io_opencensus_opencensus_contrib_grpc_metrics",
|
||||
artifact = "io.opencensus:opencensus-contrib-grpc-metrics:0.17.0",
|
||||
sha1 = "4b82972073361704f57fa2107910242f1143df25",
|
||||
artifact = "io.opencensus:opencensus-contrib-grpc-metrics:0.18.0",
|
||||
sha1 = "8e90fab2930b6a0e67dab48911b9c936470d43dd",
|
||||
)
|
||||
|
||||
def javax_annotation():
|
||||
|
|
|
|||
Loading…
Reference in New Issue