sql_last_value 每当 logstash 重新启动时重置

sql_last_value resets whenever logstash restarts

每当我重新启动 logstash 时,它就会从头开始获取数据库记录,这是我正在执行的 .conf 文件

input {
    jdbc {
        # Postgres jdbc connection string to our database, mydb
        jdbc_connection_string => "jdbc:postgresql://**************:5432/******"
        # The user we wish to execute our statement as
        jdbc_user => "*******"
        jdbc_password => "******"
        # The path to our downloaded jdbc driver
        jdbc_driver_library => "/usr/share/logstash/lib/postgresql-42.2.9.jar"
        # The name of the driver class for Postgresql
        jdbc_driver_class => "org.postgresql.Driver"
        jdbc_paging_enabled => true
        # the column which should be stored to .logstash_jdbc_last_run
        tracking_column => "unix_ts_in_secs"
        use_column_value => true
        tracking_column_type => "numeric"
        schedule => "*/5 * * * * *"
        jdbc_page_size => 500
        # sql_last_value is stored in this file so each pipeline should have different
        # file name so it doesn't get mixed
        last_run_metadata_path => "/etc/logstash/conf.d/lastrun/.logstash_jdbc_last_run_alerts"
        # our query
        statement_filepath => "/etc/logstash/db-queries/alerts-query.sql"
    }
}

filter {
  mutate {
    remove_field => ["unix_ts_in_secs"]
  }
}

output {
    elasticsearch {
        index => "typec"
        document_id => "%{id}"
        hosts => ["************"]
        user => "******"
        password => "******"
    }
}

文件:提醒-query.sql

SELECT *
FROM alerts as a
WHERE (
    extract(epoch FROM a."updated_at") > :sql_last_value
    AND a."updated_at" < NOW()
)
ORDER BY a."updated_at" ASC

有什么方法可以保留 :sql_last_value,即使 logstash 重新启动它也会从之前存储的 :sql_last_value 开始,而不是从 0 开始?

问题出在 use_column_value 设置上。

来自文档的描述:

When set to true, uses the defined tracking_column value as the :sql_last_value. When set to false, :sql_last_value reflects the last time the query was executed.

这意味着:sql_last_value 不是指 last_run_metadata_path 中的值,而是指 tracking_column-value 中的值。当您重新启动 Logstash 时,该值在第一次执行之前为 gone/unknown。因此该值默认为 0,Logstash 获取所有记录。

因此,如果您希望 :sql_last_value 在重启后仍然存在,您应该只依赖 last_run_metadata_path 并删除 use_column_value 设置。

另一个可能对您有用的方向 - Logstash 应该在 <home_folder>/.logstash_jdbc_last_run 下创建一个文件以在运行之间保留此值。它被创建了吗?如果这样分析它可能会有所帮助。