I just encountered what seems to be an issue with the rateLimiter interceptor.
I am using it in a serviceProxy to limit the number of requests that are passed on to a backend service which has a rate limit that must not be exceeded.
the backend complains that more than 10 requests per minute are arriving there.
I added a statistics interceptor to the proxy to check this, and found that the proxy indeed lets through more than 10 requests per minute. The rate limit does eventually kick in, but sometimes it takes as many as 15 requests in a minute before the interceptor rejects new requests.
I have included an excerpt from the statistics log below. When the first 429-response occurs, more than 10 requests were passed through in the previous minute. The second onset of 429-responses seems to be in order though.
I reviewed the source code for the interceptor and couldn't find anything suspicious there.
200;2017-06-22 14:29:36;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15343;637;
200;2017-06-22 14:29:46;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15056;214;
200;2017-06-22 14:29:57;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15533;796;
200;2017-06-22 14:30:08;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14985;301;
200;2017-06-22 14:30:11;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15346;223;
200;2017-06-22 14:30:18;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15592;238;
200;2017-06-22 14:30:19;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14396;924;
200;2017-06-22 14:30:30;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15260;198;
200;2017-06-22 14:30:31;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15300;632;
200;2017-06-22 14:30:40;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14945;318;
200;2017-06-22 14:30:41;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14996;331;
200;2017-06-22 14:30:43;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14550;904;
200;2017-06-22 14:30:49;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15444;267;
200;2017-06-22 14:30:52;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15567;315;
200;2017-06-22 14:30:52;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15119;1091;
200;2017-06-22 14:31:02;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15136;1013;
200;2017-06-22 14:31:03;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15564;241;
200;2017-06-22 14:31:04;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15564;0;
200;2017-06-22 14:31:12;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15311;491;
200;2017-06-22 14:31:13;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15203;317;
429;2017-06-22 14:31:14;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:31:15;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:31:20;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:31:23;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:31:24;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:31:25;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:31:34;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:31:35;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:31:35;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:31:37;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
200;2017-06-22 14:31:44;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15340;678;
200;2017-06-22 14:31:46;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14728;650;
200;2017-06-22 14:31:47;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14735;289;
200;2017-06-22 14:31:47;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14796;662;
200;2017-06-22 14:31:53;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14494;227;
200;2017-06-22 14:31:54;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14724;787;
200;2017-06-22 14:31:55;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15183;719;
200;2017-06-22 14:31:57;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;15578;253;
200;2017-06-22 14:31:58;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14611;1030;
200;2017-06-22 14:32:04;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;text/xml;14704;209;
429;2017-06-22 14:32:05;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:06;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:07;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:09;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:16;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:17;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:17;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:18;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:20;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:20;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:25;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:26;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:27;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:28;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:30;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:31;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:35;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:36;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:36;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:38;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:39;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;
429;2017-06-22 14:32:42;//svc:80;GET;q/data.xml;ip-000-00-0-000.internal;
example.com;;unknown;;109;0;