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')
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