Dynamic Quota using custom attributes of API Product not working as expected

Hi

I am trying to use custom attributes from API Product in Quota Policy.

But it's giving below error

{
    "fault": {
        "faultstring": "Failed to resolve quota interval reference verifyapikey.Verify-API-Key.apiproduct.quotaInterval in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalReference"
        }
    }
}

Quota Policy looks like

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Quota async="false" continueOnError="false" enabled="true" name="Quota">
    <DisplayName>Quota</DisplayName>
    <FaultRules/>
    <Properties/>
    <!--
    <Interval>1</Interval>
    <TimeUnit>minute</TimeUnit>
    -->
    <Interval ref="verifyapikey.Verify-API-Key.apiproduct.quotaInterval"/>
    <TimeUnit ref="verifyapikey.Verify-API-Key.apiproduct.quotaTimeUnit"/>
    <Allow countRef="quota_limit_one"/>
    <Distributed>true</Distributed>
    <Synchronous>true</Synchronous>
    <PreciseAtSecondsLevel>false</PreciseAtSecondsLevel>
    <Identifier ref="request.queryparam.tenantId"/>
</Quota>

quotaInterval and quotatimeUnit are custom attributes in API Product.

Please let me know what is missing here.

Thanks

0 5 598
5 REPLIES 5

hi @GAURAV, i tried your code, only one change and it works fine, ref for Interval and TimeUnit for the Verify-API-Key should be the name of your verify api key, for e.g. in my case it is Verify-API-Key-1

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VerifyAPIKey async="false" continueOnError="false" enabled="true" name="Verify-API-Key-1">
    <DisplayName>Verify API Key-1</DisplayName>
    <Properties/>
    <APIKey ref="request.header.apikey"/>
</VerifyAPIKey>

so if you change your code with this;

...
    <Interval ref="verifyapikey.Verify-API-Key-1.apiproduct.quotaInterval"/>
    <TimeUnit ref="verifyapikey.Verify-API-Key-1.apiproduct.quotaTimeUnit"/>
...

you can also use Allow (also a custom variable) as countRef, like this;

<Allow countRef="verifyapikey.Verify-API-Key-1.apiproduct.quotaLimit"/>

here's my quota policy;

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Quota async="false" continueOnError="false" enabled="true" name="Quota">
    <DisplayName>Quota</DisplayName>
    <FaultRules/>
    <Properties/>
    <Interval ref="verifyapikey.Verify-API-Key-1.apiproduct.quotaInterval"/>
    <TimeUnit ref="verifyapikey.Verify-API-Key-1.apiproduct.quotaTimeUnit"/>
    <Allow countRef="verifyapikey.Verify-API-Key-1.apiproduct.quotaLimit"/>
    <Distributed>true</Distributed>
    <Synchronous>true</Synchronous>
    <PreciseAtSecondsLevel>false</PreciseAtSecondsLevel>
    <Identifier ref="request.header.apikey"/>
</Quota>

I hope it works for you, good luck!

I am using Verify-API-Key as the name of verify api key policy.

@GAURAV that's strange, could you please upload and share your proxy revision? I can have a look.

Hi @Gaurav, I am the same issue. I would like to check if you are able to resolve the issue, if so, how? Thank you.

Hi @GAURAV - I tried to replicate the issue you are facing. And was able to replicate this. when the reference doesn't reach to the quota policy. You should cross validates the following things -

1- check if somehow the <Identifierref="request.header.tanentId"/> is getting removed with AM policy before the quota policy.

2- validate the variable references in your verify api key policy on the trace use those. which looks similar as in the screenshot.

8961-screen-shot-2019-08-05-at-122750-pm.png

Also, I am attaching the policy I have implemented with custom attributes.

quotademo-with-apikey-rev2-2019-08-05.zip