carbonator 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/gorsuch/carbonator.png)](http://travis-ci.org/gorsuch/carbonator)
4
4
 
5
- Carbonator is an experimental toolkit for transforming `key=value` text streams into Carbon compatable inputs.
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 host=foo a=1 b=2 c=3 | carbonator
25
- foo.a 1
26
- foo.b 2
27
- foo.c 3
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 add a prefix to things. As an example, you may want to add an API Key for [Hosted Graphite](http://hostedgraphite.com/):
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
@@ -18,5 +18,6 @@ Gem::Specification.new do |gem|
18
18
  gem.require_paths = ["lib"]
19
19
  gem.add_development_dependency('rake')
20
20
  gem.add_development_dependency('rspec')
21
+ gem.add_development_dependency('timecop')
21
22
  gem.add_dependency('kv', '0.0.5')
22
23
  end
@@ -2,11 +2,7 @@ require 'optparse'
2
2
 
3
3
  module Carbonator
4
4
  class CLI
5
- attr_reader :parser
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, opts).each { |x| puts x }
18
+ result = parser.parse(data)
19
+ puts result if result
22
20
  end
23
21
  end
24
22
  end
@@ -1,23 +1,33 @@
1
1
  module Carbonator
2
2
  class Parser
3
- def metricname(data, k, opts)
4
- host_key = opts[:host_key] || 'host'
5
- host = data[host_key] || 'carbinator'
3
+ attr_accessor :prefix
6
4
 
7
- name = [host, k].join('.')
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
- prefix = opts[:prefix]
10
- prefix ? "#{prefix}.#{name}" : name
21
+ def timestamp(data)
22
+ data['timestamp'] || Time.now.to_i
11
23
  end
12
24
 
13
- def filter_numeric(data)
14
- data.select { |k,v| v.kind_of?(Numeric) }
25
+ def measurement?(data)
26
+ data.has_key?('measure') && data.has_key?('value')
15
27
  end
16
28
 
17
- def parse(data, opts={})
18
- filter_numeric(data).map do |k,v|
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
@@ -1,3 +1,3 @@
1
1
  module Carbonator
2
- VERSION = "0.0.5"
2
+ VERSION = '0.0.6'
3
3
  end
@@ -1,30 +1,31 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Carbonator::Parser do
4
- let(:data) { {'host' => 'foo', 'http_code' => 200, 'connect_time' => 0.2} }
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 an array' do
9
- parser.parse(data).should be_kind_of(Array)
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
- parser.parse(data).should eq(['foo.http_code 200', 'foo.connect_time 0.2'])
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
- parser.parse(data, :prefix => 'test').should eq(['test.foo.http_code 200', 'test.foo.connect_time 0.2'])
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 use a different base name if asked' do
21
- expected = ['other.http_code 200', 'other.connect_time 0.2']
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
@@ -1,4 +1,5 @@
1
1
  require 'carbonator'
2
+ require 'timecop'
2
3
 
3
4
  RSpec.configure do |config|
4
5
  config.treat_symbols_as_metadata_keys_with_true_values = true
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.5
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-09-26 00:00:00.000000000 Z
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: &70227239693920 !ruby/object:Gem::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: *70227239693920
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: &70227239693260 !ruby/object:Gem::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: *70227239693260
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: &70227239692420 !ruby/object:Gem::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: *70227239692420
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: 157509105228604424
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: 157509105228604424
124
+ hash: -3605827212961003433
94
125
  requirements: []
95
126
  rubyforge_project:
96
- rubygems_version: 1.8.10
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