perfmetrics/scripts/fetch_and_upload_metrics.py (109 lines of code) (raw):
# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Executes fio_metrics.py and vm_metrics.py by passing appropriate arguments.
"""
import socket
import sys
import time
import argparse
from fio import fio_metrics
from vm_metrics import vm_metrics
from gsheet import gsheet
from bigquery import constants
from bigquery import experiments_gcsfuse_bq
INSTANCE = socket.gethostname()
PERIOD_SEC = 120
# Google sheet worksheets
FIO_WORKSHEET_NAME = 'fio_metrics'
VM_WORKSHEET_NAME = 'vm_metrics'
def _parse_arguments(argv):
"""Parses the arguments provided to the script via command line.
Args:
argv: List of arguments recevied by the script.
Returns:
A class containing the parsed arguments.
"""
argv = sys.argv
parser = argparse.ArgumentParser()
parser.add_argument(
'fio_json_output_path',
help='Provide path of the output json file.',
action='store'
)
parser.add_argument(
'--upload_gs',
help='Upload the results to the Google Sheet.',
action='store_true',
default=False,
required=False,
)
parser.add_argument(
'--upload_bq',
help='Upload the results to the BigQuery.',
action='store_true',
default=False,
required=False,
)
parser.add_argument(
'--config_id',
help='Configuration ID of the experiment.',
action='store',
nargs=1,
required=False,
)
parser.add_argument(
'--start_time_build',
help='Start time of the build.',
action='store',
nargs=1,
required=False,
)
parser.add_argument(
'--spreadsheet_id',
help='Provide id of spreadsheet',
action='store',
required=False,
)
return parser.parse_args(argv[1:])
if __name__ == '__main__':
argv = sys.argv
fio_metrics_obj = fio_metrics.FioMetrics()
print('Getting fio metrics...')
args = _parse_arguments(argv)
temp = fio_metrics_obj.get_metrics(args.fio_json_output_path)
metrics_data = fio_metrics_obj.get_values_to_upload(temp)
if args.upload_gs:
gsheet.write_to_google_sheet(FIO_WORKSHEET_NAME, metrics_data,
args.spreadsheet_id)
if args.upload_bq:
if not args.config_id or not args.start_time_build:
raise Exception(
"Pass required arguments experiments configuration ID and start time of build for uploading to BigQuery")
bigquery_obj = experiments_gcsfuse_bq.ExperimentsGCSFuseBQ(
constants.PROJECT_ID, constants.DATASET_ID)
bigquery_obj.upload_metrics_to_table(constants.FIO_TABLE_ID,
args.config_id[0],
args.start_time_build[0], metrics_data)
print('Waiting for 360 seconds for metrics to be updated on VM...')
# It takes up to 240 seconds for sampled data to be visible on the VM metrics graph
# So, waiting for 360 seconds to ensure the returned metrics are not empty.
# Intermittently custom metrics are not available after 240 seconds, hence
# waiting for 360 secs instead of 240 secs
time.sleep(360)
# Print the start and end time of all the fio-jobs
# This is just make sure, the total run time of fio jobs are constant over
# different execution.
for ind, job in enumerate(temp):
start_time_sec = job[fio_metrics.consts.START_TIME]
end_time_sec = job[fio_metrics.consts.END_TIME]
print(f'Start and end time for job {ind + 1}...')
# Print start and end time of jobs
print("Start time: ", start_time_sec)
print("End time: ", end_time_sec)
vm_metrics_obj = vm_metrics.VmMetrics()
vm_metrics_data = []
# Getting VM metrics for every job
for ind, job in enumerate(temp):
start_time_sec = job[fio_metrics.consts.START_TIME]
end_time_sec = job[fio_metrics.consts.END_TIME]
# Print start and end time of jobs
print("Start time: ", start_time_sec)
print("End time: ", end_time_sec)
rw = job[fio_metrics.consts.PARAMS][fio_metrics.consts.RW]
print(f'Getting VM metrics for job at index {ind + 1}...')
metrics_data = vm_metrics_obj.fetch_metrics(start_time_sec, end_time_sec,
INSTANCE, PERIOD_SEC, rw)
for row in metrics_data:
vm_metrics_data.append(row)
if args.upload_gs:
gsheet.write_to_google_sheet(VM_WORKSHEET_NAME, vm_metrics_data,
args.spreadsheet_id)
if args.upload_bq:
if not args.config_id or not args.start_time_build:
raise Exception(
"Pass required arguments experiments configuration ID and start time of build for uploading to BigQuery")
bigquery_obj = experiments_gcsfuse_bq.ExperimentsGCSFuseBQ(
constants.PROJECT_ID, constants.DATASET_ID)
bigquery_obj.upload_metrics_to_table(constants.VM_TABLE_ID,
args.config_id[0],
args.start_time_build[0],
vm_metrics_data)