2016-05-27 4 views
1

Ich muss eine Funktion erstellen, die überprüft, dass Mongo-Server mit der Ping-Funktion ausgeführt werden. Ich habe die Kunden ganz vorne mit dabeiÜberprüfen von Servern mit Motor (Mongodb & Tornado)

clientList = [] 
for value in configuration["mongodbServer"]: 
    client = motor.motor_tornado.MotorClient('mongodb://localhost:{}'.format(value)) 
    clientList.append(client) 

und führen Sie ich diese Funktion (die Konfigurationsdatei Wörterbuch mit Ports Zahlen hat):

class MongoChecker(Checker): 

formatter = 'stashboard.formatters.MongoFormatter' 
def check(self): 
for x in clientList: 
     if x.ping: 
      return x.ping 

und den Fehler i erhalten:

yielded unknown object MotorDatabase(Database(MongoClient([]), 'ping'))\n", 

Ich glaube mein Problem ist, dass ich die Ping-Funktion falsch benutze. Ich kann keine andere Dokumentation zu dieser oder irgendeiner anderen Funktion finden, die überprüft, ob die Server noch laufen. Wenn jemand eine bessere Möglichkeit kennt, den Status mit Motor zu überwachen, bin ich offen. Vielen Dank!

Antwort

2

Zuerst gibt es keine "Ping" -Funktion. Daher denkt der MotorClient, dass Sie versuchen, auf die Datenbank namens "ping" zuzugreifen. Die Datenbank mit dem Namen "ping" wird in der Ausnahme "unbekanntes Objekt" angezeigt. Verwenden Sie für alle MongoDB-Befehle wie "ping" einfach MotorDatabase command method.

Zweitens ist der Motor asynchron. Sie müssen Motor-Methoden in einer Tornado-Coroutine mit der Anweisung "yield" verwenden. Zum Beispiel:

@gen.coroutine 
def check(): 
    try: 
     result = yield client.admin.command({'ping': 1}) 
     print(result) 
    except ConnectionFailure as exc: 
     print(exc) 

Wenn Sie synchron dies aus testen möchten, können Sie die IOLoop gerade lang genug für die Koroutine laufen zu vervollständigen:

from pymongo.errors import ConnectionFailure 
from tornado import gen 
from tornado.ioloop import IOLoop 

import motor.motor_tornado 

client = motor.motor_tornado.MotorClient() 
IOLoop.current().run_sync(check) 

Eine Einführung Koroutinen Tornado finden Refactoring Tornado Coroutines und die Tornado documentation.