import source.aws as aws import source.gcp as gcp import source.alicloud as alicloud import processer.aws_processer as aws_processer import processer.gcp_processer as gcp_processer import processer.alicloud_processer as alicloud_processer import sink.prometheus as prometheus import sink.mysql as mysql from pprint import pprint from datetime import datetime from dateutil.relativedelta import relativedelta import common.config as config import sys def get_aws_cost(str_day, length, database_url, regions): aws_client = aws.AWS() start_date = datetime.strptime(str_day, '%Y-%m-%d') i = 0 while i != length: for region in regions: response = aws_client.get_cost_and_usage(start_date.strftime( '%Y-%m-%d'), (start_date + relativedelta(months=1)).strftime('%Y-%m-%d'), region) proc = aws_processer.AWSProcesser( response, 'aws', region, start_date.strftime('%Y-%m-%d')) result = proc.process() pprint(result) mysql.write(database_url, result) start_date = start_date + relativedelta(months=1) i += 1 def get_gcp_cost(str_day, length, database_url, regions, project): gcp_client = gcp.GCP(project) # get cost and usage start_date = datetime.strptime(str_day, '%Y-%m-%d') i = 0 while i != length: response = gcp_client.get_cost_and_usage(start_date.strftime( '%Y-%m-%d'), (start_date + relativedelta(months=1)).strftime('%Y-%m-%d'), project) proc = gcp_processer.GCPProcesser( response, 'gcp', start_date.strftime('%Y-%m-%d')) for region in regions: result = proc.process(region) pprint(result) mysql.write(database_url, result) start_date = start_date + relativedelta(months=1) i += 1 def get_alicloud_cost(str_day, length, database_url, regions,region_map): alicloud_client = alicloud.AliCloud() # get cost and usage start_date = datetime.strptime(str_day, '%Y-%m-%d') i = 0 while i != length: response = alicloud_client.get_cost_and_usage(start_date.strftime('%Y-%m')) proc = alicloud_processer.AliCloudProcesser( response, 'alicloud',region_map,start_date.strftime('%Y-%m-%d')) for region in regions: # for alicloud region is provider-region region = "alicloud-"+region result = proc.process(region) pprint(result) mysql.write(database_url, result) start_date = start_date + relativedelta(months=1) i += 1 if __name__ == "__main__": # get datetime and length from argv start_day =None for i, arg in enumerate(sys.argv): if "start_day" in arg: start_day = arg.split("=")[1] if "length" in arg: length = int(arg.split("=")[1]) if "config" in arg: config_path = arg.split("=")[1] if start_day is None: day_now = datetime.now().replace(day=1) start_day = (day_now - relativedelta(months=length) ).strftime('%Y-%m-%d') print(f"start_day: {start_day}, length: {length}", "config_path: ", config_path) c = config.Config(config_path) try: for provider in c.get_providers(): if provider["name"] == "aws": get_aws_cost(start_day, length, c.get_database_url(), provider["regions"]) if provider["name"] == "gcp": get_gcp_cost(start_day, length, c.get_database_url(), provider["regions"], provider["project"]) if provider["name"] == "alicloud": get_alicloud_cost(start_day, length, c.get_database_url(), provider["regions"],provider["regionsmap"]) finally: mysql.close()