Browse Source

Rename TracerPlugin to TelemetryPlugin (#99735)

with the support of metrics the TracerPlugin name is no longer adequate. Renaming this to TelemetryPlugin.
Also introducing TelemetryProvider interface. While it is only used in Node.java at the moment to fetch Tracer instance, it is intended to be used in Plugin::createComponents (to be done in separate commit due to
the broad scope of this method)
This will allow for plugins to get access to both Tracer and Metric interfaces
without the need to add yet another argument to createComponents

Also adding internal subpackage in module/apm so that it is more obvious
which packages are not exported
Przemyslaw Gomulka 2 years ago
parent
commit
0efa67821d

+ 1 - 1
TRACING.md

@@ -158,6 +158,6 @@ explicitly opening a scope via the `Tracer`.
 [otel]: https://opentelemetry.io/
 [thread-context]: ./server/src/main/java/org/elasticsearch/common/util/concurrent/ThreadContext.java
 [w3c]: https://www.w3.org/TR/trace-context/
-[tracing]: ./server/src/main/java/org/elasticsearch/tracing
+[tracing]: ./server/src/main/java/org/elasticsearch/telemetry
 [agent-config]: https://www.elastic.co/guide/en/apm/agent/java/master/configuration.html
 [agent]: https://www.elastic.co/guide/en/apm/agent/java/current/index.html

+ 2 - 2
distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/APMJvmOptions.java

@@ -32,7 +32,7 @@ import java.util.Set;
 import java.util.StringJoiner;
 
 /**
- * This class is responsible for working out if APM tracing is configured and if so, preparing
+ * This class is responsible for working out if APM telemetry is configured and if so, preparing
  * a temporary config file for the APM Java agent and CLI options to the JVM to configure APM.
  * APM doesn't need to be enabled, as that can be toggled at runtime, but some configuration e.g.
  * server URL and secret key can only be provided when Elasticsearch starts.
@@ -128,7 +128,7 @@ class APMJvmOptions {
     );
 
     /**
-     * This method works out if APM tracing is enabled, and if so, prepares a temporary config file
+     * This method works out if APM telemetry is enabled, and if so, prepares a temporary config file
      * for the APM Java agent and CLI options to the JVM to configure APM. The config file is temporary
      * because it will be deleted once Elasticsearch starts.
      *

+ 13 - 11
modules/apm/src/main/java/org/elasticsearch/telemetry/apm/APM.java

@@ -21,11 +21,13 @@ import org.elasticsearch.env.NodeEnvironment;
 import org.elasticsearch.indices.IndicesService;
 import org.elasticsearch.plugins.NetworkPlugin;
 import org.elasticsearch.plugins.Plugin;
-import org.elasticsearch.plugins.TracerPlugin;
+import org.elasticsearch.plugins.TelemetryPlugin;
 import org.elasticsearch.repositories.RepositoriesService;
 import org.elasticsearch.script.ScriptService;
-import org.elasticsearch.telemetry.apm.settings.APMAgentSettings;
-import org.elasticsearch.telemetry.apm.tracing.APMTracer;
+import org.elasticsearch.telemetry.TelemetryProvider;
+import org.elasticsearch.telemetry.apm.internal.APMAgentSettings;
+import org.elasticsearch.telemetry.apm.internal.APMTelemetryProvider;
+import org.elasticsearch.telemetry.apm.internal.tracing.APMTracer;
 import org.elasticsearch.telemetry.tracing.Tracer;
 import org.elasticsearch.threadpool.ThreadPool;
 import org.elasticsearch.watcher.ResourceWatcherService;
@@ -55,8 +57,8 @@ import java.util.function.Supplier;
  * be passed via system properties to the Java agent, which periodically checks for changes
  * and applies the new settings values, provided those settings can be dynamically updated.
  */
-public class APM extends Plugin implements NetworkPlugin, TracerPlugin {
-    private final SetOnce<APMTracer> tracer = new SetOnce<>();
+public class APM extends Plugin implements NetworkPlugin, TelemetryPlugin {
+    private final SetOnce<APMTelemetryProvider> telemetryProvider = new SetOnce<>();
     private final Settings settings;
 
     public APM(Settings settings) {
@@ -64,10 +66,10 @@ public class APM extends Plugin implements NetworkPlugin, TracerPlugin {
     }
 
     @Override
-    public Tracer getTracer(Settings settings) {
-        final APMTracer apmTracer = new APMTracer(settings);
-        tracer.set(apmTracer);
-        return apmTracer;
+    public TelemetryProvider getTelemetryProvider(Settings settings) {
+        final APMTelemetryProvider apmTelemetryProvider = new APMTelemetryProvider(settings);
+        telemetryProvider.set(apmTelemetryProvider);
+        return apmTelemetryProvider;
     }
 
     @Override
@@ -87,14 +89,14 @@ public class APM extends Plugin implements NetworkPlugin, TracerPlugin {
         AllocationService allocationService,
         IndicesService indicesService
     ) {
-        final APMTracer apmTracer = tracer.get();
+        final APMTracer apmTracer = telemetryProvider.get().getTracer();
 
         apmTracer.setClusterName(clusterService.getClusterName().value());
         apmTracer.setNodeName(clusterService.getNodeName());
 
         final APMAgentSettings apmAgentSettings = new APMAgentSettings();
         apmAgentSettings.syncAgentSystemProperties(settings);
-        apmAgentSettings.addClusterSettingsListeners(clusterService, apmTracer);
+        apmAgentSettings.addClusterSettingsListeners(clusterService, telemetryProvider.get());
 
         return List.of(apmTracer);
     }

+ 5 - 3
modules/apm/src/main/java/org/elasticsearch/telemetry/apm/settings/APMAgentSettings.java → modules/apm/src/main/java/org/elasticsearch/telemetry/apm/internal/APMAgentSettings.java

@@ -6,7 +6,7 @@
  * Side Public License, v 1.
  */
 
-package org.elasticsearch.telemetry.apm.settings;
+package org.elasticsearch.telemetry.apm.internal;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -17,7 +17,7 @@ import org.elasticsearch.common.settings.SecureString;
 import org.elasticsearch.common.settings.Setting;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.core.SuppressForbidden;
-import org.elasticsearch.telemetry.apm.tracing.APMTracer;
+import org.elasticsearch.telemetry.apm.internal.tracing.APMTracer;
 
 import java.security.AccessController;
 import java.security.PrivilegedAction;
@@ -42,8 +42,10 @@ public class APMAgentSettings {
      */
     static Map<String, String> APM_AGENT_DEFAULT_SETTINGS = Map.of("transaction_sample_rate", "0.2");
 
-    public void addClusterSettingsListeners(ClusterService clusterService, APMTracer apmTracer) {
+    public void addClusterSettingsListeners(ClusterService clusterService, APMTelemetryProvider apmTelemetryProvider) {
         final ClusterSettings clusterSettings = clusterService.getClusterSettings();
+        final APMTracer apmTracer = apmTelemetryProvider.getTracer();
+
         clusterSettings.addSettingsUpdateConsumer(APM_ENABLED_SETTING, enabled -> {
             apmTracer.setEnabled(enabled);
             // The agent records data other than spans, e.g. JVM metrics, so we toggle this setting in order to

+ 28 - 0
modules/apm/src/main/java/org/elasticsearch/telemetry/apm/internal/APMTelemetryProvider.java

@@ -0,0 +1,28 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+package org.elasticsearch.telemetry.apm.internal;
+
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.telemetry.TelemetryProvider;
+import org.elasticsearch.telemetry.apm.internal.tracing.APMTracer;
+
+public class APMTelemetryProvider implements TelemetryProvider {
+    private final Settings settings;
+    private final APMTracer apmTracer;
+
+    public APMTelemetryProvider(Settings settings) {
+        this.settings = settings;
+        apmTracer = new APMTracer(settings);
+    }
+
+    @Override
+    public APMTracer getTracer() {
+        return apmTracer;
+    }
+}

+ 5 - 5
modules/apm/src/main/java/org/elasticsearch/telemetry/apm/tracing/APMTracer.java → modules/apm/src/main/java/org/elasticsearch/telemetry/apm/internal/tracing/APMTracer.java

@@ -6,7 +6,7 @@
  * Side Public License, v 1.
  */
 
-package org.elasticsearch.telemetry.apm.tracing;
+package org.elasticsearch.telemetry.apm.internal.tracing;
 
 import io.opentelemetry.api.GlobalOpenTelemetry;
 import io.opentelemetry.api.OpenTelemetry;
@@ -43,10 +43,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-import static org.elasticsearch.telemetry.apm.settings.APMAgentSettings.APM_ENABLED_SETTING;
-import static org.elasticsearch.telemetry.apm.settings.APMAgentSettings.APM_TRACING_NAMES_EXCLUDE_SETTING;
-import static org.elasticsearch.telemetry.apm.settings.APMAgentSettings.APM_TRACING_NAMES_INCLUDE_SETTING;
-import static org.elasticsearch.telemetry.apm.settings.APMAgentSettings.APM_TRACING_SANITIZE_FIELD_NAMES;
+import static org.elasticsearch.telemetry.apm.internal.APMAgentSettings.APM_ENABLED_SETTING;
+import static org.elasticsearch.telemetry.apm.internal.APMAgentSettings.APM_TRACING_NAMES_EXCLUDE_SETTING;
+import static org.elasticsearch.telemetry.apm.internal.APMAgentSettings.APM_TRACING_NAMES_INCLUDE_SETTING;
+import static org.elasticsearch.telemetry.apm.internal.APMAgentSettings.APM_TRACING_SANITIZE_FIELD_NAMES;
 
 /**
  * This is an implementation of the {@link org.elasticsearch.telemetry.tracing.Tracer} interface, which uses

+ 1 - 1
modules/apm/src/test/java/org/elasticsearch/telemetry/apm/settings/APMAgentSettingsTests.java → modules/apm/src/test/java/org/elasticsearch/telemetry/apm/internal/APMAgentSettingsTests.java

@@ -6,7 +6,7 @@
  * Side Public License, v 1.
  */
 
-package org.elasticsearch.telemetry.apm.settings;
+package org.elasticsearch.telemetry.apm.internal;
 
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.test.ESTestCase;

+ 2 - 2
modules/apm/src/test/java/org/elasticsearch/telemetry/apm/tracing/APMTracerTests.java → modules/apm/src/test/java/org/elasticsearch/telemetry/apm/internal/tracing/APMTracerTests.java

@@ -6,7 +6,7 @@
  * Side Public License, v 1.
  */
 
-package org.elasticsearch.telemetry.apm.tracing;
+package org.elasticsearch.telemetry.apm.internal.tracing;
 
 import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.api.common.Attributes;
@@ -21,7 +21,7 @@ import org.apache.lucene.util.automaton.CharacterRunAutomaton;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.util.concurrent.ThreadContext;
 import org.elasticsearch.tasks.Task;
-import org.elasticsearch.telemetry.apm.settings.APMAgentSettings;
+import org.elasticsearch.telemetry.apm.internal.APMAgentSettings;
 import org.elasticsearch.telemetry.tracing.SpanId;
 import org.elasticsearch.test.ESTestCase;
 

+ 1 - 0
server/src/main/java/module-info.java

@@ -383,6 +383,7 @@ module org.elasticsearch.server {
             org.elasticsearch.serverless.constants,
             org.elasticsearch.serverless.apifiltering;
     exports org.elasticsearch.telemetry.tracing;
+    exports org.elasticsearch.telemetry;
 
     provides java.util.spi.CalendarDataProvider with org.elasticsearch.common.time.IsoCalendarDataProvider;
     provides org.elasticsearch.xcontent.ErrorOnUnknown with org.elasticsearch.common.xcontent.SuggestingErrorOnUnknown;

+ 9 - 7
server/src/main/java/org/elasticsearch/node/Node.java

@@ -179,7 +179,7 @@ import org.elasticsearch.plugins.ScriptPlugin;
 import org.elasticsearch.plugins.SearchPlugin;
 import org.elasticsearch.plugins.ShutdownAwarePlugin;
 import org.elasticsearch.plugins.SystemIndexPlugin;
-import org.elasticsearch.plugins.TracerPlugin;
+import org.elasticsearch.plugins.TelemetryPlugin;
 import org.elasticsearch.plugins.internal.DocumentParsingObserver;
 import org.elasticsearch.plugins.internal.DocumentParsingObserverPlugin;
 import org.elasticsearch.plugins.internal.ReloadAwarePlugin;
@@ -213,6 +213,7 @@ import org.elasticsearch.tasks.Task;
 import org.elasticsearch.tasks.TaskCancellationService;
 import org.elasticsearch.tasks.TaskManager;
 import org.elasticsearch.tasks.TaskResultsService;
+import org.elasticsearch.telemetry.TelemetryProvider;
 import org.elasticsearch.telemetry.tracing.Tracer;
 import org.elasticsearch.threadpool.ExecutorBuilder;
 import org.elasticsearch.threadpool.ThreadPool;
@@ -456,7 +457,8 @@ public class Node implements Closeable {
                 Task.HEADERS_TO_COPY.stream()
             ).collect(Collectors.toSet());
 
-            final Tracer tracer = getTracer(pluginsService, settings);
+            final TelemetryProvider telemetryProvider = getTelemetryProvider(pluginsService, settings);
+            final Tracer tracer = telemetryProvider.getTracer();
 
             final TaskManager taskManager = new TaskManager(settings, threadPool, taskHeaders, tracer);
 
@@ -1287,14 +1289,14 @@ public class Node implements Closeable {
         };
     }
 
-    private Tracer getTracer(PluginsService pluginsService, Settings settings) {
-        final List<TracerPlugin> tracerPlugins = pluginsService.filterPlugins(TracerPlugin.class);
+    private TelemetryProvider getTelemetryProvider(PluginsService pluginsService, Settings settings) {
+        final List<TelemetryPlugin> telemetryPlugins = pluginsService.filterPlugins(TelemetryPlugin.class);
 
-        if (tracerPlugins.size() > 1) {
-            throw new IllegalStateException("A single TracerPlugin was expected but got: " + tracerPlugins);
+        if (telemetryPlugins.size() > 1) {
+            throw new IllegalStateException("A single TelemetryPlugin was expected but got: " + telemetryPlugins);
         }
 
-        return tracerPlugins.isEmpty() ? Tracer.NOOP : tracerPlugins.get(0).getTracer(settings);
+        return telemetryPlugins.isEmpty() ? TelemetryProvider.NOOP : telemetryPlugins.get(0).getTelemetryProvider(settings);
     }
 
     private HealthService createHealthService(

+ 3 - 3
server/src/main/java/org/elasticsearch/plugins/TracerPlugin.java → server/src/main/java/org/elasticsearch/plugins/TelemetryPlugin.java

@@ -9,8 +9,8 @@
 package org.elasticsearch.plugins;
 
 import org.elasticsearch.common.settings.Settings;
-import org.elasticsearch.telemetry.tracing.Tracer;
+import org.elasticsearch.telemetry.TelemetryProvider;
 
-public interface TracerPlugin {
-    Tracer getTracer(Settings settings);
+public interface TelemetryPlugin {
+    TelemetryProvider getTelemetryProvider(Settings settings);
 }

+ 24 - 0
server/src/main/java/org/elasticsearch/telemetry/TelemetryProvider.java

@@ -0,0 +1,24 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+package org.elasticsearch.telemetry;
+
+import org.elasticsearch.telemetry.tracing.Tracer;
+
+public interface TelemetryProvider {
+    Tracer getTracer();
+
+    TelemetryProvider NOOP = new TelemetryProvider() {
+
+        @Override
+        public Tracer getTracer() {
+            return Tracer.NOOP;
+        }
+
+    };
+}