WARNING: The Edge Rate Limiting product must be enabled on your account by a Fastly employee in order to use the primitives described on this page.

A ratecounter stores entries that count increments against keys and uses these to estimate the rate at which each key is being incremented. Increments are collected into keyed buckets that represent overlapping and progressively longer periods of time. The ratecounter.{NAME}.bucket.60s reflects all increments in a 60s window that includes the current time, while ratecounter.{NAME}.bucket.10s only counts those that have occurred in the 10 second window that includes the current time. When an entry has received zero increments for the just-completed minute, and therefore all its buckets have a value of zero, they are deleted from the ratecounter.

Time windows are fixed and almost always incomplete. For example, if the current time is 12:01:03.458, then ratecounter.{NAME}.bucket.10s represents increments received between 12:00:54.000 and 12:01:03.458. That window will continue until the current time is 12:01:04.000, at which time the window starting time will change to 12:00:55.000. When the current time rolls over to a new whole second, the window starting time will advance by one second to ensure that the window size continues to represent the most recent 10 seconds.

The result of this behavior is that the 10s window contains a minimum of 9 seconds, and a maximum of 10 seconds, of increments. The same logic applies to the other window sizes.

Rate counters are a primitive that is used primarily in constructing rate limiting solutions.

Each ratecounter can contain up to 200,000 entries per site and, once that limit is reached, each new entry will evict the least recently incremented entry.

All the cache nodes within the site communicate with each other, sharing information about the counts in order to converge on a single value. Because of synchronization delays, the first time a ratecounter is used on a given cache node it will appear to have zero counts because it is not yet synchronized with the rest of the cache nodes in the site. Once synchronization is complete, the ratecounter will converge to an accurate value across the site.

Rate counters do not have any properties and should be declared as an empty block:

ratecounter requests_rate {
# no properties


The following functions operate on ratecounter instances:

The following variables provide current counts for ratecounter instances: