Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

xds: do not expose orca proto in ORCA api (#9366) (v1.48 backport) #9412

Merged
merged 5 commits into from
Jul 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions buildscripts/kokoro/unix.sh
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ if [[ -z "${SKIP_TESTS:-}" ]]; then
../gradlew build $GRADLE_FLAGS
popd
# TODO(zpencer): also build the GAE examples
pushd examples/example-orca
../gradlew build $GRADLE_FLAGS
popd
fi

LOCAL_MVN_TEMP=$(mktemp -d)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@
import io.grpc.LoadBalancer;
import io.grpc.LoadBalancerProvider;
import io.grpc.LoadBalancerRegistry;
import io.grpc.services.MetricReport;
import io.grpc.util.ForwardingLoadBalancer;
import io.grpc.util.ForwardingLoadBalancerHelper;
import io.grpc.xds.orca.OrcaOobUtil;
import io.grpc.xds.orca.OrcaPerRequestUtil;
import io.grpc.xds.shaded.com.github.xds.data.orca.v3.OrcaLoadReport;
import java.util.concurrent.TimeUnit;

/**
Expand Down Expand Up @@ -87,7 +87,7 @@ public LoadBalancer.Subchannel createSubchannel(LoadBalancer.CreateSubchannelArg
// otherwise it is treated as server minimum report interval.
OrcaOobUtil.setListener(subchannel, new OrcaOobUtil.OrcaOobReportListener() {
@Override
public void onLoadReport(OrcaLoadReport orcaLoadReport) {
public void onLoadReport(MetricReport orcaLoadReport) {
System.out.println("Example load balancer received OOB metrics report:\n"
+ orcaLoadReport);
}
Expand Down Expand Up @@ -124,16 +124,24 @@ public LoadBalancer.PickResult pickSubchannel(LoadBalancer.PickSubchannelArgs ar
return result;
}
// Installs ORCA per-query metrics reporting listener.
return LoadBalancer.PickResult.withSubchannel(
result.getSubchannel(),
OrcaPerRequestUtil.getInstance().newOrcaClientStreamTracerFactory(
new OrcaPerRequestUtil.OrcaPerRequestReportListener() {
@Override
public void onLoadReport(OrcaLoadReport orcaLoadReport) {
System.out.println("Example load balancer received per-rpc metrics report:\n"
+ orcaLoadReport);
}
}));
final OrcaPerRequestUtil.OrcaPerRequestReportListener orcaListener =
new OrcaPerRequestUtil.OrcaPerRequestReportListener() {
@Override
public void onLoadReport(MetricReport orcaLoadReport) {
System.out.println("Example load balancer received per-rpc metrics report:\n"
+ orcaLoadReport);
}
};
if (result.getStreamTracerFactory() == null) {
return LoadBalancer.PickResult.withSubchannel(
result.getSubchannel(),
OrcaPerRequestUtil.getInstance().newOrcaClientStreamTracerFactory(orcaListener));
} else {
return LoadBalancer.PickResult.withSubchannel(
result.getSubchannel(),
OrcaPerRequestUtil.getInstance().newOrcaClientStreamTracerFactory(
result.getStreamTracerFactory(), orcaListener));
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,21 @@

package io.grpc.examples.orca;

import com.google.common.collect.ImmutableMap;
import io.grpc.BindableService;
import io.grpc.examples.helloworld.GreeterGrpc;
import io.grpc.examples.helloworld.HelloReply;
import io.grpc.examples.helloworld.HelloRequest;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.services.CallMetricRecorder;
import io.grpc.services.InternalCallMetricRecorder;
import io.grpc.services.MetricRecorder;
import io.grpc.stub.StreamObserver;
import io.grpc.xds.orca.OrcaMetricReportingServerInterceptor;
import io.grpc.xds.orca.OrcaServiceImpl;
import io.grpc.xds.shaded.com.github.xds.data.orca.v3.OrcaLoadReport;
import java.io.IOException;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
Expand Down Expand Up @@ -108,29 +110,30 @@ class GreeterImpl extends GreeterGrpc.GreeterImplBase {
@Override
public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
OrcaLoadReport randomPerRpcMetrics = OrcaLoadReport.newBuilder()
.setCpuUtilization(random.nextDouble())
.setMemUtilization(random.nextDouble())
.putUtilization("util", random.nextDouble())
.putRequestCost("cost", random.nextDouble())
.build();
double cpuUtilization = random.nextDouble();
double memoryUtilization = random.nextDouble();
Map<String, Double> utilization = ImmutableMap.of("util", random.nextDouble());
Map<String, Double> requestCost = ImmutableMap.of("cost", random.nextDouble());
// Sets per-query backend metrics to a random test report.
CallMetricRecorder.getCurrent()
.recordMemoryUtilizationMetric(randomPerRpcMetrics.getMemUtilization())
.recordCallMetric("cost", randomPerRpcMetrics.getRequestCostOrDefault("cost", 0.0))
.recordUtilizationMetric("util", randomPerRpcMetrics.getUtilizationOrDefault("util", 0.0));
System.out.println("Hello World Server updates RPC metrics data:\n" + randomPerRpcMetrics);
.recordCpuUtilizationMetric(cpuUtilization)
.recordMemoryUtilizationMetric(memoryUtilization)
.recordCallMetric("cost", requestCost.get("cost"))
.recordUtilizationMetric("util", utilization.get("util"));
System.out.println(String.format("Hello World Server updates RPC metrics data:\n" +
"cpu: %s, memory: %s, request cost: %s, utilization: %s\n",
cpuUtilization, memoryUtilization, requestCost, utilization));

OrcaLoadReport randomOobMetrics = OrcaLoadReport.newBuilder()
.setCpuUtilization(random.nextDouble())
.setMemUtilization(random.nextDouble())
.putUtilization("util", random.nextDouble())
.build();
cpuUtilization = random.nextDouble();
memoryUtilization = random.nextDouble();
utilization = ImmutableMap.of("util", random.nextDouble());
// Sets OOB backend metrics to a random test report.
metricRecorder.setCpuUtilizationMetric(randomOobMetrics.getCpuUtilization());
metricRecorder.setMemoryUtilizationMetric(randomOobMetrics.getMemUtilization());
metricRecorder.setAllUtilizationMetrics(randomOobMetrics.getUtilizationMap());
System.out.println("Hello World Server updates OOB metrics data:\n" + randomOobMetrics);
metricRecorder.setCpuUtilizationMetric(cpuUtilization);
metricRecorder.setMemoryUtilizationMetric(memoryUtilization);
metricRecorder.setAllUtilizationMetrics(utilization);
System.out.println(String.format("Hello World Server updates OOB metrics data:\n" +
"cpu: %s, memory: %s, utilization: %s\n",
cpuUtilization, memoryUtilization, utilization));
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@
import static io.grpc.testing.integration.AbstractInteropTest.ORCA_OOB_REPORT_KEY;
import static io.grpc.testing.integration.AbstractInteropTest.ORCA_RPC_REPORT_KEY;

import com.github.xds.data.orca.v3.OrcaLoadReport;
import io.grpc.ConnectivityState;
import io.grpc.LoadBalancer;
import io.grpc.LoadBalancerProvider;
import io.grpc.LoadBalancerRegistry;
import io.grpc.services.MetricReport;
import io.grpc.testing.integration.Messages.TestOrcaReport;
import io.grpc.util.ForwardingLoadBalancer;
import io.grpc.util.ForwardingLoadBalancerHelper;
Expand Down Expand Up @@ -87,8 +87,8 @@ public Subchannel createSubchannel(CreateSubchannelArgs args) {
Subchannel subchannel = super.createSubchannel(args);
OrcaOobUtil.setListener(subchannel, new OrcaOobUtil.OrcaOobReportListener() {
@Override
public void onLoadReport(OrcaLoadReport orcaLoadReport) {
latestOobReport = fromOrcaLoadReport(orcaLoadReport);
public void onLoadReport(MetricReport orcaLoadReport) {
latestOobReport = fromCallMetricReport(orcaLoadReport);
}
},
OrcaOobUtil.OrcaReportingConfig.newBuilder()
Expand Down Expand Up @@ -133,22 +133,22 @@ public PickResult pickSubchannel(PickSubchannelArgs args) {
OrcaPerRequestUtil.getInstance().newOrcaClientStreamTracerFactory(
new OrcaPerRequestUtil.OrcaPerRequestReportListener() {
@Override
public void onLoadReport(OrcaLoadReport orcaLoadReport) {
public void onLoadReport(MetricReport callMetricReport) {
AtomicReference<TestOrcaReport> reportRef =
args.getCallOptions().getOption(ORCA_RPC_REPORT_KEY);
reportRef.set(fromOrcaLoadReport(orcaLoadReport));
reportRef.set(fromCallMetricReport(callMetricReport));
}
}));
}
}
}

private static TestOrcaReport fromOrcaLoadReport(OrcaLoadReport orcaLoadReport) {
private static TestOrcaReport fromCallMetricReport(MetricReport callMetricReport) {
return TestOrcaReport.newBuilder()
.setCpuUtilization(orcaLoadReport.getCpuUtilization())
.setMemoryUtilization(orcaLoadReport.getMemUtilization())
.putAllRequestCost(orcaLoadReport.getRequestCostMap())
.putAllUtilization(orcaLoadReport.getUtilizationMap())
.setCpuUtilization(callMetricReport.getCpuUtilization())
.setMemoryUtilization(callMetricReport.getMemoryUtilization())
.putAllRequestCost(callMetricReport.getRequestCostMetrics())
.putAllUtilization(callMetricReport.getUtilizationMetrics())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ private static void echoCallMetricsFromPayload(TestOrcaReport report) {
recorder.recordUtilizationMetric(entry.getKey(), entry.getValue());
}
for (Map.Entry<String, Double> entry : report.getRequestCostMap().entrySet()) {
recorder.recordCallMetric(entry.getKey(), entry.getValue());
recorder.recordRequestCostMetric(entry.getKey(), entry.getValue());
}
}

Expand Down
2 changes: 2 additions & 0 deletions services/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,13 @@ java_library(
srcs = [
"src/main/java/io/grpc/services/CallMetricRecorder.java",
"src/main/java/io/grpc/services/MetricRecorder.java",
"src/main/java/io/grpc/services/MetricReport.java",
],
deps = [
"//api",
"//context",
"@com_google_code_findbugs_jsr305//jar",
"@com_google_errorprone_error_prone_annotations//jar",
"@com_google_guava_guava//jar",
],
)
Expand Down
59 changes: 20 additions & 39 deletions services/src/main/java/io/grpc/services/CallMetricRecorder.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@

package io.grpc.services;

import static com.google.common.base.Preconditions.checkNotNull;

import com.google.common.annotations.VisibleForTesting;
import com.google.errorprone.annotations.InlineMe;
import io.grpc.Context;
import io.grpc.ExperimentalApi;
import java.util.Collections;
Expand Down Expand Up @@ -46,41 +45,6 @@ public final class CallMetricRecorder {
private double memoryUtilizationMetric = 0;
private volatile boolean disabled;

public static final class CallMetricReport {
private double cpuUtilization;
private double memoryUtilization;
private Map<String, Double> requestCostMetrics;
private Map<String, Double> utilizationMetrics;

/**
* Create a report for all backend metrics.
*/
CallMetricReport(double cpuUtilization, double memoryUtilization,
Map<String, Double> requestCostMetrics,
Map<String, Double> utilizationMetrics) {
this.cpuUtilization = cpuUtilization;
this.memoryUtilization = memoryUtilization;
this.requestCostMetrics = checkNotNull(requestCostMetrics, "requestCostMetrics");
this.utilizationMetrics = checkNotNull(utilizationMetrics, "utilizationMetrics");
}

public double getCpuUtilization() {
return cpuUtilization;
}

public double getMemoryUtilization() {
return memoryUtilization;
}

public Map<String, Double> getRequestCostMetrics() {
return requestCostMetrics;
}

public Map<String, Double> getUtilizationMetrics() {
return utilizationMetrics;
}
}

/**
* Returns the call metric recorder attached to the current {@link Context}. If there is none,
* returns a no-op recorder.
Expand Down Expand Up @@ -129,8 +93,25 @@ public CallMetricRecorder recordUtilizationMetric(String name, double value) {
*
* @return this recorder object
* @since 1.47.0
* @deprecated use {@link #recordRequestCostMetric} instead.
* This method will be removed in the future.
*/
@Deprecated
@InlineMe(replacement = "this.recordRequestCostMetric(name, value)")
public CallMetricRecorder recordCallMetric(String name, double value) {
return recordRequestCostMetric(name, value);
}

/**
* Records a call metric measurement for request cost.
* If RPC has already finished, this method is no-op.
*
* <p>A latter record will overwrite its former name-sakes.
*
* @return this recorder object
* @since 1.48.1
*/
public CallMetricRecorder recordRequestCostMetric(String name, double value) {
if (disabled) {
return this;
}
Expand Down Expand Up @@ -200,13 +181,13 @@ Map<String, Double> finalizeAndDump() {
*
* @return a per-request ORCA reports containing all saved metrics.
*/
CallMetricReport finalizeAndDump2() {
MetricReport finalizeAndDump2() {
Map<String, Double> savedRequestCostMetrics = finalizeAndDump();
Map<String, Double> savedUtilizationMetrics = utilizationMetrics.get();
if (savedUtilizationMetrics == null) {
savedUtilizationMetrics = Collections.emptyMap();
}
return new CallMetricReport(cpuUtilizationMetric,
return new MetricReport(cpuUtilizationMetric,
memoryUtilizationMetric, Collections.unmodifiableMap(savedRequestCostMetrics),
Collections.unmodifiableMap(savedUtilizationMetrics)
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,13 @@ public static Map<String, Double> finalizeAndDump(CallMetricRecorder recorder) {
return recorder.finalizeAndDump();
}

public static CallMetricRecorder.CallMetricReport finalizeAndDump2(CallMetricRecorder recorder) {
public static MetricReport finalizeAndDump2(CallMetricRecorder recorder) {
return recorder.finalizeAndDump2();
}

public static MetricReport createMetricReport(double cpuUtilization, double memoryUtilization,
Map<String, Double> requestCostMetrics, Map<String, Double> utilizationMetrics) {
return new MetricReport(cpuUtilization, memoryUtilization,
requestCostMetrics, utilizationMetrics);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public final class InternalMetricRecorder {
private InternalMetricRecorder() {
}

public static CallMetricRecorder.CallMetricReport getMetricReport(MetricRecorder recorder) {
public static MetricReport getMetricReport(MetricRecorder recorder) {
return recorder.getMetricReport();
}
}
4 changes: 2 additions & 2 deletions services/src/main/java/io/grpc/services/MetricRecorder.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ public void clearMemoryUtilizationMetric() {
memoryUtilization = 0;
}

CallMetricRecorder.CallMetricReport getMetricReport() {
return new CallMetricRecorder.CallMetricReport(cpuUtilization, memoryUtilization,
MetricReport getMetricReport() {
return new MetricReport(cpuUtilization, memoryUtilization,
Collections.emptyMap(), Collections.unmodifiableMap(metricsData));
}
}