diff --git a/fabfile.py b/fabfile.py index 1818a641d..1856339c0 100644 --- a/fabfile.py +++ b/fabfile.py @@ -790,6 +790,14 @@ def downgrade_pil(): sudo('supervisorctl reload') # kill() +def setup_db_monitor(): + pull() + with cd(env.NEWSBLUR_PATH): + sudo('pip install -r flask/requirements.txt') + put('flask/supervisor_db_montior.conf', '/etc/supervisor/conf.d/db_monitor.conf', use_sudo=True) + sudo('supervisorctl reread') + sudo('supervisorctl update') + # ============== # = Setup - DB = # ============== diff --git a/flask/__init__.py b/flask/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/flask/db_monitor.py b/flask/db_monitor.py new file mode 100644 index 000000000..8daf4236e --- /dev/null +++ b/flask/db_monitor.py @@ -0,0 +1,129 @@ +from flask import Flask, abort +import flask_settings as settings +import psycopg2 +import MySQLdb +import pymongo +import redis +import pyes +app = Flask(__name__) + +@app.route("/db_check/postgres") +def db_check_postgres(): + connect_params = "dbname='%s' user='%s' password='%s' host='%s' port='%s'" % ( + settings.DATABASES['default']['NAME'], + settings.DATABASES['default']['USER'], + settings.DATABASES['default']['PASSWORD'], + settings.DATABASES['default']['HOST'], + settings.DATABASES['default']['PORT'], + ) + try: + conn = psycopg2.connect(connect_params) + except: + print " ---> Postgres can't connect to the database: %s" % connect_params + abort(502) + + cur = conn.cursor() + cur.execute("""SELECT id FROM feeds ORDER BY feeds.id DESC LIMIT 1""") + rows = cur.fetchall() + for row in rows: + return unicode(row[0]) + + abort(404) + +@app.route("/db_check/mysql") +def db_check_mysql(): + connect_params = "dbname='%s' user='%s' password='%s' host='%s' port='%s'" % ( + settings.DATABASES['default']['NAME'], + settings.DATABASES['default']['USER'], + settings.DATABASES['default']['PASSWORD'], + settings.DATABASES['default']['HOST'], + settings.DATABASES['default']['PORT'], + ) + try: + + conn = MySQLdb.connect(host=settings.DATABASES['default']['HOST'], + port=settings.DATABASES['default']['PORT'], + user=settings.DATABASES['default']['USER'], + passwd=settings.DATABASES['default']['PASSWORD'], + db=settings.DATABASES['default']['NAME']) + except: + print " ---> Mysql can't connect to the database: %s" % connect_params + abort(502) + + cur = conn.cursor() + cur.execute("""SELECT id FROM feeds ORDER BY feeds.id DESC LIMIT 1""") + rows = cur.fetchall() + for row in rows: + return unicode(row[0]) + + abort(404) + +@app.route("/db_check/mongo") +def db_check_mongo(): + try: + client = pymongo.MongoClient('mongodb://%s' % settings.MONGO_DB['host']) + db = client.newsblur + except: + abort(502) + + return unicode(db.stories.count()) + +@app.route("/db_check/redis") +def db_check_redis(): + try: + r = redis.Redis(settings.REDIS['host'], db=0) + except: + abort(502) + + randkey = r.randomkey() + if randkey: + return unicode(randkey) + else: + abort(404) + +@app.route("/db_check/redis_story") +def db_check_redis_story(): + try: + r = redis.Redis(settings.REDIS_STORY['host'], db=1) + except: + abort(502) + + randkey = r.randomkey() + if randkey: + return unicode(randkey) + else: + abort(404) + +@app.route("/db_check/redis_sessions") +def db_check_redis_sessions(): + try: + r = redis.Redis(settings.REDIS_SESSIONS['host'], db=5) + except: + abort(502) + + randkey = r.randomkey() + if randkey: + return unicode(randkey) + else: + abort(404) + +@app.route("/db_check/elasticsearch") +def db_check_elasticsearch(): + try: + conn = pyes.ES(settings.ELASTICSEARCH_FEED_HOSTS) + except: + abort(502) + + if conn.indices.exists_index('feeds-index'): + return unicode("Index exists, but didn't try search") + # query = pyes.query.TermQuery("title", "daring fireball") + # results = conn.search(query=query, size=1, doc_types=['feeds-type'], sort="num_subscribers:desc") + # for result in results: + # return unicode(result) + # else: + # abort(404) + else: + abort(404) + +if __name__ == "__main__": + app.run(debug=True) diff --git a/flask/flask_settings.py b/flask/flask_settings.py new file mode 120000 index 000000000..45febbdd5 --- /dev/null +++ b/flask/flask_settings.py @@ -0,0 +1 @@ +../local_settings.py \ No newline at end of file diff --git a/flask/requirements.txt b/flask/requirements.txt new file mode 100644 index 000000000..26e91e000 --- /dev/null +++ b/flask/requirements.txt @@ -0,0 +1,5 @@ +flask==0.10.1 +pymongo==2.6 +psycopg=2.5.4 +redis=2.8.0 +pyes=0.90.1 diff --git a/flask/supervisor_db_monitor.conf b/flask/supervisor_db_monitor.conf new file mode 100644 index 000000000..63b85448e --- /dev/null +++ b/flask/supervisor_db_monitor.conf @@ -0,0 +1,8 @@ +[program:db_monitor] +command=python flask/db_monitor.py +directory=/srv/newsblur +user=sclay +autostart=true +autorestart=true +priority=991 +stopsignal=HUP