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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bc44a86277d8d09adfcb068debfac85413c392e9
4
- data.tar.gz: 78e8cb1238eeb0f9d93112d1ab85e7d5a37c379e
3
+ metadata.gz: 5c137d928413251dd625fb879bb9fadceaec8b67
4
+ data.tar.gz: 94760987d06167ca471708e592e27fb0163704b8
5
5
  SHA512:
6
- metadata.gz: dcd381aa25a45a123399c6511525f58647a5587b5d721029e196576c82a7f7067971550af4607ab22e5ee7f9b6318905d8a3e9c81f80683f1212a1803273d66c
7
- data.tar.gz: a0e0bb3e72d821c844bd3aa8e04ac19229eb7df2594631d4370005f32c7f77d5933879c6476dae3588b41cf02a484ff974947183729d986712c46d775d586496
6
+ metadata.gz: 3d7e6457d9cfaa4bce356fbf282fea7c5467628d5766d3d1f6044059807dcd2f608605d1e8c60ce76e0ece3ce85a548056ae3c2e5cfb56613dc19078b4f47305
7
+ data.tar.gz: fa2dee968425d4eb53f57a9bd6d7f27d24a157c0dd932ad7bb69883293a380574c22cf5ad08656f1f3262fe917d09cc113d2c78433d7f43e56c9dae103fa6d33
data/Dockerfile ADDED
@@ -0,0 +1,9 @@
1
+ FROM ruby:2.4
2
+
3
+ RUN gem i bundler --no-doc
4
+ RUN mkdir -p /kumonos/lib/kumonos
5
+ COPY lib/kumonos/version.rb /kumonos/lib/kumonos/
6
+ COPY Gemfile Gemfile.lock kumonos.gemspec /kumonos/
7
+ WORKDIR /kumonos
8
+ RUN bundle install
9
+ COPY . /kumonos
data/example/envoy.json CHANGED
@@ -23,7 +23,7 @@
23
23
  "lb_type": "round_robin",
24
24
  "hosts": [
25
25
  {
26
- "url": "tcp://socat:2000"
26
+ "url": "tcp://relay:2000"
27
27
  }
28
28
  ]
29
29
  },
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'
@@ -1,3 +1,3 @@
1
1
  module Kumonos
2
- VERSION = '0.6.0'.freeze
2
+ VERSION = '0.7.0'.freeze
3
3
  end
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.6.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-09 00:00:00.000000000 Z
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.6.13
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".