summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-08-20 00:50:26 +0000
committerGerrit Code Review <review@openstack.org>2014-08-20 00:50:26 +0000
commit43d9440e83dcfefe4788504600af14996347415e (patch)
tree25c7f070f40209345bc5422416defd8d4861e818
parentd6498b602f4182f6dbd18fd63eaaaaf8b8ada039 (diff)
parent9a53c1fdcb5168043e7edbdfa1bd15e323a3b914 (diff)
downloadpython-glanceclient-43d9440e83dcfefe4788504600af14996347415e.tar.gz
Merge "Enable osprofiler interface in glanceclient shell"
-rw-r--r--glanceclient/common/http.py15
-rw-r--r--glanceclient/shell.py29
2 files changed, 40 insertions, 4 deletions
diff --git a/glanceclient/common/http.py b/glanceclient/common/http.py
index a078436..d5fa1d3 100644
--- a/glanceclient/common/http.py
+++ b/glanceclient/common/http.py
@@ -87,11 +87,14 @@ class HTTPClient(object):
def log_curl_request(self, method, url, headers, data, kwargs):
curl = ['curl -i -X %s' % method]
- for (key, value) in self.session.headers.items():
+ headers = copy.deepcopy(headers)
+ headers.update(self.session.headers)
+
+ for (key, value) in six.iteritems(headers):
if key.lower() == 'x-auth-token':
value = '*' * 3
header = '-H \'%s: %s\'' % (key, value)
- curl.append(strutils.safe_encode(header))
+ curl.append(header)
if not self.session.verify:
curl.append('-k')
@@ -106,7 +109,10 @@ class HTTPClient(object):
curl.append('-d \'%s\'' % data)
curl.append(url)
- LOG.debug(strutils.safe_encode(' '.join(curl), errors='ignore'))
+
+ msg = ' '.join([strutils.safe_encode(item, errors='ignore')
+ for item in curl])
+ LOG.debug(msg)
@staticmethod
def log_http_response(resp, body=None):
@@ -168,6 +174,9 @@ class HTTPClient(object):
headers['Content-Type'] = content_type
stream = True if content_type == 'application/octet-stream' else False
+ if osprofiler_web:
+ headers.update(osprofiler_web.get_trace_id_headers())
+
# Note(flaper87): Before letting headers / url fly,
# they should be encoded otherwise httplib will
# complain.
diff --git a/glanceclient/shell.py b/glanceclient/shell.py
index f55375c..c529b6e 100644
--- a/glanceclient/shell.py
+++ b/glanceclient/shell.py
@@ -32,6 +32,7 @@ import six.moves.urllib.parse as urlparse
import glanceclient
from glanceclient.common import utils
from glanceclient import exc
+from glanceclient.openstack.common import importutils
from glanceclient.openstack.common import strutils
from keystoneclient.auth.identity import v2 as v2_auth
@@ -40,6 +41,8 @@ from keystoneclient import discover
from keystoneclient.openstack.common.apiclient import exceptions as ks_exc
from keystoneclient import session
+osprofiler_profiler = importutils.try_import("osprofiler.profiler")
+
class OpenStackImagesShell(object):
@@ -255,7 +258,21 @@ class OpenStackImagesShell(object):
parser.add_argument('--os_image_api_version',
help=argparse.SUPPRESS)
- # FIXME(bobt): this method should come from python-keystoneclient
+ if osprofiler_profiler:
+ parser.add_argument('--profile',
+ metavar='HMAC_KEY',
+ help='HMAC key to use for encrypting context '
+ 'data for performance profiling of operation. '
+ 'This key should be the value of HMAC key '
+ 'configured in osprofiler middleware in '
+ 'glance, it is specified in paste '
+ 'configuration file at '
+ '/etc/glance/api-paste.ini and '
+ '/etc/glance/registry-paste.ini. Without key '
+ 'the profiling will not be triggered even '
+ 'if osprofiler is enabled on server side.')
+
+ # FIXME(bobt): this method should come from python-keystoneclient
self._append_global_identity_args(parser)
return parser
@@ -555,6 +572,10 @@ class OpenStackImagesShell(object):
LOG.addHandler(logging.StreamHandler())
LOG.setLevel(logging.DEBUG if args.debug else logging.INFO)
+ profile = osprofiler_profiler and options.profile
+ if profile:
+ osprofiler_profiler.init(options.profile)
+
client = self._get_versioned_client(api_version, args,
force_auth=False)
@@ -562,6 +583,12 @@ class OpenStackImagesShell(object):
args.func(client, args)
except exc.Unauthorized:
raise exc.CommandError("Invalid OpenStack Identity credentials.")
+ finally:
+ if profile:
+ trace_id = osprofiler_profiler.get().get_base_id()
+ print("Profiling trace ID: %s" % trace_id)
+ print("To display trace use next command:\n"
+ "osprofiler trace show --html %s " % trace_id)
@utils.arg('command', metavar='<subcommand>', nargs='?',
help='Display help for <subcommand>.')