comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:26e919a36f86
1 # Speedtest
2
3 ## The Pattern
4
5 `speedtest`
6 will use this pattern for outer loop testing:
7
8 - a [Docker](http://docker.io/) container is created from a
9 `speedtest` script,
10 and a docker
11 [CMD]
12 (https://docs.docker.com/v1.8/reference/builder/#cmd)
13 that will run
14 the appropriate test and post a JSON blob to an
15 [Elasticsearch](https://www.elastic.co/) node
16
17 - the Docker container is dispatched to a container service
18 such that it may be run at
19 cloud scale and from a variety of regions
20
21 - the test [CMD]
22 (http://docs.docker.com/engine/reference/builder/#cmd)
23 of the container contains steps that will generate
24 JSON data and post this to an Elasticsearch node. This
25 Elasticsearch data may then be analyzed and utilized for reporting
26 of system status.
27
28 This pattern is of general utility for blackbox testing and monitoring
29 of a web system under test. Monitoring may be performed in a continuous
30 and ongoing basis, the Elasticsearch data combed for performance information.
31
32
33 ## Installation
34
35 `speedtest` follows fairly standard
36 [python packaging]
37 (https://python-packaging-user-guide.readthedocs.org/en/latest/)
38 practices. We do need other software, like
39 [docker](http://docker.io), to help us along.
40
41 Let's get started!
42
43
44 ## What Speedtest Gives You
45
46 `speedtest` attempts to provide a suite of tools for making worldwide
47 dockerized speedtests a reality. Many of these are provide in terms
48 of [setuptools](https://pythonhosted.org/setuptools/)
49 [entry points]
50 (https://pythonhosted.org/setuptools/setuptools.html#dynamic-discovery-of-services-and-plugins),
51 including
52 [console scripts]
53 (https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation).
54
55 Several console scripts are also installed with `speedtest`.
56 All provided console scripts utilize
57 [argparse](https://docs.python.org/2/library/argparse.html)
58 for their command line interface. Detailed usage information for a
59 script may be obtained by using the `--help` command line switch.
60 For example: `speedtest --help` .
61
62
63 ## About Speedtest
64
65 `speedtest` is a collection of scripts and utilities to make real the
66 pattern of docker container dispatch for data
67 gathering via JSON output to Elasticsearch.
68
69 While `Dockerfile`s are a good abstraction layer for building
70 [linux containers]
71 (https://en.wikipedia.org/wiki/LXC),
72 often the run steps must be automated and parameterized.
73
74 ## speedtest with local results
75
76 Usage information is available with the `--help` flag:
77
78 speedtest --help
79
80 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.
81
82 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:
83
84 speedtest --variables foo=bar --format json --chunk $((100*1024)) http://k0s.org/playground/1M.bin
85
86
87 ## Containers
88
89 ### Containerized Download Speed Testing
90
91 `speedtest.py`
92
93 (and, equivalently, the `speedtest` [console script]
94 (http://python-packaging.readthedocs.org/en/latest/command-line-scripts.html#the-console-scripts-entry-point))
95 measures download speed over time given a URL:
96
97 # speedtest http://k0s.org/playground/1M.bin
98 ...
99 {"duration": 1.7867929935455322, "cumulative": 586848, "speed": 209367, "size": 1048576}
100
101
102 ### Containerized Dispatching
103
104 - pull the Docker image from a container registry
105 - run the Docker image
106
107 ### Container Registry
108
109 In order to make use of containerized dispatch, you may want a
110 [docker registry](https://docs.docker.com/registry/):
111
112 - https://docs.docker.com/registry/deploying/
113 - https://www.docker.com/docker-trusted-registry
114 - https://github.com/docker/distribution
115 - https://www.docker.com/aws
116
117 [Docker hub](https://hub.docker.com/)
118 has an official [Docker](https://www.docker.com)
119 repository for a
120 [Docker registry]
121 (https://hub.docker.com/_/registry/). How meta is that? You can get
122 started just by running:
123
124 docker run registry:2
125
126
127 ## Elasticsearch
128
129 _"Elasticsearch is a search server based on Lucene. It provides a
130 distributed, multitenant-capable full-text search engine with a HTTP
131 web interface and schema-free JSON documents. Elasticsearch is
132 developed in Java and is released as open source under the terms of
133 the Apache License."_,
134 [Wikipedia](https://en.wikipedia.org/wiki/Elasticsearch)
135
136 The schema-free data store together with the easy RESTful interface
137 make [Elasticsearch]
138 (https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html)
139 a great place for `speedtest` to put its results.
140
141 There is a docker container for Elasticsearch available:
142 https://hub.docker.com/_/elasticsearch/
143
144 The results of `speedtest` may be posted to Elasticsearch:
145
146 # curl -XPOST localhost:9200/speedtest/results?pretty -d "$(speedtest http://k0s.org/playground/1M.bin | tail -n 1)"
147 {
148 "_index" : "speedtest",
149 "_type" : "results",
150 "_id" : "AVGNmWMTVkaacKUEikLl",
151 "_version" : 1,
152 "_shards" : {
153 "total" : 2,
154 "successful" : 1,
155 "failed" : 0
156 },
157 "created" : true
158 }
159
160 However, for lots of data we probably want to use the
161 [bulk API]
162 (https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html)
163
164 # speedtest 'http://k0s.org/playground/1M.bin' --fmt elasticsearch --chunk $((1024*1024)) -o 'http://1.2.3.4:32793/speedtest/results/_bulk'
165 {"took":1,"errors":false,"items":[{"create":{"_index":"speedtest","_type":"results","_id":"AVVU7PIeZtDhCquHQrZV","_version":1,"status":201}}]}
166
167 Note that the index and type *must* be specified in the output URL for this to work.
168 See https://www.elastic.co/blog/index-vs-type for clarification of why this is a
169 good thing.
170
171
172 JSON blobs are uploaded to an Elasticsearch instance.
173
174
175 ## Links
176
177 , ,
178 |`-._ _.-'|
179 \ `-' /
180 `-._ _.-'
181 `#'
182 ~~~~~~~~~~~~~
183
184 [Docker](http://docker.com/):
185
186 - https://docs.docker.com/machine/get-started/
187 - https://github.com/victorlin/crane
188 - https://docker-py.readthedocs.org/en/latest/
189
190
191 Elasticsearch:
192 - [The Definitive Guide](https://www.elastic.co/guide/en/elasticsearch/guide/index.html)
193 - https://www.elastic.co/guide/en/elasticsearch/reference/current/_modifying_your_data.html
194 - https://hub.docker.com/_/elasticsearch/
195 - [Python Elasticsearch Client]
196 (http://elasticsearch-py.readthedocs.org/en/master/index.html)
197 - https://bitquabit.com/post/having-fun-python-and-elasticsearch-part-1/
198
199
200 [Jeff Hammel](https://hub.docker.com/u/jehammel/)