osprofiler/osprofiler/notifier.py
Ilya Shakhat 34ca7ab4b5 Handle driver initialization errors to avoid service crash
This patch fixes the issue when failed osprofiler driver brings
the whole service down. With this patch the default no-op behaviour
is used in case of initialization failure.

Change-Id: I6ebc393576f4fc3f8b4134164bafc2e09f102ebd
2019-07-24 17:02:28 +02:00

83 lines
2.6 KiB
Python

# Copyright 2014 Mirantis Inc.
# All Rights Reserved.
#
# 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 logging
from osprofiler.drivers import base
LOG = logging.getLogger(__name__)
def _noop_notifier(info, context=None):
"""Do nothing on notify()."""
# NOTE(boris-42): By default we are using noop notifier.
__notifier = _noop_notifier
__notifier_cache = {} # map: connection-string -> notifier
def notify(info):
"""Passes the profiling info to the notifier callable.
:param info: dictionary with profiling information
"""
__notifier(info)
def get():
"""Returns notifier callable."""
return __notifier
def set(notifier):
"""Service that are going to use profiler should set callable notifier.
Callable notifier is instance of callable object, that accept exactly
one argument "info". "info" - is dictionary of values that contains
profiling information.
"""
global __notifier
__notifier = notifier
def create(connection_string, *args, **kwargs):
"""Create notifier based on specified plugin_name
:param connection_string: connection string which specifies the storage
driver for notifier
:param args: args that will be passed to the driver's __init__ method
:param kwargs: kwargs that will be passed to the driver's __init__ method
:returns: Callable notifier method
"""
global __notifier_cache
if connection_string not in __notifier_cache:
try:
driver = base.get_driver(connection_string, *args, **kwargs)
__notifier_cache[connection_string] = driver.notify
LOG.info("osprofiler is enabled with connection string: %s",
connection_string)
except Exception:
LOG.exception("Could not initialize driver for connection string "
"%s, osprofiler is disabled", connection_string)
__notifier_cache[connection_string] = _noop_notifier
return __notifier_cache[connection_string]
def clear_notifier_cache():
__notifier_cache.clear()