Class OrcaPerRequestUtil
java.lang.Object
io.grpc.xds.orca.OrcaPerRequestUtil
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/9128")
public abstract class OrcaPerRequestUtil
extends Object
Utility class that provides method for
LoadBalancer to install listeners to receive
per-request backend cost metrics in the format of Open Request Cost Aggregation (ORCA).-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic interfaceThe listener interface for receiving per-request ORCA reports from backends.private static final classA container class to hold registeredOrcaPerRequestUtil.OrcaPerRequestReportListeners and invoke all of them when anOrcaLoadReportis received.(package private) static final classAnOrcaPerRequestUtil.OrcaReportingTracerFactorywraps a delegatedClientStreamTracer.Factorywith additional functionality to produceClientStreamTracerinstances that extract per-request ORCA reports and push to registered listeners for calls they trace. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final OrcaPerRequestUtilprivate static final io.grpc.ClientStreamTracerprivate static final io.grpc.ClientStreamTracer.Factory -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription(package private) static io.grpc.services.MetricReportfromOrcaLoadReport(OrcaLoadReport loadReport) static OrcaPerRequestUtilGets anOrcaPerRequestUtilinstance that provides actual implementation ofnewOrcaClientStreamTracerFactory(OrcaPerRequestUtil.OrcaPerRequestReportListener).abstract io.grpc.ClientStreamTracer.FactorynewOrcaClientStreamTracerFactory(io.grpc.ClientStreamTracer.Factory delegate, OrcaPerRequestUtil.OrcaPerRequestReportListener listener) Creates a newClientStreamTracer.Factorywith providedOrcaPerRequestUtil.OrcaPerRequestReportListenerinstalled to receive callback when a per-request ORCA report is received.abstract io.grpc.ClientStreamTracer.FactoryCreates a newClientStreamTracer.Factorywith providedOrcaPerRequestUtil.OrcaPerRequestReportListenerinstalled to receive callback when a per-request ORCA report is received.
-
Field Details
-
NOOP_CLIENT_STREAM_TRACER
private static final io.grpc.ClientStreamTracer NOOP_CLIENT_STREAM_TRACER -
NOOP_CLIENT_STREAM_TRACER_FACTORY
private static final io.grpc.ClientStreamTracer.Factory NOOP_CLIENT_STREAM_TRACER_FACTORY -
DEFAULT_INSTANCE
-
-
Constructor Details
-
OrcaPerRequestUtil
public OrcaPerRequestUtil()
-
-
Method Details
-
getInstance
Gets anOrcaPerRequestUtilinstance that provides actual implementation ofnewOrcaClientStreamTracerFactory(OrcaPerRequestUtil.OrcaPerRequestReportListener). -
newOrcaClientStreamTracerFactory
public abstract io.grpc.ClientStreamTracer.Factory newOrcaClientStreamTracerFactory(OrcaPerRequestUtil.OrcaPerRequestReportListener listener) Creates a newClientStreamTracer.Factorywith providedOrcaPerRequestUtil.OrcaPerRequestReportListenerinstalled to receive callback when a per-request ORCA report is received.Example usages for leaf level policy (e.g., WRR policy)
class WrrPicker extends SubchannelPicker { public PickResult pickSubchannel(PickSubchannelArgs args) { Subchannel subchannel = ... // WRR picking logic return PickResult.withSubchannel( subchannel, OrcaPerRequestReportUtil.getInstance().newOrcaClientStreamTracerFactory(listener)); } }- Parameters:
listener- contains the callback to be invoked when a per-request ORCA report is received.
-
newOrcaClientStreamTracerFactory
public abstract io.grpc.ClientStreamTracer.Factory newOrcaClientStreamTracerFactory(io.grpc.ClientStreamTracer.Factory delegate, OrcaPerRequestUtil.OrcaPerRequestReportListener listener) Creates a newClientStreamTracer.Factorywith providedOrcaPerRequestUtil.OrcaPerRequestReportListenerinstalled to receive callback when a per-request ORCA report is received.Example usages:
- Delegating policy (e.g., xDS)
class XdsPicker extends SubchannelPicker { public PickResult pickSubchannel(PickSubchannelArgs args) { SubchannelPicker perLocalityPicker = ... // locality picking logic Result result = perLocalityPicker.pickSubchannel(args); return PickResult.withSubchannel( result.getSubchannel(), OrcaPerRequestReportUtil.getInstance().newOrcaClientTracerFactory( result.getStreamTracerFactory(), listener)); } } - Delegating policy with additional tracing logic
class WrappingPicker extends SubchannelPicker { public PickResult pickSubchannel(PickSubchannelArgs args) { Result result = delegate.pickSubchannel(args); return PickResult.withSubchannel( result.getSubchannel(), new ClientStreamTracer.Factory() { public ClientStreamTracer newClientStreamTracer( StreamInfo info, Metadata metadata) { ClientStreamTracer.Factory orcaTracerFactory = OrcaPerRequestReportUtil.getInstance().newOrcaClientStreamTracerFactory( result.getStreamTracerFactory(), listener); // Wrap the tracer from the delegate factory if you need to trace the // stream for your own. final ClientStreamTracer orcaTracer = orcaTracerFactory.newClientStreamTracer(info, metadata); return ForwardingClientStreamTracer() { protected ClientStreamTracer delegate() { return orcaTracer; } public void inboundMessage(int seqNo) { // Handle this event. ... } }; } }); } }
- Parameters:
delegate- the delegate factory to produce other client stream tracing.listener- contains the callback to be invoked when a per-request ORCA report is received.
- Delegating policy (e.g., xDS)
-
fromOrcaLoadReport
-