diff --git a/dev-support/atlas-docker/.env b/dev-support/atlas-docker/.env
index a03cebf7164..af486fe336b 100644
--- a/dev-support/atlas-docker/.env
+++ b/dev-support/atlas-docker/.env
@@ -26,3 +26,10 @@ HIVE_VERSION=3.1.3
HIVE_HADOOP_VERSION=3.1.1
ATLAS_BACKEND=hbase
+
+# OpenTelemetry javaagent (same pattern as ATLAS_BACKEND: set here or override at runtime).
+# When true, loads WEB-INF/lib/opentelemetry-javaagent.jar with Prometheus metrics exporter.
+# Use 0.0.0.0 here so http://localhost:9464/metrics from the host works with Docker port mapping.
+ATLAS_OTEL_JAVAAGENT_ENABLED=false
+ATLAS_OTEL_PROMETHEUS_PORT=9464
+ATLAS_OTEL_PROMETHEUS_HOST=0.0.0.0
diff --git a/dev-support/atlas-docker/Dockerfile.atlas b/dev-support/atlas-docker/Dockerfile.atlas
index b46b8eb2d44..7748af83cef 100644
--- a/dev-support/atlas-docker/Dockerfile.atlas
+++ b/dev-support/atlas-docker/Dockerfile.atlas
@@ -17,6 +17,9 @@
FROM atlas-base:latest
ARG ATLAS_BACKEND
+ARG ATLAS_OTEL_JAVAAGENT_ENABLED=false
+ARG ATLAS_OTEL_PROMETHEUS_PORT=9464
+ARG ATLAS_OTEL_PROMETHEUS_HOST=0.0.0.0
ARG ATLAS_SERVER_JAVA_VERSION
ARG ATLAS_VERSION
ARG TARGETARCH
@@ -40,6 +43,12 @@ COPY ./scripts/hbase-site.xml ${ATLAS_HOME}/hbase/conf/
VOLUME /home/atlas/data
+# OpenTelemetry javaagent — runtime env (compose / docker run -e), aligned with ATLAS_BACKEND.
+ENV ATLAS_OTEL_JAVAAGENT_ENABLED=${ATLAS_OTEL_JAVAAGENT_ENABLED}
+ENV ATLAS_OTEL_PROMETHEUS_PORT=${ATLAS_OTEL_PROMETHEUS_PORT}
+ENV ATLAS_OTEL_PROMETHEUS_HOST=${ATLAS_OTEL_PROMETHEUS_HOST}
+
EXPOSE 21000
+EXPOSE 9464
ENTRYPOINT [ "/home/atlas/scripts/atlas.sh" ]
diff --git a/dev-support/atlas-docker/docker-compose.atlas.yml b/dev-support/atlas-docker/docker-compose.atlas.yml
index 54bb7c164a0..ac890449cc5 100644
--- a/dev-support/atlas-docker/docker-compose.atlas.yml
+++ b/dev-support/atlas-docker/docker-compose.atlas.yml
@@ -5,6 +5,9 @@ services:
dockerfile: Dockerfile.atlas
args:
- ATLAS_BACKEND=${ATLAS_BACKEND}
+ - ATLAS_OTEL_JAVAAGENT_ENABLED=${ATLAS_OTEL_JAVAAGENT_ENABLED:-false}
+ - ATLAS_OTEL_PROMETHEUS_PORT=${ATLAS_OTEL_PROMETHEUS_PORT:-9464}
+ - ATLAS_OTEL_PROMETHEUS_HOST=${ATLAS_OTEL_PROMETHEUS_HOST:-0.0.0.0}
- ATLAS_SERVER_JAVA_VERSION=${ATLAS_SERVER_JAVA_VERSION}
- ATLAS_VERSION=${ATLAS_VERSION}
image: atlas:latest
@@ -18,6 +21,8 @@ services:
- ./data:/home/atlas/data
ports:
- "21000:21000"
+ # OpenTelemetry Prometheus exporter (matches ATLAS_OTEL_PROMETHEUS_PORT in the container).
+ - "${ATLAS_OTEL_PROMETHEUS_PORT:-9464}:${ATLAS_OTEL_PROMETHEUS_PORT:-9464}"
depends_on:
atlas-backend:
condition: service_healthy
@@ -31,6 +36,10 @@ services:
- ATLAS_BACKEND
- ATLAS_SERVER_JAVA_VERSION
- ATLAS_VERSION
+ - ATLAS_OTEL_JAVAAGENT_ENABLED
+ - ATLAS_OTEL_PROMETHEUS_PORT
+ - ATLAS_OTEL_PROMETHEUS_HOST
+
command:
- /home/atlas/scripts/atlas.sh
diff --git a/dev-support/atlas-docker/scripts/atlas.sh b/dev-support/atlas-docker/scripts/atlas.sh
index f0879538337..a63bd73e1da 100755
--- a/dev-support/atlas-docker/scripts/atlas.sh
+++ b/dev-support/atlas-docker/scripts/atlas.sh
@@ -79,7 +79,8 @@ EOF
touch ${ATLAS_HOME}/.setupDone
fi
-su -c "cd ${ATLAS_HOME}/bin && ./atlas_start.py" atlas
+# Preserve env so Docker `-e` (e.g. ATLAS_OTEL_*, ATLAS_BACKEND) reaches atlas_start.py.
+su --preserve-environment atlas -c "cd ${ATLAS_HOME}/bin && ./atlas_start.py"
ATLAS_PID=`ps -ef | grep -v grep | grep -i "org.apache.atlas.Atlas" | awk '{print $2}'`
# prevent the container from exiting
diff --git a/distro/src/bin/atlas_config.py b/distro/src/bin/atlas_config.py
index 70030ac5cce..e0f5ac8139e 100755
--- a/distro/src/bin/atlas_config.py
+++ b/distro/src/bin/atlas_config.py
@@ -59,9 +59,14 @@
SOLR_REPLICATION_FACTOR = "SOLR_REPLICATION_FACTOR"
DEFAULT_SOLR_REPLICATION_FACTOR = "1"
+ATLAS_OTEL_JAVAAGENT_ENABLED = "ATLAS_OTEL_JAVAAGENT_ENABLED"
+ATLAS_OTEL_PROMETHEUS_PORT = "ATLAS_OTEL_PROMETHEUS_PORT"
+ATLAS_OTEL_PROMETHEUS_HOST = "ATLAS_OTEL_PROMETHEUS_HOST"
+
ENV_KEYS = ["JAVA_HOME", ATLAS_OPTS, ATLAS_SERVER_OPTS, ATLAS_SERVER_HEAP, ATLAS_LOG, ATLAS_PID, ATLAS_CONF,
"ATLASCPPATH", ATLAS_DATA, ATLAS_HOME, ATLAS_WEBAPP, HBASE_CONF_DIR, SOLR_PORT, MANAGE_LOCAL_HBASE,
- MANAGE_LOCAL_SOLR, MANAGE_EMBEDDED_CASSANDRA, MANAGE_LOCAL_ELASTICSEARCH, SOLR_HOME, SOLR_DIR]
+ MANAGE_LOCAL_SOLR, MANAGE_EMBEDDED_CASSANDRA, MANAGE_LOCAL_ELASTICSEARCH, SOLR_HOME, SOLR_DIR,
+ ATLAS_OTEL_JAVAAGENT_ENABLED, ATLAS_OTEL_PROMETHEUS_PORT, ATLAS_OTEL_PROMETHEUS_HOST]
IS_WINDOWS = platform.system() == "Windows"
ON_POSIX = 'posix' in sys.builtin_module_names
CONF_FILE="atlas-application.properties"
diff --git a/distro/src/bin/atlas_start.py b/distro/src/bin/atlas_start.py
index 1bcbb8becb6..f71f7340485 100755
--- a/distro/src/bin/atlas_start.py
+++ b/distro/src/bin/atlas_start.py
@@ -27,6 +27,48 @@
DEFAULT_JVM_HEAP_OPTS="-Xmx1024m"
DEFAULT_JVM_OPTS="-Dlogback.configurationFile=atlas-logback.xml -Djava.net.preferIPv4Stack=true -server"
+OTEL_JAVAAGENT_WEBINF_LIB_NAME = "opentelemetry-javaagent.jar"
+DEFAULT_OTEL_PROMETHEUS_PORT = "9464"
+
+
+def _truthy_env(val):
+ if val is None:
+ return False
+ return str(val).strip().lower() in ("1", "true", "yes", "on")
+
+
+def otel_javaagent_jvm_opts(web_app_dir):
+ """
+ Optional OpenTelemetry javaagent from expanded WEB-INF/lib (packaged in atlas.war).
+ Enable with ATLAS_OTEL_JAVAAGENT_ENABLED (e.g. from Docker env).
+ """
+ if not _truthy_env(os.environ.get(mc.ATLAS_OTEL_JAVAAGENT_ENABLED)):
+ return []
+ jar_fs = os.path.join(web_app_dir, "atlas", "WEB-INF", "lib", OTEL_JAVAAGENT_WEBINF_LIB_NAME)
+ if mc.isCygwin():
+ jar_for_java = mc.convertCygwinPath(jar_fs)
+ else:
+ jar_for_java = jar_fs
+ if not os.path.isfile(jar_fs):
+ raise RuntimeError(
+ "%s is true but agent JAR was not found at %s. "
+ "Ensure the web application was built with opentelemetry-javaagent in WEB-INF/lib."
+ % (mc.ATLAS_OTEL_JAVAAGENT_ENABLED, jar_fs)
+ )
+ port = (os.environ.get(mc.ATLAS_OTEL_PROMETHEUS_PORT) or DEFAULT_OTEL_PROMETHEUS_PORT).strip()
+ if not port:
+ port = DEFAULT_OTEL_PROMETHEUS_PORT
+ host = (os.environ.get(mc.ATLAS_OTEL_PROMETHEUS_HOST) or "127.0.0.1").strip()
+ if not host:
+ host = "127.0.0.1"
+ return [
+ "-javaagent:%s" % jar_for_java,
+ "-Dotel.exporter.prometheus.port=%s" % port,
+ "-Dotel.metrics.exporter=prometheus",
+ "-Dotel.exporter.prometheus.host=%s" % host
+ ]
+
+
def main():
is_setup = (len(sys.argv)>1) and sys.argv[1] is not None and sys.argv[1] == '-setup'
@@ -46,6 +88,9 @@ def main():
jvm_confdir = confdir
jvm_logdir = logdir
+ web_app_dir = mc.webAppDir(atlas_home)
+ mc.expandWebApp(atlas_home)
+
#create sys property for conf dirs
if not is_setup:
jvm_opts_list = (ATLAS_LOG_OPTS % (jvm_logdir, "application")).split()
@@ -61,6 +106,8 @@ def main():
atlas_server_heap_opts = os.environ.get(mc.ATLAS_SERVER_HEAP, DEFAULT_JVM_HEAP_OPTS)
jvm_opts_list.extend(atlas_server_heap_opts.split())
+ jvm_opts_list.extend(otel_javaagent_jvm_opts(web_app_dir))
+
atlas_server_jvm_opts = os.environ.get(mc.ATLAS_SERVER_OPTS)
if atlas_server_jvm_opts:
jvm_opts_list.extend(atlas_server_jvm_opts.split())
@@ -68,14 +115,10 @@ def main():
atlas_jvm_opts = os.environ.get(mc.ATLAS_OPTS, DEFAULT_JVM_OPTS)
jvm_opts_list.extend(atlas_jvm_opts.split())
- #expand web app dir
- web_app_dir = mc.webAppDir(atlas_home)
- mc.expandWebApp(atlas_home)
-
p = os.pathsep
atlas_classpath = confdir + p \
+ os.path.join(web_app_dir, "atlas", "WEB-INF", "classes" ) + p \
- + os.path.join(web_app_dir, "atlas", "WEB-INF", "lib", "*" ) + p \
+ + os.path.join(web_app_dir, "atlas", "WEB-INF", "lib", "*" ) + p \
+ os.path.join(atlas_home, "libext", "*")
is_hbase = mc.is_hbase(confdir)
diff --git a/pom.xml b/pom.xml
index 08fbd2b8593..33d3d8b4575 100644
--- a/pom.xml
+++ b/pom.xml
@@ -165,6 +165,7 @@
6.13.7
3.4.0
5.0
+ 2.27.0
2.7
5.4.0
5.4.0
diff --git a/webapp/pom.xml b/webapp/pom.xml
index 9f5c5bb4e6f..9f3428c1446 100755
--- a/webapp/pom.xml
+++ b/webapp/pom.xml
@@ -500,6 +500,33 @@
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-opentelemetry-javaagent
+
+ copy
+
+ prepare-package
+
+
+
+ io.opentelemetry.javaagent
+ opentelemetry-javaagent
+ ${opentelemetry.javaagent.version}
+ jar
+ true
+ opentelemetry-javaagent.jar
+
+
+ ${project.build.directory}/otel-agent
+
+
+
+
+
org.apache.maven.plugins
maven-war-plugin
@@ -525,6 +552,13 @@
${project.build.directory}/api/v2/apidocs/ui
apidocs
+
+ ${project.build.directory}/otel-agent
+ WEB-INF/lib
+
+ opentelemetry-javaagent.jar
+
+