2017-05-29 2 views
1

J'utilise actuellement la bibliothèque Net :: HTTP de Ruby pour interroger un point de terminaison Newrelic. Récemment, ces requêtes ont commencé à renvoyer 404. J'ai testé ma requête exacte via curl - dans l'espoir d'obtenir peut-être un message d'erreur plus détaillé - mais la requête via curl renvoie en réalité un 200 avec les données attendues. Donc, la requête fonctionne, et je ne sais pas pourquoi Net :: HTTP retournerait un 404 à ce stade.Net :: HTTP à Newrelic renvoie 404, mais curl renvoie 200

Voici quelques extraits de code de ce que j'ai jusqu'à présent, et si quelqu'un peut offrir des suggestions d'autres choses à essayer, ce serait très apprécié!

Environnement:

  • JRuby 07.01.26 (donc Ruby 1.9.3p551)
  • Rails 3.2.21

Code 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 

Cela me renvoie une erreur 404 code à chaque fois. Je l'ai essayé contre quelques points de terminaison/comptes Newrelic valides et chaque fois est une erreur 404.

Code CURL:

Maintenant, si je prends la même demande, et punt à se courber sur la ligne de commande, il n'y a aucun problème, je reçois un 200 avec toutes les données renvoyées correctement:

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

cela fonctionne-t-il pour d'autres points de terminaison que newrelic? – philipp

+0

Si vous avez accès aux journaux du serveur, la réponse peut être –

+0

@philipp Oui, nous l'utilisons dans quelques endroits pour récupérer des données, et en fait nous utilisons Net :: HTTP pour récupérer d'autres formes de données de Newrelic et celles-là fonctionnent tous très bien - ils suivent tous le même format. – Krista

Répondre

1

Essayez de changer

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

à

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

Merci! Vous avez raison - curieusement, j'ai aussi trébuché sur ça et ça marche! Cependant, maintenant j'essaie juste de comprendre pourquoi il s'est cassé ... Nous avons utilisé uri.to_s dans tous nos appels Net :: HTTP et cela a toujours fonctionné - et fonctionne encore pour TOUS nos autres appels API - et il y a un beaucoup d'entre eux. – Krista

+0

Aussi pour ce que ça vaut, le support technique de Newrelic a pu reproduire notre problème en utilisant notre code - et a été capable de le réparer en utilisant simplement 'Net :: HTTP :: Get.new (uri)' - mais cela cause en fait erreur ailleurs pour nous que j'essaie actuellement de retrouver. Nous allons probablement finir par changer tous les points pour utiliser 'uri.request_uri', mais j'aimerais aussi vraiment comprendre pourquoi cela est arrivé :) – Krista