kumonos 0.6.0 → 0.7.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/Dockerfile +9 -0
- data/example/envoy.json +1 -1
- data/exe/kumonos-relay +104 -0
- data/kumonos.gemspec +1 -0
- data/lib/kumonos/version.rb +1 -1
- metadata +20 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c137d928413251dd625fb879bb9fadceaec8b67
|
4
|
+
data.tar.gz: 94760987d06167ca471708e592e27fb0163704b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d7e6457d9cfaa4bce356fbf282fea7c5467628d5766d3d1f6044059807dcd2f608605d1e8c60ce76e0ece3ce85a548056ae3c2e5cfb56613dc19078b4f47305
|
7
|
+
data.tar.gz: fa2dee968425d4eb53f57a9bd6d7f27d24a157c0dd932ad7bb69883293a380574c22cf5ad08656f1f3262fe917d09cc113d2c78433d7f43e56c9dae103fa6d33
|
data/Dockerfile
ADDED
data/example/envoy.json
CHANGED
data/exe/kumonos-relay
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'socket'
|
4
|
+
require 'logger'
|
5
|
+
|
6
|
+
# Convert metric name
|
7
|
+
class StatConvertor
|
8
|
+
def initialize(options)
|
9
|
+
@options = options
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(line)
|
13
|
+
convert_cluster(add_default_tag(line)) + "\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
# envoy.cluster.ab-testing.external.upstream_rq_200
|
19
|
+
PATTERN = /\Aenvoy\.cluster\.([^.]+)\./
|
20
|
+
def convert_cluster(line)
|
21
|
+
if line.match(PATTERN)
|
22
|
+
name = Regexp.last_match(1)
|
23
|
+
[
|
24
|
+
line.gsub(PATTERN, 'envoy.cluster.'),
|
25
|
+
",cluster:#{name}"
|
26
|
+
].join
|
27
|
+
else
|
28
|
+
line
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_default_tag(line)
|
33
|
+
[
|
34
|
+
"#{line.chomp}|#",
|
35
|
+
"service-cluster:#{@options[:service_cluster]},",
|
36
|
+
"service-node:#{@options[:service_node]},",
|
37
|
+
"host:#{@options[:host]}"
|
38
|
+
].join
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
logger = Logger.new($stderr)
|
43
|
+
|
44
|
+
options = {
|
45
|
+
service_cluster: '',
|
46
|
+
service_node: '',
|
47
|
+
host: Socket.gethostname
|
48
|
+
}
|
49
|
+
parser = OptionParser.new do |opts|
|
50
|
+
opts.banner = "Usage: #{__FILE__} [options] bind_address:port remote_address:port"
|
51
|
+
|
52
|
+
opts.on('--service-cluster=VAL (required)') { |v| options[:service_cluster] = v }
|
53
|
+
opts.on('--service-node=VAL (required)') { |v| options[:service_node] = v }
|
54
|
+
opts.on('--host=VAL') { |v| options[:host] = v }
|
55
|
+
end
|
56
|
+
|
57
|
+
argv = parser.parse(ARGV)
|
58
|
+
|
59
|
+
if argv.size != 2
|
60
|
+
warn parser.help
|
61
|
+
exit 1
|
62
|
+
end
|
63
|
+
if options[:service_cluster].empty? || options[:service_node].empty?
|
64
|
+
warn '--service-cluster and --service-node are required'
|
65
|
+
warn parser.help
|
66
|
+
exit 1
|
67
|
+
end
|
68
|
+
|
69
|
+
convertor = StatConvertor.new(options)
|
70
|
+
|
71
|
+
bind_option = argv.shift
|
72
|
+
remote_option = argv.shift
|
73
|
+
|
74
|
+
source_ip, source_port = *bind_option.split(':')
|
75
|
+
unless source_ip && source_port
|
76
|
+
warn "Invalid bind option given: #{bind_option}"
|
77
|
+
exit 1
|
78
|
+
end
|
79
|
+
|
80
|
+
remote_ip, remote_port = *remote_option.split(':')
|
81
|
+
unless remote_ip && remote_port
|
82
|
+
warn "Invalid remote option given: #{remote_option}"
|
83
|
+
exit 1
|
84
|
+
end
|
85
|
+
|
86
|
+
Thread.abort_on_exception = true
|
87
|
+
logger.info("Starting relay: source=#{bind_option} remote=#{remote_option}")
|
88
|
+
source = TCPServer.open(source_ip, source_port)
|
89
|
+
|
90
|
+
loop do
|
91
|
+
Thread.start(source.accept) do |s|
|
92
|
+
while (body = s.gets)
|
93
|
+
logger.info("recieved #{body.bytesize} bytes")
|
94
|
+
logger.debug(body)
|
95
|
+
next if body.empty?
|
96
|
+
|
97
|
+
b = convertor.call(body)
|
98
|
+
UDPSocket.new.send(b, Socket::MSG_DONTWAIT, remote_ip, remote_port)
|
99
|
+
logger.info("write #{b.bytesize} bytes")
|
100
|
+
logger.debug(b)
|
101
|
+
end
|
102
|
+
s.close
|
103
|
+
end
|
104
|
+
end
|
data/kumonos.gemspec
CHANGED
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_dependency 'thor'
|
25
25
|
spec.add_development_dependency 'bundler'
|
26
26
|
spec.add_development_dependency 'pry'
|
27
|
+
spec.add_development_dependency 'rack'
|
27
28
|
spec.add_development_dependency 'rake'
|
28
29
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
29
30
|
spec.add_development_dependency 'rspec-json_matcher'
|
data/lib/kumonos/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kumonos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taiki Ono
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json-schema
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rack
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rake
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -127,6 +141,7 @@ email:
|
|
127
141
|
- taiks.4559@gmail.com
|
128
142
|
executables:
|
129
143
|
- kumonos
|
144
|
+
- kumonos-relay
|
130
145
|
extensions: []
|
131
146
|
extra_rdoc_files: []
|
132
147
|
files:
|
@@ -135,6 +150,7 @@ files:
|
|
135
150
|
- ".rubocop.yml"
|
136
151
|
- ".travis.yml"
|
137
152
|
- DEVELOPMENT.md
|
153
|
+
- Dockerfile
|
138
154
|
- Gemfile
|
139
155
|
- LICENSE.txt
|
140
156
|
- README.md
|
@@ -146,6 +162,7 @@ files:
|
|
146
162
|
- example/envoy.json
|
147
163
|
- example/example-with-tls.yml
|
148
164
|
- exe/kumonos
|
165
|
+
- exe/kumonos-relay
|
149
166
|
- kumonos.gemspec
|
150
167
|
- lib/kumonos.rb
|
151
168
|
- lib/kumonos/clusters.rb
|
@@ -177,7 +194,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
194
|
version: '0'
|
178
195
|
requirements: []
|
179
196
|
rubyforge_project:
|
180
|
-
rubygems_version: 2.
|
197
|
+
rubygems_version: 2.5.2.1
|
181
198
|
signing_key:
|
182
199
|
specification_version: 4
|
183
200
|
summary: A "control plane" for Microservices "service mesh".
|