|
21 | 21 | import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.CLIENT_NAME_KEY;
|
22 | 22 | import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.CLUSTER_ID_KEY;
|
23 | 23 | import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.CONNECTIVITY_ERROR_COUNT_NAME;
|
| 24 | +import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.FIRST_RESPONSE_LATENCIES_NAME; |
24 | 25 | import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.METHOD_KEY;
|
25 | 26 | import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.OPERATION_LATENCIES_NAME;
|
26 | 27 | import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.RETRY_COUNT_NAME;
|
@@ -121,6 +122,7 @@ public class BuiltinMetricsTracerTest {
|
121 | 122 | private static final String TABLE = "fake-table";
|
122 | 123 |
|
123 | 124 | private static final String BAD_TABLE_ID = "non-exist-table";
|
| 125 | + private static final String FIRST_RESPONSE_TABLE_ID = "first-response"; |
124 | 126 | private static final String ZONE = "us-west-1";
|
125 | 127 | private static final String CLUSTER = "cluster-0";
|
126 | 128 | private static final long FAKE_SERVER_TIMING = 50;
|
@@ -305,6 +307,52 @@ public void testReadRowsOperationLatenciesOnAuthorizedView() {
|
305 | 307 | assertThat(value).isIn(Range.closed(SERVER_LATENCY, elapsed));
|
306 | 308 | }
|
307 | 309 |
|
| 310 | + @Test |
| 311 | + public void testFirstResponseLatencies() { |
| 312 | + Stopwatch firstResponseTimer = Stopwatch.createStarted(); |
| 313 | + stub.readRowsCallable() |
| 314 | + .call( |
| 315 | + Query.create(FIRST_RESPONSE_TABLE_ID), |
| 316 | + new ResponseObserver<Row>() { |
| 317 | + @Override |
| 318 | + public void onStart(StreamController controller) {} |
| 319 | + |
| 320 | + @Override |
| 321 | + public void onResponse(Row response) { |
| 322 | + // Server sends back 2 responses for this test |
| 323 | + if (firstResponseTimer.isRunning()) { |
| 324 | + firstResponseTimer.stop(); |
| 325 | + } |
| 326 | + try { |
| 327 | + Thread.sleep(100); |
| 328 | + } catch (InterruptedException e) { |
| 329 | + } |
| 330 | + } |
| 331 | + |
| 332 | + @Override |
| 333 | + public void onError(Throwable t) {} |
| 334 | + |
| 335 | + @Override |
| 336 | + public void onComplete() {} |
| 337 | + }); |
| 338 | + |
| 339 | + Attributes expectedAttributes = |
| 340 | + baseAttributes |
| 341 | + .toBuilder() |
| 342 | + .put(STATUS_KEY, "OK") |
| 343 | + .put(TABLE_ID_KEY, FIRST_RESPONSE_TABLE_ID) |
| 344 | + .put(ZONE_ID_KEY, ZONE) |
| 345 | + .put(CLUSTER_ID_KEY, CLUSTER) |
| 346 | + .put(METHOD_KEY, "Bigtable.ReadRows") |
| 347 | + .put(CLIENT_NAME_KEY, CLIENT_NAME) |
| 348 | + .build(); |
| 349 | + |
| 350 | + MetricData metricData = getMetricData(metricReader, FIRST_RESPONSE_LATENCIES_NAME); |
| 351 | + |
| 352 | + long value = getAggregatedValue(metricData, expectedAttributes); |
| 353 | + assertThat(value).isAtMost(firstResponseTimer.elapsed(TimeUnit.MILLISECONDS)); |
| 354 | + } |
| 355 | + |
308 | 356 | @Test
|
309 | 357 | public void testGfeMetrics() {
|
310 | 358 | Lists.newArrayList(stub.readRowsCallable().call(Query.create(TABLE)));
|
@@ -732,6 +780,12 @@ static List<ReadRowsResponse> createFakeResponse() {
|
732 | 780 | @Override
|
733 | 781 | public void readRows(
|
734 | 782 | ReadRowsRequest request, StreamObserver<ReadRowsResponse> responseObserver) {
|
| 783 | + if (request.getTableName().contains(FIRST_RESPONSE_TABLE_ID)) { |
| 784 | + responseObserver.onNext(source.next()); |
| 785 | + responseObserver.onNext(source.next()); |
| 786 | + responseObserver.onCompleted(); |
| 787 | + return; |
| 788 | + } |
735 | 789 | if (request.getTableName().contains(BAD_TABLE_ID)) {
|
736 | 790 | responseObserver.onError(new StatusRuntimeException(Status.NOT_FOUND));
|
737 | 791 | return;
|
|
0 commit comments