mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-21 13:08:00 +00:00
GH-9973 introduced: * New function get_kata_memory_and_vcpus() in tests/metrics/lib/common.bash. * A call to get_kata_memory_and_vcpus() from extract_kata_env(), which is defined in tests/common.bash. Because the nydus test only sources tests/common.bash, it can't find get_kata_memory_and_vcpus() and errors out. We fix this by moving the get_kata_memory_and_vcpus() call from tests/common.bash to tests/metrics/lib/json.bash so that it doesn't impact the nydus test. Signed-off-by: Aurélien Bombo <abombo@microsoft.com>
257 lines
5.8 KiB
Bash
Executable File
257 lines
5.8 KiB
Bash
Executable File
#!/bin/bash
|
||
#
|
||
# Copyright (c) 2023 Intel Corporation
|
||
#
|
||
# SPDX-License-Identifier: Apache-2.0
|
||
|
||
# Helper routines for generating JSON formatted results.
|
||
|
||
declare -a json_result_array
|
||
declare -a json_array_array
|
||
|
||
JSON_TX_ONELINE="${JSON_TX_ONELINE:-}"
|
||
JSON_URL="${JSON_URL:-}"
|
||
|
||
# Generate a timestamp in nanoseconds since 1st Jan 1970
|
||
function timestamp_ns() {
|
||
local t
|
||
local s
|
||
local n
|
||
local ns
|
||
|
||
t="$(date +%-s:%-N)"
|
||
s=$(echo $t | awk -F ':' '{print $1}')
|
||
n=$(echo $t | awk -F ':' '{print $2}')
|
||
ns=$(echo "$s * 1000000000 + $n" | bc)
|
||
|
||
echo $ns
|
||
}
|
||
|
||
# Generate a timestamp in milliseconds since 1st Jan 1970
|
||
function timestamp_ms() {
|
||
echo $(($(date +%s%N)/1000000))
|
||
}
|
||
|
||
# Initialise the json subsystem
|
||
function metrics_json_init() {
|
||
# collect kata-env data
|
||
common_init
|
||
|
||
# Clear out any previous results
|
||
json_result_array=()
|
||
|
||
despaced_name="$(echo ${TEST_NAME} | sed 's/[ \/]/-/g')"
|
||
json_filename="${RESULT_DIR}/${despaced_name}.json"
|
||
|
||
# get_kata_memory_and_vcpus() function measures the memory and the number of vcpus
|
||
# from a kata container, and saves these values in the variables:
|
||
# 'MEASURED_CONTAINER_NUM_VCPUS' and 'MEASURED_CONTAINER_TOTAL_MEM'
|
||
get_kata_memory_and_vcpus
|
||
|
||
local json="$(cat << EOF
|
||
"@timestamp" : $(timestamp_ms)
|
||
EOF
|
||
)"
|
||
|
||
if [ "${CTR_RUNTIME}" == "io.containerd.kata.v2" ]; then
|
||
metrics_json_add_fragment "$json"
|
||
|
||
local json="$(cat << EOF
|
||
"env" : {
|
||
"RuntimeVersion": "${RUNTIME_VERSION}",
|
||
"RuntimeCommit": "${RUNTIME_COMMIT}",
|
||
"RuntimeConfig": "${RUNTIME_CONFIG_PATH}",
|
||
"Hypervisor": "${HYPERVISOR_PATH}",
|
||
"HypervisorVersion": "${HYPERVISOR_VERSION}",
|
||
"Shim": "${SHIM_PATH}",
|
||
"ShimVersion": "${SHIM_VERSION}",
|
||
"machinename": "$(uname -n)",
|
||
"SharedFs": "${SHARED_FS}",
|
||
"ReqMemKB": "${REQ_MEMORY}",
|
||
"ReqNumVcpus": "${REQ_NUM_VCPUS}",
|
||
"MeasuredTotalMem": "${MEASURED_CONTAINER_TOTAL_MEM}",
|
||
"MeasuredNumVcpus": "${MEASURED_CONTAINER_NUM_VCPUS}"
|
||
}
|
||
EOF
|
||
)"
|
||
fi
|
||
|
||
metrics_json_add_fragment "$json"
|
||
|
||
local json="$(cat << EOF
|
||
"date" : {
|
||
"ns": $(timestamp_ns),
|
||
"Date": "$(date -u +"%Y-%m-%dT%T.%3N")"
|
||
}
|
||
EOF
|
||
)"
|
||
metrics_json_add_fragment "$json"
|
||
|
||
local json="$(cat << EOF
|
||
"test" : {
|
||
"runtime": "${CTR_RUNTIME}",
|
||
"testname": "${TEST_NAME}"
|
||
}
|
||
EOF
|
||
)"
|
||
|
||
if [ "$CTR_RUNTIME" == "io.containerd.kata.v2" ]; then
|
||
metrics_json_add_fragment "$json"
|
||
|
||
# Now add a runtime specific environment section if we can
|
||
local iskata=$(is_a_kata_runtime "${RUNTIME}")
|
||
if [ "$iskata" == "1" ]; then
|
||
local rpath="$(command -v kata-runtime)"
|
||
local json="$(cat << EOF
|
||
"kata-env" :
|
||
$($rpath kata-env --json)
|
||
EOF
|
||
)"
|
||
fi
|
||
fi
|
||
|
||
if [ "${CTR_RUNTIME}" == "io.containerd.runc.v2" ]; then
|
||
metrics_json_add_fragment "$json"
|
||
local output=$(runc -v)
|
||
local runcversion=$(grep version <<< "$output" | sed 's/runc version //')
|
||
local runccommit=$(grep commit <<< "$output" | sed 's/commit: //')
|
||
local json="$(cat << EOF
|
||
"runc-env" :
|
||
{
|
||
"Version": {
|
||
"Semver": "${runcversion}",
|
||
"Commit": "${runccommit}"
|
||
}
|
||
}
|
||
EOF
|
||
)"
|
||
fi
|
||
|
||
metrics_json_end_of_system
|
||
}
|
||
|
||
# Save out the final JSON file
|
||
function metrics_json_save() {
|
||
|
||
if [ ! -d "${RESULT_DIR}" ];then
|
||
mkdir -p "${RESULT_DIR}"
|
||
fi
|
||
|
||
local maxelem=$(( ${#json_result_array[@]} - 1 ))
|
||
local json="$(cat << EOF
|
||
{
|
||
$(for index in $(seq 0 $maxelem); do
|
||
# After the standard system data, we then place all the test generated
|
||
# data into its own unique named subsection.
|
||
if (( index == system_index )); then
|
||
echo "\"${despaced_name}\" : {"
|
||
fi
|
||
if (( index != maxelem )); then
|
||
echo "${json_result_array[$index]},"
|
||
else
|
||
echo "${json_result_array[$index]}"
|
||
fi
|
||
done)
|
||
}
|
||
}
|
||
EOF
|
||
)"
|
||
|
||
echo "${json}" | jq . > "${json_filename}"
|
||
|
||
# If we have a JSON URL or host/socket pair set up, post the results there as well.
|
||
# Optionally compress into a single line.
|
||
if [[ $JSON_TX_ONELINE ]]; then
|
||
json="$(sed 's/[\n\t]//g' <<< ${json})"
|
||
fi
|
||
|
||
if [[ $JSON_HOST ]]; then
|
||
echo "socat'ing results to [$JSON_HOST:$JSON_SOCKET]"
|
||
socat -u - TCP:${JSON_HOST}:${JSON_SOCKET} <<< ${json}
|
||
fi
|
||
|
||
if [[ $JSON_URL ]]; then
|
||
echo "curl'ing results to [$JSON_URL]"
|
||
curl -XPOST -H"Content-Type: application/json" "$JSON_URL" -d "@-" <<< ${json}
|
||
fi
|
||
}
|
||
|
||
function metrics_json_end_of_system() {
|
||
system_index=$(( ${#json_result_array[@]}))
|
||
}
|
||
|
||
# Add a top level (complete) JSON fragment to the data
|
||
function metrics_json_add_fragment() {
|
||
local data=$1
|
||
|
||
# Place on end of array
|
||
json_result_array[${#json_result_array[@]}]="$data"
|
||
}
|
||
|
||
# Prepare to collect up array elements
|
||
function metrics_json_start_array() {
|
||
json_array_array=()
|
||
}
|
||
|
||
# Add a (complete) element to the current array
|
||
function metrics_json_add_array_element() {
|
||
local data=$1
|
||
|
||
# Place on end of array
|
||
json_array_array[${#json_array_array[@]}]="$data"
|
||
}
|
||
|
||
# Add a fragment to the current array element
|
||
function metrics_json_add_array_fragment() {
|
||
local data=$1
|
||
|
||
# Place on end of array
|
||
json_array_fragments[${#json_array_fragments[@]}]="$data"
|
||
}
|
||
|
||
# Turn the currently registered array fragments into an array element
|
||
function metrics_json_close_array_element() {
|
||
|
||
local maxelem=$(( ${#json_array_fragments[@]} - 1 ))
|
||
local json="$(cat << EOF
|
||
{
|
||
$(for index in $(seq 0 $maxelem); do
|
||
if (( index != maxelem )); then
|
||
echo "${json_array_fragments[$index]},"
|
||
else
|
||
echo "${json_array_fragments[$index]}"
|
||
fi
|
||
done)
|
||
}
|
||
EOF
|
||
)"
|
||
|
||
# And save that to the top level
|
||
metrics_json_add_array_element "$json"
|
||
|
||
# Reset the array fragment array ready for a new one
|
||
json_array_fragments=()
|
||
}
|
||
|
||
# Close the current array
|
||
function metrics_json_end_array() {
|
||
local name=$1
|
||
|
||
local maxelem=$(( ${#json_array_array[@]} - 1 ))
|
||
local json="$(cat << EOF
|
||
"$name": [
|
||
$(for index in $(seq 0 $maxelem); do
|
||
if (( index != maxelem )); then
|
||
echo "${json_array_array[$index]},"
|
||
else
|
||
echo "${json_array_array[$index]}"
|
||
fi
|
||
done)
|
||
]
|
||
EOF
|
||
)"
|
||
|
||
# And save that to the top level
|
||
metrics_json_add_fragment "$json"
|
||
}
|