65 lines
1.8 KiB
Python
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()
|