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
         |