diff --git a/etc/sample_stacktach_config.sh b/etc/sample_stacktach_config.sh index 72f5c1e..d59a602 100644 --- a/etc/sample_stacktach_config.sh +++ b/etc/sample_stacktach_config.sh @@ -2,6 +2,7 @@ export STACKTACH_DB_NAME="stacktach" export STACKTACH_DB_HOST="" export STACKTACH_DB_USERNAME="root" export STACKTACH_DB_PASSWORD="password" +export STACKTACH_DB_PORT="3306" export STACKTACH_INSTALL_DIR="/srv/www/stacktach/" export STACKTACH_DEPLOYMENTS_FILE="/srv/www/stacktach/stacktach_worker_config.json" diff --git a/manage.py b/manage.py index 3e4eedc..17696b7 100644 --- a/manage.py +++ b/manage.py @@ -1,14 +1,9 @@ #!/usr/bin/env python -from django.core.management import execute_manager -import imp -try: - imp.find_module('settings') # Assumed to be in the same directory. -except ImportError: - import sys - sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__) - sys.exit(1) - -import settings +import os, sys if __name__ == "__main__": - execute_manager(settings) + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "stacktach.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/reports/batch.py b/reports/batch.py new file mode 100644 index 0000000..ea6b6f3 --- /dev/null +++ b/reports/batch.py @@ -0,0 +1,21 @@ +# This is a one-time utility script for backfilling reports. +# Be sure to set up your DJANGO_SETTINGS_MODULE env var first. + +import datetime +import subprocess + +start_date = datetime.date(2013, 2, 17) + +today = datetime.datetime.now().date() +target = today - datetime.timedelta(days=30) + +done = today - start_date +days = done.days + +while start_date != target: + for region in ["dfw", "lon", "ord"]: + cmd = "python pretty.py --utcdate %s --region %s --store --percentile 97" % (start_date, region) + print cmd + subprocess.call(cmd, shell=True) + + start_date = start_date - datetime.timedelta(days=1) diff --git a/reports/pretty.py b/reports/pretty.py index f3227e5..70b620b 100644 --- a/reports/pretty.py +++ b/reports/pretty.py @@ -237,6 +237,12 @@ if __name__ == '__main__': parser.add_argument('--hours', help='Report span in hours. Default: 24', default=24, type=int) + parser.add_argument('--days_back', + help='Report start date. N days back from now. Default: 0', default=0, + type=int) + parser.add_argument('--hours_back', + help='Report start date. N hours back from now. Default: 0', default=0, + type=int) parser.add_argument('--start_hour', help='Starting hour 0-23. Default: 0', default=0, type=int) @@ -252,12 +258,23 @@ if __name__ == '__main__': args = parser.parse_args() yesterday = args.utcdate + days_back = args.days_back + hours_back = args.hours_back percentile = args.percentile hours = args.hours start_hour = args.start_hour store_report = args.store region = args.region + if (not yesterday) and days_back > 0: + yesterday = datetime.datetime.utcnow().date() - \ + datetime.timedelta(days=days_back) + if (not yesterday) and hours_back > 0: + yesterday = datetime.datetime.utcnow() - \ + datetime.timedelta(hours=hours_back) + yesterday = yesterday.replace(minute=0, second=0, microsecond=0) + start_hour = yesterday.hour + start, end, raw_report = make_report(yesterday, start_hour, hours, percentile, store_report, region) details = raw_report[0] diff --git a/settings.py b/settings.py index 01da733..7d0e86a 100644 --- a/settings.py +++ b/settings.py @@ -9,6 +9,7 @@ try: db_host = STACKTACH_DB_HOST db_username = STACKTACH_DB_USERNAME db_password = STACKTACH_DB_PASSWORD + db_port = STACKTACH_DB_PORT install_dir = STACKTACH_INSTALL_DIR except ImportError: db_engine = os.environ.get('STACKTACH_DB_ENGINE', @@ -17,6 +18,7 @@ except ImportError: db_host = os.environ.get('STACKTACH_DB_HOST', "") db_username = os.environ['STACKTACH_DB_USERNAME'] db_password = os.environ['STACKTACH_DB_PASSWORD'] + db_port = os.environ.get('STACKTACH_DB_PORT', "") install_dir = os.environ['STACKTACH_INSTALL_DIR'] DEBUG = False @@ -35,7 +37,7 @@ DATABASES = { 'USER': db_username, 'PASSWORD': db_password, 'HOST': db_host, # Set to empty string for localhost. - 'PORT': '', # Set to empty string for default. + 'PORT': db_port, # Set to empty string for default. } } @@ -139,6 +141,8 @@ INSTALLED_APPS = ( 'stacktach', ) +ALLOWED_HOSTS = ['*'] + # A sample logging configuration. The only tangible logging # performed by this configuration is to send an email to # the site admins on every HTTP 500 error. @@ -150,7 +154,8 @@ LOGGING = { 'handlers': { 'mail_admins': { 'level': 'ERROR', - 'class': 'django.utils.log.AdminEmailHandler' + 'class': 'django.utils.log.AdminEmailHandler', + 'filters': [] } }, 'loggers': { diff --git a/worker/stacktach.sh b/worker/stacktach.sh index 16794fa..271078b 100755 --- a/worker/stacktach.sh +++ b/worker/stacktach.sh @@ -1,4 +1,14 @@ -#!/bin/bash +#!/bin/sh +### BEGIN INIT INFO +# Provides: stacktach +# Required-Start: +# Required-Stop: +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Start/stop stacktach workers +### END INIT INFO + +. /lib/lsb/init-functions WORKDIR=/srv/www/stacktach/app DAEMON=/usr/bin/python @@ -9,16 +19,24 @@ export DJANGO_SETTINGS_MODULE="settings" case "$1" in start) - echo "Starting server" + echo "Starting stacktach workers" cd $WORKDIR /sbin/start-stop-daemon --start --pidfile $PIDFILE --make-pidfile -b --exec $DAEMON $ARGS ;; stop) - echo "Stopping server" + echo "Stopping stacktach workers" /sbin/start-stop-daemon --stop --pidfile $PIDFILE --verbose ;; + restart) + echo "Restarting stacktach workers" + /sbin/start-stop-daemon --stop --pidfile $PIDFILE --retry 5 + /sbin/start-stop-daemon --start --pidfile $PIDFILE --make-pidfile -b --exec $DAEMON $ARGS + ;; + status) + status_of_proc "$DAEMON" "stacktach" && exit 0 || exit $? + ;; *) - echo "Usage: stacktach.sh {start|stop}" + echo "Usage: stacktach.sh {start|stop|restart|status}" exit 1 ;; esac