Skip to content

Commit ef7bfcd

Browse files
committed
Rebase grpc#2
1 parent d085aca commit ef7bfcd

File tree

11 files changed

+692
-752
lines changed

11 files changed

+692
-752
lines changed

api/src/main/java/io/grpc/NameResolver.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -564,8 +564,6 @@ public Builder setOverrideAuthority(String authority) {
564564

565565
/**
566566
* See {@link Args#getMetricRecorder()}. This is an optional field.
567-
*
568-
* @since 1.67.0
569567
*/
570568
@ExperimentalApi("Insert github issue")
571569
public Builder setMetricRecorder(MetricRecorder metricRecorder) {

api/src/test/java/io/grpc/NameResolverTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public class NameResolverTest {
6464
private final ChannelLogger channelLogger = mock(ChannelLogger.class);
6565
private final Executor executor = Executors.newSingleThreadExecutor();
6666
private final String overrideAuthority = "grpc.io";
67+
private final MetricRecorder metricRecorder = new MetricRecorder() {};
6768
@Mock NameResolver.Listener mockListener;
6869

6970
@Test
@@ -77,6 +78,7 @@ public void args() {
7778
assertThat(args.getChannelLogger()).isSameInstanceAs(channelLogger);
7879
assertThat(args.getOffloadExecutor()).isSameInstanceAs(executor);
7980
assertThat(args.getOverrideAuthority()).isSameInstanceAs(overrideAuthority);
81+
assertThat(args.getMetricRecorder()).isSameInstanceAs(metricRecorder);
8082

8183
NameResolver.Args args2 = args.toBuilder().build();
8284
assertThat(args2.getDefaultPort()).isEqualTo(defaultPort);
@@ -87,6 +89,7 @@ public void args() {
8789
assertThat(args2.getChannelLogger()).isSameInstanceAs(channelLogger);
8890
assertThat(args2.getOffloadExecutor()).isSameInstanceAs(executor);
8991
assertThat(args2.getOverrideAuthority()).isSameInstanceAs(overrideAuthority);
92+
assertThat(args.getMetricRecorder()).isSameInstanceAs(metricRecorder);
9093

9194
assertThat(args2).isNotSameInstanceAs(args);
9295
assertThat(args2).isNotEqualTo(args);
@@ -102,6 +105,7 @@ private NameResolver.Args createArgs() {
102105
.setChannelLogger(channelLogger)
103106
.setOffloadExecutor(executor)
104107
.setOverrideAuthority(overrideAuthority)
108+
.setMetricRecorder(metricRecorder)
105109
.build();
106110
}
107111

core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,30 @@ public void metricRecorder_recordsToMetricSink() {
687687
eq(optionalLabelValues));
688688
}
689689

690+
@Test
691+
public void metricRecorder_fromNameResolverArgs_recordsToMetricSink() {
692+
MetricSink mockSink1 = mock(MetricSink.class);
693+
MetricSink mockSink2 = mock(MetricSink.class);
694+
channelBuilder.addMetricSink(mockSink1);
695+
channelBuilder.addMetricSink(mockSink2);
696+
createChannel();
697+
698+
LongCounterMetricInstrument counter = metricInstrumentRegistry.registerLongCounter(
699+
"test_counter", "Time taken by metric recorder", "s",
700+
ImmutableList.of("grpc.method"), Collections.emptyList(), false);
701+
List<String> requiredLabelValues = ImmutableList.of("testMethod");
702+
List<String> optionalLabelValues = Collections.emptyList();
703+
704+
NameResolver.Args args = helper.getNameResolverArgs();
705+
assertThat(args.getMetricRecorder()).isNotNull();
706+
args.getMetricRecorder()
707+
.addLongCounter(counter, 10, requiredLabelValues, optionalLabelValues);
708+
verify(mockSink1).addLongCounter(eq(counter), eq(10L), eq(requiredLabelValues),
709+
eq(optionalLabelValues));
710+
verify(mockSink2).addLongCounter(eq(counter), eq(10L), eq(requiredLabelValues),
711+
eq(optionalLabelValues));
712+
}
713+
690714
@Test
691715
public void shutdownWithNoTransportsEverCreated() {
692716
channelBuilder.nameResolverFactory(
@@ -2240,6 +2264,7 @@ public void lbHelper_getNameResolverArgs() {
22402264
assertThat(args.getSynchronizationContext())
22412265
.isSameInstanceAs(helper.getSynchronizationContext());
22422266
assertThat(args.getServiceConfigParser()).isNotNull();
2267+
assertThat(args.getMetricRecorder()).isNotNull();
22432268
}
22442269

22452270
@Test

xds/src/main/java/io/grpc/xds/SharedXdsClientPoolProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ public ImmutableList<String> getTargets() {
124124
return ImmutableList.copyOf(targetToXdsClientMap.keySet());
125125
}
126126

127+
@VisibleForTesting
128+
MetricRecorder getMetricRecorder(String target) {
129+
return targetToMetricRecorderMap.get(target);
130+
}
131+
127132

128133
private static class SharedXdsClientPoolProviderHolder {
129134
private static final SharedXdsClientPoolProvider instance = new SharedXdsClientPoolProvider();

xds/src/main/java/io/grpc/xds/XdsClientMetricReporterImpl.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ public class XdsClientMetricReporterImpl implements XdsClientMetricReporter {
5353
private Registration gaugeRegistration = null;
5454
@Nullable
5555
private XdsClient xdsClient = null;
56+
@Nullable
57+
private CallbackMetricReporter callbackMetricReporter = null;
5658

5759
static {
5860
MetricInstrumentRegistry metricInstrumentRegistry
@@ -129,12 +131,18 @@ public void accept(BatchRecorder recorder) {
129131

130132
@VisibleForTesting
131133
void reportCallbackMetrics(BatchRecorder recorder) {
132-
CallbackMetricReporter callbackMetricReporter = new CallbackMetricReporterImpl(recorder);
134+
if (callbackMetricReporter == null) {
135+
// Instantiate only if not injected
136+
callbackMetricReporter = new CallbackMetricReporterImpl(recorder);
137+
}
133138
try {
134139
reportResourceCounts(callbackMetricReporter);
135140
reportServerConnections(callbackMetricReporter);
136141
} catch (Exception e) {
137-
logger.log(Level.WARNING, "Reporting gauge metrics failed", e);
142+
if (e instanceof InterruptedException) {
143+
Thread.currentThread().interrupt(); // re-set the current thread's interruption state
144+
}
145+
logger.log(Level.WARNING, "Failed to report gauge metrics", e);
138146
}
139147
}
140148

@@ -147,7 +155,7 @@ void reportResourceCounts(CallbackMetricReporter callbackMetricReporter) throws
147155
SettableFuture<Void> ret = this.xdsClient.reportResourceCounts(
148156
callbackMetricReporter);
149157
// Normally this shouldn't take long, but adding a timeout to avoid indefinite blocking
150-
ret.get(5, TimeUnit.SECONDS);
158+
Void unused = ret.get(5, TimeUnit.SECONDS);
151159
}
152160

153161
/**
@@ -158,7 +166,15 @@ void reportResourceCounts(CallbackMetricReporter callbackMetricReporter) throws
158166
void reportServerConnections(CallbackMetricReporter callbackMetricReporter) throws Exception {
159167
SettableFuture<Void> ret = this.xdsClient.reportServerConnections(callbackMetricReporter);
160168
// Normally this shouldn't take long, but adding a timeout to avoid indefinite blocking
161-
ret.get(5, TimeUnit.SECONDS);
169+
Void unused = ret.get(5, TimeUnit.SECONDS);
170+
}
171+
172+
/**
173+
* Allows injecting a custom {@link CallbackMetricReporter} for testing purposes.
174+
*/
175+
@VisibleForTesting
176+
void injectCallbackMetricReporter(CallbackMetricReporter reporter) {
177+
this.callbackMetricReporter = reporter;
162178
}
163179

164180
@VisibleForTesting

xds/src/main/java/io/grpc/xds/XdsNameResolver.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ final class XdsNameResolver extends NameResolver {
143143
ServiceConfigParser serviceConfigParser,
144144
SynchronizationContext syncContext, ScheduledExecutorService scheduler,
145145
@Nullable Map<String, ?> bootstrapOverride,
146-
@Nullable MetricRecorder metricRecorder) {
146+
MetricRecorder metricRecorder) {
147147
this(targetUri, targetUri.getAuthority(), name, overrideAuthority, serviceConfigParser,
148148
syncContext, scheduler, SharedXdsClientPoolProvider.getDefaultProvider(),
149149
ThreadSafeRandomImpl.instance, FilterRegistry.getDefaultRegistry(), bootstrapOverride,
@@ -157,7 +157,7 @@ final class XdsNameResolver extends NameResolver {
157157
SynchronizationContext syncContext, ScheduledExecutorService scheduler,
158158
XdsClientPoolFactory xdsClientPoolFactory, ThreadSafeRandom random,
159159
FilterRegistry filterRegistry, @Nullable Map<String, ?> bootstrapOverride,
160-
@Nullable MetricRecorder metricRecorder) {
160+
MetricRecorder metricRecorder) {
161161
this.targetAuthority = targetAuthority;
162162
target = targetUri.toString();
163163

xds/src/main/java/io/grpc/xds/client/XdsClientImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -547,8 +547,8 @@ public SettableFuture<Void> reportServerConnections(
547547
controlPlaneClient.hasWorkingAdsStream() ? 1 : 0,
548548
target,
549549
serverInfo.target()));
550-
future.set(null);
551550
});
551+
future.set(null);
552552
return future;
553553
}
554554

@@ -559,8 +559,8 @@ public SettableFuture<Void> reportResourceCounts(CallbackMetricReporter callback
559559
Map<XdsResourceType<?>, Map<String, Long>> resourceCountsByType =
560560
getResourceCountsByType();
561561
reportResourceCountsToCallback(callbackMetricReporter, resourceCountsByType);
562-
future.set(null);
563562
});
563+
future.set(null);
564564
return future;
565565
}
566566

@@ -571,7 +571,7 @@ private String cacheStateFromResourceStatus(ResourceMetadata metadata, boolean i
571571
}
572572

573573
/**
574-
* Calculates resource counts by ResourceType and ResourceSubscriber.metadata.status
574+
* Calculates number of resources by ResourceType and ResourceSubscriber.metadata.status
575575
*/
576576
Map<XdsResourceType<?>, Map<String, Long>> getResourceCountsByType() {
577577
Map<XdsResourceType<?>, Map<String, Long>> resourceCountsByType = new HashMap<>();

0 commit comments

Comments
 (0)