tempest/tempest/lib/common/profiler.py

65 lines
1.8 KiB
Python

# 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.
import base64
import hashlib
import hmac
import json
from oslo_utils import encodeutils
from oslo_utils import uuidutils
_profiler = {}
def enable(profiler_key, trace_id=None):
"""Enable global profiler instance
:param profiler_key: the secret key used to enable profiling in services
:param trace_id: unique id of the trace, if empty the id is generated
automatically
"""
_profiler['key'] = profiler_key
_profiler['uuid'] = trace_id or uuidutils.generate_uuid()
def disable():
"""Disable global profiler instance"""
_profiler.clear()
def serialize_as_http_headers():
"""Serialize profiler state as HTTP headers
This function corresponds to the one from osprofiler library.
:return: dictionary with 2 keys `X-Trace-Info` and `X-Trace-HMAC`.
"""
p = _profiler
if not p: # profiler is not enabled
return {}
info = {'base_id': p['uuid'], 'parent_id': p['uuid']}
trace_info = base64.urlsafe_b64encode(
encodeutils.to_utf8(json.dumps(info)))
trace_hmac = _sign(trace_info, p['key'])
return {
'X-Trace-Info': trace_info,
'X-Trace-HMAC': trace_hmac,
}
def _sign(trace_info, key):
h = hmac.new(encodeutils.to_utf8(key), digestmod=hashlib.sha1)
h.update(trace_info)
return h.hexdigest()