Set PostgreSQL application_name metadata.

This should allow us to collect more information on where lingering
transactions come from.

Note: this uses an undocumented feature of psycopg2 connection strings
to get around a limitation in the version of psycopg2 we're on. This is
resolved as of v2.4.3 of psycopg2.

http://archives.postgresql.org/psycopg/2011-11/msg00020.php
This commit is contained in:
Neil Williams
2012-12-16 18:24:38 -08:00
parent 102ef36b8b
commit 11bda59611

View File

@@ -21,7 +21,9 @@
###############################################################################
import logging
import os
import random
import socket
import sqlalchemy
import time
import traceback
@@ -29,23 +31,27 @@ import traceback
logger = logging.getLogger('dm_manager')
logger.addHandler(logging.StreamHandler())
APPLICATION_NAME = "reddit@%s:%d" % (socket.gethostname(), os.getpid())
def get_engine(name, db_host='', db_user='', db_pass='', db_port='5432',
pool_size=5, max_overflow=5):
db_port = int(db_port)
host = db_host or ''
arguments = {
"dbname": name,
"host": db_host,
"port": db_port,
"application_name": APPLICATION_NAME,
}
if db_user:
if db_pass:
host = "%s:%s@%s:%s" % (db_user, db_pass, db_host, db_port)
else:
host = "%s@%s:%s" % (db_user, db_host, db_port)
arguments["user"] = db_user
if db_pass:
arguments["password"] = db_pass
dsn = "%20".join("%s=%s" % x for x in arguments.iteritems())
return sqlalchemy.create_engine(
'postgres://%s/%s' % (
host,
name,
),
'postgres:///?dsn=' + dsn,
strategy='threadlocal',
pool_size=int(pool_size),
max_overflow=int(max_overflow),