mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-02 18:08:58 +00:00
6b4f6f99fb
This spins up a separate process to submit telemetry data rather than blocking the execution the current mach command. Although the initial Python process needs to wait for the second process to complete prior to exiting, it releases control of the console once it finishes executing Python code, so from the user's perspective, mahc command completion is not blocked by submitting telemetry data. MozReview-Commit-ID: FlKDYd6rNPc --HG-- extra : rebase_source : d10f3f2cdfe6e8c8cdd8b1e02ce9261178b528e6
78 lines
2.5 KiB
Python
78 lines
2.5 KiB
Python
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
import errno
|
|
import logging
|
|
import os
|
|
import sys
|
|
import time
|
|
|
|
HERE = os.path.abspath(os.path.dirname(__file__))
|
|
sys.path.append(os.path.join(HERE, '..', 'python', 'requests'))
|
|
import requests
|
|
|
|
|
|
# Server to which to submit telemetry data
|
|
BUILD_TELEMETRY_SERVER = 'http://52.88.27.118/build-metrics-dev'
|
|
|
|
|
|
def submit_telemetry_data(statedir):
|
|
|
|
# No data to work with anyway
|
|
outgoing = os.path.join(statedir, 'telemetry', 'outgoing')
|
|
if not os.path.isdir(outgoing):
|
|
return 0
|
|
|
|
submitted = os.path.join(statedir, 'telemetry', 'submitted')
|
|
try:
|
|
os.mkdir(submitted)
|
|
except OSError as e:
|
|
if e.errno != errno.EEXIST:
|
|
raise
|
|
|
|
session = requests.Session()
|
|
for filename in os.listdir(outgoing):
|
|
path = os.path.join(outgoing, filename)
|
|
if os.path.isdir(path) or not path.endswith('.json'):
|
|
continue
|
|
with open(path, 'r') as f:
|
|
data = f.read()
|
|
try:
|
|
r = session.post(BUILD_TELEMETRY_SERVER, data=data,
|
|
headers={'Content-Type': 'application/json'})
|
|
except Exception as e:
|
|
logging.error('Exception posting to telemetry '
|
|
'server: %s' % str(e))
|
|
break
|
|
# TODO: some of these errors are likely not recoverable, as
|
|
# written, we'll retry indefinitely
|
|
if r.status_code != 200:
|
|
logging.error('Error posting to telemetry: %s %s' %
|
|
(r.status_code, r.text))
|
|
continue
|
|
|
|
os.rename(os.path.join(outgoing, filename),
|
|
os.path.join(submitted, filename))
|
|
|
|
session.close()
|
|
|
|
# Discard submitted data that is >= 30 days old
|
|
now = time.time()
|
|
for filename in os.listdir(submitted):
|
|
ctime = os.stat(os.path.join(submitted, filename)).st_ctime
|
|
if now - ctime >= 60*60*24*30:
|
|
os.remove(os.path.join(submitted, filename))
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if len(sys.argv) != 2:
|
|
print('usage: python submit_telemetry_data.py <statedir>')
|
|
sys.exit(1)
|
|
statedir = sys.argv[1]
|
|
logging.basicConfig(filename=os.path.join(statedir, 'telemetry', 'telemetry.log'),
|
|
format='%(asctime)s %(message)s')
|
|
sys.exit(submit_telemetry_data(statedir))
|