telegraf 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5f68b6dfd1bcf5659a4ee22bbe80665502a4fc09e55b90834ec85ab09e040893
4
- data.tar.gz: d5be579cd9bec77152ef0af33ed0c7040a2f5cfe59923da85f096be604e07ba5
3
+ metadata.gz: 7c8831d93642d86138aba55b26bfcb5d676bf8d223702f74361716dd2bdbf315
4
+ data.tar.gz: be3e3b368dbfde682bd1ade3650277119a0302e9d604ebdd920ede401858487c
5
5
  SHA512:
6
- metadata.gz: c7b349c501e843458c7232f4695638a763927895c4001efe4b23cc76cda6ba4b6143153f0f43a9b037130b192cb1ca8152509488413947ae3de9cd8e120361be
7
- data.tar.gz: 88a520e880d0507da05f9af9c58b69288bf59968dc4fc54238f6cdf1a5a8ca92359fe5bf6ab558171cbaf09111e1634a827c0607e1afbcf24c35285e8b8bbe15
6
+ metadata.gz: 22d42f69c60e4c75c32e76f01113bc1077cc1111deb12d2949ca21c44d04273d84807632f082d0759aba7ce90659ac8d68fcf4a70ad8e5e7bf7879a727dd31df
7
+ data.tar.gz: e4be9374228b344550962c463ae26283404c2f7701876c785c3b5063d937f6e037f7603e387ec5daf6781c799d2715b415ae899213f8eee0c6ce1da8743407e9
@@ -4,7 +4,9 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [Unreleased]
7
+ ## [0.7.0] - 2020-05-07
8
+ ### Added
9
+ - Sidekiq middleware (#8)
8
10
 
9
11
  ## [0.6.1] - 2020-04-01
10
12
  ### Fixed
@@ -18,6 +20,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
18
20
  ### Changed
19
21
  - Remove `influxdb` not unnecessarily restrict users needing a specific influxdb client.
20
22
 
21
- [unreleased]: https://github.com/:jgraichen/telegraf-ruby/compare/v0.6.1...HEAD
23
+ [0.7.0]: https://github.com/:jgraichen/telegraf-ruby/compare/v0.6.1...v0.7.0
22
24
  [0.6.1]: https://github.com/:jgraichen/telegraf-ruby/compare/v0.6.0...v0.6.1
23
25
  [0.6.0]: https://github.com/:jgraichen/telegraf-ruby/compare/v0.5.0...v0.6.0
data/Gemfile CHANGED
@@ -10,6 +10,7 @@ gem 'rubocop', '~> 0.80.0'
10
10
 
11
11
  gem 'rack'
12
12
  gem 'railties'
13
+ gem 'sidekiq', '~> 6.0'
13
14
 
14
15
  # Specify your gem's dependencies in telegraf.gemspec
15
16
  gemspec
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Send events to a local [Telegraf](https://github.com/influxdata/telegraf) agent or anything that can receive the InfluxDB line protocol.
4
4
 
5
- It further includes plugins for Rack and Rails to collect request events. See plugin usage details below.
5
+ It further includes plugins for Rack, Rails and Sidekiq to collect request events. See plugin usage details below.
6
6
 
7
7
  This gem only uses the line protocol from the `influxdb` gem and does not depend on any specific version. This may break in the future but does not restrict you in using a your preferred `influxdb` gem version.
8
8
 
@@ -51,7 +51,7 @@ There is no exception handling.
51
51
 
52
52
  ## Using the Rack and Rails plugins
53
53
 
54
- This gem include a Rails plugin and a rack middleware to collect request events. They need to be explicitly required to be used:
54
+ This gem include a Rails plugin and middlewares for Rack and Sidekiq to collect request events. They need to be explicitly required to be used:
55
55
 
56
56
  ### Rack
57
57
 
@@ -68,7 +68,7 @@ The Rack middleware supports parsing the `X-Request-Start: t=<timestamp>` header
68
68
 
69
69
  ### Rails
70
70
 
71
- The Rails plugin needs to required too but by default automatically installs required components.
71
+ The Rails plugin needs to required, too, but by default automatically installs required components (Rack, Sidekiq and Rails-specific instrumentation).
72
72
 
73
73
  ```ruby
74
74
  # e.g. in application.rb
@@ -84,6 +84,11 @@ class MyApplication > ::Rails::Application
84
84
  config.telegraf.rack.series = "requests"
85
85
  config.telegraf.rack.tags = {}
86
86
 
87
+ # These are the default settings when Sidekiq is detected
88
+ config.telegraf.sidekiq.enabled = true
89
+ config.telegraf.sidekiq.series = "sidekiq"
90
+ config.telegraf.sidekiq.tags = {}
91
+
87
92
  # Additionally the application is instrumented to tag events with
88
93
  # controller and action as well as to collect app, database and view timings
89
94
  config.telegraf.instrumentation = true
@@ -96,7 +101,26 @@ Received event example:
96
101
  requests,action=index,controller=TestController,instance=TestController#index,method=GET,status=200 db_ms=0.0,view_ms=2.6217450003969134,action_ms=2.702335,app_ms=4.603561000294576,send_ms=0.09295000018028077,request_ms=4.699011000411701,queue_ms=0.00003000028323014
97
102
  ```
98
103
 
99
- See the rack middleware [class documentation](lib/telegraf/rack.rb) and the Rails plugin [class documentation](lib/telegraf/railtie.rb) for more details on the collected tags and values.
104
+ See the various classes' documentation for more details on the collected tags and values:
105
+ - [Rack middleware](lib/telegraf/rack.rb)
106
+ - [Rails plugin](lib/telegraf/railtie.rb)
107
+ - [Sidekiq middleware](lib/telegraf/sidekiq.rb)
108
+
109
+ ### Sidekiq
110
+
111
+ ```ruby
112
+ require "telegraf/sidekiq"
113
+
114
+ agent = ::Telegraf::Agent.new
115
+ Sidekiq.configure_server do |config|
116
+ config.server_middleware do |chain|
117
+ chain.add ::Telegraf::Sidekiq::Middleware, agent: agent, series: 'background', tags: {global: 'tag'}
118
+ end
119
+ end
120
+ ```
121
+
122
+ See middleware [class documentation](lib/telegraf/sidekiq.rb) for more details.
123
+
100
124
 
101
125
  ## License
102
126
 
@@ -2,11 +2,13 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubocop", "~> 0.80.0"
5
+ gem "appraisal"
6
+ gem "rake-release", "~> 1.2"
6
7
  gem "rake"
7
8
  gem "rspec", "~> 3.8"
8
- gem "appraisal"
9
+ gem "rubocop", "~> 0.80.0"
9
10
  gem "rack", "~> 2.0.0"
10
11
  gem "railties"
12
+ gem "sidekiq", "~> 6.0"
11
13
 
12
14
  gemspec path: "../"
@@ -2,11 +2,13 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubocop", "~> 0.80.0"
5
+ gem "appraisal"
6
+ gem "rake-release", "~> 1.2"
6
7
  gem "rake"
7
8
  gem "rspec", "~> 3.8"
8
- gem "appraisal"
9
+ gem "rubocop", "~> 0.80.0"
9
10
  gem "rack", "~> 2.1.0"
10
11
  gem "railties"
12
+ gem "sidekiq", "~> 6.0"
11
13
 
12
14
  gemspec path: "../"
@@ -2,11 +2,13 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubocop", "~> 0.80.0"
5
+ gem "appraisal"
6
+ gem "rake-release", "~> 1.2"
6
7
  gem "rake"
7
8
  gem "rspec", "~> 3.8"
8
- gem "appraisal"
9
+ gem "rubocop", "~> 0.80.0"
9
10
  gem "rack", "~> 2.2.0"
10
11
  gem "railties"
12
+ gem "sidekiq", "~> 6.0"
11
13
 
12
14
  gemspec path: "../"
@@ -2,11 +2,13 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubocop", "~> 0.80.0"
5
+ gem "appraisal"
6
+ gem "rake-release", "~> 1.2"
6
7
  gem "rake"
7
8
  gem "rspec", "~> 3.8"
8
- gem "appraisal"
9
+ gem "rubocop", "~> 0.80.0"
9
10
  gem "rack"
10
11
  gem "railties", "~> 5.0.0"
12
+ gem "sidekiq", "~> 6.0"
11
13
 
12
14
  gemspec path: "../"
@@ -2,11 +2,13 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubocop", "~> 0.80.0"
5
+ gem "appraisal"
6
+ gem "rake-release", "~> 1.2"
6
7
  gem "rake"
7
8
  gem "rspec", "~> 3.8"
8
- gem "appraisal"
9
+ gem "rubocop", "~> 0.80.0"
9
10
  gem "rack"
10
11
  gem "railties", "~> 5.1.0"
12
+ gem "sidekiq", "~> 6.0"
11
13
 
12
14
  gemspec path: "../"
@@ -2,11 +2,13 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubocop", "~> 0.80.0"
5
+ gem "appraisal"
6
+ gem "rake-release", "~> 1.2"
6
7
  gem "rake"
7
8
  gem "rspec", "~> 3.8"
8
- gem "appraisal"
9
+ gem "rubocop", "~> 0.80.0"
9
10
  gem "rack"
10
11
  gem "railties", "~> 5.2.0"
12
+ gem "sidekiq", "~> 6.0"
11
13
 
12
14
  gemspec path: "../"
@@ -2,11 +2,13 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubocop", "~> 0.80.0"
5
+ gem "appraisal"
6
+ gem "rake-release", "~> 1.2"
6
7
  gem "rake"
7
8
  gem "rspec", "~> 3.8"
8
- gem "appraisal"
9
+ gem "rubocop", "~> 0.80.0"
9
10
  gem "rack"
10
11
  gem "railties", "~> 6.0.0"
12
+ gem "sidekiq", "~> 6.0"
11
13
 
12
14
  gemspec path: "../"
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'rails'
4
4
  require 'telegraf/rack'
5
+ require 'telegraf/sidekiq'
5
6
 
6
7
  module Telegraf
7
8
  # Telegraf::Railtie
@@ -44,7 +45,7 @@ module Telegraf
44
45
  # Connect URI or tuple
45
46
  config.telegraf.connect = ::Telegraf::Agent::DEFAULT_CONNECTION
46
47
 
47
- # Install rackmiddlewares
48
+ # Install Rack middlewares
48
49
  config.telegraf.rack = ::ActiveSupport::OrderedOptions.new
49
50
  config.telegraf.rack.enabled = true
50
51
  config.telegraf.rack.series = 'requests'
@@ -53,6 +54,12 @@ module Telegraf
53
54
  # Install request instrumentation
54
55
  config.telegraf.instrumentation = true
55
56
 
57
+ # Install Sidekiq middleware
58
+ config.telegraf.sidekiq = ::ActiveSupport::OrderedOptions.new
59
+ config.telegraf.sidekiq.enabled = defined?(::Sidekiq)
60
+ config.telegraf.sidekiq.series = 'sidekiq'
61
+ config.telegraf.sidekiq.tags = {}
62
+
56
63
  initializer 'telegraf.agent' do |app|
57
64
  app.config.telegraf.agent ||= begin
58
65
  ::Telegraf::Agent.new \
@@ -90,5 +97,18 @@ module Telegraf
90
97
  point.values[:action_ms] = ((finish - start) * 1000.0) # milliseconds
91
98
  end
92
99
  end
100
+
101
+ initializer 'telegraf.sidekiq' do |app|
102
+ next unless app.config.telegraf.sidekiq.enabled
103
+
104
+ ::Sidekiq.configure_server do |config|
105
+ config.server_middleware do |chain|
106
+ chain.add Telegraf::Sidekiq::Middleware, \
107
+ agent: app.config.telegraf.agent,
108
+ series: app.config.telegraf.sidekiq.series,
109
+ tags: app.config.telegraf.sidekiq.tags
110
+ end
111
+ end
112
+ end
93
113
  end
94
114
  end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rack'
4
+
5
+ module Telegraf
6
+ module Sidekiq
7
+ # Telegraf::Sidekiq::Middleware
8
+ #
9
+ # This Sidekiq middleware collects queue metrics and sends them to telegraf.
10
+ #
11
+ #
12
+ # Tags:
13
+ #
14
+ # * `type`:
15
+ # One of "job" or "scheduled_job".
16
+ #
17
+ # * `queue`:
18
+ # The queue this job landed on.
19
+ #
20
+ # * `worker`:
21
+ # The name of the worker class that was executed.
22
+ #
23
+ # * `errors`:
24
+ # Whether or not this job errored.
25
+ #
26
+ # * `retry`:
27
+ # Whether or not this execution was a retry of a previously failed one.
28
+ #
29
+ #
30
+ # Values:
31
+ #
32
+ # * `app_ms`:
33
+ # Total worker processing time.
34
+ #
35
+ # * `queue_ms`:
36
+ # How long did this job wait in the queue before being processed?
37
+ # Only present for "normal" (async) jobs (with tag `type` of "job").
38
+ #
39
+ class Middleware
40
+ def initialize(agent:, series: 'sidekiq', tags: {})
41
+ @agent = agent
42
+ @series = series.to_s.freeze
43
+ @tags = tags.freeze
44
+ end
45
+
46
+ def call(worker, job, queue)
47
+ job_start = ::Time.now.utc
48
+
49
+ tags = {
50
+ **@tags,
51
+ type: 'job',
52
+ errors: true,
53
+ retry: job.key?('retried_at'),
54
+ queue: queue,
55
+ worker: worker.class.name
56
+ }
57
+
58
+ values = {
59
+ retry_count: job['retry_count']
60
+ }.compact
61
+
62
+ # The "enqueued_at" key is not present for scheduled jobs.
63
+ # See https://github.com/mperham/sidekiq/wiki/Job-Format.
64
+ if job.key?('enqueued_at')
65
+ enqueued_at = ::Time.at(job['enqueued_at'].to_f).utc
66
+ values[:queue_ms] = (job_start - enqueued_at) * 1000 # milliseconds
67
+ end
68
+
69
+ # The "at" key is only present for scheduled jobs.
70
+ tags[:type] = 'scheduled_job' if job.key?('at')
71
+
72
+ begin
73
+ yield
74
+
75
+ # If we get here, this was a successful execution
76
+ tags[:errors] = false
77
+ ensure
78
+ job_stop = ::Time.now.utc
79
+
80
+ values[:app_ms] = (job_stop - job_start) * 1000 # milliseconds
81
+
82
+ @agent.write(
83
+ @series, tags: tags, values: values
84
+ )
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -3,8 +3,8 @@
3
3
  module Telegraf
4
4
  module VERSION
5
5
  MAJOR = 0
6
- MINOR = 6
7
- PATCH = 1
6
+ MINOR = 7
7
+ PATCH = 0
8
8
  STAGE = nil
9
9
  STRING = [MAJOR, MINOR, PATCH, STAGE].reject(&:nil?).join('.').freeze
10
10
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: telegraf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Graichen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-01 00:00:00.000000000 Z
11
+ date: 2020-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: influxdb
@@ -70,6 +70,7 @@ files:
70
70
  - lib/telegraf/rack.rb
71
71
  - lib/telegraf/rails.rb
72
72
  - lib/telegraf/railtie.rb
73
+ - lib/telegraf/sidekiq.rb
73
74
  - lib/telegraf/version.rb
74
75
  - telegraf.gemspec
75
76
  homepage: https://github.com/jgraichen/ruby-telegraf
@@ -91,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
92
  - !ruby/object:Gem::Version
92
93
  version: '0'
93
94
  requirements: []
94
- rubygems_version: 3.1.2
95
+ rubygems_version: 3.0.8
95
96
  signing_key:
96
97
  specification_version: 4
97
98
  summary: Metric Reporter to local telegraf agent