1 # Copyright (C) The Arvados Authors. All rights reserved.
3 # SPDX-License-Identifier: AGPL-3.0
7 from collections import namedtuple
9 Stat = namedtuple("Stat", ['name', 'get'])
11 class StatWriter(object):
12 def __init__(self, prefix, interval, stats):
14 self.interval = interval
16 self.previous_stats = []
17 self.update_previous_stats()
19 def update_previous_stats(self):
20 self.previous_stats = [stat.get() for stat in self.stats]
23 def append_by_type(string, name, value):
24 if type(value) is float:
25 string += " %.6f %s" % (value, name)
27 string += " %s %s" % (str(value), name)
30 out = "crunchstat: %s" % self.prefix
31 delta = "-- interval %.4f seconds" % self.interval
32 for i, stat in enumerate(self.stats):
34 diff = value - self.previous_stats[i]
35 delta = append_by_type(delta, stat.name, diff)
36 out = append_by_type(out, stat.name, value)
38 sys.stderr.write("%s %s\n" % (out, delta))
39 self.update_previous_stats()
41 def statlogger(interval, keep, ops):
42 calls = StatWriter("keepcalls", interval, [
43 Stat("put", keep.put_counter.get),
44 Stat("get", keep.get_counter.get)
46 net = StatWriter("net:keep0", interval, [
47 Stat("tx", keep.upload_counter.get),
48 Stat("rx", keep.download_counter.get)
50 cache = StatWriter("keepcache", interval, [
51 Stat("hit", keep.hits_counter.get),
52 Stat("miss", keep.misses_counter.get)
54 fuseops = StatWriter("fuseops", interval, [
55 Stat("write", ops.write_ops_counter.get),
56 Stat("read", ops.read_ops_counter.get)
59 for cur_op in ops.metric_op_names():
60 name = "fuseop:{0}".format(cur_op)
61 fusetimes.append(StatWriter(name, interval, [
62 Stat("count", ops.metric_count_func(cur_op)),
63 Stat("time", ops.metric_sum_func(cur_op))
65 blk = StatWriter("blkio:0:0", interval, [
66 Stat("write", ops.write_counter.get),
67 Stat("read", ops.read_counter.get)
77 for ftime in fusetimes: