Skip to content

Commit 6119f6e

Browse files
authored
services: add qps in orca api (#9866)
1 parent fb70a66 commit 6119f6e

File tree

9 files changed

+68
-15
lines changed

9 files changed

+68
-15
lines changed

repositories.bzl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,10 @@ def grpc_java_repositories():
9595
if not native.existing_rule("com_github_cncf_xds"):
9696
http_archive(
9797
name = "com_github_cncf_xds",
98-
strip_prefix = "xds-d92e9ce0af512a73a3a126b32fa4920bee12e180",
99-
sha256 = "27be88b1ff2844885d3b2d0d579546f3a8b3f26b4871eed89082c9709e49a4bd",
98+
strip_prefix = "xds-06c439db220b89134a8a49bad41994560d6537c6",
99+
sha256 = "41ea212940ab44bf7f8a8b4169cfbc612ed2166dafabc0a56a8820ef665fc6a4",
100100
urls = [
101-
"https://github.com/cncf/xds/archive/d92e9ce0af512a73a3a126b32fa4920bee12e180.tar.gz",
101+
"https://github.com/cncf/xds/archive/06c439db220b89134a8a49bad41994560d6537c6.tar.gz",
102102
],
103103
)
104104
if not native.existing_rule("com_github_grpc_grpc"):

services/src/main/java/io/grpc/services/CallMetricRecorder.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public final class CallMetricRecorder {
4343
new AtomicReference<>();
4444
private double cpuUtilizationMetric = 0;
4545
private double memoryUtilizationMetric = 0;
46+
private double qps = 0;
4647
private volatile boolean disabled;
4748

4849
/**
@@ -158,6 +159,23 @@ public CallMetricRecorder recordMemoryUtilizationMetric(double value) {
158159
return this;
159160
}
160161

162+
/**
163+
* Records a call metric measurement for qps.
164+
* If RPC has already finished, this method is no-op.
165+
*
166+
* <p>A latter record will overwrite its former name-sakes.
167+
*
168+
* @return this recorder object
169+
* @since 1.54.0
170+
*/
171+
public CallMetricRecorder recordQpsMetric(double value) {
172+
if (disabled) {
173+
return this;
174+
}
175+
qps = value;
176+
return this;
177+
}
178+
161179

162180
/**
163181
* Returns all request cost metric values. No more metric values will be recorded after this
@@ -187,8 +205,8 @@ MetricReport finalizeAndDump2() {
187205
if (savedUtilizationMetrics == null) {
188206
savedUtilizationMetrics = Collections.emptyMap();
189207
}
190-
return new MetricReport(cpuUtilizationMetric,
191-
memoryUtilizationMetric, Collections.unmodifiableMap(savedRequestCostMetrics),
208+
return new MetricReport(cpuUtilizationMetric, memoryUtilizationMetric, qps,
209+
Collections.unmodifiableMap(savedRequestCostMetrics),
192210
Collections.unmodifiableMap(savedUtilizationMetrics)
193211
);
194212
}

services/src/main/java/io/grpc/services/InternalCallMetricRecorder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ public static MetricReport finalizeAndDump2(CallMetricRecorder recorder) {
4646
}
4747

4848
public static MetricReport createMetricReport(double cpuUtilization, double memoryUtilization,
49-
Map<String, Double> requestCostMetrics, Map<String, Double> utilizationMetrics) {
50-
return new MetricReport(cpuUtilization, memoryUtilization,
51-
requestCostMetrics, utilizationMetrics);
49+
double qps, Map<String, Double> requestCostMetrics, Map<String, Double> utilizationMetrics) {
50+
return new MetricReport(cpuUtilization, memoryUtilization, qps, requestCostMetrics,
51+
utilizationMetrics);
5252
}
5353
}

services/src/main/java/io/grpc/services/MetricRecorder.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public final class MetricRecorder {
3030
private volatile ConcurrentHashMap<String, Double> metricsData = new ConcurrentHashMap<>();
3131
private volatile double cpuUtilization;
3232
private volatile double memoryUtilization;
33+
private volatile double qps;
3334

3435
public static MetricRecorder newInstance() {
3536
return new MetricRecorder();
@@ -86,8 +87,22 @@ public void clearMemoryUtilizationMetric() {
8687
memoryUtilization = 0;
8788
}
8889

90+
/**
91+
* Update the QPS metrics data.
92+
*/
93+
public void setQps(double value) {
94+
qps = value;
95+
}
96+
97+
/**
98+
* Clear the QPS metrics data.
99+
*/
100+
public void clearQps() {
101+
qps = 0;
102+
}
103+
89104
MetricReport getMetricReport() {
90-
return new MetricReport(cpuUtilization, memoryUtilization,
105+
return new MetricReport(cpuUtilization, memoryUtilization, qps,
91106
Collections.emptyMap(), Collections.unmodifiableMap(metricsData));
92107
}
93108
}

services/src/main/java/io/grpc/services/MetricReport.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,16 @@
3030
public final class MetricReport {
3131
private double cpuUtilization;
3232
private double memoryUtilization;
33+
private double qps;
3334
private Map<String, Double> requestCostMetrics;
3435
private Map<String, Double> utilizationMetrics;
3536

36-
MetricReport(double cpuUtilization, double memoryUtilization,
37-
Map<String, Double> requestCostMetrics,
38-
Map<String, Double> utilizationMetrics) {
37+
MetricReport(double cpuUtilization, double memoryUtilization, double qps,
38+
Map<String, Double> requestCostMetrics,
39+
Map<String, Double> utilizationMetrics) {
3940
this.cpuUtilization = cpuUtilization;
4041
this.memoryUtilization = memoryUtilization;
42+
this.qps = qps;
4143
this.requestCostMetrics = checkNotNull(requestCostMetrics, "requestCostMetrics");
4244
this.utilizationMetrics = checkNotNull(utilizationMetrics, "utilizationMetrics");
4345
}
@@ -58,13 +60,18 @@ public Map<String, Double> getUtilizationMetrics() {
5860
return utilizationMetrics;
5961
}
6062

63+
public double getQps() {
64+
return qps;
65+
}
66+
6167
@Override
6268
public String toString() {
6369
return MoreObjects.toStringHelper(this)
6470
.add("cpuUtilization", cpuUtilization)
6571
.add("memoryUtilization", memoryUtilization)
6672
.add("requestCost", requestCostMetrics)
6773
.add("utilization", utilizationMetrics)
74+
.add("qps", qps)
6875
.toString();
6976
}
7077
}

services/src/test/java/io/grpc/services/CallMetricRecorderTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public void dumpDumpsAllSavedMetricValues() {
4646
recorder.recordRequestCostMetric("cost3", 1.0);
4747
recorder.recordCpuUtilizationMetric(0.1928);
4848
recorder.recordMemoryUtilizationMetric(47.4);
49+
recorder.recordQpsMetric(2522.54);
4950

5051
MetricReport dump = recorder.finalizeAndDump2();
5152
Truth.assertThat(dump.getUtilizationMetrics())
@@ -54,6 +55,7 @@ public void dumpDumpsAllSavedMetricValues() {
5455
.containsExactly("cost1", 37465.12, "cost2", 10293.0, "cost3", 1.0);
5556
Truth.assertThat(dump.getCpuUtilization()).isEqualTo(0.1928);
5657
Truth.assertThat(dump.getMemoryUtilization()).isEqualTo(47.4);
58+
Truth.assertThat(dump.getQps()).isEqualTo(2522.54);
5759
}
5860

5961
@Test
@@ -75,6 +77,8 @@ public void lastValueWinForMetricsWithSameName() {
7577
recorder.recordUtilizationMetric("util1", 28374.21);
7678
recorder.recordMemoryUtilizationMetric(9384.0);
7779
recorder.recordUtilizationMetric("util1", 84323.3);
80+
recorder.recordQpsMetric(1928.3);
81+
recorder.recordQpsMetric(100.8);
7882

7983
MetricReport dump = recorder.finalizeAndDump2();
8084
Truth.assertThat(dump.getRequestCostMetrics())
@@ -83,6 +87,7 @@ public void lastValueWinForMetricsWithSameName() {
8387
Truth.assertThat(dump.getUtilizationMetrics())
8488
.containsExactly("util1", 84323.3);
8589
Truth.assertThat(dump.getCpuUtilization()).isEqualTo(0);
90+
Truth.assertThat(dump.getQps()).isEqualTo(100.8);
8691
}
8792

8893
@Test

xds/src/main/java/io/grpc/xds/orca/OrcaPerRequestUtil.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,8 @@ public void inboundTrailers(Metadata trailers) {
254254

255255
static MetricReport fromOrcaLoadReport(OrcaLoadReport loadReport) {
256256
return InternalCallMetricRecorder.createMetricReport(loadReport.getCpuUtilization(),
257-
loadReport.getMemUtilization(), loadReport.getRequestCostMap(),
258-
loadReport.getUtilizationMap());
257+
loadReport.getMemUtilization(), loadReport.getRpsFractional(),
258+
loadReport.getRequestCostMap(), loadReport.getUtilizationMap());
259259
}
260260

261261
/**

xds/src/main/java/io/grpc/xds/orca/OrcaServiceImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ private OrcaLoadReport generateMetricsReport() {
150150
InternalMetricRecorder.getMetricReport(metricRecorder);
151151
return OrcaLoadReport.newBuilder().setCpuUtilization(internalReport.getCpuUtilization())
152152
.setMemUtilization(internalReport.getMemoryUtilization())
153+
.setRpsFractional(internalReport.getQps())
153154
.putAllUtilization(internalReport.getUtilizationMetrics())
154155
.build();
155156
}

xds/src/test/java/io/grpc/xds/orca/OrcaServiceImplTest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,19 +143,23 @@ public void testRequestIntervalLess() {
143143
ClientCall<OrcaLoadReportRequest, OrcaLoadReport> call = channel.newCall(
144144
OpenRcaServiceGrpc.getStreamCoreMetricsMethod(), CallOptions.DEFAULT);
145145
defaultTestService.putUtilizationMetric("buffer", 0.2);
146+
defaultTestService.setQps(1.9);
146147
call.start(listener, new Metadata());
147148
call.sendMessage(OrcaLoadReportRequest.newBuilder()
148149
.setReportInterval(Duration.newBuilder().setSeconds(0).setNanos(500).build()).build());
149150
call.halfClose();
150151
call.request(1);
151-
OrcaLoadReport expect = OrcaLoadReport.newBuilder().putUtilization("buffer", 0.2).build();
152+
OrcaLoadReport expect = OrcaLoadReport.newBuilder().putUtilization("buffer", 0.2)
153+
.setRpsFractional(1.9).build();
152154
verify(listener).onMessage(eq(expect));
153155
reset(listener);
154156
defaultTestService.removeUtilizationMetric("buffer0");
157+
defaultTestService.clearQps();
155158
assertThat(fakeClock.forwardTime(500, TimeUnit.NANOSECONDS)).isEqualTo(0);
156159
verifyNoInteractions(listener);
157160
assertThat(fakeClock.forwardTime(1, TimeUnit.SECONDS)).isEqualTo(1);
158161
call.request(1);
162+
expect = OrcaLoadReport.newBuilder().putUtilization("buffer", 0.2).build();
159163
verify(listener).onMessage(eq(expect));
160164
}
161165

@@ -245,17 +249,20 @@ public void testApis() throws Exception {
245249
.setMemUtilization(random.nextDouble())
246250
.putAllUtilization(firstUtilization)
247251
.putUtilization("queue", 1.0)
252+
.setRpsFractional(1239.01)
248253
.build();
249254
defaultTestService.setCpuUtilizationMetric(goldenReport.getCpuUtilization());
250255
defaultTestService.setMemoryUtilizationMetric(goldenReport.getMemUtilization());
251256
defaultTestService.setAllUtilizationMetrics(firstUtilization);
252257
defaultTestService.putUtilizationMetric("queue", 1.0);
258+
defaultTestService.setQps(1239.01);
253259
Iterator<OrcaLoadReport> reports = OpenRcaServiceGrpc.newBlockingStub(channel)
254260
.streamCoreMetrics(OrcaLoadReportRequest.newBuilder().build());
255261
assertThat(reports.next()).isEqualTo(goldenReport);
256262

257263
defaultTestService.clearCpuUtilizationMetric();
258264
defaultTestService.clearMemoryUtilizationMetric();
265+
defaultTestService.clearQps();
259266
fakeClock.forwardTime(1, TimeUnit.SECONDS);
260267
goldenReport = OrcaLoadReport.newBuilder()
261268
.putAllUtilization(firstUtilization)

0 commit comments

Comments
 (0)