logstash-output-logservice 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5ceec20c00719163e5c5973e3ec5adb32f656ac5
4
- data.tar.gz: ca1fe9f695e8fb80f4ec5919ea0c4d4294b4f55a
3
+ metadata.gz: 8bef3eb05efe5d795d632577235795820512cc68
4
+ data.tar.gz: 28c0713b27c7cf0088a0125be5311625b08a44cb
5
5
  SHA512:
6
- metadata.gz: 6dee2854d218ab0cd9b53477c967a40096488500862292c31ee41a22ad181678769b5656a71324c46908d9a52e96c37ba8db287b1c6c6d22a2d2a4c01c8ec738
7
- data.tar.gz: 3f0caa777fcec257ee21d0f8b8100617678f2c7027a241ae95c9ceb253f8d99b217d8d0b0032c1abad6bc6e93af32d20403ef8c05ce95c8b8821897477555a35
6
+ metadata.gz: 5ba0d1d3d05beabe056af97f88fc98b7cb7b217611d0e63ad5d18b61f971c32a383b4b90526d0a9160004041753410b06196cc8d63ebcd954e1126c1d7f6801c
7
+ data.tar.gz: 1d1b435298e30f8879a732f1caaff9d8a605dcc3554efa936d45589cf687d690a257264d04ca62ebe25e9445f7d9c9765899c8b212a60d19c2f506fa0fcaa9b6
@@ -7,6 +7,7 @@ require 'socket'
7
7
  require "java"
8
8
 
9
9
  import "java.util.ArrayList"
10
+ import "java.util.HashMap"
10
11
 
11
12
  root_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
12
13
 
@@ -21,16 +22,16 @@ class LogStash::Outputs::LogService < LogStash::Outputs::Base
21
22
  config :endpoint, :validate => :string, :required => true
22
23
  config :project, :validate=> :string, :required=> true
23
24
  config :logstore, :validate=> :string, :required=> true
24
- config :topic, :validate=> :string, :requried=> false, :default=> ""
25
+ config :topic, :validate=> :string, :required=> false, :default=> ""
25
26
  # if source is null, will set ip default
26
- config :source, :validete=> :string, :required=> true
27
+ config :source, :validate=> :string, :required=> true
27
28
 
28
29
  # access_key_id/access_key_secret created by account of aliyun.com
29
30
  config :access_key_id, :validate=> :string, :required=> true
30
31
  config :access_key_secret, :validate=> :string, :required=> true
31
32
 
32
33
  # default 1000 logs in a logGroup for batch send
33
- config :max_buffer_items, :validate=> :number, :required=> false, :default=> 1000
34
+ config :max_buffer_items, :validate=> :number, :required=> false, :default=> 4000
34
35
  # default 2*1024*1024 Bytes in a logGroup for batch send
35
36
  config :max_buffer_bytes, :validate=> :number, :required=> false, :default=> 2097152
36
37
  # for batch send, logGroup will emit in default 3 seconds
@@ -57,6 +58,16 @@ class LogStash::Outputs::LogService < LogStash::Outputs::Base
57
58
  @source = Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
58
59
  end
59
60
  @send_retry_interval_seconds = @send_retry_interval / 1000.0
61
+ @topic_regex = nil
62
+ if ( @topic =~ /.*\(.*\).*/ )
63
+ begin
64
+ @topic_regex = Regexp.new(@topic)
65
+ rescue
66
+ @logger.error("topic is not valid regex", :topic => @topic)
67
+ @topic_regex = nil
68
+ end
69
+ end
70
+
60
71
  @logger.info("init logstash-output-logservice plugin", :endpoint => @endpoint, :project => @project, :logstore => @logstore, :topic => @topic, :source => @source, :max_buffer_bytes => @max_buffer_bytes)
61
72
  end # def register
62
73
 
@@ -70,11 +81,11 @@ class LogStash::Outputs::LogService < LogStash::Outputs::Base
70
81
  end
71
82
  end # def event
72
83
 
73
- def send_to_log_service(loggroup)
84
+ def send_to_log_service(loggroup, loggroup_topic)
74
85
  @retry = 0
75
86
  begin
76
87
  @retry += 1
77
- @logclient.PutLogs(@project, @logstore, @topic, loggroup, @source)
88
+ @logclient.PutLogs(@project, @logstore, loggroup_topic, loggroup, @source)
78
89
  @logger.info("send logs to logservice success", :logcount => loggroup.size().to_s)
79
90
  rescue LogException => e
80
91
  @error_code = e.GetErrorCode()
@@ -103,36 +114,63 @@ class LogStash::Outputs::LogService < LogStash::Outputs::Base
103
114
  return
104
115
  end
105
116
 
106
- @loggroup = ArrayList.new
107
- @byte_size = 0
117
+ @topic_map = HashMap.new()
118
+ @topic_size_map = HashMap.new()
108
119
  events.each { |x|
109
120
  begin
110
121
  @event_map = x.to_hash
111
122
  if @event_map.size < 1
112
123
  next
113
124
  end
114
- @logitem = LogCommon.LogItem.new
125
+
126
+ @loggroup_topic = @topic
127
+ if @topic_regex != nil and @event_map.has_key?('path')
128
+ @topic_match = @topic_regex.match(@event_map['path'].to_s)
129
+ if @topic_match != nil and @topic_match.length > 1
130
+ @loggroup_topic = @topic_match[1]
131
+ else
132
+ @loggroup_topic = ""
133
+ end
134
+ end
135
+
136
+ @logitem = LogCommon.LogItem.new()
115
137
  #@timestamp like 2016-02-18T03:23:11.053Z
116
138
  @logitem.SetTime(Time.parse(@event_map['@timestamp'].to_s).to_i)
139
+ @byte_size = 0
117
140
  @event_map.each do | key, value |
118
141
  @key_str = key.to_s
119
142
  @value_str = value.to_s
120
143
  @byte_size += @key_str.length + @value_str.length
121
144
  @logitem.PushBack(@key_str, @value_str)
122
145
  end
123
- @loggroup.add(@logitem)
124
- if @byte_size > @max_buffer_bytes
125
- send_to_log_service(@loggroup)
126
- @loggroup = ArrayList.new
127
- @byte_size = 0
146
+
147
+ if (@topic_map.containsKey(@loggroup_topic))
148
+ @topic_map[@loggroup_topic].add(@logitem)
149
+ @topic_size_map[@loggroup_topic] += @byte_size
150
+ else
151
+ @loggroup = ArrayList.new()
152
+ @loggroup.add(@logitem)
153
+ @topic_map[@loggroup_topic] = @loggroup
154
+ @topic_size_map[@loggroup_topic] = @byte_size
155
+ end
156
+
157
+ if @topic_size_map[@loggroup_topic] >= @max_buffer_bytes
158
+ @logger.debug("flush loggroup", :loggroup_topic => @loggroup_topic, :bytes => @topic_size_map[@loggroup_topic], :logs => @topic_map[@loggroup_topic].size())
159
+ send_to_log_service(@topic_map[@loggroup_topic], @loggroup_topic)
160
+ @topic_map.remove(@loggroup_topic)
161
+ @topic_size_map.remove(@loggroup_topic)
128
162
  end
129
163
  rescue => e
130
164
  @logger.warn("decode log data to LogGroup fail", :exception => e)
131
165
  end
132
166
  }
133
- if @byte_size > 0
134
- send_to_log_service(@loggroup)
135
- end
167
+
168
+ @topic_map.keySet().each { | key |
169
+ if @topic_size_map[key] > 0
170
+ @logger.debug("flush loggroup", :key => key, :bytes => @topic_size_map[key], :logs => @topic_map[key].size())
171
+ send_to_log_service(@topic_map[key], key)
172
+ end
173
+ }
136
174
  end
137
175
 
138
176
  public
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-logservice'
3
- s.version = "0.2.0"
3
+ s.version = "0.3.0"
4
4
  s.licenses = ['Apache License (2.0)']
5
5
  s.summary = "put data into logservice."
6
6
  s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" }
19
19
 
20
20
  # Gem dependencies
21
- s.add_runtime_dependency "logstash-core", ">= 2.0.0", "< 3.0.0"
21
+ s.add_runtime_dependency "logstash-core", ">= 2.0.0"
22
22
  s.add_runtime_dependency "logstash-codec-plain"
23
23
  s.add_runtime_dependency "stud"
24
24
  s.add_development_dependency "logstash-devutils"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-logservice
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tangkai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-29 00:00:00.000000000 Z
11
+ date: 2017-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstash-core
@@ -17,9 +17,6 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 2.0.0
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: 3.0.0
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,9 +24,6 @@ dependencies:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: 2.0.0
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: 3.0.0
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: logstash-codec-plain
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -129,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
123
  version: '0'
130
124
  requirements: []
131
125
  rubyforge_project:
132
- rubygems_version: 2.5.1
126
+ rubygems_version: 2.5.2
133
127
  signing_key:
134
128
  specification_version: 4
135
129
  summary: put data into logservice.