@@ -20,7 +20,7 @@ export type DeploymentRateLimitConfig = {
2020}
2121
2222export function createDeployRateLimiter (
23- components : Pick < AppComponents , 'logs' > ,
23+ components : Pick < AppComponents , 'logs' | 'metrics' > ,
2424 rateLimitConfig : DeploymentRateLimitConfig
2525) : IDeployRateLimiterComponent {
2626 const logs : ILoggerComponent . ILogger = components . logs . getLogger ( 'DeployRateLimiterComponent' )
@@ -35,6 +35,11 @@ export function createDeployRateLimiter(
3535 rateLimitConfig
3636 )
3737
38+ // Set static max size gauge for each entity type
39+ for ( const [ entityType , { maxSize } ] of deploymentCacheMap ) {
40+ components . metrics . observe ( 'dcl_content_rate_limiter_cache_max_size' , { entity_type : entityType } , maxSize )
41+ }
42+
3843 function getCacheFromEntityType ( entityType : EntityType ) : { cache : NodeCache ; maxSize : number } {
3944 const cache = deploymentCacheMap . get ( entityType )
4045 if ( ! cache ) {
@@ -57,28 +62,52 @@ export function createDeployRateLimiter(
5762 for ( const pointer of pointers ) {
5863 cacheByEntityType . cache . set ( pointer , localTimestamp )
5964 }
65+ components . metrics . observe (
66+ 'dcl_content_rate_limiter_cache_keys' ,
67+ { entity_type : entityType , cache_type : 'deployment' } ,
68+ cacheByEntityType . cache . stats . keys
69+ )
6070 } ,
6171
6272 /** Check if the entity should be rate limit: no deployment has been made for the same pointer in the last ttl
6373 * and no more than max size of deployments were made either */
6474 isRateLimited ( entityType : EntityType , pointers : string [ ] ) : boolean {
6575 const cacheByEntityType = getCacheFromEntityType ( entityType )
66- return (
67- pointers . some ( ( p ) => ! ! cacheByEntityType . cache . get ( p ) ) ||
68- cacheByEntityType . cache . stats . keys > cacheByEntityType . maxSize
69- )
76+ const ttlHit = pointers . some ( ( p ) => ! ! cacheByEntityType . cache . get ( p ) )
77+ const maxSizeHit = cacheByEntityType . cache . stats . keys > cacheByEntityType . maxSize
78+
79+ if ( ttlHit || maxSizeHit ) {
80+ components . metrics . increment ( 'dcl_content_rate_limited_deployments_total' , {
81+ entity_type : entityType ,
82+ reason : ttlHit ? 'ttl' : 'max_size'
83+ } )
84+ }
85+
86+ return ttlHit || maxSizeHit
7087 } ,
7188
7289 newUnchangedDeployment ( entityType : EntityType , pointers : string [ ] , localTimestamp : number ) : void {
7390 const cache = getUnchangedCacheFromEntityType ( entityType )
7491 for ( const pointer of pointers ) {
7592 cache . set ( pointer , localTimestamp )
7693 }
94+ components . metrics . observe (
95+ 'dcl_content_rate_limiter_cache_keys' ,
96+ { entity_type : entityType , cache_type : 'unchanged' } ,
97+ cache . stats . keys
98+ )
7799 } ,
78100
79101 isUnchangedDeploymentRateLimited ( entityType : EntityType , pointers : string [ ] ) : boolean {
80102 const cache = getUnchangedCacheFromEntityType ( entityType )
81- return pointers . some ( ( p ) => ! ! cache . get ( p ) )
103+ const limited = pointers . some ( ( p ) => ! ! cache . get ( p ) )
104+ if ( limited ) {
105+ components . metrics . increment ( 'dcl_content_rate_limited_deployments_total' , {
106+ entity_type : entityType ,
107+ reason : 'unchanged_ttl'
108+ } )
109+ }
110+ return limited
82111 }
83112 }
84113}
0 commit comments