12
12
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
13
# See the License for the specific language governing permissions and
14
14
# limitations under the License.
15
-
15
+ import collections
16
16
import logging
17
+ import typing
18
+ from enum import Enum , auto
17
19
from sys import intern
18
20
from typing import Callable , Dict , Optional , Sized
19
21
34
36
35
37
cache_size = Gauge ("synapse_util_caches_cache:size" , "" , ["name" ])
36
38
cache_hits = Gauge ("synapse_util_caches_cache:hits" , "" , ["name" ])
37
- cache_evicted = Gauge ("synapse_util_caches_cache:evicted_size" , "" , ["name" ])
39
+ cache_evicted = Gauge ("synapse_util_caches_cache:evicted_size" , "" , ["name" , "reason" ])
38
40
cache_total = Gauge ("synapse_util_caches_cache:total" , "" , ["name" ])
39
41
cache_max_size = Gauge ("synapse_util_caches_cache_max_size" , "" , ["name" ])
40
42
cache_memory_usage = Gauge (
46
48
response_cache_size = Gauge ("synapse_util_caches_response_cache:size" , "" , ["name" ])
47
49
response_cache_hits = Gauge ("synapse_util_caches_response_cache:hits" , "" , ["name" ])
48
50
response_cache_evicted = Gauge (
49
- "synapse_util_caches_response_cache:evicted_size" , "" , ["name" ]
51
+ "synapse_util_caches_response_cache:evicted_size" , "" , ["name" , "reason" ]
50
52
)
51
53
response_cache_total = Gauge ("synapse_util_caches_response_cache:total" , "" , ["name" ])
52
54
53
55
56
+ class EvictionReason (Enum ):
57
+ size = auto ()
58
+ time = auto ()
59
+
60
+
54
61
@attr .s (slots = True )
55
62
class CacheMetric :
56
63
@@ -61,7 +68,9 @@ class CacheMetric:
61
68
62
69
hits = attr .ib (default = 0 )
63
70
misses = attr .ib (default = 0 )
64
- evicted_size = attr .ib (default = 0 )
71
+ eviction_size_by_reason : typing .Counter [EvictionReason ] = attr .ib (
72
+ factory = collections .Counter
73
+ )
65
74
memory_usage = attr .ib (default = None )
66
75
67
76
def inc_hits (self ) -> None :
@@ -70,8 +79,8 @@ def inc_hits(self) -> None:
70
79
def inc_misses (self ) -> None :
71
80
self .misses += 1
72
81
73
- def inc_evictions (self , size : int = 1 ) -> None :
74
- self .evicted_size += size
82
+ def inc_evictions (self , reason : EvictionReason , size : int = 1 ) -> None :
83
+ self .eviction_size_by_reason [ reason ] += size
75
84
76
85
def inc_memory_usage (self , memory : int ) -> None :
77
86
if self .memory_usage is None :
@@ -94,14 +103,20 @@ def collect(self) -> None:
94
103
if self ._cache_type == "response_cache" :
95
104
response_cache_size .labels (self ._cache_name ).set (len (self ._cache ))
96
105
response_cache_hits .labels (self ._cache_name ).set (self .hits )
97
- response_cache_evicted .labels (self ._cache_name ).set (self .evicted_size )
106
+ for reason in EvictionReason :
107
+ response_cache_evicted .labels (self ._cache_name , reason .name ).set (
108
+ self .eviction_size_by_reason [reason ]
109
+ )
98
110
response_cache_total .labels (self ._cache_name ).set (
99
111
self .hits + self .misses
100
112
)
101
113
else :
102
114
cache_size .labels (self ._cache_name ).set (len (self ._cache ))
103
115
cache_hits .labels (self ._cache_name ).set (self .hits )
104
- cache_evicted .labels (self ._cache_name ).set (self .evicted_size )
116
+ for reason in EvictionReason :
117
+ cache_evicted .labels (self ._cache_name , reason .name ).set (
118
+ self .eviction_size_by_reason [reason ]
119
+ )
105
120
cache_total .labels (self ._cache_name ).set (self .hits + self .misses )
106
121
if getattr (self ._cache , "max_size" , None ):
107
122
cache_max_size .labels (self ._cache_name ).set (self ._cache .max_size )
0 commit comments