logstash-input-sls 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9d5043bd9ad3a1cc123d446408dda36912b2dddd57b385c1c759923d66ee60ef
4
+ data.tar.gz: d721fa819bda7140a27c5ca9971058060591d7f497b6319b274500b7796377d2
5
+ SHA512:
6
+ metadata.gz: ea69bedf30527c0bc0e7eb39fe9fd6539759429564563ae4eb645c81f046644371d244356c2ef3ac93aca476a0462cb09a8d12f3a34e7aea2c31a70bfa2aff6e
7
+ data.tar.gz: 5be4fdf65df4f3bc48a0b2216f57a1d6a046e33819c0127a2e4695192b2bd36a855e0a881a679eec4e9f1880a5f00e25ce078ec052f1b91ae56b8b02ee4708ff
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 Aliyun
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,90 @@
1
+ # Logstash Logservice Input Plugin
2
+
3
+ This is a plugin for [Logstash](https://github.com/elastic/logstash).
4
+
5
+ ## Documentation
6
+ This plugin provides infrastructure to automatically consume logs from Aliyun Log Service .
7
+
8
+
9
+ ### Usage:
10
+ This is an example of logstash config:
11
+ ```
12
+ input {
13
+ logservice{
14
+ endpoint => "your project endpoint"
15
+ access_id => "your access id"
16
+ access_key => "your access key"
17
+ project => "your project name"
18
+ logstore => "your logstore name"
19
+ consumer_group => "consumer group name"
20
+ consumer_name => "consumer name"
21
+ position => "end"
22
+ checkpoint_second => 30
23
+ include_meta => true
24
+ consumer_name_with_ip => true
25
+ }
26
+ }
27
+
28
+ output {
29
+ stdout {}
30
+ }
31
+ ```
32
+
33
+ ### Logstash Logservice Input Configuration Options
34
+ This plugin supports the following configuration options
35
+
36
+ |Configuration|Type|Required|Comments|
37
+ |:---:|:---:|:---:|:---|
38
+ |endpoint|string|true|Your project endpoint|
39
+ |access_id|string|true|Your access id|
40
+ |access_key|string|true|Your access key|
41
+ |project|string|true|Your project name|
42
+ |logstore|string|true|Your consumer_name name|
43
+ |consumer_group|string|true|Consumer group name|
44
+ |consumer_name|string|true|Consumer name,The consumer name in the same consumer group must not be repeated, otherwise undefined behavior will occur.|
45
+ |position|string|true|Position to consume. Options are `begin`, `end` and `yyyy-MM-dd HH:mm:ss`|
46
+ |checkpoint_second|number| false|Time to checkpoint,default is 30|
47
+ |include_meta|boolean| false|Whether the meta is included,default is true|
48
+ |consumer_name_with_ip|boolean| false|Whether the consumer name has ip,default is true,Must be set to true under distributed collaborative consumption|
49
+
50
+
51
+ ## Install the plugin
52
+
53
+ [logstash-input-sls-0.0.1.gem](https://github.com/aliyun/logstash-input-logservice/raw/master/logstash-input-sls-0.0.1.gem)
54
+
55
+ you can build the gem and install it using:
56
+
57
+ - Build your plugin gem
58
+
59
+ ```sh
60
+ gem build logstash-input-sls.gemspec
61
+ ```
62
+
63
+ - Install the plugin from the Logstash home
64
+
65
+ ```sh
66
+ logstash-plugin install --local logstash-input-sls-0.0.1.gem
67
+ ```
68
+
69
+ - Start Logstash
70
+
71
+ ```bash
72
+ logstash -f logstash-sample.conf
73
+ ```
74
+
75
+ ## The performance test
76
+
77
+ ### The test environment
78
+
79
+ - cpu : Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz,4 Core
80
+ - memory : 8GB
81
+ - env : Linux
82
+
83
+ ### Test result
84
+ | Data flow(MB/S) |CPU(%) | MEM(GB) |
85
+ | :---: | :---: | :---: |
86
+ |32|170.3|1.3|
87
+ |16|83.3|1.3|
88
+ |8|41.5|1.3|
89
+ |4|21.0|1.3|
90
+ |2|11.3|1.3|
data/README_CN.md ADDED
@@ -0,0 +1,135 @@
1
+ # Logstash 日志服务 Input 插件
2
+
3
+ 本插件作为[Logstash](https://github.com/elastic/logstash)的input插件,提供从日志服务拉取(消费)日志的功能。
4
+
5
+ ### 功能特性
6
+ * 支持分布式协同消费:可配置多台服务器同时消费某一Logstore。
7
+ * 高性能:基于Java ConsumerGroup实现,单核消费速度可达20MB/s。
8
+ * 高可靠:消费进度保存到服务端,宕机恢复后会从上一次checkpoint处自动恢复。
9
+ * 自动负载均衡:根据消费者数量自动分配Shard,消费者增加/退出后会自动Rebalance。
10
+
11
+
12
+ ### 使用方式:
13
+ 以下示例为配置Logstash消费某一个Logstore并将日志打印到标准输出:
14
+ ```
15
+ input {
16
+ logservice{
17
+ endpoint => "your project endpoint"
18
+ access_id => "your access id"
19
+ access_key => "your access key"
20
+ project => "your project name"
21
+ logstore => "your logstore name"
22
+ consumer_group => "consumer group name"
23
+ consumer_name => "consumer name"
24
+ position => "end"
25
+ checkpoint_second => 30
26
+ include_meta => true
27
+ consumer_name_with_ip => true
28
+ }
29
+ }
30
+
31
+ output {
32
+ stdout {}
33
+ }
34
+ ```
35
+ 分布式并发消费的配置:
36
+ ````
37
+ 例如某Logstore有10个shard,
38
+ 每个shard数据流量1M/s,
39
+ 每台机器处理的能力为3M/s,
40
+ 可分配5台服务器,
41
+ 每个服务器设置相同的consumer_group和consumer_name,consumer_name_with_ip字段设置为true。
42
+ 这种情况每台服务器会分配到2个Shard,分别处理2M/s的数据。
43
+ ````
44
+
45
+
46
+ ### Logstash 日志服务 Input 配置参数
47
+ 本插件提供以下配置参数
48
+
49
+ |参数名|参数类型|是否必填|备注|
50
+ |:---:|:---:|:---:|:---|
51
+ |endpoint|string|是|日志服务项目所在的endpoint,详情请参考[endpoint列表](https://help.aliyun.com/document_detail/29008.html)|
52
+ |access_id|string|是|阿里云Access Key ID,需要具备ConsumerGroup相关权限,详情请参考[consumer group](https://help.aliyun.com/document_detail/28998.html)|
53
+ |access_key|string|是|阿里云Access Key Secret,需要具备ConsumerGroup相关权限,详情请参考[consumer group](https://help.aliyun.com/document_detail/28998.html)|
54
+ |project|string|是|日志服务项目名|
55
+ |logstore|string|是|日志服务日志库名|
56
+ |consumer_group|string|是|消费组名|
57
+ |consumer_name|string|是|消费者名,同一个消费组内消费者名,必须不能重复,否则会出现未定义行为|
58
+ |position|string|是|消费位置,可选项为 `begin`(从日志库写入的第一条数据开始消费)、`end`(从当前时间点开始消费) 和 `yyyy-MM-dd HH:mm:ss`(从指定时间点开始消费)|
59
+ |checkpoint_second|number| 否|每隔几秒 checkpoint 一次,建议10-60秒,不能低于10秒,默认30秒|
60
+ |include_meta|boolean| 否|传入日志是否包含meta,Meta包括日志source、time、tag、topic,默认为 true|
61
+ |consumer_name_with_ip|boolean| 否|消费者名是否包含ip地址,默认为 true,分布式协同消费下必须设置为true|
62
+
63
+
64
+ ## 安装插件
65
+
66
+ * 注意:如果没有修改源码可直接安装
67
+
68
+ 下载地址:[logstash-input-sls-0.0.1.gem](https://github.com/aliyun/logstash-input-logservice/raw/master/logstash-input-sls-0.0.1.gem)
69
+
70
+ - 构建 插件
71
+
72
+ ```sh
73
+ gem build logstash-input-sls.gemspec
74
+ ```
75
+
76
+ - 安装 日志服务 input 插件
77
+
78
+ ```sh
79
+ logstash-plugin install --local logstash-input-sls-0.0.1.gem
80
+ ```
81
+
82
+ - 启动 Logstash
83
+
84
+ ```bash
85
+ logstash -f logstash.conf
86
+ ```
87
+
88
+ ## 性能基准测试
89
+
90
+ ### 测试环境
91
+
92
+ - 处理器 : Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz,4 Core
93
+ - 内存 : 8GB
94
+ - 环境 : Linux
95
+
96
+ ### Logstash配置
97
+
98
+ ```
99
+ input {
100
+ logservice{
101
+ endpoint => "cn-hangzhou.log.aliyuncs.com"
102
+ access_id => "***"
103
+ access_key => "***"
104
+ project => "test-project"
105
+ logstore => "logstore1"
106
+ consumer_group => "consumer_group1"
107
+ consumer => "consumer1"
108
+ position => "end"
109
+ checkpoint_second => 30
110
+ include_meta => true
111
+ consumer_name_with_ip => true
112
+ }
113
+ }
114
+
115
+ output {
116
+ file {
117
+ path => "/dev/null"
118
+ }
119
+ }
120
+ ```
121
+
122
+ ### 测试过程
123
+
124
+ - 使用Java Producer向logstore发送数据,分别达到每秒发送2MB、4MB、8MB、16MB、32MB数据。
125
+ - 每条日志约500字节,包括10个Key&Value对。
126
+ - 启动Logstash,消费logstore中的数据并确保消费延迟没有上涨(消费速度能够跟上生产的速度)。
127
+
128
+ ### 测试结果
129
+ | 流量(MB/S) |处理器占用(%) | 内存占用(GB) |
130
+ | :---: | :---: | :---: |
131
+ |32|170.3|1.3|
132
+ |16|83.3|1.3|
133
+ |8|41.5|1.3|
134
+ |4|21.0|1.3|
135
+ |2|11.3|1.3|
@@ -0,0 +1,71 @@
1
+ require 'java'
2
+ require "logstash/namespace"
3
+ require "logstash/event"
4
+ require "logstash/environment"
5
+ require "logstash/inputs/base"
6
+
7
+ root_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
8
+ LogStash::Environment.load_runtime_jars! File.join(root_dir, "vendor")
9
+
10
+ java_import 'com.aliyun.log.logstash.LogHubStarter'
11
+ java_import 'com.aliyun.log.logstash.LogstashLogHubProcessor'
12
+
13
+ class LogStash::Inputs::LogService < LogStash::Inputs::Base
14
+ attr_accessor :worker
15
+ def initialize(*args)
16
+ super(*args)
17
+ end
18
+
19
+ class LogHubProcessor < LogstashLogHubProcessor
20
+ attr_accessor :queue
21
+ def showContent(logmap)
22
+ event = LogStash::Event.new(logmap)
23
+ # this will block if output_queue is full. output_queue size is 20
24
+ @queue << event
25
+ end
26
+ end
27
+
28
+ config_name "logservice"
29
+
30
+ config :endpoint, :validate => :string, :required => true
31
+ config :access_id, :validate => :string, :required => true
32
+ config :access_key, :validate => :string, :required => true
33
+ config :project, :validate => :string, :required => true
34
+ config :logstore, :validate => :string, :required => true
35
+ config :consumer_group, :validate => :string, :required => true
36
+ config :consumer_name, :validate => :string, :required => true
37
+ config :position, :validate => :string, :required => true
38
+ config :checkpoint_second, :validate => :number, :default => 30
39
+ config :include_meta, :validate => :boolean, :default => true
40
+ config :consumer_name_with_ip, :validate => :boolean, :default => true
41
+ public
42
+ def register
43
+ @logger.info("Init logstash-input-logservice", :endpoint => @endpoint, :project => @project, :logstore => @logstore,
44
+ :consumer_group => @consumer_group, :consumer_name => @consumer_name, :position => @position,
45
+ :checkpoint_second => @checkpoint_second, :include_meta => @include_meta ,:consumer_name_with_ip => @consumer_name_with_ip)
46
+ end
47
+
48
+ def run(queue)
49
+ @local_address = java.net.InetAddress.getLocalHost().getHostAddress();
50
+ @ip_suffix = ''
51
+ if @consumer_name_with_ip
52
+ @ip_suffix = '_' + @local_address
53
+ end
54
+ @logger.info("Running logstash-input-logservice",:local_address => @local_address)
55
+ @handler = LogHubProcessor.new()
56
+ @handler.setCheckpointSecond(@checkpoint_second)
57
+ @handler.setIncludeMeta(@include_meta)
58
+ @handler.queue = queue
59
+ LogHubStarter.startWorker(@handler, @endpoint, @access_id, @access_key, @project, @logstore, @consumer_group, @consumer_name + @ip_suffix, @position)
60
+ rescue Exception => e
61
+ @logger.error("Start logstash-input-logservice", :endpoint => @endpoint, :project => @project, :logstore => @logstore,
62
+ :consumer_group => @consumer_group, :consumer_name => @consumer_name, :position => @position,
63
+ :checkpoint_second => @checkpoint_second, :include_meta => @include_meta, :consumer_name_with_ip => @consumer_name_with_ip, :exception => e)
64
+ end
65
+
66
+ def teardown
67
+ @interrupted = true
68
+ finished
69
+ end # def teardown
70
+ end
71
+
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'logstash-input-sls'
3
+ s.version = '0.0.2'
4
+ s.licenses = ['MIT']
5
+ s.summary = "This sls input streams a string at a definable interval."
6
+ s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
7
+ s.authors = ["lichao"]
8
+ s.email = 'info@elastic.co'
9
+ s.homepage = "https://www.aliyun.com/product/sls"
10
+ s.require_paths = ["lib"]
11
+
12
+ # Files
13
+ s.files = Dir['lib/**/*','spec/**/*','vendor/**/*','*.gemspec','*.md','CONTRIBUTORS','Gemfile','LICENSE','NOTICE.TXT']
14
+ # Tests
15
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
16
+
17
+ # Special flag to let us know this is actually a logstash plugin
18
+ s.metadata = { "logstash_plugin" => "true", "logstash_group" => "input" }
19
+
20
+ # Gem dependencies
21
+ s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
22
+ s.add_runtime_dependency 'logstash-codec-plain'
23
+ s.add_runtime_dependency 'stud', '>= 0.0.22'
24
+ s.add_development_dependency 'logstash-devutils'
25
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: logstash-input-sls
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - lichao
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-07-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '1.60'
19
+ - - "<="
20
+ - !ruby/object:Gem::Version
21
+ version: '2.99'
22
+ name: logstash-core-plugin-api
23
+ prerelease: false
24
+ type: :runtime
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '1.60'
30
+ - - "<="
31
+ - !ruby/object:Gem::Version
32
+ version: '2.99'
33
+ - !ruby/object:Gem::Dependency
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ name: logstash-codec-plain
40
+ prerelease: false
41
+ type: :runtime
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 0.0.22
53
+ name: stud
54
+ prerelease: false
55
+ type: :runtime
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 0.0.22
61
+ - !ruby/object:Gem::Dependency
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ name: logstash-devutils
68
+ prerelease: false
69
+ type: :development
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ description: This gem is a Logstash plugin required to be installed on top of the
76
+ Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This
77
+ gem is not a stand-alone program
78
+ email: info@elastic.co
79
+ executables: []
80
+ extensions: []
81
+ extra_rdoc_files: []
82
+ files:
83
+ - Gemfile
84
+ - LICENSE
85
+ - README.md
86
+ - README_CN.md
87
+ - lib/logstash/inputs/logservice.rb
88
+ - lib/logstash/vendor/jar-dependencies/runtime-jars/logstash-input-sls-1.0-SNAPSHOT.jar
89
+ - logstash-input-sls.gemspec
90
+ homepage: https://www.aliyun.com/product/sls
91
+ licenses:
92
+ - MIT
93
+ metadata:
94
+ logstash_plugin: 'true'
95
+ logstash_group: input
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubyforge_project:
112
+ rubygems_version: 2.7.6
113
+ signing_key:
114
+ specification_version: 4
115
+ summary: This sls input streams a string at a definable interval.
116
+ test_files: []