better_fx 0.2.0 → 0.3.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/README.md +41 -0
- data/better_fx.gemspec +1 -0
- data/lib/better_fx/configuration.rb +3 -1
- data/lib/better_fx/measurement.rb +64 -0
- data/lib/better_fx/version.rb +1 -1
- data/lib/better_fx.rb +1 -0
- data/spec/better_fx/telemetry_spec.rb +76 -0
- metadata +18 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b9a9c55efdf7a86cd3183221c5d675024c4b9c3
|
4
|
+
data.tar.gz: 36a119c9ae945b44eb1f03ac44c2101ae930be9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ece668019a30ae4d48910e838212c409f303aeba53bcaf64e8867edf2e7034fa4da5f6a13693093300a9ecf86c0d6f0e5133a0f0bd6f8caa782a2000b5a033ed
|
7
|
+
data.tar.gz: 0cf961fa42da0e35c301ef9e800869a9e871563e347d054cc8d3ac3e480d128fe53bc9ff9dfce823b0e1a99f79b3ff216f794d9d6ac9bfcef83331701ff15efc
|
data/README.md
CHANGED
@@ -24,6 +24,47 @@ bfx = BetterFx::Client.new
|
|
24
24
|
bfx.gauge :soccer_ball_air_pressure, value: 11
|
25
25
|
```
|
26
26
|
|
27
|
+
## OO functionality
|
28
|
+
|
29
|
+
Usually you'll be reporting the same measurement over and over and the gauge syntax is a bit
|
30
|
+
too functional
|
31
|
+
|
32
|
+
In the following example we have an imaginary worker that is invoked like so:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
TelemetricWorker.new.run
|
36
|
+
```
|
37
|
+
|
38
|
+
It's implementation is ...
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
class TelemetricWorker
|
42
|
+
include BetterFx::Measurement
|
43
|
+
attr_accessor :filename
|
44
|
+
|
45
|
+
measurement :file_size do |worker|
|
46
|
+
File.size worker.filename
|
47
|
+
end
|
48
|
+
|
49
|
+
def step_gets_file
|
50
|
+
# get file from s3
|
51
|
+
end
|
52
|
+
|
53
|
+
def step_does_other_thing
|
54
|
+
# use your imagination
|
55
|
+
end
|
56
|
+
|
57
|
+
def run
|
58
|
+
step_gets_file
|
59
|
+
measure :file_size
|
60
|
+
step_does_other_thing
|
61
|
+
end
|
62
|
+
end
|
63
|
+
```
|
64
|
+
|
65
|
+
This way everytime `#run` is executed the file_size measurement is sent to SignalFx. Note this functionality is
|
66
|
+
currently available for measurements (gauges) only.
|
67
|
+
|
27
68
|
## Configuration
|
28
69
|
|
29
70
|
To use BetterFx with the least amount of code, just set the environment variable
|
data/better_fx.gemspec
CHANGED
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.homepage =
|
17
17
|
"https://github.com/Referly/better_fx"
|
18
18
|
s.add_runtime_dependency "signalfx", "~> 0.1" # Apache2 - @link https://github.com/signalfx/signalfx-ruby
|
19
|
+
s.add_runtime_dependency "activesupport", "~> 4" # MIT - @link https://github.com/rails/rails/blob/master/activesupport/MIT-LICENSE
|
19
20
|
s.add_development_dependency "rspec", "~> 3.2" # MIT - @link https://github.com/rspec/rspec/blob/master/License.txt
|
20
21
|
s.add_development_dependency "byebug", "~> 3.5" # BSD (content is BSD) https://github.com/deivid-rodriguez/byebug/blob/master/LICENSE
|
21
22
|
s.add_development_dependency "simplecov", "~> 0.10" # MIT - @link https://github.com/colszowka/simplecov/blob/master/MIT-LICENSE
|
@@ -3,12 +3,14 @@ module BetterFx
|
|
3
3
|
class Configuration
|
4
4
|
attr_accessor :signalfx_api_token,
|
5
5
|
:supported_environments,
|
6
|
-
:current_environment
|
6
|
+
:current_environment,
|
7
|
+
:signalfx_metric_namespace
|
7
8
|
|
8
9
|
def initialize
|
9
10
|
@signalfx_api_token = ENV["SIGNALFX_API_TOKEN"]
|
10
11
|
@supported_environments = [:production, :prod, "production", "prod"]
|
11
12
|
@current_environment = ENV["APP_ENV"] || :production
|
13
|
+
@signalfx_metric_namespace = ENV["SIGNALFX_METRIC_NAMESPACE"] || :better_fx
|
12
14
|
end
|
13
15
|
end
|
14
16
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require "active_support/inflector"
|
2
|
+
module BetterFx
|
3
|
+
# A mixin for creating declarative telemetry to send
|
4
|
+
# to BetterFx (plan being to move this into BetterFx)
|
5
|
+
module Measurement
|
6
|
+
def self.included(mod)
|
7
|
+
mod.extend ClassMethods
|
8
|
+
mod.send :include, InstanceMethods
|
9
|
+
end
|
10
|
+
# Instance methods
|
11
|
+
module InstanceMethods
|
12
|
+
# Perform a measurement and send the results
|
13
|
+
# to the Telemetry system
|
14
|
+
#
|
15
|
+
# @param name [String, Symbol] the name of the measurement to perform
|
16
|
+
def measure(name, _opts = {})
|
17
|
+
name = name.to_s
|
18
|
+
prok = self.class.measurements[name]
|
19
|
+
value = prok ? prok.call(self) : nil
|
20
|
+
return unless value
|
21
|
+
fq_gauge_name = self.class.gauge_name name
|
22
|
+
self.class.bfx.gauge fq_gauge_name, value: value
|
23
|
+
value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Class methods
|
28
|
+
module ClassMethods
|
29
|
+
# Defines a measurement
|
30
|
+
#
|
31
|
+
# @param name [String, Symbol] the name of the measurement (measurement names
|
32
|
+
# are inherently namespaced by class so should just use a meaningful name. It will
|
33
|
+
# show up in the telemetry system as gauge.$CLASS.name)
|
34
|
+
# @param blk [Block] you must provide a block which contains the code for performing
|
35
|
+
# the measurement; the block must return the value of the measurement
|
36
|
+
def measurement(name, _opts = {}, &blk)
|
37
|
+
name = name.to_s
|
38
|
+
@_measurements ||= {}
|
39
|
+
@_measurements[name] = blk
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns all of the defined measurements
|
43
|
+
#
|
44
|
+
# @return [Hash] the measurements with names as keys and procs as values
|
45
|
+
def measurements
|
46
|
+
@_measurements
|
47
|
+
end
|
48
|
+
|
49
|
+
# A memoized BetterFx Client instance
|
50
|
+
#
|
51
|
+
# @return [BetterFx::Client] a BetterFx client
|
52
|
+
def bfx
|
53
|
+
@_bfx ||= BetterFx::Client.new
|
54
|
+
end
|
55
|
+
|
56
|
+
# Generates the fully qualified gauge name
|
57
|
+
#
|
58
|
+
# @param measurement_name [String, Symbol] the name of the measurement
|
59
|
+
def gauge_name(measurement_name)
|
60
|
+
"#{BetterFx.configuration.signalfx_metric_namespace}.#{name.to_s.underscore.downcase}.#{measurement_name}".tr "/", "."
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/better_fx/version.rb
CHANGED
data/lib/better_fx.rb
CHANGED
@@ -3,6 +3,7 @@ require "signalfx"
|
|
3
3
|
SignalFxClient.send :alias_method, :bf_xmit, :send
|
4
4
|
require_relative "better_fx/configuration"
|
5
5
|
require_relative "better_fx/client"
|
6
|
+
require_relative "better_fx/measurement"
|
6
7
|
module BetterFx
|
7
8
|
class << self
|
8
9
|
# Allows the user to set configuration options
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BetterFx::Measurement do
|
4
|
+
module TestClasses
|
5
|
+
class Telemetric
|
6
|
+
include BetterFx::Measurement
|
7
|
+
|
8
|
+
def inst_method
|
9
|
+
"instance method found"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
class OtherTelemetric
|
13
|
+
include BetterFx::Measurement
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:k1) { TestClasses::Telemetric }
|
18
|
+
let(:k2) { TestClasses::OtherTelemetric }
|
19
|
+
let(:mock_fx) { double "BetterFxClient", gauge: true }
|
20
|
+
before do
|
21
|
+
k1.instance_variable_set :@_bfx, nil
|
22
|
+
k2.instance_variable_set :@_bfx, nil
|
23
|
+
allow(BetterFx::Client).to receive(:new).and_return mock_fx
|
24
|
+
end
|
25
|
+
describe "defining a measurement" do
|
26
|
+
describe ".measurement" do
|
27
|
+
it "defines a new measurement of the specified name" do
|
28
|
+
k1.measurement :foo do
|
29
|
+
5
|
30
|
+
end
|
31
|
+
expect(k1.new.measure(:foo)).to eq 5
|
32
|
+
end
|
33
|
+
it "isolates measurements by class" do
|
34
|
+
k1.measurement :foo do
|
35
|
+
5
|
36
|
+
end
|
37
|
+
k2.measurement :foo do
|
38
|
+
12
|
39
|
+
end
|
40
|
+
expect(k1.instance_variable_get(:@_measurements)["foo"]).to be_a Proc
|
41
|
+
expect(k1.instance_variable_get(:@_measurements)["foo"].call).to eq 5
|
42
|
+
expect(k2.instance_variable_get(:@_measurements)["foo"]).to be_a Proc
|
43
|
+
expect(k2.instance_variable_get(:@_measurements)["foo"].call).to eq 12
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "performing a measurement" do
|
49
|
+
describe "#measure" do
|
50
|
+
let(:prok) { proc { 123 } }
|
51
|
+
let(:instance_of_k1) { k1.new }
|
52
|
+
before do
|
53
|
+
k1.measurement :foo, &prok
|
54
|
+
end
|
55
|
+
|
56
|
+
it "executes the proc associated with the measurement name" do
|
57
|
+
expect(prok).to receive :call
|
58
|
+
k1.new.measure :foo
|
59
|
+
end
|
60
|
+
|
61
|
+
it "sends the result of the proc to BetterFx" do
|
62
|
+
expect(mock_fx).to receive(:gauge).with(k1.gauge_name(:foo), hash_including(value: 123))
|
63
|
+
instance_of_k1.measure :foo
|
64
|
+
end
|
65
|
+
|
66
|
+
it "returns the result of the proc" do
|
67
|
+
expect(instance_of_k1.measure(:foo)).to eq prok.call
|
68
|
+
end
|
69
|
+
|
70
|
+
it "yields the current instance to the block" do
|
71
|
+
k1.measurement :bar, &:inst_method
|
72
|
+
expect(instance_of_k1.measure(:bar)).to eq "instance method found"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: better_fx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Courtland Caldwell
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rspec
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,8 +124,10 @@ files:
|
|
110
124
|
- lib/better_fx.rb
|
111
125
|
- lib/better_fx/client.rb
|
112
126
|
- lib/better_fx/configuration.rb
|
127
|
+
- lib/better_fx/measurement.rb
|
113
128
|
- lib/better_fx/version.rb
|
114
129
|
- spec/better_fx/client_spec.rb
|
130
|
+
- spec/better_fx/telemetry_spec.rb
|
115
131
|
- spec/better_fx_spec.rb
|
116
132
|
- spec/simplecov_custom_profile.rb
|
117
133
|
- spec/spec_helper.rb
|
@@ -142,6 +158,7 @@ specification_version: 4
|
|
142
158
|
summary: A more idiomatic interface to SignalFx.
|
143
159
|
test_files:
|
144
160
|
- spec/better_fx/client_spec.rb
|
161
|
+
- spec/better_fx/telemetry_spec.rb
|
145
162
|
- spec/better_fx_spec.rb
|
146
163
|
- spec/simplecov_custom_profile.rb
|
147
164
|
- spec/spec_helper.rb
|