upfluence-utils 0.3.1 → 0.4.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: e24f463af1cedaea6f805dbe067e1ff244fe836a
4
- data.tar.gz: 71b0dc7435ae3f3c5313aac3207a4c5dde6e33fd
3
+ metadata.gz: 3b29dc2613a02e871f444d7a919234f8008be6dc
4
+ data.tar.gz: b41f20f54b515e2da0199a14c1564fc1e2a8cdfd
5
5
  SHA512:
6
- metadata.gz: 0d1c4e0b5e68d57a01597c560edf8dd29bae268733a44f062685e95144b042cb645f25fc98986d75be4d4d46d118fdcfa85a44ae452f007cbbe572ef6645c469
7
- data.tar.gz: c5bb1ddf19acadb8185493ef957c874220d0044e938a70d1befeb4f2f0a1dba5ab2eebaceec9f1eb1c8a321477e445d0d5027518c2bfbb7f9361e712bad34773
6
+ metadata.gz: 9a1e7ffef29b92a0a63b01be4c78cc8f6b66da1162d899840881d1f3b2d2ce6a1ca3b303ad19b41de8ae3c588d2bed5d9d0d33541bfdf2ca4232907272545ab9
7
+ data.tar.gz: 9d80a474745c87584904a822d11fe5f4ee589786dc1be441eac11290c9d7b1f3ec34a0b1378978a91b78b2974cef032abd3b2abebf915e2c98f71cfca557019c
@@ -20,11 +20,15 @@ module Upfluence
20
20
  end
21
21
 
22
22
  def notify(error, method, *args)
23
- Raven.capture_exception(
24
- error,
25
- extra: { method: method, arguments: args },
26
- tags: { method: method }
27
- )
23
+ begin
24
+ Raven.capture_exception(
25
+ error,
26
+ extra: { method: method, arguments: args },
27
+ tags: { method: method }
28
+ )
29
+ rescue Raven::Error => e
30
+ Upfluence.logger.error e.message
31
+ end
28
32
  end
29
33
 
30
34
  def user=(user)
@@ -0,0 +1,87 @@
1
+ require 'prometheus/client'
2
+
3
+ module Upfluence
4
+ module HTTP
5
+ module Middleware
6
+ class Prometheus
7
+ def initialize(app, registry = ::Prometheus::Client.registry)
8
+ @registry = registry
9
+
10
+ @request_total_count = @registry.get(
11
+ :uhttp_handler_requests_total
12
+ ) || @registry.counter(
13
+ :uhttp_handler_requests_total,
14
+ 'Histogram of processed items',
15
+ )
16
+
17
+ @request_histogram = @registry.get(
18
+ :uhttp_handler_requests_duration_second
19
+ ) || @registry.histogram(
20
+ :uhttp_handler_requests_duration_second,
21
+ 'Histogram of processing time',
22
+ )
23
+
24
+ @app = app
25
+ end
26
+
27
+ def call(env)
28
+ trace(env) { @app.call(env) }
29
+ end
30
+
31
+ private
32
+
33
+ def trace(env)
34
+ start = Time.now
35
+ yield.tap do |response|
36
+ duration = [(Time.now - start).to_f, 0.0].max
37
+ record(env, response.first.to_s, duration)
38
+ end
39
+ end
40
+
41
+ def record(env, code, duration)
42
+ @request_total_count.increment(
43
+ path: parse_route(env),
44
+ method: env['REQUEST_METHOD'].downcase,
45
+ status: code
46
+ )
47
+
48
+ @request_histogram.observe(
49
+ { path: parse_route(env), method: env['REQUEST_METHOD'].downcase },
50
+ duration
51
+ )
52
+ end
53
+
54
+ def parse_route(env)
55
+ parse_route_sinatra(env) || parse_route_rails(env) ||
56
+ parse_route_default(env)
57
+ end
58
+
59
+ def parse_route_rails(env)
60
+ params = env["action_dispatch.request.parameters"]
61
+ return nil if params.nil?
62
+
63
+ "#{params["controller"]}##{params["action"]}"
64
+ end
65
+
66
+ def parse_route_sinatra(env)
67
+ route = env['sinatra.route']
68
+ return nil if route.nil? || route.strip == ''
69
+
70
+ path = Rack::Request.new(env).path
71
+
72
+ splitted_template = route.split(' ').last.split('/').select do |v|
73
+ v != ''
74
+ end.reverse
75
+
76
+ path.split('/').reverse.map.with_index do |part, i|
77
+ splitted_template[i] || part
78
+ end.reverse.join('/')
79
+ end
80
+
81
+ def parse_route_default(env)
82
+ Rack::Request.new(env).path.gsub(%r{/\d+(/|$)}, '/:id\\1')
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -1,5 +1,7 @@
1
1
  require 'rack/handler'
2
2
  require 'rack/etag'
3
+ require 'prometheus/client'
4
+ require 'prometheus/client/push'
3
5
 
4
6
  require 'upfluence/environment'
5
7
  require 'upfluence/error_logger'
@@ -9,6 +11,7 @@ require 'upfluence/http/endpoint/healthcheck'
9
11
  require 'upfluence/http/middleware/logger'
10
12
  require 'upfluence/http/middleware/application_headers'
11
13
  require 'upfluence/http/middleware/handle_exception'
14
+ require 'upfluence/http/middleware/prometheus'
12
15
  require 'upfluence/handler/base'
13
16
 
14
17
  module Upfluence
@@ -19,7 +22,11 @@ module Upfluence
19
22
  Port: ENV['PORT'] || 8080,
20
23
  Host: '0.0.0.0',
21
24
  threaded: true,
22
- interfaces: []
25
+ interfaces: [],
26
+ push_gateway_url: ENV['PUSH_GATEWAY_URL'],
27
+ push_gateway_interval: 15, # sec
28
+ app_name: ENV['APP_NAME'] || 'uhttp-rb-server',
29
+ unit_name: ENV['UNIT_NAME'] || 'uhttp-rb-server-anonymous'
23
30
  }.freeze
24
31
 
25
32
  def initialize(options = {}, &block)
@@ -29,6 +36,7 @@ module Upfluence
29
36
 
30
37
  @builder = Builder.new do
31
38
  use Middleware::Logger
39
+ use Middleware::Prometheus
32
40
  use Middleware::ApplicationHeaders, base_handler
33
41
  use Middleware::HandleException
34
42
  use Upfluence.error_logger.middleware
@@ -54,6 +62,9 @@ module Upfluence
54
62
 
55
63
  def serve
56
64
  ENV['RACK_ENV'] = Upfluence.env.to_s
65
+
66
+ Thread.new { run_prometheus_exporter } if @options[:push_gateway_url]
67
+
57
68
  @handler.run(@builder, @options) do |server|
58
69
  server.threaded = @options[:threaded] if server.respond_to? :threaded=
59
70
 
@@ -62,6 +73,24 @@ module Upfluence
62
73
  end
63
74
  end
64
75
  end
76
+
77
+ private
78
+
79
+ def run_prometheus_exporter
80
+ push = Prometheus::Client::Push.new(
81
+ @options[:app_name],
82
+ @options[:unit_name],
83
+ @options[:push_gateway_url]
84
+ )
85
+
86
+ loop do
87
+ sleep @options[:push_gateway_interval]
88
+
89
+ push.replace Prometheus::Client.registry
90
+ end
91
+ rescue => e
92
+ puts e
93
+ end
65
94
  end
66
95
  end
67
96
  end
@@ -1,5 +1,5 @@
1
1
  module Upfluence
2
2
  module Utils
3
- VERSION = '0.3.1'.freeze
3
+ VERSION = '0.4.0'.freeze
4
4
  end
5
5
  end
data/rbutils.gemspec CHANGED
@@ -28,5 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.add_runtime_dependency 'activesupport'
29
29
  spec.add_runtime_dependency 'puma'
30
30
  spec.add_runtime_dependency 'rack'
31
+ spec.add_runtime_dependency 'prometheus-client'
31
32
  spec.add_runtime_dependency 'active_model_serializers', '~> 0.9.0'
32
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: upfluence-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Upfluence
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-12 00:00:00.000000000 Z
11
+ date: 2017-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -184,6 +184,20 @@ dependencies:
184
184
  - - ">="
185
185
  - !ruby/object:Gem::Version
186
186
  version: '0'
187
+ - !ruby/object:Gem::Dependency
188
+ name: prometheus-client
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ type: :runtime
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
187
201
  - !ruby/object:Gem::Dependency
188
202
  name: active_model_serializers
189
203
  requirement: !ruby/object:Gem::Requirement
@@ -227,6 +241,7 @@ files:
227
241
  - lib/upfluence/http/middleware/application_headers.rb
228
242
  - lib/upfluence/http/middleware/handle_exception.rb
229
243
  - lib/upfluence/http/middleware/logger.rb
244
+ - lib/upfluence/http/middleware/prometheus.rb
230
245
  - lib/upfluence/http/server.rb
231
246
  - lib/upfluence/logger.rb
232
247
  - lib/upfluence/mixin/strong_parameters.rb