BryanDavis has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/230233

Change subject: logstash: Count MediaWiki log events with statsd
......................................................................

logstash: Count MediaWiki log events with statsd

Count each MediaWiki logstash event by sending an increment command for
the counter "logstash.rate.mediawiki.$CHANNEL.$LEVEL" (eg
"logstash.rate.mediawiki.memcached.ERROR") to a statsd server.

Bug: T100735
Change-Id: I4771abef68a151d08340b63f95cc556c8010416d
---
M hieradata/labs/deployment-prep/common.yaml
M hieradata/role/common/logstash.yaml
M manifests/role/logstash.pp
A modules/logstash/manifests/output/statsd.pp
A modules/logstash/templates/output/statsd.erb
5 files changed, 107 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/puppet 
refs/changes/33/230233/1

diff --git a/hieradata/labs/deployment-prep/common.yaml 
b/hieradata/labs/deployment-prep/common.yaml
index 0879893..f2461ad 100644
--- a/hieradata/labs/deployment-prep/common.yaml
+++ b/hieradata/labs/deployment-prep/common.yaml
@@ -132,6 +132,7 @@
     - deployment-elastic08
 "elasticsearch::cluster_name": beta-search
 "elasticsearch::script_disable_dynamic": false
+role::logstash::statsd_host: labmon1001.eqiad.wmnet
 nfs_mounts:
   project: false
   home: false
diff --git a/hieradata/role/common/logstash.yaml 
b/hieradata/role/common/logstash.yaml
index f77985e..b040192 100644
--- a/hieradata/role/common/logstash.yaml
+++ b/hieradata/role/common/logstash.yaml
@@ -39,6 +39,8 @@
   - logstash1005.eqiad.wmnet
   - logstash1006.eqiad.wmnet
 
+role::logstash::statsd_host: statsd.eqiad.wmnet
+
 # Kibana
 role::kibana::vhost: logstash.wmflabs.org
 role::kibana::serveradmin: [email protected]
diff --git a/manifests/role/logstash.pp b/manifests/role/logstash.pp
index 2834399..3892ce9 100644
--- a/manifests/role/logstash.pp
+++ b/manifests/role/logstash.pp
@@ -5,7 +5,12 @@
 #
 # Provisions Logstash and ElasticSearch.
 #
-class role::logstash {
+# == Parameters:
+# - $statsd_host: Host to send statsd data to.
+#
+class role::logstash (
+    $statsd_host,
+) {
     include ::role::logstash::elasticsearch
     include ::logstash
 
@@ -71,6 +76,7 @@
         priority => 70,
     }
 
+    ## Outputs (90)
     # Template for Elasticsearch index creation
     file { '/etc/logstash/elasticsearch-template.json':
         ensure => present,
@@ -88,6 +94,14 @@
         template        => '/etc/logstash/elasticsearch-template.json',
         require         => File['/etc/logstash/elasticsearch-template.json'],
     }
+
+    logstash::output::statsd { 'MW_channel_rate':
+        host            => $statsd_host,
+        guard_condition => '[type] == "mediawiki" and "es" in [tags]',
+        namespace       => 'logstash.rate',
+        sender          => 'mediawiki',
+        increment       => [ '%{channel}.%{level}' ],
+    }
 }
 
 # == Class: role::logstash::elasticsearch
diff --git a/modules/logstash/manifests/output/statsd.pp 
b/modules/logstash/manifests/output/statsd.pp
new file mode 100644
index 0000000..82dd2ea
--- /dev/null
+++ b/modules/logstash/manifests/output/statsd.pp
@@ -0,0 +1,60 @@
+# == Define: logstash::output::statsd
+#
+# Configure logstash to output to statsd
+#
+# Metric names are formed as "${namespace}.${sender}.${metric}" following the
+# Etsy naming style. $namespace will be omitted if set to an empty string and
+# can be formed using Logstash "%{foo}" style printf substution based on the
+# contents of the Logstash event being processed. $sender will have dots
+# replaced with underscores. These conventions are enforced by the Logstash
+# output plugin, so figure out how deal with them for your use case.
+#
+# == Parameters:
+# - $ensure: Whether the config should exist. Default present.
+# - $host: statsd server. Default '127.0.0.1'.
+# - $port: statsd server port. Default 8125.
+# - $guard_condition: Logstash condition to require to pass events to output.
+#     Default undef.
+# - $namespace: The statsd namespace to use for this metric.
+#     Default 'logstash'.
+# - $sender: Name of the sender. Dots will be replaced with underscores.
+#     Default $host.
+# - $count: Hash of metric_name => count values. Default undef.
+# - $decrement: Array of metric names to decrement. Default undef.
+# - $gauge: Hash of metric_name => gauge values. Default undef.
+# - $increment: Array of metric names to increment. Default undef.
+# - $set: Hash of metric_name => set values. Default undef.
+# - $timing: Hash of metric_name => timing values. Default undef.
+# - $sample_rate: The sample rate for the metric. Default 1.
+#
+# == Sample usage:
+#
+#   logstash::output::statsd { 'MW_channel_rate':
+#       guard_condition => '[type] == "mediawiki" and "es" in [tags]',
+#       namespace       => 'logstash.rate',
+#       sender          => 'mediawiki',
+#       increment       => [ "%{channel}.%{level}" ],
+#   }
+#
+define logstash::output::statsd(
+    $ensure          = present,
+    $host            = '127.0.0.1',
+    $port            = 8125,
+    $guard_condition = undef,
+    $namespace       = 'logstash',
+    $sender          = $host,
+    $count           = undef,
+    $decrement       = undef,
+    $gauge           = undef,
+    $increment       = undef,
+    $set             = undef,
+    $timing          = undef,
+    $sample_rate     = 1,
+) {
+    logstash::conf { "output-statsd-${title}":
+        ensure   => $ensure,
+        content  => template('logstash/output/statsd.erb'),
+        priority => $priority,
+    }
+}
+# vim:sw=4 ts=4 sts=4 et:
diff --git a/modules/logstash/templates/output/statsd.erb 
b/modules/logstash/templates/output/statsd.erb
new file mode 100644
index 0000000..83d031c
--- /dev/null
+++ b/modules/logstash/templates/output/statsd.erb
@@ -0,0 +1,29 @@
+output {
+<% if @guard_condition %>if <%= @guard_condition %> {<% end %>
+    statsd {
+        host        => "<%= @host %>"
+        port        => <%= @port %>
+        namespace   => "<%= @namespace %>"
+        sender      => "<%= @sender %>"
+        sample_rate => <%= @sample_rate %>
+    <% if @count %>
+        count       => [ "<%= @count.map{|e| e.join('","') }.join('","') %>" ]
+    <% endif %>
+    <% if @decrement %>
+        decrement   => [ "<%= @decrement.join('","') %>" ]
+    <% endif %>
+    <% if @gauge %>
+        gauge       => [ "<%= @gauge.map{|e| e.join('","') }.join('","') %>" ]
+    <% endif %>
+    <% if @increment %>
+        increment   => [ "<%= @increment.join('","') %>" ]
+    <% endif %>
+    <% if @set %>
+        set         => [ "<%= @set.map{|e| e.join('","') }.join('","') %>" ]
+    <% endif %>
+    <% if @timing %>
+        timing      => [ "<%= @timing.map{|e| e.join('","') }.join('","') %>" ]
+    <% endif %>
+    }
+<% if @guard_condition %>}<% end %>
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/230233
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4771abef68a151d08340b63f95cc556c8010416d
Gerrit-PatchSet: 1
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: BryanDavis <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to