logstash-input-kinesis-cloudwatch-log-subscription 1.3.2-java
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 +7 -0
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +14 -0
- data/README.md +35 -0
- data/Rakefile +15 -0
- data/lib/logstash-input-kinesis_jars.rb +5 -0
- data/lib/logstash/inputs/kinesis.rb +103 -0
- data/lib/logstash/inputs/kinesiscloudwatchlogsubscription/version.rb +7 -0
- data/lib/logstash/inputs/kinesiscloudwatchlogsubscription/worker.rb +77 -0
- data/logstash-input-kinesis.gemspec +30 -0
- data/pom.xml +27 -0
- data/spec/inputs/kinesis/worker_spec.rb +58 -0
- data/spec/inputs/kinesis_spec.rb +82 -0
- data/spec/spec_helper.rb +17 -0
- data/vendor/jar-dependencies/runtime-jars/amazon-kinesis-client-1.2.1.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-autoscaling-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudformation-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudfront-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudhsm-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudsearch-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudtrail-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudwatch-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudwatchmetrics-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-codedeploy-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cognitoidentity-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cognitosync-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-config-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-core-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-datapipeline-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-directconnect-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-dynamodb-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-ec2-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-ecs-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-elasticache-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-elasticbeanstalk-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-elasticloadbalancing-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-elastictranscoder-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-emr-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-glacier-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-iam-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-importexport-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-kinesis-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-kms-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-lambda-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-logs-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-opsworks-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-rds-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-redshift-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-route53-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-s3-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-ses-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-simpledb-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-simpleworkflow-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-sns-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-sqs-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-storagegateway-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-sts-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-support-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-swf-libraries-1.9.16.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/commons-codec-1.6.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/commons-logging-1.1.3.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/httpclient-4.3.4.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/httpcore-4.3.2.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/jackson-annotations-2.3.0.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/jackson-core-2.3.2.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/jackson-databind-2.3.2.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/joda-time-2.8.1.jar +0 -0
- metadata +191 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: d238afe40305654bbc456cf629d6390b9773a435
|
|
4
|
+
data.tar.gz: 0f4d43a02df7aa4f34a77f4d0e064ccd7585a520
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 50decd6d8a0b010ef2ff43c2b21e55f6649fd11ddb2b4ee84f64b49dffde847b27efb19b41703bfae617c332c807c8767239c6396be7d01ddaba425f9b5ab0f7
|
|
7
|
+
data.tar.gz: d99075f945737570851f18d2dc92537a60c0564300eec7c9c628d51002fc40511bc1bc233d4ab399302c450ab3082604984a921cf2239f71f2d5f5fbc46b5a44
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Copyright (c) 2015 Brian Palmer
|
|
2
|
+
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
|
14
|
+
|
data/README.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Logstash AWS Kinesis Input Plugin
|
|
2
|
+
|
|
3
|
+
This is a plugin for [Logstash](https://github.com/elasticsearch/logstash).
|
|
4
|
+
|
|
5
|
+
[](https://travis-ci.org/codekitchen/logstash-input-kinesis)
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
This plugin requires Logstash 1.5, and can be installed by Logstash
|
|
10
|
+
itself.
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
$(LOGSTASH_DIR)/bin/plugin install logstash-input-kinesis
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
input {
|
|
20
|
+
kinesis {
|
|
21
|
+
kinesis_stream_name => "my-logging-stream"
|
|
22
|
+
codec => json { }
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
At least `kinesis_stream_name` is requred.
|
|
28
|
+
|
|
29
|
+
## Contributing
|
|
30
|
+
|
|
31
|
+
1. Fork it ( https://github.com/codekitchen/logstash-input-kinesis/fork )
|
|
32
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
33
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
34
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
35
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require "bundler/gem_tasks"
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'rspec/core/rake_task'
|
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
6
|
+
rescue LoadError
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
task default: "spec"
|
|
10
|
+
|
|
11
|
+
task "vendor_jars" do
|
|
12
|
+
sh "mvn dependency:copy-dependencies -DoutputDirectory=vendor/jar-dependencies/runtime-jars/"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
task build: "vendor_jars"
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/inputs/base"
|
|
3
|
+
require "logstash/errors"
|
|
4
|
+
require "logstash/environment"
|
|
5
|
+
require "logstash/namespace"
|
|
6
|
+
|
|
7
|
+
require 'logstash-input-kinesis_jars'
|
|
8
|
+
require "logstash/inputs/kinesiscloudwatchlogsubscription/version"
|
|
9
|
+
|
|
10
|
+
# Receive events through an AWS Kinesis stream.
|
|
11
|
+
#
|
|
12
|
+
# This input plugin uses the Java Kinesis Client Library underneath, so the
|
|
13
|
+
# documentation at https://github.com/awslabs/amazon-kinesis-client will be
|
|
14
|
+
# useful.
|
|
15
|
+
#
|
|
16
|
+
# AWS credentials can be specified either through environment variables, or an
|
|
17
|
+
# IAM instance role. The library uses a DynamoDB table for worker coordination,
|
|
18
|
+
# so you'll need to grant access to that as well as to the Kinesis stream. The
|
|
19
|
+
# DynamoDB table has the same name as the `application_name` configuration
|
|
20
|
+
# option, which defaults to "logstash".
|
|
21
|
+
#
|
|
22
|
+
# The library can optionally also send worker statistics to CloudWatch.
|
|
23
|
+
class LogStash::Inputs::KinesisCloudWatchLogSubscription < LogStash::Inputs::Base
|
|
24
|
+
KCL = com.amazonaws.services.kinesis.clientlibrary.lib.worker
|
|
25
|
+
require "logstash/inputs/kinesiscloudwatchlogsubscription/worker"
|
|
26
|
+
|
|
27
|
+
config_name 'kinesis_cloudwatch_log_subscription'
|
|
28
|
+
milestone 1
|
|
29
|
+
|
|
30
|
+
attr_reader(
|
|
31
|
+
:kcl_config,
|
|
32
|
+
:kcl_worker,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
# The application name used for the dynamodb coordination table. Must be
|
|
36
|
+
# unique for this kinesis stream.
|
|
37
|
+
config :application_name, :validate => :string, :default => "logstash"
|
|
38
|
+
|
|
39
|
+
# The kinesis stream name.
|
|
40
|
+
config :kinesis_stream_name, :validate => :string, :required => true
|
|
41
|
+
|
|
42
|
+
# The AWS region for Kinesis, DynamoDB, and CloudWatch (if enabled)
|
|
43
|
+
config :region, :validate => :string, :default => "us-east-1"
|
|
44
|
+
|
|
45
|
+
# How many seconds between worker checkpoints to dynamodb.
|
|
46
|
+
config :checkpoint_interval_seconds, :validate => :number, :default => 60
|
|
47
|
+
|
|
48
|
+
# Worker metric tracking. By default this is disabled, set it to "cloudwatch"
|
|
49
|
+
# to enable the cloudwatch integration in the Kinesis Client Library.
|
|
50
|
+
config :metrics, :validate => [nil, "cloudwatch"], :default => nil
|
|
51
|
+
|
|
52
|
+
def initialize(params = {}, kcl_class = KCL::Worker)
|
|
53
|
+
@kcl_class = kcl_class
|
|
54
|
+
super(params)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def register
|
|
58
|
+
# the INFO log level is extremely noisy in KCL
|
|
59
|
+
org.apache.commons.logging::LogFactory.getLog("com.amazonaws.services.kinesis").
|
|
60
|
+
logger.setLevel(java.util.logging::Level::WARNING)
|
|
61
|
+
|
|
62
|
+
worker_id = java.util::UUID.randomUUID.to_s
|
|
63
|
+
creds = com.amazonaws.auth::DefaultAWSCredentialsProviderChain.new()
|
|
64
|
+
@kcl_config = KCL::KinesisClientLibConfiguration.new(
|
|
65
|
+
@application_name,
|
|
66
|
+
@kinesis_stream_name,
|
|
67
|
+
creds,
|
|
68
|
+
worker_id).
|
|
69
|
+
withInitialPositionInStream(KCL::InitialPositionInStream::TRIM_HORIZON).
|
|
70
|
+
withRegionName(@region)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def run(output_queue)
|
|
74
|
+
worker_factory = proc { Worker.new(@codec.clone, output_queue, method(:decorate), @checkpoint_interval_seconds, @logger) }
|
|
75
|
+
if metrics_factory
|
|
76
|
+
@kcl_worker = @kcl_class.new(
|
|
77
|
+
worker_factory,
|
|
78
|
+
@kcl_config,
|
|
79
|
+
metrics_factory)
|
|
80
|
+
else
|
|
81
|
+
@kcl_worker = @kcl_class.new(
|
|
82
|
+
worker_factory,
|
|
83
|
+
@kcl_config)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
@kcl_worker.run()
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def teardown
|
|
90
|
+
@kcl_worker.shutdown if @kcl_worker
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
protected
|
|
94
|
+
|
|
95
|
+
def metrics_factory
|
|
96
|
+
case @metrics
|
|
97
|
+
when nil
|
|
98
|
+
com.amazonaws.services.kinesis.metrics.impl::NullMetricsFactory.new
|
|
99
|
+
when 'cloudwatch'
|
|
100
|
+
nil # default in the underlying library
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
class LogStash::Inputs::KinesisCloudWatchLogSubscription::Worker
|
|
2
|
+
include com.amazonaws.services.kinesis.clientlibrary.interfaces::IRecordProcessor
|
|
3
|
+
|
|
4
|
+
attr_reader(
|
|
5
|
+
:checkpoint_interval,
|
|
6
|
+
:codec,
|
|
7
|
+
:decorator,
|
|
8
|
+
:logger,
|
|
9
|
+
:output_queue,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
def initialize(*args)
|
|
13
|
+
# nasty hack, because this is the name of a method on IRecordProcessor, but also ruby's constructor
|
|
14
|
+
if !@constructed
|
|
15
|
+
@codec, @output_queue, @decorator, @checkpoint_interval, @logger = args
|
|
16
|
+
@next_checkpoint = Time.now - 600
|
|
17
|
+
@constructed = true
|
|
18
|
+
else
|
|
19
|
+
_shard_id, _ = args
|
|
20
|
+
@decoder = java.nio.charset::Charset.forName("UTF-8").newDecoder()
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
public :initialize
|
|
24
|
+
|
|
25
|
+
def processRecords(records, checkpointer)
|
|
26
|
+
records.each { |record| process_record(record) }
|
|
27
|
+
if Time.now >= @next_checkpoint
|
|
28
|
+
checkpoint(checkpointer)
|
|
29
|
+
@next_checkpoint = Time.now + @checkpoint_interval
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def shutdown(checkpointer, reason)
|
|
34
|
+
if reason == com.amazonaws.services.kinesis.clientlibrary.types::ShutdownReason::TERMINATE
|
|
35
|
+
checkpoint(checkpointer)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
protected
|
|
40
|
+
|
|
41
|
+
def checkpoint(checkpointer)
|
|
42
|
+
checkpointer.checkpoint()
|
|
43
|
+
rescue => error
|
|
44
|
+
@logger.error("Kinesis worker failed checkpointing: #{error}")
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def process_record(record)
|
|
48
|
+
# I'm SOOOO SORRY. This is fugly. But it works. And lets me ship.
|
|
49
|
+
# Please make this right. I was always getting incorrect header errors.
|
|
50
|
+
# Either with JRuby zlib, or raw java zlib :(
|
|
51
|
+
raw = record.getData
|
|
52
|
+
File.open( '/tmp/sequence-' + record.sequenceNumber, 'w+') do |file|
|
|
53
|
+
file.write(raw.array)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
raw = `zcat /tmp/sequence-#{record.sequenceNumber}`
|
|
57
|
+
File.delete "/tmp/sequence-#{record.sequenceNumber}"
|
|
58
|
+
|
|
59
|
+
@codec.decode(raw) do |event|
|
|
60
|
+
@decorator.call(event)
|
|
61
|
+
@output_queue << event
|
|
62
|
+
end
|
|
63
|
+
rescue => error
|
|
64
|
+
@logger.error("Error processing record: #{error}")
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def process_record(record)
|
|
69
|
+
raw = @decoder.decode(record.getData).to_s
|
|
70
|
+
@codec.decode(raw) do |event|
|
|
71
|
+
@decorator.call(event)
|
|
72
|
+
@output_queue << event
|
|
73
|
+
end
|
|
74
|
+
rescue => error
|
|
75
|
+
@logger.error("Error processing record: #{error}")
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'logstash/inputs/kinesiscloudwatchlogsubscription/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = "logstash-input-kinesis-cloudwatch-log-subscription"
|
|
8
|
+
spec.version = Logstash::Input::KinesisCloudWatchLogSubscription::VERSION
|
|
9
|
+
spec.authors = ["Laurence MacGuire"]
|
|
10
|
+
spec.email = ["leprechaun@gmail.com"]
|
|
11
|
+
spec.summary = %q{Logstash plugin for Kinesis input from cloudwatch log subscriptions}
|
|
12
|
+
spec.description = %q{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}
|
|
13
|
+
spec.homepage = "https://github.com/leprechaun/logstash-input-kinesis-cloudwatch-log-subscription"
|
|
14
|
+
spec.licenses = ['Apache License (2.0)']
|
|
15
|
+
|
|
16
|
+
spec.files = `git ls-files`.split($\)
|
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
18
|
+
spec.require_paths = ["lib"]
|
|
19
|
+
|
|
20
|
+
# Special flag to let us know this is actually a logstash plugin
|
|
21
|
+
spec.metadata = { "logstash_plugin" => "true", "logstash_group" => "input" }
|
|
22
|
+
|
|
23
|
+
spec.platform = 'java'
|
|
24
|
+
|
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
|
26
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
|
27
|
+
spec.add_development_dependency "rspec", "~> 3.2.0"
|
|
28
|
+
spec.add_development_dependency "logstash-core", ">= 1.5.1"
|
|
29
|
+
spec.add_development_dependency "logstash-codec-json"
|
|
30
|
+
end
|
data/pom.xml
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
2
|
+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
3
|
+
<modelVersion>4.0.0</modelVersion>
|
|
4
|
+
<groupId>codekitchen</groupId>
|
|
5
|
+
<artifactId>logstash-input-kinesis</artifactId>
|
|
6
|
+
<version>dev</version>
|
|
7
|
+
<dependencies>
|
|
8
|
+
<dependency>
|
|
9
|
+
<groupId>com.amazonaws</groupId>
|
|
10
|
+
<artifactId>amazon-kinesis-client</artifactId>
|
|
11
|
+
<version>1.2.1</version>
|
|
12
|
+
</dependency>
|
|
13
|
+
</dependencies>
|
|
14
|
+
<build>
|
|
15
|
+
<plugins>
|
|
16
|
+
<plugin>
|
|
17
|
+
<groupId>org.apache.maven.plugins</groupId>
|
|
18
|
+
<artifactId>maven-dependency-plugin</artifactId>
|
|
19
|
+
<executions>
|
|
20
|
+
<execution>
|
|
21
|
+
<id>copy-dependencies</id>
|
|
22
|
+
</execution>
|
|
23
|
+
</executions>
|
|
24
|
+
</plugin>
|
|
25
|
+
</plugins>
|
|
26
|
+
</build>
|
|
27
|
+
</project>
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require "logstash/plugin"
|
|
2
|
+
require "logstash/inputs/kinesis"
|
|
3
|
+
require "logstash/codecs/json"
|
|
4
|
+
require "json"
|
|
5
|
+
|
|
6
|
+
RSpec.describe "LogStash::Inputs::Kinesis::Worker" do
|
|
7
|
+
subject!(:worker) { LogStash::Inputs::Kinesis::Worker.new(codec, queue, decorator, checkpoint_interval) }
|
|
8
|
+
let(:codec) { LogStash::Codecs::JSON.new() }
|
|
9
|
+
let(:queue) { Queue.new }
|
|
10
|
+
let(:decorator) { proc { |x| x["decorated"] = true; x } }
|
|
11
|
+
let(:checkpoint_interval) { 120 }
|
|
12
|
+
let(:checkpointer) { double('checkpointer', checkpoint: nil) }
|
|
13
|
+
let(:shard_id) { "xyz" }
|
|
14
|
+
|
|
15
|
+
it "honors the initialize java interface method contract" do
|
|
16
|
+
expect { worker.initialize(shard_id) }.to_not raise_error
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def record(hash = { "message" => "test" })
|
|
20
|
+
encoder = java.nio.charset::Charset.forName("UTF-8").newEncoder()
|
|
21
|
+
data = encoder.encode(java.nio.CharBuffer.wrap(JSON.generate(hash)))
|
|
22
|
+
double(getData: data)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
let(:record1) { record(id: "record1", message: "test1") }
|
|
26
|
+
let(:record2) { record(id: "record2", message: "test2") }
|
|
27
|
+
|
|
28
|
+
context "initialized" do
|
|
29
|
+
before do
|
|
30
|
+
worker.initialize(shard_id)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe "#processRecords" do
|
|
34
|
+
it "decodes and queues each record with decoration" do
|
|
35
|
+
worker.processRecords([record1, record2], checkpointer)
|
|
36
|
+
m1 = queue.pop
|
|
37
|
+
m2 = queue.pop
|
|
38
|
+
expect(m1).to be_kind_of(LogStash::Event)
|
|
39
|
+
expect(m2).to be_kind_of(LogStash::Event)
|
|
40
|
+
expect(m1['id']).to eq("record1")
|
|
41
|
+
expect(m1['message']).to eq("test1")
|
|
42
|
+
expect(m1['decorated']).to eq(true)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "checkpoints on interval" do
|
|
46
|
+
expect(checkpointer).to receive(:checkpoint).once
|
|
47
|
+
worker.processRecords([], checkpointer)
|
|
48
|
+
|
|
49
|
+
# not this time
|
|
50
|
+
worker.processRecords([], checkpointer)
|
|
51
|
+
|
|
52
|
+
allow(Time).to receive(:now).and_return(Time.now + 125)
|
|
53
|
+
expect(checkpointer).to receive(:checkpoint).once
|
|
54
|
+
worker.processRecords([], checkpointer)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require "logstash/plugin"
|
|
2
|
+
require "logstash/inputs/kinesis"
|
|
3
|
+
require "logstash/codecs/json"
|
|
4
|
+
|
|
5
|
+
RSpec.describe "inputs/kinesis" do
|
|
6
|
+
KCL = com.amazonaws.services.kinesis.clientlibrary.lib.worker
|
|
7
|
+
|
|
8
|
+
# It's very difficult to directly test the Java class, with all its private members,
|
|
9
|
+
# so we subclass it here.
|
|
10
|
+
class TestKCLWorker < KCL::Worker
|
|
11
|
+
field_reader :metricsFactory, :recordProcessorFactory
|
|
12
|
+
def run
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
let(:config) {{
|
|
17
|
+
"application_name" => "my-processor",
|
|
18
|
+
"kinesis_stream_name" => "run-specs",
|
|
19
|
+
"codec" => codec,
|
|
20
|
+
"metrics" => metrics,
|
|
21
|
+
"checkpoint_interval_seconds" => 120,
|
|
22
|
+
"region" => "ap-southeast-1",
|
|
23
|
+
}}
|
|
24
|
+
|
|
25
|
+
subject!(:kinesis) { LogStash::Inputs::Kinesis.new(config, kcl_class) }
|
|
26
|
+
let(:kcl_class) { TestKCLWorker }
|
|
27
|
+
let(:metrics) { nil }
|
|
28
|
+
let(:codec) { LogStash::Codecs::JSON.new() }
|
|
29
|
+
|
|
30
|
+
it "registers without error" do
|
|
31
|
+
input = LogStash::Plugin.lookup("input", "kinesis").new("kinesis_stream_name" => "specs", "codec" => codec)
|
|
32
|
+
expect { input.register }.to_not raise_error
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "configures the KCL" do
|
|
36
|
+
kinesis.register
|
|
37
|
+
expect(kinesis.kcl_config.applicationName).to eq("my-processor")
|
|
38
|
+
expect(kinesis.kcl_config.streamName).to eq("run-specs")
|
|
39
|
+
expect(kinesis.kcl_config.regionName).to eq("ap-southeast-1")
|
|
40
|
+
expect(kinesis.kcl_config.initialPositionInStream).to eq(KCL::InitialPositionInStream::TRIM_HORIZON)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context "#run" do
|
|
44
|
+
let(:queue) { Queue.new }
|
|
45
|
+
|
|
46
|
+
before do
|
|
47
|
+
kinesis.register
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "clones the codec for each worker" do
|
|
51
|
+
expect(codec).to receive(:clone).once
|
|
52
|
+
kinesis.run(queue)
|
|
53
|
+
worker = kinesis.kcl_worker.recordProcessorFactory.call()
|
|
54
|
+
expect(worker).to be_kind_of(LogStash::Inputs::Kinesis::Worker)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "generates a valid worker via the factory proc" do
|
|
58
|
+
kinesis.run(queue)
|
|
59
|
+
worker = kinesis.kcl_worker.recordProcessorFactory.call()
|
|
60
|
+
expect(worker.codec).to be_kind_of(codec.class)
|
|
61
|
+
expect(worker.checkpoint_interval).to eq(120)
|
|
62
|
+
expect(worker.output_queue).to eq(queue)
|
|
63
|
+
expect(worker.decorator).to eq(kinesis.method(:decorate))
|
|
64
|
+
expect(worker.logger).to eq(kinesis.logger)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "disables metric tracking by default" do
|
|
68
|
+
kinesis.run(queue)
|
|
69
|
+
expect(kinesis.kcl_worker.metricsFactory).to be_kind_of(com.amazonaws.services.kinesis.metrics.impl::NullMetricsFactory)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context "cloudwatch" do
|
|
73
|
+
let(:metrics) { "cloudwatch" }
|
|
74
|
+
it "uses cloudwatch metrics if specified" do
|
|
75
|
+
kinesis.run(queue)
|
|
76
|
+
expect(kinesis.kcl_worker.metricsFactory).to be_kind_of(com.amazonaws.services.kinesis.metrics.impl::CWMetricsFactory)
|
|
77
|
+
# the process hangs otherwise
|
|
78
|
+
kinesis.kcl_worker.metricsFactory.shutdown
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
RSpec.configure do |config|
|
|
2
|
+
config.expect_with :rspec do |expectations|
|
|
3
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
config.mock_with :rspec do |mocks|
|
|
7
|
+
mocks.verify_partial_doubles = true
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
config.disable_monkey_patching!
|
|
11
|
+
config.warnings = false
|
|
12
|
+
if config.files_to_run.one?
|
|
13
|
+
config.default_formatter = 'doc'
|
|
14
|
+
end
|
|
15
|
+
config.order = :random
|
|
16
|
+
Kernel.srand config.seed
|
|
17
|
+
end
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
metadata
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: logstash-input-kinesis-cloudwatch-log-subscription
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.3.2
|
|
5
|
+
platform: java
|
|
6
|
+
authors:
|
|
7
|
+
- Laurence MacGuire
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2015-07-14 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bundler
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.7'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.7'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '10.0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '10.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rspec
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: 3.2.0
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 3.2.0
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: logstash-core
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 1.5.1
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 1.5.1
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: logstash-codec-json
|
|
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'
|
|
83
|
+
description: This gem is a logstash plugin required to be installed on top of the
|
|
84
|
+
Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not
|
|
85
|
+
a stand-alone program
|
|
86
|
+
email:
|
|
87
|
+
- leprechaun@gmail.com
|
|
88
|
+
executables: []
|
|
89
|
+
extensions: []
|
|
90
|
+
extra_rdoc_files: []
|
|
91
|
+
files:
|
|
92
|
+
- ".gitignore"
|
|
93
|
+
- ".rspec"
|
|
94
|
+
- ".travis.yml"
|
|
95
|
+
- Gemfile
|
|
96
|
+
- LICENSE.txt
|
|
97
|
+
- README.md
|
|
98
|
+
- Rakefile
|
|
99
|
+
- lib/logstash-input-kinesis_jars.rb
|
|
100
|
+
- lib/logstash/inputs/kinesis.rb
|
|
101
|
+
- lib/logstash/inputs/kinesiscloudwatchlogsubscription/version.rb
|
|
102
|
+
- lib/logstash/inputs/kinesiscloudwatchlogsubscription/worker.rb
|
|
103
|
+
- logstash-input-kinesis.gemspec
|
|
104
|
+
- pom.xml
|
|
105
|
+
- spec/inputs/kinesis/worker_spec.rb
|
|
106
|
+
- spec/inputs/kinesis_spec.rb
|
|
107
|
+
- spec/spec_helper.rb
|
|
108
|
+
- vendor/jar-dependencies/runtime-jars/amazon-kinesis-client-1.2.1.jar
|
|
109
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-1.9.16.jar
|
|
110
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-autoscaling-1.9.16.jar
|
|
111
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudformation-1.9.16.jar
|
|
112
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudfront-1.9.16.jar
|
|
113
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudhsm-1.9.16.jar
|
|
114
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudsearch-1.9.16.jar
|
|
115
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudtrail-1.9.16.jar
|
|
116
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudwatch-1.9.16.jar
|
|
117
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudwatchmetrics-1.9.16.jar
|
|
118
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-codedeploy-1.9.16.jar
|
|
119
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-cognitoidentity-1.9.16.jar
|
|
120
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-cognitosync-1.9.16.jar
|
|
121
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-config-1.9.16.jar
|
|
122
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-core-1.9.16.jar
|
|
123
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-datapipeline-1.9.16.jar
|
|
124
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-directconnect-1.9.16.jar
|
|
125
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-dynamodb-1.9.16.jar
|
|
126
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-ec2-1.9.16.jar
|
|
127
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-ecs-1.9.16.jar
|
|
128
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-elasticache-1.9.16.jar
|
|
129
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-elasticbeanstalk-1.9.16.jar
|
|
130
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-elasticloadbalancing-1.9.16.jar
|
|
131
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-elastictranscoder-1.9.16.jar
|
|
132
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-emr-1.9.16.jar
|
|
133
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-glacier-1.9.16.jar
|
|
134
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-iam-1.9.16.jar
|
|
135
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-importexport-1.9.16.jar
|
|
136
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-kinesis-1.9.16.jar
|
|
137
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-kms-1.9.16.jar
|
|
138
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-lambda-1.9.16.jar
|
|
139
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-logs-1.9.16.jar
|
|
140
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-opsworks-1.9.16.jar
|
|
141
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-rds-1.9.16.jar
|
|
142
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-redshift-1.9.16.jar
|
|
143
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-route53-1.9.16.jar
|
|
144
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-s3-1.9.16.jar
|
|
145
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-ses-1.9.16.jar
|
|
146
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-simpledb-1.9.16.jar
|
|
147
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-simpleworkflow-1.9.16.jar
|
|
148
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-sns-1.9.16.jar
|
|
149
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-sqs-1.9.16.jar
|
|
150
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-storagegateway-1.9.16.jar
|
|
151
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-sts-1.9.16.jar
|
|
152
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-support-1.9.16.jar
|
|
153
|
+
- vendor/jar-dependencies/runtime-jars/aws-java-sdk-swf-libraries-1.9.16.jar
|
|
154
|
+
- vendor/jar-dependencies/runtime-jars/commons-codec-1.6.jar
|
|
155
|
+
- vendor/jar-dependencies/runtime-jars/commons-logging-1.1.3.jar
|
|
156
|
+
- vendor/jar-dependencies/runtime-jars/httpclient-4.3.4.jar
|
|
157
|
+
- vendor/jar-dependencies/runtime-jars/httpcore-4.3.2.jar
|
|
158
|
+
- vendor/jar-dependencies/runtime-jars/jackson-annotations-2.3.0.jar
|
|
159
|
+
- vendor/jar-dependencies/runtime-jars/jackson-core-2.3.2.jar
|
|
160
|
+
- vendor/jar-dependencies/runtime-jars/jackson-databind-2.3.2.jar
|
|
161
|
+
- vendor/jar-dependencies/runtime-jars/joda-time-2.8.1.jar
|
|
162
|
+
homepage: https://github.com/leprechaun/logstash-input-kinesis-cloudwatch-log-subscription
|
|
163
|
+
licenses:
|
|
164
|
+
- Apache License (2.0)
|
|
165
|
+
metadata:
|
|
166
|
+
logstash_plugin: 'true'
|
|
167
|
+
logstash_group: input
|
|
168
|
+
post_install_message:
|
|
169
|
+
rdoc_options: []
|
|
170
|
+
require_paths:
|
|
171
|
+
- lib
|
|
172
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
173
|
+
requirements:
|
|
174
|
+
- - ">="
|
|
175
|
+
- !ruby/object:Gem::Version
|
|
176
|
+
version: '0'
|
|
177
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
|
+
requirements:
|
|
179
|
+
- - ">="
|
|
180
|
+
- !ruby/object:Gem::Version
|
|
181
|
+
version: '0'
|
|
182
|
+
requirements: []
|
|
183
|
+
rubyforge_project:
|
|
184
|
+
rubygems_version: 2.4.5
|
|
185
|
+
signing_key:
|
|
186
|
+
specification_version: 4
|
|
187
|
+
summary: Logstash plugin for Kinesis input from cloudwatch log subscriptions
|
|
188
|
+
test_files:
|
|
189
|
+
- spec/inputs/kinesis/worker_spec.rb
|
|
190
|
+
- spec/inputs/kinesis_spec.rb
|
|
191
|
+
- spec/spec_helper.rb
|