diff --git a/buildscripts/kokoro/unix.sh b/buildscripts/kokoro/unix.sh index a0c256ac3dd..cfa20e0f36a 100755 --- a/buildscripts/kokoro/unix.sh +++ b/buildscripts/kokoro/unix.sh @@ -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) diff --git a/examples/example-orca/src/main/java/io/grpc/examples/orca/CustomBackendMetricsLoadBalancerProvider.java b/examples/example-orca/src/main/java/io/grpc/examples/orca/CustomBackendMetricsLoadBalancerProvider.java index a63f86081ae..3a5e4f97a89 100644 --- a/examples/example-orca/src/main/java/io/grpc/examples/orca/CustomBackendMetricsLoadBalancerProvider.java +++ b/examples/example-orca/src/main/java/io/grpc/examples/orca/CustomBackendMetricsLoadBalancerProvider.java @@ -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; /** @@ -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); } @@ -129,7 +129,7 @@ public LoadBalancer.PickResult pickSubchannel(LoadBalancer.PickSubchannelArgs ar OrcaPerRequestUtil.getInstance().newOrcaClientStreamTracerFactory( new OrcaPerRequestUtil.OrcaPerRequestReportListener() { @Override - public void onLoadReport(OrcaLoadReport orcaLoadReport) { + public void onLoadReport(MetricReport orcaLoadReport) { System.out.println("Example load balancer received per-rpc metrics report:\n" + orcaLoadReport); } diff --git a/examples/example-orca/src/main/java/io/grpc/examples/orca/CustomBackendMetricsServer.java b/examples/example-orca/src/main/java/io/grpc/examples/orca/CustomBackendMetricsServer.java index 5216bed27ac..da76b3b5b2c 100644 --- a/examples/example-orca/src/main/java/io/grpc/examples/orca/CustomBackendMetricsServer.java +++ b/examples/example-orca/src/main/java/io/grpc/examples/orca/CustomBackendMetricsServer.java @@ -16,6 +16,7 @@ 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; @@ -23,12 +24,13 @@ 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; @@ -108,29 +110,30 @@ class GreeterImpl extends GreeterGrpc.GreeterImplBase { @Override public void sayHello(HelloRequest req, StreamObserver 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 utilization = ImmutableMap.of("util", random.nextDouble()); + Map 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(); } diff --git a/services/src/main/java/io/grpc/services/MetricReport.java b/services/src/main/java/io/grpc/services/MetricReport.java index 3b4ccf3e5f8..56ab150f8af 100644 --- a/services/src/main/java/io/grpc/services/MetricReport.java +++ b/services/src/main/java/io/grpc/services/MetricReport.java @@ -18,6 +18,7 @@ import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.MoreObjects; import io.grpc.ExperimentalApi; import java.util.Map; @@ -56,4 +57,14 @@ public Map getRequestCostMetrics() { public Map getUtilizationMetrics() { return utilizationMetrics; } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("cpuUtilization", cpuUtilization) + .add("memoryUtilization", memoryUtilization) + .add("requestCost", requestCostMetrics) + .add("utilization", utilizationMetrics) + .toString(); + } }