lhc 6.5.0 → 6.6.0.zipkin.pre
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 +4 -4
- data/README.md +7 -2
- data/docs/interceptors.md +1 -1
- data/docs/interceptors/caching.md +7 -0
- data/docs/interceptors/prometheus.md +18 -0
- data/lhc.gemspec +1 -0
- data/lib/lhc.rb +2 -0
- data/lib/lhc/interceptors/prometheus.rb +38 -0
- data/lib/lhc/interceptors/zipkin.rb +11 -0
- data/lib/lhc/response.rb +7 -2
- data/lib/lhc/version.rb +1 -1
- data/spec/interceptors/prometheus_spec.rb +49 -0
- data/spec/response/time_spec.rb +6 -1
- metadata +24 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ec061c1dd54c6c48e6d3053eeaa5cfde466cbf9
|
4
|
+
data.tar.gz: 9b01c8475dd3c7002f4fb7f1a23c1e2eb5711566
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3332b1305c96357cb69617ae27945b2a09f1621a5733e96d8366d4d07dbebf35fe428937e1e5ca34567f3a3007ff7ae649302afd946f37b7b77138933ec84637
|
7
|
+
data.tar.gz: bbbebb1d677c39e8f875b25bc494833043cacfa7b15013928153678f10ebf9d0b7dcf0083e12087ba5775c58da98870bd9f8f096970fab65a9057b7ea413c3f4
|
data/README.md
CHANGED
@@ -106,7 +106,7 @@ You can configure global endpoints, placeholders and interceptors.
|
|
106
106
|
LHC.configure do |c|
|
107
107
|
c.placeholder :datastore, 'http://datastore/v2'
|
108
108
|
c.endpoint :feedbacks, ':datastore/feedbacks', params: { has_reviews: true }
|
109
|
-
c.interceptors = [
|
109
|
+
c.interceptors = [LHC::Caching]
|
110
110
|
end
|
111
111
|
```
|
112
112
|
|
@@ -185,7 +185,12 @@ To monitor and manipulate the http communication done with LHC, you can define i
|
|
185
185
|
→ [Read more about interceptors](docs/interceptors.md)
|
186
186
|
|
187
187
|
A set of core interceptors is part of LHC,
|
188
|
-
like
|
188
|
+
like
|
189
|
+
[Caching](/docs/interceptors/caching.md),
|
190
|
+
[Monitoring](/docs/interceptors/monitoring.md),
|
191
|
+
[Authentication](/docs/interceptors/authentication.md),
|
192
|
+
[Rollbar](/docs/interceptors/rollbar.md),
|
193
|
+
[Prometheus](/docs/interceptors/prometheus.md).
|
189
194
|
|
190
195
|
→ [Read more about core interceptors](docs/interceptors.md#core-interceptors)
|
191
196
|
|
data/docs/interceptors.md
CHANGED
@@ -67,7 +67,7 @@ Inside an interceptor, you are able to provide a response, rather then doing a r
|
|
67
67
|
This is usefull for implementing an interceptor for caching.
|
68
68
|
|
69
69
|
```ruby
|
70
|
-
class
|
70
|
+
class LHC::Cache < LHC::Interceptor
|
71
71
|
|
72
72
|
def before_request(request)
|
73
73
|
cached_response = Rails.cache.fetch(request.url)
|
@@ -34,6 +34,13 @@ Only GET requests are cached by default. If you want to cache any other request
|
|
34
34
|
LHC.get('http://local.ch', cache: { methods: [:get] })
|
35
35
|
```
|
36
36
|
|
37
|
+
Responses served from cache are marked as served from cache:
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
response = LHC.get('http://local.ch', cache: true)
|
41
|
+
response.from_cache? # true
|
42
|
+
```
|
43
|
+
|
37
44
|
## Options
|
38
45
|
|
39
46
|
```ruby
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Prometheus Interceptor
|
2
|
+
|
3
|
+
Logs basic request/response information to prometheus.
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
require 'prometheus/client'
|
7
|
+
LHC::Prometheus.client = Prometheus::Client
|
8
|
+
LHC::Prometheus.namespace = 'web_location_app'
|
9
|
+
LHC.config.interceptors = [LHC::Prometheus]
|
10
|
+
```
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
LHC.get('http://local.ch')
|
14
|
+
```
|
15
|
+
|
16
|
+
- Creates a promethues counter that receives additional meta information for: `:code`, `:success` and `:timeout`.
|
17
|
+
|
18
|
+
- Creates a promethues histogram for response times in milliseconds.
|
data/lhc.gemspec
CHANGED
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
s.add_development_dependency 'pry'
|
31
31
|
s.add_development_dependency 'rubocop', '~> 0.36.0'
|
32
32
|
s.add_development_dependency 'rubocop-rspec'
|
33
|
+
s.add_development_dependency 'prometheus-client', '~> 0.7.1'
|
33
34
|
|
34
35
|
s.license = 'GPL-3'
|
35
36
|
end
|
data/lib/lhc.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
class LHC::Prometheus < LHC::Interceptor
|
2
|
+
include ActiveSupport::Configurable
|
3
|
+
|
4
|
+
config_accessor :client, :namespace
|
5
|
+
|
6
|
+
class << self
|
7
|
+
attr_accessor :registered
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.request_key
|
11
|
+
[LHC::Prometheus.namespace, 'lhc_requests'].join('_').to_sym
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.times_key
|
15
|
+
[LHC::Prometheus.namespace, 'lhc_times'].join('_').to_sym
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
return if LHC::Prometheus.registered || LHC::Prometheus.client.blank?
|
20
|
+
LHC::Prometheus.client.registry.counter(LHC::Prometheus.request_key, 'Counter of all LHC requests.')
|
21
|
+
LHC::Prometheus.client.registry.histogram(LHC::Prometheus.times_key, 'Times for all LHC requests.')
|
22
|
+
LHC::Prometheus.registered = true
|
23
|
+
end
|
24
|
+
|
25
|
+
def after_response(response)
|
26
|
+
return if !LHC::Prometheus.registered || LHC::Prometheus.client.blank?
|
27
|
+
LHC::Prometheus.client.registry
|
28
|
+
.get(LHC::Prometheus.request_key)
|
29
|
+
.increment(
|
30
|
+
code: response.code,
|
31
|
+
success: response.success?,
|
32
|
+
timeout: response.timeout?
|
33
|
+
)
|
34
|
+
LHC::Prometheus.client.registry
|
35
|
+
.get(LHC::Prometheus.times_key)
|
36
|
+
.observe({}, response.time_ms)
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class LHC::Zipkin < LHC::Interceptor
|
2
|
+
|
3
|
+
def before_request(request)
|
4
|
+
return unless defined?(ZipkinTracer::TraceContainer)
|
5
|
+
container = ZipkinTracer::TraceContainer.current
|
6
|
+
request.headers['X-B3-TraceId'] = container.trace_id.to_s
|
7
|
+
request.headers['X-B3-ParentSpanId'] = container.parent_id.to_s if container.parent_id
|
8
|
+
request.headers['X-B3-Sampled'] = container.sampled
|
9
|
+
request.headers['X-B3-Flags'] = container.flags
|
10
|
+
end
|
11
|
+
end
|
data/lib/lhc/response.rb
CHANGED
@@ -32,9 +32,14 @@ class LHC::Response
|
|
32
32
|
body_replacement || raw.body.presence
|
33
33
|
end
|
34
34
|
|
35
|
-
# Provides response time in
|
35
|
+
# Provides response time in seconds
|
36
36
|
def time
|
37
|
-
|
37
|
+
time_ms * 1000
|
38
|
+
end
|
39
|
+
|
40
|
+
# Provides response time in milliseconds
|
41
|
+
def time_ms
|
42
|
+
raw.time || 0
|
38
43
|
end
|
39
44
|
|
40
45
|
def timeout?
|
data/lib/lhc/version.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
require 'prometheus/client'
|
3
|
+
|
4
|
+
describe LHC::Prometheus do
|
5
|
+
before(:each) do
|
6
|
+
LHC.config.interceptors = [LHC::Prometheus]
|
7
|
+
LHC::Prometheus.client = Prometheus::Client
|
8
|
+
LHC::Prometheus.namespace = 'test_app'
|
9
|
+
stub_request(:get, 'http://local.ch')
|
10
|
+
expect(Prometheus::Client).to receive(:registry).and_call_original.at_least(:once)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:client) { double("prometheus/client") }
|
14
|
+
|
15
|
+
context 'registering' do
|
16
|
+
it 'creates a counter and histogram registry in the prometheus client' do
|
17
|
+
expect(Prometheus::Client.registry).to receive(:counter).and_call_original.once
|
18
|
+
.with(:test_app_lhc_requests, 'Counter of all LHC requests.')
|
19
|
+
expect(Prometheus::Client.registry).to receive(:histogram).and_call_original.once
|
20
|
+
.with(:test_app_lhc_times, 'Times for all LHC requests.')
|
21
|
+
|
22
|
+
LHC.get('http://local.ch')
|
23
|
+
LHC.get('http://local.ch') # second request, registration should happen only once
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'logging' do
|
28
|
+
let(:requests_registry_double) { double('requests_registry_double') }
|
29
|
+
let(:times_registry_double) { double('times_registry_double') }
|
30
|
+
|
31
|
+
it 'logs monitoring information to the created registries' do
|
32
|
+
expect(Prometheus::Client.registry).to receive(:get).and_return(requests_registry_double).once
|
33
|
+
.with(:test_app_lhc_requests)
|
34
|
+
expect(Prometheus::Client.registry).to receive(:get).and_return(times_registry_double).once
|
35
|
+
.with(:test_app_lhc_times)
|
36
|
+
|
37
|
+
expect(requests_registry_double).to receive(:increment).once
|
38
|
+
.with(
|
39
|
+
code: 200,
|
40
|
+
success: true,
|
41
|
+
timeout: false
|
42
|
+
)
|
43
|
+
expect(times_registry_double).to receive(:observe).once
|
44
|
+
.with({}, 0)
|
45
|
+
|
46
|
+
LHC.get('http://local.ch')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/spec/response/time_spec.rb
CHANGED
@@ -6,9 +6,14 @@ describe LHC::Response do
|
|
6
6
|
|
7
7
|
let(:raw_response) { OpenStruct.new(time: time) }
|
8
8
|
|
9
|
-
it 'provides response time in
|
9
|
+
it 'provides response time in seconds' do
|
10
10
|
response = LHC::Response.new(raw_response, nil)
|
11
11
|
expect(response.time).to eq time * 1000
|
12
12
|
end
|
13
|
+
|
14
|
+
it 'provides response time in seconds' do
|
15
|
+
response = LHC::Response.new(raw_response, nil)
|
16
|
+
expect(response.time_ms).to eq time
|
17
|
+
end
|
13
18
|
end
|
14
19
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lhc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.6.0.zipkin.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- https://github.com/local-ch/lhc/contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: typhoeus
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: prometheus-client
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.7.1
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.7.1
|
139
153
|
description: 'Rails gem for HTTP: Wraps typhoeus and provides additional features
|
140
154
|
(like interceptors)'
|
141
155
|
email:
|
@@ -167,6 +181,7 @@ files:
|
|
167
181
|
- docs/interceptors/authentication.md
|
168
182
|
- docs/interceptors/caching.md
|
169
183
|
- docs/interceptors/monitoring.md
|
184
|
+
- docs/interceptors/prometheus.md
|
170
185
|
- docs/interceptors/rollbar.md
|
171
186
|
- docs/request.md
|
172
187
|
- docs/response.md
|
@@ -190,7 +205,9 @@ files:
|
|
190
205
|
- lib/lhc/interceptors/auth.rb
|
191
206
|
- lib/lhc/interceptors/caching.rb
|
192
207
|
- lib/lhc/interceptors/monitoring.rb
|
208
|
+
- lib/lhc/interceptors/prometheus.rb
|
193
209
|
- lib/lhc/interceptors/rollbar.rb
|
210
|
+
- lib/lhc/interceptors/zipkin.rb
|
194
211
|
- lib/lhc/railtie.rb
|
195
212
|
- lib/lhc/request.rb
|
196
213
|
- lib/lhc/response.rb
|
@@ -274,6 +291,7 @@ files:
|
|
274
291
|
- spec/interceptors/default_interceptors_spec.rb
|
275
292
|
- spec/interceptors/define_spec.rb
|
276
293
|
- spec/interceptors/monitoring/main_spec.rb
|
294
|
+
- spec/interceptors/prometheus_spec.rb
|
277
295
|
- spec/interceptors/response_competition_spec.rb
|
278
296
|
- spec/interceptors/return_response_spec.rb
|
279
297
|
- spec/interceptors/rollbar/main_spec.rb
|
@@ -318,13 +336,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
318
336
|
version: 2.0.0
|
319
337
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
320
338
|
requirements:
|
321
|
-
- - "
|
339
|
+
- - ">"
|
322
340
|
- !ruby/object:Gem::Version
|
323
|
-
version:
|
341
|
+
version: 1.3.1
|
324
342
|
requirements:
|
325
343
|
- Ruby >= 2.0.0
|
326
344
|
rubyforge_project:
|
327
|
-
rubygems_version: 2.6.
|
345
|
+
rubygems_version: 2.6.8
|
328
346
|
signing_key:
|
329
347
|
specification_version: 4
|
330
348
|
summary: LocalHttpClient
|
@@ -402,6 +420,7 @@ test_files:
|
|
402
420
|
- spec/interceptors/default_interceptors_spec.rb
|
403
421
|
- spec/interceptors/define_spec.rb
|
404
422
|
- spec/interceptors/monitoring/main_spec.rb
|
423
|
+
- spec/interceptors/prometheus_spec.rb
|
405
424
|
- spec/interceptors/response_competition_spec.rb
|
406
425
|
- spec/interceptors/return_response_spec.rb
|
407
426
|
- spec/interceptors/rollbar/main_spec.rb
|