示例#1
0
文件: pmda.py 项目: anjutsudhakar/pcp
    def register_metrics(self):
        """register control metrics"""
        self.add_metric(
            'bpftrace.control.register',
            pmdaMetric(
                self.pmid(Consts.Control.Cluster,
                          Consts.Control.Register), c_api.PM_TYPE_STRING,
                c_api.PM_INDOM_NULL, c_api.PM_SEM_INSTANT, pmUnits()),
            "register a new bpftrace script")

        self.add_metric(
            'bpftrace.control.deregister',
            pmdaMetric(
                self.pmid(Consts.Control.Cluster,
                          Consts.Control.Deregister), c_api.PM_TYPE_STRING,
                c_api.PM_INDOM_NULL, c_api.PM_SEM_INSTANT, pmUnits()),
            "deregister a bpftrace script")

        self.add_metric(
            'bpftrace.control.start',
            pmdaMetric(self.pmid(Consts.Control.Cluster,
                                 Consts.Control.Start), c_api.PM_TYPE_STRING,
                       c_api.PM_INDOM_NULL, c_api.PM_SEM_INSTANT, pmUnits()),
            "start a stopped bpftrace script")

        self.add_metric(
            'bpftrace.control.stop',
            pmdaMetric(self.pmid(Consts.Control.Cluster,
                                 Consts.Control.Stop), c_api.PM_TYPE_STRING,
                       c_api.PM_INDOM_NULL, c_api.PM_SEM_INSTANT, pmUnits()),
            "stop a running bpftrace script")

        self.add_metric(
            'bpftrace.info.scripts',
            pmdaMetric(self.pmid(Consts.Info.Cluster,
                                 Consts.Info.Scripts), c_api.PM_TYPE_STRING,
                       self.script_indom.indom_id, c_api.PM_SEM_INSTANT,
                       pmUnits()), "list all registered bpftrace scripts")

        self.add_metric(
            'bpftrace.info.scripts_json',
            pmdaMetric(self.pmid(Consts.Info.Cluster, Consts.Info.ScriptsJson),
                       c_api.PM_TYPE_STRING, c_api.PM_INDOM_NULL,
                       c_api.PM_SEM_INSTANT, pmUnits()),
            "expose all scripts in JSON format")

        self.add_metric(
            'bpftrace.info.tracepoints',
            pmdaMetric(self.pmid(Consts.Info.Cluster, Consts.Info.Tracepoints),
                       c_api.PM_TYPE_STRING, c_api.PM_INDOM_NULL,
                       c_api.PM_SEM_INSTANT, pmUnits()),
            "list all available tracepoints")
 def setup_ping_metrics(self, name):
     '''
     Setup the metric table - ensure a values hash entry is setup for
     each metric; that way we don't need to worry about KeyErrors in
     the fetch callback routine (e.g. if the kernel interface changes).
     '''
     self.values['ping'] = 0
     # This class inherits from PDMA which includes these methods
     # pylint: disable=no-member
     self.add_metric(name + '.ping',
                     pmdaMetric(self.pmid(0, 0),
                                c_api.PM_TYPE_U32,
                                c_api.PM_INDOM_NULL,
                                c_api.PM_SEM_INSTANT,
                                pmUnits(0, 0, 0, 0, 0, 0)),
                     'Http ping to google.com http status codde')
示例#3
0
    def register_metrics(self):
        """register metrics for this bpftrace instance"""
        self.status_metric = pmdaMetric(
            self.pmda.pmid(self.cluster_id, Consts.Script.Status),
            c_api.PM_TYPE_STRING, c_api.PM_INDOM_NULL, c_api.PM_SEM_INSTANT,
            pmUnits())
        self.pmda.add_metric(f'bpftrace.scripts.{self.name}.status',
                             self.status_metric, "status of bpftrace script")

        self.pid_metric = pmdaMetric(
            self.pmda.pmid(self.cluster_id, Consts.Script.Pid),
            c_api.PM_TYPE_U32, c_api.PM_INDOM_NULL, c_api.PM_SEM_INSTANT,
            pmUnits())
        self.pmda.add_metric(f'bpftrace.scripts.{self.name}.pid',
                             self.pid_metric, "pid of bpftrace process")

        self.exit_code_metric = pmdaMetric(
            self.pmda.pmid(self.cluster_id, Consts.Script.ExitCode),
            c_api.PM_TYPE_32, c_api.PM_INDOM_NULL, c_api.PM_SEM_INSTANT,
            pmUnits())
        self.pmda.add_metric(f'bpftrace.scripts.{self.name}.exit_code',
                             self.exit_code_metric,
                             "exit code of bpftrace process")

        self.error_metric = pmdaMetric(
            self.pmda.pmid(self.cluster_id, Consts.Script.Error),
            c_api.PM_TYPE_STRING, c_api.PM_INDOM_NULL, c_api.PM_SEM_INSTANT,
            pmUnits())
        self.pmda.add_metric(f'bpftrace.scripts.{self.name}.error',
                             self.error_metric,
                             "errors of the bpftrace script")

        self.probes_metric = pmdaMetric(
            self.pmda.pmid(self.cluster_id, Consts.Script.Probes),
            c_api.PM_TYPE_U32, c_api.PM_INDOM_NULL, c_api.PM_SEM_INSTANT,
            pmUnits())
        self.pmda.add_metric(f'bpftrace.scripts.{self.name}.probes',
                             self.probes_metric, "number of attached probes")

        self.code_metric = pmdaMetric(
            self.pmda.pmid(self.cluster_id, Consts.Script.Code),
            c_api.PM_TYPE_STRING, c_api.PM_INDOM_NULL, c_api.PM_SEM_INSTANT,
            pmUnits())
        self.pmda.add_metric(f'bpftrace.scripts.{self.name}.code',
                             self.code_metric, "bpftrace script")

        item_no = Consts.Script.First_BPFtrace_Variable
        for var_name, var_def in self.script.variables.items():
            if var_def.single:
                indom_id = c_api.PM_INDOM_NULL
            else:
                # serial needs to be unique across PMDA
                indom = UncachedIndom(self.pmda,
                                      self.cluster_id * 1000 + item_no)
                indom_id = indom.indom_id
                self.indoms[var_name] = indom

            pmid = self.pmda.pmid(self.cluster_id, item_no)
            metric = pmdaMetric(pmid, var_def.datatype, indom_id,
                                var_def.semantics, pmUnits())
            normalized_var_name = self.normalize_variable_name(var_name)
            metric_name = f'bpftrace.scripts.{self.name}.data.{normalized_var_name}'
            self.pmda.add_metric(metric_name, metric,
                                 f"{var_name} variable of bpftrace script")
            self.metrics[metric_name] = metric
            self.pmid_to_var[pmid] = var_name
            self.item_to_var[item_no] = var_name
            item_no += 1