Merge "Add shell --profile option to trigger osprofiler from CLI"
This commit is contained in:
commit
2819450be5
@ -123,6 +123,12 @@ OPTIONS
|
|||||||
:option:`--os-interface` <interface>
|
:option:`--os-interface` <interface>
|
||||||
Interface type. Valid options are `public`, `admin` and `internal`.
|
Interface type. Valid options are `public`, `admin` and `internal`.
|
||||||
|
|
||||||
|
:option: `--profile` <hmac-key>
|
||||||
|
HMAC key to use for encrypting context data for performance profiling of
|
||||||
|
requested operation. This key should be the value of one of the HMAC keys
|
||||||
|
defined in the configuration files of OpenStack services, user would like
|
||||||
|
to trace through.
|
||||||
|
|
||||||
:option:`--log-file` <LOGFILE>
|
:option:`--log-file` <LOGFILE>
|
||||||
Specify a file to log output. Disabled by default.
|
Specify a file to log output. Disabled by default.
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ from cliff import app
|
|||||||
from cliff import command
|
from cliff import command
|
||||||
from cliff import complete
|
from cliff import complete
|
||||||
from cliff import help
|
from cliff import help
|
||||||
|
from oslo_utils import importutils
|
||||||
from oslo_utils import strutils
|
from oslo_utils import strutils
|
||||||
|
|
||||||
import openstackclient
|
import openstackclient
|
||||||
@ -37,6 +38,8 @@ from openstackclient.common import utils
|
|||||||
|
|
||||||
from os_client_config import config as cloud_config
|
from os_client_config import config as cloud_config
|
||||||
|
|
||||||
|
osprofiler_profiler = importutils.try_import("osprofiler.profiler")
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_DOMAIN = 'default'
|
DEFAULT_DOMAIN = 'default'
|
||||||
|
|
||||||
@ -101,6 +104,8 @@ class OpenStackShell(app.App):
|
|||||||
self.client_manager = None
|
self.client_manager = None
|
||||||
self.command_options = None
|
self.command_options = None
|
||||||
|
|
||||||
|
self.do_profile = False
|
||||||
|
|
||||||
def configure_logging(self):
|
def configure_logging(self):
|
||||||
"""Configure logging for the app."""
|
"""Configure logging for the app."""
|
||||||
self.log_configurator = logs.LogConfigurator(self.options)
|
self.log_configurator = logs.LogConfigurator(self.options)
|
||||||
@ -125,6 +130,39 @@ class OpenStackShell(app.App):
|
|||||||
finally:
|
finally:
|
||||||
self.log.info("END return value: %s", ret_val)
|
self.log.info("END return value: %s", ret_val)
|
||||||
|
|
||||||
|
def init_profile(self):
|
||||||
|
self.do_profile = osprofiler_profiler and self.options.profile
|
||||||
|
if self.do_profile:
|
||||||
|
osprofiler_profiler.init(self.options.profile)
|
||||||
|
|
||||||
|
def close_profile(self):
|
||||||
|
if self.do_profile:
|
||||||
|
trace_id = osprofiler_profiler.get().get_base_id()
|
||||||
|
|
||||||
|
# NOTE(dbelova): let's use warning log level to see these messages
|
||||||
|
# printed. In fact we can define custom log level here with value
|
||||||
|
# bigger than most big default one (CRITICAL) or something like
|
||||||
|
# that (PROFILE = 60 for instance), but not sure we need it here.
|
||||||
|
self.log.warning("Trace ID: %s" % trace_id)
|
||||||
|
self.log.warning("To display trace use next command:\n"
|
||||||
|
"osprofiler trace show --html %s " % trace_id)
|
||||||
|
|
||||||
|
def run_subcommand(self, argv):
|
||||||
|
self.init_profile()
|
||||||
|
try:
|
||||||
|
ret_value = super(OpenStackShell, self).run_subcommand(argv)
|
||||||
|
finally:
|
||||||
|
self.close_profile()
|
||||||
|
return ret_value
|
||||||
|
|
||||||
|
def interact(self):
|
||||||
|
self.init_profile()
|
||||||
|
try:
|
||||||
|
ret_value = super(OpenStackShell, self).run_subcommand()
|
||||||
|
finally:
|
||||||
|
self.close_profile()
|
||||||
|
return ret_value
|
||||||
|
|
||||||
def build_option_parser(self, description, version):
|
def build_option_parser(self, description, version):
|
||||||
parser = super(OpenStackShell, self).build_option_parser(
|
parser = super(OpenStackShell, self).build_option_parser(
|
||||||
description,
|
description,
|
||||||
@ -190,6 +228,19 @@ class OpenStackShell(app.App):
|
|||||||
help="Print API call timing info",
|
help="Print API call timing info",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# osprofiler HMAC key argument
|
||||||
|
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 one of the '
|
||||||
|
'HMAC keys configured in osprofiler '
|
||||||
|
'middleware in the projects user would like '
|
||||||
|
'to profile. It needs to be specified in '
|
||||||
|
'configuration files of the required '
|
||||||
|
'projects.')
|
||||||
|
|
||||||
return clientmanager.build_plugin_option_parser(parser)
|
return clientmanager.build_plugin_option_parser(parser)
|
||||||
|
|
||||||
def initialize_app(self, argv):
|
def initialize_app(self, argv):
|
||||||
|
@ -109,6 +109,7 @@ global_options = {
|
|||||||
'--os-default-domain': (DEFAULT_DOMAIN_NAME, True, True),
|
'--os-default-domain': (DEFAULT_DOMAIN_NAME, True, True),
|
||||||
'--os-cacert': ('/dev/null', True, True),
|
'--os-cacert': ('/dev/null', True, True),
|
||||||
'--timing': (True, True, False),
|
'--timing': (True, True, False),
|
||||||
|
'--profile': ('SECRET_KEY', True, False),
|
||||||
'--os-interface': (DEFAULT_INTERFACE, True, True)
|
'--os-interface': (DEFAULT_INTERFACE, True, True)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
OSprofiler support was added. To initiate OpenStack request tracing
|
||||||
|
``--profile <HMAC_KEY>`` option needs to be added to the CLI command. This
|
||||||
|
key needs to present one of the secret keys defined in the OpenStack
|
||||||
|
projects configuration files (if there is a wish to generate cross-project
|
||||||
|
trace, the chosen key needs to be presented in all these configuration
|
||||||
|
files). By default all OpenStack projects, that support OSprofiler,
|
||||||
|
are using ``SECRET_KEY`` HMAC key.
|
||||||
|
|
||||||
|
To use tracing functionality OSprofiler (and its storage backend)
|
||||||
|
needs to be installed in the environment. If so, you will be able to
|
||||||
|
trigger profiling via `openstack --profile SECRET_KEY <operation>` command.
|
||||||
|
At the end of output there will be message with <trace_id>, and to plot
|
||||||
|
human-readable HTML chart the following command should be used -
|
||||||
|
``osprofiler trace show <trace_id> --html --out result.html``.
|
@ -16,6 +16,7 @@ os-testr>=0.4.1 # Apache-2.0
|
|||||||
testrepository>=0.0.18 # Apache-2.0/BSD
|
testrepository>=0.0.18 # Apache-2.0/BSD
|
||||||
testtools>=1.4.0 # MIT
|
testtools>=1.4.0 # MIT
|
||||||
tempest-lib>=0.14.0 # Apache-2.0
|
tempest-lib>=0.14.0 # Apache-2.0
|
||||||
|
osprofiler>=1.1.0 # Apache-2.0
|
||||||
|
|
||||||
# Install these to generate sphinx autodocs
|
# Install these to generate sphinx autodocs
|
||||||
python-barbicanclient>=3.3.0 # Apache-2.0
|
python-barbicanclient>=3.3.0 # Apache-2.0
|
||||||
|
Loading…
Reference in New Issue
Block a user