Skip to content
This repository was archived by the owner on Sep 17, 2019. It is now read-only.

Commit a7d5a2e

Browse files
committed
v0.2.4
1 parent 3a64a22 commit a7d5a2e

File tree

3 files changed

+99
-79
lines changed

3 files changed

+99
-79
lines changed

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Change Log
2+
All notable changes to this project will be documented in this file, from 0.2.0.
3+
4+
## [0.2.4] - 2016-04-11
5+
### Added
6+
- Basic tests running against DerbyDB
7+
- Fix for converting Logstash::Timestamp to iso8601 from @hordijk
8+
9+
## [0.2.3] - 2016-04-07
10+
- Documentation fixes from @hordijk
11+
12+
## [0.2.2] - 2015-12-30
13+
- Added support for non-autoloading JDBC drivers through
14+
15+
## [0.2.1] - 2015-12-22
16+
- Support for connection pooling support added through HikariCP
17+
- Support for unsafe statement handling (allowing dynamic queries)
18+
- Altered exception handling to now count sequential flushes with exceptions thrown

README.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,14 @@ If you do find this works for a JDBC driver not listed, let me know and provide
1111
This plugin does not bundle any JDBC jar files, and does expect them to be in a
1212
particular location. Please ensure you read the 4 installation lines below.
1313

14-
## Headlines
15-
- Support for connection pooling added in 0.2.0
16-
- Support for unsafe statement handling (allowing dynamic queries) in 0.2.0
17-
- Altered exception handling to now count sequential flushes with exceptions thrown in 0.2.0
14+
## ChangeLog
15+
See CHANGELOG.md
1816

1917
## Versions
2018
Released versions are are tagged as of v0.2.1, and available via rubygems.
2119

2220
For development:
23-
- See master branch for logstash v2+
21+
- See master branch for logstash v2
2422
- See v1.5 branch for logstash v1.5
2523
- See v1.4 branch for logstash 1.4
2624

@@ -34,11 +32,14 @@ For development:
3432
- And then configure (examples below)
3533

3634
## Running tests
37-
Assuming valid JDBC jar, and jruby is setup and installed, and you have issued `jruby -S bundle install` in the development directory
38-
- `SQL_JAR=path/to/your.jar jruby -S bundle exec rspec`
39-
If you need to provide username and password you may do this via the environment variables `SQL_USERNAME` and `SQL_PASSWORD`.
35+
At this time tests only run against Derby, in an in-memory database.
36+
Acceptance tests for individual database engines will be added over time.
4037

41-
Tests are not yet 100% complete.
38+
Assuming valid jruby is installed
39+
- First time, issue `jruby -S bundle install` to install dependencies
40+
- Next, download Derby jar from https://db.apache.org/derby/
41+
- Run the tests `JDBC_DERBY_JAR=path/to/derby.jar jruby -S rspec`
42+
- Optionally add the `JDBC_DEBUG=1` env variable to add logging to stdout
4243

4344
## Configuration options
4445

spec/outputs/jdbc_spec.rb

Lines changed: 71 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -4,92 +4,93 @@
44
require "java"
55

66
describe LogStash::Outputs::Jdbc do
7-
def fetch_log_table_rowcount
8-
# sleep for a second to let the flush happen
9-
sleep 1
10-
11-
stmt = @sql.createStatement()
12-
rs = stmt.executeQuery("select count(*) as total from log")
13-
count = 0
14-
while rs.next()
15-
count = rs.getInt("total")
16-
end
17-
stmt.close()
187

19-
return count
8+
let(:derby_settings) do
9+
{
10+
"driver_class" => "org.apache.derby.jdbc.EmbeddedDriver",
11+
"connection_string" => "jdbc:derby:memory:testdb;create=true",
12+
"driver_jar_path" => ENV['JDBC_DERBY_JAR'],
13+
# Grumble. Grumble.
14+
# Derby doesn't like 'T' in timestamps as of current writing, so for now
15+
# we'll just use CURRENT_TIMESTAMP as opposed to the event @timestamp
16+
"statement" => [ "insert into log (created_at, message) values(CURRENT_TIMESTAMP, ?)", "message" ]
17+
}
2018
end
2119

22-
let(:base_settings) { {
23-
"driver_jar_path" => @driver_jar_path,
24-
"connection_string" => @test_connection_string,
25-
"username" => ENV['SQL_USERNAME'],
26-
"password" => ENV['SQL_PASSWORD'],
27-
"statement" => [ "insert into log (message) values(?)", "message" ],
28-
"max_pool_size" => 1,
29-
"flush_size" => 1,
30-
"max_flush_exceptions" => 1
31-
} }
32-
let(:test_settings) { {} }
33-
let(:plugin) { LogStash::Outputs::Jdbc.new(base_settings.merge(test_settings)) }
34-
let(:event_fields) { { "message" => "This is a message!" } }
35-
let(:event) { LogStash::Event.new(event_fields) }
36-
37-
before(:all) do
38-
@driver_jar_path = File.absolute_path(ENV['SQL_JAR'])
39-
@test_db_path = File.join(Stud::Temporary.directory, "test.db")
40-
@test_connection_string = "jdbc:sqlite:#{@test_db_path}"
41-
42-
require @driver_jar_path
43-
44-
@sql = java.sql.DriverManager.get_connection(@test_connection_string, ENV['SQL_USERNAME'].to_s, ENV['SQL_PASSWORD'].to_s)
45-
stmt = @sql.createStatement()
46-
stmt.executeUpdate("CREATE table log (host text, timestamp datetime, message text);")
47-
stmt.close()
48-
end
20+
context 'rspec setup' do
4921

50-
before(:each) do
51-
stmt = @sql.createStatement()
52-
stmt.executeUpdate("delete from log")
53-
stmt.close()
22+
it 'ensure derby is available' do
23+
j = ENV['JDBC_DERBY_JAR']
24+
expect(j).not_to be_nil, "JDBC_DERBY_JAR not defined, required to run tests"
25+
expect(File.exists?(j)).to eq(true), "JDBC_DERBY_JAR defined, but not valid"
26+
end
27+
5428
end
5529

56-
after(:all) do
57-
File.unlink(@test_db_path)
58-
Dir.rmdir(File.dirname(@test_db_path))
59-
end
30+
context 'when initializing' do
6031

61-
describe "safe statement" do
62-
it "should register without errors" do
63-
expect { plugin.register }.to_not raise_error
32+
it 'shouldn\'t register without a config' do
33+
expect {
34+
LogStash::Plugin.lookup("output", "jdbc").new()
35+
}.to raise_error(LogStash::ConfigurationError)
6436
end
6537

66-
it "receive event, without error" do
67-
plugin.register
68-
expect { plugin.receive(event) }.to_not raise_error
38+
it 'shouldn\'t register with a missing jar file' do
39+
derby_settings['driver_jar_path'] = nil
40+
plugin = LogStash::Plugin.lookup("output", "jdbc").new(derby_settings)
41+
expect { plugin.register }.to raise_error
42+
end
6943

70-
expect(fetch_log_table_rowcount).to eq(1)
44+
it 'shouldn\'t register with a missing jar file' do
45+
derby_settings['connection_string'] = nil
46+
plugin = LogStash::Plugin.lookup("output", "jdbc").new(derby_settings)
47+
expect { plugin.register }.to raise_error
7148
end
7249

7350
end
7451

75-
describe "unsafe statement" do
76-
let(:event_fields) {
77-
{ "message" => "This is a message!", "table" => "log" }
78-
}
79-
let(:test_settings) { {
80-
"statement" => [ "insert into %{table} (message) values(?)", "message" ],
81-
"unsafe_statement" => true
82-
} }
83-
84-
it "should register without errors" do
85-
expect { plugin.register }.to_not raise_error
52+
context 'when outputting messages' do
53+
54+
let(:event_fields) do
55+
{ message: 'test-message' }
8656
end
57+
let(:event) { LogStash::Event.new(event_fields) }
58+
let(:plugin) {
59+
# Setup plugin
60+
output = LogStash::Plugin.lookup("output", "jdbc").new(derby_settings)
61+
output.register
62+
if ENV['JDBC_DEBUG'] == '1'
63+
output.logger.subscribe(STDOUT)
64+
end
65+
66+
# Setup table
67+
c = output.instance_variable_get(:@pool).getConnection()
68+
stmt = c.createStatement()
69+
stmt.executeUpdate("CREATE table log (created_at timestamp, message varchar(512))")
70+
stmt.close()
71+
c.close()
72+
73+
output
74+
}
8775

88-
it "receive event, without error" do
89-
plugin.register
90-
plugin.receive(event)
91-
expect(fetch_log_table_rowcount).to eq(1)
76+
it 'should save a event' do
77+
expect { plugin.receive(event) }.to_not raise_error
78+
79+
# Wait for 1 second, for the buffer to flush
80+
sleep 1
81+
82+
c = plugin.instance_variable_get(:@pool).getConnection()
83+
stmt = c.createStatement()
84+
rs = stmt.executeQuery("select count(*) as total from log")
85+
count = 0
86+
while rs.next()
87+
count = rs.getInt("total")
88+
end
89+
stmt.close()
90+
c.close()
91+
expect(count).to be > 0
9292
end
93-
93+
9494
end
95+
9596
end

0 commit comments

Comments
 (0)