27
27
import io .envoyproxy .envoy .extensions .filters .http .rate_limit_quota .v3 .RateLimitQuotaBucketSettings ;
28
28
import io .envoyproxy .envoy .extensions .filters .http .rate_limit_quota .v3 .RateLimitQuotaFilterConfig ;
29
29
import io .envoyproxy .envoy .extensions .filters .http .rate_limit_quota .v3 .RateLimitQuotaOverride ;
30
+ import io .grpc .InternalLogId ;
30
31
import io .grpc .Metadata ;
31
32
import io .grpc .ServerCall ;
32
33
import io .grpc .ServerCall .Listener ;
33
34
import io .grpc .ServerCallHandler ;
34
35
import io .grpc .ServerInterceptor ;
35
36
import io .grpc .internal .GrpcUtil ;
36
37
import io .grpc .xds .Filter .ServerInterceptorBuilder ;
38
+ import io .grpc .xds .client .XdsLogger ;
39
+ import io .grpc .xds .client .XdsLogger .XdsLogLevel ;
37
40
import io .grpc .xds .internal .datatype .GrpcService ;
38
41
import io .grpc .xds .internal .matchers .HttpMatchInput ;
39
42
import io .grpc .xds .internal .matchers .Matcher ;
53
56
final class RlqsFilter implements Filter , ServerInterceptorBuilder {
54
57
static final boolean enabled = GrpcUtil .getFlag ("GRPC_EXPERIMENTAL_XDS_ENABLE_RLQS" , false );
55
58
59
+ // TODO(sergiitk): [IMPL] remove
60
+ // Do do not fail on parsing errors, only log requests.
61
+ static final boolean dryRun = GrpcUtil .getFlag ("GRPC_EXPERIMENTAL_RLQS_DRY_RUN" , false );
62
+
56
63
static final RlqsFilter INSTANCE = new RlqsFilter ();
57
64
58
65
static final String TYPE_URL = "type.googleapis.com/"
@@ -62,6 +69,15 @@ final class RlqsFilter implements Filter, ServerInterceptorBuilder {
62
69
63
70
private final AtomicReference <RlqsCache > rlqsCache = new AtomicReference <>();
64
71
72
+ private final InternalLogId logId ;
73
+ private final XdsLogger logger ;
74
+
75
+ public RlqsFilter () {
76
+ logId = InternalLogId .allocate ("rlqs-filter" , null );
77
+ logger = XdsLogger .withLogId (logId );
78
+ logger .log (XdsLogLevel .INFO , "Created RLQS Filter with logId=" + logId );
79
+ }
80
+
65
81
@ Override
66
82
public String [] typeUrls () {
67
83
return new String []{TYPE_URL , TYPE_URL_OVERRIDE_CONFIG };
@@ -158,7 +174,15 @@ private ServerInterceptor generateRlqsInterceptor(RlqsFilterConfig config) {
158
174
@ Override
159
175
public <ReqT , RespT > Listener <ReqT > interceptCall (
160
176
ServerCall <ReqT , RespT > call , Metadata headers , ServerCallHandler <ReqT , RespT > next ) {
161
- RlqsRateLimitResult result = rlqsEngine .rateLimit (HttpMatchInput .create (headers , call ));
177
+ HttpMatchInput httpMatchInput = HttpMatchInput .create (headers , call );
178
+
179
+ // TODO(sergiitk): [IMPL] Remove
180
+ if (dryRun ) {
181
+ logger .log (XdsLogLevel .INFO , "RLQS DRY RUN: request <<" + httpMatchInput + ">>" );
182
+ return next .startCall (call , headers );
183
+ }
184
+
185
+ RlqsRateLimitResult result = rlqsEngine .rateLimit (httpMatchInput );
162
186
if (result .isAllowed ()) {
163
187
return next .startCall (call , headers );
164
188
}
@@ -170,7 +194,7 @@ public <ReqT, RespT> Listener<ReqT> interceptCall(
170
194
}
171
195
172
196
@ VisibleForTesting
173
- static RlqsFilterConfig parseRlqsFilter (RateLimitQuotaFilterConfig rlqsFilterProto )
197
+ RlqsFilterConfig parseRlqsFilter (RateLimitQuotaFilterConfig rlqsFilterProto )
174
198
throws ResourceInvalidException , InvalidProtocolBufferException {
175
199
RlqsFilterConfig .Builder builder = RlqsFilterConfig .builder ();
176
200
if (rlqsFilterProto .getDomain ().isEmpty ()) {
@@ -179,6 +203,12 @@ static RlqsFilterConfig parseRlqsFilter(RateLimitQuotaFilterConfig rlqsFilterPro
179
203
builder .domain (rlqsFilterProto .getDomain ())
180
204
.rlqsService (GrpcService .fromEnvoyProto (rlqsFilterProto .getRlqsServer ()));
181
205
206
+ // TODO(sergiitk): [IMPL] Remove
207
+ if (dryRun ) {
208
+ logger .log (XdsLogLevel .INFO , "RLQS DRY RUN: skipping matchers" );
209
+ return builder .build ();
210
+ }
211
+
182
212
// TODO(sergiitk): [IMPL] actually parse, move to RlqsBucketSettings.fromProto()
183
213
RateLimitQuotaBucketSettings fallbackBucketSettingsProto = unpackAny (
184
214
rlqsFilterProto .getBucketMatchers ().getOnNoMatch ().getAction ().getTypedConfig (),
0 commit comments