Trying something new.
This commit is contained in:
		
							parent
							
								
									5ec985b0df
								
							
						
					
					
						commit
						d6869f594c
					
				@ -7,7 +7,7 @@ All notable changes to this project will be documented in this file, from 0.2.0.
 | 
			
		||||
  - Change: Removes jar files from repository, in favour of vendoring using jar-dependencies
 | 
			
		||||
  - Change: Updates to logstash-api v2.0 
 | 
			
		||||
  - Change: Switches from slf4j-nop to log4j for HikariCP logging
 | 
			
		||||
  - Change: Adds improved support to deal with partially failed batches of inserts
 | 
			
		||||
  - Change: Now selectively retries only a subset of SQL Exceptions
 | 
			
		||||
 | 
			
		||||
## [0.2.6] - 2016-05-02
 | 
			
		||||
  - Fix for exception infinite loop
 | 
			
		||||
 | 
			
		||||
@ -14,41 +14,20 @@ require 'logstash-output-jdbc_jars'
 | 
			
		||||
class LogStash::Outputs::Jdbc < LogStash::Outputs::Base
 | 
			
		||||
  STRFTIME_FMT = '%Y-%m-%d %T.%L'.freeze
 | 
			
		||||
 | 
			
		||||
  # Will never work, but only because it duplicates data (i.e. duplicate keys)
 | 
			
		||||
  # Will log a warning, but not retry.
 | 
			
		||||
  SQL_STATES_IGNORE = [
 | 
			
		||||
    ### Class: Unqualified Successful Completion
 | 
			
		||||
    # Success. This shouldn't get thrown, but JDBC driver quality varies, so who knows.
 | 
			
		||||
    0000,
 | 
			
		||||
 | 
			
		||||
    ### Class: Constraint Violation
 | 
			
		||||
    # Integrity constraint violation.
 | 
			
		||||
    23000,
 | 
			
		||||
    # A violation of the constraint imposed by a unique index or a unique constraint occurred.
 | 
			
		||||
    23505
 | 
			
		||||
  ].freeze
 | 
			
		||||
 | 
			
		||||
  # Will log an error, but not retry.
 | 
			
		||||
  SQL_STATES_FATAL = [
 | 
			
		||||
    ### Class: Data Exception
 | 
			
		||||
    # Character data, right truncation occurred. Field too small.
 | 
			
		||||
    22001,
 | 
			
		||||
    # Numeric value out of range.
 | 
			
		||||
    22003,
 | 
			
		||||
    # A null value is not allowed.
 | 
			
		||||
    22004,
 | 
			
		||||
    # Invalid datetime format.
 | 
			
		||||
    22007,
 | 
			
		||||
    # A parameter or host variable value is invalid.
 | 
			
		||||
    22023,
 | 
			
		||||
    # Character conversion resulted in truncation.
 | 
			
		||||
    22524,
 | 
			
		||||
 | 
			
		||||
    ### Constraint Violation
 | 
			
		||||
    # The insert or update value of a foreign key is invalid.
 | 
			
		||||
    23503,
 | 
			
		||||
    # The range of values for the identity column or sequence is exhausted.
 | 
			
		||||
    23522
 | 
			
		||||
  RETRYABLE_SQLSTATE_CLASSES = [
 | 
			
		||||
    # Classes of retryable SQLSTATE codes
 | 
			
		||||
    # Not all in the class will be retryable. However, this is the best that 
 | 
			
		||||
    # we've got right now.
 | 
			
		||||
    # If something is missing, or database specific they'll have to do.
 | 
			
		||||
    '08', # Connection Exception
 | 
			
		||||
    '24', # Invalid Cursor State (Maybe retry-able in some circumstances)
 | 
			
		||||
    '25', # Invalid Transaction State 
 | 
			
		||||
    '40', # Transaction Rollback 
 | 
			
		||||
    '53', # Insufficient Resources
 | 
			
		||||
    '54', # Program Limit Exceeded (MAYBE)
 | 
			
		||||
    '55', # Object Not In Prerequisite State
 | 
			
		||||
    '57', # Operator Intervention
 | 
			
		||||
    '58', # System Error
 | 
			
		||||
  ].freeze
 | 
			
		||||
 | 
			
		||||
  config_name 'jdbc'
 | 
			
		||||
@ -216,19 +195,13 @@ class LogStash::Outputs::Jdbc < LogStash::Outputs::Base
 | 
			
		||||
        )
 | 
			
		||||
        statement = add_statement_event_params(statement, event) if @statement.length > 1
 | 
			
		||||
        statement.execute
 | 
			
		||||
      rescue java.sql.SQLException => e
 | 
			
		||||
        if SQL_STATES_IGNORE.include? e.getSQLState
 | 
			
		||||
          @logger.warn('JDBC - Dropping event. Ignore-able exception (duplicate key most likely)', exception: e, event: event)
 | 
			
		||||
        elsif SQL_STATES_FATAL.include? e.getSQLState
 | 
			
		||||
          @logger.error('JDBC - Fatal SQL exception. Can never succeed. Dropping event.', exception: e, event: event)
 | 
			
		||||
      rescue => e
 | 
			
		||||
        if e.class == java.sql.SQLException and !RETRYABLE_SQLSTATE_CLASSES.include?(e.getSQLState.to_s[0,2])
 | 
			
		||||
          @logger.error('JDBC - Non-retryable SQL exception. Dropping event. If you think this is in error please log an issue with the details from this exception.', exception: e, state_code: e.getSQLState, event: event)
 | 
			
		||||
        else
 | 
			
		||||
          log_jdbc_exception(e)
 | 
			
		||||
          events_to_retry.push(event)
 | 
			
		||||
        end
 | 
			
		||||
      rescue => e
 | 
			
		||||
        # Something else happened.
 | 
			
		||||
        log_jdbc_exception(e)
 | 
			
		||||
        events_to_retry.push(event)
 | 
			
		||||
      ensure
 | 
			
		||||
        statement.close unless statement.nil?
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user