# Copyright 2018, The Android Open Source Project
#
# 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.
"""Asuite simple Metrics Functions"""
import json
import logging
import os
import uuid
try:
# PYTHON2
from urllib2 import Request
from urllib2 import urlopen
except ImportError:
# PYTHON3
from urllib.request import Request
from urllib.request import urlopen
_JSON_HEADERS = {'Content-Type': 'application/json'}
_METRICS_RESPONSE = 'done'
_METRICS_TIMEOUT = 2 #seconds
_META_FILE = os.path.join(os.path.expanduser('~'),
'.config', 'asuite', '.metadata')
_ANDROID_BUILD_TOP = 'ANDROID_BUILD_TOP'
DUMMY_UUID = '00000000-0000-4000-8000-000000000000'
#pylint: disable=broad-except
def log_event(metrics_url, dummy_key_fallback=True, **kwargs):
"""Base log event function for asuite backend.
Args:
metrics_url: String, URL to report metrics to.
dummy_key_fallback: Boolean, If True and unable to get grouping key,
use a dummy key otherwise return out. Sometimes we
don't want to return metrics for users we are
unable to identify. Default True.
kwargs: Dict, additional fields we want to return metrics for.
"""
try:
try:
key = str(_get_grouping_key())
except Exception:
if not dummy_key_fallback:
return
key = DUMMY_UUID
data = {'grouping_key': key,
'run_id': str(uuid.uuid4())}
if kwargs:
data.update(kwargs)
data = json.dumps(data)
request = Request(metrics_url, data=data,
headers=_JSON_HEADERS)
response = urlopen(request, timeout=_METRICS_TIMEOUT)
content = response.read()
if content != _METRICS_RESPONSE:
raise Exception('Unexpected metrics response: %s' % content)
except Exception as e:
logging.debug('Exception sending metrics: %s', e)
def _get_grouping_key():
"""Get grouping key. Returns UUID.uuid4."""
if os.path.isfile(_META_FILE):
with open(_META_FILE) as f:
try:
return uuid.UUID(f.read(), version=4)
except ValueError:
logging.debug('malformed group_key in file, rewriting')
# TODO: Delete get_old_key() on 11/17/2018
key = _get_old_key() or uuid.uuid4()
dir_path = os.path.dirname(_META_FILE)
if os.path.isfile(dir_path):
os.remove(dir_path)
try:
os.makedirs(dir_path)
except OSError as e:
if not os.path.isdir(dir_path):
raise e
with open(_META_FILE, 'w+') as f:
f.write(str(key))
return key
def _get_old_key():
"""Get key from old meta data file if exists, else return None."""
old_file = os.path.join(os.environ[_ANDROID_BUILD_TOP],
'tools/tradefederation/core/atest', '.metadata')
key = None
if os.path.isfile(old_file):
with open(old_file) as f:
try:
key = uuid.UUID(f.read(), version=4)
except ValueError:
logging.debug('error reading old key')
os.remove(old_file)
return key