@@ -70,3 +70,78 @@ def update_metadata(self):
7070 self .mc .add_bucket (bucket )
7171 for node in self .nodes :
7272 self .mc .add_server (node )
73+
74+
75+ class CBStatsAll (Collector ):
76+ COLLECTOR = "cbstats_all"
77+ CB_STATS_PORT = 11209
78+ METRICS = (
79+ "mem_used_secondary" ,
80+ "ep_magma_total_mem_used" ,
81+ "ep_magma_mem_used_diff"
82+ )
83+
84+ def __init__ (self , settings , test ):
85+ super ().__init__ (settings )
86+ extract_cb_any (filename = 'couchbase' )
87+ self .cluster_spec = test .cluster_spec
88+
89+ def _get_stats_from_server (self , bucket : str , server : str ):
90+ stats = {}
91+ try :
92+ result = get_cbstats (server , self .CB_STATS_PORT , "all" , self .cluster_spec )
93+ buckets_data = list (filter (lambda a : a != "" , result .split ("*" )))
94+ for data in buckets_data :
95+ data = data .strip ()
96+ if data .startswith (bucket ):
97+ data = data .split ("\n " , 1 )[1 ]
98+ data = data .replace ("\" {" , "{" )
99+ data = data .replace ("}\" " , "}" )
100+ data = data .replace ("\\ " , "" )
101+ data = json .loads (data )
102+ for (metric , number ) in data .items ():
103+ if metric in self .METRICS :
104+ if metric in stats :
105+ stats [metric ] += number
106+ else :
107+ stats [metric ] = number
108+ ep_magma_mem_used_diff = stats ['mem_used_secondary' ] - \
109+ stats ['ep_magma_total_mem_used' ]
110+ if 'ep_magma_mem_used_diff' in stats :
111+ stats ['ep_magma_mem_used_diff' ] += ep_magma_mem_used_diff
112+ else :
113+ stats ['ep_magma_mem_used_diff' ] = ep_magma_mem_used_diff
114+ break
115+ except Exception :
116+ pass
117+
118+ return stats
119+
120+ def _get_cbstats_all_stats (self , bucket : str , server : str ):
121+ node_stats = self ._get_stats_from_server (bucket , server = server )
122+ return node_stats
123+
124+ def sample (self ):
125+ for bucket in self .get_buckets ():
126+ stats = {}
127+ for node in self .nodes :
128+ temp_stats = self ._get_cbstats_all_stats (bucket , node )
129+ for st in temp_stats :
130+ if st in stats :
131+ stats [st ] += temp_stats [st ]
132+ else :
133+ stats [st ] = temp_stats [st ]
134+
135+ if stats :
136+ self .update_metric_metadata (stats .keys (), bucket = bucket )
137+ self .store .append (stats , cluster = self .cluster ,
138+ bucket = bucket ,
139+ collector = self .COLLECTOR )
140+
141+ def update_metadata (self ):
142+ self .mc .add_cluster ()
143+
144+ for bucket in self .get_buckets ():
145+ self .mc .add_bucket (bucket )
146+ for node in self .nodes :
147+ self .mc .add_server (node )
0 commit comments