logstash http_poller第一个URL请求的响应应该输入到第二个URL的请求参数

时间:2016-05-25 11:55:13

标签: logstash logstash-grok logstash-configuration

我有两个网址(由于安全问题,我将使用虚拟解释)

 a> https://xyz.company.com/ui/api/token
 b> https://xyz.company.com/request/transaction?date=2016-01-21&token=<tokeninfo>

当你点击提到的网址&#39; a&#39;它将生成一个令牌,让它成为一个16个字符的字符串

然后该标记应用于发出第二个点的请求&#39; b&#39;在令牌参数中

更新

 The second url response is important to me i.e is a JSON response, I need       
 to filter the json data and extract required data and output it to standard 
 output and elastic search.    

有没有办法在logstash中使用插件&#34; http_poller&#34;或任何其他插件。

注意:这些请求网址应该一个接一个地执行,即指向&#39; a&#39;应首先执行网址,并指出&#39; b&#39;接收新令牌后,应立即执行url。

请建议。

1 个答案:

答案 0 :(得分:6)

是的,可以混合使用http_poller输入和http输出。

这是我提出的配置:

input {
   # 1. trigger new token requests every hour
   http_poller {
     urls => {
       token => "https://xyz.company.com/ui/api/token"
     }
     interval => 3600
     add_field => {"token" => "%{message}"}
   }
}
filter {
}
output {
   # 2. call the API
   http {
     http_method => "get"
     url => "https://xyz.company.com/request/transaction?date=2016-01-21&token=%{token}"
   }
}

<强>更新

如果您希望能够获取API调用的内容并将其存储在ES中,则需要一个混合解决方案。您需要设置一个cron,它将调用运行两个HTTP调用的脚本并将结果存储在一个文件中,然后您可以让logstash拖尾该文件并将结果转发给ES。

用于放置cron的shell脚本:

#!/bin/sh

# 1. Get the token
TOKEN=$(curl -s -XGET https://xyz.company.com/ui/api/token)

# 2. Call the API with the token and append JSON to file
curl -s -XGET "https://xyz.company.com/request/transaction?date=2016-01-21&token=$TOKEN" >> api_calls.log

上面的脚本可以使用crontab(或类似的)在cron上设置,有plenty of examples有关如何实现这一点。

然后logstash配置可以非常简单。它只需要拖尾api_calls.log文件并将文档发送到ES

input {
    file {
        path => "api_calls.log"
        start_position => "beginning"
    }
}
filter {
    json {
        source => "message"
    }
}
output {
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "my_index"
        document_type" => "my_type"
    }
    stdout {
        codec => "rubydebug"
    }
}