code: def get_metrics(campaign, report, top=True):
      
      if top and campaign.process.type == 'slurm':
          for path, _ in report.collect('jobid', with_path=True):
              for child in ReportNode(path).children.values():
                  for metrics in get_metrics(campaign, child, top=False):
                      yield metrics
      else:
  
          def metrics_node_extract(report):
              metrics_file = osp.join(report.path, JSON_METRICS_FILE)
              if osp.exists(metrics_file):
                  with open(metrics_file) as istr:
                      return json.load(istr)
  
          def metrics_iterator(report):
              return filter(
                  lambda eax: eax[1] is not None,
                  report.map(metrics_node_extract, with_path=True),
              )
  
          for path, metrics in metrics_iterator(report):
              yield report.path_context(path), metrics
docs: Extract metrics from existing campaign
  
      :param campaign: campaign loaded with `hpcbench.campaign.from_file`
      :param report: instance of `hpcbench.campaign.ReportNode`
      :param top: this function is recursive. This parameter
      help distinguishing top-call.