carbonator 0.0.5 → 0.0.6
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.
- data/README.md +12 -10
- data/carbonator.gemspec +1 -0
- data/lib/carbonator/cli.rb +5 -7
- data/lib/carbonator/parser.rb +22 -12
- data/lib/carbonator/version.rb +1 -1
- data/spec/carbonator/parser_spec.rb +14 -13
- data/spec/spec_helper.rb +1 -0
- metadata +43 -12
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[](http://travis-ci.org/gorsuch/carbonator)
|
4
4
|
|
5
|
-
Carbonator is an experimental
|
5
|
+
Carbonator is an experimental line filter that transforms log lines into Carbon compatable inputs.
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -21,20 +21,22 @@ Or install it yourself as:
|
|
21
21
|
## Usage
|
22
22
|
|
23
23
|
```bash
|
24
|
-
$ echo
|
25
|
-
foo.a 1
|
26
|
-
|
27
|
-
|
24
|
+
$ echo measure=foo.a value=1 | carbonator
|
25
|
+
foo.a 1 1348671182
|
26
|
+
|
27
|
+
# keys outside of measure, value or timestamp will be safely ignored
|
28
|
+
$ echo app=myapp measure=foo.a value=1 | carbonator
|
29
|
+
carbonator.foo.a 1 1348671186
|
28
30
|
```
|
29
31
|
|
30
|
-
You may wish to
|
32
|
+
You may wish to adjust the prefix. As an example, you may want to add an API Key for [Hosted Graphite](http://hostedgraphite.com/):
|
31
33
|
|
32
34
|
```bash
|
33
35
|
$ export HOSTED_GRAPHITE_TOKEN=some-random-key
|
34
|
-
$ echo host=foo a=1 b=2 c=3 | carbonator -p $HOSTED_GRAPHITE_TOKEN
|
35
|
-
some-random-key.foo.a 1
|
36
|
-
some-random-key.foo.b 2
|
37
|
-
some-random-key.foo.c 3
|
36
|
+
$ echo host=foo a=1 b=2 c=3 | carbonator -p $HOSTED_GRAPHITE_TOKEN.measurements
|
37
|
+
some-random-key.measurements.foo.a 1 1348671211
|
38
|
+
some-random-key.foo.b 2 1348671211
|
39
|
+
some-random-key.foo.c 3 1348671211
|
38
40
|
```
|
39
41
|
|
40
42
|
And finally, since we're talking about command lines here, you can pipe this data straight to your Hosted Graphite installation like so:
|
data/carbonator.gemspec
CHANGED
data/lib/carbonator/cli.rb
CHANGED
@@ -2,11 +2,7 @@ require 'optparse'
|
|
2
2
|
|
3
3
|
module Carbonator
|
4
4
|
class CLI
|
5
|
-
|
6
|
-
|
7
|
-
def initialize
|
8
|
-
@parser = Parser.new
|
9
|
-
end
|
5
|
+
attr_accessor :parser
|
10
6
|
|
11
7
|
def run
|
12
8
|
ARGV.options do |o|
|
@@ -15,10 +11,12 @@ module Carbonator
|
|
15
11
|
o.set_summary_indent(" ")
|
16
12
|
o.on('-p', '--prefix PREFIX', String, 'path to prefix metrics with') { |p| opts[:prefix] = p }
|
17
13
|
o.parse!
|
18
|
-
|
14
|
+
parser = Parser.new(opts)
|
15
|
+
|
19
16
|
ARGF.each_line do |l|
|
20
17
|
data = KV.parse(l)
|
21
|
-
parser.parse(data
|
18
|
+
result = parser.parse(data)
|
19
|
+
puts result if result
|
22
20
|
end
|
23
21
|
end
|
24
22
|
end
|
data/lib/carbonator/parser.rb
CHANGED
@@ -1,23 +1,33 @@
|
|
1
1
|
module Carbonator
|
2
2
|
class Parser
|
3
|
-
|
4
|
-
host_key = opts[:host_key] || 'host'
|
5
|
-
host = data[host_key] || 'carbinator'
|
3
|
+
attr_accessor :prefix
|
6
4
|
|
7
|
-
|
5
|
+
def initialize(opts={})
|
6
|
+
self.prefix = opts[:prefix] || 'carbonator'
|
7
|
+
end
|
8
|
+
|
9
|
+
def metric(data)
|
10
|
+
prefix ? "#{prefix}.#{data['measure']}" : data['measure']
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse(data)
|
14
|
+
return nil unless measurement?(data)
|
15
|
+
metric = metric(data)
|
16
|
+
value = value(data)
|
17
|
+
timestamp = timestamp(data)
|
18
|
+
"#{metric} #{value} #{timestamp}"
|
19
|
+
end
|
8
20
|
|
9
|
-
|
10
|
-
|
21
|
+
def timestamp(data)
|
22
|
+
data['timestamp'] || Time.now.to_i
|
11
23
|
end
|
12
24
|
|
13
|
-
def
|
14
|
-
data.
|
25
|
+
def measurement?(data)
|
26
|
+
data.has_key?('measure') && data.has_key?('value')
|
15
27
|
end
|
16
28
|
|
17
|
-
def
|
18
|
-
|
19
|
-
"#{metricname(data, k, opts)} #{v} #{Time.now.to_i}"
|
20
|
-
end
|
29
|
+
def value(data)
|
30
|
+
data['value']
|
21
31
|
end
|
22
32
|
end
|
23
33
|
end
|
data/lib/carbonator/version.rb
CHANGED
@@ -1,30 +1,31 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Carbonator::Parser do
|
4
|
-
let(:data) { {'host' => 'foo', '
|
4
|
+
let(:data) { {'host' => 'foo', 'measure' => 'foo.http_code', 'value' => 200} }
|
5
5
|
let(:parser) { Carbonator::Parser.new }
|
6
|
+
let(:prefixed_parser) { Carbonator::Parser.new(:prefix => 'test') }
|
6
7
|
|
7
8
|
describe '#parse' do
|
8
|
-
it 'it should return
|
9
|
-
parser.parse(data).should be_kind_of(
|
9
|
+
it 'it should return a string' do
|
10
|
+
parser.parse(data).should be_kind_of(String)
|
10
11
|
end
|
11
12
|
|
12
13
|
it 'should handle a simple dataset' do
|
13
|
-
|
14
|
+
Timecop.freeze(Time.now) do
|
15
|
+
expected = "carbonator.foo.http_code 200 #{Time.now.to_i}"
|
16
|
+
parser.parse(data).should eq(expected)
|
17
|
+
end
|
14
18
|
end
|
15
19
|
|
16
20
|
it 'should prefix the data if asked' do
|
17
|
-
|
21
|
+
Timecop.freeze(Time.now) do
|
22
|
+
expected = "test.foo.http_code 200 #{Time.now.to_i}"
|
23
|
+
prefixed_parser.parse(data).should eq(expected)
|
24
|
+
end
|
18
25
|
end
|
19
26
|
|
20
|
-
it 'should
|
21
|
-
|
22
|
-
parser.parse(data.merge('alt' => 'other'), :host_key => 'alt').should eq(expected)
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'substitutes a default base if one is not provided' do
|
26
|
-
expected = ['carbinator.http_code 200']
|
27
|
-
parser.parse({'http_code' => 200}).should eq(expected)
|
27
|
+
it 'should return nil if not passed proper data' do
|
28
|
+
prefixed_parser.parse(:a => 1, :b => 2).should be_nil
|
28
29
|
end
|
29
30
|
end
|
30
31
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: carbonator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rspec
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,18 +37,44 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: timecop
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
36
62
|
- !ruby/object:Gem::Dependency
|
37
63
|
name: kv
|
38
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
39
65
|
none: false
|
40
66
|
requirements:
|
41
|
-
- - =
|
67
|
+
- - '='
|
42
68
|
- !ruby/object:Gem::Version
|
43
69
|
version: 0.0.5
|
44
70
|
type: :runtime
|
45
71
|
prerelease: false
|
46
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - '='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.0.5
|
47
78
|
description: An experimental toolkit for transforming key=value text streams into
|
48
79
|
Carbon compatable inputs.
|
49
80
|
email:
|
@@ -81,7 +112,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
81
112
|
version: '0'
|
82
113
|
segments:
|
83
114
|
- 0
|
84
|
-
hash:
|
115
|
+
hash: -3605827212961003433
|
85
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
117
|
none: false
|
87
118
|
requirements:
|
@@ -90,10 +121,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
121
|
version: '0'
|
91
122
|
segments:
|
92
123
|
- 0
|
93
|
-
hash:
|
124
|
+
hash: -3605827212961003433
|
94
125
|
requirements: []
|
95
126
|
rubyforge_project:
|
96
|
-
rubygems_version: 1.8.
|
127
|
+
rubygems_version: 1.8.23
|
97
128
|
signing_key:
|
98
129
|
specification_version: 3
|
99
130
|
summary: An experimental toolkit for transforming key=value text streams into Carbon
|