telltale 0.1.1 → 0.2.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 +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
|
+
[](https://travis-ci.org/ninech/telltale)
|
6
|
+
[](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
|