blob: 6133a9e7ff5f6c0c18c507af55f0b9466ff623d4 [file] [log] [blame]
# Copyright 2021 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""
This scripts allows to get basic stats about the inspect.json file contained in a snapshot.zip file.
To use you need to have a snapshot.zip file either generated by `ffx inspect` or from a crash report.
Example usage:
```
$ unzip /path/to/snapshot.zip
$ fuchsia-vendored-python snapshot_inspect_stats.py --sort nodes /path/to/unzipped/inspect.json
```
"""
import argparse
import json
import sys
def measure(obj: dict[str, object], depth: int = 0) -> tuple[int, int, int]:
"""
Returns the number of nodes, properties and the depth of an inspect tree.
`obj` is a dict read from JSON that represents inspect data
"""
nodes = 0
properties = 0
max_depth = depth
for _, child in obj.items():
# ensure this is a node that is not a histogram
if type(child) is dict and "buckets" not in child:
(child_nodes, child_properties, child_depth) = measure(
child, depth=depth + 1
)
nodes += child_nodes + 1
properties += child_properties
max_depth = max(max_depth, child_depth)
continue
properties += 1
return nodes, properties, max_depth
def get_sort_index(sort_opt: str) -> int:
if args.sort == "nodes":
return 0
elif args.sort == "properties":
return 1
elif args.sort == "depth":
return 2
return -1
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Show stats about inspect data in a snapshot."
)
parser.add_argument(
"filepath", metavar="FILE", type=str, help="path to inspect.json file"
)
parser.add_argument(
"--sort",
dest="sort",
choices=["depth", "nodes", "properties"],
default="nodes",
help="based on what the output will be sorted",
)
args = parser.parse_args(sys.argv[1:])
with open(args.filepath) as f:
data = json.load(f)
results = [
(response["moniker"], measure(response["payload"]))
for response in data
if response["payload"]
]
sort_index = get_sort_index(args.sort)
results.sort(key=lambda v: v[1][sort_index], reverse=True)
print("MONIKER NODES PROPERTIES DEPTH")
for moniker, (nodes, properties, depth) in results:
print("{:<20} {} {} {}".format(moniker, nodes, properties, depth))