def testTrim(self):
     am = ActivityMonitor(history_length=0.1)
     c = FakeConnection()
     c._transferred(1, 2)
     am.closedConnection(c)
     time.sleep(0.2)
     c._transferred(3, 7)
     am.closedConnection(c)
     self.assert_(len(am.log) <= 1)
 def testAddLogEntries(self):
     am = ActivityMonitor(history_length=3600)
     self.assertEqual(len(am.log), 0)
     c = FakeConnection()
     c._transferred(1, 2)
     am.closedConnection(c)
     c._transferred(3, 7)
     am.closedConnection(c)
     self.assertEqual(len(am.log), 2)
예제 #3
0
 def testSetHistoryLength(self):
     am = ActivityMonitor(history_length=3600)
     c = FakeConnection()
     c._transferred(1, 2)
     am.closedConnection(c)
     time.sleep(0.2)
     c._transferred(3, 7)
     am.closedConnection(c)
     self.assertEqual(len(am.log), 2)
     am.setHistoryLength(0.1)
     self.assertEqual(am.getHistoryLength(), 0.1)
     self.assertTrue(len(am.log) <= 1)
예제 #4
0
 def _zodbactivity(self, db, suffix):
     now = time()
     start = now - 15  # Prometheus polls every 15 seconds
     end = now
     zodb = db._getDB()
     if zodb.getActivityMonitor() is None:
         zodb.setActivityMonitor(ActivityMonitor())
     data = zodb.getActivityMonitor().getActivityAnalysis(start=start,
                                                          end=end,
                                                          divisions=1)[0]
     return [
         metric(
             "zodb_connections" + suffix,
             data["connections"],
             "gauge",
             "ZODB connections",
             self.labels(),
         ),
         metric(
             "zodb_load_count" + suffix,
             data["loads"],
             "counter",
             "ZODB load count",
             self.labels(),
         ),
         metric(
             "zodb_store_count" + suffix,
             data["stores"],
             "counter",
             "ZODB store count",
             self.labels(),
         ),
     ]
예제 #5
0
 def open(self, database_name, databases):
     DB = self.createDB(database_name, databases)
     if self.config.connection_class:
         # set the connection class
         DB.klass = self.config.connection_class
     if self.config.class_factory is not None:
         DB.classFactory = self.config.class_factory
     from ZODB.ActivityMonitor import ActivityMonitor
     DB.setActivityMonitor(ActivityMonitor())
     return DB
 def testSetHistoryLength(self):
     am = ActivityMonitor(history_length=3600)
     c = FakeConnection()
     c._transferred(1, 2)
     am.closedConnection(c)
     time.sleep(0.2)
     c._transferred(3, 7)
     am.closedConnection(c)
     self.assertEqual(len(am.log), 2)
     am.setHistoryLength(0.1)
     self.assertEqual(am.getHistoryLength(), 0.1)
     self.assert_(len(am.log) <= 1)
예제 #7
0
 def testTrim(self):
     am = ActivityMonitor(history_length=0.1)
     c = FakeConnection()
     c._transferred(1, 2)
     am.closedConnection(c)
     time.sleep(0.2)
     c._transferred(3, 7)
     am.closedConnection(c)
     self.assertTrue(len(am.log) <= 1)
예제 #8
0
 def testAddLogEntries(self):
     am = ActivityMonitor(history_length=3600)
     self.assertEqual(len(am.log), 0)
     c = FakeConnection()
     c._transferred(1, 2)
     am.closedConnection(c)
     c._transferred(3, 7)
     am.closedConnection(c)
     self.assertEqual(len(am.log), 2)
예제 #9
0
 def openDB(self, options):
     if self.db is not None:
         return self.db
     db_configuration = options.config.database
     db = db_configuration.open()
     connection = db.open()
     root = connection.root()
     app = root.get(ZopePublication.root_name)
     if app is None or not ISchoolToolApplication.providedBy(app):
         connection.close()
         return None
     connection.close()
     provideUtility(db, IDatabase)
     db.setActivityMonitor(ActivityMonitor())
     self.db = db
     return self.db
예제 #10
0
 def _zodbactivity(self, db, suffix):
     now = time()
     start = now - 15  # Prometheus polls every 15 seconds
     end = now
     zodb = db._getDB()
     if zodb.getActivityMonitor() is None:
         zodb.setActivityMonitor(ActivityMonitor())
     data = zodb.getActivityMonitor().getActivityAnalysis(start=start,
                                                          end=end,
                                                          divisions=1)[0]
     return [
         metric('zodb_connections' + suffix, data['connections'], 'gauge',
                'ZODB connections'),
         metric('zodb_load_count' + suffix, data['loads'], 'gauge',
                'ZODB load count'),
         metric('zodb_store_count' + suffix, data['stores'], 'gauge',
                'ZODB store count'),
     ]
예제 #11
0
def includeme(config, db_from_uri=db_from_uri):
    """
    This includeme recognizes a ``zodbconn.uri`` setting in your deployment
    settings and creates a ZODB database if it finds one.  ``zodbconn.uri``
    is the database URI or URIs (either a whitespace-delimited string, a
    carriage-return-delimed string or a list of strings).

    Database is activated with `ZODB.ActivityMonitor.ActivityMonitor`.

    It will also recognize *named* database URIs as long as an unnamed
    database is in the configuration too:

        zodbconn.uri.sessions = file:///home/project/var/Data.fs
    
    """
    # db_from_uri in
    databases = config.registry._zodb_databases = {}
    for name, uri in get_uris(config.registry.settings):
        db = db_from_uri(uri, name,
                         databases)  # side effect: populate "databases"
        db.setActivityMonitor(ActivityMonitor())
예제 #12
0
def includeme(config, db_from_uri=db_from_uri, open=open):
    """
    This includeme recognizes a ``zodbconn.uri`` setting in your deployment
    settings and creates a ZODB database if it finds one.  ``zodbconn.uri``
    is the database URI or URIs (either a whitespace-delimited string, a
    carriage-return-delimed string or a list of strings).

    Database is activated with `ZODB.ActivityMonitor.ActivityMonitor`.

    It will also recognize *named* database URIs as long as an unnamed
    database is in the configuration too:

        zodbconn.uri.sessions = file:///home/project/var/Data.fs

    Use the key ``zodbconn.transferlog`` in the deployment settings to specify
    a filename to write ZODB load/store information to, or leave key's value
    blank to send to stdout.
    """
    databases = config.registry._zodb_databases = {}
    for name, uri in get_uris(config.registry.settings):
        db = db_from_uri(uri, name, databases)
        # ^^ side effect: populate "databases"
        db.setActivityMonitor(ActivityMonitor())
    txlog_filename = config.registry.settings.get('zodbconn.transferlog')
    if txlog_filename is not None:
        if txlog_filename.strip() == '':
            stream = sys.stdout
        else:
            stream = open(txlog_filename, 'a')
        txlog_threshhold = config.registry.settings.get(
            'zodbconn.transferlog_threshhold')
        if txlog_threshhold is not None:
            txlog_threshhold = int(txlog_threshhold)
        transferlog = TransferLog(stream, txlog_threshhold)
        config.add_subscriber(transferlog.start, ZODBConnectionOpened)
        config.add_subscriber(transferlog.end, ZODBConnectionWillClose)
        config.registry._transferlog = transferlog  # for testing only
예제 #13
0
 def testActivityAnalysis(self):
     am = ActivityMonitor(history_length=3600)
     c = FakeConnection()
     c._transferred(1, 2)
     am.closedConnection(c)
     c._transferred(3, 7)
     am.closedConnection(c)
     res = am.getActivityAnalysis(start=0, end=0, divisions=10)
     lastend = 0
     for n in range(9):
         div = res[n]
         self.assertEqual(div['stores'], 0)
         self.assertEqual(div['loads'], 0)
         self.assertTrue(div['start'] > 0)
         self.assertTrue(div['start'] >= lastend)
         self.assertTrue(div['start'] < div['end'])
         lastend = div['end']
     div = res[9]
     self.assertEqual(div['stores'], 9)
     self.assertEqual(div['loads'], 4)
     self.assertTrue(div['start'] > 0)
     self.assertTrue(div['start'] >= lastend)
     self.assertTrue(div['start'] < div['end'])
 def testActivityAnalysis(self):
     am = ActivityMonitor(history_length=3600)
     c = FakeConnection()
     c._transferred(1, 2)
     am.closedConnection(c)
     c._transferred(3, 7)
     am.closedConnection(c)
     res = am.getActivityAnalysis(start=0, end=0, divisions=10)
     lastend = 0
     for n in range(9):
         div = res[n]
         self.assertEqual(div['stores'], 0)
         self.assertEqual(div['loads'], 0)
         self.assert_(div['start'] > 0)
         self.assert_(div['start'] >= lastend)
         self.assert_(div['start'] < div['end'])
         lastend = div['end']
     div = res[9]
     self.assertEqual(div['stores'], 9)
     self.assertEqual(div['loads'], 4)
     self.assert_(div['start'] > 0)
     self.assert_(div['start'] >= lastend)
     self.assert_(div['start'] < div['end'])
예제 #15
0
파일: main.py 프로젝트: l1ph0x/schooltool-2
        if options.restore_manager:
            connection = db.open()
            root = connection.root()
            app = root[ZopePublication.root_name]
            self.restoreManagerUser(app, options.manager_password)
            transaction.commit()
            connection.close()

        # TODO: don't start application when running from command line
        #if options.pack or options.restore_manager:
        #    return db

        self.startApplication(db)

        provideUtility(db, IDatabase)
        db.setActivityMonitor(ActivityMonitor())

        return db

    def main(self, argv=sys.argv):
        options = self.load_options(argv)
        db = self.setup(options)


def main():
    SchoolToolServer().main()


if __name__ == '__main__':
    main()
예제 #16
0
def startup():
    from App.PersistentExtra import patchPersistent
    import Globals  # to set / fetch data
    patchPersistent()
    from Zope2.App import patches
    patches.apply_patches()

    global app

    # Import products
    OFS.Application.import_products()

    configuration = getConfiguration()

    # Open the database
    dbtab = configuration.dbtab
    try:
        # Try to use custom storage
        try:
            m = imp.find_module('custom_zodb', [configuration.testinghome])
        except:
            m = imp.find_module('custom_zodb', [configuration.instancehome])
    except Exception:
        # if there is no custom_zodb, use the config file specified databases
        DB = dbtab.getDatabase('/', is_root=1)
    else:
        m = imp.load_module('Zope2.custom_zodb', m[0], m[1], m[2])
        sys.modules['Zope2.custom_zodb'] = m

        # Get the database and join it to the dbtab multidatabase
        # FIXME: this uses internal datastructures of dbtab
        databases = getattr(dbtab, 'databases', {})
        if hasattr(m, 'DB'):
            DB = m.DB
            databases.update(getattr(DB, 'databases', {}))
            DB.databases = databases
        else:
            DB = ZODB.DB(m.Storage, databases=databases)

    notify(DatabaseOpened(DB))

    Globals.BobobaseName = DB.getName()

    if DB.getActivityMonitor() is None:
        from ZODB.ActivityMonitor import ActivityMonitor
        DB.setActivityMonitor(ActivityMonitor())

    Globals.DB = DB
    Zope2.DB = DB

    # Hook for providing multiple transaction object manager undo support:
    Globals.UndoManager = DB

    Globals.opened.append(DB)
    import ClassFactory
    DB.classFactory = ClassFactory.ClassFactory

    # "Log on" as system user
    newSecurityManager(None, AccessControl.User.system)

    # Set up the CA
    load_zcml()

    # Set up the "app" object that automagically opens
    # connections
    app = App.ZApplication.ZApplicationWrapper(DB, 'Application',
                                               OFS.Application.Application, ())
    Zope2.bobo_application = app

    # Initialize the app object
    application = app()
    OFS.Application.initialize(application)
    if Globals.DevelopmentMode:
        # Set up auto-refresh.
        from App.RefreshFuncs import setupAutoRefresh
        setupAutoRefresh(application._p_jar)
    application._p_jar.close()

    # "Log off" as system user
    noSecurityManager()

    global startup_time
    startup_time = asctime()

    notify(DatabaseOpenedWithRoot(DB))

    Zope2.zpublisher_transactions_manager = TransactionsManager()
    Zope2.zpublisher_exception_hook = zpublisher_exception_hook
    Zope2.zpublisher_validated_hook = validated_hook
    Zope2.__bobo_before__ = noSecurityManager
예제 #17
0
 def __init__(self, zodb_config):
     self.databases = {}
     for name, uri in zodb_config.items():
         db = self.db_from_uri(uri, name, self.databases)
         db.setActivityMonitor(ActivityMonitor())
예제 #18
0
def startup():
    import Globals  # to set / fetch data
    patch_persistent()

    global app

    # Import products
    OFS.Application.import_products()

    configuration = getConfiguration()

    # Open the database
    dbtab = configuration.dbtab
    try:
        # Try to use custom storage
        try:
            m = imp.find_module('custom_zodb', [configuration.testinghome])
        except:
            m = imp.find_module('custom_zodb', [configuration.instancehome])
    except Exception:
        # if there is no custom_zodb, use the config file specified databases
        DB = dbtab.getDatabase('/', is_root=1)
    else:
        m = imp.load_module('Zope2.custom_zodb', m[0], m[1], m[2])
        sys.modules['Zope2.custom_zodb'] = m

        # Get the database and join it to the dbtab multidatabase
        # FIXME: this uses internal datastructures of dbtab
        databases = getattr(dbtab, 'databases', {})
        if hasattr(m, 'DB'):
            DB = m.DB
            databases.update(getattr(DB, 'databases', {}))
            DB.databases = databases
        else:
            DB = ZODB.DB(m.Storage, databases=databases)

    # Force a connection to every configured database, to ensure all of them
    # can indeed be opened. This avoids surprises during runtime when traversal
    # to some database mountpoint fails as the underlying storage cannot be
    # opened at all
    if dbtab is not None:
        for mount, name in dbtab.listMountPaths():
            _db = dbtab.getDatabase(mount)
            _conn = _db.open()
            _conn.close()
            del _conn
            del _db

    notify(DatabaseOpened(DB))

    Globals.BobobaseName = DB.getName()

    if DB.getActivityMonitor() is None:
        from ZODB.ActivityMonitor import ActivityMonitor
        DB.setActivityMonitor(ActivityMonitor())

    Globals.DB = DB
    Zope2.DB = DB

    # Hook for providing multiple transaction object manager undo support:
    Globals.UndoManager = DB

    Globals.opened.append(DB)
    import ClassFactory
    DB.classFactory = ClassFactory.ClassFactory

    # "Log on" as system user
    newSecurityManager(None, AccessControl.User.system)

    # Set up the CA
    load_zcml()

    # Set up the "app" object that automagically opens
    # connections
    app = App.ZApplication.ZApplicationWrapper(DB, 'Application',
                                               OFS.Application.Application, ())
    Zope2.bobo_application = app

    # Initialize the app object
    application = app()
    OFS.Application.initialize(application)
    application._p_jar.close()

    # "Log off" as system user
    noSecurityManager()

    global startup_time
    startup_time = asctime()

    notify(DatabaseOpenedWithRoot(DB))

    Zope2.zpublisher_transactions_manager = TransactionsManager()
    Zope2.zpublisher_exception_hook = zpublisher_exception_hook
    Zope2.zpublisher_validated_hook = validated_hook
    Zope2.__bobo_before__ = noSecurityManager