Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • she/theodolite
1 result
Show changes
Commits on Source (144)
Showing
with 615 additions and 222 deletions
......@@ -131,7 +131,7 @@ lint-helm:
script: helm lint helm/
rules:
- changes:
- helm/*
- helm/**/*
- when: manual
allow_failure: true
......@@ -297,6 +297,34 @@ deploy-uc4-flink:
JAVA_PROJECT_NAME: "uc4-flink"
JAVA_PROJECT_DEPS: "flink-commons"
deploy-uc1-hazelcastjet:
extends: .deploy-benchmarks
variables:
IMAGE_NAME: "theodolite-uc1-hazelcastjet"
JAVA_PROJECT_NAME: "uc1-hazelcastjet"
JAVA_PROJECT_DEPS: "hazelcastjet-commons"
deploy-uc2-hazelcastjet:
extends: .deploy-benchmarks
variables:
IMAGE_NAME: "theodolite-uc2-hazelcastjet"
JAVA_PROJECT_NAME: "uc2-hazelcastjet"
JAVA_PROJECT_DEPS: "hazelcastjet-commons"
deploy-uc3-hazelcastjet:
extends: .deploy-benchmarks
variables:
IMAGE_NAME: "theodolite-uc3-hazelcastjet"
JAVA_PROJECT_NAME: "uc3-hazelcastjet"
JAVA_PROJECT_DEPS: "hazelcastjet-commons"
deploy-uc4-hazelcastjet:
extends: .deploy-benchmarks
variables:
IMAGE_NAME: "theodolite-uc4-hazelcastjet"
JAVA_PROJECT_NAME: "uc4-hazelcastjet"
JAVA_PROJECT_DEPS: "hazelcastjet-commons"
deploy-uc1-beam-flink:
extends: .deploy-benchmarks
variables:
......@@ -449,6 +477,15 @@ smoketest-uc1-beam-samza:
DOCKER_COMPOSE_DIR: "uc1-beam-samza"
JAVA_PROJECT_DEPS: "uc1-beam-samza,uc1-beam,beam-commons,uc1-load-generator,load-generator-commons"
smoketest-uc1-hazelcastjet:
extends: .smoketest-benchmarks
needs:
- deploy-uc1-hazelcastjet
- deploy-uc1-load-generator
variables:
DOCKER_COMPOSE_DIR: "uc1-hazelcastjet"
JAVA_PROJECT_DEPS: "uc1-hazelcastjet,hazelcastjet-commons,uc1-load-generator,load-generator-commons"
smoketest-uc2-kstreams:
extends: .smoketest-benchmarks
needs:
......@@ -485,6 +522,15 @@ smoketest-uc2-beam-samza:
DOCKER_COMPOSE_DIR: "uc2-beam-samza"
JAVA_PROJECT_DEPS: "uc2-beam-samza,uc2-beam,beam-commons,uc2-load-generator,load-generator-commons"
smoketest-uc2-hazelcastjet:
extends: .smoketest-benchmarks
needs:
- deploy-uc2-hazelcastjet
- deploy-uc2-load-generator
variables:
DOCKER_COMPOSE_DIR: "uc2-hazelcastjet"
JAVA_PROJECT_DEPS: "uc2-hazelcastjet,hazelcastjet-commons,uc2-load-generator,load-generator-commons"
smoketest-uc3-kstreams:
extends: .smoketest-benchmarks
needs:
......@@ -512,6 +558,15 @@ smoketest-uc3-beam-samza:
DOCKER_COMPOSE_DIR: "uc3-beam-samza"
JAVA_PROJECT_DEPS: "uc3-beam-samza,uc3-beam,beam-commons,uc3-load-generator,load-generator-commons"
smoketest-uc3-hazelcastjet:
extends: .smoketest-benchmarks
needs:
- deploy-uc3-hazelcastjet
- deploy-uc3-load-generator
variables:
DOCKER_COMPOSE_DIR: "uc3-hazelcastjet"
JAVA_PROJECT_DEPS: "uc3-hazelcastjet,hazelcastjet-commons,uc3-load-generator,load-generator-commons"
smoketest-uc4-kstreams:
extends: .smoketest-benchmarks
needs:
......@@ -548,6 +603,14 @@ smoketest-uc4-beam-samza:
DOCKER_COMPOSE_DIR: "uc4-beam-samza"
JAVA_PROJECT_DEPS: "uc4-beam-samza,uc4-beam,beam-commons,uc4-load-generator,load-generator-commons"
smoketest-uc4-hazelcastjet:
extends: .smoketest-benchmarks
needs:
- deploy-uc4-hazelcastjet
- deploy-uc4-load-generator
variables:
DOCKER_COMPOSE_DIR: "uc4-hazelcastjet"
JAVA_PROJECT_DEPS: "uc4-hazelcastjet,hazelcastjet-commons,uc4-load-generator,load-generator-commons"
# Theodolite Framework
......
cff-version: "1.1.0"
message: "If you use Theodolite, please cite it using these metadata."
authors:
authors:
- family-names: Henning
given-names: "Sören"
orcid: "https://orcid.org/0000-0001-6912-2549"
......@@ -8,13 +8,13 @@ authors:
given-names: Wilhelm
orcid: "https://orcid.org/0000-0001-6625-4335"
title: Theodolite
version: "0.6.4"
version: "0.7.0"
repository-code: "https://github.com/cau-se/theodolite"
license: "Apache-2.0"
doi: "10.1016/j.bdr.2021.100209"
preferred-citation:
type: article
authors:
authors:
- family-names: Henning
given-names: "Sören"
orcid: "https://orcid.org/0000-0001-6912-2549"
......
......@@ -5,10 +5,10 @@
"codeRepository": "https://github.com/cau-se/theodolite",
"dateCreated": "2020-03-13",
"datePublished": "2020-07-27",
"dateModified": "2022-01-24",
"dateModified": "2022-05-11",
"downloadUrl": "https://github.com/cau-se/theodolite/releases",
"name": "Theodolite",
"version": "0.6.4",
"version": "0.7.0",
"description": "Theodolite is a framework for benchmarking the horizontal and vertical scalability of cloud-native applications.",
"developmentStatus": "active",
"relatedLink": [
......
......@@ -9,11 +9,11 @@ source "https://rubygems.org"
# Happy Jekylling!
#gem "jekyll", "~> 4.2.0"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
gem "minima", "~> 2.5"
#gem "minima", "~> 2.5"
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
# gem "github-pages", group: :jekyll_plugins
gem "github-pages", "~> 215", group: :jekyll_plugins
gem "github-pages", group: :jekyll_plugins
#gem "github-pages", "~> 226", group: :jekyll_plugins
# If you have any plugins, put them here!
#group :jekyll_plugins do
#gem "jekyll-feed", "~> 0.12"
......
GEM
remote: https://rubygems.org/
specs:
activesupport (6.0.4)
activesupport (6.0.4.8)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
......@@ -14,44 +14,54 @@ GEM
execjs
coffee-script-source (1.11.1)
colorator (1.1.0)
commonmarker (0.17.13)
ruby-enum (~> 0.5)
concurrent-ruby (1.1.9)
dnsruby (1.61.7)
commonmarker (0.23.4)
concurrent-ruby (1.1.10)
dnsruby (1.61.9)
simpleidn (~> 0.1)
em-websocket (0.5.2)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
ethon (0.14.0)
http_parser.rb (~> 0)
ethon (0.15.0)
ffi (>= 1.15.0)
eventmachine (1.2.7)
execjs (2.8.1)
faraday (1.4.3)
faraday (1.10.0)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
faraday-httpclient (~> 1.0)
faraday-multipart (~> 1.0)
faraday-net_http (~> 1.0)
faraday-net_http_persistent (~> 1.1)
multipart-post (>= 1.2, < 3)
faraday-net_http_persistent (~> 1.0)
faraday-patron (~> 1.0)
faraday-rack (~> 1.0)
faraday-retry (~> 1.0)
ruby2_keywords (>= 0.0.4)
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-multipart (1.0.3)
multipart-post (>= 1.2, < 3)
faraday-net_http (1.0.1)
faraday-net_http_persistent (1.1.0)
ffi (1.15.3)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
faraday-retry (1.0.3)
ffi (1.15.5)
forwardable-extended (2.6.0)
gemoji (3.0.1)
github-pages (215)
github-pages-health-check (= 1.17.2)
jekyll (= 3.9.0)
github-pages (226)
github-pages-health-check (= 1.17.9)
jekyll (= 3.9.2)
jekyll-avatar (= 0.7.0)
jekyll-coffeescript (= 1.1.1)
jekyll-commonmark-ghpages (= 0.1.6)
jekyll-commonmark-ghpages (= 0.2.0)
jekyll-default-layout (= 0.1.4)
jekyll-feed (= 0.15.1)
jekyll-gist (= 1.5.0)
jekyll-github-metadata (= 2.13.0)
jekyll-include-cache (= 0.2.1)
jekyll-mentions (= 1.6.0)
jekyll-optional-front-matter (= 0.3.2)
jekyll-paginate (= 1.1.0)
......@@ -60,53 +70,53 @@ GEM
jekyll-relative-links (= 0.6.1)
jekyll-remote-theme (= 0.4.3)
jekyll-sass-converter (= 1.5.2)
jekyll-seo-tag (= 2.7.1)
jekyll-seo-tag (= 2.8.0)
jekyll-sitemap (= 1.4.0)
jekyll-swiss (= 1.0.0)
jekyll-theme-architect (= 0.1.1)
jekyll-theme-cayman (= 0.1.1)
jekyll-theme-dinky (= 0.1.1)
jekyll-theme-hacker (= 0.1.2)
jekyll-theme-leap-day (= 0.1.1)
jekyll-theme-merlot (= 0.1.1)
jekyll-theme-midnight (= 0.1.1)
jekyll-theme-minimal (= 0.1.1)
jekyll-theme-modernist (= 0.1.1)
jekyll-theme-primer (= 0.5.4)
jekyll-theme-slate (= 0.1.1)
jekyll-theme-tactile (= 0.1.1)
jekyll-theme-time-machine (= 0.1.1)
jekyll-theme-architect (= 0.2.0)
jekyll-theme-cayman (= 0.2.0)
jekyll-theme-dinky (= 0.2.0)
jekyll-theme-hacker (= 0.2.0)
jekyll-theme-leap-day (= 0.2.0)
jekyll-theme-merlot (= 0.2.0)
jekyll-theme-midnight (= 0.2.0)
jekyll-theme-minimal (= 0.2.0)
jekyll-theme-modernist (= 0.2.0)
jekyll-theme-primer (= 0.6.0)
jekyll-theme-slate (= 0.2.0)
jekyll-theme-tactile (= 0.2.0)
jekyll-theme-time-machine (= 0.2.0)
jekyll-titles-from-headings (= 0.5.3)
jemoji (= 0.12.0)
kramdown (= 2.3.1)
kramdown (= 2.3.2)
kramdown-parser-gfm (= 1.1.0)
liquid (= 4.0.3)
mercenary (~> 0.3)
minima (= 2.5.1)
nokogiri (>= 1.10.4, < 2.0)
nokogiri (>= 1.13.4, < 2.0)
rouge (= 3.26.0)
terminal-table (~> 1.4)
github-pages-health-check (1.17.2)
github-pages-health-check (1.17.9)
addressable (~> 2.3)
dnsruby (~> 1.60)
octokit (~> 4.0)
public_suffix (>= 2.0.2, < 5.0)
public_suffix (>= 3.0, < 5.0)
typhoeus (~> 1.3)
html-pipeline (2.14.0)
html-pipeline (2.14.1)
activesupport (>= 2)
nokogiri (>= 1.4)
html-proofer (3.19.2)
html-proofer (3.19.3)
addressable (~> 2.3)
mercenary (~> 0.3)
nokogumbo (~> 2.0)
nokogiri (~> 1.12)
parallel (~> 1.3)
rainbow (~> 3.0)
typhoeus (~> 1.3)
yell (~> 2.0)
http_parser.rb (0.6.0)
http_parser.rb (0.8.0)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
jekyll (3.9.0)
jekyll (3.9.2)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
......@@ -124,12 +134,12 @@ GEM
jekyll-coffeescript (1.1.1)
coffee-script (~> 2.2)
coffee-script-source (~> 1.11.1)
jekyll-commonmark (1.3.1)
commonmarker (~> 0.14)
jekyll (>= 3.7, < 5.0)
jekyll-commonmark-ghpages (0.1.6)
commonmarker (~> 0.17.6)
jekyll-commonmark (~> 1.2)
jekyll-commonmark (1.4.0)
commonmarker (~> 0.22)
jekyll-commonmark-ghpages (0.2.0)
commonmarker (~> 0.23.4)
jekyll (~> 3.9.0)
jekyll-commonmark (~> 1.4.0)
rouge (>= 2.0, < 4.0)
jekyll-default-layout (0.1.4)
jekyll (~> 3.0)
......@@ -140,6 +150,8 @@ GEM
jekyll-github-metadata (2.13.0)
jekyll (>= 3.4, < 5.0)
octokit (~> 4.0, != 4.4.0)
jekyll-include-cache (0.2.1)
jekyll (>= 3.7, < 5.0)
jekyll-mentions (1.6.0)
html-pipeline (~> 2.3)
jekyll (>= 3.7, < 5.0)
......@@ -159,50 +171,50 @@ GEM
rubyzip (>= 1.3.0, < 3.0)
jekyll-sass-converter (1.5.2)
sass (~> 3.4)
jekyll-seo-tag (2.7.1)
jekyll-seo-tag (2.8.0)
jekyll (>= 3.8, < 5.0)
jekyll-sitemap (1.4.0)
jekyll (>= 3.7, < 5.0)
jekyll-swiss (1.0.0)
jekyll-theme-architect (0.1.1)
jekyll (~> 3.5)
jekyll-theme-architect (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-theme-cayman (0.1.1)
jekyll (~> 3.5)
jekyll-theme-cayman (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-theme-dinky (0.1.1)
jekyll (~> 3.5)
jekyll-theme-dinky (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-theme-hacker (0.1.2)
jekyll-theme-hacker (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-theme-leap-day (0.1.1)
jekyll (~> 3.5)
jekyll-theme-leap-day (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-theme-merlot (0.1.1)
jekyll (~> 3.5)
jekyll-theme-merlot (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-theme-midnight (0.1.1)
jekyll (~> 3.5)
jekyll-theme-midnight (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-theme-minimal (0.1.1)
jekyll (~> 3.5)
jekyll-theme-minimal (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-theme-modernist (0.1.1)
jekyll (~> 3.5)
jekyll-theme-modernist (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-theme-primer (0.5.4)
jekyll-theme-primer (0.6.0)
jekyll (> 3.5, < 5.0)
jekyll-github-metadata (~> 2.9)
jekyll-seo-tag (~> 2.0)
jekyll-theme-slate (0.1.1)
jekyll (~> 3.5)
jekyll-theme-slate (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-theme-tactile (0.1.1)
jekyll (~> 3.5)
jekyll-theme-tactile (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-theme-time-machine (0.1.1)
jekyll (~> 3.5)
jekyll-theme-time-machine (0.2.0)
jekyll (> 3.5, < 5.0)
jekyll-seo-tag (~> 2.0)
jekyll-titles-from-headings (0.5.3)
jekyll (>= 3.3, < 5.0)
......@@ -212,12 +224,12 @@ GEM
gemoji (~> 3.0)
html-pipeline (~> 2.2)
jekyll (>= 3.0, < 5.0)
kramdown (2.3.1)
kramdown (2.3.2)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.3)
listen (3.5.1)
listen (3.7.1)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.3.6)
......@@ -225,30 +237,26 @@ GEM
jekyll (>= 3.5, < 5.0)
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
minitest (5.14.4)
minitest (5.15.0)
multipart-post (2.1.1)
nokogiri (1.13.3-x86_64-linux)
nokogiri (1.13.6-x86_64-linux)
racc (~> 1.4)
nokogumbo (2.0.5)
nokogiri (~> 1.8, >= 1.8.4)
octokit (4.21.0)
octokit (4.22.0)
faraday (>= 0.9)
sawyer (~> 0.8.0, >= 0.5.3)
parallel (1.21.0)
parallel (1.22.1)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (4.0.6)
public_suffix (4.0.7)
racc (1.6.0)
rainbow (3.0.0)
rb-fsevent (0.11.0)
rainbow (3.1.1)
rb-fsevent (0.11.1)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.5)
rouge (3.26.0)
ruby-enum (0.9.0)
i18n
ruby2_keywords (0.0.4)
rubyzip (2.3.0)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
safe_yaml (1.0.5)
sass (3.7.4)
sass-listen (~> 4.0.0)
......@@ -269,19 +277,17 @@ GEM
thread_safe (~> 0.1)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.7)
unicode-display_width (1.7.0)
unf_ext (0.0.8.1)
unicode-display_width (1.8.0)
yell (2.2.2)
zeitwerk (2.4.2)
zeitwerk (2.5.4)
PLATFORMS
x86_64-linux
x86_64-linux-musl
DEPENDENCIES
github-pages (~> 215)
github-pages
html-proofer
minima (~> 2.5)
tzinfo (~> 1.2)
tzinfo-data
wdm (~> 0.1.1)
......
......@@ -114,6 +114,13 @@ Resource Types:
A list of resource types that can be scaled for this `benchmark` resource. For each resource type the concrete values are defined in the `execution` object.<br/>
</td>
<td>true</td>
</tr><tr>
<td><b><a href="#benchmarkspecslosindex">slos</a></b></td>
<td>[]object</td>
<td>
List of resource values for the specified resource type.<br/>
</td>
<td>true</td>
</tr><tr>
<td><b><a href="#benchmarkspecsut">sut</a></b></td>
<td>object</td>
......@@ -146,6 +153,15 @@ Resource Types:
<i>Default</i>: <br/>
</td>
<td>false</td>
</tr><tr>
<td><b>waitForResourcesEnabled</b></td>
<td>boolean</td>
<td>
If true, Theodolite waits to create the resource for the SUT until the infrastructure resources are ready, and analogously, Theodolite waits to create the load-gen resource until the resources of the SUT are ready.<br/>
<br/>
<i>Default</i>: false<br/>
</td>
<td>false</td>
</tr></tbody>
</table>
......@@ -727,6 +743,63 @@ The fileSystem resourceSet loads the Kubernetes manifests from the filesystem.
</table>
### benchmark.spec.slos[index]
<sup><sup>[↩ Parent](#benchmarkspec)</sup></sup>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Required</th>
</tr>
</thead>
<tbody><tr>
<td><b>name</b></td>
<td>string</td>
<td>
The name of the SLO.<br/>
</td>
<td>true</td>
</tr><tr>
<td><b>offset</b></td>
<td>integer</td>
<td>
Hours by which the start and end timestamp will be shifted (for different timezones).<br/>
</td>
<td>true</td>
</tr><tr>
<td><b>prometheusUrl</b></td>
<td>string</td>
<td>
Connection string for Promehteus.<br/>
</td>
<td>true</td>
</tr><tr>
<td><b>sloType</b></td>
<td>string</td>
<td>
The type of the SLO. It must match 'lag trend'.<br/>
</td>
<td>true</td>
</tr><tr>
<td><b>properties</b></td>
<td>map[string]string</td>
<td>
(Optional) SLO specific additional arguments.<br/>
<br/>
<i>Default</i>: map[]<br/>
</td>
<td>false</td>
</tr></tbody>
</table>
### benchmark.spec.sut
<sup><sup>[↩ Parent](#benchmarkspec)</sup></sup>
......@@ -1765,7 +1838,7 @@ Contains the Kafka configuration.
</td>
<td>true</td>
</tr><tr>
<td><b><a href="#executionspecload">load</a></b></td>
<td><b><a href="#executionspecloads">loads</a></b></td>
<td>object</td>
<td>
Specifies the load values that are benchmarked.<br/>
......@@ -1778,13 +1851,6 @@ Contains the Kafka configuration.
Specifies the scaling resource that is benchmarked.<br/>
</td>
<td>true</td>
</tr><tr>
<td><b><a href="#executionspecslosindex">slos</a></b></td>
<td>[]object</td>
<td>
List of resource values for the specified resource type.<br/>
</td>
<td>true</td>
</tr><tr>
<td><b>name</b></td>
<td>string</td>
......@@ -1794,6 +1860,13 @@ Contains the Kafka configuration.
<i>Default</i>: <br/>
</td>
<td>false</td>
</tr><tr>
<td><b><a href="#executionspecslosindex">slos</a></b></td>
<td>[]object</td>
<td>
List of SLOs with their properties, which differ from the benchmark definition.<br/>
</td>
<td>false</td>
</tr></tbody>
</table>
......@@ -1906,35 +1979,83 @@ Defines the overall parameter for the execution.
<td><b>repetitions</b></td>
<td>integer</td>
<td>
Numper of repititions for each experiments.<br/>
Number of repititions for each experiment.<br/>
</td>
<td>true</td>
</tr><tr>
<td><b>restrictions</b></td>
<td>[]string</td>
<td><b><a href="#executionspecexecutionstrategy">strategy</a></b></td>
<td>object</td>
<td>
List of restriction strategys used to delimit the search space.<br/>
Defines the used strategy for the execution, either 'LinearSearch', 'BinarySearch' or 'InitialGuessSearch'.<br/>
</td>
<td>true</td>
</tr><tr>
<td><b>strategy</b></td>
<td><b>loadGenerationDelay</b></td>
<td>integer</td>
<td>
Seconds to wait between the start of the SUT and the load generator.<br/>
</td>
<td>false</td>
</tr><tr>
<td><b>metric</b></td>
<td>string</td>
<td>
<br/>
</td>
<td>false</td>
</tr></tbody>
</table>
### execution.spec.execution.strategy
<sup><sup>[↩ Parent](#executionspecexecution)</sup></sup>
Defines the used strategy for the execution, either 'LinearSearch', 'BinarySearch' or 'InitialGuessSearch'.
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Required</th>
</tr>
</thead>
<tbody><tr>
<td><b>name</b></td>
<td>string</td>
<td>
Defines the used strategy for the execution, either 'LinearSearch' or 'BinarySearch'<br/>
<br/>
</td>
<td>true</td>
</tr><tr>
<td><b>loadGenerationDelay</b></td>
<td>integer</td>
<td><b>guessStrategy</b></td>
<td>string</td>
<td>
Seconds to wait between the start of the SUT and the load generator.<br/>
<br/>
</td>
<td>false</td>
</tr><tr>
<td><b>restrictions</b></td>
<td>[]string</td>
<td>
List of restriction strategies used to delimit the search space.<br/>
</td>
<td>false</td>
</tr><tr>
<td><b>searchStrategy</b></td>
<td>string</td>
<td>
<br/>
</td>
<td>false</td>
</tr></tbody>
</table>
### execution.spec.load
### execution.spec.loads
<sup><sup>[↩ Parent](#executionspec)</sup></sup>
......@@ -2019,24 +2140,10 @@ Specifies the scaling resource that is benchmarked.
</tr>
</thead>
<tbody><tr>
<td><b>offset</b></td>
<td>integer</td>
<td>
Hours by which the start and end timestamp will be shifted (for different timezones).<br/>
</td>
<td>true</td>
</tr><tr>
<td><b>prometheusUrl</b></td>
<td>string</td>
<td>
Connection string for Promehteus.<br/>
</td>
<td>true</td>
</tr><tr>
<td><b>sloType</b></td>
<td><b>name</b></td>
<td>string</td>
<td>
The type of the SLO. It must match 'lag trend'.<br/>
The name of the SLO. It must match a SLO specified in the Benchmark.<br/>
</td>
<td>true</td>
</tr><tr>
......@@ -2047,7 +2154,7 @@ Specifies the scaling resource that is benchmarked.
<br/>
<i>Default</i>: map[]<br/>
</td>
<td>false</td>
<td>true</td>
</tr></tbody>
</table>
......
......@@ -91,10 +91,37 @@ filesystem:
- example-service.yaml
```
<!-- ### Before and after actions -->
### Actions
Sometimes it is not sufficient to just define resources that are created and deleted when running a benchmark. Instead, it might be necessary to define certain actions that will be executed before running or after stopping the benchmark.
Theodolite allows to execute commands on running pods. This is similar to `kubectl exec` or Kubernetes' [container lifecycle handlers](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/). Theodolite actions can run before (`beforeActions`) or after `afterActions` all `sut`, `loadGenerator` or `infrastructure` resources are deployed.
For example, the following actions will create a file in a pod with label `app: logger` before the SUT is started and delete if after the SUT is stopped:
```yaml
sut:
resources: # ...
beforeActions:
- selector:
pod:
matchLabels:
app: logger
exec:
command: ["touch", "file-used-by-logger.txt"]
timeoutSeconds: 90
afterActions:
- selector:
pod:
matchLabels:
app: logger
exec:
command: [ "rm", "file-used-by-logger.txt" ]
timeoutSeconds: 90
```
Theodolite checks if all referenced pods are available for the specified actions. That means these pods must either be defined in `infrastructure` or already deployed in the cluster. If not all referenced pods are available, the benchmark will not be set as `Ready`. Consequently, an action cannot be executed on a pod that is defined as an SUT or load generator resource.
*Note: Actions should be used sparingly. While it is possible to define entire benchmarks imperatively as actions, it is considered better practice to define as much as possible using declarative, native Kubernetes resource files.*
<!--
A Benchmark refers to other Kubernetes resources (e.g., Deployments, Services, ConfigMaps), which describe the system under test, the load generator and infrastructure components such as a middleware used in the benchmark. To manage those resources, Theodolite needs to have access to them. This is done by bundling resources in ConfigMaps.
......@@ -116,7 +143,7 @@ If a benchmark is [executed by an Execution](running-benchmarks), these patchers
## Kafka Configuration
Theodolite allows to automatically create and remove Kafka topics for each SLO experiment by setting a `kafkaConfig`.
It `bootstrapServer` needs to point your Kafka cluster and `topics` configures the list of Kafka topics to be created/removed.
`bootstrapServer` needs to point your Kafka cluster and `topics` configures the list of Kafka topics to be created/removed.
For each topic, you configure its name, the number of partitions and the replication factor.
With the `removeOnly: True` property, you can also instruct Theodolite to only remove topics and not create them.
......
## Infrastructure
The necessary infrastructure for an execution can be defined in the benchmark manifests. The related resources are create *before* an execution is started, and removed *after* an execution is finished.
### Example
```yaml
infrastructure:
resources:
- configMap:
name: "example-configmap"
files:
- "uc1-kstreams-deployment.yaml"
```
## Action Commands
Theodolite allows to execute commands on running pods (similar to the `kubectl exec -it <pod-name> -- <command>` command). This commands can be run either before (via so called `beforeActions`) or after (via so called `afterActions`) an experiment is executed.
Theodolite checks if all required pods are available for the specified actions (i.e. the pods must either be defined as infrastructure or already deployed in the cluster). If not all pods/resources are available, the benchmark will not be set as `Ready`. Consequently, an action cannot be executed on a pod that is defined as an SUT or loadGen resource.
### Example
```yaml
# For the system under test
sut:
resources: ...
beforeActions:
- selector:
pod:
matchLabels:
app: busybox1
exec:
command: ["touch", "test-file-sut"]
timeoutSeconds: 90
afterActions:
- selector:
pod:
matchLabels:
app: busybox1
exec:
command: [ "touch", "test-file-sut-after" ]
timeoutSeconds: 90
# analog, for the load generator
loadGenerator:
resources: ...
beforeActions:
- selector:
pod:
matchLabels:
app: busybox1
exec:
command: ["touch", "test-file-loadGen"]
timeoutSeconds: 90
afterActions:
- selector:
pod:
matchLabels:
app: busybox1
exec:
command: [ "touch", "test-file-loadGen-after" ]
timeoutSeconds: 90
```
\ No newline at end of file
apiVersion: v1
entries:
theodolite:
- apiVersion: v2
appVersion: 0.7.0
created: "2022-05-11T13:49:02.491041789+02:00"
dependencies:
- condition: grafana.enabled
name: grafana
repository: https://grafana.github.io/helm-charts
version: 6.17.5
- condition: kube-prometheus-stack.enabled
name: kube-prometheus-stack
repository: https://prometheus-community.github.io/helm-charts
version: 20.0.1
- condition: cp-helm-charts.enabled
name: cp-helm-charts
repository: https://soerenhenning.github.io/cp-helm-charts
version: 0.6.0
- condition: strimzi.enabled
name: strimzi-kafka-operator
repository: https://strimzi.io/charts/
version: 0.28.0
description: Theodolite is a framework for benchmarking the horizontal and vertical
scalability of cloud-native applications.
digest: af10134baa30bb07423f78240fe1c609381e1c616585883cf5d3aded2d86a2b1
home: https://www.theodolite.rocks
maintainers:
- email: soeren.henning@email.uni-kiel.de
name: Sören Henning
url: https://www.se.informatik.uni-kiel.de/en/team/soeren-henning-m-sc
name: theodolite
sources:
- https://github.com/cau-se/theodolite
type: application
urls:
- https://github.com/cau-se/theodolite/releases/download/v0.7.0/theodolite-0.7.0.tgz
version: 0.7.0
- apiVersion: v2
appVersion: 0.6.4
created: "2022-02-16T16:09:11.967649304+01:00"
......@@ -316,4 +351,4 @@ entries:
urls:
- https://github.com/cau-se/theodolite/releases/download/v0.4.0/theodolite-0.4.0.tgz
version: 0.4.0
generated: "2022-02-16T16:09:11.93111234+01:00"
generated: "2022-05-11T13:49:02.423487026+02:00"
......@@ -30,6 +30,6 @@ dependencies:
condition: strimzi.enabled
version: 0.7.0-SNAPSHOT
version: 0.8.0-SNAPSHOT
appVersion: 0.7.0-SNAPSHOT
appVersion: 0.8.0-SNAPSHOT
......@@ -30,6 +30,20 @@ spec:
configMapKeyRef:
name: {{ template "theodolite.fullname" . }}-kafka-metrics
key: kafka-metrics-config.yml
{{- with .Values.strimzi.kafka.nodeSelectorTerms}}
template:
pod:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
{{- toYaml . | nindent 16 }}
{{- end}}
{{- with .Values.strimzi.kafka.resources}}
resources:
{{- toYaml . | nindent 6 }}
{{- end}}
zookeeper:
{{- with .Values.strimzi.zookeeper.replicas }}
......@@ -37,7 +51,16 @@ spec:
{{- toYaml . | nindent 6 }}
{{- end }}
storage:
type: ephemeral
type: ephemeral
{{- with .Values.strimzi.zookeeper.nodeSelectorTerms}}
template:
pod:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
{{- toYaml . | nindent 16 }}
{{- end}}
kafkaExporter: {}
......
{{- if not (index .Values "kube-prometheus-stack" "global" "rbac" "create") -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ template "theodolite.fullname" . }}-kube-prometheus-operator
labels:
app: {{ template "theodolite.fullname" . }}-kube-prometheus-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: {{ template "theodolite.fullname" . }}-kube-prometheus-operator
subjects:
- kind: ServiceAccount
name: {{ template "theodolite.fullname" . }}-kube-prometheus-operator
namespace: {{ .Release.Namespace }}
{{- end }}
{{- if not (index .Values "kube-prometheus-stack" "global" "rbac" "create") -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: {{ template "theodolite.fullname" . }}-kube-prometheus-operator
labels:
app: {{ template "theodolite.name" . }}-kube-prometheus-operator
rules:
- apiGroups:
- monitoring.coreos.com
resources:
- alertmanagers
- alertmanagers/finalizers
- alertmanagerconfigs
- prometheuses
- prometheuses/finalizers
- thanosrulers
- thanosrulers/finalizers
- servicemonitors
- podmonitors
- probes
- prometheusrules
verbs:
- '*'
- apiGroups:
- apps
resources:
- statefulsets
verbs:
- '*'
- apiGroups:
- ""
resources:
- configmaps
- secrets
verbs:
- '*'
- apiGroups:
- ""
resources:
- pods
verbs:
- list
- delete
- apiGroups:
- ""
resources:
- services
- services/finalizers
- endpoints
verbs:
- get
- create
- update
- delete
- apiGroups:
- ""
resources:
- nodes
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- namespaces
verbs:
- get
- list
- watch
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- get
- list
- watch
{{- end }}
{{- if .Values.prometheus.clusterRoleBinding.enabled -}}
{{- if .Values.prometheus.roleBinding.enabled -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
kind: RoleBinding
metadata:
name: {{ template "theodolite.fullname" . }}-prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
kind: Role
name: {{ template "theodolite.fullname" . }}-prometheus
subjects:
- kind: ServiceAccount
name: {{ template "theodolite.fullname" . }}-prometheus
namespace: {{ .Release.Namespace }}
{{- end}}
\ No newline at end of file
{{- end}}
{{- if .Values.prometheus.clusterRole.enabled -}}
{{- if .Values.prometheus.role.enabled -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
kind: Role
metadata:
name: {{ template "theodolite.fullname" . }}-prometheus
rules:
- apiGroups: [""]
resources:
- nodes
- services
- endpoints
- pods
......@@ -15,6 +14,4 @@ rules:
resources:
- configmaps
verbs: ["get"]
- nonResourceURLs: ["/metrics"]
verbs: ["get"]
{{- end }}
\ No newline at end of file
{{- end}}
......@@ -55,6 +55,9 @@ rules:
- get
- create
- update
{{- with .Values.rbac.additionalRules }}
{{ toYaml . | indent 2 }}
{{- end }}
{{- if .Values.operator.enabled }}
- apiGroups:
- theodolite.com
......
......@@ -5,7 +5,7 @@
kafkaClient:
enabled: false
nodeSelector: {}
####
## configuration of sub charts
......@@ -52,6 +52,9 @@ grafana:
service:
nodePort: 31199
type: NodePort
rbac:
pspEnabled: false
namespaced: true
###
......@@ -155,6 +158,9 @@ cp-helm-charts:
## The interval between refreshing metrics
pollIntervalSeconds: 15
strimzi-kafka-operator:
createGlobalResources: true
strimzi:
enabled: true
kafka:
......@@ -173,6 +179,9 @@ strimzi:
jvmOptions:
"-Xmx": "512M"
"-Xms": "512M"
nodeSelectorTerms: []
resources: {}
zookeeper:
replicas: 3
zooEntrance:
......@@ -180,6 +189,8 @@ strimzi:
zookeeperClient:
enabled: true
nodeSelector: {}
nodeSelectorTerms: []
topicOperator:
enabled: true
......@@ -188,6 +199,10 @@ strimzi:
# Prometheus Monitoring Stack (Prometheus Operator)
###
kube-prometheus-stack:
global:
rbac:
create: false
commonLabels:
appScope: titan-ccp
......@@ -233,7 +248,14 @@ kube-prometheus-stack:
releaseNamespace: true
additional: []
nodeSelector: {}
admissionWebhooks:
enabled: false
tls:
enabled: false
serviceAccount:
create: true
# We use our own Prometheus
prometheus:
enabled: false
......@@ -245,12 +267,11 @@ prometheus:
enabled: true
nodeSelector: {}
# depends on your cluster security and permission settings, you may need to create the following resources
serviceAccount:
enabled: true
clusterRole:
role:
enabled: true
clusterRoleBinding:
roleBinding:
enabled: true
###
......@@ -341,9 +362,10 @@ serviceAccount:
rbac:
create: true
additionalRules: []
randomScheduler:
enabled: true
enabled: false
image: ghcr.io/cau-se/theodolite-random-scheduler
imageTag: latest
imagePullPolicy: Always
......
......@@ -24,7 +24,7 @@ elif os.getenv('LOG_LEVEL') == 'DEBUG':
def calculate_slope_trend(results, warmup):
d = []
for result in results:
group = result['metric']['consumergroup']
group = result['metric'].get('consumergroup', "default")
for value in result['values']:
d.append({'group': group, 'timestamp': int(
value[0]), 'value': int(value[1]) if value[1] != 'NaN' else 0})
......
package rocks.theodolite.benchmarks.commons.beam;
import java.io.IOException;
import java.util.function.Function;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.PipelineResult;
import org.apache.beam.sdk.PipelineRunner;
import org.apache.beam.sdk.options.PipelineOptions;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
......@@ -23,6 +25,7 @@ public class BeamService {
private final AbstractPipelineFactory pipelineFactory;
private final PipelineOptions pipelineOptions;
private PipelineResult pipelineResult;
/**
* Create a new {@link BeamService}.
......@@ -43,14 +46,43 @@ public class BeamService {
}
/**
* Start this microservice, by running the underlying Beam pipeline.
* Start this microservice by running the underlying Beam pipeline.
*/
public void run() {
LOGGER.info("Constructing Beam pipeline with pipeline options: {}",
this.pipelineOptions.toString());
final Pipeline pipeline = this.pipelineFactory.create(this.pipelineOptions);
LOGGER.info("Starting BeamService {}.", this.applicationName);
pipeline.run().waitUntilFinish();
this.pipelineResult = pipeline.run();
}
/**
* Start this microservice by running the underlying Beam pipeline and block until this process is
* terminated.
*/
public void runStandalone() {
this.run();
Runtime.getRuntime().addShutdownHook(new Thread(() -> this.stop()));
this.pipelineResult.waitUntilFinish();
}
/**
* Stop this microservice by canceling the underlying Beam pipeline.
*/
public void stop() {
LOGGER.info("Initiate shutdown of Beam service {}.", this.applicationName);
if (this.pipelineResult == null) {
throw new IllegalStateException("Cannot stop service since it has never been started.");
}
LOGGER.info("Stopping Beam pipeline.");
try {
this.pipelineResult.cancel();
this.pipelineResult = null; // NOPMD use null to indicate absence
} catch (final IOException e) {
throw new IllegalStateException(
"Stopping the service failed due to failed stop of Beam pipeline.", e);
}
LOGGER.info("Shutdown of Beam service {} complete.", this.applicationName);
}
}
plugins {
// common java conventions
id 'theodolite.java-conventions'
// make executable
id 'application'
}
repositories {
mavenCentral()
maven {
url "https://oss.sonatype.org/content/repositories/snapshots/"
}
maven {
url 'https://packages.confluent.io/maven/'
}
}
dependencies {
implementation('org.industrial-devops:titan-ccp-common:0.1.0-SNAPSHOT') { changing = true }
implementation('org.industrial-devops:titan-ccp-common-kafka:0.1.0-SNAPSHOT') { changing = true }
implementation 'com.google.guava:guava:24.1-jre'
implementation 'org.slf4j:slf4j-api:1.7.30'
implementation 'org.slf4j:slf4j-simple:1.7.30'
implementation 'io.confluent:kafka-avro-serializer:5.3.0'
implementation 'com.hazelcast.jet:hazelcast-jet:4.5'
implementation 'com.hazelcast.jet:hazelcast-jet-kafka:4.5'
implementation 'com.hazelcast:hazelcast-kubernetes:2.2.2'
implementation project(':hazelcastjet-commons')
testImplementation("junit:junit:4.13.2")
testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.8.2")
testImplementation 'com.hazelcast:hazelcast:4.2:tests'
testImplementation 'com.hazelcast.jet:hazelcast-jet-core:4.5:tests'
}
test {
useJUnitPlatform()
}