Fix issue #1173. Previously scyllatop aggregated metrics coming from a cluster with many hosts so that individual contributions could not be recognized. This is now changed so that aggregation is also by hostname. Signed-off-by: Yoav Kleinberger <yoav@scylladb.com> Message-Id: <8a4d8b82216d8c1aa855026ff31bcfd8bfac7e47.1461150261.git.yoav@scylladb.com>
52 lines
1.2 KiB
Python
52 lines
1.2 KiB
Python
import re
|
|
import mergeable
|
|
|
|
|
|
class Group(object):
|
|
_HEAD_PATTERN = re.compile('^([^-]+)-\d+/')
|
|
|
|
def __init__(self, label):
|
|
self._label = label
|
|
self._metrics = []
|
|
|
|
def add(self, metric):
|
|
self._metrics.append(metric)
|
|
|
|
@property
|
|
def metrics(self):
|
|
return self._metrics
|
|
|
|
def aggregate(self, mergeMethod):
|
|
merger = mergeable.Mergeable(mergeMethod)
|
|
for metric in self._metrics:
|
|
merger.add(metric.status)
|
|
|
|
return merger.merged()
|
|
|
|
@property
|
|
def label(self):
|
|
return self._label
|
|
|
|
@classmethod
|
|
def extractLabel(cls, metric):
|
|
return cls._HEAD_PATTERN.sub(r'\1-*/', metric.symbol)
|
|
|
|
@property
|
|
def size(self):
|
|
return len(self._metrics)
|
|
|
|
|
|
class Groups(object):
|
|
def __init__(self, measurements):
|
|
self._groups = {}
|
|
self._load(measurements)
|
|
|
|
def _load(self, measurements):
|
|
for metric in measurements:
|
|
label = Group.extractLabel(metric)
|
|
self._groups.setdefault(label, Group(label))
|
|
self._groups[label].add(metric)
|
|
|
|
def all(self):
|
|
return sorted(self._groups.values(), key=lambda group: group.label)
|