feat: add scripts format (#811)
* feat: add scripts format Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com> * feat: add go work Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com> --------- Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>pull/813/head
parent
3836bf19d6
commit
b26a979378
@ -0,0 +1,9 @@
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
@ -0,0 +1,91 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright 2020 Lingfei Kong <colin404@foxmail.com>. All rights reserved.
|
||||
# Use of this source code is governed by a MIT style
|
||||
# license that can be found in the LICENSE file.
|
||||
|
||||
# OPENIM 项目源码根目录
|
||||
IAM_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
||||
|
||||
# 生成文件存放目录
|
||||
LOCAL_OUTPUT_ROOT="${IAM_ROOT}/${OUT_DIR:-_output}"
|
||||
|
||||
# 设置统一的密码,方便记忆
|
||||
readonly PASSWORD=${PASSWORD:-'iam59!z$'}
|
||||
|
||||
# Linux系统 going 用户
|
||||
readonly LINUX_USERNAME=${LINUX_USERNAME:-going}
|
||||
# Linux root & going 用户密码
|
||||
readonly LINUX_PASSWORD=${LINUX_PASSWORD:-${PASSWORD}}
|
||||
|
||||
# 设置安装目录
|
||||
readonly INSTALL_DIR=${INSTALL_DIR:-/tmp/installation}
|
||||
mkdir -p ${INSTALL_DIR}
|
||||
readonly ENV_FILE=${IAM_ROOT}/scripts/install/environment.sh
|
||||
|
||||
# MariaDB 配置信息
|
||||
readonly MARIADB_ADMIN_USERNAME=${MARIADB_ADMIN_USERNAME:-root} # MariaDB root 用户
|
||||
readonly MARIADB_ADMIN_PASSWORD=${MARIADB_ADMIN_PASSWORD:-${PASSWORD}} # MariaDB root 用户密码
|
||||
readonly MARIADB_HOST=${MARIADB_HOST:-127.0.0.1:3306} # MariaDB 主机地址
|
||||
readonly MARIADB_DATABASE=${MARIADB_DATABASE:-openim} # MariaDB openim 应用使用的数据库名
|
||||
readonly MARIADB_USERNAME=${MARIADB_USERNAME:-openim} # openim 数据库用户名
|
||||
readonly MARIADB_PASSWORD=${MARIADB_PASSWORD:-${PASSWORD}} # openim 数据库密码
|
||||
|
||||
# Redis 配置信息
|
||||
readonly REDIS_HOST=${REDIS_HOST:-127.0.0.1} # Redis 主机地址
|
||||
readonly REDIS_PORT=${REDIS_PORT:-6379} # Redis 监听端口
|
||||
readonly REDIS_USERNAME=${REDIS_USERNAME:-''} # Redis 用户名
|
||||
readonly REDIS_PASSWORD=${REDIS_PASSWORD:-${PASSWORD}} # Redis 密码
|
||||
|
||||
# MongoDB 配置
|
||||
readonly MONGO_ADMIN_USERNAME=${MONGO_ADMIN_USERNAME:-root} # MongoDB root 用户
|
||||
readonly MONGO_ADMIN_PASSWORD=${MONGO_ADMIN_PASSWORD:-${PASSWORD}} # MongoDB root 用户密码
|
||||
readonly MONGO_HOST=${MONGO_HOST:-127.0.0.1} # MongoDB 地址
|
||||
readonly MONGO_PORT=${MONGO_PORT:-27017} # MongoDB 端口
|
||||
readonly MONGO_USERNAME=${MONGO_USERNAME:-openim} # MongoDB 用户名
|
||||
readonly MONGO_PASSWORD=${MONGO_PASSWORD:-${PASSWORD}} # MongoDB 密码
|
||||
|
||||
# openim 配置
|
||||
readonly IAM_DATA_DIR=${IAM_DATA_DIR:-/data/openim} # openim 各组件数据目录
|
||||
readonly IAM_INSTALL_DIR=${IAM_INSTALL_DIR:-/opt/openim} # openim 安装文件存放目录
|
||||
readonly IAM_CONFIG_DIR=${IAM_CONFIG_DIR:-/etc/openim} # openim 配置文件存放目录
|
||||
readonly IAM_LOG_DIR=${IAM_LOG_DIR:-/var/log/openim} # openim 日志文件存放目录
|
||||
readonly CA_FILE=${CA_FILE:-${IAM_CONFIG_DIR}/cert/ca.pem} # CA
|
||||
|
||||
# openim-apiserver 配置
|
||||
readonly IAM_APISERVER_HOST=${IAM_APISERVER_HOST:-127.0.0.1} # openim-apiserver 部署机器 IP 地址
|
||||
readonly IAM_APISERVER_GRPC_BIND_ADDRESS=${IAM_APISERVER_GRPC_BIND_ADDRESS:-0.0.0.0}
|
||||
readonly IAM_APISERVER_GRPC_BIND_PORT=${IAM_APISERVER_GRPC_BIND_PORT:-8081}
|
||||
readonly IAM_APISERVER_INSECURE_BIND_ADDRESS=${IAM_APISERVER_INSECURE_BIND_ADDRESS:-127.0.0.1}
|
||||
readonly IAM_APISERVER_INSECURE_BIND_PORT=${IAM_APISERVER_INSECURE_BIND_PORT:-8080}
|
||||
readonly IAM_APISERVER_SECURE_BIND_ADDRESS=${IAM_APISERVER_SECURE_BIND_ADDRESS:-0.0.0.0}
|
||||
readonly IAM_APISERVER_SECURE_BIND_PORT=${IAM_APISERVER_SECURE_BIND_PORT:-8443}
|
||||
readonly IAM_APISERVER_SECURE_TLS_CERT_KEY_CERT_FILE=${IAM_APISERVER_SECURE_TLS_CERT_KEY_CERT_FILE:-${IAM_CONFIG_DIR}/cert/openim-apiserver.pem}
|
||||
readonly IAM_APISERVER_SECURE_TLS_CERT_KEY_PRIVATE_KEY_FILE=${IAM_APISERVER_SECURE_TLS_CERT_KEY_PRIVATE_KEY_FILE:-${IAM_CONFIG_DIR}/cert/openim-apiserver-key.pem}
|
||||
|
||||
# openim-authz-server 配置
|
||||
readonly IAM_AUTHZ_SERVER_HOST=${IAM_AUTHZ_SERVER_HOST:-127.0.0.1} # openim-authz-server 部署机器 IP 地址
|
||||
readonly IAM_AUTHZ_SERVER_INSECURE_BIND_ADDRESS=${IAM_AUTHZ_SERVER_INSECURE_BIND_ADDRESS:-127.0.0.1}
|
||||
readonly IAM_AUTHZ_SERVER_INSECURE_BIND_PORT=${IAM_AUTHZ_SERVER_INSECURE_BIND_PORT:-9090}
|
||||
readonly IAM_AUTHZ_SERVER_SECURE_BIND_ADDRESS=${IAM_AUTHZ_SERVER_SECURE_BIND_ADDRESS:-0.0.0.0}
|
||||
readonly IAM_AUTHZ_SERVER_SECURE_BIND_PORT=${IAM_AUTHZ_SERVER_SECURE_BIND_PORT:-9443}
|
||||
readonly IAM_AUTHZ_SERVER_SECURE_TLS_CERT_KEY_CERT_FILE=${IAM_AUTHZ_SERVER_SECURE_TLS_CERT_KEY_CERT_FILE:-${IAM_CONFIG_DIR}/cert/openim-authz-server.pem}
|
||||
readonly IAM_AUTHZ_SERVER_SECURE_TLS_CERT_KEY_PRIVATE_KEY_FILE=${IAM_AUTHZ_SERVER_SECURE_TLS_CERT_KEY_PRIVATE_KEY_FILE:-${IAM_CONFIG_DIR}/cert/openim-authz-server-key.pem}
|
||||
readonly IAM_AUTHZ_SERVER_CLIENT_CA_FILE=${IAM_AUTHZ_SERVER_CLIENT_CA_FILE:-${CA_FILE}}
|
||||
readonly IAM_AUTHZ_SERVER_RPCSERVER=${IAM_AUTHZ_SERVER_RPCSERVER:-${IAM_APISERVER_HOST}:${IAM_APISERVER_GRPC_BIND_PORT}}
|
||||
|
||||
# openim-pump 配置
|
||||
readonly IAM_PUMP_HOST=${IAM_PUMP_HOST:-127.0.0.1} # openim-pump 部署机器 IP 地址
|
||||
readonly IAM_PUMP_COLLECTION_NAME=${IAM_PUMP_COLLECTION_NAME:-iam_analytics}
|
||||
readonly IAM_PUMP_MONGO_URL=${IAM_PUMP_MONGO_URL:-mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOST}:${MONGO_PORT}/${IAM_PUMP_COLLECTION_NAME}?authSource=${IAM_PUMP_COLLECTION_NAME}}
|
||||
|
||||
# openim-watcher配置
|
||||
readonly IAM_WATCHER_HOST=${IAM_WATCHER_HOST:-127.0.0.1} # openim-watcher 部署机器 IP 地址
|
||||
|
||||
# iamctl 配置
|
||||
readonly CONFIG_USER_USERNAME=${CONFIG_USER_USERNAME:-admin}
|
||||
readonly CONFIG_USER_PASSWORD=${CONFIG_USER_PASSWORD:-Admin@2021}
|
||||
readonly CONFIG_USER_CLIENT_CERTIFICATE=${CONFIG_USER_CLIENT_CERTIFICATE:-${HOME}/.openim/cert/admin.pem}
|
||||
readonly CONFIG_USER_CLIENT_KEY=${CONFIG_USER_CLIENT_KEY:-${HOME}/.openim/cert/admin-key.pem}
|
||||
readonly CONFIG_SERVER_ADDRESS=${CONFIG_SERVER_ADDRESS:-${IAM_APISERVER_HOST}:${IAM_APISERVER_SECURE_BIND_PORT}}
|
||||
readonly CONFIG_SERVER_CERTIFICATE_AUTHORITY=${CONFIG_SERVER_CERTIFICATE_AUTHORITY:-${CA_FILE}}
|
@ -0,0 +1,186 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright 2020 Lingfei Kong <colin404@foxmail.com>. All rights reserved.
|
||||
# Use of this source code is governed by a MIT style
|
||||
# license that can be found in the LICENSE file.
|
||||
|
||||
# Use this script to test if a given TCP host/port are available
|
||||
|
||||
WAITFORIT_cmdname=${0##*/}
|
||||
|
||||
openim_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
|
||||
source "${openim_root}/scripts/lib/color.sh"
|
||||
|
||||
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then info "$@" 1>&2; fi }
|
||||
|
||||
usage()
|
||||
{
|
||||
cat << USAGE >&2
|
||||
Usage:
|
||||
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
|
||||
-h HOST | --host=HOST Host or IP under test
|
||||
-p PORT | --port=PORT TCP port under test
|
||||
Alternatively, you specify the host and port as host:port
|
||||
-s | --strict Only execute subcommand if the test succeeds
|
||||
-q | --quiet Don't output any status messages
|
||||
-t TIMEOUT | --timeout=TIMEOUT
|
||||
Timeout in seconds, zero for no timeout
|
||||
-- COMMAND ARGS Execute command with args after the test finishes
|
||||
USAGE
|
||||
exit 1
|
||||
}
|
||||
|
||||
function wait_for()
|
||||
{
|
||||
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
|
||||
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
|
||||
else
|
||||
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
|
||||
fi
|
||||
WAITFORIT_start_ts=$(date +%s)
|
||||
while :
|
||||
do
|
||||
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
|
||||
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
|
||||
WAITFORIT_result=$?
|
||||
else
|
||||
(echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
|
||||
WAITFORIT_result=$?
|
||||
fi
|
||||
if [[ $WAITFORIT_result -eq 0 ]]; then
|
||||
WAITFORIT_end_ts=$(date +%s)
|
||||
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
return $WAITFORIT_result
|
||||
}
|
||||
|
||||
function wait_for_wrapper()
|
||||
{
|
||||
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
|
||||
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
|
||||
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
|
||||
else
|
||||
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
|
||||
fi
|
||||
WAITFORIT_PID=$!
|
||||
trap "kill -INT -$WAITFORIT_PID" INT
|
||||
wait $WAITFORIT_PID
|
||||
WAITFORIT_RESULT=$?
|
||||
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
|
||||
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
|
||||
fi
|
||||
return $WAITFORIT_RESULT
|
||||
}
|
||||
|
||||
# process arguments
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
case "$1" in
|
||||
*:* )
|
||||
WAITFORIT_hostport=(${1//:/ })
|
||||
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
|
||||
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
|
||||
shift 1
|
||||
;;
|
||||
--child)
|
||||
WAITFORIT_CHILD=1
|
||||
shift 1
|
||||
;;
|
||||
-q | --quiet)
|
||||
WAITFORIT_QUIET=1
|
||||
shift 1
|
||||
;;
|
||||
-s | --strict)
|
||||
WAITFORIT_STRICT=1
|
||||
shift 1
|
||||
;;
|
||||
-h)
|
||||
WAITFORIT_HOST="$2"
|
||||
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
|
||||
shift 2
|
||||
;;
|
||||
--host=*)
|
||||
WAITFORIT_HOST="${1#*=}"
|
||||
shift 1
|
||||
;;
|
||||
-p)
|
||||
WAITFORIT_PORT="$2"
|
||||
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
|
||||
shift 2
|
||||
;;
|
||||
--port=*)
|
||||
WAITFORIT_PORT="${1#*=}"
|
||||
shift 1
|
||||
;;
|
||||
-t)
|
||||
WAITFORIT_TIMEOUT="$2"
|
||||
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
|
||||
shift 2
|
||||
;;
|
||||
--timeout=*)
|
||||
WAITFORIT_TIMEOUT="${1#*=}"
|
||||
shift 1
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
WAITFORIT_CLI=("$@")
|
||||
break
|
||||
;;
|
||||
--help)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
warn "Unknown argument: $1"
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
|
||||
echoerr "Error: you need to provide a host and port to test."
|
||||
usage
|
||||
fi
|
||||
|
||||
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
|
||||
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
|
||||
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
|
||||
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
|
||||
|
||||
# check to see if timeout is from busybox?
|
||||
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
|
||||
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
|
||||
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
|
||||
WAITFORIT_ISBUSY=1
|
||||
WAITFORIT_BUSYTIMEFLAG="-t"
|
||||
|
||||
else
|
||||
WAITFORIT_ISBUSY=0
|
||||
WAITFORIT_BUSYTIMEFLAG=""
|
||||
fi
|
||||
|
||||
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
|
||||
wait_for
|
||||
WAITFORIT_RESULT=$?
|
||||
exit $WAITFORIT_RESULT
|
||||
else
|
||||
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
|
||||
wait_for_wrapper
|
||||
WAITFORIT_RESULT=$?
|
||||
else
|
||||
wait_for
|
||||
WAITFORIT_RESULT=$?
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ $WAITFORIT_CLI != "" ]]; then
|
||||
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
|
||||
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
|
||||
exit $WAITFORIT_RESULT
|
||||
fi
|
||||
exec "${WAITFORIT_CLI[@]}"
|
||||
else
|
||||
exit $WAITFORIT_RESULT
|
||||
fi
|
@ -0,0 +1,274 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2020 Lingfei Kong <colin404@foxmail.com>. All rights reserved.
|
||||
# Use of this source code is governed by a MIT style
|
||||
# license that can be found in the LICENSE file.
|
||||
|
||||
: << EOF
|
||||
The API performance test script automatically executes wrk commands, collects data, analyzes it, and calls gnuplot to plot it
|
||||
|
||||
Usage (to test API performance) :
|
||||
|
||||
Start the openim-api(port 10002)
|
||||
|
||||
Execute the test script: ./wrktest.sh
|
||||
|
||||
The script will generate the data file.dat, each column meaning: concurrency QPS average response time success rate
|
||||
|
||||
Usage (Compare the results of 2 tests)
|
||||
|
||||
1. The performance test:. / wrktest. Sh openim apiserver - http://127.0.0.1:10002/healthz
|
||||
|
||||
Execute the command:./wrktest.sh diff apiserver.dat http.dat
|
||||
|
||||
> Note: Make sure you have wrk and gnuplot installed on your system
|
||||
|
||||
EOF
|
||||
|
||||
openim_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
|
||||
wrkdir="${openim_root}/_output/wrk"
|
||||
jobname="openim-api"
|
||||
duration="300s"
|
||||
threads=$((3 * `grep -c processor /proc/cpuinfo`))
|
||||
|
||||
source "${openim_root}/scripts/lib/color.sh"
|
||||
|
||||
# Set wrk options
|
||||
openim::wrk::setup() {
|
||||
#concurrent="200 500 1000 3000 5000 10000 15000 20000 25000 50000 100000 200000 500000 1000000"
|
||||
concurrent="200 500 1000 3000 5000 10000 15000 20000 25000 50000"
|
||||
cmd="wrk -t${threads} -d${duration} -T30s --latency"
|
||||
}
|
||||
|
||||
# Print usage infomation
|
||||
openim::wrk::usage()
|
||||
{
|
||||
cat << EOF
|
||||
|
||||
Usage: $0 [OPTION] [diff] URL
|
||||
Performance automation test script.
|
||||
|
||||
URL HTTP request url, like: http://127.0.0.1:10002/healthz
|
||||
diff Compare two performance test results
|
||||
|
||||
OPTIONS:
|
||||
-h Usage information
|
||||
-n Performance test task name, default: apiserver
|
||||
-d Directory used to store performance data and gnuplot graphic, default: _output/wrk
|
||||
|
||||
Reprot bugs to <3293172751nss@gmail.com>.
|
||||
EOF
|
||||
}
|
||||
|
||||
# Convert plot data to useable data
|
||||
function openim::wrk::convert_plot_data()
|
||||
{
|
||||
echo "$1" | awk -v datfile="${wrkdir}/${datfile}" ' {
|
||||
if ($0 ~ "Running") {
|
||||
common_time=$2
|
||||
}
|
||||
if ($0 ~ "connections") {
|
||||
connections=$4
|
||||
common_threads=$1
|
||||
}
|
||||
if ($0 ~ "Latency ") {
|
||||
avg_latency=convertLatency($2)
|
||||
}
|
||||
if ($0 ~ "50%") {
|
||||
p50=convertLatency($2)
|
||||
}
|
||||
if ($0 ~ "75%") {
|
||||
p75=convertLatency($2)
|
||||
}
|
||||
if ($0 ~ "90%") {
|
||||
p90=convertLatency($2)
|
||||
}
|
||||
if ($0 ~ "99%") {
|
||||
p99=convertLatency($2)
|
||||
}
|
||||
if ($0 ~ "Requests/sec") {
|
||||
qps=$2
|
||||
}
|
||||
if ($0 ~ "requests in") {
|
||||
allrequest=$1
|
||||
}
|
||||
if ($0 ~ "Socket errors") {
|
||||
err=$4+$6+$8+$10
|
||||
}
|
||||
}
|
||||
END {
|
||||
rate=sprintf("%.2f", (allrequest-err)*100/allrequest)
|
||||
print connections,qps,avg_latency,rate >> datfile
|
||||
}
|
||||
|
||||
function convertLatency(s) {
|
||||
if (s ~ "us") {
|
||||
sub("us", "", s)
|
||||
return s/1000
|
||||
}
|
||||
if (s ~ "ms") {
|
||||
sub("ms", "", s)
|
||||
return s
|
||||
}
|
||||
if (s ~ "s") {
|
||||
sub("s", "", s)
|
||||
return s * 1000
|
||||
}
|
||||
}'
|
||||
}
|
||||
|
||||
# Remove existing data file
|
||||
function openim::wrk::prepare()
|
||||
{
|
||||
rm -f ${wrkdir}/${datfile}
|
||||
}
|
||||
|
||||
# Plot according to gunplot data file
|
||||
function openim::wrk::plot() {
|
||||
gnuplot << EOF
|
||||
set terminal png enhanced #输出格式为png文件
|
||||
set ylabel 'QPS'
|
||||
set xlabel 'Concurrent'
|
||||
set y2label 'Average Latency (ms)'
|
||||
set key top left vertical noreverse spacing 1.2 box
|
||||
set tics out nomirror
|
||||
set border 3 front
|
||||
set style line 1 linecolor rgb '#00ff00' linewidth 2 linetype 3 pointtype 2
|
||||
set style line 2 linecolor rgb '#ff0000' linewidth 1 linetype 3 pointtype 2
|
||||
set style data linespoints
|
||||
|
||||
set grid #显示网格
|
||||
set xtics nomirror rotate #by 90#只需要一个x轴
|
||||
set mxtics 5
|
||||
set mytics 5 #可以增加分刻度
|
||||
set ytics nomirror
|
||||
set y2tics
|
||||
|
||||
set autoscale y
|
||||
set autoscale y2
|
||||
|
||||
set output "${wrkdir}/${qpsttlb}" #指定数据文件名称
|
||||
set title "QPS & TTLB\nRunning: ${duration}\nThreads: ${threads}"
|
||||
plot "${wrkdir}/${datfile}" using 2:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#EE0000" axis x1y1 t "QPS","${wrkdir}/${datfile}" using 3:xticlabels(1) w lp pt 5 ps 1 lc rgbcolor "#0000CD" axis x2y2 t "Avg Latency (ms)"
|
||||
|
||||
unset y2tics
|
||||
unset y2label
|
||||
set ytics nomirror
|
||||
set yrange[0:100]
|
||||
set output "${wrkdir}/${successrate}" #指定数据文件名称
|
||||
set title "Success Rate\nRunning: ${duration}\nThreads: ${threads}"
|
||||
plot "${wrkdir}/${datfile}" using 4:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#F62817" t "Success Rate"
|
||||
EOF
|
||||
}
|
||||
|
||||
# Plot diff graphic
|
||||
function openim::wrk::plot_diff()
|
||||
{
|
||||
gnuplot << EOF
|
||||
set terminal png enhanced #输出格式为png文件
|
||||
set xlabel 'Concurrent'
|
||||
set ylabel 'QPS'
|
||||
set y2label 'Average Latency (ms)'
|
||||
set key below left vertical noreverse spacing 1.2 box autotitle columnheader
|
||||
set tics out nomirror
|
||||
set border 3 front
|
||||
set style line 1 linecolor rgb '#00ff00' linewidth 2 linetype 3 pointtype 2
|
||||
set style line 2 linecolor rgb '#ff0000' linewidth 1 linetype 3 pointtype 2
|
||||
set style data linespoints
|
||||
|
||||
#set border 3 lt 3 lw 2 #这会让你的坐标图的border更好看
|
||||
set grid #显示网格
|
||||
set xtics nomirror rotate #by 90#只需要一个x轴
|
||||
set mxtics 5
|
||||
set mytics 5 #可以增加分刻度
|
||||
set ytics nomirror
|
||||
set y2tics
|
||||
|
||||
#set pointsize 0.4 #点的像素大小
|
||||
#set datafile separator '\t' #数据文件的字段用\t分开
|
||||
|
||||
set autoscale y
|
||||
set autoscale y2
|
||||
|
||||
#设置图像的大小 为标准大小的2倍
|
||||
#set size 2.3,2
|
||||
|
||||
set output "${wrkdir}/${t1}_${t2}.qps.ttlb.diff.png" #指定数据文件名称
|
||||
set title "QPS & TTLB\nRunning: ${duration}\nThreads: ${threads}"
|
||||
plot "/tmp/plot_diff.dat" using 2:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#EE0000" axis x1y1 t "${t1} QPS","/tmp/plot_diff.dat" using 5:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#EE82EE" axis x1y1 t "${t2} QPS","/tmp/plot_diff.dat" using 3:xticlabels(1) w lp pt 5 ps 1 lc rgbcolor "#0000CD" axis x2y2 t "${t1} Avg Latency (ms)", "/tmp/plot_diff.dat" using 6:xticlabels(1) w lp pt 5 ps 1 lc rgbcolor "#6495ED" axis x2y2 t "${t2} Avg Latency (ms)"
|
||||
|
||||
unset y2tics
|
||||
unset y2label
|
||||
set ytics nomirror
|
||||
set yrange[0:100]
|
||||
set output "${wrkdir}/${t1}_${t2}.successrate.diff.png" #指定数据文件名称
|
||||
set title "Success Rate\nRunning: ${duration}\nThreads: ${threads}"
|
||||
plot "/tmp/plot_diff.dat" using 4:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#EE0000" t "${t1} Success Rate","/tmp/plot_diff.dat" using 7:xticlabels(1) w lp pt 7 ps 1 lc rgbcolor "#EE82EE" t "${t2} Success Rate"
|
||||
EOF
|
||||
}
|
||||
|
||||
# Start API performance testing
|
||||
openim::wrk::start_performance_test() {
|
||||
openim::wrk::prepare
|
||||
|
||||
for c in ${concurrent}
|
||||
do
|
||||
wrkcmd="${cmd} -c ${c} $1"
|
||||
echo "Running wrk command: ${wrkcmd}"
|
||||
result=`eval ${wrkcmd}`
|
||||
openim::wrk::convert_plot_data "${result}"
|
||||
done
|
||||
|
||||
echo -e "\nNow plot according to ${COLOR_MAGENTA}${wrkdir}/${datfile}${COLOR_NORMAL}"
|
||||
openim::wrk::plot &> /dev/null
|
||||
echo -e "QPS graphic file is: ${COLOR_MAGENTA}${wrkdir}/${qpsttlb}${COLOR_NORMAL}
|
||||
Success rate graphic file is: ${COLOR_MAGENTA}${wrkdir}/${successrate}${COLOR_NORMAL}"
|
||||
}
|
||||
|
||||
while getopts "hd:n:" opt;do
|
||||
case ${opt} in
|
||||
d)
|
||||
wrkdir=${OPTARG}
|
||||
;;
|
||||
n)
|
||||
jobname=${OPTARG}
|
||||
;;
|
||||
?)
|
||||
openim::wrk::usage
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
shift $(($OPTIND-1))
|
||||
|
||||
mkdir -p ${wrkdir}
|
||||
case $1 in
|
||||
"diff")
|
||||
if [ "$#" -lt 3 ];then
|
||||
openim::wrk::usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
t1=$(basename $2|sed 's/.dat//g') # 对比图中红色线条名称
|
||||
t2=$(basename $3|sed 's/.dat//g') # 对比图中粉色线条名称
|
||||
|
||||
join $2 $3 > /tmp/plot_diff.dat
|
||||
openim::wrk::plot_diff `basename $2` `basename $3`
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
if [ "$#" -lt 1 ];then
|
||||
openim::wrk::usage
|
||||
exit 0
|
||||
fi
|
||||
url="$1"
|
||||
|
||||
qpsttlb="${jobname}_qps_ttlb.png"
|
||||
successrate="${jobname}_successrate.png"
|
||||
datfile="${jobname}.dat"
|
||||
|
||||
openim::wrk::setup
|
||||
openim::wrk::start_performance_test "${url}"
|
||||
;;
|
||||
esac
|
@ -0,0 +1,45 @@
|
||||
# Notes about go workspace
|
||||
|
||||
As openim is using go1.18's [workspace feature](https://go.dev/doc/tutorial/workspaces), once you add a new module, you need to run `go work use -r .` at root directory to update the workspace synced.
|
||||
|
||||
### Create a new extensions
|
||||
|
||||
1. Create your tools_name directory in pkg `/tools` first and cd into it.
|
||||
2. Init the project.
|
||||
3. Then `go work use -r .` at current directory to update the workspace.
|
||||
4. Create your tools
|
||||
|
||||
You can execute the following commands to do things above:
|
||||
|
||||
```bash
|
||||
# 4dd91a700d3f:/openim# tree
|
||||
# .
|
||||
# ├── LICENSE
|
||||
# ├── README.md
|
||||
# ├── openim-chat
|
||||
# │ ├── bin
|
||||
# │ ├── config
|
||||
# │ ├── logs
|
||||
# │ └── scripts
|
||||
# ├── openim-server
|
||||
# │ ├── bin
|
||||
# │ ├── config
|
||||
# │ ├── logs
|
||||
# │ └── scripts
|
||||
# ├── openkf
|
||||
# │ ├── bin
|
||||
# │ ├── config
|
||||
# │ ├── logs
|
||||
# │ └── scripts
|
||||
# cd tools_code_dir
|
||||
# edit the CRD_NAME and CRD_GROUP to your own
|
||||
export OPENIM_TOOLS_NAME=<Changeme>
|
||||
|
||||
# copy and paste to create a new CRD and Controller
|
||||
mkdir tools/${OPENIM_TOOLS_NAME}
|
||||
cd tools/${OPENIM_TOOLS_NAME}
|
||||
go mod init github.com/OpenIMSDK/Open-IM-Server/tools/${OPENIM_TOOLS_NAME}
|
||||
go mod tidy
|
||||
go work use -r .
|
||||
cd ../..
|
||||
```
|
@ -0,0 +1,3 @@
|
||||
module github.com/OpenIMSDK/Open-IM-Server/tools/infra
|
||||
|
||||
go 1.20
|
@ -0,0 +1,26 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
)
|
||||
|
||||
func main() {
|
||||
log.Println("Current module is still under development.")
|
||||
message := `
|
||||
Current module is still under development.
|
||||
|
||||
____ _____ __ __
|
||||
/ __ \ |_ _|| \/ |
|
||||
| | | | _ __ ___ _ __ | | | \ / |
|
||||
| | | || '_ \ / _ \| '_ \ | | | |\/| |
|
||||
| |__| || |_) || __/| | | | _| |_ | | | |
|
||||
\____/ | .__/ \___||_| |_||_____||_| |_|
|
||||
| |
|
||||
|_|
|
||||
|
||||
Keep checking for updates!
|
||||
`
|
||||
|
||||
fmt.Println(message)
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
module github.com/OpenIMSDK/Open-IM-Server/tools/ncpu
|
||||
|
||||
go 1.20
|
||||
|
||||
require go.uber.org/automaxprocs v1.5.3
|
@ -0,0 +1,7 @@
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
|
||||
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
|
||||
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
|
||||
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
@ -0,0 +1,13 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
|
||||
"go.uber.org/automaxprocs/maxprocs"
|
||||
)
|
||||
|
||||
func main() {
|
||||
maxprocs.Set()
|
||||
fmt.Print(runtime.GOMAXPROCS(0))
|
||||
}
|
Loading…
Reference in new issue