5d0bc6b9c7
New log level "notice" set to python log level 25 maps to syslog priority LOG_NOTICE. Used for some messages in the proxy server, but will be available to all apps using the LogAdapter returned from get_logger. Cleaned up some code in get_logger so that console logging works with log_routes and removed some unneeded bits. NamedFormatter functionality was split between LogAdapter (which now inherits from logging.LoggerAdapter) and TxnFormatter (which now is only responsible for adding the log records txn_id). The proxy server app now configures a separate logger for access line logging. By default it will use the same settings as the regular proxy logger.
135 lines
4.5 KiB
Python
Executable File
135 lines
4.5 KiB
Python
Executable File
#!/usr/bin/python
|
|
# Copyright (c) 2010-2011 OpenStack, LLC.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import logging
|
|
import os
|
|
import sys
|
|
import signal
|
|
import uuid
|
|
from optparse import OptionParser
|
|
|
|
from swift.common.bench import BenchController
|
|
from swift.common.utils import readconf, LogAdapter
|
|
|
|
# The defaults should be sufficient to run swift-bench on a SAIO
|
|
CONF_DEFAULTS = {
|
|
'auth': '',
|
|
'user': '',
|
|
'key': '',
|
|
'object_sources': '',
|
|
'put_concurrency': '10',
|
|
'get_concurrency': '10',
|
|
'del_concurrency': '10',
|
|
'concurrency': '',
|
|
'object_size': '1',
|
|
'num_objects': '1000',
|
|
'num_gets': '10000',
|
|
'delete': 'yes',
|
|
'container_name': uuid.uuid4().hex,
|
|
'num_containers': '20',
|
|
'use_proxy': 'yes',
|
|
'url': '',
|
|
'account': '',
|
|
'devices': 'sdb1',
|
|
'log_level': 'INFO',
|
|
'timeout': '10',
|
|
}
|
|
|
|
SAIO_DEFAULTS = {
|
|
'auth': 'http://saio:11000/v1.0',
|
|
'user': 'test:tester',
|
|
'key': 'testing',
|
|
}
|
|
|
|
if __name__ == '__main__':
|
|
usage = "usage: %prog [OPTIONS] [CONF_FILE]"
|
|
usage += """\n\nConf file with SAIO defaults:
|
|
|
|
[bench]
|
|
auth = http://saio:11000/v1.0
|
|
user = test:tester
|
|
key = testing
|
|
concurrency = 10
|
|
object_size = 1
|
|
num_objects = 1000
|
|
num_gets = 10000
|
|
delete = yes
|
|
"""
|
|
parser = OptionParser(usage=usage)
|
|
parser.add_option('', '--saio', dest='saio', action='store_true',
|
|
default=False, help='Run benchmark with SAIO defaults')
|
|
parser.add_option('-A', '--auth', dest='auth',
|
|
help='URL for obtaining an auth token')
|
|
parser.add_option('-U', '--user', dest='user',
|
|
help='User name for obtaining an auth token')
|
|
parser.add_option('-K', '--key', dest='key',
|
|
help='Key for obtaining an auth token')
|
|
parser.add_option('-u', '--url', dest='url',
|
|
help='Storage URL')
|
|
parser.add_option('-c', '--concurrency', dest='concurrency',
|
|
help='Number of concurrent connections to use')
|
|
parser.add_option('-s', '--object-size', dest='object_size',
|
|
help='Size of objects to PUT (in bytes)')
|
|
parser.add_option('-n', '--num-objects', dest='num_objects',
|
|
help='Number of objects to PUT')
|
|
parser.add_option('-g', '--num-gets', dest='num_gets',
|
|
help='Number of GET operations to perform')
|
|
parser.add_option('-x', '--no-delete', dest='delete', action='store_false',
|
|
help='If set, will not delete the objects created')
|
|
|
|
if len(sys.argv) == 1:
|
|
parser.print_help()
|
|
sys.exit(1)
|
|
options, args = parser.parse_args()
|
|
if options.saio:
|
|
CONF_DEFAULTS.update(SAIO_DEFAULTS)
|
|
if args:
|
|
conf = args[0]
|
|
if not os.path.exists(conf):
|
|
sys.exit("No such conf file: %s" % conf)
|
|
conf = readconf(conf, 'bench', log_name='swift-bench',
|
|
defaults=CONF_DEFAULTS)
|
|
else:
|
|
conf = CONF_DEFAULTS
|
|
parser.set_defaults(**conf)
|
|
options, _junk = parser.parse_args()
|
|
if options.concurrency is not '':
|
|
options.put_concurrency = options.concurrency
|
|
options.get_concurrency = options.concurrency
|
|
options.del_concurrency = options.concurrency
|
|
|
|
def sigterm(signum, frame):
|
|
sys.exit('Termination signal received.')
|
|
signal.signal(signal.SIGTERM, sigterm)
|
|
|
|
logger = logging.getLogger()
|
|
logger.setLevel({
|
|
'debug': logging.DEBUG,
|
|
'info': logging.INFO,
|
|
'warning': logging.WARNING,
|
|
'error': logging.ERROR,
|
|
'critical': logging.CRITICAL}.get(
|
|
options.log_level.lower(), logging.INFO))
|
|
loghandler = logging.StreamHandler()
|
|
logger.addHandler(loghandler)
|
|
logger = LogAdapter(logger, 'swift-bench')
|
|
logformat = logging.Formatter('%(server)s %(asctime)s %(levelname)s '
|
|
'%(message)s')
|
|
loghandler.setFormatter(logformat)
|
|
|
|
controller = BenchController(logger, options)
|
|
controller.run()
|