upfluence-utils 0.3.1 → 0.4.0

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