sematext-metrics 0.0.1.1 → 0.0.2
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 +8 -8
- data/Gemfile.lock +4 -4
- data/README.md +10 -2
- data/lib/sematext/metrics.rb +22 -7
- data/lib/sematext/metrics/async_sender.rb +5 -3
- data/lib/sematext/metrics/sync_sender.rb +4 -3
- data/lib/sematext/metrics/validator.rb +2 -0
- data/lib/sematext/metrics/version.rb +1 -1
- data/spec/lib/sematext/metrics/validator_spec.rb +82 -9
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ODUxZjQ0NWQ1OWVjZDQ5YmY1ODg2OWI1Yzg2YjE3NGRhOTlkZWEwMw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NWY1YmI0YjE4YjRhZDU1ZDI4MDRlYzMwNDU5MDdlZGYxMmY0ODJkMQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZmZhMWNhODQxNmE3NTYzYzZhMjBlZDZiZTY1MTE0MjQ4ZDhlOWFhZDM5ZmVj
|
10
|
+
NmUzNzAyYTI4NDg4ODkwZGU0MDY5M2EwODBlMGVkOWViMTZjYjhkZjQyM2Q4
|
11
|
+
ZDNjODZhNzlmNWYzNjE0N2QxODA3ZTY1MmNjZWIwOGYxNjkxNjc=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YzViYzMxODMxY2Q4YTRmYWMyYzkxOWY5MGQyZDE2NmFkM2YwNWQ3NmEyNzhk
|
14
|
+
NjQwNDM5MjMzZThlODFmYzc3ZWUyZDdkMWMwY2FkZGNmYzAwZjJkOTc1MDY3
|
15
|
+
YTE3NzRlZDQ1MGIxZTQyNmEwODk0NmNmN2JhMjJhYjRiZDk3ZGY=
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sematext-metrics (0.0.
|
4
|
+
sematext-metrics (0.0.2)
|
5
5
|
httparty (~> 0.11.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -11,9 +11,9 @@ GEM
|
|
11
11
|
httparty (0.11.0)
|
12
12
|
multi_json (~> 1.0)
|
13
13
|
multi_xml (>= 0.5.2)
|
14
|
-
multi_json (1.
|
15
|
-
multi_xml (0.5.
|
16
|
-
rake (10.0
|
14
|
+
multi_json (1.8.2)
|
15
|
+
multi_xml (0.5.5)
|
16
|
+
rake (10.1.0)
|
17
17
|
rspec (2.13.0)
|
18
18
|
rspec-core (~> 2.13.0)
|
19
19
|
rspec-expectations (~> 2.13.0)
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# sematext-metrics gem
|
1
|
+
# sematext-metrics gem[](https://travis-ci.org/sematext/sematext-metrics-gem)
|
2
2
|
|
3
3
|
Ruby gem for sending [Custom Metrics](https://sematext.atlassian.net/wiki/display/PUBSPM/Custom+Metrics) to [SPM](http://sematext.com/spm/index.html).
|
4
4
|
|
@@ -62,6 +62,14 @@ To use different tokens for different applications, use `sync` or `async` factor
|
|
62
62
|
user_metrics.send_batch user_datapoints
|
63
63
|
search_metrics.send_batch search_datapoints
|
64
64
|
|
65
|
+
To send metrics to on-premises SPM setup you can also configure endpoint url:
|
66
|
+
|
67
|
+
user_metrics = Sematext::Metrics::Client.sync("[token]", "http://spm-receiver.example.com/spm-receiver/custom/receive.raw")
|
68
|
+
search_metrics = Sematext::Metrics::Client.async("[token]", "http://spm-receiver.example.com/spm-receiver/custom/receive.raw")
|
69
|
+
|
70
|
+
or
|
71
|
+
|
72
|
+
Sematext::Metrics.initialize("[token]", :receiver_url => "http://spm-receiver.example.com/spm-receiver/custom/receive.raw")
|
65
73
|
|
66
74
|
## Asynchronous sending
|
67
75
|
|
@@ -72,7 +80,7 @@ In order to use this extension add `em-http-request` gem to your application ma
|
|
72
80
|
|
73
81
|
Asynchronous data sending can be configured during initialization:
|
74
82
|
|
75
|
-
Sematext::Metrics.initialize("[token]", async
|
83
|
+
Sematext::Metrics.initialize("[token]", :async => true)
|
76
84
|
|
77
85
|
Or use `async` factory method to create a client instance:
|
78
86
|
|
data/lib/sematext/metrics.rb
CHANGED
@@ -21,9 +21,16 @@ require "sematext/metrics/async_sender"
|
|
21
21
|
|
22
22
|
module Sematext
|
23
23
|
module Metrics
|
24
|
-
def self.initialize(token,
|
24
|
+
def self.initialize(token, args = {})
|
25
25
|
raise "Token should be defined" unless token
|
26
|
-
|
26
|
+
|
27
|
+
opts = { :async => false }
|
28
|
+
if !!args == args
|
29
|
+
opts[:async] = args
|
30
|
+
elsif args.kind_of?(Hash)
|
31
|
+
opts.merge!(args)
|
32
|
+
end
|
33
|
+
@client = opts[:async] ? Client.async(token, opts[:receiver_url]) : Client.sync(token, opts[:receiver_url])
|
27
34
|
end
|
28
35
|
|
29
36
|
def self.send datapoint
|
@@ -42,12 +49,20 @@ module Sematext
|
|
42
49
|
|
43
50
|
class Client
|
44
51
|
class << self
|
45
|
-
def sync(token)
|
46
|
-
|
52
|
+
def sync(token, receiver_url = nil)
|
53
|
+
url, path = parse_url(receiver_url) if receiver_url
|
54
|
+
Client.new(SyncSender.new(token, url, path))
|
47
55
|
end
|
48
56
|
|
49
|
-
def async(token)
|
50
|
-
|
57
|
+
def async(token, receiver_url = nil)
|
58
|
+
url, path = parse_url(receiver_url) if receiver_url
|
59
|
+
Client.new(AsyncSender.new(token, url, path))
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
def parse_url(url)
|
64
|
+
uri = URI.parse(url)
|
65
|
+
["#{uri.scheme}://#{uri.host}:#{uri.port}", uri.path]
|
51
66
|
end
|
52
67
|
end
|
53
68
|
|
@@ -77,7 +92,7 @@ module Sematext
|
|
77
92
|
@sender.send serialized
|
78
93
|
end
|
79
94
|
end
|
80
|
-
|
95
|
+
|
81
96
|
def epoch
|
82
97
|
Time.now.to_i * 1000
|
83
98
|
end
|
@@ -15,8 +15,10 @@
|
|
15
15
|
module Sematext
|
16
16
|
module Metrics
|
17
17
|
class AsyncSender
|
18
|
-
def initialize(token)
|
18
|
+
def initialize(token, base_uri, path)
|
19
19
|
@token = token
|
20
|
+
@path = path || Settings::RECEIVER_PATH
|
21
|
+
@base_uri = base_uri || Settings::RECEIVER_URI
|
20
22
|
if defined?(EventMachine)
|
21
23
|
require 'em-http-request'
|
22
24
|
end
|
@@ -26,7 +28,7 @@ module Sematext
|
|
26
28
|
deferrable = EventMachine::DefaultDeferrable.new
|
27
29
|
|
28
30
|
post_options = {
|
29
|
-
:path =>
|
31
|
+
:path => @path,
|
30
32
|
:query => {:token => @token},
|
31
33
|
:body => data,
|
32
34
|
:head => {
|
@@ -35,7 +37,7 @@ module Sematext
|
|
35
37
|
}
|
36
38
|
}
|
37
39
|
|
38
|
-
http = EventMachine::HttpRequest.new(
|
40
|
+
http = EventMachine::HttpRequest.new(@base_uri).post post_options
|
39
41
|
http.errback {
|
40
42
|
deferrable.fail{{:status => :failed}}
|
41
43
|
}
|
@@ -19,9 +19,10 @@ module Sematext
|
|
19
19
|
class SyncSender
|
20
20
|
include HTTParty
|
21
21
|
|
22
|
-
def initialize(token)
|
22
|
+
def initialize(token, base_uri, path)
|
23
23
|
@token = token
|
24
|
-
self.class.default_options[:base_uri] = Settings::RECEIVER_URI
|
24
|
+
self.class.default_options[:base_uri] = base_uri || Settings::RECEIVER_URI
|
25
|
+
@path = path || Settings::RECEIVER_PATH
|
25
26
|
end
|
26
27
|
|
27
28
|
def send data
|
@@ -33,7 +34,7 @@ module Sematext
|
|
33
34
|
},
|
34
35
|
:body => data
|
35
36
|
}
|
36
|
-
response = self.class.post(
|
37
|
+
response = self.class.post(@path, post_options)
|
37
38
|
if response.code == 201
|
38
39
|
{:status => :succeed}
|
39
40
|
else
|
@@ -30,6 +30,8 @@ module Sematext
|
|
30
30
|
[:name, :value, :agg_type].each do |field|
|
31
31
|
check_obligatory field, datapoint[field]
|
32
32
|
end
|
33
|
+
raise "name can't be empty" if datapoint[:name].empty?
|
34
|
+
raise "value should be a number" unless datapoint[:value].kind_of?(Numeric)
|
33
35
|
[:name, :filter1, :filter2].each do |field|
|
34
36
|
value = datapoint[field]
|
35
37
|
check_bounds field, datapoint[field] if value
|
@@ -15,24 +15,97 @@
|
|
15
15
|
require "spec_helper"
|
16
16
|
|
17
17
|
describe Sematext::Metrics::RawValidator do
|
18
|
-
let(:validator) { Sematext::Metrics::RawValidator }
|
18
|
+
let(:validator) { Sematext::Metrics::RawValidator.new }
|
19
|
+
|
20
|
+
it "raises exception when name is not set or empty" do
|
21
|
+
expect {
|
22
|
+
validator.validate(
|
23
|
+
:name => '',
|
24
|
+
:agg_type => :sum,
|
25
|
+
:value => 42
|
26
|
+
)
|
27
|
+
}.to raise_error
|
28
|
+
|
29
|
+
expect {
|
30
|
+
validator.validate(
|
31
|
+
:agg_type => :sum,
|
32
|
+
:value => 42
|
33
|
+
)
|
34
|
+
}.to raise_error
|
35
|
+
end
|
36
|
+
|
37
|
+
it "raises exception when value is not set" do
|
38
|
+
expect {
|
39
|
+
validator.validate(
|
40
|
+
:name => 'name',
|
41
|
+
:agg_type => :sum
|
42
|
+
)
|
43
|
+
}.to raise_error
|
44
|
+
end
|
19
45
|
|
20
|
-
it "raises
|
46
|
+
it "raises exceptionw when agg_type is not set or invalid" do
|
21
47
|
expect {
|
22
48
|
validator.validate(
|
23
|
-
:
|
24
|
-
:
|
25
|
-
:value => 1234,
|
26
|
-
:agg_type => :unknown
|
49
|
+
:name => 'name',
|
50
|
+
:value => 42
|
27
51
|
)
|
28
52
|
}.to raise_error
|
29
|
-
|
30
53
|
expect {
|
31
54
|
validator.validate(
|
32
|
-
:name => '
|
55
|
+
:name => 'name',
|
56
|
+
:value => 42,
|
57
|
+
:agg_type => :invalid
|
58
|
+
)
|
59
|
+
}.to raise_error
|
60
|
+
end
|
61
|
+
|
62
|
+
it "raises exception when name, filter1 or filter2 too log" do
|
63
|
+
expect {
|
64
|
+
validator.validate(
|
65
|
+
:name => 'a' * 256,
|
33
66
|
:agg_type => :sum,
|
34
|
-
:
|
67
|
+
:value => 42
|
68
|
+
)
|
69
|
+
}.to raise_error
|
70
|
+
expect {
|
71
|
+
validator.validate(
|
72
|
+
:name => 'name',
|
73
|
+
:agg_type => :sum,
|
74
|
+
:value => 42,
|
75
|
+
:filter1 => 'a' * 256
|
76
|
+
)
|
77
|
+
}.to raise_error
|
78
|
+
expect {
|
79
|
+
validator.validate(
|
80
|
+
:name => 'name',
|
81
|
+
:agg_type => :sum,
|
82
|
+
:value => 42,
|
83
|
+
:filter2 => 'a' * 256
|
84
|
+
)
|
85
|
+
}.to raise_error
|
86
|
+
end
|
87
|
+
|
88
|
+
it "raises exception when value is not a number" do
|
89
|
+
expect {
|
90
|
+
validator.validate(
|
91
|
+
:name => 'name',
|
92
|
+
:agg_type => :sum,
|
93
|
+
:value => 'foo'
|
35
94
|
)
|
36
95
|
}.to raise_error
|
96
|
+
expect {
|
97
|
+
validator.validate(
|
98
|
+
:name => 'name',
|
99
|
+
:agg_type => :sum,
|
100
|
+
:value => 100.2
|
101
|
+
)
|
102
|
+
}.to_not raise_error
|
103
|
+
expect {
|
104
|
+
validator.validate(
|
105
|
+
:name => 'name',
|
106
|
+
:agg_type => :sum,
|
107
|
+
:value => 100
|
108
|
+
)
|
109
|
+
}.to_not raise_error
|
37
110
|
end
|
38
111
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sematext-metrics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Zalunin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|