好的,我们有一个logstash管道,我们每小时查询一个http轮询器来获取上周的数据。
在我们将数据保存到ES索引之前,我们过滤了以前在索引上的数据,丢弃了那些事件。
最后,我们存储新事件。
现在我们希望管道每年创建一个新的索引,这样我们就可以有序地管理数据,所以我们在输出中添加了一个action =>“create”和一个模板,这样如果ii不存在,索引就会被创建。
这是我们的管道:
input {
http_poller {
urls => {
air_quality => {
url => "https://url_to_data"
method => get
headers => {
Accept => "application/csv"
}
}
}
schedule => { every => "1h" }
codec => line { charset => "UTF-8" }
}
字符串
}
filter {
#If event starts by Station it's first line and we ignore it
if [message] =~ /^Station/ {
drop { }
}
#We tell fieldnames to get from CSV.
csv {
skip_header => "true"
columns => ["station", "title", "latitude", "longitude", "date", "period", "SO2", "NO", "NO2", "CO", "PM10", "O3", "dd", "vv", "TMP", "HR", "PRB", "RS", "LL", "BEN", "TOL", "MXIL", "PM25"]
separator => ","
}
#We assign format and timezone to date
date {
match => ["[date]", "yyyy-MM-dd"]
timezone => "Europe/Madrid"
target => "[date]"
}
#We scape ":" from timezone
mutate { add_field => { "eventDate" => "%{[fecha]}" } }
#And add the scaped character
mutate { gsub => [ "eventDate", ":", "\:" ] }
#We check if there is a repeated event on the index, so we drop it.
elasticsearch {
hosts => "https://our_host_url"
ca_file => "our_http_ca.crt"
api_key => "our_API_KEY"
index => "our-base-inex-name-%{+YYYY}"
query => "period:%{[period]} AND station:%{[station]} AND date:%{[eventDate]}"
}
#Drop repeated events
if [@metadata][total_hits] != 0 {
drop {}
}
#Rename latitude and longitude
mutate {
rename => {
"latitude" => "[situation][lat]"
"longitude" => "[situation][lon]"
}
}
型
}
output {
elasticsearch {
hosts => "https://our_host_url"
cacert => "our_http_ca.crt"
api_key => "our_API_KEY"
index => "our-base-index-name-%{+YYYY}"
action => "create"
template_name => "out-base-template-name"
}
型
}
所以现在我们收到404警告,我们的输出查询试图检查尚未创建的新索引中的先前数据。
我认为我们应该能够通过模板创建索引,然后在过滤器上检查查询,但不知道如何做到这一点。
然而,令我惊讶的是,日志不显示错误,它显示WARNINGS,如果我在过滤器中注解查询部分,系统工作正常并创建索引,如果我再次激活它,对不存在的索引的查询失败(带WARNINGS),索引永远不会创建。我怀疑这是因为WARNINGS避免了所有事件被触发,并且由于没有事件被触发,输出永远不会到达。
对此有什么建议吗?
1条答案
按热度按时间tvmytwxo1#
_search
API中有一个不返回错误的选项,叫做ignore_unavailable
。默认值是false
,这意味着如果查询的索引不存在,请求将返回错误。但是,elasticsearch
过滤器插件没有提供任何方法将此参数设置为true。由于另一个名为
allow_no_indices
的参数默认为true,因此不必查询确切的索引名称,技巧是在名称中添加一个“”,如our-base-index-name-%{+YYYY}*
,这样即使索引不存在也不会出错。或者只是our-base-index-name-*
,因为您的查询已经确定了数据的正确日期范围。