in tools/perf-scale-workload/timestreamquery.py [0:0]
def executeQuery(client, query, timing = False, logFile = None):
try:
pages = None
queryId = None
firstResult = None
start = timer()
## Create the paginator to paginate through the results.
paginator = client.get_paginator('query')
pageIterator = paginator.paginate(QueryString=query)
emptyPages = 0
pages = list()
lastPage = None
for page in pageIterator:
if 'QueryId' in page and queryId == None:
queryId = page['QueryId']
print("QueryId: {}".format(queryId))
lastPage = page
if 'Rows' not in page or len(page['Rows']) == 0:
## We got an empty page.
emptyPages +=1
else:
pages.append(page)
if firstResult == None:
## Note the time when the first row of result was received.
firstResult = timer()
## If there were no result, then return the last empty page to carry over the query results context
if len(pages) == 0 and lastPage != None:
pages.append(lastPage)
if lastPage != None:
if lastPage['QueryStatus'] != None:
bytesMetered = int(lastPage['QueryStatus']['CumulativeBytesMetered'])
bytesMeteredMB = round(bytesMetered / (1024.0 * 1024), 3)
infoMsg = "Read {} pages of result. Empty pages: {}. Bytes metered (MB): {}".format(len(pages), emptyPages, bytesMeteredMB)
print(infoMsg)
if logFile != None:
logFile.write("{}\n".format(infoMsg))
return pages
except Exception as e:
if queryId != None:
## Try canceling the query if it is still running
print("Attempting to cancel query: {}".format(queryId))
try:
client.cancel_query(query_id=queryId)
except:
pass
print(e)
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout)
if e.response != None:
queryId = None
print("RequestId: {}".format(e.response['ResponseMetadata']['RequestId']))
if 'QueryId' in e.response:
queryId = e.response['QueryId']
print("QueryId: {}".format(queryId))
if pages != None:
print("Read {} pages".format(len(pages)))
raise e
except KeyboardInterrupt:
if queryId != None:
## Try canceling the query if it is still running
print("Attempting to cancel query: {}".format(queryId))
try:
client.cancel_query(query_id=queryId)
except:
pass
raise
finally:
end = timer()
if timing == True:
now = datetime.datetime.utcnow()
if firstResult != None:
timeToFirstResult = firstResult - start
timeToReadResults = end - firstResult
else:
timeToFirstResult = end - start
timeToReadResults = 0
timingMsg = "{}. QueryId: {} Time: {}. First result: {}. Time to read results: {}.".format(now.strftime("%Y-%m-%d %H:%M:%S"),
queryId, round(end - start, 3), round(timeToFirstResult, 3), round(timeToReadResults, 3))
print(timingMsg)
if logFile != None:
logFile.write("{}\n".format(timingMsg))