greek_fire 0.1.2 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9d67d3e3fd8c3a08d0bd463603bbd8b907e657dd
4
- data.tar.gz: 4be31bbd5abc87d27e80098396177f784907430e
3
+ metadata.gz: c3e6df01ce9446f1f2950a068bf5e621a3528f9f
4
+ data.tar.gz: 4833d2e726973e3b9f39e00801f5cbfc769ffc06
5
5
  SHA512:
6
- metadata.gz: 574b0f82a2d5089f8771958192ba9c1d6a15b57f3ccc090cc4602e381a2aa5dbaaefaa30a016ebcbf6e82cedeaae8c3b8e265540e63db55bb940873e443cf3b2
7
- data.tar.gz: db9a64df19ac2cd2e9b2b3b49a71c916c198d82504f3bb8583813968547cc98daf9ab13245f32e328b0223cf30295c78f48b31ad7e4946b0cf8de20990ccd1e2
6
+ metadata.gz: a758eff60556c5bfc049bd877c3d4ed1578ea3adf5905e4279f7ce3b611ff75cc05175e836fafe6c2de7b30912dfb703a76e2d5937868362d73f2137422df09d
7
+ data.tar.gz: 55aaf64df23449f042630a80e88c5340b487c610ad279b053b25d930a77444e49dc99fdbc9237bfe6411c25567b3ee63b3606f1459c11ee94c2d3b3f5496df93
@@ -2,7 +2,7 @@ module GreekFire
2
2
  class MetricsController < ActionController::Base
3
3
 
4
4
  def index
5
- render GreekFire::Metrics.metrics, layout: false, content_type: 'text/plain'
5
+ render GreekFire::Metric.metrics, layout: false, content_type: 'text/plain'
6
6
  end
7
7
  end
8
8
  end
@@ -4,13 +4,14 @@ module GreekFire
4
4
  class Gauge
5
5
  include ActiveModel::Conversion
6
6
 
7
- attr_reader :name, :labels, :description
7
+ attr_reader :name, :description
8
8
 
9
- def self.register(*args, &block)
10
- GreekFire::Metrics.register(self.new(*args, &block))
9
+ def self.register(name, description:nil, labels:nil, &block)
10
+ GreekFire::Metric.register(self.new(name, description: description, labels: labels, &block))
11
11
  end
12
12
 
13
- def initialize(name, description, labels, &block)
13
+ def initialize(name, description:nil, labels:nil, &block)
14
+ labels ||= {}
14
15
  @name = name
15
16
 
16
17
  @labels = {
@@ -22,12 +23,41 @@ module GreekFire
22
23
  @callable = block
23
24
  end
24
25
 
25
- def call
26
- @callable.call.tap do |value|
26
+ def labels
27
+ label_products(convert_label_values_to_array @labels)
28
+ end
29
+
30
+ def value(labels)
31
+ @callable.call(labels).tap do |value|
27
32
  unless value.is_a?(Numeric)
28
33
  raise ArgumentError, "Gauge value must be a number: #{value.inspect}"
29
34
  end
30
35
  end
31
36
  end
37
+
38
+ def metrics
39
+ labels.map {|label_set| Metric.new(name, label_set, value(label_set))}
40
+ end
41
+
42
+ private
43
+ def convert_label_values_to_array(labels)
44
+ labels.inject({}) do |doc, label_name|
45
+ label_values = label_name[1]
46
+ label_values = label_values.call if label_values.respond_to? :call
47
+ label_values = [label_values] unless label_values.is_a?(Enumerable)
48
+ doc[label_name[0]] = label_values
49
+ doc
50
+ end
51
+ end
52
+
53
+ def label_products(hsh)
54
+ #http://stackoverflow.com/questions/9786264/all-possible-combinations-from-a-hash-of-arrays-in-ruby
55
+ #thanks, internet
56
+ attrs = hsh.values
57
+ keys = hsh.keys
58
+ product = attrs[0].product(*attrs[1..-1])
59
+ product.map{ |p| Hash[keys.zip p] }
60
+ end
61
+
32
62
  end
33
63
  end
@@ -0,0 +1,18 @@
1
+ require 'active_model'
2
+
3
+ module GreekFire
4
+ class Metric < Struct.new(:name, :labels, :value)
5
+ include ActiveModel::Conversion
6
+
7
+ @registry = []
8
+ class << self
9
+ def register(measurer)
10
+ @registry << measurer
11
+ end
12
+
13
+ def metrics
14
+ @registry
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,3 +1,3 @@
1
- # HELP <%= gauge.name %> <%= gauge.description %>
1
+ # HELP <%= gauge.name %> <%= gauge.description.nil? ? "A number." : gauge.description %>
2
2
  # TYPE <%= gauge.name %> gauge
3
- <%= gauge.name %>{<%= gauge.labels.map {|k,v| "#{k}=\"#{v}\""}.join(", ").html_safe %>} <%= gauge.call %>
3
+ <%= render partial: "metric", collection: gauge.metrics %>
@@ -0,0 +1 @@
1
+ <%= labels.map {|k,v| "#{k}=\"#{v}\""}.join(", ").html_safe %>
@@ -0,0 +1 @@
1
+ <%= metric.name %>{<%= render partial: "labels", locals: {labels: metric.labels } %>} <%= metric.value %>
@@ -1,3 +1,3 @@
1
1
  module GreekFire
2
- VERSION = '0.1.2'
2
+ VERSION = '0.2.0'
3
3
  end
data/lib/greek_fire.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require "greek_fire/version"
2
2
  require "greek_fire/engine"
3
- require "greek_fire/metrics"
4
3
 
5
4
  module GreekFire
6
5
  # Your code goes here...
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: greek_fire
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - cconstantine
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-15 00:00:00.000000000 Z
11
+ date: 2017-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-rails
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec-collection_matchers
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-its
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rails
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -51,18 +79,15 @@ files:
51
79
  - app/assets/config/greek_fire_manifest.js
52
80
  - app/assets/javascripts/greek_fire/application.js
53
81
  - app/assets/stylesheets/greek_fire/application.css
54
- - app/controllers/greek_fire/application_controller.rb
55
82
  - app/controllers/greek_fire/metrics_controller.rb
56
- - app/helpers/greek_fire/application_helper.rb
57
- - app/jobs/greek_fire/application_job.rb
58
- - app/mailers/greek_fire/application_mailer.rb
59
- - app/models/greek_fire/application_record.rb
60
83
  - app/models/greek_fire/gauge.rb
84
+ - app/models/greek_fire/metric.rb
61
85
  - app/views/greek_fire/gauges/_gauge.html.erb
86
+ - app/views/greek_fire/metrics/_labels.html.erb
87
+ - app/views/greek_fire/metrics/_metric.html.erb
62
88
  - config/routes.rb
63
89
  - lib/greek_fire.rb
64
90
  - lib/greek_fire/engine.rb
65
- - lib/greek_fire/metrics.rb
66
91
  - lib/greek_fire/version.rb
67
92
  - lib/tasks/greek_fire_tasks.rake
68
93
  homepage: https://google.com
@@ -1,5 +0,0 @@
1
- module GreekFire
2
- class ApplicationController < ActionController::Base
3
- protect_from_forgery with: :exception
4
- end
5
- end
@@ -1,4 +0,0 @@
1
- module GreekFire
2
- module ApplicationHelper
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module GreekFire
2
- class ApplicationJob < ActiveJob::Base
3
- end
4
- end
@@ -1,6 +0,0 @@
1
- module GreekFire
2
- class ApplicationMailer < ActionMailer::Base
3
- default from: 'from@example.com'
4
- layout 'mailer'
5
- end
6
- end
@@ -1,5 +0,0 @@
1
- module GreekFire
2
- class ApplicationRecord < ActiveRecord::Base
3
- self.abstract_class = true
4
- end
5
- end
@@ -1,15 +0,0 @@
1
-
2
- module GreekFire
3
- class Metrics
4
- @metrics = []
5
- class << self
6
- def register(metric)
7
- @metrics << metric
8
- end
9
-
10
- def metrics
11
- @metrics
12
- end
13
- end
14
- end
15
- end