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 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