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 +4 -4
- data/lib/upfluence/error_logger/sentry.rb +9 -5
- data/lib/upfluence/http/middleware/prometheus.rb +87 -0
- data/lib/upfluence/http/server.rb +30 -1
- data/lib/upfluence/utils/version.rb +1 -1
- data/rbutils.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b29dc2613a02e871f444d7a919234f8008be6dc
|
4
|
+
data.tar.gz: b41f20f54b515e2da0199a14c1564fc1e2a8cdfd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
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.
|
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-
|
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
|