travis-metrics 2.0.0.rc1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 202ba9076da5cb2ecedfd3bfc0af052b96eaeac5
4
+ data.tar.gz: ffaa169c567cce2e4445b168da8fbd5bd345b9ab
5
+ SHA512:
6
+ metadata.gz: ab7dd5d25bc4775a3e9d1f81ec7e91113fc0bb6b7ceba2cf89093d42403e1b4d044319ee863c1593f5bfee0bda0723f514c8ba187ac9447a5d5a2d46fed2fd27
7
+ data.tar.gz: 598eacf6c8a7a497a0e08eb5fdc2e3f01543fae208902f2e292d1206319c3dc588db30a94dabd2f2d26df239c5aeeb1ef9dc4f4f5048ee718d6d925af4a7573b
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'rspec'
7
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,43 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ travis-metrics (0.0.1)
5
+ metriks-librato_metrics (~> 1.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ atomic (1.1.99)
11
+ avl_tree (1.2.1)
12
+ atomic (~> 1.1)
13
+ diff-lcs (1.2.5)
14
+ hitimes (1.2.3)
15
+ metriks (0.9.9.7)
16
+ atomic (~> 1.0)
17
+ avl_tree (~> 1.2.0)
18
+ hitimes (~> 1.1)
19
+ metriks-librato_metrics (1.0.3)
20
+ metriks (>= 0.9.9.6)
21
+ rspec (3.3.0)
22
+ rspec-core (~> 3.3.0)
23
+ rspec-expectations (~> 3.3.0)
24
+ rspec-mocks (~> 3.3.0)
25
+ rspec-core (3.3.2)
26
+ rspec-support (~> 3.3.0)
27
+ rspec-expectations (3.3.1)
28
+ diff-lcs (>= 1.2.0, < 2.0)
29
+ rspec-support (~> 3.3.0)
30
+ rspec-mocks (3.3.2)
31
+ diff-lcs (>= 1.2.0, < 2.0)
32
+ rspec-support (~> 3.3.0)
33
+ rspec-support (3.3.0)
34
+
35
+ PLATFORMS
36
+ ruby
37
+
38
+ DEPENDENCIES
39
+ rspec
40
+ travis-metrics!
41
+
42
+ BUNDLED WITH
43
+ 1.12.5
data/MIT-LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT LICENSE
2
+
3
+ Copyright (c) 2015 Travis CI GmbH <contact@travis-ci.org>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1 @@
1
+ # travis-metrics
@@ -0,0 +1,38 @@
1
+ require 'metriks/reporter/graphite'
2
+
3
+ module Travis
4
+ class Metrics
5
+ module Reporter
6
+ class Graphite < Struct.new(:config, :logger)
7
+ MSGS = {
8
+ setup: 'Using Graphite metrics reporter (host: %s, port: %s)',
9
+ error: 'Graphite error: %s (%s)'
10
+ }
11
+
12
+ def setup
13
+ return unless host
14
+ logger.info MSGS[:setup] % [host, port]
15
+ Metriks::Reporter::Graphite.new(host, port, interval: interval, on_error: method(:on_error))
16
+ end
17
+
18
+ private
19
+
20
+ def host
21
+ config[:host]
22
+ end
23
+
24
+ def port
25
+ config[:port]
26
+ end
27
+
28
+ def interval
29
+ config[:interval]
30
+ end
31
+
32
+ def on_error(e)
33
+ logger.error MSGS[:error] % [e.message, e.respond_to?(:response) ? e.response.body : '?']
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,44 @@
1
+ require 'metriks/librato_metrics_reporter'
2
+
3
+ module Travis
4
+ class Metrics
5
+ module Reporter
6
+ class Librato < Struct.new(:config, :logger)
7
+ MSGS = {
8
+ setup: 'Using Librato metrics reporter (source: %s, account: %s)',
9
+ error: 'Librato error: %s (%s)'
10
+ }
11
+
12
+ def setup
13
+ return unless email && token
14
+ logger.info MSGS[:setup] % [source, email]
15
+ Metriks::LibratoMetricsReporter.new(email, token, source: source, on_error: method(:on_error))
16
+ end
17
+
18
+ private
19
+
20
+ def email
21
+ config[:email]
22
+ end
23
+
24
+ def token
25
+ config[:token]
26
+ end
27
+
28
+ def source
29
+ source = config[:source]
30
+ source = "#{source}.#{dyno}" if dyno
31
+ source
32
+ end
33
+
34
+ def dyno
35
+ ENV['DYNO']
36
+ end
37
+
38
+ def on_error(e)
39
+ logger.error MSGS[:error] % [e.message, e.response.body]
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,14 @@
1
+ require 'metriks'
2
+
3
+ module Travis
4
+ class Metrics
5
+ class Sidekiq
6
+ def call(worker, message, queue, &block)
7
+ ::Metriks.timer("sidekiq.jobs.#{queue}.perform").time(&block)
8
+ rescue Exception
9
+ ::Metriks.meter("sidekiq.jobs.#{queue}.failure").mark
10
+ raise
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ module Travis
2
+ class Metrics
3
+ VERSION = "2.0.0.rc1"
4
+ end
5
+ end
@@ -0,0 +1,50 @@
1
+ require 'metriks'
2
+ require 'travis/metrics/reporter/librato'
3
+ require 'travis/metrics/reporter/graphite'
4
+
5
+ module Travis
6
+ class Metrics
7
+ class << self
8
+ attr_reader :reporter
9
+
10
+ MSGS = {
11
+ no_reporter: 'No metrics reporter configured.',
12
+ error: '"Exception while starting metrics reporter: %s"'
13
+ }
14
+
15
+ def setup(config, logger)
16
+ config[:reporter] ? start(config, logger) : logger.info(MSGS[:no_reporter])
17
+ new
18
+ rescue Exception => e
19
+ logger.error [e.message, e.backtrace].join("\n")
20
+ end
21
+
22
+ def start(config, logger)
23
+ adapter = config[:reporter]
24
+ config = config[adapter.to_sym] || {}
25
+ @reporter = Reporter.send(adapter, config, logger)
26
+ reporter.start
27
+ end
28
+
29
+ def started?
30
+ !!reporter
31
+ end
32
+ end
33
+
34
+ def count(key)
35
+ Metriks.counter(key).increment
36
+ end
37
+
38
+ def meter(key)
39
+ Metriks.meter(key).mark
40
+ end
41
+
42
+ def time(key, &block)
43
+ Metriks.timer(key).time(&block)
44
+ end
45
+
46
+ def gauge(key, value)
47
+ Metriks.gauge(key).set(value)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,6 @@
1
+ require 'travis/metrics'
2
+ require 'support/logger'
3
+
4
+ RSpec.configure do |c|
5
+ c.include Support::Logger
6
+ end
@@ -0,0 +1,13 @@
1
+ require 'logger'
2
+
3
+ module Support
4
+ module Logger
5
+ def self.included(other)
6
+ other.class_eval do
7
+ let(:stdout) { StringIO.new }
8
+ let(:log) { stdout.string }
9
+ let(:logger) { ::Logger.new(stdout) }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,43 @@
1
+ describe Travis::Metrics do
2
+ let(:metrics) { described_class.new }
3
+ let(:key) { :foo }
4
+ let(:obj) { double }
5
+
6
+ describe 'count' do
7
+
8
+ it 'increments a counter' do
9
+ expect(Metriks).to receive(:counter).with(key).and_return(obj)
10
+ expect(obj).to receive(:increment)
11
+ metrics.count(key)
12
+ end
13
+ end
14
+
15
+ describe 'meter' do
16
+ it 'meters an instrument' do
17
+ expect(Metriks).to receive(:meter).with(key).and_return(obj)
18
+ expect(obj).to receive(:mark)
19
+ metrics.meter(key)
20
+ end
21
+ end
22
+
23
+ describe 'time' do
24
+ it 'times a block' do
25
+ called = false
26
+ block = -> { called = true }
27
+ expect(Metriks).to receive(:timer).with(key).and_return(obj)
28
+ expect(obj).to receive(:time).and_yield
29
+ metrics.time(key, &block)
30
+ expect(called).to be true
31
+ end
32
+ end
33
+
34
+ describe 'gauge' do
35
+ let(:value) { 1 }
36
+
37
+ it 'gauges a value' do
38
+ expect(Metriks).to receive(:gauge).with(key).and_return(obj)
39
+ expect(obj).to receive(:set).with(value)
40
+ metrics.gauge(key, value)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,37 @@
1
+ describe Travis::Metrics::Reporter::Graphite do
2
+ let(:config) { { host: host, port: 1234, interval: 0 } }
3
+ let(:host) { 'https://example.com' }
4
+ let(:reporter) { described_class.new(config, logger) }
5
+ subject { reporter.setup }
6
+
7
+ def log
8
+ reporter.setup
9
+ super
10
+ end
11
+
12
+ describe 'setup' do
13
+ describe 'returns nil if host is missing' do
14
+ let(:host) { nil }
15
+ it { expect(subject).to be_nil }
16
+ end
17
+
18
+ describe 'returns a graphite reporter' do
19
+ it { expect(subject).to be_kind_of(Metriks::Reporter::Graphite) }
20
+ it { expect(log).to include "Using Graphite metrics reporter (host: #{host}, port: 1234)" }
21
+ end
22
+
23
+ describe 'on_error' do
24
+ let(:error) { StandardError.new('message') }
25
+ before { allow(error).to receive(:response).and_return(double(body: 'body')) }
26
+ before { allow_any_instance_of(Metriks::Reporter::Graphite).to receive(:write).and_raise(error) }
27
+
28
+ before do
29
+ subject.start
30
+ sleep 0.1 # ugh.
31
+ subject.stop
32
+ end
33
+
34
+ it { expect(stdout.string).to include 'Graphite error: message (body)' }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ describe Travis::Metrics::Reporter::Librato do
2
+ let(:config) { { email: email, token: token, source: 'source' } }
3
+ let(:email) { 'anja@travis-ci.org' }
4
+ let(:token) { 'token' }
5
+ let(:reporter) { described_class.new(config, logger) }
6
+ subject { reporter.setup }
7
+
8
+ def log
9
+ reporter.setup
10
+ super
11
+ end
12
+
13
+ describe 'setup' do
14
+ describe 'returns nil if email is missing' do
15
+ let(:email) { nil }
16
+ it { expect(subject).to be_nil }
17
+ end
18
+
19
+ describe 'returns nil if token is missing' do
20
+ let(:token) { nil }
21
+ it { expect(subject).to be_nil }
22
+ end
23
+
24
+ describe 'returns a librato reporter' do
25
+ it { expect(subject).to be_kind_of(Metriks::LibratoMetricsReporter) }
26
+ it { expect(log).to include 'Using Librato metrics reporter (source: source, account: anja@travis-ci.org)' }
27
+ end
28
+
29
+ describe 'on_error' do
30
+ let(:error) { StandardError.new('message') }
31
+ before { allow(error).to receive(:response).and_return(double(body: 'body')) }
32
+ before { allow_any_instance_of(Metriks::LibratoMetricsReporter).to receive(:write).and_raise(error) }
33
+ before { subject.flush }
34
+ it { expect(stdout.string).to include 'Librato error: message (body)' }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ $:.unshift File.expand_path('../lib', __FILE__)
4
+ require 'travis/metrics/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "travis-metrics"
8
+ s.version = Travis::Metrics::VERSION
9
+ s.authors = ['Travis CI']
10
+ s.email = 'contact@travis-ci.org'
11
+ s.homepage = 'https://github.com/travis-ci/travis-instrumentation'
12
+ s.summary = 'Instrumentation for Travis CI'
13
+ s.description = "#{s.summary}."
14
+
15
+ s.files = Dir['{lib/**/*,spec/**/*,[A-Z]*}']
16
+ s.platform = Gem::Platform::RUBY
17
+ s.require_paths = ['lib']
18
+ s.rubyforge_project = '[none]'
19
+
20
+ s.add_dependency 'metriks-librato_metrics', '~> 1.0'
21
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: travis-metrics
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0.rc1
5
+ platform: ruby
6
+ authors:
7
+ - Travis CI
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: metriks-librato_metrics
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ description: Instrumentation for Travis CI.
28
+ email: contact@travis-ci.org
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - Gemfile
34
+ - Gemfile.lock
35
+ - MIT-LICENSE
36
+ - README.md
37
+ - lib/travis/metrics.rb
38
+ - lib/travis/metrics/reporter/graphite.rb
39
+ - lib/travis/metrics/reporter/librato.rb
40
+ - lib/travis/metrics/sidekiq.rb
41
+ - lib/travis/metrics/version.rb
42
+ - spec/spec_helper.rb
43
+ - spec/support/logger.rb
44
+ - spec/travis/metrics/instrument_spec.rb
45
+ - spec/travis/metrics/reporter/graphite_spec.rb
46
+ - spec/travis/metrics/reporter/librato_spec.rb
47
+ - travis-metrics.gemspec
48
+ homepage: https://github.com/travis-ci/travis-instrumentation
49
+ licenses: []
50
+ metadata: {}
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">"
63
+ - !ruby/object:Gem::Version
64
+ version: 1.3.1
65
+ requirements: []
66
+ rubyforge_project: "[none]"
67
+ rubygems_version: 2.4.5
68
+ signing_key:
69
+ specification_version: 4
70
+ summary: Instrumentation for Travis CI
71
+ test_files: []
72
+ has_rdoc: