Merge "Add Guru Meditation Report feature"
This commit is contained in:
commit
c149c8cb8d
88
doc/source/gmr.rst
Normal file
88
doc/source/gmr.rst
Normal file
@ -0,0 +1,88 @@
|
||||
..
|
||||
Copyright (c) 2015 OpenStack Foundation
|
||||
|
||||
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.
|
||||
|
||||
Guru Meditation Reports
|
||||
=======================
|
||||
|
||||
Octavia contains a mechanism whereby developers and system administrators can
|
||||
generate a report about the state of a running Octavia executable. This report
|
||||
is called a *Guru Meditation Report* (*GMR* for short).
|
||||
|
||||
Generating a GMR
|
||||
----------------
|
||||
|
||||
A *GMR* can be generated by sending the *USR2* signal to any Octavia process
|
||||
with support (see below). The *GMR* will then be outputted as standard error
|
||||
for that particular process.
|
||||
|
||||
For example, suppose that ``octavia-api`` has process id ``8675``, and was run
|
||||
with ``2>/var/log/octavia/octavia-api-err.log``. Then, ``kill -USR2 8675`` will
|
||||
trigger the Guru Meditation report to be printed to
|
||||
``/var/log/octavia/octavia-api-err.log``.
|
||||
|
||||
Structure of a GMR
|
||||
------------------
|
||||
|
||||
The *GMR* is designed to be extensible; any particular executable may add its
|
||||
own sections. However, the base *GMR* consists of several sections:
|
||||
|
||||
Package
|
||||
Shows information about the package to which this process belongs, including
|
||||
version informations.
|
||||
|
||||
Threads
|
||||
Shows stack traces and thread ids for each of the threads within this
|
||||
process.
|
||||
|
||||
Green Threads
|
||||
Shows stack traces for each of the green threads within this process (green
|
||||
threads don't have thread ids).
|
||||
|
||||
Configuration
|
||||
Lists all the configuration options currently accessible via the CONF object
|
||||
for the current process.
|
||||
|
||||
Adding Support for GMRs to New Executables
|
||||
------------------------------------------
|
||||
|
||||
Adding support for a *GMR* to a given executable is fairly easy.
|
||||
|
||||
First import the module:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from oslo_reports import guru_meditation_report as gmr
|
||||
from octavia import version
|
||||
|
||||
Then, register any additional sections (optional):
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
TextGuruMeditation.register_section('Some Special Section',
|
||||
some_section_generator)
|
||||
|
||||
Finally (under main), before running the "main loop" of the executable (usually
|
||||
``service.server(server)`` or something similar), register the *GMR* hook:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
TextGuruMeditation.setup_autorun(version)
|
||||
|
||||
Extending the GMR
|
||||
-----------------
|
||||
|
||||
As mentioned above, additional sections can be added to the GMR for a
|
||||
particular executable. For more information, see the inline documentation
|
||||
under :mod:`oslo.reports`
|
@ -23,11 +23,13 @@ import ssl
|
||||
import sys
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_reports import guru_meditation_report as gmr
|
||||
from werkzeug import serving
|
||||
|
||||
from octavia.amphorae.backends.agent.api_server import server
|
||||
from octavia.amphorae.backends.health_daemon import health_daemon
|
||||
from octavia.common import service
|
||||
from octavia import version
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
CONF = cfg.CONF
|
||||
@ -64,6 +66,8 @@ def main():
|
||||
# comment out to improve logging
|
||||
service.prepare_service(sys.argv)
|
||||
|
||||
gmr.TextGuruMeditation.setup_autorun(version)
|
||||
|
||||
# Workaround for an issue with the auto-reload used below in werkzeug
|
||||
# Without it multiple health senders get started when werkzeug reloads
|
||||
if not os.environ.get('WERKZEUG_RUN_MAIN'):
|
||||
|
@ -19,10 +19,12 @@ from wsgiref import simple_server
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_reports import guru_meditation_report as gmr
|
||||
|
||||
from octavia.api import app as api_app
|
||||
from octavia.common import service as octavia_service
|
||||
from octavia.i18n import _LI
|
||||
from octavia import version
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
@ -30,6 +32,9 @@ LOG = logging.getLogger(__name__)
|
||||
|
||||
def main():
|
||||
octavia_service.prepare_service(sys.argv)
|
||||
|
||||
gmr.TextGuruMeditation.setup_autorun(version)
|
||||
|
||||
app = api_app.setup_app()
|
||||
|
||||
host, port = cfg.CONF.bind_host, cfg.CONF.bind_port
|
||||
|
@ -17,6 +17,7 @@ import sys
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_reports import guru_meditation_report as gmr
|
||||
|
||||
from octavia.amphorae.drivers.health import heartbeat_udp
|
||||
from octavia.common import service
|
||||
@ -24,6 +25,8 @@ from octavia.controller.healthmanager import health_manager
|
||||
from octavia.controller.healthmanager import update_health_mixin
|
||||
from octavia.controller.healthmanager import update_stats_mixin
|
||||
from octavia.i18n import _LI
|
||||
from octavia import version
|
||||
|
||||
|
||||
CONF = cfg.CONF
|
||||
LOG = logging.getLogger(__name__)
|
||||
@ -47,6 +50,9 @@ def hm_health_check():
|
||||
|
||||
def main():
|
||||
service.prepare_service(sys.argv)
|
||||
|
||||
gmr.TextGuruMeditation.setup_autorun(version)
|
||||
|
||||
processes = []
|
||||
|
||||
hm_listener_proc = multiprocessing.Process(name='HM_listener',
|
||||
|
@ -20,10 +20,13 @@ import time
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_reports import guru_meditation_report as gmr
|
||||
|
||||
from octavia.common import service
|
||||
from octavia.controller.housekeeping import house_keeping
|
||||
from octavia.i18n import _LI
|
||||
from octavia import version
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
CONF = cfg.CONF
|
||||
@ -65,6 +68,8 @@ def db_cleanup():
|
||||
def main():
|
||||
service.prepare_service(sys.argv)
|
||||
|
||||
gmr.TextGuruMeditation.setup_autorun(version)
|
||||
|
||||
timestamp = str(datetime.datetime.utcnow())
|
||||
LOG.info(_LI("Starting house keeping at %s"), timestamp)
|
||||
|
||||
|
@ -17,14 +17,19 @@ import sys
|
||||
import eventlet
|
||||
eventlet.monkey_patch()
|
||||
from oslo_log import log as logging
|
||||
from oslo_reports import guru_meditation_report as gmr
|
||||
|
||||
from octavia.common import service
|
||||
from octavia.controller.queue import consumer
|
||||
from octavia import version
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def main():
|
||||
service.prepare_service(sys.argv)
|
||||
|
||||
gmr.TextGuruMeditation.setup_autorun(version)
|
||||
|
||||
c = consumer.Consumer()
|
||||
c.listen()
|
||||
|
@ -20,6 +20,7 @@ oslo.i18n>=1.5.0 # Apache-2.0
|
||||
oslo.log>=1.12.0 # Apache-2.0
|
||||
oslo.messaging!=1.17.0,!=1.17.1,!=2.6.0,!=2.6.1,!=2.8.0,>=1.16.0 # Apache-2.0
|
||||
oslo.middleware>=2.9.0 # Apache-2.0
|
||||
oslo.reports>=0.6.0 # Apache-2.0
|
||||
oslo.rootwrap>=2.0.0 # Apache-2.0
|
||||
oslo.serialization>=1.10.0 # Apache-2.0
|
||||
oslo.service>=0.10.0 # Apache-2.0
|
||||
|
Loading…
x
Reference in New Issue
Block a user