consul-templaterb 1.28.2 → 1.32.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 +4 -4
- data/CHANGELOG.md +35 -1
- data/bin/consul-templaterb +5 -0
- data/lib/consul/async/consul_endpoint.rb +28 -2
- data/lib/consul/async/vault_endpoint.rb +1 -1
- data/lib/consul/async/version.rb +1 -1
- data/samples/consul-ui/.preferences.rb.samples +1 -0
- data/samples/consul-ui/README.md +6 -0
- data/samples/consul-ui/consul_services.json.erb +14 -1
- data/samples/consul-ui/js/timeline.js +1 -1
- data/samples/consul-ui/timeline.json.erb +4 -2
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 802bc9946fe5828724eff84a9564b5ec8313a5f6d795f1abb1c0dcafca94a268
|
|
4
|
+
data.tar.gz: fa0acac3ecf2d94000eb909d0001294552931e34c44ee8492d51081bd23806f0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 801abf727fd2f3c5db209244c5d7da533e27ff3985ac82c1c234e86f8bf70ce5f6a99bb608ca01d1d07b814d019b2f19010a7a8cbd6d7a4b5531b2345c50c280
|
|
7
|
+
data.tar.gz: 7ec7df66f3bfc071ba4fa8e6414006e9551e6ac34503c45a725b628f9891602185cae8ba69fecde220dbde25ab2dd8576c30e2158d96c303c7bb79ea7124984c
|
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
-
## (
|
|
3
|
+
## 1.32.0 (Jan 27, 2021)
|
|
4
|
+
|
|
5
|
+
IMPROVEMENTS:
|
|
6
|
+
|
|
7
|
+
* Use Ruby 2.7.2 in Travis build
|
|
8
|
+
* [VAULT] Do not handle missing secret as a blocking exception ([#73](https://github.com/criteo/consul-templaterb/pull/73))
|
|
9
|
+
|
|
10
|
+
## 1.31.1 (Jan 25, 2021)
|
|
11
|
+
|
|
12
|
+
IMPROVEMENTS:
|
|
13
|
+
|
|
14
|
+
* Use Node.Meta.fqdn to display node names in timeline if set
|
|
15
|
+
|
|
16
|
+
## 1.31.0 (Jan 18, 2021)
|
|
17
|
+
|
|
18
|
+
IMPROVEMENTS:
|
|
19
|
+
|
|
20
|
+
* Do not apply penalty on unmodified services not changing much (Will improve streaming performance)
|
|
21
|
+
|
|
22
|
+
## 1.30.0 (Dec 18, 2020)
|
|
23
|
+
|
|
24
|
+
IMPROVEMENTS:
|
|
25
|
+
|
|
26
|
+
* Allow customization to sort nodes in service view in Consul-UI ([#71](https://github.com/criteo/consul-templaterb/pull/71))
|
|
27
|
+
|
|
28
|
+
NEW FEATURES:
|
|
29
|
+
|
|
30
|
+
* Auto-detection of rate-limit on Consul Side (introduced in Consul 1.6.2+), this feature
|
|
31
|
+
will work only Consul 1.9+ (see [Consul #7527](https://github.com/hashicorp/consul/issues/7527)).
|
|
32
|
+
|
|
33
|
+
## 1.29.0 (Oct 6, 2020)
|
|
34
|
+
|
|
35
|
+
IMPROVEMENTS:
|
|
36
|
+
|
|
37
|
+
* When no template has been specified, stop early with an error message
|
|
4
38
|
|
|
5
39
|
## 1.28.2 (Oct 5, 2020)
|
|
6
40
|
|
data/bin/consul-templaterb
CHANGED
|
@@ -375,6 +375,11 @@ ARGV.each do |tpl|
|
|
|
375
375
|
consul_engine.add_template(tpl, dest)
|
|
376
376
|
end
|
|
377
377
|
|
|
378
|
+
if consul_engine.templates.count.zero?
|
|
379
|
+
puts 'You must specify at least one template as arg or using -t'
|
|
380
|
+
exit 255
|
|
381
|
+
end
|
|
382
|
+
|
|
378
383
|
template_manager = Consul::Async::EndPointsManager.new(consul_conf, vault_conf, consul_engine.templates, options[:erb][:trim_mode])
|
|
379
384
|
|
|
380
385
|
Signal.trap('USR1', 'IGNORE') unless Gem.win_platform?
|
|
@@ -225,9 +225,34 @@ module Consul
|
|
|
225
225
|
retry_in / 2 + Consul::Async::Utilities.random.rand(retry_in)
|
|
226
226
|
end
|
|
227
227
|
|
|
228
|
+
# rubocop:disable Style/ClassVars
|
|
229
|
+
def _last_429
|
|
230
|
+
@@_last_429 ||= { count: 0 }
|
|
231
|
+
end
|
|
232
|
+
# rubocop:enable Style/ClassVars
|
|
233
|
+
|
|
228
234
|
def _handle_error(http, consul_index)
|
|
229
235
|
retry_in = _compute_retry_in([600, conf.retry_duration + 2**@consecutive_errors].min)
|
|
230
|
-
|
|
236
|
+
if http.response_header.status == 429
|
|
237
|
+
_last_429
|
|
238
|
+
retry_in = 60 + Consul::Async::Utilities.random.rand(180) if retry_in < 60
|
|
239
|
+
_last_429[:time] = Time.now.utc
|
|
240
|
+
_last_429[:count] += 1
|
|
241
|
+
if (_last_429[:count] % 10) == 1
|
|
242
|
+
if _last_429[:count] == 1
|
|
243
|
+
::Consul::Async::Debug.puts_error "Rate limiting detected on Consul side (HTTP 429)!\n\n" \
|
|
244
|
+
"******************************* CONFIGURATION ISSUE DETECTED *******************************\n" \
|
|
245
|
+
"* Too many simultaneous connections for Consul agent #{conf.base_url}\n" \
|
|
246
|
+
"* You should tune 'limits.http_max_conns_per_client' to a higher value.\n" \
|
|
247
|
+
"* This program will behave badly until you change this.\n" \
|
|
248
|
+
"* See https://www.consul.io/docs/agent/options.html#http_max_conns_per_client for more info\n" \
|
|
249
|
+
"********************************************************************************************\n\n"
|
|
250
|
+
end
|
|
251
|
+
::Consul::Async::Debug.puts_error "[#{path}] Too many conns to #{conf.base_url}, errors=#{_last_429[:count]} - Retry in #{retry_in}s #{stats.body_bytes_human}"
|
|
252
|
+
end
|
|
253
|
+
else
|
|
254
|
+
::Consul::Async::Debug.puts_error "[#{path}] X-Consul-Index:#{consul_index} - #{http.error} - Retry in #{retry_in}s #{stats.body_bytes_human}"
|
|
255
|
+
end
|
|
231
256
|
@consecutive_errors += 1
|
|
232
257
|
http_result = HttpResponse.new(http)
|
|
233
258
|
EventMachine.add_timer(retry_in) do
|
|
@@ -272,11 +297,12 @@ module Consul
|
|
|
272
297
|
end
|
|
273
298
|
new_content = http_result.response.freeze
|
|
274
299
|
modified = @last_result.fake? || @last_result.data != new_content
|
|
275
|
-
if n_consul_index
|
|
300
|
+
if n_consul_index.nil?
|
|
276
301
|
retry_in = modified ? conf.missing_index_retry_time_on_diff : conf.missing_index_retry_time_on_unchanged
|
|
277
302
|
n_consul_index = consul_index
|
|
278
303
|
else
|
|
279
304
|
retry_in = modified ? conf.min_duration : conf.retry_on_non_diff
|
|
305
|
+
retry_in = 0.1 if retry_in < (Time.now - @last_result.last_update)
|
|
280
306
|
end
|
|
281
307
|
retry_in = _compute_retry_in(retry_in)
|
|
282
308
|
retry_in = 0.1 if retry_in < 0.1
|
|
@@ -245,7 +245,7 @@ module Consul
|
|
|
245
245
|
http = connection.send(http_method.downcase, build_request) # Under the hood: c.send('get', {stuff}) === c.get({stuff})
|
|
246
246
|
http.callback do
|
|
247
247
|
http_result = VaultHttpResponse.new(http.dup.freeze, default_value)
|
|
248
|
-
if enforce_json_200 && http.response_header.status
|
|
248
|
+
if enforce_json_200 && ![200, 404].include?(http.response_header.status)
|
|
249
249
|
_handle_error(http_result) { connection = EventMachine::HttpRequest.new(conf.base_url, options) }
|
|
250
250
|
else
|
|
251
251
|
@consecutive_errors = 0
|
data/lib/consul/async/version.rb
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
SORT_CONSUL_SERVICE_NODES = -> (nodes) { nodes.sort {|a,b| a['Node']['Node'] <=> b['Node']['Node'] } }
|
data/samples/consul-ui/README.md
CHANGED
|
@@ -94,3 +94,9 @@ This app supports the following environment variables:
|
|
|
94
94
|
* `EXCLUDE_SERVICES`: comma-separated services to exclude (default: lbl7.*,netsvc-probe.*,consul-probed.*)
|
|
95
95
|
* `CONSUL_TIMELINE_BUFFER`: number of entries to keep in the timeline. 1000 by default.
|
|
96
96
|
* `CONSUL_TIMELINE_BLACKLIST`: regexp of services to hide from timeline
|
|
97
|
+
|
|
98
|
+
### Preferences
|
|
99
|
+
|
|
100
|
+
Some templates allows you to override some behavior through `.preferences.rb` file.
|
|
101
|
+
In order to do that, rename `.preferences.rb.samples` file to `.preferences.rb`
|
|
102
|
+
and update lambda defined inside to match targeted behavior.
|
|
@@ -6,6 +6,19 @@
|
|
|
6
6
|
# INSTANCE_EXCLUDE_TAG: Exclude instances having the given tag (default: canary)
|
|
7
7
|
# EXCLUDE_SERVICES: comma-separated services regexps to exclude (default: lbl7.*,netsvc-probe.*,consul-probed.*)
|
|
8
8
|
|
|
9
|
+
unless @sort_consul_service_nodes
|
|
10
|
+
begin
|
|
11
|
+
target_dir = File.split(File.expand_path(template_info['source']))[0]
|
|
12
|
+
target = File.join(target_dir, '.preferences.rb')
|
|
13
|
+
load "#{target}"
|
|
14
|
+
STDERR.puts "Using #{target} file."
|
|
15
|
+
@sort_consul_service_nodes = SORT_CONSUL_SERVICE_NODES
|
|
16
|
+
rescue LoadError
|
|
17
|
+
STDERR.puts 'Couldn\'t find .preferences.rb file ; default configuration will be used.'
|
|
18
|
+
@sort_consul_service_nodes = -> (nodes) { nodes.sort {|a,b| a['Node']['Node'] <=> b['Node']['Node'] } }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
9
22
|
service_tag_filter = ENV['SERVICES_TAG_FILTER'] || nil
|
|
10
23
|
instance_must_tag = ENV['INSTANCE_MUST_TAG'] || service_tag_filter
|
|
11
24
|
instance_exclude_tag = ENV['INSTANCE_EXCLUDE_TAG']
|
|
@@ -20,7 +33,7 @@
|
|
|
20
33
|
if !services_blacklist.any? {|r| r.match(service_name)} && (instance_must_tag.nil? || tags.include?(instance_must_tag))
|
|
21
34
|
tags_per_service[service_name] = tags.sort
|
|
22
35
|
the_backends = []
|
|
23
|
-
service(service_name).
|
|
36
|
+
@sort_consul_service_nodes.call(service(service_name)).each do |snode|
|
|
24
37
|
tags_of_instance = snode['Service']['Tags'].sort
|
|
25
38
|
if (instance_must_tag.nil? || tags_of_instance.include?(instance_must_tag)) && !tags_of_instance.include?(instance_exclude_tag)
|
|
26
39
|
the_backends << snode if snode['Service']['Port']
|
|
@@ -434,7 +434,7 @@ class ServiceTimeline {
|
|
|
434
434
|
}
|
|
435
435
|
var text = e.instance;
|
|
436
436
|
if (e.instance_info && e.instance_info.node) {
|
|
437
|
-
text = e.instance_info.
|
|
437
|
+
text = e.instance_info.fqdn;
|
|
438
438
|
if (e.instance_info.port > 0) {
|
|
439
439
|
text += ":" + e.instance_info.port
|
|
440
440
|
}
|
|
@@ -41,10 +41,12 @@ cur_state = services.map do |service_name, _tags|
|
|
|
41
41
|
mindex = chk['ModifyIndex'] || 0
|
|
42
42
|
mod_index = mindex if mod_index < mindex
|
|
43
43
|
end
|
|
44
|
-
|
|
44
|
+
node_name = instance['Node']['Node']
|
|
45
|
+
["#{node_name}:#{instance['Service']['ID']}",
|
|
45
46
|
{
|
|
46
47
|
'address' => instance.service_address,
|
|
47
|
-
'node' =>
|
|
48
|
+
'node' => node_name,
|
|
49
|
+
'fqdn' => instance.node_meta['fqdn'] || node_name,
|
|
48
50
|
'port' => instance['Service']['Port'],
|
|
49
51
|
'idx' => mod_index || cur_index,
|
|
50
52
|
'status' => instance.status,
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: consul-templaterb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.32.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- SRE Core Services
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-01-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: em-http-request
|
|
@@ -181,6 +181,7 @@ files:
|
|
|
181
181
|
- samples/all_services_multi_agents.txt.erb
|
|
182
182
|
- samples/all_templates.erb
|
|
183
183
|
- samples/checks_in_warning_or_critical_state.yaml.erb
|
|
184
|
+
- samples/consul-ui/.preferences.rb.samples
|
|
184
185
|
- samples/consul-ui/README.md
|
|
185
186
|
- samples/consul-ui/common/footer.html.erb
|
|
186
187
|
- samples/consul-ui/common/header.html.erb
|