2017-05-29 79 views
1

我目前使用Ruby的Net :: HTTP库来查询Newrelic端点。最近,这些查询已经开始返回404了。我通过curl测试了我的确切查询 - 希望能够得到更详细的错误消息 - 但通过curl查询实际上会返回200与预期数据。所以这个查询确实有效,并且我对Net :: HTTP为什么会在这时返回一个404有点不知所措。Net :: HTTP to Newrelic返回404,但curl返回200

以下是我到目前为止的一些代码片段,如果任何人都可以提供任何有关进一步尝试的建议,那将非常感谢!

环境

  • 的JRuby 1.7.26(因此Ruby 1.9.3p551)
  • 滑轨3.2.21

Ruby代码

uri = URI('https://NEWRELIC_HOST/PATH/ACCOUNT_ID/query') 
parameters = { :nrql => NRQL_QUERY_STRING } 
uri.query = URI.encode_www_form(parameters) 

request = Net::HTTP::Get.new(uri.to_s) 
request['X-Query-Key'] = NEWRELIC_QUERY_KEY 

Net::HTTP.start(uri.hostname, uri.port, {:use_ssl => true}) do |http| 
    response = http.request(request) 
end 

这会返回404错误代码每次。我已经尝试了一对有效的Newrelic端点/帐户,每次都是404错误。

卷曲代码

现在,如果我采取相同的请求,并踢它卷曲在命令行上,没有任何问题,我得到的所有数据的200正确返回:

curl -H "X-Query-Key: NEWRELIC_QUERY_KEY" https://NEWRELIC_HOST/PATH/ACCOUNT_ID/query?NRQL_QUERY_STRING 
+0

它是否适用于其他终端而不是newrelic? – philipp

+0

如果你有权访问服务器日志,答案可能在 –

+0

@ philipp是的,我们在一些地方使用它来检索数据,实际上我们使用Net :: HTTP从Newrelic检索其他形式的数据,都工作正常 - 他们都遵循相同的格式。 – Krista

回答

1

尝试改变

request = Net::HTTP::Get.new(uri.to_s) 

request = Net::HTTP::Get.new(uri.request_uri) 
+0

谢谢!你是对的 - 奇怪的是我也偶然发现了它,它确实有效!但是现在我只是想了解它为什么会崩溃......我们在我们所有的Net :: HTTP调用中都使用了uri.to_s,并且它一直工作 - 事实上它仍然适用于所有其他API调用 - 并且有一个他们中的很多。 – Krista

+0

另外值得一提的是,Newrelic技术支持能够使用我们的代码重现我们的问题,并且能够通过简单地使用'Net :: HTTP :: Get.new(uri)'来修复它 - 但实际上会导致其他地方的错误,我目前也试图追查。我们最终可能会改变所有地方使用'uri.request_uri',但我也很想知道为什么会发生这种情况:) – Krista