diff --git a/debian/rules b/debian/rules
index 884c11a13d04..138a231d760f 100755
--- a/debian/rules
+++ b/debian/rules
@@ -219,6 +219,7 @@ install: build
find debian/opennms-common/usr/share/opennms/bin -type f -execdir chmod 755 {} \;
mv debian/temp/etc/* debian/opennms-common/etc/opennms/
mv debian/temp/lib debian/opennms-common/usr/share/opennms/
+ mv debian/temp/agent debian/opennms-common/usr/share/opennms/
install -d -m 755 debian/opennms-common/var/lib/opennms/xsds
mv debian/temp/share/xsds/* debian/opennms-common/var/lib/opennms/xsds/
find debian/opennms-common/etc/opennms -type f -execdir chmod 644 {} \;
diff --git a/opennms-base-assembly/pom.xml b/opennms-base-assembly/pom.xml
index d4959b864d39..0d661b439a98 100644
--- a/opennms-base-assembly/pom.xml
+++ b/opennms-base-assembly/pom.xml
@@ -1013,6 +1013,11 @@
org.postgresql
postgresql
+
+ io.pyroscope
+ agent
+ ${pyroscopeVersion}
+
axis
axis
diff --git a/opennms-base-assembly/src/assembly/daemon.xml b/opennms-base-assembly/src/assembly/daemon.xml
index 8203e854474c..024e96550565 100644
--- a/opennms-base-assembly/src/assembly/daemon.xml
+++ b/opennms-base-assembly/src/assembly/daemon.xml
@@ -111,6 +111,7 @@
org.opennms:opennms-jasperstudio-extension
org.springframework:*
org.slf4j:slf4j-jdk14
+ io.pyroscope:agent
*:pom
@@ -123,5 +124,14 @@
org.apache.httpcomponents:httpasyncclient-osgi:jar:${httpasyncclientVersion}
+
+ false
+ pyroscope-agent.jar
+ agent
+ true
+
+ io.pyroscope:agent:jar
+
+
diff --git a/opennms-base-assembly/src/main/filtered/bin/opennms b/opennms-base-assembly/src/main/filtered/bin/opennms
index a6cb5726be53..b1848070b5f6 100755
--- a/opennms-base-assembly/src/main/filtered/bin/opennms
+++ b/opennms-base-assembly/src/main/filtered/bin/opennms
@@ -87,6 +87,9 @@ RUNJAVA_OPTIONS=""
# when it cannot connect using the Attach API (automatically or by PID)
JMX_URL="service:jmx:rmi:///jndi/rmi://127.0.0.1:1099/jmxrmi"
+# Whether to enable the Pyroscope agent
+PYROSCOPE_AGENT_ENABLED=0
+
# The user that OpenNMS needs to run as.
[ -z "$RUNAS" ] && RUNAS=opennms
@@ -796,6 +799,14 @@ if [ -n "$JAVA_HEAP_SIZE" ] && [ "$JAVA_HEAP_SIZE" -gt 0 ]; then
MANAGER_OPTIONS+=("-Xmx${JAVA_HEAP_SIZE}m")
fi
+# https://pyroscope.io/docs/java-tracing/#running-as-otel-java-instrumentation-extension
+if [ -n "$PYROSCOPE_AGENT_ENABLED" ] && [ "$PYROSCOPE_AGENT_ENABLED" -gt 0 ]; then
+ export PYROSCOPE_APPLICATION_NAME="${PYROSCOPE_APPLICATION_NAME:=OpenNMS}"
+ export PYROSCOPE_SERVER_ADDRESS="${PYROSCOPE_SERVER_ADDRESS:=http://localhost:4040}" # so we don't get a warning
+
+ MANAGER_OPTIONS+=("-javaagent:${OPENNMS_HOME}/agent/pyroscope-agent.jar")
+fi
+
JAVA_VERSION="$("$OPENNMS_HOME/bin/runjava" -p -f 2> /dev/null)"
JAVA_SHORT_VERSION="$(echo "$JAVA_VERSION" | cut -d. -f1)"
if [ -z "$JAVA_SHORT_VERSION" ]; then
diff --git a/pom.xml b/pom.xml
index ffeb66d4173c..690dc68178e3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1764,6 +1764,7 @@
2.3
0.31.0
0.34.0
+ 0.10.2
1.8.0
2.3.2
2.0.0
diff --git a/tools/packages/opennms/opennms.spec b/tools/packages/opennms/opennms.spec
index ea33d2736bdd..e7cda03a2700 100644
--- a/tools/packages/opennms/opennms.spec
+++ b/tools/packages/opennms/opennms.spec
@@ -668,6 +668,9 @@ find %{buildroot}%{sharedir} ! -type d | \
grep -v 'tca-datacollection-config.xml' | \
grep -v 'juniper-tca' | \
sort >> %{_tmppath}/files.main
+find %{buildroot}%{instprefix}/agent ! -type d | \
+ sed -e "s|^%{buildroot}|%attr(755,opennms,opennms) |" | \
+ sort >> %{_tmppath}/files.main
find %{buildroot}%{instprefix}/contrib ! -type d | \
sed -e "s|^%{buildroot}|%attr(755,opennms,opennms) |" | \
sort >> %{_tmppath}/files.main
@@ -690,8 +693,9 @@ find %{buildroot}%{instprefix}/system ! -type d | \
sed -e "s|^%{buildroot}|%attr(755,opennms,opennms) |" | \
grep -v 'jira-' | \
sort >> %{_tmppath}/files.main
-# Put the etc, lib, and system subdirectories into the package
-find %{buildroot}%{instprefix}/bin \
+# Put the agent, bin, etc, lib, and system subdirectories into the package
+find %{buildroot}%{instprefix}/agent \
+ %{buildroot}%{instprefix}/bin \
%{buildroot}%{instprefix}/contrib \
%{buildroot}%{instprefix}/etc \
%{buildroot}%{instprefix}/lib \