logstash-input-kinesis-cloudwatch-log-subscription 1.3.2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +14 -0
  7. data/README.md +35 -0
  8. data/Rakefile +15 -0
  9. data/lib/logstash-input-kinesis_jars.rb +5 -0
  10. data/lib/logstash/inputs/kinesis.rb +103 -0
  11. data/lib/logstash/inputs/kinesiscloudwatchlogsubscription/version.rb +7 -0
  12. data/lib/logstash/inputs/kinesiscloudwatchlogsubscription/worker.rb +77 -0
  13. data/logstash-input-kinesis.gemspec +30 -0
  14. data/pom.xml +27 -0
  15. data/spec/inputs/kinesis/worker_spec.rb +58 -0
  16. data/spec/inputs/kinesis_spec.rb +82 -0
  17. data/spec/spec_helper.rb +17 -0
  18. data/vendor/jar-dependencies/runtime-jars/amazon-kinesis-client-1.2.1.jar +0 -0
  19. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-1.9.16.jar +0 -0
  20. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-autoscaling-1.9.16.jar +0 -0
  21. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudformation-1.9.16.jar +0 -0
  22. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudfront-1.9.16.jar +0 -0
  23. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudhsm-1.9.16.jar +0 -0
  24. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudsearch-1.9.16.jar +0 -0
  25. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudtrail-1.9.16.jar +0 -0
  26. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudwatch-1.9.16.jar +0 -0
  27. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cloudwatchmetrics-1.9.16.jar +0 -0
  28. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-codedeploy-1.9.16.jar +0 -0
  29. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cognitoidentity-1.9.16.jar +0 -0
  30. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-cognitosync-1.9.16.jar +0 -0
  31. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-config-1.9.16.jar +0 -0
  32. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-core-1.9.16.jar +0 -0
  33. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-datapipeline-1.9.16.jar +0 -0
  34. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-directconnect-1.9.16.jar +0 -0
  35. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-dynamodb-1.9.16.jar +0 -0
  36. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-ec2-1.9.16.jar +0 -0
  37. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-ecs-1.9.16.jar +0 -0
  38. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-elasticache-1.9.16.jar +0 -0
  39. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-elasticbeanstalk-1.9.16.jar +0 -0
  40. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-elasticloadbalancing-1.9.16.jar +0 -0
  41. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-elastictranscoder-1.9.16.jar +0 -0
  42. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-emr-1.9.16.jar +0 -0
  43. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-glacier-1.9.16.jar +0 -0
  44. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-iam-1.9.16.jar +0 -0
  45. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-importexport-1.9.16.jar +0 -0
  46. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-kinesis-1.9.16.jar +0 -0
  47. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-kms-1.9.16.jar +0 -0
  48. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-lambda-1.9.16.jar +0 -0
  49. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-logs-1.9.16.jar +0 -0
  50. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-opsworks-1.9.16.jar +0 -0
  51. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-rds-1.9.16.jar +0 -0
  52. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-redshift-1.9.16.jar +0 -0
  53. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-route53-1.9.16.jar +0 -0
  54. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-s3-1.9.16.jar +0 -0
  55. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-ses-1.9.16.jar +0 -0
  56. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-simpledb-1.9.16.jar +0 -0
  57. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-simpleworkflow-1.9.16.jar +0 -0
  58. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-sns-1.9.16.jar +0 -0
  59. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-sqs-1.9.16.jar +0 -0
  60. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-storagegateway-1.9.16.jar +0 -0
  61. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-sts-1.9.16.jar +0 -0
  62. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-support-1.9.16.jar +0 -0
  63. data/vendor/jar-dependencies/runtime-jars/aws-java-sdk-swf-libraries-1.9.16.jar +0 -0
  64. data/vendor/jar-dependencies/runtime-jars/commons-codec-1.6.jar +0 -0
  65. data/vendor/jar-dependencies/runtime-jars/commons-logging-1.1.3.jar +0 -0
  66. data/vendor/jar-dependencies/runtime-jars/httpclient-4.3.4.jar +0 -0
  67. data/vendor/jar-dependencies/runtime-jars/httpcore-4.3.2.jar +0 -0
  68. data/vendor/jar-dependencies/runtime-jars/jackson-annotations-2.3.0.jar +0 -0
  69. data/vendor/jar-dependencies/runtime-jars/jackson-core-2.3.2.jar +0 -0
  70. data/vendor/jar-dependencies/runtime-jars/jackson-databind-2.3.2.jar +0 -0
  71. data/vendor/jar-dependencies/runtime-jars/joda-time-2.8.1.jar +0 -0
  72. 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
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - jruby-19mode
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in logstash-input-kinesis.gemspec
4
+ gemspec
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
+ [![Build Status](https://travis-ci.org/codekitchen/logstash-input-kinesis.svg)](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,5 @@
1
+ # encoding: utf-8
2
+ require 'logstash/environment'
3
+
4
+ root_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
5
+ LogStash::Environment.load_runtime_jars! File.join(root_dir, "vendor")
@@ -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,7 @@
1
+ module Logstash
2
+ module Input
3
+ module KinesisCloudWatchLogSubscription
4
+ VERSION = "1.3.2"
5
+ end
6
+ end
7
+ 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
@@ -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
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