stack-service-base 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 95b61165ddad06a10203d8b2633ec338ea353bb0f238773aa11a991a2cbf091d
4
+ data.tar.gz: c9935564be644e842e6edf1224c45306d15d1b070caa8c6152c8f47bf1174f1b
5
+ SHA512:
6
+ metadata.gz: 1a1a331da52f907d83f9a977e433615908f4ab99bdb95fb28dd471529c288501e2b770a238b38357eaa3645fe142814ea43c5340a7b65b42f47ee30d7c32484a
7
+ data.tar.gz: 27ffac7b6ce58cff790427bc17ce1ace656c8f76b585686a7113b6cf1bf397d191771f595f7a1dc72e764a45692200c19010133a528eb1ea12829b995f798e00
@@ -0,0 +1,7 @@
1
+ require 'prometheus/client'
2
+ require 'prometheus/middleware/collector'
3
+ require 'prometheus/middleware/exporter'
4
+
5
+ # use Rack::Deflater
6
+ use Prometheus::Middleware::Collector
7
+ use Prometheus::Middleware::Exporter
@@ -0,0 +1,93 @@
1
+ module PrometheusParser
2
+ def self.parse_metrics(text)
3
+ metrics = Hash.new { |h, k| h[k] = { series: [] } }
4
+
5
+ series = ->(name, labels) do
6
+ metrics[name][:series].find { _1[:labels] == labels } ||
7
+ metrics[name][:series] << { labels: labels } and metrics[name][:series].last
8
+ end
9
+
10
+ text.each_line(chomp: true) do |l|
11
+ case l
12
+ when /\A#\s*HELP\s+(\S+)\s+(.+)/
13
+ metrics[$1.to_sym][:help] = $2
14
+ when /\A#\s*TYPE\s+(\S+)\s+(\S+)/
15
+ metrics[$1.to_sym][:type] = $2.to_sym
16
+ when /\A([^ {]+)(?:\{([^}]*)\})?\s+([0-9eE+\-\.]+)\z/
17
+ name, lbls, val = $1.to_sym, $2, $3.to_f
18
+ labels = lbls.to_s.split(',').to_h { |kv| k, v = kv.split('='); [k.to_sym, v.delete('"')] }
19
+
20
+ case
21
+ when name.to_s.end_with?('_bucket')
22
+ base = name.to_s.sub(/_bucket\z/, '').to_sym
23
+ le = labels.delete(:le)
24
+ (entry = series[base, labels])[:buckets] ||= {}
25
+ entry[:buckets][le] = val
26
+ when name.to_s =~ /(.*)_(sum|count)\z/
27
+ base, field = Regexp.last_match(1).to_sym, Regexp.last_match(2).to_sym
28
+ (series[base, labels])[field] = val
29
+ when labels.key?(:quantile) # Summary quantile
30
+ q = labels.delete(:quantile)
31
+ (entry = series[name, labels])[:quantiles] ||= {}
32
+ entry[:quantiles][q] = val
33
+ else # Counter/Gauge sample
34
+ metrics[name][:series] << { labels: labels, value: val }
35
+ end
36
+ end
37
+ end
38
+
39
+ metrics
40
+ end
41
+ end
42
+
43
+ metrics_text = <<~METRICS
44
+ # TYPE http_server_requests_total counter
45
+ # HELP http_server_requests_total The total number of HTTP requests handled by the Rack application.
46
+ http_server_requests_total{code="200",method="get",path="/"} 5.0
47
+ http_server_requests_total{code="200",method="get",path="/metrics"} 18.0
48
+ # TYPE http_server_request_duration_seconds histogram
49
+ # HELP http_server_request_duration_seconds The HTTP response duration of the Rack application.
50
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="0.005"} 0.0
51
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="0.01"} 0.0
52
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="0.025"} 0.0
53
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="0.05"} 4.0
54
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="0.1"} 5.0
55
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="0.25"} 5.0
56
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="0.5"} 5.0
57
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="1"} 5.0
58
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="2.5"} 5.0
59
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="5"} 5.0
60
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="10"} 5.0
61
+ http_server_request_duration_seconds_bucket{method="get",path="/",le="+Inf"} 5.0
62
+ http_server_request_duration_seconds_sum{method="get",path="/"} 0.1885649065952748
63
+ http_server_request_duration_seconds_count{method="get",path="/"} 5.0
64
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="0.005"} 18.0
65
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="0.01"} 18.0
66
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="0.025"} 18.0
67
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="0.05"} 18.0
68
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="0.1"} 18.0
69
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="0.25"} 18.0
70
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="0.5"} 18.0
71
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="1"} 18.0
72
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="2.5"} 18.0
73
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="5"} 18.0
74
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="10"} 18.0
75
+ http_server_request_duration_seconds_bucket{method="get",path="/metrics",le="+Inf"} 18.0
76
+ http_server_request_duration_seconds_sum{method="get",path="/metrics"} 0.012181486235931516
77
+ http_server_request_duration_seconds_count{method="get",path="/metrics"} 18.0
78
+ # TYPE http_server_exceptions_total counter
79
+ # HELP http_server_exceptions_total The total number of exceptions raised by the Rack application.
80
+ METRICS
81
+
82
+ metrics = PrometheusParser::parse_metrics metrics_text
83
+
84
+ # Print the parsed metrics
85
+ metrics.each do |name, data|
86
+ puts "Metric: #{name}"
87
+ puts "Description: #{data[:help]}"
88
+ puts "Type: #{data[:type]}"
89
+ data[:series].each do |series|
90
+ puts " #{series} "
91
+ end
92
+ puts
93
+ end
@@ -0,0 +1 @@
1
+ require 'service-base/prometheus'
data/lib/version.rb ADDED
@@ -0,0 +1,5 @@
1
+ module StackServiceBase
2
+ class Base
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stack-service-base
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - ''
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2025-05-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: prometheus-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description:
28
+ email:
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/stack-service-base.rb
34
+ - lib/stack-service-base/prometheus.rb
35
+ - lib/stack-service-base/prometheus_parser.rb
36
+ - lib/version.rb
37
+ homepage:
38
+ licenses: []
39
+ metadata: {}
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 3.3.1
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubygems_version: 3.5.10
56
+ signing_key:
57
+ specification_version: 4
58
+ summary: Common files
59
+ test_files: []