fluent-plugin-nats-streaming 0.0.1

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.
@@ -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: []