Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(docker):Add the jattach tool to the docker container(#7538) #8040

Merged
merged 12 commits into from
Jun 7, 2023
3 changes: 2 additions & 1 deletion docker/datahub-frontend/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ RUN addgroup -S datahub && adduser -S datahub -G datahub
# PFP-260: Upgrade Sqlite to >=3.28.0-r0 to fix https://security.snyk.io/vuln/SNYK-ALPINE39-SQLITE-449762
RUN apk --no-cache --update-cache --available upgrade \
&& apk --no-cache add curl sqlite \
&& apk --no-cache add openjdk11-jre --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community
&& apk --no-cache add openjdk11-jre --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community \
&& apk --no-cache add jattach --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/

FROM base as prod-install

Expand Down
1 change: 1 addition & 0 deletions docker/datahub-gms/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ ENV JMX_VERSION=0.18.0
RUN apk --no-cache --update-cache --available upgrade \
&& apk --no-cache add curl bash coreutils gcompat sqlite \
&& apk --no-cache add openjdk11-jre --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community \
&& apk --no-cache add jattach --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ \
&& curl -sS https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-runner/9.4.46.v20220331/jetty-runner-9.4.46.v20220331.jar --output jetty-runner.jar \
&& curl -sS https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-jmx/9.4.46.v20220331/jetty-jmx-9.4.46.v20220331.jar --output jetty-jmx.jar \
&& curl -sS https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-util/9.4.46.v20220331/jetty-util-9.4.46.v20220331.jar --output jetty-util.jar \
Expand Down
1 change: 1 addition & 0 deletions docker/datahub-mae-consumer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ ENV JMX_VERSION=0.18.0
RUN apk --no-cache --update-cache --available upgrade \
&& apk --no-cache add curl bash coreutils sqlite \
&& apk --no-cache add openjdk11-jre --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community \
&& apk --no-cache add jattach --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ \
&& wget --no-verbose https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.24.0/opentelemetry-javaagent.jar \
&& wget --no-verbose https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/${JMX_VERSION}/jmx_prometheus_javaagent-${JMX_VERSION}.jar -O jmx_prometheus_javaagent.jar \
&& cp /usr/lib/jvm/java-11-openjdk/jre/lib/security/cacerts /tmp/kafka.client.truststore.jks
Expand Down
1 change: 1 addition & 0 deletions docker/datahub-mce-consumer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ ENV JMX_VERSION=0.18.0
RUN apk --no-cache --update-cache --available upgrade \
&& apk --no-cache add curl bash sqlite \
&& apk --no-cache add openjdk11-jre --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community \
&& apk --no-cache add jattach --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ \
&& wget --no-verbose https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.24.0/opentelemetry-javaagent.jar \
&& wget --no-verbose https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/${JMX_VERSION}/jmx_prometheus_javaagent-${JMX_VERSION}.jar -O jmx_prometheus_javaagent.jar \
&& cp /usr/lib/jvm/java-11-openjdk/jre/lib/security/cacerts /tmp/kafka.client.truststore.jks
Expand Down
1 change: 1 addition & 0 deletions docs-website/sidebars.js
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ module.exports = {
"docs/how/kafka-config",
"docs/deploy/confluent-cloud",
"docs/advanced/no-code-upgrade",
"docs/how/jattach-guide",
],
},
"docs/how/updating-datahub",
Expand Down
80 changes: 80 additions & 0 deletions docs/how/jattach-guide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
---
title: "Debugging by Jattach"
hide_title: true
---
We have installed jattach in Docker image of datahub-gms, datahub-mae-consumer, datahub-mce-consumer
and datahub-frontend to facilitating troubleshooting in a production environment.

# Introduction to Jattach
Jattach is a utility to send commands to a JVM process via Dynamic Attach mechanism.

Supported commands:
- load : load agent library
- properties : print system properties
- agentProperties : print agent properties
- datadump : show heap and thread summary
- threaddump : dump all stack traces (like jstack)
- dumpheap : dump heap (like jmap)
- inspectheap : heap histogram (like jmap -histo)
- setflag : modify manageable VM flag
- printflag : print VM flag
- jcmd : execute jcmd command

# Use examples

Jattach is a All-in-one **jmap + jstack + jcmd + jinfo** functionality in a single tiny program.
The scenarios where these commands were previously used can now be replaced with jattach.

## Example 1: Dump heap
The jattach dumpheap command is typically used in the following scenarios:

- Memory leak analysis: When an application experiences memory leaks or abnormal memory growth, the jattach dumpheap
command is used to generate a heap dump file for further analysis and identification of the memory leak causes.

- Memory analysis: By generating a heap dump file, various memory analysis tools such as Eclipse Memory Analyzer and
VisualVM can be utilized to analyze objects, reference relationships, and memory usage within the heap. This helps
identify potential performance issues and optimization opportunities.

- Troubleshooting: When encountering frequent Full GCs, memory out-of-memory errors, or other memory-related issues,
generating a heap dump file provides additional information for troubleshooting and debugging purposes.

- Performance optimization: By analyzing the heap dump file, it becomes possible to identify which objects in the
application consume a significant amount of memory. This information can be used for targeted performance optimizations,
such as reducing object creation or optimizing cache usage.

It's important to note that generating a heap dump file can have an impact on the performance of the application.
Therefore, caution should be exercised when using it in a production environment, ensuring sufficient resources and
permissions are available for the operation.

The command is as follows:
```bash
jattach <pid> dumpheap /tmp/heap.bin
```

## Example 2: Dump thread
The jattach threaddump command is typically used in the following scenarios:

- Deadlock analysis: When an application experiences deadlocks or thread contention issues, the jattach threaddump
command is used to generate a thread dump file. It provides the current thread's stack trace information, helping to
identify the code paths and lock contention causing the deadlock.

- Thread troubleshooting: When threads in an application encounter exceptions, long blocking times, excessive CPU usage,
or other issues, generating a thread dump file provides detailed information about each thread's state, stack trace, and
resource usage. This helps with troubleshooting and analysis.

- Performance analysis: By generating a thread dump file, it becomes possible to understand the thread activity, call
paths, and resource contention within the application. This aids in identifying potential performance bottlenecks and
concurrency issues.

- Monitoring and diagnostics: Regularly generating thread dump files can be used to monitor the health of an application
and provide historical data for subsequent diagnostics. This helps gain a better understanding of the application's
behavior and performance.

It's important to note that generating a thread dump file may impact the performance of the application. Therefore,
caution should be exercised when using it in a production environment, ensuring sufficient resources and permissions
are available for the operation.

The command is as follows:
```bash
jattach <pid> threaddump -l > /tmp/jstack.out
```