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 + +