fluent-plugin-nats-streaming 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ece3ab243c73bbed8369ecba506784428edcd086
4
+ data.tar.gz: b087b636a06e1df13d0eaf6eca9eff402045ab68
5
+ SHA512:
6
+ metadata.gz: 2c0925da021d693a45b7c0c73179dc9f810929e943d2db41d6e0c53309183ce18f20e69ce142050b9fe8d7ef0efbf5b2f2e27d94ea36b78f482b9bc63a58d85d
7
+ data.tar.gz: 667899467e6bd0564c7ad015d1d4c6c06f70b792a0cda5cd9785ab89d1e3f52aa6c13d0830e1f1f9b915375a360462f4fd18a384c542585f1c3aefd1cba3ce2a
@@ -0,0 +1,44 @@
1
+ name: Ruby Gem
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - master
7
+ push:
8
+ branches:
9
+ - master
10
+
11
+ jobs:
12
+ build:
13
+ name: Build + Publish
14
+ runs-on: ubuntu-latest
15
+
16
+ steps:
17
+ - uses: actions/checkout@master
18
+ - name: Set up Ruby 2.6
19
+ uses: actions/setup-ruby@v1
20
+ with:
21
+ version: 2.6.x
22
+
23
+ - name: Publish to GPR
24
+ run: |
25
+ mkdir -p $HOME/.gem
26
+ touch $HOME/.gem/credentials
27
+ chmod 0600 $HOME/.gem/credentials
28
+ printf -- "---\n:github: Bearer ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
29
+ gem build *.gemspec
30
+ gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
31
+ env:
32
+ GEM_HOST_API_KEY: ${{secrets.GPR_AUTH_TOKEN}}
33
+ OWNER: username
34
+
35
+ - name: Publish to RubyGems
36
+ run: |
37
+ mkdir -p $HOME/.gem
38
+ touch $HOME/.gem/credentials
39
+ chmod 0600 $HOME/.gem/credentials
40
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
41
+ gem build *.gemspec
42
+ gem push *.gem
43
+ env:
44
+ GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_AUTH_TOKEN}}
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ Gemfile.lock
6
+ coverage
7
+ InstalledFiles
8
+ lib/bundler/man
9
+ pkg
10
+ rdoc
11
+ spec/reports
12
+ test/tmp
13
+ test/version_tmp
14
+ tmp
15
+
16
+ # YARD artifacts
17
+ .yardoc
18
+ _yardoc
19
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,79 @@
1
+ fluent-plugin-nats-streaming
2
+ ============================
3
+
4
+ nats streaming plugin for [fluentd](https://github.com/fluent/fluentd) Event Collector
5
+
6
+ # Getting Started
7
+ example for nats streaming input:
8
+
9
+ ~~~~
10
+ <system>
11
+ workers 2
12
+ </system>
13
+
14
+ <source>
15
+ @type nats-streaming
16
+ server 127.0.0.1:4222
17
+ cluster_id test-cluster
18
+
19
+ # support multi child
20
+ client_id "in-#{Socket.gethostname}-#{worker_id}"
21
+ channel nats.test
22
+ queue test
23
+ </source>
24
+
25
+ <match nats.test>
26
+ @type stdout
27
+ </match>
28
+ ~~~~
29
+
30
+ example for nats streaming output:
31
+
32
+ ~~~~
33
+ <system>
34
+ workers 2
35
+ </system>
36
+
37
+ <match nats.**>
38
+ @type nats-streaming
39
+ server 127.0.0.1:4222
40
+ client_id "out-#{Socket.gethostname}-#{worker_id}"
41
+ cluster_id test-cluster
42
+
43
+ <format>
44
+ @type json
45
+ </format>
46
+ </match>
47
+ ~~~~
48
+
49
+ # Configuration
50
+ * **server** (string) (optional): NATS streaming server host:port
51
+ * Default value: `localhost:4222`
52
+ * **cluster_id** (string) (optional): cluster id
53
+ * Default value: `fluentd`
54
+ * **client_id** (string) (optional): client id
55
+ * Default value: `fluentd`
56
+ * **durable_name** (string) (optional): durable name
57
+ * Default value: `fluentd`
58
+ * **queue** (string) (optional): queue name
59
+ * Default value: `fluentd`
60
+ * **channel** (string) : channel name
61
+ * Default value: nil
62
+ * **max_reconnect_attempts** (integer) : The max number of reconnect tries
63
+ * Default value: 10
64
+ * **reconnect_time_wait** (integer) : The number of seconds to wait between reconnect tries
65
+ * Default value: 5
66
+ * **timeout** (integer) : Ack timeout when publish
67
+ * Default value: 5
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/test_*.rb'
8
+ test.test_files = Dir['test/plugin/*.rb']
9
+ test.verbose = false
10
+ test.warning = false
11
+ end
12
+
13
+ task :default => :test
@@ -0,0 +1,19 @@
1
+ <system>
2
+ log_level debug
3
+ workers 5
4
+ </system>
5
+
6
+ <source>
7
+ @type nats-streaming
8
+ server 127.0.0.1:4222
9
+ cluster_id test-cluster
10
+
11
+ # support multi child
12
+ client_id "in-#{Socket.gethostname}-#{worker_id}"
13
+ channel nats.test
14
+ queue test
15
+ </source>
16
+
17
+ <match nats.test>
18
+ @type stdout
19
+ </match>
@@ -0,0 +1,37 @@
1
+ <system>
2
+ log_level debug
3
+ workers 2
4
+ </system>
5
+
6
+ <source>
7
+ @type dummy
8
+ tag nats.test
9
+ auto_increment_key id
10
+ dummy {"hello":"world"}
11
+ </source>
12
+
13
+ <match nats.**>
14
+ @id nats
15
+ @type nats-streaming
16
+ server 127.0.0.1:4222
17
+ client_id "out-#{Socket.gethostname}-#{worker_id}"
18
+ cluster_id test-cluster
19
+
20
+ <format>
21
+ @type json
22
+ </format>
23
+
24
+ <buffer>
25
+ @type file
26
+ path /tmp/buffer/nats
27
+
28
+ flush_mode interval
29
+ flush_interval 1s
30
+ flush_thread_count 5
31
+ flush_at_shutdown true
32
+
33
+ retry_type periodic
34
+ retry_forever true
35
+ retry_wait 1m
36
+ </buffer>
37
+ </match>
@@ -0,0 +1,26 @@
1
+ # $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = "fluent-plugin-nats-streaming"
5
+ gem.version = "0.0.1"
6
+ gem.authors = ["hc chien"]
7
+ gem.email = ["hc.chien@pentium.network"]
8
+ gem.homepage = "https://github.com/hc-chien/fluent-plugin-nats-streaming.git"
9
+ gem.summary = %q{nats streaming plugin for fluentd, an event collector}
10
+ gem.description = %q{nats streaming plugin for fluentd, an event collector}
11
+ gem.license = "Apache-2.0"
12
+
13
+ gem.files = `git ls-files`.split("\n")
14
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
+ gem.require_paths = ["lib"]
17
+ gem.required_ruby_version = ">= 2.4.0"
18
+
19
+ gem.add_dependency "fluentd", ">= 0.14.20", "< 2"
20
+ # nats-0.11.
21
+ # gem.add_dependency "nats", '~> 0.11', ">= 0.11.0"
22
+ gem.add_dependency "nats-streaming", '~> 0.2', ">= 0.2.2"
23
+
24
+ gem.add_development_dependency "rake", '~> 0.9', ">= 0.9.2"
25
+ gem.add_development_dependency "test-unit", '~> 0.3', "> 3.1"
26
+ end
@@ -0,0 +1,99 @@
1
+ require "fluent/plugin/input"
2
+ require 'stan/client'
3
+
4
+ module Fluent::Plugin
5
+ class NatsStreamingInput < Input
6
+
7
+ Fluent::Plugin.register_input('nats-streaming', self)
8
+
9
+ helpers :thread
10
+
11
+ config_param :server, :string, :default => 'localhost:4222',
12
+ :desc => "NATS streaming server host:port"
13
+ config_param :cluster_id, :string, :default => 'fluentd',
14
+ :desc => "cluster id"
15
+ config_param :client_id, :string, :default => 'fluentd',
16
+ :desc => "client id"
17
+ config_param :durable_name, :string, :default => 'fluentd',
18
+ :desc => "durable name"
19
+ config_param :queue, :string, :default => 'fluentd',
20
+ :desc => "queue name"
21
+ config_param :channel, :string, :default => nil,
22
+ :desc => "channel name"
23
+
24
+ config_param :max_reconnect_attempts, :integer, :default => 10,
25
+ :desc => "The max number of reconnect tries"
26
+ config_param :reconnect_time_wait, :integer, :default => 5,
27
+ :desc => "The number of seconds to wait between reconnect tries"
28
+
29
+ def multi_workers_ready?
30
+ true
31
+ end
32
+
33
+ def initialize
34
+ super
35
+ @sc = nil
36
+ end
37
+
38
+ def configure(conf)
39
+ super
40
+
41
+ @sc_config = {
42
+ servers: ["nats://#{server}"],
43
+ reconnect_time_wait: @reconnect_time_wait,
44
+ max_reconnect_attempts: @max_reconnect_attempts
45
+ }
46
+
47
+ @sub_opts = {
48
+ queue: @queue,
49
+ durable_name: @durable_name,
50
+ start_at: :first,
51
+ deliver_all_available: true,
52
+ ack_wait: 10, # seconds
53
+ connect_timeout: 2 # seconds
54
+ }
55
+ end
56
+
57
+ def start
58
+ super
59
+ thread_create(:nats_streaming_input_main, &method(:run))
60
+ end
61
+
62
+ def run
63
+ @sc = STAN::Client.new
64
+
65
+ log.info "connect nats server nats://#{server} #{cluster_id} #{client_id}"
66
+ @sc.connect(@cluster_id, @client_id.gsub(/\./, '_'), nats: @sc_config)
67
+ log.info "connected"
68
+
69
+ log.info "subscribe #{channel} #{queue} #{durable_name}"
70
+ @sc.subscribe(@channel, @sub_opts) do |msg|
71
+ tag = @channel
72
+ begin
73
+ message = JSON.parse(msg.data)
74
+ rescue JSON::ParserError => e
75
+ log.error "Failed parsing JSON #{e.inspect}. Passing as a normal string"
76
+ message = msg.data
77
+ end
78
+ time = Fluent::Engine.now
79
+ router.emit(tag, time, message || {})
80
+ end
81
+
82
+ while thread_current_running?
83
+ log.trace "test connection"
84
+ @sc.nats.flush(@reconnect_time_wait)
85
+ sleep(5)
86
+ end
87
+ end
88
+
89
+ def close
90
+ super
91
+ @sc.close if @sc
92
+ end
93
+
94
+ def terminate
95
+ super
96
+ @sc = nil
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,151 @@
1
+ require "fluent/plugin/output"
2
+ require 'stan/client'
3
+
4
+ module Fluent::Plugin
5
+ class NatsStreamingOutput < Output
6
+
7
+ Fluent::Plugin.register_output('nats-streaming', self)
8
+
9
+ helpers :formatter, :thread, :inject
10
+
11
+ DEFAULT_FORMAT_TYPE = 'json'
12
+
13
+ config_param :server, :string, :default => 'localhost:4222',
14
+ :desc => "NATS streaming server host:port"
15
+ config_param :cluster_id, :string, :default => 'fluentd',
16
+ :desc => "cluster id"
17
+ config_param :client_id, :string, :default => 'fluentd',
18
+ :desc => "client id"
19
+ config_param :durable_name, :string, :default => nil,
20
+ :desc => "durable name"
21
+
22
+ config_param :max_reconnect_attempts, :integer, :default => 10,
23
+ :desc => "The max number of reconnect tries"
24
+ config_param :reconnect_time_wait, :integer, :default => 5,
25
+ :desc => "The number of seconds to wait between reconnect tries"
26
+ config_param :connect_timeout, :integer, :default => 2,
27
+ :desc => "Connect timeout in seconds"
28
+ config_param :timeout, :integer, :default => 5,
29
+ :desc => "Ack timeout"
30
+
31
+ config_section :buffer do
32
+ config_set_default :@type, 'memory'
33
+ config_set_default :flush_mode, :interval
34
+ config_set_default :flush_interval, 1
35
+ config_set_default :chunk_keys, ['tag']
36
+ config_set_default :flush_at_shutdown, true
37
+ config_set_default :chunk_limit_size, 10 * 1024
38
+ end
39
+
40
+ config_section :format do
41
+ config_set_default :@type, DEFAULT_FORMAT_TYPE
42
+ config_set_default :add_newline, false
43
+ end
44
+
45
+ def multi_workers_ready?
46
+ true
47
+ end
48
+
49
+ def formatted_to_msgpack_binary?
50
+ true
51
+ end
52
+
53
+ def initialize
54
+ super
55
+ @sc = nil
56
+ end
57
+
58
+ def configure(conf)
59
+ super
60
+
61
+ @sc_config = {
62
+ servers: ["nats://#{server}"],
63
+ reconnect_time_wait: @reconnect_time_wait,
64
+ max_reconnect_attempts: @max_reconnect_attempts,
65
+ connect_timeout: @connect_timeout
66
+ }
67
+
68
+ formatter_conf = conf.elements('format').first
69
+ unless formatter_conf
70
+ raise Fluent::ConfigError, "<format> section is required."
71
+ end
72
+ unless formatter_conf["@type"]
73
+ raise Fluent::ConfigError, "format/@type is required."
74
+ end
75
+ @formatter_proc = setup_formatter(formatter_conf)
76
+ end
77
+
78
+ def start
79
+ super
80
+ thread_create(:nats_streaming_output_main, &method(:run))
81
+ end
82
+
83
+ def run
84
+ @sc = STAN::Client.new
85
+
86
+ log.info "connect nats server nats://#{server} #{cluster_id} #{client_id}"
87
+ @sc.connect(@cluster_id, @client_id.gsub(/\./, '_'), nats: @sc_config)
88
+ log.info "connected"
89
+
90
+ while thread_current_running?
91
+ log.trace "test connection"
92
+ @sc.nats.flush(@reconnect_time_wait)
93
+ sleep(5)
94
+ end
95
+ end
96
+
97
+ def setup_formatter(conf)
98
+ type = conf['@type']
99
+ case type
100
+ when 'json'
101
+ begin
102
+ require 'oj'
103
+ Oj.default_options = Fluent::DEFAULT_OJ_OPTIONS
104
+ Proc.new { |tag, time, record| Oj.dump(record) }
105
+ rescue LoadError
106
+ require 'yajl'
107
+ Proc.new { |tag, time, record| Yajl::Encoder.encode(record) }
108
+ end
109
+ when 'ltsv'
110
+ require 'ltsv'
111
+ Proc.new { |tag, time, record| LTSV.dump(record) }
112
+ else
113
+ @formatter = formatter_create(usage: 'kafka-plugin', conf: conf)
114
+ @formatter.method(:format)
115
+ end
116
+ end
117
+
118
+ def process(tag, es)
119
+ es = inject_values_to_event_stream(tag, es)
120
+ es.each do |time,record|
121
+ @sc.publish(tag, format(tag, time, record))
122
+ end
123
+ end
124
+
125
+ def write(chunk)
126
+ return if chunk.empty?
127
+ tag = chunk.metadata.tag
128
+
129
+ messages = 0
130
+ chunk.each { |time, record|
131
+ record_buf = @formatter_proc.call(tag, time, record)
132
+ log.trace "Send record: #{record_buf}"
133
+ @sc.publish(tag, record_buf, {timeout: @timeout} )
134
+ messages += 1
135
+ }
136
+ if messages > 0
137
+ log.debug { "#{messages} messages send." }
138
+ end
139
+ end
140
+
141
+ def close
142
+ super
143
+ @sc.close if @sc
144
+ end
145
+
146
+ def terminate
147
+ super
148
+ @sc = nil
149
+ end
150
+ end
151
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-nats-streaming
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - hc chien
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-11-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fluentd
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.14.20
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.14.20
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2'
33
+ - !ruby/object:Gem::Dependency
34
+ name: nats-streaming
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.2'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 0.2.2
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.2'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 0.2.2
53
+ - !ruby/object:Gem::Dependency
54
+ name: rake
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '0.9'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 0.9.2
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '0.9'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 0.9.2
73
+ - !ruby/object:Gem::Dependency
74
+ name: test-unit
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '0.3'
80
+ - - ">"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.1'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.3'
90
+ - - ">"
91
+ - !ruby/object:Gem::Version
92
+ version: '3.1'
93
+ description: nats streaming plugin for fluentd, an event collector
94
+ email:
95
+ - hc.chien@pentium.network
96
+ executables: []
97
+ extensions: []
98
+ extra_rdoc_files: []
99
+ files:
100
+ - ".github/workflows/gempush.yml"
101
+ - ".gitignore"
102
+ - Gemfile
103
+ - README.md
104
+ - Rakefile
105
+ - example/nats_in.conf
106
+ - example/nats_out.conf
107
+ - fluent-plugin-nats-streaming.gemspec
108
+ - lib/fluent/plugin/in_nats-streaming.rb
109
+ - lib/fluent/plugin/out_nats-streaming.rb
110
+ homepage: https://github.com/hc-chien/fluent-plugin-nats-streaming.git
111
+ licenses:
112
+ - Apache-2.0
113
+ metadata: {}
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 2.4.0
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubyforge_project:
130
+ rubygems_version: 2.6.7
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: nats streaming plugin for fluentd, an event collector
134
+ test_files: []