Skip to content

Commit c8db2f3

Browse files
committed
xds: Add client-side latency metrics for ext_proc HTTP filter
TAG=agy
1 parent cd72421 commit c8db2f3

19 files changed

Lines changed: 507 additions & 201 deletions

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

Lines changed: 209 additions & 63 deletions
Large diffs are not rendered by default.

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package io.grpc.xds;
1818

19-
import io.grpc.xds.Filter.FilterConfigParseContext;
20-
2119
import static com.google.common.base.Preconditions.checkNotNull;
2220
import static java.util.concurrent.TimeUnit.NANOSECONDS;
2321

@@ -47,6 +45,8 @@
4745
import io.grpc.internal.GrpcUtil;
4846
import io.grpc.xds.FaultConfig.FaultAbort;
4947
import io.grpc.xds.FaultConfig.FaultDelay;
48+
import io.grpc.xds.Filter.FilterConfigParseContext;
49+
import io.grpc.xds.Filter.FilterContext;
5050
import io.grpc.xds.ThreadSafeRandom.ThreadSafeRandomImpl;
5151
import java.util.Locale;
5252
import java.util.concurrent.Executor;
@@ -101,7 +101,7 @@ public boolean isClientFilter() {
101101
}
102102

103103
@Override
104-
public FaultFilter newInstance(String name) {
104+
public FaultFilter newInstance(FilterContext context) {
105105
return INSTANCE;
106106
}
107107

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.google.common.base.MoreObjects;
2222
import com.google.protobuf.Message;
2323
import io.grpc.ClientInterceptor;
24+
import io.grpc.MetricRecorder;
2425
import io.grpc.ServerInterceptor;
2526
import io.grpc.xds.client.Bootstrapper.BootstrapInfo;
2627
import io.grpc.xds.client.Bootstrapper.ServerInfo;
@@ -91,7 +92,7 @@ default boolean isServerFilter() {
9192
* <li>Filter name+typeUrl in FilterChain's HCM.http_filters.</li>
9293
* </ol>
9394
*/
94-
Filter newInstance(String name);
95+
Filter newInstance(FilterContext context);
9596

9697
/**
9798
* Parses the top-level filter config from raw proto message. The message may be either a {@link
@@ -152,6 +153,18 @@ abstract static class Builder {
152153
}
153154
}
154155

156+
/** Context containing naming and metrics reporting objects for a filter instance. */
157+
@AutoValue
158+
abstract static class FilterContext {
159+
abstract String filterName();
160+
161+
abstract MetricRecorder metricsRecorder();
162+
163+
static FilterContext create(String filterName, MetricRecorder metricsRecorder) {
164+
return new AutoValue_Filter_FilterContext(filterName, metricsRecorder);
165+
}
166+
}
167+
155168
/** Filter config with instance name. */
156169
final class NamedFilterConfig {
157170
// filter instance name

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package io.grpc.xds;
1818

19-
import io.grpc.xds.Filter.FilterConfigParseContext;
20-
2119
import static com.google.common.base.Preconditions.checkNotNull;
2220
import static io.grpc.xds.XdsNameResolver.CLUSTER_SELECTION_KEY;
2321
import static io.grpc.xds.XdsNameResolver.XDS_CONFIG_CALL_OPTION_KEY;
@@ -43,6 +41,8 @@
4341
import io.grpc.Status;
4442
import io.grpc.StatusOr;
4543
import io.grpc.auth.MoreCallCredentials;
44+
import io.grpc.xds.Filter.FilterConfigParseContext;
45+
import io.grpc.xds.Filter.FilterContext;
4646
import io.grpc.xds.GcpAuthenticationFilter.AudienceMetadataParser.AudienceWrapper;
4747
import io.grpc.xds.MetadataRegistry.MetadataValueParser;
4848
import io.grpc.xds.XdsConfig.XdsClusterConfig;
@@ -83,8 +83,8 @@ public boolean isClientFilter() {
8383
}
8484

8585
@Override
86-
public GcpAuthenticationFilter newInstance(String name) {
87-
return new GcpAuthenticationFilter(name, cacheSize);
86+
public GcpAuthenticationFilter newInstance(FilterContext context) {
87+
return new GcpAuthenticationFilter(context.filterName(), cacheSize);
8888
}
8989

9090
@Override

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.envoyproxy.envoy.extensions.filters.http.rbac.v3.RBAC;
2020
import io.grpc.Internal;
2121
import io.grpc.ServerInterceptor;
22+
import io.grpc.xds.Filter.FilterContext;
2223

2324
/** This class exposes some functionality in RbacFilter to other packages. */
2425
@Internal
@@ -33,7 +34,8 @@ public static ServerInterceptor createInterceptor(RBAC rbac) {
3334
throw new IllegalArgumentException(
3435
String.format("Failed to parse Rbac policy: %s", filterConfig.errorDetail));
3536
}
36-
return new RbacFilter.Provider().newInstance("internalRbacFilter")
37+
return new RbacFilter.Provider().newInstance(
38+
FilterContext.create("internalRbacFilter", new io.grpc.MetricRecorder() {}))
3739
.buildServerInterceptor(filterConfig.config, null);
3840
}
3941
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package io.grpc.xds;
1818

19-
import io.grpc.xds.Filter.FilterConfigParseContext;
20-
2119
import static com.google.common.base.Preconditions.checkNotNull;
2220

2321
import com.google.protobuf.Any;
@@ -35,6 +33,8 @@
3533
import io.grpc.ServerCallHandler;
3634
import io.grpc.ServerInterceptor;
3735
import io.grpc.Status;
36+
import io.grpc.xds.Filter.FilterConfigParseContext;
37+
import io.grpc.xds.Filter.FilterContext;
3838
import io.grpc.xds.internal.MatcherParser;
3939
import io.grpc.xds.internal.Matchers;
4040
import io.grpc.xds.internal.rbac.engine.GrpcAuthorizationEngine;
@@ -91,7 +91,7 @@ public boolean isServerFilter() {
9191
}
9292

9393
@Override
94-
public RbacFilter newInstance(String name) {
94+
public RbacFilter newInstance(FilterContext context) {
9595
return INSTANCE;
9696
}
9797

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616

1717
package io.grpc.xds;
1818

19-
import io.grpc.xds.Filter.FilterConfigParseContext;
20-
2119
import com.google.protobuf.Message;
20+
import io.grpc.xds.Filter.FilterConfigParseContext;
21+
import io.grpc.xds.Filter.FilterContext;
2222

2323
/**
2424
* Router filter implementation. Currently this filter does not parse any field in the config.
@@ -58,7 +58,7 @@ public boolean isServerFilter() {
5858
}
5959

6060
@Override
61-
public RouterFilter newInstance(String name) {
61+
public RouterFilter newInstance(FilterContext context) {
6262
return INSTANCE;
6363
}
6464

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package io.grpc.xds;
1818

19-
import io.grpc.xds.Filter.FilterConfigParseContext;
20-
2119
import static com.google.common.base.Preconditions.checkNotNull;
2220
import static io.grpc.xds.XdsClusterResource.validateCommonTlsContext;
2321
import static io.grpc.xds.XdsRouteConfigureResource.extractVirtualHosts;
@@ -620,7 +618,7 @@ static StructOrError<Filter.FilterConfig> parseHttpFilter(
620618
isForClient ? "client" : "server"));
621619
}
622620

623-
FilterConfigParseContext filterContext = FilterConfigParseContext.builder()
621+
Filter.FilterConfigParseContext filterContext = Filter.FilterConfigParseContext.builder()
624622
.bootstrapInfo(args.getBootstrapInfo())
625623
.serverInfo(args.getServerInfo())
626624
.build();

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import io.grpc.internal.ObjectPool;
5252
import io.grpc.xds.ClusterSpecifierPlugin.PluginConfig;
5353
import io.grpc.xds.Filter.FilterConfig;
54+
import io.grpc.xds.Filter.FilterContext;
5455
import io.grpc.xds.Filter.NamedFilterConfig;
5556
import io.grpc.xds.RouteLookupServiceClusterSpecifierPlugin.RlsPluginConfig;
5657
import io.grpc.xds.ThreadSafeRandom.ThreadSafeRandomImpl;
@@ -121,7 +122,6 @@ final class XdsNameResolver extends NameResolver {
121122
private final ThreadSafeRandom random;
122123
private final FilterRegistry filterRegistry;
123124
private final XxHash64 hashFunc = XxHash64.INSTANCE;
124-
// Clusters (with reference counts) to which new/existing requests can be/are routed.
125125
// put()/remove() must be called in SyncContext, and get() can be called in any thread.
126126
private final ConcurrentMap<String, ClusterRefState> clusterRefs = new ConcurrentHashMap<>();
127127
private final ConfigSelector configSelector = new ConfigSelector();
@@ -138,6 +138,7 @@ final class XdsNameResolver extends NameResolver {
138138
private CallCounterProvider callCounterProvider;
139139
private ResolveState resolveState;
140140

141+
141142
/**
142143
* Constructs a new instance.
143144
*
@@ -742,7 +743,9 @@ private void updateActiveFilters(@Nullable List<NamedFilterConfig> filterConfigs
742743
Filter.Provider provider = filterRegistry.get(typeUrl);
743744
checkNotNull(provider, "provider %s", typeUrl);
744745
Filter filter = activeFilters.computeIfAbsent(
745-
filterKey, k -> provider.newInstance(namedFilter.name));
746+
filterKey, k -> provider.newInstance(
747+
FilterContext.create(
748+
namedFilter.name, nameResolverArgs.getMetricRecorder())));
746749
checkNotNull(filter, "filter %s", filterKey);
747750
filtersToShutdown.remove(filterKey);
748751
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package io.grpc.xds;
1818

19-
import io.grpc.xds.Filter.FilterConfigParseContext;
20-
2119
import static com.google.common.base.Preconditions.checkNotNull;
2220

2321
import com.github.udpa.udpa.type.v1.TypedStruct;
@@ -214,7 +212,7 @@ private static StructOrError<VirtualHost> parseVirtualHost(
214212
static StructOrError<Map<String, FilterConfig>> parseOverrideFilterConfigs(
215213
Map<String, Any> rawFilterConfigMap, FilterRegistry filterRegistry,
216214
XdsResourceType.Args args) {
217-
FilterConfigParseContext context = FilterConfigParseContext.builder()
215+
Filter.FilterConfigParseContext context = Filter.FilterConfigParseContext.builder()
218216
.bootstrapInfo(args.getBootstrapInfo())
219217
.serverInfo(args.getServerInfo())
220218
.build();

0 commit comments

Comments
 (0)