]> review.fuel-infra Code Review - puppet-modules/puppet-ceilometer.git/commitdiff
Add extended logging options.
authorJohannes Grassler <j.grassler@syseleven.de>
Tue, 12 Aug 2014 12:17:33 +0000 (14:17 +0200)
committerJohannes Grassler <j.grassler@syseleven.de>
Tue, 7 Oct 2014 14:59:57 +0000 (16:59 +0200)
There is a range of extended logging options in Openstack services that use
openstack.common.logger (Ceilometer, Cinder, Heat, Keystone, Nova). Adding
ceilometer::logging to support them.

No blueprint/spec, as discussed in the IRC meeting on 08-11-2014.

Change-Id: I910e2f9e4f3ad1991d58ba6df16adfbc85e20131
(cherry picked from commit 078deea6169bb148e3d31743c2060a19f20e0fcc)

manifests/logging.pp [new file with mode: 0644]
spec/classes/ceilometer_logging_spec.rb [new file with mode: 0644]

diff --git a/manifests/logging.pp b/manifests/logging.pp
new file mode 100644 (file)
index 0000000..d94d281
--- /dev/null
@@ -0,0 +1,208 @@
+# Class ceilometer::logging
+#
+#  ceilometer extended logging configuration
+#
+# == parameters
+#
+#  [*logging_context_format_string*]
+#    (optional) Format string to use for log messages with context.
+#    Defaults to undef.
+#    Example: '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s\
+#              [%(request_id)s %(user_identity)s] %(instance)s%(message)s'
+#
+#  [*logging_default_format_string*]
+#    (optional) Format string to use for log messages without context.
+#    Defaults to undef.
+#    Example: '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s\
+#              [-] %(instance)s%(message)s'
+#
+#  [*logging_debug_format_suffix*]
+#    (optional) Formatted data to append to log format when level is DEBUG.
+#    Defaults to undef.
+#    Example: '%(funcName)s %(pathname)s:%(lineno)d'
+#
+#  [*logging_exception_prefix*]
+#    (optional) Prefix each line of exception output with this format.
+#    Defaults to undef.
+#    Example: '%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s'
+#
+#  [*log_config_append*]
+#    The name of an additional logging configuration file.
+#    Defaults to undef.
+#    See https://docs.python.org/2/howto/logging.html
+#
+#  [*default_log_levels*]
+#    (optional) Hash of logger (keys) and level (values) pairs.
+#    Defaults to undef.
+#    Example:
+#      { 'amqp' => 'WARN', 'amqplib' => 'WARN', 'boto' => 'WARN',
+#        'qpid' => 'WARN', 'sqlalchemy' => 'WARN', 'suds' => 'INFO',
+#        'iso8601' => 'WARN',
+#        'requests.packages.urllib3.connectionpool' => 'WARN' }
+#
+#  [*publish_errors*]
+#    (optional) Publish error events (boolean value).
+#    Defaults to undef (false if unconfigured).
+#
+#  [*fatal_deprecations*]
+#    (optional) Make deprecations fatal (boolean value)
+#    Defaults to undef (false if unconfigured).
+#
+#  [*instance_format*]
+#    (optional) If an instance is passed with the log message, format it
+#               like this (string value).
+#    Defaults to undef.
+#    Example: '[instance: %(uuid)s] '
+#
+#  [*instance_uuid_format*]
+#    (optional) If an instance UUID is passed with the log message, format
+#               it like this (string value).
+#    Defaults to undef.
+#    Example: instance_uuid_format='[instance: %(uuid)s] '
+
+#  [*log_date_format*]
+#    (optional) Format string for %%(asctime)s in log records.
+#    Defaults to undef.
+#    Example: 'Y-%m-%d %H:%M:%S'
+
+class ceilometer::logging(
+  $logging_context_format_string = undef,
+  $logging_default_format_string = undef,
+  $logging_debug_format_suffix   = undef,
+  $logging_exception_prefix      = undef,
+  $log_config_append             = undef,
+  $default_log_levels            = undef,
+  $publish_errors                = undef,
+  $fatal_deprecations            = undef,
+  $instance_format               = undef,
+  $instance_uuid_format          = undef,
+  $log_date_format               = undef,
+) {
+
+  if $logging_context_format_string {
+    ceilometer_config {
+      'DEFAULT/logging_context_format_string' :
+        value => $logging_context_format_string;
+      }
+    }
+  else {
+    ceilometer_config {
+      'DEFAULT/logging_context_format_string' : ensure => absent;
+      }
+    }
+
+  if $logging_default_format_string {
+    ceilometer_config {
+      'DEFAULT/logging_default_format_string' :
+        value => $logging_default_format_string;
+      }
+    }
+  else {
+    ceilometer_config {
+      'DEFAULT/logging_default_format_string' : ensure => absent;
+      }
+    }
+
+  if $logging_debug_format_suffix {
+    ceilometer_config {
+      'DEFAULT/logging_debug_format_suffix' :
+        value => $logging_debug_format_suffix;
+      }
+    }
+  else {
+    ceilometer_config {
+      'DEFAULT/logging_debug_format_suffix' : ensure => absent;
+      }
+    }
+
+  if $logging_exception_prefix {
+    ceilometer_config {
+      'DEFAULT/logging_exception_prefix' : value => $logging_exception_prefix;
+      }
+    }
+  else {
+    ceilometer_config {
+      'DEFAULT/logging_exception_prefix' : ensure => absent;
+      }
+    }
+
+  if $log_config_append {
+    ceilometer_config {
+      'DEFAULT/log_config_append' : value => $log_config_append;
+      }
+    }
+  else {
+    ceilometer_config {
+      'DEFAULT/log_config_append' : ensure => absent;
+      }
+    }
+
+  if $default_log_levels {
+    ceilometer_config {
+      'DEFAULT/default_log_levels' :
+        value => join(sort(join_keys_to_values($default_log_levels, '=')), ',');
+      }
+    }
+  else {
+    ceilometer_config {
+      'DEFAULT/default_log_levels' : ensure => absent;
+      }
+    }
+
+  if $publish_errors {
+    ceilometer_config {
+      'DEFAULT/publish_errors' : value => $publish_errors;
+      }
+    }
+  else {
+    ceilometer_config {
+      'DEFAULT/publish_errors' : ensure => absent;
+      }
+    }
+
+  if $fatal_deprecations {
+    ceilometer_config {
+      'DEFAULT/fatal_deprecations' : value => $fatal_deprecations;
+      }
+    }
+  else {
+    ceilometer_config {
+      'DEFAULT/fatal_deprecations' : ensure => absent;
+      }
+    }
+
+  if $instance_format {
+    ceilometer_config {
+      'DEFAULT/instance_format' : value => $instance_format;
+      }
+    }
+  else {
+    ceilometer_config {
+      'DEFAULT/instance_format' : ensure => absent;
+      }
+    }
+
+  if $instance_uuid_format {
+    ceilometer_config {
+      'DEFAULT/instance_uuid_format' : value => $instance_uuid_format;
+      }
+    }
+  else {
+    ceilometer_config {
+      'DEFAULT/instance_uuid_format' : ensure => absent;
+      }
+    }
+
+  if $log_date_format {
+    ceilometer_config {
+      'DEFAULT/log_date_format' : value => $log_date_format;
+      }
+    }
+  else {
+    ceilometer_config {
+      'DEFAULT/log_date_format' : ensure => absent;
+      }
+    }
+
+
+}
diff --git a/spec/classes/ceilometer_logging_spec.rb b/spec/classes/ceilometer_logging_spec.rb
new file mode 100644 (file)
index 0000000..7599ef2
--- /dev/null
@@ -0,0 +1,107 @@
+require 'spec_helper'
+
+describe 'ceilometer::logging' do
+
+  let :params do
+    {
+    }
+  end
+
+  let :log_params do
+    {
+      :logging_context_format_string => '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s',
+      :logging_default_format_string => '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s',
+      :logging_debug_format_suffix => '%(funcName)s %(pathname)s:%(lineno)d',
+      :logging_exception_prefix => '%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s',
+      :log_config_append => '/etc/ceilometer/logging.conf',
+      :publish_errors => true,
+      :default_log_levels => { 
+        'amqp' => 'WARN', 'amqplib' => 'WARN', 'boto' => 'WARN',
+        'qpid' => 'WARN', 'sqlalchemy' => 'WARN', 'suds' => 'INFO',
+        'iso8601' => 'WARN',
+        'requests.packages.urllib3.connectionpool' => 'WARN' },
+     :fatal_deprecations => true,
+     :instance_format => '[instance: %(uuid)s] ',
+     :instance_uuid_format => '[instance: %(uuid)s] ',
+     :log_date_format => '%Y-%m-%d %H:%M:%S',
+    }
+  end
+
+  shared_examples_for 'ceilometer-logging' do
+
+    context 'with extended logging options' do
+      before { params.merge!( log_params ) }
+      it_configures 'logging params set'
+    end
+
+    context 'without extended logging options' do
+      it_configures 'logging params unset'
+    end
+
+  end
+
+  shared_examples_for 'logging params set' do
+    it 'enables logging params' do
+      should contain_ceilometer_config('DEFAULT/logging_context_format_string').with_value(
+        '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s')
+
+      should contain_ceilometer_config('DEFAULT/logging_default_format_string').with_value(
+        '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s')
+
+      should contain_ceilometer_config('DEFAULT/logging_debug_format_suffix').with_value(
+        '%(funcName)s %(pathname)s:%(lineno)d')
+
+      should contain_ceilometer_config('DEFAULT/logging_exception_prefix').with_value(
+       '%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s')
+
+      should contain_ceilometer_config('DEFAULT/log_config_append').with_value(
+        '/etc/ceilometer/logging.conf')
+      should contain_ceilometer_config('DEFAULT/publish_errors').with_value(
+        true)
+
+      should contain_ceilometer_config('DEFAULT/default_log_levels').with_value(
+        'amqp=WARN,amqplib=WARN,boto=WARN,iso8601=WARN,qpid=WARN,requests.packages.urllib3.connectionpool=WARN,sqlalchemy=WARN,suds=INFO')
+
+      should contain_ceilometer_config('DEFAULT/fatal_deprecations').with_value(
+        true)
+
+      should contain_ceilometer_config('DEFAULT/instance_format').with_value(
+        '[instance: %(uuid)s] ')
+
+      should contain_ceilometer_config('DEFAULT/instance_uuid_format').with_value(
+        '[instance: %(uuid)s] ')
+
+      should contain_ceilometer_config('DEFAULT/log_date_format').with_value(
+        '%Y-%m-%d %H:%M:%S')
+    end
+  end
+
+
+  shared_examples_for 'logging params unset' do
+   [ :logging_context_format_string, :logging_default_format_string,
+     :logging_debug_format_suffix, :logging_exception_prefix,
+     :log_config_append, :publish_errors,
+     :default_log_levels, :fatal_deprecations,
+     :instance_format, :instance_uuid_format,
+     :log_date_format, ].each { |param|
+        it { should contain_ceilometer_config("DEFAULT/#{param}").with_ensure('absent') }
+      }
+  end
+
+  context 'on Debian platforms' do
+    let :facts do
+      { :osfamily => 'Debian' }
+    end
+
+    it_configures 'ceilometer-logging'
+  end
+
+  context 'on RedHat platforms' do
+    let :facts do
+      { :osfamily => 'RedHat' }
+    end
+
+    it_configures 'ceilometer-logging'
+  end
+
+end