J'ai écrit ma première application Python avec les API App Engine, il est destiné à surveiller une liste de serveurs et à me prévenir quand l'un d'eux tombe en panne, par envoyer un message à mon iPhone en utilisant Prowl, ou m'envoyer un email, ou les deux.App Engine urlfetch soulève des exceptions quand je pense qu'il ne devrait pas être
Le problème est, quelques fois par semaine, il me signale un serveur est en panne même si ce n'est clairement pas. Je l'ai testé avec des serveurs que je connais devraient être en permanence tout le temps comme google.com ou amazon.com mais je reçois des notifications avec eux aussi.
J'ai une copie du code en cours d'exécution à http://aeservmon.appspot.com, vous pouvez voir que google.com a été ajouté le 3 janvier mais est seulement répertorié comme étant en place pendant 6 jours. Ci-dessous la section pertinente du code de checkservers.py qui fait la vérification avec urlfetch, j'ai supposé que l'exception DownloadError ne serait levée que si le serveur ne pouvait pas être contacté, mais peut-être que je me trompe.
Qu'est-ce qui me manque?
source complet sur GitHub sous mrsteveman1/aeservmon (je ne peux pas poster un lien en tant que nouvel utilisateur, désolé!)
def testserver(self,server):
if server.ssl:
prefix = "https://"
else:
prefix = "http://"
try:
url = prefix + "%s" % server.serverdomain
result = urlfetch.fetch(url, headers = {'Cache-Control' : 'max-age=30'})
except DownloadError:
logging.info('%s could not be reached' % server.serverdomain)
self.serverisdown(server,000)
return
if result.status_code == 500:
logging.info('%s returned 500' % server.serverdomain)
self.serverisdown(server,result.status_code)
else:
logging.info('%s is up, status code %s' % (server.serverdomain,result.status_code))
self.serverisup(server,result.status_code)
MISE A JOUR 21 janvier:
Aujourd'hui, je trouve une des exceptions les journaux:
ApplicationError: 5
Traceback (most recent call last):
File "/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 507, in __call__
handler.get(*groups)
File "/base/data/home/apps/aeservmon/1.339312180538855414/checkservers.py", line 149, in get
self.testserver(server)
File "/base/data/home/apps/aeservmon/1.339312180538855414/checkservers.py", line 106, in testserver
result = urlfetch.fetch(url, headers = {'Cache-Control' : 'max-age=30'})
File "/base/python_lib/versions/1/google/appengine/api/urlfetch.py", line 241, in fetch
return rpc.get_result()
File "/base/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 501, in get_result
return self.__get_result_hook(self)
File "/base/python_lib/versions/1/google/appengine/api/urlfetch.py", line 331, in _get_fetch_result
raise DownloadError(str(err))
DownloadError: ApplicationError: 5
Les plus récents « faux positifs » était à 07h04 HNE il y a moins d'une heure, et il n'y a que la journalisation des messages i AVONS déclenché avec logging.info() dans le journal appengine. Je pourrais essayer de laisser l'exception non gérée mais je crois que j'ai essayé cela il y a quelques semaines et seulement vu le message d'exception de DownloadError avec peu d'autre. Je vais essayer encore une fois maintenant, j'espère que l'exception se déclenchera à nouveau ce soir. – steveatinfincia
Mise à jour de la question avec l'une des exceptions survenues aujourd'hui après la suppression de la gestion des exceptions. Je n'avais pas vu ApplicationError: 5 avant, apparemment cela signifie que la requête n'est pas retournée dans la limite de urlfetch? – steveatinfincia
oui exactement ... le service de récupération peut avoir une latence occasionnelle (en supposant que le serveur cible n'est pas le problème). vous pouvez définir le paramètre 'deadline' à quelque chose comme 60 secondes dans' fetch() ' – jspcal