Mercurial > hg > speedtest
diff README.md @ 0:26e919a36f86 default tip
speedtest containerized dispatching software
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Thu, 09 Feb 2017 09:47:04 -0800 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README.md Thu Feb 09 09:47:04 2017 -0800 @@ -0,0 +1,200 @@ +# Speedtest + +## The Pattern + +`speedtest` +will use this pattern for outer loop testing: + +- a [Docker](http://docker.io/) container is created from a + `speedtest` script, + and a docker + [CMD] + (https://docs.docker.com/v1.8/reference/builder/#cmd) + that will run + the appropriate test and post a JSON blob to an + [Elasticsearch](https://www.elastic.co/) node + +- the Docker container is dispatched to a container service + such that it may be run at + cloud scale and from a variety of regions + +- the test [CMD] + (http://docs.docker.com/engine/reference/builder/#cmd) + of the container contains steps that will generate + JSON data and post this to an Elasticsearch node. This + Elasticsearch data may then be analyzed and utilized for reporting + of system status. + +This pattern is of general utility for blackbox testing and monitoring +of a web system under test. Monitoring may be performed in a continuous +and ongoing basis, the Elasticsearch data combed for performance information. + + +## Installation + +`speedtest` follows fairly standard +[python packaging] +(https://python-packaging-user-guide.readthedocs.org/en/latest/) +practices. We do need other software, like +[docker](http://docker.io), to help us along. + +Let's get started! + + +## What Speedtest Gives You + +`speedtest` attempts to provide a suite of tools for making worldwide +dockerized speedtests a reality. Many of these are provide in terms +of [setuptools](https://pythonhosted.org/setuptools/) +[entry points] +(https://pythonhosted.org/setuptools/setuptools.html#dynamic-discovery-of-services-and-plugins), +including +[console scripts] +(https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation). + +Several console scripts are also installed with `speedtest`. +All provided console scripts utilize +[argparse](https://docs.python.org/2/library/argparse.html) +for their command line interface. Detailed usage information for a +script may be obtained by using the `--help` command line switch. +For example: `speedtest --help` . + + +## About Speedtest + +`speedtest` is a collection of scripts and utilities to make real the +pattern of docker container dispatch for data +gathering via JSON output to Elasticsearch. + +While `Dockerfile`s are a good abstraction layer for building +[linux containers] +(https://en.wikipedia.org/wiki/LXC), +often the run steps must be automated and parameterized. + +## speedtest with local results + +Usage information is available with the `--help` flag: + + speedtest --help + +Arbitrary metadata may be added with the `--variables` flag. While the results processing and information available should be refined, right now we are erring on the side of too much, which is at least fairly flexible. + +To run a speedtest versus the URL http://k0s.org/playground/1M.bin adding the variable `foo` with value of `bar` with local JSON results measuring every 100k, do: + + speedtest --variables foo=bar --format json --chunk $((100*1024)) http://k0s.org/playground/1M.bin + + +## Containers + +### Containerized Download Speed Testing + +`speedtest.py` + +(and, equivalently, the `speedtest` [console script] +(http://python-packaging.readthedocs.org/en/latest/command-line-scripts.html#the-console-scripts-entry-point)) +measures download speed over time given a URL: + + # speedtest http://k0s.org/playground/1M.bin + ... + {"duration": 1.7867929935455322, "cumulative": 586848, "speed": 209367, "size": 1048576} + + +### Containerized Dispatching + +- pull the Docker image from a container registry +- run the Docker image + +### Container Registry + +In order to make use of containerized dispatch, you may want a +[docker registry](https://docs.docker.com/registry/): + +- https://docs.docker.com/registry/deploying/ +- https://www.docker.com/docker-trusted-registry +- https://github.com/docker/distribution +- https://www.docker.com/aws + +[Docker hub](https://hub.docker.com/) +has an official [Docker](https://www.docker.com) +repository for a +[Docker registry] +(https://hub.docker.com/_/registry/). How meta is that? You can get +started just by running: + + docker run registry:2 + + +## Elasticsearch + +_"Elasticsearch is a search server based on Lucene. It provides a +distributed, multitenant-capable full-text search engine with a HTTP +web interface and schema-free JSON documents. Elasticsearch is +developed in Java and is released as open source under the terms of +the Apache License."_, +[Wikipedia](https://en.wikipedia.org/wiki/Elasticsearch) + +The schema-free data store together with the easy RESTful interface +make [Elasticsearch] +(https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html) +a great place for `speedtest` to put its results. + +There is a docker container for Elasticsearch available: +https://hub.docker.com/_/elasticsearch/ + +The results of `speedtest` may be posted to Elasticsearch: + + # curl -XPOST localhost:9200/speedtest/results?pretty -d "$(speedtest http://k0s.org/playground/1M.bin | tail -n 1)" + { + "_index" : "speedtest", + "_type" : "results", + "_id" : "AVGNmWMTVkaacKUEikLl", + "_version" : 1, + "_shards" : { + "total" : 2, + "successful" : 1, + "failed" : 0 + }, + "created" : true + } + +However, for lots of data we probably want to use the +[bulk API] +(https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html) + + # speedtest 'http://k0s.org/playground/1M.bin' --fmt elasticsearch --chunk $((1024*1024)) -o 'http://1.2.3.4:32793/speedtest/results/_bulk' + {"took":1,"errors":false,"items":[{"create":{"_index":"speedtest","_type":"results","_id":"AVVU7PIeZtDhCquHQrZV","_version":1,"status":201}}]} + +Note that the index and type *must* be specified in the output URL for this to work. +See https://www.elastic.co/blog/index-vs-type for clarification of why this is a +good thing. + + +JSON blobs are uploaded to an Elasticsearch instance. + + +## Links + + , , + |`-._ _.-'| + \ `-' / + `-._ _.-' + `#' + ~~~~~~~~~~~~~ + +[Docker](http://docker.com/): + +- https://docs.docker.com/machine/get-started/ +- https://github.com/victorlin/crane +- https://docker-py.readthedocs.org/en/latest/ + + +Elasticsearch: +- [The Definitive Guide](https://www.elastic.co/guide/en/elasticsearch/guide/index.html) +- https://www.elastic.co/guide/en/elasticsearch/reference/current/_modifying_your_data.html +- https://hub.docker.com/_/elasticsearch/ +- [Python Elasticsearch Client] + (http://elasticsearch-py.readthedocs.org/en/master/index.html) +- https://bitquabit.com/post/having-fun-python-and-elasticsearch-part-1/ + + +[Jeff Hammel](https://hub.docker.com/u/jehammel/)