Skip to content

Commit 3902799

Browse files
authored
Docker: Collect JVM heap dump in case server run into error (#2546)
Signed-off-by: Viet Nguyen Duc <[email protected]>
1 parent 7d6ddb7 commit 3902799

19 files changed

+275
-29
lines changed

Diff for: Base/Dockerfile

+6-3
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ RUN if [ "$(dpkg --print-architecture)" = "amd64" ]; then \
6363
supervisor \
6464
gnupg2 \
6565
libnss3-tools \
66-
openjdk-${JRE_VERSION}-jre-headless \
66+
openjdk-${JRE_VERSION}-jdk-headless \
6767
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/*
6868

6969
RUN --mount=type=secret,id=SEL_PASSWD \
@@ -96,7 +96,7 @@ RUN --mount=type=secret,id=SEL_PASSWD \
9696
#==========
9797
# Selenium & relaxing permissions for OpenShift and other non-sudo environments
9898
#==========
99-
&& mkdir -p /opt/selenium /opt/selenium/assets /opt/selenium/secrets /var/run/supervisor /var/log/supervisor ${SEL_DOWNLOAD_DIR} \
99+
&& mkdir -p /opt/selenium /opt/selenium/assets /opt/selenium/secrets /opt/selenium/logs /var/run/supervisor /var/log/supervisor ${SEL_DOWNLOAD_DIR} \
100100
${HOME}/.mozilla ${HOME}/.vnc ${HOME}/.pki/nssdb ${VIDEO_FOLDER} \
101101
# NSSDB initialization with an empty password
102102
&& certutil -d sql:${HOME}/.pki/nssdb -N --empty-password \
@@ -142,8 +142,9 @@ RUN --mount=type=secret,id=SEL_PASSWD \
142142
#======================================
143143
# Add Grid check script
144144
#======================================
145-
COPY --chown="${SEL_UID}:${SEL_GID}" check-grid.sh entry_point.sh configs/node/nodeGridUrl.sh configs/node/nodePreStop.sh /opt/bin/
145+
COPY --chown="${SEL_UID}:${SEL_GID}" check-grid.sh entry_point.sh configs/node/nodeGridUrl.sh configs/node/nodePreStop.sh handle_heap_dump.sh /opt/bin/
146146
COPY --chown="${SEL_UID}:${SEL_GID}" mask /usr/local/bin/
147+
RUN chmod +x /opt/bin/*.sh /usr/local/bin/mask
147148

148149
#======================================
149150
# Add Supervisor configuration file
@@ -187,6 +188,8 @@ ENV SE_BIND_HOST=false \
187188
SE_STRUCTURED_LOGS=false \
188189
SE_ENABLE_TRACING=true \
189190
SE_ENABLE_TLS=false \
191+
SE_JAVA_OPTS_DEFAULT="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/selenium/logs" \
192+
SE_JAVA_HEAP_DUMP="false" \
190193
SE_JAVA_HTTPCLIENT_VERSION="HTTP_1_1" \
191194
SE_JAVA_SSL_TRUST_STORE="/opt/selenium/secrets/server.jks" \
192195
SE_JAVA_SSL_TRUST_STORE_PASSWORD="/opt/selenium/secrets/server.pass" \

Diff for: Base/handle_heap_dump.sh

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/usr/bin/env bash
2+
3+
SELENIUM_SERVER_PID=$1
4+
LOG_DIR=$2
5+
TIMESTAMP=$(date +%s)
6+
7+
filename="$LOG_DIR/dump_pid${SELENIUM_SERVER_PID}_${TIMESTAMP}.hprof"
8+
if ps -p "${SELENIUM_SERVER_PID}" >/dev/null; then
9+
echo "Server process is still running. Create heap dump by using jmap"
10+
jmap -dump:live,format=b,file="${filename}" "${SELENIUM_SERVER_PID}"
11+
else
12+
filename_source="$LOG_DIR/java_pid${SELENIUM_SERVER_PID}.hprof"
13+
if [ -f "$filename_source" ]; then
14+
echo "Server is not running. Check HeapDumpOnOutOfMemoryError created"
15+
mv "$filename_source" "$filename"
16+
else
17+
echo "Server is not running. No heap dump is created"
18+
fi
19+
fi

Diff for: Distributor/start-selenium-grid-distributor.sh

+18-1
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,26 @@ if [ -n "${SE_JAVA_HTTPCLIENT_VERSION}" ]; then
183183
SE_JAVA_OPTS="$SE_JAVA_OPTS -Dwebdriver.httpclient.version=${SE_JAVA_HTTPCLIENT_VERSION}"
184184
fi
185185

186+
if [ -n "${SE_JAVA_OPTS_DEFAULT}" ]; then
187+
SE_JAVA_OPTS="${SE_JAVA_OPTS_DEFAULT} $SE_JAVA_OPTS"
188+
fi
189+
190+
function handle_heap_dump() {
191+
/opt/bin/handle_heap_dump.sh $SELENIUM_SERVER_PID /opt/selenium/logs
192+
}
193+
if [ "${SE_JAVA_HEAP_DUMP}" = "true" ]; then
194+
trap handle_heap_dump ERR SIGTERM SIGINT
195+
else
196+
trap handle_heap_dump ERR
197+
fi
198+
186199
java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
187200
-jar /opt/selenium/selenium-server.jar \
188201
${EXTRA_LIBS} \
189202
distributor \
190203
--bind-bus false \
191-
${SE_OPTS}
204+
${SE_OPTS} &
205+
206+
SELENIUM_SERVER_PID=$!
207+
208+
wait $SELENIUM_SERVER_PID

Diff for: EventBus/start-selenium-grid-eventbus.sh

+18-1
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,27 @@ if [ -n "${SE_JAVA_HTTPCLIENT_VERSION}" ]; then
113113
SE_JAVA_OPTS="$SE_JAVA_OPTS -Dwebdriver.httpclient.version=${SE_JAVA_HTTPCLIENT_VERSION}"
114114
fi
115115

116+
if [ -n "${SE_JAVA_OPTS_DEFAULT}" ]; then
117+
SE_JAVA_OPTS="${SE_JAVA_OPTS_DEFAULT} $SE_JAVA_OPTS"
118+
fi
119+
120+
function handle_heap_dump() {
121+
/opt/bin/handle_heap_dump.sh $SELENIUM_SERVER_PID /opt/selenium/logs
122+
}
123+
if [ "${SE_JAVA_HEAP_DUMP}" = "true" ]; then
124+
trap handle_heap_dump ERR SIGTERM SIGINT
125+
else
126+
trap handle_heap_dump ERR
127+
fi
128+
116129
java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
117130
-jar /opt/selenium/selenium-server.jar \
118131
${EXTRA_LIBS} event-bus \
119132
--bind-host ${SE_BIND_HOST} \
120133
${HOST_CONFIG} \
121134
${PORT_CONFIG} \
122-
${SE_OPTS}
135+
${SE_OPTS} &
136+
137+
SELENIUM_SERVER_PID=$!
138+
139+
wait $SELENIUM_SERVER_PID

Diff for: Hub/start-selenium-grid-hub.sh

+18-1
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,25 @@ if [ -n "${SE_JAVA_HTTPCLIENT_VERSION}" ]; then
163163
SE_JAVA_OPTS="$SE_JAVA_OPTS -Dwebdriver.httpclient.version=${SE_JAVA_HTTPCLIENT_VERSION}"
164164
fi
165165

166+
if [ -n "${SE_JAVA_OPTS_DEFAULT}" ]; then
167+
SE_JAVA_OPTS="${SE_JAVA_OPTS_DEFAULT} $SE_JAVA_OPTS"
168+
fi
169+
170+
function handle_heap_dump() {
171+
/opt/bin/handle_heap_dump.sh $SELENIUM_SERVER_PID /opt/selenium/logs
172+
}
173+
if [ "${SE_JAVA_HEAP_DUMP}" = "true" ]; then
174+
trap handle_heap_dump ERR SIGTERM SIGINT
175+
else
176+
trap handle_heap_dump ERR
177+
fi
178+
166179
java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
167180
-jar /opt/selenium/selenium-server.jar \
168181
${EXTRA_LIBS} \
169182
hub \
170-
${SE_OPTS}
183+
${SE_OPTS} &
184+
185+
SELENIUM_SERVER_PID=$!
186+
187+
wait $SELENIUM_SERVER_PID

Diff for: NodeBase/start-selenium-node.sh

+21-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ pacmd set-default-source v1.monitor
1212

1313
rm -f /tmp/.X*lock
1414

15+
# set -e: exit asap if a command exits with a non-zero status
16+
set -e
17+
1518
function append_se_opts() {
1619
local option="${1}"
1720
local value="${2:-""}"
@@ -175,11 +178,28 @@ if [ -n "${SE_JAVA_HTTPCLIENT_VERSION}" ]; then
175178
SE_JAVA_OPTS="$SE_JAVA_OPTS -Dwebdriver.httpclient.version=${SE_JAVA_HTTPCLIENT_VERSION}"
176179
fi
177180

181+
if [ -n "${SE_JAVA_OPTS_DEFAULT}" ]; then
182+
SE_JAVA_OPTS="${SE_JAVA_OPTS_DEFAULT} $SE_JAVA_OPTS"
183+
fi
184+
185+
function handle_heap_dump() {
186+
/opt/bin/handle_heap_dump.sh $SELENIUM_SERVER_PID /opt/selenium/logs
187+
}
188+
if [ "${SE_JAVA_HEAP_DUMP}" = "true" ]; then
189+
trap handle_heap_dump ERR SIGTERM SIGINT
190+
else
191+
trap handle_heap_dump ERR
192+
fi
193+
178194
java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
179195
${CHROME_DRIVER_PATH_PROPERTY} \
180196
${EDGE_DRIVER_PATH_PROPERTY} \
181197
${GECKO_DRIVER_PATH_PROPERTY} \
182198
-jar /opt/selenium/selenium-server.jar \
183199
${EXTRA_LIBS} \
184200
node \
185-
${SE_OPTS}
201+
${SE_OPTS} &
202+
203+
SELENIUM_SERVER_PID=$!
204+
205+
wait $SELENIUM_SERVER_PID

Diff for: NodeDocker/start-selenium-grid-docker.sh

+18-1
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,19 @@ if [ -n "${SE_JAVA_HTTPCLIENT_VERSION}" ]; then
123123
SE_JAVA_OPTS="$SE_JAVA_OPTS -Dwebdriver.httpclient.version=${SE_JAVA_HTTPCLIENT_VERSION}"
124124
fi
125125

126+
if [ -n "${SE_JAVA_OPTS_DEFAULT}" ]; then
127+
SE_JAVA_OPTS="${SE_JAVA_OPTS_DEFAULT} $SE_JAVA_OPTS"
128+
fi
129+
130+
function handle_heap_dump() {
131+
/opt/bin/handle_heap_dump.sh $SELENIUM_SERVER_PID /opt/selenium/logs
132+
}
133+
if [ "${SE_JAVA_HEAP_DUMP}" = "true" ]; then
134+
trap handle_heap_dump ERR SIGTERM SIGINT
135+
else
136+
trap handle_heap_dump ERR
137+
fi
138+
126139
java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
127140
-jar /opt/selenium/selenium-server.jar \
128141
${EXTRA_LIBS} node \
@@ -131,4 +144,8 @@ java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
131144
--bind-host ${SE_BIND_HOST} \
132145
--detect-drivers false \
133146
--config /opt/selenium/${SE_NODE_DOCKER_CONFIG_FILENAME:-"config.toml"} \
134-
${SE_GRID_URL} ${SE_OPTS}
147+
${SE_GRID_URL} ${SE_OPTS} &
148+
149+
SELENIUM_SERVER_PID=$!
150+
151+
wait $SELENIUM_SERVER_PID

Diff for: Router/start-selenium-grid-router.sh

+18-1
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,19 @@ if [ -n "${SE_JAVA_HTTPCLIENT_VERSION}" ]; then
164164
SE_JAVA_OPTS="$SE_JAVA_OPTS -Dwebdriver.httpclient.version=${SE_JAVA_HTTPCLIENT_VERSION}"
165165
fi
166166

167+
if [ -n "${SE_JAVA_OPTS_DEFAULT}" ]; then
168+
SE_JAVA_OPTS="${SE_JAVA_OPTS_DEFAULT} $SE_JAVA_OPTS"
169+
fi
170+
171+
function handle_heap_dump() {
172+
/opt/bin/handle_heap_dump.sh $SELENIUM_SERVER_PID /opt/selenium/logs
173+
}
174+
if [ "${SE_JAVA_HEAP_DUMP}" = "true" ]; then
175+
trap handle_heap_dump ERR SIGTERM SIGINT
176+
else
177+
trap handle_heap_dump ERR
178+
fi
179+
167180
java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
168181
-jar /opt/selenium/selenium-server.jar \
169182
${EXTRA_LIBS} router \
@@ -177,4 +190,8 @@ java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
177190
${HOST_CONFIG} \
178191
${PORT_CONFIG} \
179192
${SUB_PATH_CONFIG} \
180-
${SE_OPTS}
193+
${SE_OPTS} &
194+
195+
SELENIUM_SERVER_PID=$!
196+
197+
wait $SELENIUM_SERVER_PID

Diff for: SessionQueue/start-selenium-grid-session-queue.sh

+18-1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,19 @@ if [ -n "${SE_JAVA_HTTPCLIENT_VERSION}" ]; then
117117
SE_JAVA_OPTS="$SE_JAVA_OPTS -Dwebdriver.httpclient.version=${SE_JAVA_HTTPCLIENT_VERSION}"
118118
fi
119119

120+
if [ -n "${SE_JAVA_OPTS_DEFAULT}" ]; then
121+
SE_JAVA_OPTS="${SE_JAVA_OPTS_DEFAULT} $SE_JAVA_OPTS"
122+
fi
123+
124+
function handle_heap_dump() {
125+
/opt/bin/handle_heap_dump.sh $SELENIUM_SERVER_PID /opt/selenium/logs
126+
}
127+
if [ "${SE_JAVA_HEAP_DUMP}" = "true" ]; then
128+
trap handle_heap_dump ERR SIGTERM SIGINT
129+
else
130+
trap handle_heap_dump ERR
131+
fi
132+
120133
java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
121134
-jar /opt/selenium/selenium-server.jar \
122135
${EXTRA_LIBS} sessionqueue \
@@ -125,4 +138,8 @@ java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
125138
--bind-host ${SE_BIND_HOST} \
126139
${HOST_CONFIG} \
127140
${PORT_CONFIG} \
128-
${SE_OPTS}
141+
${SE_OPTS} &
142+
143+
SELENIUM_SERVER_PID=$!
144+
145+
wait $SELENIUM_SERVER_PID

Diff for: Sessions/start-selenium-grid-sessions.sh

+18-1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,19 @@ if [ -n "${SE_JAVA_HTTPCLIENT_VERSION}" ]; then
152152
SE_JAVA_OPTS="$SE_JAVA_OPTS -Dwebdriver.httpclient.version=${SE_JAVA_HTTPCLIENT_VERSION}"
153153
fi
154154

155+
if [ -n "${SE_JAVA_OPTS_DEFAULT}" ]; then
156+
SE_JAVA_OPTS="${SE_JAVA_OPTS_DEFAULT} $SE_JAVA_OPTS"
157+
fi
158+
159+
function handle_heap_dump() {
160+
/opt/bin/handle_heap_dump.sh $SELENIUM_SERVER_PID /opt/selenium/logs
161+
}
162+
if [ "${SE_JAVA_HEAP_DUMP}" = "true" ]; then
163+
trap handle_heap_dump ERR SIGTERM SIGINT
164+
else
165+
trap handle_heap_dump ERR
166+
fi
167+
155168
java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
156169
-jar /opt/selenium/selenium-server.jar \
157170
${EXTRA_LIBS} sessions \
@@ -160,4 +173,8 @@ java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
160173
--bind-host ${SE_BIND_HOST} \
161174
${HOST_CONFIG} \
162175
${PORT_CONFIG} \
163-
${SE_OPTS}
176+
${SE_OPTS} &
177+
178+
SELENIUM_SERVER_PID=$!
179+
180+
wait $SELENIUM_SERVER_PID

Diff for: Standalone/start-selenium-standalone.sh

+18-1
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,19 @@ if [ -n "${SE_JAVA_HTTPCLIENT_VERSION}" ]; then
166166
SE_JAVA_OPTS="$SE_JAVA_OPTS -Dwebdriver.httpclient.version=${SE_JAVA_HTTPCLIENT_VERSION}"
167167
fi
168168

169+
if [ -n "${SE_JAVA_OPTS_DEFAULT}" ]; then
170+
SE_JAVA_OPTS="${SE_JAVA_OPTS_DEFAULT} $SE_JAVA_OPTS"
171+
fi
172+
173+
function handle_heap_dump() {
174+
/opt/bin/handle_heap_dump.sh $SELENIUM_SERVER_PID /opt/selenium/logs
175+
}
176+
if [ "${SE_JAVA_HEAP_DUMP}" = "true" ]; then
177+
trap handle_heap_dump ERR SIGTERM SIGINT
178+
else
179+
trap handle_heap_dump ERR
180+
fi
181+
169182
java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
170183
${CHROME_DRIVER_PATH_PROPERTY} \
171184
${EDGE_DRIVER_PATH_PROPERTY} \
@@ -180,4 +193,8 @@ java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
180193
--bind-host ${SE_BIND_HOST} \
181194
--config /opt/selenium/config.toml \
182195
${SUB_PATH_CONFIG} \
183-
${SE_OPTS}
196+
${SE_OPTS} &
197+
198+
SELENIUM_SERVER_PID=$!
199+
200+
wait $SELENIUM_SERVER_PID

Diff for: StandaloneDocker/start-selenium-grid-docker.sh

+18-1
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,19 @@ if [ -n "${SE_JAVA_HTTPCLIENT_VERSION}" ]; then
128128
SE_JAVA_OPTS="$SE_JAVA_OPTS -Dwebdriver.httpclient.version=${SE_JAVA_HTTPCLIENT_VERSION}"
129129
fi
130130

131+
if [ -n "${SE_JAVA_OPTS_DEFAULT}" ]; then
132+
SE_JAVA_OPTS="${SE_JAVA_OPTS_DEFAULT} $SE_JAVA_OPTS"
133+
fi
134+
135+
function handle_heap_dump() {
136+
/opt/bin/handle_heap_dump.sh $SELENIUM_SERVER_PID /opt/selenium/logs
137+
}
138+
if [ "${SE_JAVA_HEAP_DUMP}" = "true" ]; then
139+
trap handle_heap_dump ERR SIGTERM SIGINT
140+
else
141+
trap handle_heap_dump ERR
142+
fi
143+
131144
java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
132145
-jar /opt/selenium/selenium-server.jar \
133146
${EXTRA_LIBS} standalone \
@@ -137,4 +150,8 @@ java ${JAVA_OPTS:-$SE_JAVA_OPTS} \
137150
--detect-drivers false \
138151
--bind-host ${SE_BIND_HOST} \
139152
--config /opt/selenium/config.toml \
140-
${SE_GRID_URL} ${SE_OPTS}
153+
${SE_GRID_URL} ${SE_OPTS} &
154+
155+
SELENIUM_SERVER_PID=$!
156+
157+
wait $SELENIUM_SERVER_PID

Diff for: charts/selenium-grid/CONFIGURATION.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,8 @@ A Helm chart for creating a Selenium Grid Server in Kubernetes
289289
| components.sessionQueue.priorityClassName | string | `""` | Priority class name for Session Queue pods |
290290
| components.extraEnvironmentVariables | list | `[]` | Custom environment variables for all components |
291291
| components.extraEnvFrom | list | `[]` | Custom environment variables by sourcing entire configMap, Secret, etc. for all components |
292+
| components.extraVolumeMounts | list | `[]` | Extra volume mounts for component container |
293+
| components.extraVolumes | list | `[]` | Extra volumes for component pod |
292294
| hub.imageRegistry | string | `nil` | Registry to pull the image (this overwrites global.seleniumGrid.imageRegistry parameter) |
293295
| hub.imageName | string | `"hub"` | Selenium Hub image name |
294296
| hub.imageTag | string | `nil` | Selenium Hub image tag (this overwrites global.seleniumGrid.imageTag parameter) |
@@ -312,8 +314,8 @@ A Helm chart for creating a Selenium Grid Server in Kubernetes
312314
| hub.subPath | string | `""` | Custom sub path for the hub deployment |
313315
| hub.extraEnvironmentVariables | list | `[]` | Custom environment variables for selenium-hub |
314316
| hub.extraEnvFrom | list | `[]` | Custom environment variables by sourcing entire configMap, Secret, etc. for selenium-hub |
315-
| hub.extraVolumeMounts | list | `[]` | Extra volume mounts for selenium-hub container |
316-
| hub.extraVolumes | list | `[]` | Extra volumes for selenium-hub pod |
317+
| hub.extraVolumeMounts | list | `[]` | Extra volume mounts for Hub container |
318+
| hub.extraVolumes | list | `[]` | Extra volumes for Hub pod |
317319
| hub.resources | object | `{}` | Resources for selenium-hub container |
318320
| hub.securityContext | object | `{}` | SecurityContext for selenium-hub container |
319321
| hub.serviceType | string | `"ClusterIP"` | Kubernetes service type (see https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types) |

0 commit comments

Comments
 (0)