# build and install required Tussle Framework (https://github.com/AzulSystems/tussle-framework) in local maven (~/.m2) reprository
$ cd tussle-framework/
$ ./build.sh
# build ISV viewer server
$ cd tussle-benchmarks/isv-viewer/
$ mvn clean package -DskipTests
Run server as standalone springboot application:
$ java -jar target/isv-viewer-*.war
Or deploy WAR package to the web server (e.g. Tomcat):
$ cp target/isv-viewer-*.war ${CATALINA_HOME}/webapps/perf.war
View results using following URL format:
http://localhost:8080/perf/#!?{options} or
http://server-hosting-results/perf/#!?{options}
options:
&r - "results" parameter, list of the results IDs (results in a database) or paths (result directories available on server side)
http://localhost:8080/perf/#!?r=id1,id2,id3,...
http://localhost:8080/perf/#!?r=path1,path2,path3,...
&summary - alternative summary result format
http://localhost:8080/perf/#!?summary&r=id1,id2,id3,...
http://localhost:8080/perf/#!?summary&r=path1,path2,path3,...
&rec - recursive processing of provided path to the results
http://localhost:8080/perf/#!?rec&r=path1
&show - parameter for showing specific list of metrics which names matches to the given
http://localhost:8080/perf/#!?r=id1,id2,id3&show=metric_name1,metric_name2...
supported predefined values:
all - show all metrics (charts and aggregate values) by default
allcharts - show all charts but do not show aggregate values by default
allvalues - show all value-based aggregate values by default
&search - general options for searching results on filer in specified directory http://localhost:8080/perf/#!?search=
Use "Charts" section to show or hide charts of interest:
- use buttons with labels with bold fonts to show/hide chart groups
- use buttons with labels (normal font) to show/hide specific charts
Use "Values" section to show or hide numeric values of interest:
- use buttons with labels with bold fonts to show/hide values groups
- use buttons with labels (normal font) to show/hide specific values
Show graphs in specific folders:
http://localhost:8080/perf/#!?A&show=allcharts&r=,,...
&opts - general options for displaying data http://localhost:8080/perf/#!?r=id1,id2,id3&show=all&opts=opt1,opts2... supported options: noMin - do not use minimal metric time az start point (zero), keep absolute time dateTime - show full date + time lables utc - show date/time
Metrics are represented with Metric (Tussle Framework -> Metric.java) and hashmap-based run properties:
HashMap<String, Object>;
class Metric {
Long start; // measurement start time in ms
Long finish; // measurement finish time in ms
Long totalValues; // total measured values (samples, requests, etc.)
Integer delay; // metric measurement interval length
String name; // response_time, service_time, etc.
String host; // host or node name where metric was collected
String units; // metric measurement value units (ms, s, etc.)
String xunits; // alternative metric X-axis units if it is not time-based
String rateUnits; // metric measurement rate units (op/s, msg/s, etc.)
String operation; // reads, writes, appends, end-to-end, etc.
Double highBound; // optional target rate high-bound value which used for iterative scenarios, e.g. run at target rates from 50% to 110% of high-bound
Double targetRate; // target rate
Double actualRate; // measured actual rate
Double value; // metric value in case if it is single-value
ArrayList<MetricValue> metricValues; // metric values - array of typed values arrays
}
Most Metric fields are optional. At least one of 'value' or 'metricValues' should be included in results metrics in order to be meaningful.
Metrics results in JSON format includes run configuration properites and arrey of Metric:
{
"doc" : {
"runProperties" : { "prop": "value", ... }
"metrics" : [ // array of Metric:
{
"start" : number,
"finish" : number,
"delay" : number,
"name" : string,
"host" : string,
"units" : string,
"xunits" : string,
"rateUnits" : string,
"operation" : string,
"value" : number,
"metricValues" : [ // array of MetricValue:
{ "type" : "VALUES", "values" : [val1,val2,val3,...] }
{ "type" : "OTHER_VALUES", "values" : [valA,valB,valC,...] }
...
]
}
...
]
Metrics results in CSV format:
header
row1
row2
...
- "Single value" metric examples/single_value/metrics.json:
{
"doc" : {
"metrics" : [ {
"name" : "single_value",
"value" : 123
} ]
}
}
View example in ISV viewer: http://localhost:8080/perf/#!?r=/local/path/to/tussle-benchmarks/isv-viewer/examples/single_value
Expected result:
- "Simple values" metric examples/simple_values/metrics.json:
{
"doc" : {
"metrics" : [ {
"name" : "simple_values",
"metricValues" : [ {
"type" : "VALUES",
"values" : [ 1, 2, 3, 4, 5, 4, 3, 2, 1, 2, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1 ]
} ]
} ]
}
}
View example in ISV viewer: http://localhost:8080/perf/#!?r=/local/path/to/tussle-benchmarks/isv-viewer/examples/simple_values
Expected result:
- "Mixed values" metric examples/mixed_values/metrics.json:
{
"doc" : {
"metrics" : [ {
"name" : "mixed",
"units" : "UNIT",
"metricValues" : [ {
"type" : "VALUES",
"values" : [ 1, 2, 3, 4, 5, 4, 3, 2, 1, 2, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1 ]
}, {
"type" : "OTHER_VALUES",
"values" : [ 13, 11, 13, 11, 19, 15, 13, 12, 11, 12, 11, 12, 17, 14, 13, 12, 13, 14, 13, 12, 11 ]
}, {
"type" : "MORE_VALUES",
"values" : [ 23, 22, 23, 21, 21, 21, 23, 22, 21, 22, 21, 22, 21, 28, 21, 22, 23, 29, 21, 22, 25 ]
} ]
}, {
"name" : "fibonacci",
"metricValues" : [ {
"type" : "VALUES",
"values" : [ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987 ]
} ]
}, {
"name" : "value_a",
"value" : 555
}, {
"name" : "value_b",
"units" : "op/s",
"value" : 77
}, {
"name" : "value_c",
"units" : "ms",
"value" : 0.123
} ]
}
}
View example in ISV viewer: http://localhost:8080/perf/#!?r=/local/path/to/tussle-benchmarks/isv-viewer/examples/mixed_values
Expected result:
- "Disk utilization" metric examples/disk_util/metrics.json:
"doc" : {
"runProperties" : {
"start_time" : "2023-03-21T18:50:23",
"vm_type" : "OpenJDK 64-Bit Server VM",
"osInfo" : [ {
"Arch" : "amd64",
"Version" : "4.15.0-204-generic",
"User Name" : "user",
"Name" : "Linux"
} ],
"finish_time" : "2023-03-21T18:50:23"
},
"metrics" : [ {
"start" : 1676484562483,
"finish" : 1676484977483,
"delay" : 5000,
"name" : "disk",
"host" : "node1-m6a.xlarge",
"units" : "%util",
"operation" : "%util",
"metricValues" : [ {
"type" : "VALUES",
"values" : [ 0.16, 2.83, 2.36, 0.08, 34.84, 0.58, 0.52, 0.16, 0.1, 0.06, 0.06, 0.08, 0.16, 0.5, 0.22, 0.08, 0.06, 0.08, 0.06, 0.24, 0.14, 0.1, 0.08, 0.3, 0.06, 0.18, 0.1, 0.06, 0.04, 0.06, 0.04, 0.16, 0.16, 0.1, 0.06,
} ]
} ]
}
}
View example in ISV viewer: http://localhost:8080/perf/#!?r=/local/path/to/tussle-benchmarks/isv-viewer/examples/disk_util
Expected result:
- Search results from examples included in the project:
http://localhost:8080/perf/#!?search=/local/path/to/tussle-benchmarks/isv-viewer/examples
- View OpenMessaging Benchmark (OMB) result from examples included in the project:
http://localhost:8080/perf/#!?r=/local/path/to/tussle-benchmarks/isv-viewer/examples/omb_200k
- Compare two OpenMessaging Benchmark (OMB) results from examples included in the project:
- Default relative timeline:
- Timeline with abs time (opts=noMin)
- Timeline with abs datetime (opts=noMin,dateTime)
- Timeline with abs UTC datetime (opts=noMin,dateTime,utc)