summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2021-09-14 15:52:00 +0200
committerGitHub <noreply@github.com>2021-09-14 15:52:00 +0200
commit4c8d346986693dd60b6439b8256b2b70eb058aed (patch)
treee1fad19a40841048f6eafc3574f4a52a6d8d2fed /container-core
parent23087af2efb26eebe0ad2fbd383b1a3bd6ee9bfc (diff)
parent7b1bc4fbf356383e18c756842df9307643a66dbd (diff)
Merge pull request #19094 from vespa-engine/bjorncs/perf-service-dump
Bjorncs/perf service dump
Diffstat (limited to 'container-core')
-rw-r--r--container-core/CMakeLists.txt1
-rwxr-xr-xcontainer-core/src/main/sh/find-pid100
-rwxr-xr-xcontainer-core/src/main/sh/vespa-jvm-dumper20
3 files changed, 103 insertions, 18 deletions
diff --git a/container-core/CMakeLists.txt b/container-core/CMakeLists.txt
index 75ec63674c4..6d67d13bd94 100644
--- a/container-core/CMakeLists.txt
+++ b/container-core/CMakeLists.txt
@@ -2,5 +2,6 @@
install_config_definitions()
install_java_artifact_dependencies(container-core)
+vespa_install_script(src/main/sh/find-pid libexec/vespa)
vespa_install_script(src/main/sh/vespa-load-balancer-status libexec/vespa)
vespa_install_script(src/main/sh/vespa-jvm-dumper bin)
diff --git a/container-core/src/main/sh/find-pid b/container-core/src/main/sh/find-pid
new file mode 100755
index 00000000000..88c4c7df2aa
--- /dev/null
+++ b/container-core/src/main/sh/find-pid
@@ -0,0 +1,100 @@
+#!/usr/bin/env bash
+# Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+# BEGIN environment bootstrap section
+# Do not edit between here and END as this section should stay identical in all scripts
+
+findpath () {
+ myname=${0}
+ mypath=${myname%/*}
+ myname=${myname##*/}
+ empty_if_start_slash=${mypath%%/*}
+ if [ "${empty_if_start_slash}" ]; then
+ mypath=$(pwd)/${mypath}
+ fi
+ if [ "$mypath" ] && [ -d "$mypath" ]; then
+ return
+ fi
+ mypath=$(pwd)
+ if [ -f "${mypath}/${myname}" ]; then
+ return
+ fi
+ echo "FATAL: Could not figure out the path where $myname lives from $0"
+ exit 1
+}
+
+COMMON_ENV=libexec/vespa/common-env.sh
+
+source_common_env () {
+ if [ "$VESPA_HOME" ] && [ -d "$VESPA_HOME" ]; then
+ export VESPA_HOME
+ common_env=$VESPA_HOME/$COMMON_ENV
+ if [ -f "$common_env" ]; then
+ . $common_env
+ return
+ fi
+ fi
+ return 1
+}
+
+findroot () {
+ source_common_env && return
+ if [ "$VESPA_HOME" ]; then
+ echo "FATAL: bad VESPA_HOME value '$VESPA_HOME'"
+ exit 1
+ fi
+ if [ "$ROOT" ] && [ -d "$ROOT" ]; then
+ VESPA_HOME="$ROOT"
+ source_common_env && return
+ fi
+ findpath
+ while [ "$mypath" ]; do
+ VESPA_HOME=${mypath}
+ source_common_env && return
+ mypath=${mypath%/*}
+ done
+ echo "FATAL: missing VESPA_HOME environment variable"
+ echo "Could not locate $COMMON_ENV anywhere"
+ exit 1
+}
+
+findhost () {
+ if [ "${VESPA_HOSTNAME}" = "" ]; then
+ VESPA_HOSTNAME=$(vespa-detect-hostname || hostname -f || hostname || echo "localhost") || exit 1
+ fi
+ validate="${VESPA_HOME}/bin/vespa-validate-hostname"
+ if [ -f "$validate" ]; then
+ "$validate" "${VESPA_HOSTNAME}" || exit 1
+ fi
+ export VESPA_HOSTNAME
+}
+
+findroot
+findhost
+
+# END environment bootstrap section
+
+set -euo pipefail
+
+if (( $# != 1 )); then
+ echo "Usage: $0 <service-config-id>" >&2
+ exit 1
+fi
+
+readonly config_id=$1
+readonly status=$(vespa-sentinel-cmd list 2>/dev/null | grep "id=\"${config_id}\"")
+if [ -z "${status}" ]; then
+ echo "No service named '${config_id}'" >&2
+ exit 1
+fi
+readonly pid=$(echo ${status} | cut -d " " -f 4 | cut -d "=" -f 2)
+if ! [[ "${pid}" =~ ^[0-9]+$ ]]; then
+ echo "Could not find valid pid for '${config_id}' (pid='${pid}')" >&2
+ exit 1
+fi
+if [ -z "$(ps -p ${pid} -o pid=)" ]; then
+ echo "Could not find process for '${pid}'" >&2
+ exit 1
+fi
+echo $pid
+exit 0
diff --git a/container-core/src/main/sh/vespa-jvm-dumper b/container-core/src/main/sh/vespa-jvm-dumper
index 50f4a1b2d63..a3c41391260 100755
--- a/container-core/src/main/sh/vespa-jvm-dumper
+++ b/container-core/src/main/sh/vespa-jvm-dumper
@@ -89,24 +89,8 @@ if ! [ -d "${output_directory}" -a -w "${output_directory}" ]; then
echo "Directory '${output_directory}' is not writable"
exit 1
fi
-readonly status=$(vespa-sentinel-cmd list | grep "id=\"${service}\"")
-if [ -z "${status}" ]; then
- echo "No service named '${service}'"
- exit 1
-else
- echo "Found service: ${status}"
-fi
-readonly jvm_pid=$(echo ${status} | cut -d " " -f 4 | cut -d "=" -f 2)
-if ! [[ "${jvm_pid}" =~ ^[0-9]+$ ]]; then
- echo "Could not find valid pid for '${service}' (pid='${jvm_pid}')"
- exit 1
-else
- echo "Pid for '${service}' is '${jvm_pid}'"
-fi
-if ! [ -n $(ps -p ${jvm_pid} -o pid=) ]; then
- echo "Could not find process for '${jvm_pid}'"
- exit 1
-fi
+readonly jvm_pid=$($VESPA_HOME/libexec/vespa/find-pid "$service")
+echo "Pid for '${service}' is '${jvm_pid}'"
echo "Starting Java Flight Recorder recording"
jcmd ${jvm_pid} JFR.start name=vespa-jvm-dumper path-to-gc-roots=true settings=profile filename=${output_directory}/jvm-jfr-dump.jfr