telltale 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +38 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +34 -0
- data/README.md +4 -0
- data/VERSION +1 -1
- data/lib/telltale.rb +2 -27
- data/lib/telltale/data.rb +59 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/telltate/data_spec.rb +67 -0
- data/telltale.gemspec +1 -0
- metadata +27 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4304b4c63a305124212552fb5fd320ff24e57c86
|
4
|
+
data.tar.gz: 507d4254e2adf0d1c8678ba01a838b40d9c1ae7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bce6a6c780f9bb5a05f783518dd5bcfee5306c50ab1052e5969feaa11ae7a6eac4fc9f133c07928a3e6934131ef8c76fac03aeefca250d3550cba322cddb4921
|
7
|
+
data.tar.gz: df4e8574926ae457f84b6daf6dd18e8d99aea13df403be12bc5b75e57c205355ec1e7ce02eb947d10e8d62399da6c98f08960ce0ada9cfb33d82e3afc737eefa
|
data/.gitignore
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/spec/examples.txt
|
9
|
+
/test/tmp/
|
10
|
+
/test/version_tmp/
|
11
|
+
/tmp/
|
12
|
+
|
13
|
+
## Specific to RubyMotion:
|
14
|
+
.dat*
|
15
|
+
.repl_history
|
16
|
+
build/
|
17
|
+
|
18
|
+
## Documentation cache and generated files:
|
19
|
+
/.yardoc/
|
20
|
+
/_yardoc/
|
21
|
+
/doc/
|
22
|
+
/rdoc/
|
23
|
+
|
24
|
+
## Environment normalization:
|
25
|
+
/.bundle/
|
26
|
+
/vendor/bundle
|
27
|
+
/lib/bundler/man/
|
28
|
+
|
29
|
+
# for a library or gem, you might want to ignore these files since the code is
|
30
|
+
# intended to run in multiple environments; otherwise, check them in:
|
31
|
+
# Gemfile.lock
|
32
|
+
# .ruby-version
|
33
|
+
# .ruby-gemset
|
34
|
+
|
35
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
36
|
+
.rvmrc
|
37
|
+
|
38
|
+
/spec/examples.txt
|
data/.rspec
ADDED
data/CHANGELOG.md
CHANGED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
telltale (0.1.1)
|
5
|
+
opentsdb (~> 0.2.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
diff-lcs (1.2.5)
|
11
|
+
opentsdb (0.2.0)
|
12
|
+
rspec (3.4.0)
|
13
|
+
rspec-core (~> 3.4.0)
|
14
|
+
rspec-expectations (~> 3.4.0)
|
15
|
+
rspec-mocks (~> 3.4.0)
|
16
|
+
rspec-core (3.4.2)
|
17
|
+
rspec-support (~> 3.4.0)
|
18
|
+
rspec-expectations (3.4.0)
|
19
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
20
|
+
rspec-support (~> 3.4.0)
|
21
|
+
rspec-mocks (3.4.1)
|
22
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
23
|
+
rspec-support (~> 3.4.0)
|
24
|
+
rspec-support (3.4.1)
|
25
|
+
|
26
|
+
PLATFORMS
|
27
|
+
ruby
|
28
|
+
|
29
|
+
DEPENDENCIES
|
30
|
+
rspec
|
31
|
+
telltale!
|
32
|
+
|
33
|
+
BUNDLED WITH
|
34
|
+
1.11.2
|
data/README.md
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
Report Rails application metrics to OpenTSDB.
|
4
4
|
|
5
|
+
[![Build Status](https://travis-ci.org/ninech/telltale.svg?branch=master)](https://travis-ci.org/ninech/telltale)
|
6
|
+
[![Code Climate](https://codeclimate.com/github/ninech/telltale/badges/gpa.svg)](https://codeclimate.com/github/ninech/telltale)
|
7
|
+
|
5
8
|
## Instructions
|
6
9
|
|
7
10
|
Add the following line to your `Gemfile` and run `bundle install`.
|
@@ -24,6 +27,7 @@ environment variables.
|
|
24
27
|
These numbers are currently reported:
|
25
28
|
|
26
29
|
* `<prefix>.rails.total_time`: Total request time in seconds
|
30
|
+
* `<prefix>.rails.request_count`: A counter for requests (always 1)
|
27
31
|
|
28
32
|
The default `prefix` is "telltale" and can be configured with the environment variable `TELLTALE_PREFIX`.
|
29
33
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/telltale.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'opentsdb'
|
2
|
+
require 'telltale/data'
|
2
3
|
|
3
4
|
module Telltale
|
4
5
|
class << self
|
@@ -14,13 +15,7 @@ module Telltale
|
|
14
15
|
def configure_request_instrumentation
|
15
16
|
ActiveSupport::Notifications.subscribe 'process_action.action_controller' do |_name, started, finished, _unique_id, payload|
|
16
17
|
next unless report?
|
17
|
-
|
18
|
-
metric: "#{metric_prefix}.rails.total_time",
|
19
|
-
value: ((finished - started) * 1000).ceil,
|
20
|
-
timestamp: Time.now.to_i,
|
21
|
-
tags: tags(payload),
|
22
|
-
}
|
23
|
-
client.put(data)
|
18
|
+
client.put Telltale::Data.compile(started, finished, payload)
|
24
19
|
end
|
25
20
|
end
|
26
21
|
|
@@ -28,17 +23,6 @@ module Telltale
|
|
28
23
|
opentsdb_host.present? && !Rails.env.test?
|
29
24
|
end
|
30
25
|
|
31
|
-
def tags(payload)
|
32
|
-
{
|
33
|
-
http_status: http_status_from_payload(payload),
|
34
|
-
controller: payload[:controller],
|
35
|
-
action: [payload[:controller], payload[:action]].join('.'),
|
36
|
-
host: Socket.gethostname,
|
37
|
-
environment: Rails.env,
|
38
|
-
app: Rails.application.class.parent_name.downcase,
|
39
|
-
}
|
40
|
-
end
|
41
|
-
|
42
26
|
def opentsdb_port
|
43
27
|
ENV['TELLTALE_OPENTSDB_PORT'] || 4242
|
44
28
|
end
|
@@ -47,18 +31,9 @@ module Telltale
|
|
47
31
|
ENV['TELLTALE_OPENTSDB_HOST']
|
48
32
|
end
|
49
33
|
|
50
|
-
def metric_prefix
|
51
|
-
ENV['TELLTALE_PREFIX'] || 'telltale'
|
52
|
-
end
|
53
|
-
|
54
34
|
def client
|
55
35
|
OpenTSDB::Client.new(hostname: opentsdb_host, port: opentsdb_port)
|
56
36
|
end
|
57
|
-
|
58
|
-
def http_status_from_payload(payload)
|
59
|
-
return payload[:status] if payload[:status]
|
60
|
-
return 500 if payload[:exception].present?
|
61
|
-
end
|
62
37
|
end
|
63
38
|
end
|
64
39
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Telltale
|
2
|
+
class Data
|
3
|
+
attr_reader :started, :finished, :payload
|
4
|
+
|
5
|
+
def self.compile(started, finished, payload)
|
6
|
+
new(started, finished, payload).all
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(started, finished, payload)
|
10
|
+
@started = started
|
11
|
+
@finished = finished
|
12
|
+
@payload = payload
|
13
|
+
end
|
14
|
+
|
15
|
+
def all
|
16
|
+
[total_time, request_count]
|
17
|
+
end
|
18
|
+
|
19
|
+
def total_time
|
20
|
+
{
|
21
|
+
metric: "#{metric_prefix}.rails.total_time",
|
22
|
+
value: ((finished - started) * 1000).ceil,
|
23
|
+
timestamp: Time.now.to_i,
|
24
|
+
tags: tags,
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def request_count
|
29
|
+
{
|
30
|
+
metric: "#{metric_prefix}.rails.request_count",
|
31
|
+
value: 1,
|
32
|
+
timestamp: Time.now.to_i,
|
33
|
+
tags: tags,
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def metric_prefix
|
40
|
+
ENV['TELLTALE_PREFIX'] || 'telltale'
|
41
|
+
end
|
42
|
+
|
43
|
+
def tags
|
44
|
+
{
|
45
|
+
http_status: http_status,
|
46
|
+
controller: payload[:controller],
|
47
|
+
action: [payload[:controller], payload[:action]].join('.'),
|
48
|
+
host: Socket.gethostname,
|
49
|
+
environment: Rails.env,
|
50
|
+
app: Rails.application.class.parent_name.downcase,
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def http_status
|
55
|
+
return payload[:status] if payload[:status]
|
56
|
+
return 500 if payload[:exception].present?
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
RSpec.configure do |config|
|
2
|
+
config.expect_with :rspec do |expectations|
|
3
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
4
|
+
end
|
5
|
+
|
6
|
+
config.mock_with :rspec do |mocks|
|
7
|
+
mocks.verify_partial_doubles = true
|
8
|
+
end
|
9
|
+
|
10
|
+
config.filter_run :focus
|
11
|
+
config.run_all_when_everything_filtered = true
|
12
|
+
config.example_status_persistence_file_path = 'spec/examples.txt'
|
13
|
+
config.disable_monkey_patching!
|
14
|
+
config.warnings = true
|
15
|
+
config.order = :random
|
16
|
+
|
17
|
+
Kernel.srand config.seed
|
18
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'telltale/data'
|
3
|
+
|
4
|
+
RSpec.describe Telltale::Data do
|
5
|
+
Rails = Class.new do
|
6
|
+
def self.application; end
|
7
|
+
def self.env; end
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:started) { Time.at 1 }
|
11
|
+
let(:finished) { Time.at 10 }
|
12
|
+
let(:payload) { { controller: 'contacts', action: 'show', status: 200 } }
|
13
|
+
let(:data) { Telltale::Data.new started, finished, payload }
|
14
|
+
|
15
|
+
before do
|
16
|
+
allow(Rails).to receive_message_chain(:application, :class, :parent_name).and_return('MyApp')
|
17
|
+
allow(Rails).to receive(:env).and_return('staging')
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.compile' do
|
21
|
+
it 'compiles the data for the total request time metric' do
|
22
|
+
expect(described_class.compile(started, finished, payload)).to match_array [Hash, Hash]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#all' do
|
27
|
+
it 'compiles the data all metrics' do
|
28
|
+
expect(data.all).to match_array [Hash, Hash]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#total_time' do
|
33
|
+
it 'compiles the data for the total request time metric' do
|
34
|
+
expect(data.total_time).to eq(
|
35
|
+
metric: 'telltale.rails.total_time',
|
36
|
+
value: 9000,
|
37
|
+
timestamp: Time.now.to_i,
|
38
|
+
tags: {
|
39
|
+
http_status: 200,
|
40
|
+
controller: 'contacts',
|
41
|
+
action: 'contacts.show',
|
42
|
+
host: 'odin',
|
43
|
+
environment: 'staging',
|
44
|
+
app: 'myapp',
|
45
|
+
},
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#request_count' do
|
51
|
+
it 'compiles the data for the request count metric' do
|
52
|
+
expect(data.request_count).to eq(
|
53
|
+
metric: 'telltale.rails.request_count',
|
54
|
+
value: 1,
|
55
|
+
timestamp: Time.now.to_i,
|
56
|
+
tags: {
|
57
|
+
http_status: 200,
|
58
|
+
controller: 'contacts',
|
59
|
+
action: 'contacts.show',
|
60
|
+
host: 'odin',
|
61
|
+
environment: 'staging',
|
62
|
+
app: 'myapp',
|
63
|
+
},
|
64
|
+
)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/telltale.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: telltale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Philippe Hassig
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opentsdb
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.2.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
description: Report Rails application metrics to OpenTSDB
|
28
42
|
email:
|
29
43
|
- phil@nine.ch
|
@@ -31,11 +45,18 @@ executables: []
|
|
31
45
|
extensions: []
|
32
46
|
extra_rdoc_files: []
|
33
47
|
files:
|
48
|
+
- ".gitignore"
|
49
|
+
- ".rspec"
|
34
50
|
- CHANGELOG.md
|
51
|
+
- Gemfile
|
52
|
+
- Gemfile.lock
|
35
53
|
- README.md
|
36
54
|
- VERSION
|
37
55
|
- lib/telltale.rb
|
56
|
+
- lib/telltale/data.rb
|
38
57
|
- lib/telltale/railtie.rb
|
58
|
+
- spec/spec_helper.rb
|
59
|
+
- spec/telltate/data_spec.rb
|
39
60
|
- telltale.gemspec
|
40
61
|
homepage: http://github.com/ninech/
|
41
62
|
licenses:
|
@@ -57,8 +78,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
57
78
|
version: '0'
|
58
79
|
requirements: []
|
59
80
|
rubyforge_project:
|
60
|
-
rubygems_version: 2.
|
81
|
+
rubygems_version: 2.5.1
|
61
82
|
signing_key:
|
62
83
|
specification_version: 4
|
63
84
|
summary: Report Rails application metrics to OpenTSDB
|
64
|
-
test_files:
|
85
|
+
test_files:
|
86
|
+
- spec/spec_helper.rb
|
87
|
+
- spec/telltate/data_spec.rb
|