123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- #!/usr/bin/env python3
- # Copyright (c) 2021 Intel Corporation
- #
- # SPDX-License-Identifier: Apache-2.0
- from anytree.importer import DictImporter
- from anytree import PreOrderIter
- from anytree.search import find
- importer = DictImporter()
- from datetime import datetime
- from dateutil.relativedelta import relativedelta
- import os
- import json
- from git import Repo
- from git.exc import BadName
- from influxdb import InfluxDBClient
- import glob
- import argparse
- from tabulate import tabulate
- TODAY = datetime.utcnow()
- two_mon_rel = relativedelta(months=4)
- influx_dsn = 'influxdb://localhost:8086/footprint_tracking'
- def create_event(data, board, feature, commit, current_time, typ, application):
- footprint_data = []
- client = InfluxDBClient.from_dsn(influx_dsn)
- client.create_database('footprint_tracking')
- for d in data.keys():
- footprint_data.append({
- "measurement": d,
- "tags": {
- "board": board,
- "commit": commit,
- "application": application,
- "type": typ,
- "feature": feature
- },
- "time": current_time,
- "fields": {
- "value": data[d]
- }
- })
- client.write_points(footprint_data, time_precision='s', database='footprint_tracking')
- def parse_args():
- global args
- parser = argparse.ArgumentParser(
- description=__doc__,
- formatter_class=argparse.RawDescriptionHelpFormatter)
- parser.add_argument("-d", "--data", help="Data Directory")
- parser.add_argument("-y", "--dryrun", action="store_true", help="Dry run, do not upload to database")
- parser.add_argument("-z", "--zephyr-base", help="Zephyr tree")
- parser.add_argument("-f", "--file", help="JSON file with footprint data")
- args = parser.parse_args()
- def parse_file(json_file):
- with open(json_file, "r") as fp:
- contents = json.load(fp)
- root = importer.import_(contents['symbols'])
- zr = find(root, lambda node: node.name == 'ZEPHYR_BASE')
- ws = find(root, lambda node: node.name == 'WORKSPACE')
- data = {}
- if zr and ws:
- trees = [zr, ws]
- else:
- trees = [root]
- for node in PreOrderIter(root, maxlevel=2):
- if node.name not in ['WORKSPACE', 'ZEPHYR_BASE']:
- if node.name in ['Root', 'Symbols']:
- data['all'] = node.size
- else:
- data[node.name] = node.size
- for t in trees:
- root = t.name
- for node in PreOrderIter(t, maxlevel=2):
- if node.name == root:
- continue
- comp = node.name
- if comp in ['Root', 'Symbols']:
- data['all'] = node.size
- else:
- data[comp] = node.size
- return data
- def process_files(data_dir, zephyr_base, dry_run):
- repo = Repo(zephyr_base)
- for hash in os.listdir(f'{data_dir}'):
- if not dry_run:
- client = InfluxDBClient.from_dsn(influx_dsn)
- result = client.query(f"select * from kernel where commit = '{hash}';")
- if result:
- print(f"Skipping {hash}...")
- continue
- print(f"Importing {hash}...")
- for file in glob.glob(f"{args.data}/{hash}/**/*json", recursive=True):
- file_data = file.split("/")
- json_file = os.path.basename(file)
- if 'ram' in json_file:
- typ = 'ram'
- else:
- typ = 'rom'
- commit = file_data[1]
- app = file_data[2]
- feature = file_data[3]
- board = file_data[4]
- data = parse_file(file)
- try:
- gitcommit = repo.commit(f'{commit}')
- current_time = gitcommit.committed_datetime
- except BadName:
- cidx = commit.find('-g') + 2
- gitcommit = repo.commit(f'{commit[cidx:]}')
- current_time = gitcommit.committed_datetime
- print(current_time)
- if not dry_run:
- create_event(data, board, feature, commit, current_time, typ, app)
- def main():
- parse_args()
- if args.data and args.zephyr_base:
- process_files(args.data, args.zephyr_base, args.dryrun)
- if args.file:
- data = parse_file(args.file)
- items = []
- for component,value in data.items():
- items.append([component,value])
- table = tabulate(items, headers=['Component', 'Size'], tablefmt='orgtbl')
- print(table)
- if __name__ == "__main__":
- main()
|