consul-templaterb 1.27.0 → 1.28.2

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.
@@ -1,5 +1,5 @@
1
1
  module Consul
2
2
  module Async
3
- VERSION = '1.27.0'.freeze
3
+ VERSION = '1.28.2'.freeze
4
4
  end
5
5
  end
@@ -15,6 +15,10 @@
15
15
  content: '⚠ ';
16
16
  }
17
17
 
18
+ .btn-outline-success a:hover, .btn-outline-warning a:hover, .btn-outline-danger a:hover{
19
+ color: #fff;
20
+ }
21
+
18
22
  #service-wrapper, #instances-wrapper, #keys-wrapper {
19
23
  overflow-y: scroll;
20
24
  border-top-left-radius: 0px;
@@ -36,6 +36,13 @@ function usefullLinksGenerator(instance, serviceName, node_meta_info) {
36
36
  return top;
37
37
  }
38
38
 
39
+ /**
40
+ * createNodeDisplayElement resolves and displays the node name.
41
+ */
42
+ function createNodeDisplayElement(nodeName, nodemeta) {
43
+ return document.createTextNode(nodeName);
44
+ }
45
+
39
46
  /**
40
47
  * serviceInstanceDecorator is called to decorate an instance.
41
48
  */
@@ -71,7 +71,7 @@ class NodeMainSelector extends MainSelector {
71
71
  content.setAttribute('class', 'instance-content');
72
72
  var contentHead = document.createElement('div');
73
73
  contentHead.setAttribute('class', 'instance-content-header');
74
- contentHead.appendChild(nodeNameGenator(node['Node']['Name'], node['Node']['Address']));
74
+ contentHead.appendChild(nodeNameGenator(node['Node']));
75
75
  contentHead.appendChild(nodeAddressGenator(node['Node']['Address']));
76
76
  contentHead.appendChild(nodeMetaGenerator(node['Node']['Meta']));
77
77
  content.appendChild(contentHead);
@@ -111,7 +111,7 @@ class NodeMainSelector extends MainSelector {
111
111
  nodesChecks.appendChild(checksStatusGenerator(node, node['Node']['Name']));
112
112
  content.appendChild(nodesChecks);
113
113
 
114
- content.appendChild(servicesGenerator(node['Service']));
114
+ content.appendChild(servicesGenerator(node['Service'], node));
115
115
  content.appendChild(tagsGenerator(getTagsNode(node)));
116
116
 
117
117
  sidebar.setAttribute('status', state);
@@ -304,8 +304,8 @@ class ServiceMainSelector extends MainSelector {
304
304
  element.setAttribute("class", "list-group-item service-instance");
305
305
  var state = nodeState(instance.checks);
306
306
  element.appendChild(weightsGenerator(instance.weights, state));
307
- element.appendChild(serviceTitleGenerator(instance));
308
307
  var node_info = this.nodes[instance.name];
308
+ element.appendChild(serviceTitleGenerator(instance, serviceName, node_info));
309
309
  if (node_info != null) {
310
310
  node_info = node_info.meta;
311
311
  element.appendChild(nodeMetaGenerator(node_info, instance.sMeta));
@@ -63,7 +63,7 @@ function nodeState(checks) {
63
63
 
64
64
  supported_protocols = ['https', 'http', 'sftp', 'ftp', 'ssh', 'telnet']
65
65
 
66
- function serviceTitleGenerator(instance) {
66
+ function serviceTitleGenerator(instance, serviceName, node_info) {
67
67
  var protocol = null;
68
68
  for (i in supported_protocols) {
69
69
  var protoc = supported_protocols[i]
@@ -74,10 +74,6 @@ function serviceTitleGenerator(instance) {
74
74
  }
75
75
 
76
76
  var htmlTitle = document.createElement('h5');
77
- htmlTitle.setAttribute('title', 'Node Name: ' + instance.name +
78
- '\nAddress: ' + instance.addr +
79
- '\nService ID: ' + instance.id +
80
- '\nService Port: ' + instance.port);
81
77
 
82
78
  htmlTitle.setAttribute('class', 'instance-name');
83
79
  var instanceLink = document.createElement('a');
@@ -90,7 +86,19 @@ function serviceTitleGenerator(instance) {
90
86
  instanceLink.setAttribute('target', '_blank');
91
87
  }
92
88
 
93
- instanceLink.appendChild(document.createTextNode(instance.name + appendPort));
89
+ var nodemeta = (node_info != null) ? node_info.meta : null;
90
+ instanceLink.appendChild(createNodeDisplayElement(instance.name, nodemeta));
91
+ instanceLink.appendChild(document.createTextNode(appendPort));
92
+
93
+ const nodeInfo = document.createElement('a');
94
+ nodeInfo.appendChild(document.createTextNode('\u24D8'));
95
+ nodeInfo.setAttribute('title', 'Click to see details of Node: ' + instance.name +
96
+ '\nAddress: ' + instance.addr +
97
+ '\nService ID: ' + instance.id +
98
+ '\nService Port: ' + instance.port);
99
+ nodeInfo.setAttribute('href', 'consul-nodes-ui.html?node_filter=^' + encodeURIComponent(instance.name) + '$');
100
+ htmlTitle.appendChild(nodeInfo);
101
+ htmlTitle.appendChild(document.createTextNode(' '));
94
102
  htmlTitle.appendChild(instanceLink);
95
103
  htmlTitle.appendChild(document.createTextNode(' '));
96
104
  htmlTitle.appendChild(document.createTextNode(instance.addr));
@@ -98,7 +106,7 @@ function serviceTitleGenerator(instance) {
98
106
  return htmlTitle;
99
107
  }
100
108
 
101
- function nodeNameGenator(nodename, nodeaddr) {
109
+ function nodeNameGenator(node) {
102
110
  var protocol = 'ssh://'
103
111
 
104
112
  var htmlTitle = document.createElement('h5');
@@ -106,10 +114,10 @@ function nodeNameGenator(nodename, nodeaddr) {
106
114
  var instanceLink = document.createElement('a');
107
115
  instanceLink.setAttribute('class', 'instance-name');
108
116
  if (protocol != null) {
109
- instanceLink.setAttribute('href', protocol + nodeaddr);
117
+ instanceLink.setAttribute('href', protocol + node['Address']);
110
118
  instanceLink.setAttribute('target', '_blank');
111
119
  }
112
- instanceLink.appendChild(document.createTextNode(nodename));
120
+ instanceLink.appendChild(createNodeDisplayElement(node['Name'], node['Meta']));
113
121
  htmlTitle.appendChild(instanceLink);
114
122
 
115
123
  return htmlTitle;
@@ -216,24 +224,44 @@ function toCSSClass(state) {
216
224
  return state;
217
225
  }
218
226
 
219
- function servicesGenerator(instanceServices) {
220
- var services = document.createElement('div');
221
- services.className = 'instance-services';
222
- services.appendChild(document.createTextNode("Services: "));
223
- services.appendChild(document.createElement('br'));
227
+ function servicesGenerator(instanceServices, node) {
228
+ var servicesTop = document.createElement('div');
229
+ servicesTop.className = 'instance-services';
230
+ const card = document.createElement('div');
231
+ card.setAttribute('class', 'card');
232
+ const servicesCard = document.createElement('div');
233
+ servicesCard.setAttribute('class', 'card-body');
234
+ const title = document.createElement('h5');
235
+ title.appendChild(document.createTextNode('Services'));
236
+ title.setAttribute('class', 'card-title')
237
+ servicesCard.appendChild(title);
238
+ const services = document.createElement('div');
239
+ servicesCard.appendChild(services);
224
240
  for (var serviceKey in instanceServices) {
225
- var service = document.createElement('a');
226
- var serviceName = instanceServices[serviceKey]['Service']['Service'];
241
+ const serviceGrp = document.createElement('span');
242
+ serviceGrp.setAttribute('class', 'btn btn-sm');
243
+ serviceGrp.classList.add('btn-outline-' + toCSSClass(nodeState(instanceServices[serviceKey]['Checks'])))
244
+ const service = document.createElement('a');
245
+ serviceGrp.appendChild(service);
246
+ const serviceName = instanceServices[serviceKey]['Service']['Service'];
247
+ service.setAttribute('class', 'serviceLink');
248
+ service.setAttribute('href', 'consul-services-ui.html?service=' + encodeURIComponent(serviceName) + '&node_filter=^' + encodeURIComponent(node['Node']['Name'])+'$');
249
+ service.appendChild(document.createTextNode(serviceName));
227
250
  var servicePort = instanceServices[serviceKey]['Service']['Port'];
228
- service.setAttribute('class', 'btn btn-sm m-1 lookup');
229
- service.setAttribute('target', '_blank');
230
- nodeAddr = instanceServices[serviceKey]['Service']['Address'];
231
- service.setAttribute('href', 'http://' + nodeAddr + ':' + servicePort);
232
- service.classList.add('btn-outline-' + toCSSClass(nodeState(instanceServices[serviceKey]['Checks'])))
233
- service.appendChild(document.createTextNode(serviceName + ':' + servicePort));
234
- services.appendChild(service);
251
+ if (servicePort) {
252
+ // Add unbreakable space
253
+ serviceGrp.appendChild(document.createTextNode('\u00A0'));
254
+ const servicePortElem = document.createElement('a');
255
+ servicePortElem.setAttribute('class', 'serviceTargetPort');
256
+ const nodeAddr = instanceServices[serviceKey]['Service']['Address'];
257
+ servicePortElem.setAttribute('href', 'http://' + nodeAddr + ':' + servicePort);
258
+ servicePortElem.appendChild(document.createTextNode(':' + servicePort));
259
+ serviceGrp.appendChild(servicePortElem);
260
+ }
261
+ services.appendChild(serviceGrp);
235
262
  }
236
- return services;
263
+ servicesTop.appendChild(servicesCard);
264
+ return servicesTop;
237
265
  }
238
266
 
239
267
  function checksStatusGenerator(instance, prefix) {
@@ -0,0 +1,56 @@
1
+ # HELP consul_wan_servers_rtt_seconds Min Round trip with other servers of DC
2
+ # TYPE consul_wan_servers_rtt_seconds gauge
3
+ <%
4
+ # This computes the RTT over WAN for all DCs
5
+ results = {'min' => {}, 'max' => {}, 'p50' => {}, 'p90' => {}}
6
+ my_dcname = (agent_self['Config'] || {})['Datacenter']
7
+ my_dc = coordinate.datacenters.select { |d| d['Datacenter'] == my_dcname }.first
8
+
9
+ def percentile(values_sorted, percentile)
10
+ k = (percentile*(values_sorted.length-1)+1).floor - 1
11
+ f = (percentile*(values_sorted.length-1)+1).modulo(1)
12
+ return values_sorted[k] + (f * (values_sorted[k+1] - values_sorted[k]))
13
+ end
14
+
15
+ if my_dc
16
+ from = my_dc['Datacenter']
17
+ coordinate.datacenters.each do |dc_coords|
18
+ min = Float::MAX
19
+ max = 0
20
+ rtts = []
21
+ dc_coords['Coordinates'].each do |s2|
22
+ my_dc['Coordinates'].each do |s1|
23
+ rtt = coordinate.rtt(s1['Coord'], s2['Coord'])
24
+ min = rtt if rtt < min
25
+ max = rtt if rtt > max
26
+ idx = rtts.bsearch_index { |x| x > rtt }
27
+ if idx.nil?
28
+ rtts << rtt
29
+ else
30
+ rtts = rtts.insert(idx, rtt)
31
+ end
32
+ %>
33
+ consul_wan_servers_rtt_seconds{from="<%= from %>",to="<%= dc_coords['Datacenter'] %>",from_node="<%= s1['Node'] %>",to_node="<%= s2['Node'] %>"} <%= rtt.round(3) %><%
34
+ end
35
+ end
36
+ results['min'][dc_coords['Datacenter']] = min
37
+ results['max'][dc_coords['Datacenter']] = max
38
+ results['p50'][dc_coords['Datacenter']] = percentile(rtts, 0.5)
39
+ results['p90'][dc_coords['Datacenter']] = percentile(rtts, 0.9)
40
+ end
41
+
42
+ # Now, we iterate over aggregated results, type is min, max...
43
+ results.each do |type, res_type|
44
+ %>
45
+
46
+ # HELP consul_wan_dc_<%= type %>_seconds <%= type %> round trip with other DCs
47
+ # TYPE consul_wan_dc_<%= type %>_seconds gauge
48
+ <%
49
+ # Iterate over destinations
50
+ res_type.each do |dst, val|
51
+ %>consul_wan_dc_<%= type %>_seconds{from="<%= my_dcname %>",to="<%= dst %>"} <%= val.round(3) %>
52
+ <%
53
+ end
54
+ end
55
+ end
56
+ %>
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: consul-templaterb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.27.0
4
+ version: 1.28.2
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: 2020-06-05 00:00:00.000000000 Z
11
+ date: 2020-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: em-http-request
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.1.5
19
+ version: '1.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.1.5
26
+ version: '1.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: eventmachine
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.2.7
33
+ version: '1.2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.2.7
40
+ version: '1.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: parallel
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.2.7
47
+ version: '1.2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.2.7
54
+ version: '1.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 12.3.3
75
+ version: '12.3'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 12.3.3
82
+ version: '12.3'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -98,58 +98,58 @@ dependencies:
98
98
  name: rspec_junit_formatter
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
103
+ version: 0.4.1
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0'
110
+ version: 0.4.1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rubocop
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '='
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
117
  version: 0.80.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '='
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: 0.80.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rubocop-junit-formatter
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ">="
129
+ - - '='
130
130
  - !ruby/object:Gem::Version
131
- version: '0'
131
+ version: 0.1.4
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ">="
136
+ - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: '0'
138
+ version: 0.1.4
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: webmock
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ">="
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '0'
145
+ version: '2.1'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ">="
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '0'
152
+ version: '2.1'
153
153
  description: A ruby implementation of Consul Template with support of erb templating
154
154
  with hi-performance on large clusters and advanced process management features.
155
155
  email:
@@ -162,28 +162,10 @@ extra_rdoc_files:
162
162
  - CHANGELOG.md
163
163
  - TemplateAPI.md
164
164
  files:
165
- - ".gitignore"
166
- - ".rspec"
167
- - ".rubocop.yml"
168
- - ".ruby_app"
169
- - ".travis.yml"
170
165
  - CHANGELOG.md
171
- - CODE_OF_CONDUCT.md
172
- - CONTRIBUTING.md
173
- - Dockerfile
174
- - Gemfile
175
- - INTERNALS.md
176
- - LICENSE.txt
177
166
  - README.md
178
- - Rakefile
179
167
  - TemplateAPI.md
180
168
  - bin/consul-templaterb
181
- - consul-templaterb.gemspec
182
- - docker-nginx-conf/nginx.conf
183
- - docs/article-06_Template-based_discovery_with_consul-templaterb.md
184
- - docs/images/consul-templaterb.png
185
- - docs/images/consul-templaterb.svg
186
- - docs/images/consul-ui_001.png
187
169
  - lib/consul/async/consul_endpoint.rb
188
170
  - lib/consul/async/consul_template.rb
189
171
  - lib/consul/async/consul_template_engine.rb
@@ -242,6 +224,7 @@ files:
242
224
  - samples/members.json.erb
243
225
  - samples/metrics.erb
244
226
  - samples/prometheus_consul_coordinates.erb
227
+ - samples/prometheus_datacenter_coordinates.erb
245
228
  - samples/render_template_from_kv.erb
246
229
  - samples/sample_keys.html.erb
247
230
  - samples/service_checks_metrics.erb
@@ -251,7 +234,7 @@ files:
251
234
  - samples/vault-ldap.txt.erb
252
235
  homepage: https://rubygems.org/gems/consul-templaterb
253
236
  licenses:
254
- - Apache v2
237
+ - Apache-2.0
255
238
  metadata:
256
239
  bug_tracker_uri: https://github.com/criteo/consul-templaterb/issues
257
240
  changelog_uri: https://github.com/criteo/consul-templaterb/blob/master/CHANGELOG.md
@@ -272,8 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
272
255
  - !ruby/object:Gem::Version
273
256
  version: '0'
274
257
  requirements: []
275
- rubyforge_project:
276
- rubygems_version: 2.7.7
258
+ rubygems_version: 3.0.8
277
259
  signing_key:
278
260
  specification_version: 4
279
261
  summary: Implementation of Consul template using Ruby and .erb templating language