updates to collectd support
authorLars Kellogg-Stedman <lars@redhat.com>
Thu, 15 Dec 2016 03:07:26 +0000 (22:07 -0500)
committerLars Kellogg-Stedman <lars@redhat.com>
Wed, 18 Jan 2017 15:06:15 +0000 (10:06 -0500)
Based on Steve Hardy's comments in
https://review.openstack.org/#/c/413748/, we need to move handling of
the list of plugins out of the heat templates and into puppet.  This
module now uses the service_names variable to look up information on
per-service collectd plugins.

Change-Id: Ie5fba01e1f91ffdc39eb0eb1be9b1464c797b04f

manifests/profile/base/metrics/collectd.pp
manifests/profile/base/metrics/collectd/collectd_plugin.pp [new file with mode: 0644]
manifests/profile/base/metrics/collectd/collectd_service.pp [new file with mode: 0644]

index 0f738d1..d8e6f89 100644 (file)
@@ -1,13 +1,27 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# 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.
+#
 # == Class: tripleo::profile::base::metrics::collectd
 #
 # Collectd configuration for TripleO
 #
 # === Parameters
 #
-# [*collectd_plugins*]
-#   (Optional) List. A list of collectd plugins to configure (the
-#   corresponding collectd::plugin::NAME class must exist in the
-#   collectd package).
+# [*step*]
+#   (Optional) The current step in deployment. See tripleo-heat-templates
+#   for more details.
+#   Defaults to hiera('step')
 #
 # [*collectd_server*]
 #   (Optional) String. The name or address of a collectd server to
 # [*collectd_securitylevel*]
 #   (Optional) String.
 #
-# [*collectd_interface*]
-#   (Optional) String. Name of a network interface.
-#
-# [*collectd_graphite_server*]
-#   (Optional) String. The name or address of a graphite server to
-#   which we should send metrics.
-#
-# [*collectd_graphite_port*]
-#   (Optional) Integer.  This is the port to which we will connect on
-#   the graphite server. Defaults to 2004.
-#
-# [*collectd_graphite_prefix*]
-#   (Optional) String. Prefix to add to metric names. Defaults to
-#   'overcloud.'.
-#
-# [*collectd_graphite_protocol*]
-#   (Optional) String. One of 'udp' or 'tcp'.
-#
+# [*service_names*]
+#   (Optional) List of strings.  A list of active services in this tripleo
+#   deployment. This is used to look up service-specific plugins that
+#   need to be installed.
 class tripleo::profile::base::metrics::collectd (
-  $collectd_plugins = [],
+  $step = hiera('step'),
 
   $collectd_server = undef,
-  $collectd_port = 25826,
+  $collectd_port = undef,
   $collectd_username = undef,
   $collectd_password = undef,
   $collectd_securitylevel = undef,
-
-  $collectd_graphite_server = undef,
-  $collectd_graphite_port = 2004,
-  $collectd_graphite_prefix = undef,
-  $collectd_graphite_protocol = 'udp'
+  $service_names = hiera('service_names', [])
 ) {
-  include ::collectd
-  ::tripleo::profile::base::metrics::collectd::plugin_helper { $collectd_plugins: }
+  if $step >= 3 {
+    include ::collectd
 
-  if ! ($collectd_graphite_protocol in ['udp', 'tcp']) {
-    fail("collectd_graphite_protocol must be one of 'udp' or 'tcp'")
-  }
+    if ! ($collectd_securitylevel in [undef, 'None', 'Sign', 'Encrypt']) {
+      fail('collectd_securitylevel must be one of (None, Sign, Encrypt).')
+    }
+
+    # Load per-service plugin configuration
+    ::tripleo::profile::base::metrics::collectd::collectd_service {
+      $service_names: }
+
+    # Because THT doesn't allow us to default values to undef, we need
+    # to perform a number of transformations here to avoid passing a bunch of
+    # empty strings to the collectd plugins.
 
-  if $collectd_server {
-    ::collectd::plugin::network::server { $collectd_server:
-      username      => $collectd_username,
-      password      => $collectd_password,
-      port          => $collectd_port,
-      securitylevel => $collectd_securitylevel,
+    $_collectd_username = empty($collectd_username) ? {
+      true    => undef,
+      default => $collectd_username
+    }
+
+    $_collectd_password = empty($collectd_password) ? {
+      true    => undef,
+      default => $collectd_password
     }
-  }
 
-  if $collectd_graphite_server {
-    ::collectd::plugin::write_graphite::carbon { 'openstack_graphite':
-      graphitehost   => $collectd_graphite_server,
-      graphiteport   => $collectd_graphite_port,
-      graphiteprefix => $collectd_graphite_prefix,
-      protocol       => $collectd_graphite_protocol,
+    $_collectd_port = empty($collectd_port) ? {
+      true    => undef,
+      default => $collectd_port
+    }
+
+    $_collectd_securitylevel = empty($collectd_securitylevel) ? {
+      true    => undef,
+      default => $collectd_securitylevel
+    }
+
+    if ! empty($collectd_server) {
+      ::collectd::plugin::network::server { $collectd_server:
+        username      => $_collectd_username,
+        password      => $_collectd_password,
+        port          => $_collectd_port,
+        securitylevel => $_collectd_securitylevel,
+      }
     }
   }
 }
-
diff --git a/manifests/profile/base/metrics/collectd/collectd_plugin.pp b/manifests/profile/base/metrics/collectd/collectd_plugin.pp
new file mode 100644 (file)
index 0000000..5ab940b
--- /dev/null
@@ -0,0 +1,6 @@
+# We use this to transform a list of unqualified plugin names
+# (like ['disk', 'ntpd']) into the correct collectd plugin classes.
+define tripleo::profile::base::metrics::collectd::collectd_plugin (
+) {
+  include "collectd::plugin::${title}"
+}
diff --git a/manifests/profile/base/metrics/collectd/collectd_service.pp b/manifests/profile/base/metrics/collectd/collectd_service.pp
new file mode 100644 (file)
index 0000000..c1b3a60
--- /dev/null
@@ -0,0 +1,11 @@
+# This is used to look up a list of service-specific collectd plugins
+# in the hiera data provided by THT.
+define tripleo::profile::base::metrics::collectd::collectd_service (
+) {
+  $plugins = hiera("tripleo.collectd.plugins.${title}", [])
+
+  if $plugins {
+    ::tripleo::profile::base::metrics::collectd::collectd_plugin {
+      $plugins: }
+  }
+}