带有 logstash http-poller 的动态 URL 参数
dynamic URL parameters with logstash http-poller
我想使用 logstash 的 http-poller 输入来使用返回 json 文档数组的网络服务,以将数据加载到 elasticsearch 中。为此,网络服务 GET URL 需要在请求之间使用 URL 查询参数进行更新。
例如,Web 服务采用指定的日期范围作为开始和结束参数,并将响应限制为 1000 个结果。首次加载数据时,我希望 logstash 不断调用 Web 服务,并将开始时间设置为上次请求的最新时间戳,直到加载所有数据。
澄清一下,第一个 HTTP GET 请求应该类似于 webserviceurl?start=2015-01-01T00:00:00
。假设响应中的最新文档具有时间戳 2015-01-01T21:55:34。然后下一个 HTTP GET 请求应该看起来像 webserviceurl?start=2015-01-01T21:55:34
logstash 和 http-poller 输入是否可行?
这目前不可能,但this issue请求增强。
目前,http_poller 在许多其他 Logstash 输入插件中没有状态概念。
如 Event Dependent Configuration 中所述:
Some of the configuration options in Logstash require the existence of
fields in order to function. Because inputs generate events, there are
no fields to evaluate within the input block—they do not exist yet!
没有什么比我们可以在输入中做的变量声明更好的了。一个解决方法是用日期定义 env 变量,例如。关于 windows(powershell 脚本)-
$env:startDate=(Get-Date).AddDays(-1).ToString('yyyy-MM-dd')
$env:endDate=(Get-Date).AddDays(0).ToString('yyyy-MM-dd')
然后我们可以将这些变量用作 url 中的 ${startDate} 。然而,一旦 logstash 启动,日期将保持不变。猜猜我们需要每天重新启动 logstash 脚本才能获取新的日期值。
另一种方法是编写一个代理网络服务,它可能会使用 java 或其他语言,其中 java class 可以用变量声明,然后调用实际的网络服务和 returns 对 logstash 脚本的响应。
自 2016 年以来,此问题一直在 logstash 中悬而未决...不确定为什么无法解决!
肮脏的解决方法
我的用例
调用 GitLab API 以通过调用带有参数 after
和 before
的 URL 来获取某些事件的 JSON 数组:
curl -XGET "https://gitlab.com/api/v4/projects/<Project-ID-here>/events?target_type=issue&after=2020-04-14&before=2020-04-17" -H "PRIVATE-TOKEN: GitLab-Private-Token-Here"
遵循的步骤
首先,使用文件输入插件读取给定文件夹内的所有文件,如:
input {
# Read files: /home/thakur/gitlab_events/2020.04.14.json
file {
path => "/home/thakur/gitlab_events/*"
codec => "json"
mode => "read"
#exit_after_read => true # it has a Bug
close_older => 10
sincedb_path => "/dev/null"
}
}
output {
stdout { codec => rubydebug }
#elasticsearch {} # or wherever you want
}
之后,我创建了一个 Shell 脚本并使用 Cron 条目创建了它的日常文件:
#!/bin/bash
today=$(date -d '-0 day' '+%Y-%m-%d')
yesterday=$(date -d '-1 day' '+%Y-%m-%d')
day_before_yesterday=$(date -d '-2 day' '+%Y-%m-%d')
url="https://gitlab.com/api/v4/projects/<PROJECT-ID-HERE>/events?target_type=issue&after=$day_before_yesterday&before=$today"
curl -XGET $url -H "PRIVATE-TOKEN: YOUR-TOKEN-HERE" > /home/thakur/gitlab_events/$yesterday.json
我想使用 logstash 的 http-poller 输入来使用返回 json 文档数组的网络服务,以将数据加载到 elasticsearch 中。为此,网络服务 GET URL 需要在请求之间使用 URL 查询参数进行更新。
例如,Web 服务采用指定的日期范围作为开始和结束参数,并将响应限制为 1000 个结果。首次加载数据时,我希望 logstash 不断调用 Web 服务,并将开始时间设置为上次请求的最新时间戳,直到加载所有数据。
澄清一下,第一个 HTTP GET 请求应该类似于 webserviceurl?start=2015-01-01T00:00:00
。假设响应中的最新文档具有时间戳 2015-01-01T21:55:34。然后下一个 HTTP GET 请求应该看起来像 webserviceurl?start=2015-01-01T21:55:34
logstash 和 http-poller 输入是否可行?
这目前不可能,但this issue请求增强。
目前,http_poller 在许多其他 Logstash 输入插件中没有状态概念。
如 Event Dependent Configuration 中所述:
Some of the configuration options in Logstash require the existence of fields in order to function. Because inputs generate events, there are no fields to evaluate within the input block—they do not exist yet!
没有什么比我们可以在输入中做的变量声明更好的了。一个解决方法是用日期定义 env 变量,例如。关于 windows(powershell 脚本)-
$env:startDate=(Get-Date).AddDays(-1).ToString('yyyy-MM-dd')
$env:endDate=(Get-Date).AddDays(0).ToString('yyyy-MM-dd')
然后我们可以将这些变量用作 url 中的 ${startDate} 。然而,一旦 logstash 启动,日期将保持不变。猜猜我们需要每天重新启动 logstash 脚本才能获取新的日期值。
另一种方法是编写一个代理网络服务,它可能会使用 java 或其他语言,其中 java class 可以用变量声明,然后调用实际的网络服务和 returns 对 logstash 脚本的响应。
自 2016 年以来,此问题一直在 logstash 中悬而未决...不确定为什么无法解决!
肮脏的解决方法
我的用例
调用 GitLab API 以通过调用带有参数 after
和 before
的 URL 来获取某些事件的 JSON 数组:
curl -XGET "https://gitlab.com/api/v4/projects/<Project-ID-here>/events?target_type=issue&after=2020-04-14&before=2020-04-17" -H "PRIVATE-TOKEN: GitLab-Private-Token-Here"
遵循的步骤
首先,使用文件输入插件读取给定文件夹内的所有文件,如:
input {
# Read files: /home/thakur/gitlab_events/2020.04.14.json
file {
path => "/home/thakur/gitlab_events/*"
codec => "json"
mode => "read"
#exit_after_read => true # it has a Bug
close_older => 10
sincedb_path => "/dev/null"
}
}
output {
stdout { codec => rubydebug }
#elasticsearch {} # or wherever you want
}
之后,我创建了一个 Shell 脚本并使用 Cron 条目创建了它的日常文件:
#!/bin/bash
today=$(date -d '-0 day' '+%Y-%m-%d')
yesterday=$(date -d '-1 day' '+%Y-%m-%d')
day_before_yesterday=$(date -d '-2 day' '+%Y-%m-%d')
url="https://gitlab.com/api/v4/projects/<PROJECT-ID-HERE>/events?target_type=issue&after=$day_before_yesterday&before=$today"
curl -XGET $url -H "PRIVATE-TOKEN: YOUR-TOKEN-HERE" > /home/thakur/gitlab_events/$yesterday.json