X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Ftools%2Ftelemetry%2Fbundle_bpf.py;h=bf54db0bcdfbf2f55773d395148de174399d626c;hp=77bc9acf9179b145b33f7b13864a45c296ca590e;hb=a717aee1ab89cef916caef845dca935dfc0f0cd1;hpb=d255d2545ee6cdc871bc35314fad72c3c48b225b diff --git a/resources/tools/telemetry/bundle_bpf.py b/resources/tools/telemetry/bundle_bpf.py index 77bc9acf91..bf54db0bcd 100644 --- a/resources/tools/telemetry/bundle_bpf.py +++ b/resources/tools/telemetry/bundle_bpf.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Cisco and/or its affiliates. +# Copyright (c) 2022 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -17,6 +17,7 @@ from logging import getLogger import sys from bcc import BPF +from .constants import Constants class BundleBpf: @@ -67,8 +68,8 @@ class BundleBpf: sample_period=duration ) except AttributeError: - getLogger(__name__).error(u"Cannot attach BPF events!") - sys.exit(1) + getLogger("console_stderr").error(u"Could not attach BPF events!") + sys.exit(Constants.err_linux_attach) def detach(self): """ @@ -81,14 +82,20 @@ class BundleBpf: ev_config=event[u"name"] ) except AttributeError: - getLogger(__name__).error(u"Cannot dettach BPF events!") - sys.exit(1) + getLogger("console_stderr").error(u"Could not detach BPF events!") + sys.exit(Constants.err_linux_detach) def fetch_data(self): """ Fetch data by invoking API calls to BPF. """ self.serializer.create(metrics=self.metrics) + + max_len = {"cpu": 3, "pid": 3, "name": 4, "value": 5} + text = "" + table_name = "" + item_list = [] + for _, metric_list in self.metrics.items(): for metric in metric_list: for (key, val) in self.obj.get_table(metric[u"name"]).items(): @@ -96,11 +103,46 @@ class BundleBpf: labels = dict() item[u"name"] = metric[u"name"] item[u"value"] = val.value - for label in metric[u"labels"]: + for label in metric[u"labelnames"]: labels[label] = getattr(key, label) item[u"labels"] = labels + item[u'labels'][u'name'] = \ + item[u'labels'][u'name'].decode(u'utf-8') + if item[u"labels"][u"name"] == u"python3": + continue + if len(str(item[u'labels'][u'cpu'])) > max_len["cpu"]: + max_len["cpu"]= len(str(item[u'labels'][u'cpu'])) + if len(str(item[u'labels'][u'pid'])) > max_len[u"pid"]: + max_len[u"pid"] = len(str(item[u'labels'][u'pid'])) + if len(str(item[u'labels'][u'name'])) > max_len[u"name"]: + max_len[u"name"] = len(str(item[u'labels'][u'name'])) + if len(str(item[u'value'])) > max_len[u"value"]: + max_len[u"value"] = len(str(item[u'value'])) + self.api_replies_list.append(item) - getLogger(__name__).info(item) + item_list.append(item) + + item_list = sorted(item_list, key=lambda x: x['labels']['cpu']) + item_list = sorted(item_list, key=lambda x: x['name']) + + for it in item_list: + if table_name != it[u"name"]: + table_name = it[u"name"] + text += f"\n==={table_name}===\n" \ + f"cpu {u' ' * (max_len[u'cpu'] - 3)} " \ + f"pid {u' ' * (max_len[u'pid'] - 3)} " \ + f"name {u' ' * (max_len[u'name'] - 4)} " \ + f"value {u' ' * (max_len[u'value'] - 5)}\n" + text += ( + f"""{str(it[u'labels'][u'cpu']) + u' ' * + (max_len[u"cpu"] - len(str(it[u'labels'][u'cpu'])))} """ + f"""{str(it[u'labels'][u'pid']) + u' ' * + (max_len[u"pid"] - len(str(it[u'labels'][u'pid'])))} """ + f"""{str(it[u'labels'][u'name']) + u' ' * + (max_len[u"name"] - len(str(it[u'labels'][u'name'])))} """ + f"""{str(it[u'value']) + u' ' * + (max_len[u"value"] - len(str(it[u'value'])))}\n""") + getLogger(u"console_stdout").info(text) def process_data(self): """