prometheus-client-mmap 0.7.0.beta11 → 0.7.0.beta12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 20a1732cd0b1d06b876c82eac1ee2e2b43f461d0
4
- data.tar.gz: 1720a2b8f8b5d81dc817876f6cbce85a0f76f838
3
+ metadata.gz: d37ca4308c9dbdb10a22066b37df88b7e456cfb3
4
+ data.tar.gz: a27b2e124d343da9bb5b8f639894cd84f846334a
5
5
  SHA512:
6
- metadata.gz: fa2cacd9b3b5f63fe7022a9d848c7e02f2a76959787ae4be62ead6031a1bc05060aeb0169e58b3a8bc9aa1e4afce8e59181ed4bf41e8350b05ff417c8cbea6e3
7
- data.tar.gz: 2573ac9665891684612a9768bbb9b8c7f1c2e6c05d15c573c4f5377da1482a3a678953e9d3e1dc47d015b75cdbd3ef7a9eb144989287ca5e38fad3ef2dddfa1d
6
+ metadata.gz: 8fba7137a3ea1f5fa1ea375bb1999d85b1765a6c73adb69ef77a0f6f2d77db4f1ac057a37de600baf8b6abe355aaac97ee4db88e4ccf82aa81b4b14f4d845df9
7
+ data.tar.gz: e785931142ce33b5485b6dcb6742adaedc238235fd1c92e5117cfd3d483945912b9a721719a91ad6b013f4a8038dcb20c1a10e3bfe5fb47fff20115168055f9f
data/README.md CHANGED
@@ -1,14 +1,16 @@
1
- # Prometheus Ruby Client
1
+ # Prometheus Ruby Mmap Client
2
+
3
+ This Prometheus library is fork of [Prometheus Ruby Client](https://github.com/prometheus/client_ruby)
4
+ that uses mmap'ed files to share metrics from multiple processes.
5
+ This allows efficient metrics processing for Ruby web apps running in multiprocess setups like Unicorn.
2
6
 
3
7
  A suite of instrumentation metric primitives for Ruby that can be exposed
4
8
  through a HTTP interface. Intended to be used together with a
5
9
  [Prometheus server][1].
6
10
 
7
- [![Gem Version][4]](http://badge.fury.io/rb/prometheus-client)
8
- [![Build Status][3]](http://travis-ci.org/prometheus/client_ruby)
11
+ [![Gem Version][4]](http://badge.fury.io/rb/prometheus-client-mmap)
12
+ [![Build Status][3]](https://gitlab.com/gitlab-org/prometheus-client-mmap/commits/master)
9
13
  [![Dependency Status][5]](https://gemnasium.com/prometheus/client_ruby)
10
- [![Code Climate][6]](https://codeclimate.com/github/prometheus/client_ruby)
11
- [![Coverage Status][7]](https://coveralls.io/r/prometheus/client_ruby)
12
14
 
13
15
  ## Usage
14
16
 
@@ -173,11 +175,8 @@ rake
173
175
 
174
176
  [1]: https://github.com/prometheus/prometheus
175
177
  [2]: http://rack.github.io/
176
- [3]: https://secure.travis-ci.org/prometheus/client_ruby.png?branch=master
178
+ [3]: https://gitlab.com/gitlab-org/prometheus-client-mmap/badges/master/pipeline.svg
177
179
  [4]: https://badge.fury.io/rb/prometheus-client.svg
178
- [5]: https://gemnasium.com/prometheus/client_ruby.svg
179
- [6]: https://codeclimate.com/github/prometheus/client_ruby.png
180
- [7]: https://coveralls.io/repos/prometheus/client_ruby/badge.png?branch=master
181
180
  [8]: https://github.com/prometheus/pushgateway
182
181
  [9]: lib/prometheus/client/rack/exporter.rb
183
182
  [10]: lib/prometheus/client/rack/collector.rb
@@ -5,96 +5,95 @@ module Prometheus
5
5
  module Formats
6
6
  # Text format is human readable mainly used for manual inspection.
7
7
  module Text
8
- MEDIA_TYPE = 'text/plain'.freeze
9
- VERSION = '0.0.4'.freeze
8
+ MEDIA_TYPE = 'text/plain'.freeze
9
+ VERSION = '0.0.4'.freeze
10
10
  CONTENT_TYPE = "#{MEDIA_TYPE}; version=#{VERSION}".freeze
11
11
 
12
12
  METRIC_LINE = '%s%s %s'.freeze
13
- TYPE_LINE = '# TYPE %s %s'.freeze
14
- HELP_LINE = '# HELP %s %s'.freeze
13
+ TYPE_LINE = '# TYPE %s %s'.freeze
14
+ HELP_LINE = '# HELP %s %s'.freeze
15
15
 
16
- LABEL = '%s="%s"'.freeze
16
+ LABEL = '%s="%s"'.freeze
17
17
  SEPARATOR = ','.freeze
18
18
  DELIMITER = "\n".freeze
19
19
 
20
- REGEX = { doc: /[\n\\]/, label: /[\n\\"]/ }.freeze
20
+ REGEX = { doc: /[\n\\]/, label: /[\n\\"]/ }.freeze
21
21
  REPLACE = { "\n" => '\n', '\\' => '\\\\', '"' => '\"' }.freeze
22
22
 
23
- def self.marshal(registry)
24
- lines = []
25
-
26
- registry.metrics.each do |metric|
27
- lines << format(TYPE_LINE, metric.name, metric.type)
28
- lines << format(HELP_LINE, metric.name, escape(metric.docstring))
29
-
30
- metric.values.each do |label_set, value|
31
- representation(metric, label_set, value) { |l| lines << l }
23
+ class << self
24
+ def marshal(registry)
25
+ lines = []
26
+
27
+ registry.metrics.each do |metric|
28
+ lines << format(HELP_LINE, metric.name, escape(metric.docstring))
29
+ lines << format(TYPE_LINE, metric.name, metric.type)
30
+ metric.values.each do |label_set, value|
31
+ representation(metric, label_set, value) { |l| lines << l }
32
+ end
32
33
  end
34
+
35
+ # there must be a trailing delimiter
36
+ (lines << nil).join(DELIMITER)
33
37
  end
34
38
 
35
- # there must be a trailing delimiter
36
- (lines << nil).join(DELIMITER)
37
- end
39
+ def marshal_multiprocess(path = Prometheus::Client.configuration.multiprocess_files_dir)
40
+ metrics = load_metrics(path)
38
41
 
39
- def self.marshal_multiprocess(path = Prometheus::Client.configuration.multiprocess_files_dir)
40
- metrics = load_metrics(path)
42
+ lines = []
43
+ merge_metrics(metrics).each do |name, metric|
44
+ lines << format(HELP_LINE, name, escape(metric[:help]))
45
+ lines << format(TYPE_LINE, name, metric[:type])
41
46
 
42
- metrics.each_value do |metric|
43
- samples = {}
44
- buckets = {}
45
- metric[:samples].each do |name, labels, value|
46
- case metric[:type]
47
- when :gauge
48
- without_pid = labels.select{ |l| l[0] != 'pid' }
49
- case metric[:multiprocess_mode]
50
- when 'min'
51
- s = samples.fetch([name, without_pid], value)
52
- samples[[name, without_pid]] = [s, value].min
53
- when 'max'
54
- s = samples.fetch([name, without_pid], value)
55
- samples[[name, without_pid]] = [s, value].max
56
- when 'livesum'
57
- s = samples.fetch([name, without_pid], 0.0)
58
- samples[[name, without_pid]] = s + value
59
- else # all/liveall
60
- samples[[name, labels]] = value
61
- end
62
- else
63
- # Counter, Histogram and Summary.
64
- without_pid = labels.select{ |l| l[0] != 'pid' }
65
- s = samples.fetch([name, without_pid], 0.0)
66
- samples[[name, without_pid]] = s + value
47
+ metric[:samples].each do |metric_name, labels, value|
48
+ lines << metric(metric_name, format_labels(labels), value)
67
49
  end
50
+ end
51
+ (lines << nil).join(DELIMITER)
52
+ end
68
53
 
69
- metric[:samples] = samples.map do |name_labels, value|
70
- name, labels = name_labels
54
+ private
55
+
56
+ def merge_metrics(metrics)
57
+ metrics.each_value do |metric|
58
+ metric[:samples] = merge_samples(metric[:samples], metric[:type], metric[:multiprocess_mode]).map do |(name, labels), value|
71
59
  [name, labels.to_h, value]
72
60
  end
73
61
  end
74
62
  end
75
63
 
76
- output = ''
77
- metrics.each do |name, metric|
78
- output += "# HELP #{name} #{metric[:help]}\n"
79
- output += "# TYPE #{name} #{metric[:type].to_s}\n"
80
- metric[:samples].each do |metric_name, labels, value|
81
- if !labels.empty?
82
- labelstr = '{' + labels.sort.map { |k, v| "#{k}=\"#{v}\"" }.join(',') + '}'
83
- else
84
- labelstr = ''
64
+ def merge_samples(raw_samples, metric_type, multiprocess_mode)
65
+ samples = {}
66
+ raw_samples.each do |name, labels, value|
67
+ without_pid = labels.reject { |l| l[0] == 'pid' }
68
+
69
+ case metric_type
70
+ when :gauge
71
+ case multiprocess_mode
72
+ when 'min'
73
+ s = samples.fetch([name, without_pid], value)
74
+ samples[[name, without_pid]] = [s, value].min
75
+ when 'max'
76
+ s = samples.fetch([name, without_pid], value)
77
+ samples[[name, without_pid]] = [s, value].max
78
+ when 'livesum'
79
+ s = samples.fetch([name, without_pid], 0.0)
80
+ samples[[name, without_pid]] = s + value
81
+ else # all/liveall
82
+ samples[[name, labels]] = value
83
+ end
84
+ else
85
+ # Counter, Histogram and Summary.
86
+ s = samples.fetch([name, without_pid], 0.0)
87
+ samples[[name, without_pid]] = s + value
85
88
  end
86
- output += "#{metric_name}#{labelstr} #{value}\n"
87
89
  end
88
- end
89
- output
90
- end
91
90
 
92
- class << self
93
- private
91
+ samples
92
+ end
94
93
 
95
94
  def load_metrics(path)
96
95
  metrics = {}
97
- Dir.glob(File.join(path, '*.db')).each do |f|
96
+ Dir.glob(File.join(path, '*.db')).sort.each do |f|
98
97
  parts = File.basename(f, '.db').split('_')
99
98
  type = parts[0].to_sym
100
99
  d = MmapedDict.new(f)
@@ -133,36 +132,36 @@ module Prometheus
133
132
  elsif metric.type == :histogram
134
133
  histogram(metric.name, set, value, &block)
135
134
  else
136
- yield metric(metric.name, labels(set), value.get)
135
+ yield metric(metric.name, format_labels(set), value.get)
137
136
  end
138
137
  end
139
138
 
140
139
  def summary(name, set, value)
141
- value.each do |q, v|
142
- yield metric(name, labels(set.merge(quantile: q)), v.get)
140
+ value.get.each do |q, v|
141
+ yield metric(name, format_labels(set.merge(quantile: q)), v)
143
142
  end
144
143
 
145
- l = labels(set)
146
- yield metric("#{name}_sum", l, value.sum.get)
147
- yield metric("#{name}_count", l, value.total.get)
144
+ l = format_labels(set)
145
+ yield metric("#{name}_sum", l, value.get.sum)
146
+ yield metric("#{name}_count", l, value.get.total)
148
147
  end
149
148
 
150
149
  def histogram(name, set, value)
151
- value.each do |q, v|
152
- yield metric(name, labels(set.merge(le: q)), v.get)
150
+ value.get.each do |q, v|
151
+ yield metric(name, format_labels(set.merge(le: q)), v)
153
152
  end
154
- yield metric(name, labels(set.merge(le: '+Inf')), value.total.get)
153
+ yield metric(name, format_labels(set.merge(le: '+Inf')), value.get.total)
155
154
 
156
- l = labels(set)
157
- yield metric("#{name}_sum", l, value.sum.get)
158
- yield metric("#{name}_count", l, value.total.get)
155
+ l = format_labels(set)
156
+ yield metric("#{name}_sum", l, value.get.sum)
157
+ yield metric("#{name}_count", l, value.get.total)
159
158
  end
160
159
 
161
160
  def metric(name, labels, value)
162
161
  format(METRIC_LINE, name, labels, value)
163
162
  end
164
163
 
165
- def labels(set)
164
+ def format_labels(set)
166
165
  return if set.empty?
167
166
 
168
167
  strings = set.each_with_object([]) do |(key, value), memo|
@@ -4,7 +4,6 @@ require 'prometheus/client/uses_value_type'
4
4
 
5
5
  module Prometheus
6
6
  module Client
7
- # Metric
8
7
  class Metric
9
8
  include UsesValueType
10
9
  attr_reader :name, :docstring, :base_labels
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Prometheus
4
4
  module Client
5
- VERSION = '0.7.0.beta11'
5
+ VERSION = '0.7.0.beta12'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prometheus-client-mmap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0.beta11
4
+ version: 0.7.0.beta12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Schmidt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-27 00:00:00.000000000 Z
11
+ date: 2017-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mmap2