Browse Source

Make auto-instr work with latest otel-java snapshot (#372)

* Make auto-instr work with latest otel-java snapshot

* Add CircleCI workflow to run nightly test job against otel-java snapshot

* Decrease snapshot versions cache time

* Add comments suggest during review

* Add comments suggest during review

* Add missed helper class

* Use released otel-java 0.4.0

Co-authored-by: Trask Stalnaker <trask.stalnaker@gmail.com>
Nikita Salnikov-Tarnovski 4 years ago
parent
commit
c9cf7ffb61
19 changed files with 92 additions and 69 deletions
  1. 10 0
      .circleci/config.yml
  2. 1 1
      agent-tooling/src/main/java/io/opentelemetry/auto/tooling/TracerInstaller.java
  3. 5 0
      auto-exporters/logging/src/main/java/io/opentelemetry/auto/exporters/logging/LoggingExporter.java
  4. 24 18
      gradle/dependencies.gradle
  5. 8 1
      gradle/java.gradle
  6. 2 0
      instrumentation/dropwizard-testing/src/test/groovy/DropwizardTest.groovy
  7. 1 0
      instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/AbstractInstrumentation.java
  8. 0 1
      instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/context/ContextUtils.java
  9. 38 0
      instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/context/NoopScope.java
  10. 0 7
      instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedDoubleCounter.java
  11. 0 7
      instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedDoubleMeasure.java
  12. 0 7
      instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedDoubleObserver.java
  13. 0 7
      instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedLongCounter.java
  14. 0 7
      instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedLongMeasure.java
  15. 0 7
      instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedLongObserver.java
  16. 1 1
      instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/trace/TracingContextUtils.java
  17. 0 5
      instrumentation/opentelemetry-api-0.3/src/test/groovy/MeterTest.groovy
  18. 1 0
      instrumentation/spring-webmvc-3.1/src/test/groovy/test/boot/SpringBootBasedTest.groovy
  19. 1 0
      instrumentation/spring-webmvc-3.1/src/test/groovy/test/filter/ServletFilterTest.groovy

+ 10 - 0
.circleci/config.yml

@@ -351,3 +351,13 @@ workflows:
               ignore: /.*/
             tags:
               only: /^v.*/
+  nightly_snapshot:
+    triggers:
+      - schedule:
+          cron: "0 0 * * *"
+          filters:
+            branches:
+              only:
+                - depends-on-otel-java-snapshot
+    jobs:
+      - test_8

+ 1 - 1
agent-tooling/src/main/java/io/opentelemetry/auto/tooling/TracerInstaller.java

@@ -69,7 +69,7 @@ public class TracerInstaller {
     if (spanExporterFactory != null) {
       final SpanExporter spanExporter = spanExporterFactory.fromConfig(config);
       OpenTelemetrySdk.getTracerProvider()
-          .addSpanProcessor(SimpleSpansProcessor.newBuilder(spanExporter).build());
+          .addSpanProcessor(SimpleSpansProcessor.create(spanExporter));
       log.info("Installed span exporter: " + spanExporter.getClass().getName());
     } else {
       log.warn("No matching providers in jar " + exporterJar);

+ 5 - 0
auto-exporters/logging/src/main/java/io/opentelemetry/auto/exporters/logging/LoggingExporter.java

@@ -57,6 +57,11 @@ public class LoggingExporter implements SpanExporter {
     return ResultCode.SUCCESS;
   }
 
+  @Override
+  public ResultCode flush() {
+    return ResultCode.SUCCESS;
+  }
+
   @Override
   public void shutdown() {}
 }

+ 24 - 18
gradle/dependencies.gradle

@@ -1,9 +1,14 @@
 def groovyVer = "2.5.11"
 def spockGroovyVer = groovyVer.replaceAll(/\.\d+$/, '')
 
+// this is only needed for the working against unreleased otel-java snapshots
+configurations.all {
+  resolutionStrategy.cacheChangingModulesFor 12, 'hours'
+}
+
 ext {
   versions = [
-    opentelemetry: '0.3.0',
+    opentelemetry: '0.4.0',
 
     slf4j        : "1.7.30",
     guava        : "20.0", // Last version to support Java 7
@@ -21,18 +26,19 @@ ext {
 
   deps = [
     // OpenTelemetry
-    opentelemetryApi          : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-api', version: versions.opentelemetry),
-    opentelemetrySdk          : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-sdk', version: versions.opentelemetry),
-    opentelemetrySdkAutoConfig: dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-sdk-contrib-auto-config', version: versions.opentelemetry),
-    opentelemetryJaeger       : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-exporters-jaeger', version: versions.opentelemetry),
-    opentelemetryOtlp         : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-exporters-otlp', version: versions.opentelemetry),
+    opentelemetryApi               : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-api', version: versions.opentelemetry),
+    opentelemetryApiAutoAnnotations: dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-contrib-auto-annotations', version: versions.opentelemetry),
+    opentelemetrySdk               : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-sdk', version: versions.opentelemetry),
+    opentelemetrySdkAutoConfig     : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-sdk-contrib-auto-config', version: versions.opentelemetry),
+    opentelemetryJaeger            : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-exporters-jaeger', version: versions.opentelemetry),
+    opentelemetryOtlp              : dependencies.create(group: 'io.opentelemetry', name: 'opentelemetry-exporters-otlp', version: versions.opentelemetry),
 
     // General
-    slf4j                     : "org.slf4j:slf4j-api:${versions.slf4j}",
-    guava                     : "com.google.guava:guava:$versions.guava",
-    bytebuddy                 : dependencies.create(group: 'net.bytebuddy', name: 'byte-buddy', version: "${versions.bytebuddy}"),
-    bytebuddyagent            : dependencies.create(group: 'net.bytebuddy', name: 'byte-buddy-agent', version: "${versions.bytebuddy}"),
-    autoservice               : [
+    slf4j                          : "org.slf4j:slf4j-api:${versions.slf4j}",
+    guava                          : "com.google.guava:guava:$versions.guava",
+    bytebuddy                      : dependencies.create(group: 'net.bytebuddy', name: 'byte-buddy', version: "${versions.bytebuddy}"),
+    bytebuddyagent                 : dependencies.create(group: 'net.bytebuddy', name: 'byte-buddy-agent', version: "${versions.bytebuddy}"),
+    autoservice                    : [
       dependencies.create(group: 'com.google.auto.service', name: 'auto-service', version: '1.0-rc3'),
       dependencies.create(group: 'com.google.auto', name: 'auto-common', version: '0.8'),
       // These are the last versions that support guava 20.0.  Upgrading has odd interactions with shadow.
@@ -41,23 +47,23 @@ ext {
 
     // Testing
 
-    spock                     : [
+    spock                          : [
       dependencies.create("org.spockframework:spock-core:${versions.spock}", {
         exclude group: 'org.codehaus.groovy', module: 'groovy-all'
       }),
       // Used by Spock for mocking:
       dependencies.create(group: 'org.objenesis', name: 'objenesis', version: '2.6') // Last version to support Java7
     ],
-    groovy                    : "org.codehaus.groovy:groovy-all:${versions.groovy}",
-    testcontainers            : "org.testcontainers:testcontainers:1.12.2",
-    testLogging               : [
+    groovy                         : "org.codehaus.groovy:groovy-all:${versions.groovy}",
+    testcontainers                 : "org.testcontainers:testcontainers:1.12.2",
+    testLogging                    : [
       dependencies.create(group: 'ch.qos.logback', name: 'logback-classic', version: versions.logback),
       dependencies.create(group: 'org.slf4j', name: 'log4j-over-slf4j', version: versions.slf4j),
       dependencies.create(group: 'org.slf4j', name: 'jcl-over-slf4j', version: versions.slf4j),
       dependencies.create(group: 'org.slf4j', name: 'jul-to-slf4j', version: versions.slf4j),
     ],
-    scala                     : dependencies.create(group: 'org.scala-lang', name: 'scala-library', version: "${versions.scala}"),
-    kotlin                    : dependencies.create(group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: "${versions.kotlin}"),
-    coroutines                : dependencies.create(group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: "${versions.coroutines}"),
+    scala                          : dependencies.create(group: 'org.scala-lang', name: 'scala-library', version: "${versions.scala}"),
+    kotlin                         : dependencies.create(group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: "${versions.kotlin}"),
+    coroutines                     : dependencies.create(group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: "${versions.coroutines}"),
   ]
 }

+ 8 - 1
gradle/java.gradle

@@ -128,7 +128,6 @@ tasks.register("packageSources", Jar) {
 artifacts.archives packageSources
 
 repositories {
-  mavenLocal()
   jcenter()
   mavenCentral()
   maven {
@@ -137,6 +136,14 @@ repositories {
   maven {
     url "https://repo.typesafe.com/typesafe/releases"
   }
+  // this is only needed for the working against unreleased otel-java snapshots
+  maven {
+    url "https://oss.jfrog.org/artifactory/oss-snapshot-local"
+    content {
+      includeGroup "io.opentelemetry"
+    }
+  }
+  mavenLocal()
 }
 
 dependencies {

+ 2 - 0
instrumentation/dropwizard-testing/src/test/groovy/DropwizardTest.groovy

@@ -124,6 +124,8 @@ class DropwizardTest extends HttpServerTest<DropwizardTestSupport> {
         "$Tags.HTTP_METHOD" method
         "$Tags.HTTP_STATUS" endpoint.status
         "span.origin.type" ServletHandler.CachedChain.name
+        "servlet.context" ""
+        "servlet.path" ""
         if (endpoint.errored) {
           "error.msg" { it == null || it == EXCEPTION.body }
           "error.type" { it == null || it == Exception.name }

+ 1 - 0
instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/AbstractInstrumentation.java

@@ -30,6 +30,7 @@ public abstract class AbstractInstrumentation extends Instrumenter.Default {
     return new String[] {
       packageName + ".context.ContextUtils",
       packageName + ".context.UnshadedScope",
+      packageName + ".context.NoopScope",
       packageName + ".context.propagation.UnshadedContextPropagators",
       packageName + ".context.propagation.UnshadedHttpTextFormat",
       packageName + ".context.propagation.UnshadedHttpTextFormat$UnshadedSetter",

+ 0 - 1
instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/context/ContextUtils.java

@@ -18,7 +18,6 @@ package io.opentelemetry.auto.instrumentation.opentelemetryapi.context;
 import io.opentelemetry.auto.bootstrap.ContextStore;
 import lombok.extern.slf4j.Slf4j;
 import unshaded.io.grpc.Context;
-import unshaded.io.opentelemetry.context.NoopScope;
 import unshaded.io.opentelemetry.context.Scope;
 
 @Slf4j

+ 38 - 0
instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/context/NoopScope.java

@@ -0,0 +1,38 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.opentelemetry.auto.instrumentation.opentelemetryapi.context;
+
+import unshaded.io.opentelemetry.context.Scope;
+
+/** A {@link Scope} that does nothing when it is created or closed. */
+public final class NoopScope implements Scope {
+  /**
+   * Returns the singleton instance of {@code NoopScope}.
+   *
+   * @return the singleton instance of {@code NoopScope}.
+   * @since 0.1.0
+   */
+  public static Scope getInstance() {
+    return INSTANCE;
+  }
+
+  private static final Scope INSTANCE = new NoopScope();
+
+  private NoopScope() {}
+
+  @Override
+  public void close() {}
+}

+ 0 - 7
instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedDoubleCounter.java

@@ -15,7 +15,6 @@
  */
 package io.opentelemetry.auto.instrumentation.opentelemetryapi.metrics;
 
-import java.util.List;
 import java.util.Map;
 import unshaded.io.opentelemetry.metrics.DoubleCounter;
 
@@ -82,12 +81,6 @@ class UnshadedDoubleCounter implements DoubleCounter {
       return this;
     }
 
-    @Override
-    public DoubleCounter.Builder setLabelKeys(final List<String> labelKeys) {
-      shadedBuilder.setLabelKeys(labelKeys);
-      return this;
-    }
-
     @Override
     public DoubleCounter.Builder setConstantLabels(final Map<String, String> constantLabels) {
       shadedBuilder.setConstantLabels(constantLabels);

+ 0 - 7
instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedDoubleMeasure.java

@@ -15,7 +15,6 @@
  */
 package io.opentelemetry.auto.instrumentation.opentelemetryapi.metrics;
 
-import java.util.List;
 import java.util.Map;
 import unshaded.io.opentelemetry.metrics.DoubleMeasure;
 
@@ -82,12 +81,6 @@ class UnshadedDoubleMeasure implements DoubleMeasure {
       return this;
     }
 
-    @Override
-    public DoubleMeasure.Builder setLabelKeys(final List<String> labelKeys) {
-      shadedBuilder.setLabelKeys(labelKeys);
-      return this;
-    }
-
     @Override
     public DoubleMeasure.Builder setConstantLabels(final Map<String, String> constantLabels) {
       shadedBuilder.setConstantLabels(constantLabels);

+ 0 - 7
instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedDoubleObserver.java

@@ -15,7 +15,6 @@
  */
 package io.opentelemetry.auto.instrumentation.opentelemetryapi.metrics;
 
-import java.util.List;
 import java.util.Map;
 import unshaded.io.opentelemetry.metrics.DoubleObserver;
 
@@ -85,12 +84,6 @@ class UnshadedDoubleObserver implements DoubleObserver {
       return this;
     }
 
-    @Override
-    public DoubleObserver.Builder setLabelKeys(final List<String> labelKeys) {
-      shadedBuilder.setLabelKeys(labelKeys);
-      return this;
-    }
-
     @Override
     public DoubleObserver.Builder setConstantLabels(final Map<String, String> constantLabels) {
       shadedBuilder.setConstantLabels(constantLabels);

+ 0 - 7
instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedLongCounter.java

@@ -15,7 +15,6 @@
  */
 package io.opentelemetry.auto.instrumentation.opentelemetryapi.metrics;
 
-import java.util.List;
 import java.util.Map;
 import unshaded.io.opentelemetry.metrics.LongCounter;
 
@@ -81,12 +80,6 @@ class UnshadedLongCounter implements LongCounter {
       return this;
     }
 
-    @Override
-    public LongCounter.Builder setLabelKeys(final List<String> labelKeys) {
-      shadedBuilder.setLabelKeys(labelKeys);
-      return this;
-    }
-
     @Override
     public LongCounter.Builder setConstantLabels(final Map<String, String> constantLabels) {
       shadedBuilder.setConstantLabels(constantLabels);

+ 0 - 7
instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedLongMeasure.java

@@ -15,7 +15,6 @@
  */
 package io.opentelemetry.auto.instrumentation.opentelemetryapi.metrics;
 
-import java.util.List;
 import java.util.Map;
 import unshaded.io.opentelemetry.metrics.LongMeasure;
 
@@ -81,12 +80,6 @@ class UnshadedLongMeasure implements LongMeasure {
       return this;
     }
 
-    @Override
-    public LongMeasure.Builder setLabelKeys(final List<String> labelKeys) {
-      shadedBuilder.setLabelKeys(labelKeys);
-      return this;
-    }
-
     @Override
     public LongMeasure.Builder setConstantLabels(final Map<String, String> constantLabels) {
       shadedBuilder.setConstantLabels(constantLabels);

+ 0 - 7
instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/metrics/UnshadedLongObserver.java

@@ -15,7 +15,6 @@
  */
 package io.opentelemetry.auto.instrumentation.opentelemetryapi.metrics;
 
-import java.util.List;
 import java.util.Map;
 import unshaded.io.opentelemetry.metrics.LongObserver;
 
@@ -84,12 +83,6 @@ class UnshadedLongObserver implements LongObserver {
       return this;
     }
 
-    @Override
-    public LongObserver.Builder setLabelKeys(final List<String> labelKeys) {
-      shadedBuilder.setLabelKeys(labelKeys);
-      return this;
-    }
-
     @Override
     public LongObserver.Builder setConstantLabels(final Map<String, String> constantLabels) {
       shadedBuilder.setConstantLabels(constantLabels);

+ 1 - 1
instrumentation/opentelemetry-api-0.3/src/main/java/io/opentelemetry/auto/instrumentation/opentelemetryapi/trace/TracingContextUtils.java

@@ -19,10 +19,10 @@ import static io.opentelemetry.auto.instrumentation.opentelemetryapi.trace.Bridg
 import static io.opentelemetry.auto.instrumentation.opentelemetryapi.trace.Bridging.toUnshaded;
 
 import io.opentelemetry.auto.bootstrap.ContextStore;
+import io.opentelemetry.auto.instrumentation.opentelemetryapi.context.NoopScope;
 import io.opentelemetry.auto.instrumentation.opentelemetryapi.context.UnshadedScope;
 import lombok.extern.slf4j.Slf4j;
 import unshaded.io.grpc.Context;
-import unshaded.io.opentelemetry.context.NoopScope;
 import unshaded.io.opentelemetry.context.Scope;
 import unshaded.io.opentelemetry.trace.DefaultSpan;
 import unshaded.io.opentelemetry.trace.Span;

+ 0 - 5
instrumentation/opentelemetry-api-0.3/src/test/groovy/MeterTest.groovy

@@ -38,7 +38,6 @@ class MeterTest extends AgentTestRunner {
     def instrument = meter."$builderMethod"("test")
       .setDescription("d")
       .setUnit("u")
-      .setLabelKeys(["a", "b"]) // TODO how to validate these?
       .setConstantLabels(["m": "n", "o": "p"])
       .setMonotonic(monotonic)
       .build()
@@ -93,7 +92,6 @@ class MeterTest extends AgentTestRunner {
     def instrument = meter."$builderMethod"("test")
       .setDescription("d")
       .setUnit("u")
-      .setLabelKeys(["a", "b"]) // TODO what are label keys and how to validate them in metric data?
       .setConstantLabels(["m": "n", "o": "p"])
       .build()
     if (bind) {
@@ -144,7 +142,6 @@ class MeterTest extends AgentTestRunner {
     def instrument = meter."$builderMethod"("test")
       .setDescription("d")
       .setUnit("u")
-      .setLabelKeys(["a", "b"]) // TODO what are label keys and how to validate them in metric data?
       .setConstantLabels(["m": "n", "o": "p"])
       .setMonotonic(monotonic)
       .build()
@@ -200,13 +197,11 @@ class MeterTest extends AgentTestRunner {
     def longCounter = meter.longCounterBuilder("test")
       .setDescription("d")
       .setUnit("u")
-      .setLabelKeys(["a", "b"]) // TODO what are label keys and how to validate them in metric data?
       .setConstantLabels(["m": "n", "o": "p"])
       .build()
     def doubleMeasure = meter.doubleMeasureBuilder("test2")
       .setDescription("d")
       .setUnit("u")
-      .setLabelKeys(["a", "b"]) // TODO what are label keys and how to validate them in metric data?
       .setConstantLabels(["m": "n", "o": "p"])
       .build()
 

+ 1 - 0
instrumentation/spring-webmvc-3.1/src/test/groovy/test/boot/SpringBootBasedTest.groovy

@@ -133,6 +133,7 @@ class SpringBootBasedTest extends HttpServerTest<ConfigurableApplicationContext>
         "$Tags.HTTP_STATUS" endpoint.status
         "span.origin.type" ApplicationFilterChain.name
         "servlet.path" endpoint.path
+        "servlet.context" ""
         if (endpoint.errored) {
           "error.msg" { it == null || it == EXCEPTION.body }
           "error.type" { it == null || it == Exception.name }

+ 1 - 0
instrumentation/spring-webmvc-3.1/src/test/groovy/test/filter/ServletFilterTest.groovy

@@ -127,6 +127,7 @@ class ServletFilterTest extends HttpServerTest<ConfigurableApplicationContext> {
         "$Tags.HTTP_STATUS" endpoint.status
         "span.origin.type" ApplicationFilterChain.name
         "servlet.path" endpoint.path
+        "servlet.context" ""
         if (endpoint.errored) {
           "error.msg" { it == null || it == EXCEPTION.body }
           "error.type" { it == null || it == Exception.name }