Clean up docs/environment etc.

This commit is contained in:
Dave Shawley 2016-01-19 11:43:24 -05:00
parent abfd14d0f0
commit 31db53a6a1
3 changed files with 88 additions and 45 deletions

View file

@ -11,29 +11,68 @@ Adjust counter and timer metrics in InfluxDB or Graphite using the same API.
class MyHandler(metrics.StatsdMixin, mediatype.ContentMixin,
web.RequestHandler):
def initialize(self):
super(MyHandler, self).initialize()
self.db = queries.TornadoSession(os.environ['MY_PGSQL_DSN'])
def initialize(self):
super(MyHandler, self).initialize()
self.db = queries.TornadoSession(os.environ['MY_PGSQL_DSN'])
@gen.coroutine
def get(self, obj_id):
with self.execution_timer('dbquery.get'):
result = yield self.db.query('SELECT * FROM foo WHERE id=%s',
obj_id)
self.send_response(result)
@gen.coroutine
def get(self, obj_id):
with self.execution_timer('dbquery', 'get'):
result = yield self.db.query('SELECT * FROM foo WHERE id=%s',
obj_id)
self.send_response(result)
This simple handler will emit a timer metric that identifies each call to the
``get`` method as well as a separate metric for the database query. Switching
from using `statsd`_ to `InfluxDB`_ is simply a matter of switch from the
``metrics.StatsdMixin`` to the ``metrics.InfluxDBMixin``.
The mix-in is configured through the ``tornado.web.Application`` settings
property using a key defined by the specific mix-in. The following snippet
configures the StatsD mix-in from common environment variables:
.. code-block:: python
import os
from sprockets.mixins import metrics
from tornado import web
def make_application():
settings = {
metrics.StatsdMixin.SETTINGS_KEY: {
'namespace': 'my-application',
'host': os.environ.get('STATSD_HOST', '127.0.0.1'),
'port': os.environ.get('STATSD_PORT', '8125'),
}
}
return web.Application([
# insert handlers here
], **settings)
Development Quickstart
----------------------
.. code-block:: bash
$ python3.4 -mvenv env
$ env/bin/pip install -r requires/development.txt
$ . ./env/bin/activate
(env)$ pip install -r requires/development.txt
(env)$ nosetests
test_that_cached_socket_is_used (tests.StatsdMethodTimingTests) ... ok
test_that_counter_accepts_increment_value (tests.StatsdMethodTimingTests) ... ok
test_that_counter_increment_defaults_to_one (tests.StatsdMethodTimingTests) ... ok
test_that_default_prefix_is_stored (tests.StatsdMethodTimingTests) ... ok
test_that_execution_timer_records_time_spent (tests.StatsdMethodTimingTests) ... ok
test_that_http_method_call_is_recorded (tests.StatsdMethodTimingTests) ... ok
----------------------------------------------------------------------
Ran 6 tests in 1.089s
OK
(env)$ ./setup.py build_sphinx -q
running build_sphinx
(env)$ open build/sphinx/html/index.html
.. _statsd: https://github.com/etsy/statsd
.. _InfluxDB: https://influxdata.com

View file

@ -11,7 +11,7 @@ run the test suite, update the documentation, and everything else that is
involved in contributing. The easiest way to do that is to create a virtual
environment for your endevours::
$ virtualenv -p python2.7 env
$ python3.4 -mvenv env
Don't worry about writing code against previous versions of Python unless
you you don't have a choice. That is why we run our tests through `tox`_.
@ -45,53 +45,48 @@ installed python version and report not only the test result but the
test coverage as well::
$ ./setup.py nosetests
running nosetests
running egg_info
writing dependency_links to sprockets.http.egg-info/dependency_links.txt
writing top-level names to sprockets.http.egg-info/top_level.txt
writing sprockets.http.egg-info/PKG-INFO
reading manifest file 'sprockets.http.egg-info/SOURCES.txt'
writing sprockets.mixins.metrics.egg-info/PKG-INFO
writing top-level names to sprockets.mixins.metrics.egg-info/top_level.txt
writing dependency_links to sprockets.mixins.metrics.egg-info/dependency_links.txt
writing namespace_packages to sprockets.mixins.metrics.egg-info/namespace_packages.txt
reading manifest file 'sprockets.mixins.metrics.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no previously-included files matching '__pycache__'...
warning: no previously-included files matching '*.swp' found ...
writing manifest file 'sprockets.http.egg-info/SOURCES.txt'
...
writing manifest file 'sprockets.mixins.metrics.egg-info/SOURCES.txt'
test_that_cached_socket_is_used (tests.StatsdMethodTimingTests) ... ok
test_that_counter_accepts_increment_value (tests.StatsdMethodTimingTests) ... ok
test_that_counter_increment_defaults_to_one (tests.StatsdMethodTimingTests) ... ok
test_that_default_prefix_is_stored (tests.StatsdMethodTimingTests) ... ok
test_that_execution_timer_records_time_spent (tests.StatsdMethodTimingTests) ... ok
test_that_http_method_call_is_recorded (tests.StatsdMethodTimingTests) ... ok
Name Stmts Miss Branch BrMiss Cover Missing
----------------------------------------------------------------------
...
----------------------------------------------------------------------
TOTAL 95 2 59 2 97%
----------------------------------------------------------------------
Ran 44 tests in 0.054s
Ran 6 tests in 1.080s
OK
That's the quick way to run tests. The slightly longer way is to run
the `detox`_ utility. It will run the test suite against all of the
supported python versions in parallel. This is essentially what Travis-CI
the `tox`_ utility. It will run the test suite against all of the supported
python versions in parallel. This is essentially what Travis-CI
will do when you issue a pull request anyway::
$ env/bin/detox
py27 recreate: /.../sprockets.http/build/tox/py27
GLOB sdist-make: /.../sprockets.http/setup.py
py34 recreate: /.../sprockets.http/build/tox/py34
py27 installdeps: -rtest-requirements.txt, mock
py34 installdeps: -rtest-requirements.txt
py27 inst: /.../sprockets.http/build/tox/dist/sprockets.http-0.0.0.zip
py27 runtests: PYTHONHASHSEED='2156646470'
py27 runtests: commands[0] | /../sprockets.http/build/tox/py27/bin/nosetests
py34 inst: /../sprockets.http/.build/tox/dist/sprockets.http-0.0.0.zip
py34 runtests: PYTHONHASHSEED='2156646470'
py34 runtests: commands[0] | /.../sprockets.http/build/tox/py34/bin/nosetests
_________________________________ summary _________________________________
$ env/bin/tox
GLOB sdist-make: /Users/daves/Source/platform/sprockets.mixins.metrics/setup.py
py27 create: /Users/daves/Source/platform/sprockets.mixins.metrics/build/tox/py27
py27 installdeps: -rrequires/testing.txt
------------------------- >8 ------------------------------------------------------
py27: commands succeeded
py34: commands succeeded
py35: commands succeeded
SKIPPED: pypy: InterpreterNotFound: pypy
congratulations :)
This is what you want to see. Now you can make your modifications and keep
the tests passing.
the tests passing. If you see the "missing interpreter" errors, that means
that you do not have all of the interpreters installed.
Submitting a Pull Request
-------------------------
@ -107,6 +102,5 @@ it back.
.. _flake8: http://flake8.readthedocs.org/
.. _nose: http://nose.readthedocs.org/
.. _sphinx: http://sphinx-doc.org/
.. _detox: http://testrun.org/tox/
.. _tox: http://testrun.org/tox/
.. _virtualenv: http://virtualenv.pypa.io/

10
tox.ini Normal file
View file

@ -0,0 +1,10 @@
[tox]
envlist = py27,py34,py35,pypy
indexserver =
default = https://pypi.python.org/simple
toxworkdir = build/tox
skip_missing_interpreters = True
[testenv]
deps = -rrequires/testing.txt
commands = nosetests []