Advertisement
Guest User

yandex tank psycopg gun example

a guest
Nov 8th, 2016
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.84 KB | None | 0 0
  1. import json
  2. import logging
  3. #import sys
  4. #sys.path.append('/usr/lib/python2.7/dist-packages/')
  5. #import psycopg2
  6. import os
  7. from psycopg2.pool import ThreadedConnectionPool
  8.  
  9. gun_log = logging.getLogger(__name__)
  10. gun_log.setLevel(logging.INFO)
  11. fh = logging.FileHandler('%s.log' % __name__)
  12. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  13. fh.setFormatter(formatter)
  14. gun_log.addHandler(fh)
  15. gun_log.propagate=False
  16.  
  17. class ProcessSafePoolManager:
  18.  
  19.     def __init__(self, *args, **kwargs):
  20.         self.last_seen_process_id = os.getpid()
  21.         self.args = args
  22.         self.kwargs = kwargs
  23.         self._init()
  24.  
  25.     def _init(self):
  26.         self._pool = ThreadedConnectionPool(*self.args, **self.kwargs)
  27.  
  28.     def getconn(self):
  29.         current_pid = os.getpid()
  30.         if not (current_pid == self.last_seen_process_id):
  31.             self._init()
  32.             self.last_seen_process_id = current_pid
  33.         return self._pool.getconn()
  34.  
  35.     def putconn(self, conn, cl):
  36.         return self._pool.putconn(conn, close=cl)
  37.  
  38.     def closeall(self):
  39.         return self._pool.closeall()
  40.  
  41. def select(pool, query, params):
  42.     try:
  43.         pctx = pool.getconn()
  44.         c = pctx.cursor()
  45.         c.execute(query, params)
  46.         results_count = len(c.fetchall())
  47.         pctx.commit()
  48.         c.close()
  49.         if results_count>0:
  50.             return 0, 200, results_count
  51.         else:
  52.             return 0, 404, results_count
  53.     except Exception as e:
  54.         gun_log.error("Query failed: %s\n%s", query, e)
  55.         return 1, 0, None
  56.  
  57.     finally:
  58.         pool.putconn(pctx, False)
  59.  
  60.  
  61. class LoadTest(object):
  62.     def __init__(self, gun):
  63.         self.gun = gun
  64.         self.sql_pool = None
  65.         self.log_empty = int(self.gun.get_option('log_empty', '0'))
  66.         self.host = self.gun.get_option('host')
  67.         self.port = self.gun.get_option('port', '6432')
  68.         self.db = self.gun.get_option('db')
  69.         return self._pool.closeall()
  70.  
  71. def select(pool, query, params):
  72.     try:
  73.         pctx = pool.getconn()
  74.         c = pctx.cursor()
  75.         c.execute(query, params)
  76.         results_count = len(c.fetchall())
  77.         pctx.commit()
  78.         c.close()
  79.         if results_count>0:
  80.             return 0, 200, results_count
  81.         else:
  82.             return 0, 404, results_count
  83.     except Exception as e:
  84.         gun_log.error("Query failed: %s\n%s", query, e)
  85.         return 1, 0, None
  86.  
  87.     finally:
  88.         pool.putconn(pctx, False)
  89.  
  90.  
  91. class LoadTest(object):
  92.     def __init__(self, gun):
  93.         self.gun = gun
  94.         self.sql_pool = None
  95.         self.log_empty = int(self.gun.get_option('log_empty', '0'))
  96.         self.host = self.gun.get_option('host')
  97.         self.port = self.gun.get_option('port', '6432')
  98.         self.db = self.gun.get_option('db')
  99.         self.user = self.gun.get_option('user')
  100.         self.password = self.gun.get_option('password')
  101.         self.tpls = {'select1' : "SELECT %(num)s",
  102.                      'select2' : "SELECT %(str)s"}
  103.  
  104.     def select(self, missile):
  105.         try:
  106.             tpl, params = missile.split('\t')
  107.             query = self.tpls[tpl]
  108.             params = json.loads(params)
  109.             with self.gun.measure(tpl) as sample:
  110.                 sample["net_code"], sample["proto_code"], results = select(self.sql_pool, query, params)
  111.                 gun_log.info("AMMO %s, %s, %s\n", query, params, results)
  112.         except Exception as e:
  113.             gun_log.error('Scenario failed with %s', e, exc_info=True)
  114.  
  115.     def setup(self, settings):
  116.         self.sql_pool = ProcessSafePoolManager(1, 1, host=self.host, port=self.port, database=self.db, user=self.user, password=self.password)
  117.         gun_log.info('Pool created')
  118.  
  119.     def teardown(self):
  120.         self.sql_pool.closeall()
  121.         gun_log.info('Pool closed')
  122.         os._exit(0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement