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.
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