Project

General

Profile

Support #21016 ยป cost.py

Peter Amstutz, 09/28/2023 03:02 PM

 
#!/usr/bin/env python3

# arv container_request list --filters '[["properties", "exists", "template_uuid"],
# ["container.state", "=", "Complete"], ["container.exit_code", "=", 0]]' --select '["name", "uuid", "cumulative_cost"]'

import arvados
import arvados.util
import os
import json
import csv

api = arvados.api()

by_workflow = {}

if os.path.exists("costs.txt"):
with open("costs.txt", "rt") as f:
by_workflow = json.load(f)

if not by_workflow:
for item in arvados.util.keyset_list_all(api.container_requests().list,
filters=[["properties", "exists", "template_uuid"], ["container.state", "=", "Complete"], ["container.exit_code", "=", 0]],
select=["name", "uuid", "properties", "cumulative_cost", "created_at"]):
template_uuid = item["properties"]["template_uuid"]
by_workflow.setdefault(template_uuid, [])
by_workflow[template_uuid].append(item)
print(item)

with open("costs.txt", "wt") as f:
json.dump(by_workflow, f)

costs_out = open("costs.csv", "wt")
costs_csv = csv.writer(costs_out)
costs_csv.writerow(("uuid", "name", "count", "total", "average"))

for wf in by_workflow:
try:
wfitem = api.workflows().get(uuid=wf).execute()
except:
wfitem = {"uuid": wf, "name": ""}
count = 0
total = 0
for cr in by_workflow[wf]:
cost = cr["cumulative_cost"]
if cost == 0:
continue
total += cost
count += 1
costs_csv.writerow((wfitem["uuid"], wfitem["name"], count, total, total/count if count > 0 else 0))
    (1-1/1)