logstash-output-charrington 0.3.9 → 0.3.12
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 +4 -4
- data/lib/logstash/outputs/charrington/create_postgres_table.rb +5 -0
- data/lib/logstash/outputs/charrington/create_redshift_table.rb +3 -0
- data/lib/logstash/outputs/charrington/insert.rb +21 -5
- data/lib/logstash/outputs/charrington/transform_redshift.rb +8 -1
- data/logstash-output-charrington.gemspec +1 -1
- data/spec/outputs/charrington_spec.rb +34 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e19aa1ec683b1b07dd8bd6cb7b715e382d9bcf97f839339be15c47e49749db3
|
4
|
+
data.tar.gz: 845b806354d17539f84b7b3b31c6925a1c5220d85364a89d61086e3734fa7084
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3f61f69b23d8a28db703c1ca76952056953cd223a715322db5b0f422a1ad18d561e0d28dacb2518eaaa8799c3a9b08b718818129a41a5cd54e430dbd33c11fc
|
7
|
+
data.tar.gz: 6dff6e868f6264a77c70af63f018f8ab150f8097e03acf4521b2e068e61dce49baa3dc520aabc71be60bcf276bf33f90a8d5271d2f5e7b360c7a265b8b1e5f84
|
@@ -36,6 +36,11 @@ module Charrington
|
|
36
36
|
|
37
37
|
def set_column_types
|
38
38
|
columns.each do |column|
|
39
|
+
if column == "published_at" || column == "sent_at"
|
40
|
+
column_types << "#{column} TIMESTAMP"
|
41
|
+
next
|
42
|
+
end
|
43
|
+
|
39
44
|
case event[column]
|
40
45
|
when Time, LogStash::Timestamp
|
41
46
|
column_types << "#{column} TIMESTAMP"
|
@@ -41,6 +41,9 @@ module Charrington
|
|
41
41
|
if column == "id"
|
42
42
|
column_types << "#{column} VARCHAR(512) NOT NULL distkey CONSTRAINT #{table_name}_pkey primary key"
|
43
43
|
next
|
44
|
+
elsif column == "sent_at"
|
45
|
+
column_types << "#{column} TIMESTAMP"
|
46
|
+
next
|
44
47
|
end
|
45
48
|
case event[column]
|
46
49
|
when Time, LogStash::Timestamp
|
@@ -23,16 +23,13 @@ module Charrington
|
|
23
23
|
def initialize(connection, event, opts = {})
|
24
24
|
raise EventNil, "Table name is nil" if event.nil?
|
25
25
|
@event = event.to_hash
|
26
|
-
event_name = event["event"].to_s.
|
26
|
+
event_name = event["event"].to_s.strip
|
27
27
|
raise TableNameNil, "Table name is nil" if event_name.empty?
|
28
28
|
|
29
29
|
@connection = connection
|
30
30
|
@schema = opts[:schema].empty? ? '' : "#{opts[:schema]}."
|
31
31
|
|
32
|
-
@table_name =
|
33
|
-
.gsub(/[^a-z0-9]+/, "_")
|
34
|
-
.gsub(/\A_+/, "")
|
35
|
-
.gsub(/_+\z/, "")}"
|
32
|
+
@table_name = underscore(event_name)
|
36
33
|
|
37
34
|
@columns = event.keys
|
38
35
|
@should_retry = false
|
@@ -120,6 +117,14 @@ module Charrington
|
|
120
117
|
pos = idx + 1
|
121
118
|
value = event[key]
|
122
119
|
|
120
|
+
if key == 'published_at' || key == 'sent_at'
|
121
|
+
format = java.text.SimpleDateFormat.new("yyyy-MM-dd'T'HH:mm:ss'Z'")
|
122
|
+
parsed = format.parse(value)
|
123
|
+
time = java.sql.Timestamp.new(parsed.getTime)
|
124
|
+
stmt.setTimestamp(pos, time)
|
125
|
+
next
|
126
|
+
end
|
127
|
+
|
123
128
|
case value
|
124
129
|
when Time
|
125
130
|
stmt.setString(pos, value.strftime(STRFTIME_FMT))
|
@@ -158,6 +163,17 @@ module Charrington
|
|
158
163
|
obj.is_a? Hash or obj.is_a? Array
|
159
164
|
end
|
160
165
|
|
166
|
+
def underscore(str)
|
167
|
+
str.
|
168
|
+
gsub(/::/, '/').
|
169
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
170
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
171
|
+
downcase.
|
172
|
+
gsub(/[^a-z0-9]+/, "_").
|
173
|
+
gsub(/\A_+/, "").
|
174
|
+
gsub(/_+\z/, "")
|
175
|
+
end
|
176
|
+
|
161
177
|
### SQL
|
162
178
|
|
163
179
|
def execute(connection, sql)
|
@@ -62,7 +62,14 @@ module Charrington
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def underscore_event_name(event_name)
|
65
|
-
event_name.
|
65
|
+
event_name.
|
66
|
+
gsub(/::/, '/').
|
67
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
68
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
69
|
+
downcase.
|
70
|
+
gsub(/[^a-z0-9]+/, "_").
|
71
|
+
gsub(/\A_+/, "").
|
72
|
+
gsub(/_+\z/, "")
|
66
73
|
end
|
67
74
|
|
68
75
|
def transform_session_stuff(hash)
|
@@ -9,7 +9,7 @@ describe LogStash::Outputs::Charrington do
|
|
9
9
|
<<-CONFIG
|
10
10
|
input {
|
11
11
|
generator {
|
12
|
-
message => '{"app_name": "Web App", "event": "schemaless", "meta": { "type": "XML" } }'
|
12
|
+
message => '{"app_name": "Web App", "event": "schemaless", "meta": { "type": "XML" }, "published_at": "2019-07-29T20:09:18Z" }'
|
13
13
|
codec => 'json'
|
14
14
|
count => 1
|
15
15
|
}
|
@@ -19,6 +19,7 @@ describe LogStash::Outputs::Charrington do
|
|
19
19
|
charrington {
|
20
20
|
connection_string => '#{@url}'
|
21
21
|
driver_jar_path => '#{driver_path}'
|
22
|
+
schema => ''
|
22
23
|
}
|
23
24
|
}
|
24
25
|
CONFIG
|
@@ -27,7 +28,7 @@ describe LogStash::Outputs::Charrington do
|
|
27
28
|
it 'creates a table and inserts a record' do
|
28
29
|
drop_table('schemaless')
|
29
30
|
run_pipeline
|
30
|
-
expect(query('SELECT * FROM schemaless')).to match_array([{id: "1", app_name: "Web App", event: "schemaless", inserted_at: a_kind_of(String), :meta_type => "XML"}])
|
31
|
+
expect(query('SELECT * FROM schemaless')).to match_array([{id: "1", app_name: "Web App", event: "schemaless", inserted_at: a_kind_of(String), :meta_type => "XML", :published_at => "2019-07-29 20:09:18"}])
|
31
32
|
expect(query('SELECT COUNT(1) FROM schemaless').first[:count]).to eq("1")
|
32
33
|
end
|
33
34
|
end
|
@@ -47,6 +48,7 @@ describe LogStash::Outputs::Charrington do
|
|
47
48
|
charrington {
|
48
49
|
connection_string => '#{@url}'
|
49
50
|
driver_jar_path => '#{driver_path}'
|
51
|
+
schema => ''
|
50
52
|
}
|
51
53
|
}
|
52
54
|
CONFIG
|
@@ -78,6 +80,7 @@ describe LogStash::Outputs::Charrington do
|
|
78
80
|
charrington {
|
79
81
|
connection_string => '#{@url}'
|
80
82
|
driver_jar_path => '#{driver_path}'
|
83
|
+
schema => ''
|
81
84
|
}
|
82
85
|
}
|
83
86
|
CONFIG
|
@@ -109,6 +112,7 @@ describe LogStash::Outputs::Charrington do
|
|
109
112
|
charrington {
|
110
113
|
connection_string => '#{@url}'
|
111
114
|
driver_jar_path => '#{driver_path}'
|
115
|
+
schema => ''
|
112
116
|
}
|
113
117
|
}
|
114
118
|
CONFIG
|
@@ -166,6 +170,33 @@ describe LogStash::Outputs::Charrington do
|
|
166
170
|
end
|
167
171
|
end
|
168
172
|
|
169
|
-
|
173
|
+
describe 'a new payload with one event camelCase' do
|
174
|
+
let(:config) do
|
175
|
+
<<-CONFIG
|
176
|
+
input {
|
177
|
+
generator {
|
178
|
+
message => '{"app_name": "Web App", "event": "camelCase this", "meta": { "type": "XML" } }'
|
179
|
+
codec => 'json'
|
180
|
+
count => 1
|
181
|
+
}
|
182
|
+
}
|
170
183
|
|
184
|
+
output {
|
185
|
+
charrington {
|
186
|
+
connection_string => '#{@url}'
|
187
|
+
driver_jar_path => '#{driver_path}'
|
188
|
+
schema => ''
|
189
|
+
}
|
190
|
+
}
|
191
|
+
CONFIG
|
192
|
+
end
|
171
193
|
|
194
|
+
it 'creates a table and inserts a record' do
|
195
|
+
drop_table('camel_case_this')
|
196
|
+
run_pipeline
|
197
|
+
expect(query('SELECT * FROM camel_case_this')).to match_array([{id: "1", app_name: "Web App", event: "camelCase this", inserted_at: a_kind_of(String), :meta_type => "XML"}])
|
198
|
+
expect(query('SELECT COUNT(1) FROM camel_case_this').first[:count]).to eq("1")
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-charrington
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dconger
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-07-
|
13
|
+
date: 2019-07-30 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|