build.gradle 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. plugins {
  2. id "java"
  3. /*
  4. Instrumentation agent extension mechanism expects a single jar containing everything required
  5. for your extension. This also includes any external libraries that your extension uses and
  6. cannot access from application classpath (see comment below about `javax.servlet-api` dependency).
  7. Thus we use Shadow Gradle plugin to package our classes and all required runtime dependencies
  8. into a single jar.
  9. See https://imperceptiblethoughts.com/shadow/ for more details about Shadow plugin.
  10. */
  11. id "com.github.johnrengelman.shadow" version "8.1.1"
  12. id "com.diffplug.spotless" version "6.22.0"
  13. id "io.opentelemetry.instrumentation.muzzle-generation" version "1.31.0-alpha-SNAPSHOT"
  14. id "io.opentelemetry.instrumentation.muzzle-check" version "1.31.0-alpha-SNAPSHOT"
  15. }
  16. group 'io.opentelemetry.example'
  17. version '1.0'
  18. ext {
  19. versions = [
  20. // this line is managed by .github/scripts/update-sdk-version.sh
  21. opentelemetrySdk : "1.30.1",
  22. // these lines are managed by .github/scripts/update-version.sh
  23. opentelemetryJavaagent : "1.31.0-SNAPSHOT",
  24. opentelemetryJavaagentAlpha: "1.31.0-alpha-SNAPSHOT",
  25. junit : "5.10.0"
  26. ]
  27. deps = [
  28. autoservice: dependencies.create(group: 'com.google.auto.service', name: 'auto-service', version: '1.1.1')
  29. ]
  30. }
  31. repositories {
  32. mavenCentral()
  33. maven {
  34. name = "sonatype"
  35. url = uri("https://oss.sonatype.org/content/repositories/snapshots")
  36. }
  37. }
  38. configurations {
  39. /*
  40. We create a separate gradle configuration to grab a published Otel instrumentation agent.
  41. We don't need the agent during development of this extension module.
  42. This agent is used only during integration test.
  43. */
  44. otel
  45. }
  46. spotless {
  47. java {
  48. googleJavaFormat()
  49. licenseHeaderFile(rootProject.file("../../buildscripts/spotless.license.java"), "(package|import|public)")
  50. target("src/**/*.java")
  51. }
  52. }
  53. dependencies {
  54. implementation(platform("io.opentelemetry:opentelemetry-bom:${versions.opentelemetrySdk}"))
  55. // these serve as a test of the instrumentation boms
  56. implementation(platform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:${versions.opentelemetryJavaagent}"))
  57. implementation(platform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:${versions.opentelemetryJavaagentAlpha}"))
  58. /*
  59. Interfaces and SPIs that we implement. We use `compileOnly` dependency because during
  60. runtime all necessary classes are provided by javaagent itself.
  61. */
  62. compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
  63. compileOnly("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api")
  64. compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")
  65. //Provides @AutoService annotation that makes registration of our SPI implementations much easier
  66. compileOnly deps.autoservice
  67. annotationProcessor deps.autoservice
  68. /*
  69. Used by our demo instrumentation module to reference classes of the target instrumented library.
  70. We again use `compileOnly` here because during runtime these classes are provided by the
  71. actual application that we instrument.
  72. NB! Only Advice (and "helper") classes of instrumentation modules can access classes from application classpath.
  73. See https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/contributing/writing-instrumentation-module.md#advice-classes
  74. */
  75. compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
  76. /*
  77. This dependency is required for DemoSpanProcessor both during compile and runtime.
  78. Only dependencies added to `implementation` configuration will be picked up by Shadow plugin
  79. and added to the resulting jar for our extension's distribution.
  80. */
  81. implementation 'org.apache.commons:commons-lang3:3.13.0'
  82. //All dependencies below are only for tests
  83. testImplementation("org.testcontainers:testcontainers:1.19.1")
  84. testImplementation("com.fasterxml.jackson.core:jackson-databind:2.15.2")
  85. testImplementation("com.google.protobuf:protobuf-java-util:3.24.4")
  86. testImplementation("com.squareup.okhttp3:okhttp:4.11.0")
  87. testImplementation("io.opentelemetry:opentelemetry-api")
  88. testImplementation("io.opentelemetry.proto:opentelemetry-proto:1.0.0-alpha")
  89. testImplementation("org.junit.jupiter:junit-jupiter-api:${versions.junit}")
  90. testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${versions.junit}")
  91. testRuntimeOnly("ch.qos.logback:logback-classic:1.4.11")
  92. //Otel Java instrumentation that we use and extend during integration tests
  93. otel("io.opentelemetry.javaagent:opentelemetry-javaagent:${versions.opentelemetryJavaagent}")
  94. //TODO remove when start using io.opentelemetry.instrumentation.javaagent-instrumentation plugin
  95. add("codegen", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:${versions.opentelemetryJavaagentAlpha}")
  96. add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support:${versions.opentelemetryJavaagentAlpha}")
  97. add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:${versions.opentelemetryJavaagentAlpha}")
  98. add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:${versions.opentelemetryJavaagentAlpha}")
  99. }
  100. //Produces a copy of upstream javaagent with this extension jar included inside it
  101. //The location of extension directory inside agent jar is hard-coded in the agent source code
  102. task extendedAgent(type: Jar) {
  103. dependsOn(configurations.otel)
  104. archiveFileName = "opentelemetry-javaagent.jar"
  105. from zipTree(configurations.otel.singleFile)
  106. from(tasks.shadowJar.archiveFile) {
  107. into "extensions"
  108. }
  109. //Preserve MANIFEST.MF file from the upstream javaagent
  110. doFirst {
  111. manifest.from(
  112. zipTree(configurations.otel.singleFile).matching {
  113. include 'META-INF/MANIFEST.MF'
  114. }.singleFile
  115. )
  116. }
  117. }
  118. tasks {
  119. test {
  120. useJUnitPlatform()
  121. inputs.files(layout.files(tasks.shadowJar))
  122. inputs.files(layout.files(tasks.extendedAgent))
  123. systemProperty 'io.opentelemetry.smoketest.agentPath', configurations.otel.singleFile.absolutePath
  124. systemProperty 'io.opentelemetry.smoketest.extendedAgentPath', tasks.extendedAgent.archiveFile.get().asFile.absolutePath
  125. systemProperty 'io.opentelemetry.smoketest.extensionPath', tasks.shadowJar.archiveFile.get().asFile.absolutePath
  126. }
  127. compileJava {
  128. options.release.set(8)
  129. }
  130. assemble.dependsOn(shadowJar)
  131. }
  132. muzzle {
  133. pass {
  134. group.set("javax.servlet")
  135. module.set("javax.servlet-api")
  136. versions.set("[3.0,)")
  137. assertInverse.set(true)
  138. }
  139. pass {
  140. group.set("javax.servlet")
  141. module.set("servlet-api")
  142. versions.set("[2.2, 3.0)")
  143. assertInverse.set(true)
  144. }
  145. }