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
下创建一个文件以在运行之间保留此值。它被创建了吗?如果这样分析它可能会有所帮助。
每当我重新启动 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
下创建一个文件以在运行之间保留此值。它被创建了吗?如果这样分析它可能会有所帮助。