diff --git a/build.gradle b/build.gradle index cfc2b283..14ecc580 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,11 @@ +// Build Script Classpath +buildscript { + ext { + springBootVersion = '3.1.7' + springDependencyManagementVersion = '1.1.4' + } +} + plugins { id 'idea' id 'jacoco' @@ -10,7 +18,8 @@ plugins { id 'de.undercouch.download' version '5.2.1' id 'org.hidetake.swagger.generator' version '2.19.2' id 'org.sonarqube' version '4.0.0.2929' - id 'org.springframework.boot' version '2.7.17' + id "org.springframework.boot" version "${springBootVersion}" + id "io.spring.dependency-management" version "${springDependencyManagementVersion}" } allprojects { @@ -54,63 +63,72 @@ repositories { } dependencies { - ext { - jerseyVersion = '2.35' - springVersion = '2.7.17' - } // Common utils - implementation group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.9.0' - implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0' - implementation group: 'org.apache.commons', name: 'commons-pool2', version: '2.11.1' + implementation group: 'org.apache.commons', name: 'commons-dbcp2' + implementation group: 'org.apache.commons', name: 'commons-lang3' + implementation group: 'org.apache.commons', name: 'commons-pool2' // Spring - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jdbc', version: springVersion - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springVersion - annotationProcessor group: 'org.springframework.boot', name: 'spring-boot-configuration-processor', version: springVersion + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jdbc' + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web' + annotationProcessor group: 'org.springframework.boot', name: 'spring-boot-configuration-processor' // Misc. Services implementation group: 'org.webjars', name: 'webjars-locator-core', version: '0.52' - implementation group: 'javax.validation', name: 'validation-api', version: '2.0.1.Final' + implementation group: 'jakarta.validation', name: 'jakarta.validation-api' + implementation group: 'io.projectreactor', name: 'reactor-core', version: '3.4.34' // Google dependencies constraints { implementation group: 'com.google.guava', name: 'guava', version: '31.1-jre' // '-jre' for Java 8 or higher } - implementation platform('com.google.cloud:libraries-bom:26.0.0') // use common bom - - implementation group: 'com.google.auto.value', name: 'auto-value-annotations', version: '1.9' - implementation group: 'com.google.cloud', name: 'google-cloud-billing', version: '2.3.0' - implementation group: 'com.google.cloud', name: 'google-cloud-core-http', version: '2.8.0' - implementation group: 'com.google.cloud', name: 'google-cloud-pubsub', version: '1.120.0' - implementation group: 'com.google.cloud', name: 'google-cloud-storage', version: '2.9.2' - implementation group: 'com.google.cloud', name: 'google-cloud-iamcredentials', version: '2.17.0' + implementation platform('com.google.cloud:libraries-bom:26.28.0') // use common bom + implementation group: 'com.google.auto.value', name: 'auto-value-annotations' + implementation group: 'com.google.cloud', name: 'google-cloud-pubsub' + implementation group: 'com.google.cloud', name: 'google-cloud-iamcredentials' annotationProcessor group: 'com.google.auto.value', name: 'auto-value', version: '1.9' // Database - implementation group: 'org.liquibase' , name: 'liquibase-core', version: '4.17.2' + implementation group: 'org.liquibase' , name: 'liquibase-core', version: '4.22.0' runtimeOnly group: 'org.postgresql', name: 'postgresql', version: '42.5.0' // Terra libraries - implementation group: 'bio.terra', name: 'terra-common-lib', version: '0.0.89-SNAPSHOT' - implementation group: 'bio.terra', name: 'terra-cloud-resource-lib', version: '1.2.27-SNAPSHOT' - implementation group: 'bio.terra', name: 'workspace-manager-client', version: '0.254.575-SNAPSHOT' + implementation group: 'bio.terra', name: 'terra-common-lib', version: '0.1.9-SNAPSHOT' + implementation group: 'bio.terra', name: 'terra-cloud-resource-lib', version: '1.2.30-SNAPSHOT' + implementation group: 'bio.terra', name: 'workspace-manager-client', version: '0.254.997-SNAPSHOT' // hk2 is required to use WSM client, but not correctly exposed by the client - implementation group: 'org.glassfish.jersey.inject', name: 'jersey-hk2', version: jerseyVersion + implementation group: 'org.glassfish.jersey.inject', name: 'jersey-hk2' // Kubernetes client implementation group: 'io.kubernetes', name: 'client-java', version: '18.0.0' - // Metrics & Tracing - implementation group: 'io.opencensus', name: 'opencensus-exporter-stats-stackdriver', version: '0.31.1' + // OpenTelemetry + var openTelemetryVersion = '1.32.0' + implementation "io.opentelemetry:opentelemetry-api:${openTelemetryVersion}" + implementation "io.opentelemetry:opentelemetry-sdk:${openTelemetryVersion}" + implementation "io.opentelemetry:opentelemetry-sdk-common:${openTelemetryVersion}" + implementation "io.opentelemetry:opentelemetry-sdk-metrics:${openTelemetryVersion}" + implementation "io.opentelemetry:opentelemetry-exporter-logging:${openTelemetryVersion}" + implementation "io.opentelemetry:opentelemetry-semconv:1.30.1-alpha" + implementation "io.opentelemetry.instrumentation:opentelemetry-spring-webmvc-6.0:${openTelemetryVersion}-alpha" + implementation "io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations:${openTelemetryVersion}" + implementation "io.opentelemetry.instrumentation:opentelemetry-spring-boot:${openTelemetryVersion}-alpha" + implementation "io.opentelemetry:opentelemetry-exporter-prometheus:${openTelemetryVersion}-alpha" + + // Google cloud open telemetry exporters + var gcpOpenTelemetryExporterVersion = '0.25.2' + implementation "com.google.cloud.opentelemetry:exporter-trace:${gcpOpenTelemetryExporterVersion}" + implementation "com.google.cloud.opentelemetry:exporter-metrics:${gcpOpenTelemetryExporterVersion}" // Swagger deps implementation group: 'io.swagger.core.v3', name: 'swagger-annotations', version: '2.2.2' runtimeOnly group: 'org.webjars.npm', name: 'swagger-ui-dist', version: '3.36.2' - swaggerCodegen group: 'io.swagger.codegen.v3', name: 'swagger-codegen-cli', version: '3.0.35' + swaggerCodegen group: 'io.swagger.codegen.v3', name: 'swagger-codegen-cli', version: '3.0.47' // Test deps - testImplementation("org.springframework.boot:spring-boot-starter-test:$springVersion") { + testImplementation 'org.awaitility:awaitility:4.2.0' + testImplementation("org.springframework.boot:spring-boot-starter-test") { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } // Allows us to mock final classes @@ -120,38 +138,7 @@ dependencies { // These are not directly included, they are just constrained if they are pulled in as // transitive dependencies. constraints { - implementation('com.google.protobuf:protobuf-java:3.21.10') - implementation('org.yaml:snakeyaml') { - version { - strictly '1.33' - } - } - implementation('io.projectreactor.netty:reactor-netty-http:1.0.38') - implementation('com.fasterxml.jackson:jackson-bom:2.14.2') - implementation('org.bouncycastle:bcpkix-jdk15on:1.70') - implementation('org.bouncycastle:bcprov-jdk15on:1.70') spotbugs('org.apache.bcel:bcel:6.6.1') - // TODO(PF-2299): Remove these once all dependencies are using >3.0.0. This - // is forced to version 2.1.6 here to paper over a breaking change in the - // underlying library (the move from javax.ws... to jakarta.ws... package). - implementation('jakarta.ws.rs:jakarta.ws.rs-api') { - version { - strictly '2.1.6' - } - } - implementation('org.glassfish.jersey.core:jersey-common') { - version { - strictly jerseyVersion - } - } - // slf4j-api is pulled in via TCL, Janitor cannot go to version 2.0 until - // TCL does. - implementation('org.slf4j:slf4j-api') { - version { - strictly '1.7.36' - } - } - } } diff --git a/gradle.lockfile b/gradle.lockfile index 121db1e4..25bdde82 100644 --- a/gradle.lockfile +++ b/gradle.lockfile @@ -1,17 +1,18 @@ # This is a Gradle generated file for dependency locking. # Manual edits can break the build and are not advised. # This file is expected to be part of source control. -bio.terra:stairway-gcp:0.0.76-SNAPSHOT=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -bio.terra:stairway:0.0.76-SNAPSHOT=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -bio.terra:terra-cloud-resource-lib:1.2.27-SNAPSHOT=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -bio.terra:terra-common-lib:0.0.89-SNAPSHOT=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +bio.terra:stairway-azure:0.0.80-SNAPSHOT=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +bio.terra:stairway-gcp:0.0.80-SNAPSHOT=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +bio.terra:stairway:0.0.80-SNAPSHOT=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +bio.terra:terra-cloud-resource-lib:1.2.30-SNAPSHOT=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +bio.terra:terra-common-lib:0.1.9-SNAPSHOT=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath bio.terra:terra-resource-janitor-client:0.113.31-SNAPSHOT=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -bio.terra:workspace-manager-client:0.254.575-SNAPSHOT=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +bio.terra:workspace-manager-client:0.254.997-SNAPSHOT=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath ch.qos.logback.contrib:logback-jackson:0.1.5=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath ch.qos.logback.contrib:logback-json-classic:0.1.5=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath ch.qos.logback.contrib:logback-json-core:0.1.5=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -ch.qos.logback:logback-classic:1.2.12=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -ch.qos.logback:logback-core:1.2.12=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +ch.qos.logback:logback-classic:1.4.14=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +ch.qos.logback:logback-core:1.4.14=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.azure.resourcemanager:azure-resourcemanager-authorization:2.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.azure.resourcemanager:azure-resourcemanager-batch:1.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.azure.resourcemanager:azure-resourcemanager-compute:2.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath @@ -22,88 +23,102 @@ com.azure.resourcemanager:azure-resourcemanager-postgresqlflexibleserver:1.0.0=c com.azure.resourcemanager:azure-resourcemanager-relay:1.0.0-beta.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.azure.resourcemanager:azure-resourcemanager-resources:2.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.azure.resourcemanager:azure-resourcemanager-storage:2.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.azure:azure-core-http-netty:1.13.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.azure:azure-core-amqp:2.9.0-beta.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +com.azure:azure-core-http-netty:1.13.7=compileClasspath,testCompileClasspath +com.azure:azure-core-http-netty:1.13.9=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath com.azure:azure-core-management:1.11.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.azure:azure-core:1.44.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.azure:azure-identity:1.10.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.azure:azure-identity:1.10.1=compileClasspath,testCompileClasspath +com.azure:azure-identity:1.10.4=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath com.azure:azure-json:1.1.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-annotations:2.14.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-core:2.14.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-databind:2.14.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.fasterxml.jackson.datatype:jackson-datatype-guava:2.14.2=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.14.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.14.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.14.2=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -com.fasterxml.jackson.module:jackson-module-parameter-names:2.14.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.fasterxml.jackson:jackson-bom:2.14.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.azure:azure-messaging-servicebus:7.14.0-beta.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-annotations:2.15.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-core:2.15.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-databind:2.15.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.3=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.datatype:jackson-datatype-guava:2.15.3=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.15.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:2.15.3=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.module:jackson-module-parameter-names:2.15.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml.jackson:jackson-bom:2.15.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml.woodstox:woodstox-core:6.5.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +com.fatboyindustrial.gson-javatime-serialisers:gson-javatime-serialisers:1.1.2=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath com.flagsmith:flagsmith-java-client:6.1.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -com.github.ben-manes.caffeine:caffeine:2.9.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +com.github.ben-manes.caffeine:caffeine:3.1.8=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath com.github.spotbugs:spotbugs-annotations:4.7.2=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath com.github.spotbugs:spotbugs-annotations:4.7.3=spotbugs com.github.spotbugs:spotbugs:4.7.3=spotbugs com.github.stephenc.jcip:jcip-annotations:1.0-1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.google.android:annotations:4.1.1.4=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -com.google.api-client:google-api-client:1.35.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.api.grpc:proto-google-cloud-billing-v1:2.3.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.api.grpc:proto-google-cloud-iamcredentials-v1:2.17.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.api.grpc:proto-google-cloud-monitoring-v3:3.3.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.api.grpc:proto-google-cloud-pubsub-v1:1.102.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.api.grpc:proto-google-cloud-trace-v1:2.3.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -com.google.api.grpc:proto-google-cloud-trace-v2:2.3.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -com.google.api.grpc:proto-google-common-protos:2.18.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.api.grpc:proto-google-iam-v1:1.4.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.api:api-common:2.10.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.api:gax-grpc:2.27.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.api:gax-httpjson:0.112.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.api:gax:2.27.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.apis:google-api-services-bigquery:v2-rev20220716-1.32.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.apis:google-api-services-cloudresourcemanager:v3-rev20220710-1.32.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.apis:google-api-services-compute:v1-rev20220720-1.32.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.apis:google-api-services-dataproc:v1-rev20220726-1.32.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.apis:google-api-services-dns:v2-rev20220505-1.32.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.apis:google-api-services-iam:v1-rev20220526-1.32.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api-client:google-api-client:2.2.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:gapic-google-cloud-storage-v2:2.30.1-alpha=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:grpc-google-cloud-storage-v2:2.30.1-alpha=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:grpc-google-cloud-trace-v2:2.31.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:proto-google-cloud-billing-v1:2.31.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:proto-google-cloud-iamcredentials-v1:2.31.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:proto-google-cloud-monitoring-v3:3.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:proto-google-cloud-pubsub-v1:1.107.13=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:proto-google-cloud-storage-v2:2.30.1-alpha=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:proto-google-cloud-trace-v1:2.31.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:proto-google-cloud-trace-v2:2.31.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:proto-google-common-protos:2.29.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api.grpc:proto-google-iam-v1:1.24.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api:api-common:2.21.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api:gax-grpc:2.38.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api:gax-httpjson:2.38.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.api:gax:2.38.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.apis:google-api-services-bigquery:v2-rev20231008-2.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.apis:google-api-services-cloudresourcemanager:v3-rev20231022-2.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.apis:google-api-services-compute:v1-rev20231031-2.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.apis:google-api-services-dataproc:v1-rev20231028-2.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.apis:google-api-services-dns:v1-rev20230831-2.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.apis:google-api-services-iam:v1-rev20230914-2.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.google.apis:google-api-services-logging:v2-rev20220714-1.32.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -com.google.apis:google-api-services-notebooks:v1-rev20220716-1.32.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.apis:google-api-services-serviceusage:v1beta1-rev20220615-1.32.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.apis:google-api-services-storage:v1-rev20220608-1.32.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.auth:google-auth-library-credentials:1.16.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.auth:google-auth-library-oauth2-http:1.16.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.auto.value:auto-value-annotations:1.10.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.apis:google-api-services-notebooks:v1-rev20231019-2.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.apis:google-api-services-serviceusage:v1beta1-rev20230309-2.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.apis:google-api-services-storage:v1-rev20231117-2.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.auth:google-auth-library-credentials:1.20.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.auth:google-auth-library-oauth2-http:1.20.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.auto.value:auto-value-annotations:1.10.4=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.google.auto.value:auto-value:1.9=annotationProcessor -com.google.cloud:google-cloud-billing:2.3.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.cloud:google-cloud-core-http:2.8.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.cloud:google-cloud-core:2.8.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.cloud:google-cloud-iamcredentials:2.17.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.cloud:google-cloud-monitoring:3.3.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.cloud:google-cloud-pubsub:1.120.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.cloud:google-cloud-storage:2.9.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.cloud:google-cloud-trace:2.3.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -com.google.cloud:libraries-bom:26.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.code.findbugs:annotations:3.0.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud.opentelemetry:exporter-metrics:0.25.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud.opentelemetry:exporter-trace:0.25.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud.opentelemetry:shared-resourcemapping:0.25.2=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +com.google.cloud:google-cloud-billing:2.31.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud:google-cloud-core-grpc:2.28.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud:google-cloud-core-http:2.28.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud:google-cloud-core:2.28.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud:google-cloud-iamcredentials:2.31.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud:google-cloud-monitoring:3.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud:google-cloud-pubsub:1.125.13=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud:google-cloud-storage:2.30.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud:google-cloud-trace:2.31.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.cloud:libraries-bom:26.28.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.google.code.findbugs:jsr305:3.0.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,spotbugs,spotless865455342,testCompileClasspath,testRuntimeClasspath -com.google.code.gson:gson:2.10.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.code.gson:gson:2.9.1=spotbugs -com.google.errorprone:error_prone_annotations:2.18.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.code.gson:gson:2.10.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath +com.google.errorprone:error_prone_annotations:2.23.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.google.errorprone:error_prone_annotations:2.7.1=spotless865455342 com.google.googlejavaformat:google-java-format:1.15.0=spotless865455342 com.google.guava:failureaccess:1.0.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,spotless865455342,testCompileClasspath,testRuntimeClasspath com.google.guava:guava:31.0.1-jre=spotless865455342 -com.google.guava:guava:31.1-jre=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.guava:guava:32.1.3-jre=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=compileClasspath,productionRuntimeClasspath,runtimeClasspath,spotless865455342,testCompileClasspath,testRuntimeClasspath -com.google.http-client:google-http-client-apache-v2:1.42.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.http-client:google-http-client-appengine:1.42.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.http-client:google-http-client-gson:1.43.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.http-client:google-http-client-jackson2:1.42.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.http-client:google-http-client:1.43.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.j2objc:j2objc-annotations:1.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,spotless865455342,testCompileClasspath,testRuntimeClasspath +com.google.http-client:google-http-client-apache-v2:1.43.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.http-client:google-http-client-appengine:1.43.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.http-client:google-http-client-gson:1.43.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.http-client:google-http-client-jackson2:1.43.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.http-client:google-http-client:1.43.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.j2objc:j2objc-annotations:1.3=spotless865455342 +com.google.j2objc:j2objc-annotations:2.8=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.google.oauth-client:google-oauth-client:1.34.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.protobuf:protobuf-java-util:3.21.12=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.protobuf:protobuf-java:3.22.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.google.re2j:re2j:1.6=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -com.jayway.jsonpath:json-path:2.7.0=testCompileClasspath,testRuntimeClasspath -com.lmax:disruptor:3.4.2=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +com.google.protobuf:protobuf-java-util:3.25.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.protobuf:protobuf-java:3.25.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.re2j:re2j:1.7=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +com.jayway.jsonpath:json-path:2.8.0=testCompileClasspath,testRuntimeClasspath com.microsoft.azure:msal4j-persistence-extension:1.2.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.microsoft.azure:msal4j:1.13.9=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.microsoft.azure:qpid-proton-j-extensions:1.2.4=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath com.nimbusds:content-type:2.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.nimbusds:lang-tag:1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.nimbusds:nimbus-jose-jwt:9.30.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath @@ -114,98 +129,120 @@ com.squareup.okhttp3:okhttp:4.10.0=compileClasspath,productionRuntimeClasspath,r com.squareup.okio:okio-jvm:3.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.squareup.okio:okio:3.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.vaadin.external.google:android-json:0.0.20131108.vaadin1=testCompileClasspath,testRuntimeClasspath -com.zaxxer:HikariCP:4.0.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -commons-codec:commons-codec:1.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath +com.zaxxer:HikariCP:5.0.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +commons-codec:commons-codec:1.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath commons-io:commons-io:2.11.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath commons-logging:commons-logging:1.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.github.classgraph:classgraph:4.8.147=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.grpc:grpc-alts:1.54.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.grpc:grpc-api:1.54.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.grpc:grpc-auth:1.54.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.grpc:grpc-context:1.54.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.grpc:grpc-core:1.54.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.grpc:grpc-googleapis:1.54.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.grpc:grpc-grpclb:1.54.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.grpc:grpc-netty-shaded:1.54.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.grpc:grpc-protobuf-lite:1.54.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.grpc:grpc-protobuf:1.54.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.grpc:grpc-services:1.54.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.grpc:grpc-stub:1.54.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.grpc:grpc-xds:1.54.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.grpc:grpc-alts:1.59.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.grpc:grpc-api:1.59.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.grpc:grpc-auth:1.59.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.grpc:grpc-context:1.59.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.grpc:grpc-core:1.59.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.grpc:grpc-googleapis:1.59.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.grpc:grpc-grpclb:1.59.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.grpc:grpc-inprocess:1.59.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.grpc:grpc-netty-shaded:1.59.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.grpc:grpc-protobuf-lite:1.59.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.grpc:grpc-protobuf:1.59.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.grpc:grpc-rls:1.59.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.grpc:grpc-services:1.59.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.grpc:grpc-stub:1.59.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.grpc:grpc-util:1.59.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.grpc:grpc-xds:1.59.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath io.gsonfire:gson-fire:1.8.5=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.kubernetes:client-java-api:18.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.kubernetes:client-java-proto:18.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.kubernetes:client-java:18.0.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-buffer:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-codec-dns:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-codec-http2:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-codec-http:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-codec-socks:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-codec:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-common:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-handler-proxy:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-handler:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-resolver-dns-classes-macos:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-resolver-dns-native-macos:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-resolver-dns:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-resolver:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.micrometer:micrometer-commons:1.11.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.micrometer:micrometer-observation:1.11.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-buffer:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-codec-dns:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-codec-http2:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-codec-http:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-codec-socks:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-codec:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-common:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-handler-proxy:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-handler:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-resolver-dns-classes-macos:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-resolver-dns-native-macos:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-resolver-dns:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-resolver:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.netty:netty-tcnative-boringssl-static:2.0.61.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.netty:netty-tcnative-classes:2.0.61.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-transport-classes-epoll:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-transport-classes-kqueue:4.1.94.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-transport-native-epoll:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-transport-native-kqueue:4.1.94.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-transport-native-unix-common:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.netty:netty-transport:4.1.100.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-transport-classes-epoll:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-transport-classes-kqueue:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-transport-native-epoll:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-transport-native-kqueue:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-transport-native-unix-common:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-transport:4.1.104.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.opencensus:opencensus-api:0.31.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.opencensus:opencensus-contrib-exemplar-util:0.31.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.opencensus:opencensus-contrib-http-servlet:0.31.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.opencensus:opencensus-contrib-http-util:0.31.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.opencensus:opencensus-contrib-resource-util:0.31.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.opencensus:opencensus-contrib-spring:0.31.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.opencensus:opencensus-exporter-metrics-util:0.31.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.opencensus:opencensus-exporter-stats-prometheus:0.31.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.opencensus:opencensus-exporter-stats-stackdriver:0.31.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.opencensus:opencensus-exporter-trace-stackdriver:0.31.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.opencensus:opencensus-impl-core:0.31.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.opencensus:opencensus-impl:0.31.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath io.opencensus:opencensus-proto:0.2.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations:1.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv:1.32.0-alpha=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:1.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-jdbc:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-kafka-clients-2.6:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-kafka-clients-common:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-log4j-appender-2.17:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-logback-appender-1.0:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-micrometer-1.5:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-reactor-3.1:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-spring-boot:1.32.0-alpha=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-spring-kafka-2.7:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-spring-web-3.1:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-spring-webflux-5.3:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-spring-webmvc-5.3:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry.instrumentation:opentelemetry-spring-webmvc-6.0:1.32.0-alpha=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry.semconv:opentelemetry-semconv:1.21.0-alpha=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-api-events:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-api:1.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-bom:1.29.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-context:1.25.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-exporter-logging:1.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-exporter-prometheus:1.32.0-alpha=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-extension-incubator:1.32.0-alpha=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk-common:1.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.25.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk-logs:1.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk-metrics:1.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk-trace:1.25.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-sdk:1.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.opentelemetry:opentelemetry-semconv:1.30.1-alpha=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.perfmark:perfmark-api:0.26.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.projectreactor.netty:reactor-netty-core:1.0.38=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.projectreactor.netty:reactor-netty-http:1.0.38=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.projectreactor:reactor-core:3.4.33=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.prometheus:simpleclient:0.15.0=compileClasspath,testCompileClasspath -io.prometheus:simpleclient:0.16.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.prometheus:simpleclient_common:0.15.0=compileClasspath,testCompileClasspath -io.prometheus:simpleclient_common:0.16.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.prometheus:simpleclient_httpserver:0.15.0=compileClasspath,testCompileClasspath -io.prometheus:simpleclient_httpserver:0.16.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.prometheus:simpleclient_tracer_common:0.15.0=compileClasspath,testCompileClasspath -io.prometheus:simpleclient_tracer_common:0.16.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.prometheus:simpleclient_tracer_otel:0.15.0=compileClasspath,testCompileClasspath -io.prometheus:simpleclient_tracer_otel:0.16.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.prometheus:simpleclient_tracer_otel_agent:0.15.0=compileClasspath,testCompileClasspath -io.prometheus:simpleclient_tracer_otel_agent:0.16.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -io.swagger.codegen.v3:swagger-codegen-cli:3.0.35=swaggerCodegen +io.projectreactor.netty:reactor-netty-core:1.1.14=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.projectreactor.netty:reactor-netty-http:1.1.14=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.projectreactor:reactor-core:3.4.34=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.prometheus:simpleclient:0.16.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.prometheus:simpleclient_common:0.16.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.prometheus:simpleclient_httpserver:0.16.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.prometheus:simpleclient_tracer_common:0.16.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.prometheus:simpleclient_tracer_otel:0.16.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.prometheus:simpleclient_tracer_otel_agent:0.16.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.swagger.codegen.v3:swagger-codegen-cli:3.0.47=swaggerCodegen io.swagger.core.v3:swagger-annotations:2.2.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.swagger:swagger-annotations:1.6.9=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -jakarta.activation:jakarta.activation-api:1.2.2=productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -jakarta.annotation:jakarta.annotation-api:1.3.5=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -jakarta.ws.rs:jakarta.ws.rs-api:2.1.6=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -jakarta.xml.bind:jakarta.xml.bind-api:2.3.3=productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.activation:jakarta.activation-api:2.1.2=productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.annotation:jakarta.annotation-api:2.1.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.inject:jakarta.inject-api:2.0.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.validation:jakarta.validation-api:3.0.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.ws.rs:jakarta.ws.rs-api:3.1.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.xml.bind:jakarta.xml.bind-api:4.0.1=productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath javax.activation:javax.activation-api:1.2.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath javax.annotation:javax.annotation-api:1.3.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -javax.servlet:javax.servlet-api:3.1.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -javax.validation:validation-api:2.0.1.Final=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +javax.validation:validation-api:2.0.1.Final=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath javax.xml.bind:jaxb-api:2.3.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -jaxen:jaxen:1.2.0=spotbugs -net.bytebuddy:byte-buddy-agent:1.12.9=testCompileClasspath,testRuntimeClasspath -net.bytebuddy:byte-buddy:1.12.9=testCompileClasspath,testRuntimeClasspath +jaxen:jaxen:2.0.0=spotbugs +net.bytebuddy:byte-buddy-agent:1.14.10=testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.14.10=testCompileClasspath,testRuntimeClasspath net.java.dev.jna:jna-platform:5.13.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath net.java.dev.jna:jna:5.13.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -net.jcip:jcip-annotations:1.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath -net.minidev:accessors-smart:2.4.9=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -net.minidev:json-smart:2.4.10=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.jcip:jcip-annotations:1.0=spotbugs +net.minidev:accessors-smart:2.4.11=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.minidev:json-smart:2.4.11=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath net.sf.saxon:Saxon-HE:11.4=spotbugs org.apache.bcel:bcel:6.6.1=spotbugs org.apache.commons:commons-collections4:4.4=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath @@ -214,83 +251,76 @@ org.apache.commons:commons-dbcp2:2.9.0=compileClasspath,productionRuntimeClasspa org.apache.commons:commons-lang3:3.12.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath org.apache.commons:commons-pool2:2.11.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.apache.commons:commons-text:1.10.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath -org.apache.httpcomponents.client5:httpclient5:5.1.3=spotbugs -org.apache.httpcomponents.core5:httpcore5-h2:5.1.3=spotbugs -org.apache.httpcomponents.core5:httpcore5:5.1.3=spotbugs +org.apache.httpcomponents.client5:httpclient5:5.2.3=spotbugs +org.apache.httpcomponents.core5:httpcore5-h2:5.2.4=spotbugs +org.apache.httpcomponents.core5:httpcore5:5.2.4=spotbugs org.apache.httpcomponents:httpclient:4.5.14=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.apache.httpcomponents:httpcore:4.4.16=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.apache.logging.log4j:log4j-api:2.17.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.apache.logging.log4j:log4j-api:2.19.0=spotbugs -org.apache.logging.log4j:log4j-core:2.19.0=spotbugs -org.apache.logging.log4j:log4j-to-slf4j:2.17.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.apache.logging.log4j:log4j-api:2.20.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath +org.apache.logging.log4j:log4j-core:2.20.0=spotbugs +org.apache.logging.log4j:log4j-to-slf4j:2.20.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.apache.maven:maven-artifact:3.6.3=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:1.0.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.apache.oltu.oauth2:org.apache.oltu.oauth2.common:1.0.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -org.apache.tomcat.embed:tomcat-embed-core:9.0.82=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.apache.tomcat.embed:tomcat-embed-el:9.0.82=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.apache.tomcat.embed:tomcat-embed-websocket:9.0.82=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.apache.qpid:proton-j:0.33.8=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +org.apache.tomcat.embed:tomcat-embed-core:10.1.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.apache.tomcat.embed:tomcat-embed-el:10.1.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.apache.tomcat.embed:tomcat-embed-websocket:10.1.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath -org.aspectj:aspectjweaver:1.8.9=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.assertj:assertj-core:3.22.0=testCompileClasspath,testRuntimeClasspath +org.assertj:assertj-core:3.24.2=testCompileClasspath,testRuntimeClasspath +org.awaitility:awaitility:4.2.0=testCompileClasspath,testRuntimeClasspath org.bitbucket.b_c:jose4j:0.9.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.bouncycastle:bcpkix-jdk15on:1.70=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.bouncycastle:bcpkix-jdk18on:1.72=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.bouncycastle:bcprov-jdk15on:1.70=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.bouncycastle:bcprov-jdk18on:1.72=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.bouncycastle:bcutil-jdk15on:1.70=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.bouncycastle:bcutil-jdk18on:1.72=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.broadinstitute.dsde.workbench:sam-client_2.13:0.1-f554115=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +org.broadinstitute.dsde.workbench:sam-client_2.13:0.1-5281c21=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.checkerframework:checker-qual:3.12.0=spotless865455342 -org.checkerframework:checker-qual:3.32.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.checkerframework:checker-qual:3.40.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.codehaus.mojo:animal-sniffer-annotations:1.23=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.codehaus.plexus:plexus-utils:3.2.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +org.codehaus.woodstox:stax2-api:4.2.1=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.conscrypt:conscrypt-openjdk-uber:2.5.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.dom4j:dom4j:2.1.3=spotbugs -org.glassfish.hk2.external:aopalliance-repackaged:2.6.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.glassfish.hk2.external:jakarta.inject:2.6.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.glassfish.hk2:hk2-api:2.6.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.glassfish.hk2:hk2-locator:2.6.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.glassfish.hk2:hk2-utils:2.6.1=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.glassfish.hk2.external:aopalliance-repackaged:3.0.5=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.glassfish.hk2:hk2-api:3.0.5=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.glassfish.hk2:hk2-locator:3.0.5=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.glassfish.hk2:hk2-utils:3.0.5=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.glassfish.hk2:osgi-resource-locator:1.0.3=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.glassfish.jersey.connectors:jersey-jdk-connector:2.32=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -org.glassfish.jersey.core:jersey-client:2.35=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -org.glassfish.jersey.core:jersey-common:2.35=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.glassfish.jersey.ext:jersey-entity-filtering:2.35=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -org.glassfish.jersey.inject:jersey-hk2:2.35=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.glassfish.jersey.media:jersey-media-json-jackson:2.35=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -org.glassfish.jersey.media:jersey-media-multipart:2.35=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +org.glassfish.jersey.connectors:jersey-jdk-connector:3.1.5=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +org.glassfish.jersey.core:jersey-client:3.1.5=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +org.glassfish.jersey.core:jersey-common:3.1.5=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.glassfish.jersey.ext:jersey-entity-filtering:3.1.5=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +org.glassfish.jersey.inject:jersey-hk2:3.1.5=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.glassfish.jersey.media:jersey-media-json-jackson:3.1.5=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +org.glassfish.jersey.media:jersey-media-multipart:3.1.5=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.hamcrest:hamcrest:2.2=testCompileClasspath,testRuntimeClasspath org.hashids:hashids:1.0.3=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.jacoco:org.jacoco.agent:0.8.8=jacocoAgent,jacocoAnt org.jacoco:org.jacoco.ant:0.8.8=jacocoAnt org.jacoco:org.jacoco.core:0.8.8=jacocoAnt org.jacoco:org.jacoco.report:0.8.8=jacocoAnt -org.javassist:javassist:3.25.0-GA=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.10=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib:1.6.20=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.javassist:javassist:3.29.2-GA=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.8.22=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.jetbrains:annotations:13.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.json:json:20230227=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-api:5.8.2=testCompileClasspath -org.junit.jupiter:junit-jupiter-api:5.9.0=testRuntimeClasspath -org.junit.jupiter:junit-jupiter-engine:5.9.0=testRuntimeClasspath -org.junit.jupiter:junit-jupiter-params:5.8.2=testCompileClasspath -org.junit.jupiter:junit-jupiter-params:5.9.0=testRuntimeClasspath -org.junit.jupiter:junit-jupiter:5.8.2=testCompileClasspath -org.junit.jupiter:junit-jupiter:5.9.0=testRuntimeClasspath -org.junit.platform:junit-platform-commons:1.8.2=testCompileClasspath -org.junit.platform:junit-platform-commons:1.9.0=testRuntimeClasspath -org.junit.platform:junit-platform-engine:1.9.0=testRuntimeClasspath -org.junit:junit-bom:5.8.2=testCompileClasspath -org.junit:junit-bom:5.9.0=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.9.3=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.9.3=testRuntimeClasspath +org.junit.jupiter:junit-jupiter-params:5.9.3=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter:5.9.3=testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.9.3=testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.9.3=testRuntimeClasspath +org.junit:junit-bom:5.9.0=productionRuntimeClasspath,runtimeClasspath org.junit:junit-bom:5.9.1=spotbugs -org.jvnet.mimepull:mimepull:1.9.13=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -org.liquibase:liquibase-core:4.17.2=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.mockito:mockito-core:4.5.1=testCompileClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.3=testCompileClasspath,testRuntimeClasspath +org.jvnet.mimepull:mimepull:1.9.15=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +org.liquibase:liquibase-core:4.22.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.mockito:mockito-core:5.3.1=testCompileClasspath,testRuntimeClasspath org.mockito:mockito-inline:2.13.0=testCompileClasspath,testRuntimeClasspath -org.mockito:mockito-junit-jupiter:4.5.1=testCompileClasspath,testRuntimeClasspath -org.objenesis:objenesis:3.2=testRuntimeClasspath +org.mockito:mockito-junit-jupiter:5.3.1=testCompileClasspath,testRuntimeClasspath +org.objenesis:objenesis:3.3=testRuntimeClasspath org.openapitools:jackson-databind-nullable:0.2.3=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testRuntimeClasspath org.ow2.asm:asm-analysis:9.2=jacocoAnt @@ -307,39 +337,37 @@ org.postgresql:postgresql:42.5.0=productionRuntimeClasspath,runtimeClasspath,tes org.reactivestreams:reactive-streams:1.0.4=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.scala-lang:scala-library:2.13.10=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.skyscreamer:jsonassert:1.5.1=testCompileClasspath,testRuntimeClasspath -org.slf4j:jul-to-slf4j:1.7.36=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.slf4j:slf4j-api:1.7.36=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.slf4j:slf4j-api:2.0.0=spotbugs,spotbugsSlf4j +org.slf4j:jul-to-slf4j:2.0.9=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.slf4j:slf4j-api:2.0.9=compileClasspath,productionRuntimeClasspath,runtimeClasspath,spotbugs,spotbugsSlf4j,testCompileClasspath,testRuntimeClasspath org.slf4j:slf4j-simple:2.0.0=spotbugsSlf4j -org.springframework.boot:spring-boot-autoconfigure:2.7.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.boot:spring-boot-configuration-processor:2.7.17=annotationProcessor -org.springframework.boot:spring-boot-starter-data-jdbc:2.7.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.boot:spring-boot-starter-jdbc:2.7.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.boot:spring-boot-starter-json:2.7.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.boot:spring-boot-starter-logging:2.7.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.boot:spring-boot-starter-test:2.7.17=testCompileClasspath,testRuntimeClasspath -org.springframework.boot:spring-boot-starter-tomcat:2.7.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.boot:spring-boot-starter-web:2.7.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.boot:spring-boot-starter:2.7.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.boot:spring-boot-test-autoconfigure:2.7.17=testCompileClasspath,testRuntimeClasspath -org.springframework.boot:spring-boot-test:2.7.17=testCompileClasspath,testRuntimeClasspath -org.springframework.boot:spring-boot:2.7.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.data:spring-data-commons:2.7.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.data:spring-data-jdbc:2.4.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.data:spring-data-relational:2.4.17=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework.retry:spring-retry:1.3.3=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath -org.springframework:spring-aop:5.3.30=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework:spring-aspects:4.3.12.RELEASE=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework:spring-beans:5.3.30=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework:spring-context:5.3.30=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework:spring-core:5.3.30=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework:spring-expression:5.3.30=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework:spring-jcl:5.3.30=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework:spring-jdbc:5.3.30=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework:spring-test:5.3.30=testCompileClasspath,testRuntimeClasspath -org.springframework:spring-tx:5.3.30=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework:spring-web:5.3.30=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.springframework:spring-webmvc:5.3.30=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot-autoconfigure:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot-configuration-processor:3.1.7=annotationProcessor +org.springframework.boot:spring-boot-starter-data-jdbc:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot-starter-jdbc:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot-starter-json:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot-starter-logging:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot-starter-test:3.1.7=testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot-starter-tomcat:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot-starter-web:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot-starter:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot-test-autoconfigure:3.1.7=testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot-test:3.1.7=testCompileClasspath,testRuntimeClasspath +org.springframework.boot:spring-boot:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.data:spring-data-commons:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.data:spring-data-jdbc:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.data:spring-data-relational:3.1.7=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework.retry:spring-retry:2.0.5=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath +org.springframework:spring-aop:6.0.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework:spring-beans:6.0.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework:spring-context:6.0.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework:spring-core:6.0.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework:spring-expression:6.0.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework:spring-jcl:6.0.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework:spring-jdbc:6.0.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework:spring-test:6.0.15=testCompileClasspath,testRuntimeClasspath +org.springframework:spring-tx:6.0.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework:spring-web:6.0.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.springframework:spring-webmvc:6.0.15=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.threeten:threetenbp:1.6.8=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.webjars.npm:swagger-ui-dist:3.36.2=productionRuntimeClasspath,runtimeClasspath,testRuntimeClasspath org.webjars:webjars-locator-core:0.52=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath diff --git a/gradle/swagger-client.gradle b/gradle/swagger-client.gradle index 66c1fe71..a12c300b 100644 --- a/gradle/swagger-client.gradle +++ b/gradle/swagger-client.gradle @@ -17,6 +17,7 @@ swaggerSources { 'apiDocs=false,' + 'modelTests=false,' + 'modelDocs=false,' + + 'jakarta=true,' + 'dateLibrary=java8' ] } diff --git a/gradle/swagger-server.gradle b/gradle/swagger-server.gradle index 81c9f6ed..83e6aea0 100644 --- a/gradle/swagger-server.gradle +++ b/gradle/swagger-server.gradle @@ -12,6 +12,7 @@ swaggerSources { '--model-package', "${artifactGroup}.generated.model", '-D', 'interfaceOnly=true,' + 'useTags=true,' + + 'jakarta=true,' + 'dateLibrary=java8' ] } diff --git a/src/main/java/bio/terra/janitor/app/Main.java b/src/main/java/bio/terra/janitor/app/Main.java index c9808378..cfbe22ae 100644 --- a/src/main/java/bio/terra/janitor/app/Main.java +++ b/src/main/java/bio/terra/janitor/app/Main.java @@ -1,9 +1,14 @@ package bio.terra.janitor.app; +import bio.terra.cloudres.util.MetricsHelper; +import io.opentelemetry.sdk.metrics.InstrumentSelector; +import io.opentelemetry.sdk.metrics.View; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.util.Pair; @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @ComponentScan( @@ -11,10 +16,34 @@ "bio.terra.janitor", "bio.terra.common.iam", "bio.terra.common.migrate", - "bio.terra.common.tracing" + "bio.terra.common.prometheus", + "bio.terra.common.gcpmetrics" }) public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } + + // The next 3 beans register views from CRL. + // It would have been nice to use a bean post processor but that did not work with generic types. + @Bean(MetricsHelper.API_COUNT_METER_NAME) + public Pair apiCountView() { + return getInstrumentSelectorViewPair(MetricsHelper.API_COUNT_METER_NAME); + } + + @Bean(MetricsHelper.LATENCY_METER_NAME) + public Pair latencyView() { + return getInstrumentSelectorViewPair(MetricsHelper.LATENCY_METER_NAME); + } + + @Bean(MetricsHelper.ERROR_COUNT_METER_NAME) + public Pair errorCountView() { + return getInstrumentSelectorViewPair(MetricsHelper.ERROR_COUNT_METER_NAME); + } + + private static Pair getInstrumentSelectorViewPair(String meterName) { + return Pair.of( + InstrumentSelector.builder().setMeterName(meterName).build(), + MetricsHelper.getMetricsViews().get(meterName)); + } } diff --git a/src/main/java/bio/terra/janitor/app/StartupInitializer.java b/src/main/java/bio/terra/janitor/app/StartupInitializer.java index fe61da65..df395473 100644 --- a/src/main/java/bio/terra/janitor/app/StartupInitializer.java +++ b/src/main/java/bio/terra/janitor/app/StartupInitializer.java @@ -4,7 +4,6 @@ import bio.terra.janitor.app.configuration.JanitorJdbcConfiguration; import bio.terra.janitor.service.cleanup.FlightScheduler; import bio.terra.janitor.service.pubsub.TrackedResourceSubscriber; -import bio.terra.janitor.service.stackdriver.StackdriverExporter; import bio.terra.janitor.service.stairway.StairwayComponent; import org.springframework.context.ApplicationContext; @@ -16,7 +15,6 @@ public final class StartupInitializer { private static final String changelogPath = "db/changelog.xml"; public static void initialize(ApplicationContext applicationContext) { - applicationContext.getBean(StackdriverExporter.class).initialize(); // Initialize or upgrade the database depending on the configuration LiquibaseMigrator migrateService = applicationContext.getBean(LiquibaseMigrator.class); JanitorJdbcConfiguration janitorJdbcConfiguration = diff --git a/src/main/java/bio/terra/janitor/app/configuration/CrlConfiguration.java b/src/main/java/bio/terra/janitor/app/configuration/CrlConfiguration.java index 748156bc..1cb4df01 100644 --- a/src/main/java/bio/terra/janitor/app/configuration/CrlConfiguration.java +++ b/src/main/java/bio/terra/janitor/app/configuration/CrlConfiguration.java @@ -24,6 +24,7 @@ import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import com.google.cloud.storage.StorageOptions; +import io.opentelemetry.api.OpenTelemetry; import java.io.IOException; import java.security.GeneralSecurityException; import org.springframework.beans.factory.annotation.Autowired; @@ -36,16 +37,18 @@ public class CrlConfiguration { private final AzureConfiguration azureConfiguration; + private final ClientConfig clientConfig; @Autowired - public CrlConfiguration(AzureConfiguration azureConfiguration) { + public CrlConfiguration(AzureConfiguration azureConfiguration, OpenTelemetry openTelemetry) { this.azureConfiguration = azureConfiguration; + this.clientConfig = + ClientConfig.Builder.newBuilder() + .setClient("terra-crl-janitor") + .setOpenTelemetry(openTelemetry) + .build(); } - // Janitor only uses CRL Cows to delete resources. Cleanup is not needed. - private final ClientConfig clientConfig = - ClientConfig.Builder.newBuilder().setClient("terra-crl-janitor").build(); - @Bean @Lazy public AIPlatformNotebooksCow notebooksCow() throws IOException, GeneralSecurityException { diff --git a/src/main/java/bio/terra/janitor/app/configuration/StackdriverConfiguration.java b/src/main/java/bio/terra/janitor/app/configuration/StackdriverConfiguration.java deleted file mode 100644 index 5e24245d..00000000 --- a/src/main/java/bio/terra/janitor/app/configuration/StackdriverConfiguration.java +++ /dev/null @@ -1,21 +0,0 @@ -package bio.terra.janitor.app.configuration; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableConfigurationProperties -@ConfigurationProperties(prefix = "janitor.stackdriver") -public class StackdriverConfiguration { - /** Whether to enable stackdriver metrics collection. */ - private boolean enabled = true; - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } -} diff --git a/src/main/java/bio/terra/janitor/app/controller/JanitorApiController.java b/src/main/java/bio/terra/janitor/app/controller/JanitorApiController.java index d24c7120..88293acf 100644 --- a/src/main/java/bio/terra/janitor/app/controller/JanitorApiController.java +++ b/src/main/java/bio/terra/janitor/app/controller/JanitorApiController.java @@ -7,11 +7,11 @@ import bio.terra.janitor.generated.model.*; import bio.terra.janitor.service.janitor.JanitorApiService; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/bio/terra/janitor/app/controller/UnauthenticatedApiController.java b/src/main/java/bio/terra/janitor/app/controller/UnauthenticatedApiController.java index 8e668b9b..f5a90072 100644 --- a/src/main/java/bio/terra/janitor/app/controller/UnauthenticatedApiController.java +++ b/src/main/java/bio/terra/janitor/app/controller/UnauthenticatedApiController.java @@ -6,9 +6,9 @@ import bio.terra.janitor.generated.model.SystemStatusSystems; import bio.terra.janitor.service.stairway.StairwayComponent; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; import java.sql.Connection; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/bio/terra/janitor/common/exception/InvalidTestUserException.java b/src/main/java/bio/terra/janitor/common/exception/InvalidTestUserException.java index 608ac6c0..8114c8ea 100644 --- a/src/main/java/bio/terra/janitor/common/exception/InvalidTestUserException.java +++ b/src/main/java/bio/terra/janitor/common/exception/InvalidTestUserException.java @@ -1,6 +1,6 @@ package bio.terra.janitor.common.exception; -import javax.ws.rs.BadRequestException; +import jakarta.ws.rs.BadRequestException; /** * Janitor impersonates test users to clean up WSM workspaces (and possibly for other purposes in diff --git a/src/main/java/bio/terra/janitor/service/cleanup/FlightManager.java b/src/main/java/bio/terra/janitor/service/cleanup/FlightManager.java index 55c32034..d2c11f74 100644 --- a/src/main/java/bio/terra/janitor/service/cleanup/FlightManager.java +++ b/src/main/java/bio/terra/janitor/service/cleanup/FlightManager.java @@ -49,16 +49,19 @@ class FlightManager { private final JanitorDao janitorDao; private final TransactionTemplate transactionTemplate; private final FlightSubmissionFactory submissionFactory; + private final MetricsHelper metricsHelper; public FlightManager( Stairway stairway, JanitorDao janitorDao, TransactionTemplate transactionTemplate, - FlightSubmissionFactory submissionFactory) { + FlightSubmissionFactory submissionFactory, + MetricsHelper metricsHelper) { this.stairway = stairway; this.janitorDao = janitorDao; this.transactionTemplate = transactionTemplate; this.submissionFactory = submissionFactory; + this.metricsHelper = metricsHelper; } /** @@ -78,7 +81,7 @@ public Optional submitFlight(Instant expiredBy) { // If submission fails, it will be recovered later. boolean submissionSuccessful = submitToStairway(flightId, resource.get()); // Only record duration of submission if there was something to attempt to schedule. - MetricsHelper.recordSubmissionDuration( + metricsHelper.recordSubmissionDuration( Duration.ofNanos(stopwatch.elapsed(TimeUnit.NANOSECONDS)), submissionSuccessful); return Optional.of(flightId); } @@ -134,7 +137,7 @@ public int recoverUnsubmittedFlights(int limit) { // not need to be recovered. There's nothing to do but wait for the flight to update it's // state from INITIATING. stairway.getFlightState(flightId); - MetricsHelper.incrementRecoveredSubmittedFlight(); + metricsHelper.incrementRecoveredSubmittedFlight(); } catch (FlightNotFoundException e) { // Stairway does not know about the flightId, so we must not have submitted successfully. // Try to resubmit. @@ -183,7 +186,7 @@ public int updateCompletedFlights(int limit) { for (TrackedResourceAndFlight resourceAndFlight : resourceAndFlights) { Stopwatch stopwatch = Stopwatch.createStarted(); boolean flightCompleted = completeFlight(resourceAndFlight); - MetricsHelper.recordCompletionDuration( + metricsHelper.recordCompletionDuration( Duration.ofNanos(stopwatch.elapsed(TimeUnit.NANOSECONDS)), flightCompleted); if (flightCompleted) { ++completedFlights; @@ -342,7 +345,7 @@ public int updateFatalFlights(int limit) { for (FlightState flight : flights) { Stopwatch stopwatch = Stopwatch.createStarted(); boolean flightCompleted = updateFatalFlight(flight.getFlightId()); - MetricsHelper.recordFatalUpdateDuration( + metricsHelper.recordFatalUpdateDuration( Duration.ofNanos(stopwatch.elapsed(TimeUnit.NANOSECONDS)), flightCompleted); if (flightCompleted) { ++completedFlights; @@ -374,7 +377,7 @@ private boolean updateFatalCleanupState(String flightId, TransactionStatus trans TrackedResourceState resourceState = trackedResource.trackedResourceState(); if (resourceAndFlight.get().cleanupFlight().state().equals(CleanupFlightState.FATAL)) { // We already marked the flight as completed - this is not an error. - MetricsHelper.incrementFatalFlightUndeleted(); + metricsHelper.incrementFatalFlightUndeleted(); return true; } if (resourceState.equals(TrackedResourceState.CLEANING)) { diff --git a/src/main/java/bio/terra/janitor/service/cleanup/FlightScheduler.java b/src/main/java/bio/terra/janitor/service/cleanup/FlightScheduler.java index 3165476f..da906753 100644 --- a/src/main/java/bio/terra/janitor/service/cleanup/FlightScheduler.java +++ b/src/main/java/bio/terra/janitor/service/cleanup/FlightScheduler.java @@ -29,6 +29,7 @@ public class FlightScheduler { private final StairwayComponent stairwayComponent; private final JanitorDao janitorDao; private final FlightManager flightManager; + private final MetricsHelper metricsHelper; @Autowired public FlightScheduler( @@ -36,13 +37,19 @@ public FlightScheduler( StairwayComponent stairwayComponent, JanitorDao janitorDao, TransactionTemplate transactionTemplate, - FlightSubmissionFactory submissionFactory) { + FlightSubmissionFactory submissionFactory, + MetricsHelper metricsHelper) { this.primaryConfiguration = primaryConfiguration; this.janitorDao = janitorDao; this.stairwayComponent = stairwayComponent; - flightManager = + this.flightManager = new FlightManager( - stairwayComponent.get(), janitorDao, transactionTemplate, submissionFactory); + stairwayComponent.get(), + janitorDao, + transactionTemplate, + submissionFactory, + metricsHelper); + this.metricsHelper = metricsHelper; } /** @@ -137,7 +144,7 @@ private void recordResourceCount() { // 0 counts, we need to make sure to update metrics measurements that may have changed to 0. // If we don't, the last non-zero value will continue to be exported. int count = stateCounts.getOrDefault(state, 0); - MetricsHelper.recordResourceKindCount(kind, state, count); + metricsHelper.recordResourceKindCount(kind, state, count); } } logger.info("Done recording resource counts."); diff --git a/src/main/java/bio/terra/janitor/service/cleanup/MetricsHelper.java b/src/main/java/bio/terra/janitor/service/cleanup/MetricsHelper.java index 5c6c8487..5c42d56f 100644 --- a/src/main/java/bio/terra/janitor/service/cleanup/MetricsHelper.java +++ b/src/main/java/bio/terra/janitor/service/cleanup/MetricsHelper.java @@ -2,189 +2,131 @@ import bio.terra.janitor.db.ResourceKind; import bio.terra.janitor.db.TrackedResourceState; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableList; -import io.opencensus.stats.*; -import io.opencensus.tags.*; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.DoubleHistogram; +import io.opentelemetry.api.metrics.LongCounter; import java.time.Duration; -import java.util.Arrays; +import org.springframework.stereotype.Component; /** Helper class for recording metrics associated with cleanup. */ -class MetricsHelper { - private MetricsHelper() {} - +@Component +public class MetricsHelper { private static final String PREFIX = "terra/janitor/cleanup"; - @VisibleForTesting static final ViewManager VIEW_MANAGER = Stats.getViewManager(); - - private static final Tagger TAGGER = Tags.getTagger(); - private static final StatsRecorder STATS_RECORDER = Stats.getStatsRecorder(); - - private static final TagKey SUCCESS_KEY = TagKey.create("success"); - private static final TagKey RESOURCE_STATE_KEY = TagKey.create("resource_state"); - private static final TagKey RESOURCE_TYPE_KEY = TagKey.create("resource_type"); - private static final TagKey CLIENT_KEY = TagKey.create("client"); + public static final String SUBMISSION_DURATION_METER_NAME = PREFIX + "/submission_duration"; + public static final String COMPLETION_DURATION_METER_NAME = PREFIX + "/completion_duration"; + public static final String FATAL_UPDATE_DURATION_METER_NAME = PREFIX + "/fatal_update_duration"; + public static final String TRACKED_RESOURCE_COUNT_METER_NAME = PREFIX + "/tracked_resource_count"; + public static final String RECOVERED_SUBMITTED_FLIGHTS_COUNT_METER_NAME = + PREFIX + "/recovered_submitted_flights_count"; + public static final String FATAL_FLIGHT_UNDELETED_COUNT_METER_NAME = + PREFIX + "/fatal_flight_undeleted_count"; + + public static final AttributeKey SUCCESS_KEY = AttributeKey.stringKey("success"); + public static final AttributeKey RESOURCE_STATE_KEY = + AttributeKey.stringKey("resource_state"); + public static final AttributeKey RESOURCE_TYPE_KEY = + AttributeKey.stringKey("resource_type"); + public static final AttributeKey CLIENT_KEY = AttributeKey.stringKey("client"); /** Unit string for millisecond. */ private static final String MILLISECOND = "ms"; /** Unit string for count. */ private static final String COUNT = "1"; - private static final Measure.MeasureDouble SUBMISSION_DURATION = - Measure.MeasureDouble.create( - PREFIX + "/submission_duration", "Duration of a cleanup flight submission.", MILLISECOND); - private static final Measure.MeasureDouble COMPLETION_DURATION = - Measure.MeasureDouble.create( - PREFIX + "/completion_duration", "Duration of a cleanup flight completion.", MILLISECOND); - private static final Measure.MeasureDouble FATAL_UPDATE_DURATION = - Measure.MeasureDouble.create( - PREFIX + "/fatal_update_duration", - "Duration of a cleanup flight fatal update.", - MILLISECOND); - private static final Measure.MeasureLong TRACKED_RESOURCE_COUNT = - Measure.MeasureLong.create( - PREFIX + "/tracked_resource_count", "Counts of te number of tracked resources.", COUNT); - private static final Measure.MeasureLong RECOVERED_SUBMITTED_FLIGHTS_COUNT = - Measure.MeasureLong.create( - PREFIX + "/recovered_submitted_flights_count.", - "Count of the number of recovered flights that were already submitted successfully to Stairway.", - COUNT); - private static final Measure.MeasureLong FATAL_FLIGHT_UNDELETED_COUNT = - Measure.MeasureLong.create( - PREFIX + "/fatal_flight_undeleted_count", - "Count of the number of fatal cleanup flights that were not deleted from Stairway when they were completed by the Janitor.", - COUNT); - - /** - * This bucketing is our first pass guess at what might be interesting to see for durations. It is - * not backed by data. - */ - private static final Aggregation DURATION_DISTRIBUTION = - Aggregation.Distribution.create( - BucketBoundaries.create( - Arrays.asList( - 0.0, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 2048.0, - 4096.0, 8192.0))); - - private static final View SUBMISSION_DURATION_VIEW = - View.create( - View.Name.create(PREFIX + "/submission_duration"), - "The distribution of durations for flight submissions", - SUBMISSION_DURATION, - DURATION_DISTRIBUTION, - ImmutableList.of(SUCCESS_KEY)); - private static final View COMPLETION_DURATION_VIEW = - View.create( - View.Name.create(PREFIX + "/completion_duration"), - "The distribution of durations for flight completions", - COMPLETION_DURATION, - DURATION_DISTRIBUTION, - ImmutableList.of(SUCCESS_KEY)); - private static final View FATAL_UPDATE_DURATION_VIEW = - View.create( - View.Name.create(PREFIX + "/fatal_update_duration"), - "The distribution of durations for flight fatal updates", - FATAL_UPDATE_DURATION, - DURATION_DISTRIBUTION, - ImmutableList.of(SUCCESS_KEY)); - - @VisibleForTesting - static final View TRACKED_RESOURCE_COUNT_VIEW = - View.create( - View.Name.create(PREFIX + "/tracked_resource_count"), - "The count of tracked resources", - TRACKED_RESOURCE_COUNT, - Aggregation.LastValue.create(), - ImmutableList.of(RESOURCE_STATE_KEY, RESOURCE_TYPE_KEY, CLIENT_KEY)); - - static final View RECOVERED_SUBMITTED_FLIGHTS_VIEW = - View.create( - View.Name.create(PREFIX + "/recovered_submitted_flights_count"), - "Count of the number of recovered flights that were already submitted successfully to Stairway.", - RECOVERED_SUBMITTED_FLIGHTS_COUNT, - Aggregation.Count.create(), - ImmutableList.of()); - static final View FATAL_FLIGHT_UNDELETED_VIEW = - View.create( - View.Name.create(PREFIX + "/fatal_flight_undeleted"), - "Count of the number of fatal cleanup flights that were not deleted from Stairway when they were completed by the Janitor.", - FATAL_FLIGHT_UNDELETED_COUNT, - Aggregation.Count.create(), - ImmutableList.of()); - - private static final ImmutableList VIEWS = - ImmutableList.of( - SUBMISSION_DURATION_VIEW, - COMPLETION_DURATION_VIEW, - FATAL_UPDATE_DURATION_VIEW, - TRACKED_RESOURCE_COUNT_VIEW, - RECOVERED_SUBMITTED_FLIGHTS_VIEW, - FATAL_FLIGHT_UNDELETED_VIEW); - - // Register all views - static { - for (View view : VIEWS) { - VIEW_MANAGER.registerView(view); - } + private final DoubleHistogram submissionDuration; + private final DoubleHistogram completionDuration; + private final DoubleHistogram fatalUpdateDuration; + private final LongCounter trackedResourceCount; + private final LongCounter recoveredSubmittedFlightsCount; + private final LongCounter fatalFlightUndeletedCount; + + public MetricsHelper(OpenTelemetry openTelemetry) { + var meter = openTelemetry.getMeter(bio.terra.common.stairway.MetricsHelper.class.getName()); + this.submissionDuration = + meter + .histogramBuilder(SUBMISSION_DURATION_METER_NAME) + .setDescription("Duration of a cleanup flight submission.") + .setUnit(MILLISECOND) + .build(); + this.completionDuration = + meter + .histogramBuilder(COMPLETION_DURATION_METER_NAME) + .setDescription("Duration of a cleanup flight completion.") + .setUnit(MILLISECOND) + .build(); + this.fatalUpdateDuration = + meter + .histogramBuilder(FATAL_UPDATE_DURATION_METER_NAME) + .setDescription("Duration of a cleanup flight fatal update.") + .setUnit(MILLISECOND) + .build(); + this.trackedResourceCount = + meter + .counterBuilder(TRACKED_RESOURCE_COUNT_METER_NAME) + .setDescription("Counts of the number of tracked resources.") + .setUnit(COUNT) + .build(); + this.recoveredSubmittedFlightsCount = + meter + .counterBuilder(RECOVERED_SUBMITTED_FLIGHTS_COUNT_METER_NAME) + .setDescription( + "Count of the number of recovered flights that were already submitted successfully to Stairway.") + .setUnit(COUNT) + .build(); + this.fatalFlightUndeletedCount = + meter + .counterBuilder(FATAL_FLIGHT_UNDELETED_COUNT_METER_NAME) + .setDescription( + "Count of the number of fatal cleanup flights that were not deleted from Stairway when they were completed by the Janitor.") + .setUnit(COUNT) + .build(); } /** Record the duration of an attempt to submit a cleanup flight. */ - public static void recordSubmissionDuration(Duration duration, boolean flightSubmitted) { - TagContext tctx = - TAGGER - .emptyBuilder() - .putLocal(SUCCESS_KEY, TagValue.create(Boolean.valueOf(flightSubmitted).toString())) - .build(); - STATS_RECORDER.newMeasureMap().put(SUBMISSION_DURATION, duration.toMillis()).record(tctx); + public void recordSubmissionDuration(Duration duration, boolean flightSubmitted) { + Attributes attributes = Attributes.of(SUCCESS_KEY, Boolean.toString(flightSubmitted)); + submissionDuration.record(duration.toMillis(), attributes); } /** Record the duration of an attempt to complete a cleanup flight. */ - public static void recordCompletionDuration(Duration duration, boolean flightCompleted) { - TagContext tctx = - TAGGER - .emptyBuilder() - .putLocal(SUCCESS_KEY, TagValue.create(Boolean.valueOf(flightCompleted).toString())) - .build(); - STATS_RECORDER.newMeasureMap().put(COMPLETION_DURATION, duration.toMillis()).record(tctx); + public void recordCompletionDuration(Duration duration, boolean flightCompleted) { + Attributes attributes = Attributes.of(SUCCESS_KEY, Boolean.toString(flightCompleted)); + completionDuration.record(duration.toMillis(), attributes); } /** * Record the duration of an attempt to update a cleanup flight that ended fatally in Stairway. */ - public static void recordFatalUpdateDuration(Duration duration, boolean flightUpdated) { - TagContext tctx = - TAGGER - .emptyBuilder() - .putLocal(SUCCESS_KEY, TagValue.create(Boolean.valueOf(flightUpdated).toString())) - .build(); - STATS_RECORDER.newMeasureMap().put(FATAL_UPDATE_DURATION, duration.toMillis()).record(tctx); + public void recordFatalUpdateDuration(Duration duration, boolean flightUpdated) { + Attributes attributes = Attributes.of(SUCCESS_KEY, Boolean.toString(flightUpdated)); + fatalUpdateDuration.record(duration.toMillis(), attributes); } /** Records the latest count of {@link ResourceKind}. */ - public static void recordResourceKindCount( - ResourceKind kind, TrackedResourceState state, int count) { - TagContext tctx = - TAGGER - .emptyBuilder() - .putLocal(RESOURCE_STATE_KEY, TagValue.create(state.toString())) - .putLocal(RESOURCE_TYPE_KEY, TagValue.create(kind.resourceType().toString())) - .putLocal(CLIENT_KEY, TagValue.create(kind.client())) - .build(); - STATS_RECORDER.newMeasureMap().put(TRACKED_RESOURCE_COUNT, count).record(tctx); + public void recordResourceKindCount(ResourceKind kind, TrackedResourceState state, int count) { + Attributes attributes = + Attributes.of( + RESOURCE_STATE_KEY, state.toString(), + RESOURCE_TYPE_KEY, kind.resourceType().toString(), + CLIENT_KEY, kind.client()); + trackedResourceCount.add(count, attributes); } /** * Increment the count of the cleanup flights that were already submitted to Stairway but on * recovery were still in the {@link bio.terra.janitor.db.CleanupFlightState#INITIATING} state. */ - public static void incrementRecoveredSubmittedFlight() { - STATS_RECORDER.newMeasureMap().put(RECOVERED_SUBMITTED_FLIGHTS_COUNT, 1).record(TAGGER.empty()); + public void incrementRecoveredSubmittedFlight() { + recoveredSubmittedFlightsCount.add(1); } /** * Increment the count of the cleanup flights that finished as {@link * bio.terra.janitor.db.CleanupFlightState#FATAL} but were not yet deleted from Stairway. */ - public static void incrementFatalFlightUndeleted() { - STATS_RECORDER.newMeasureMap().put(FATAL_FLIGHT_UNDELETED_COUNT, 1).record(TAGGER.empty()); + public void incrementFatalFlightUndeleted() { + fatalFlightUndeletedCount.add(1); } } diff --git a/src/main/java/bio/terra/janitor/service/cleanup/MetricsViews.java b/src/main/java/bio/terra/janitor/service/cleanup/MetricsViews.java new file mode 100644 index 00000000..de475481 --- /dev/null +++ b/src/main/java/bio/terra/janitor/service/cleanup/MetricsViews.java @@ -0,0 +1,101 @@ +package bio.terra.janitor.service.cleanup; + +import io.opentelemetry.sdk.metrics.Aggregation; +import io.opentelemetry.sdk.metrics.InstrumentSelector; +import io.opentelemetry.sdk.metrics.View; +import java.util.Set; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.util.Pair; + +@Configuration +public class MetricsViews { + + @Bean(name = MetricsHelper.SUBMISSION_DURATION_METER_NAME) + public Pair submissionDurationView() { + return Pair.of( + InstrumentSelector.builder() + .setMeterName(MetricsHelper.SUBMISSION_DURATION_METER_NAME) + .build(), + View.builder() + .setName(MetricsHelper.SUBMISSION_DURATION_METER_NAME) + .setDescription("Duration of a cleanup flight submission") + .setAggregation(Aggregation.base2ExponentialBucketHistogram()) + .setAttributeFilter(Set.of(MetricsHelper.SUCCESS_KEY.getKey())) + .build()); + } + + @Bean(name = MetricsHelper.COMPLETION_DURATION_METER_NAME) + public Pair completionDurationView() { + return Pair.of( + InstrumentSelector.builder() + .setMeterName(MetricsHelper.COMPLETION_DURATION_METER_NAME) + .build(), + View.builder() + .setName(MetricsHelper.COMPLETION_DURATION_METER_NAME) + .setDescription("Duration of a cleanup flight completion") + .setAggregation(Aggregation.base2ExponentialBucketHistogram()) + .setAttributeFilter(Set.of(MetricsHelper.SUCCESS_KEY.getKey())) + .build()); + } + + @Bean(name = MetricsHelper.FATAL_UPDATE_DURATION_METER_NAME) + public Pair fatalUpdateDurationView() { + return Pair.of( + InstrumentSelector.builder() + .setMeterName(MetricsHelper.FATAL_UPDATE_DURATION_METER_NAME) + .build(), + View.builder() + .setName(MetricsHelper.FATAL_UPDATE_DURATION_METER_NAME) + .setDescription("Duration of a cleanup flight fatal update") + .setAggregation(Aggregation.base2ExponentialBucketHistogram()) + .setAttributeFilter(Set.of(MetricsHelper.SUCCESS_KEY.getKey())) + .build()); + } + + @Bean(name = MetricsHelper.TRACKED_RESOURCE_COUNT_METER_NAME) + public Pair trackedResourceCountView() { + return Pair.of( + InstrumentSelector.builder() + .setMeterName(MetricsHelper.TRACKED_RESOURCE_COUNT_METER_NAME) + .build(), + View.builder() + .setName(MetricsHelper.TRACKED_RESOURCE_COUNT_METER_NAME) + .setDescription("Counts of the number of tracked resources") + .setAggregation(Aggregation.sum()) + .setAttributeFilter( + Set.of( + MetricsHelper.RESOURCE_STATE_KEY.getKey(), + MetricsHelper.RESOURCE_TYPE_KEY.getKey(), + MetricsHelper.CLIENT_KEY.getKey())) + .build()); + } + + @Bean(name = MetricsHelper.RECOVERED_SUBMITTED_FLIGHTS_COUNT_METER_NAME) + public Pair recoveredSubmittedFlightsCountView() { + return Pair.of( + InstrumentSelector.builder() + .setMeterName(MetricsHelper.RECOVERED_SUBMITTED_FLIGHTS_COUNT_METER_NAME) + .build(), + View.builder() + .setName(MetricsHelper.RECOVERED_SUBMITTED_FLIGHTS_COUNT_METER_NAME) + .setDescription( + "Count of the number of recovered flights that were already submitted successfully to Stairway") + .setAggregation(Aggregation.sum()) + .build()); + } + + @Bean(name = MetricsHelper.FATAL_FLIGHT_UNDELETED_COUNT_METER_NAME) + public Pair fatalFlightUndeletedCount() { + return Pair.of( + InstrumentSelector.builder() + .setMeterName(MetricsHelper.FATAL_FLIGHT_UNDELETED_COUNT_METER_NAME) + .build(), + View.builder() + .setName(MetricsHelper.FATAL_FLIGHT_UNDELETED_COUNT_METER_NAME) + .setDescription( + "Count of the number of fatal cleanup flights that were not deleted from Stairway when they were completed by the Janitor") + .setAggregation(Aggregation.sum()) + .build()); + } +} diff --git a/src/main/java/bio/terra/janitor/service/stackdriver/StackdriverExporter.java b/src/main/java/bio/terra/janitor/service/stackdriver/StackdriverExporter.java deleted file mode 100644 index 40ab7732..00000000 --- a/src/main/java/bio/terra/janitor/service/stackdriver/StackdriverExporter.java +++ /dev/null @@ -1,34 +0,0 @@ -package bio.terra.janitor.service.stackdriver; - -import bio.terra.janitor.app.configuration.StackdriverConfiguration; -import io.opencensus.exporter.stats.stackdriver.StackdriverStatsExporter; -import java.io.IOException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** A component for setting up Stackdriver stats exporting. */ -@Component -public class StackdriverExporter { - private final Logger logger = LoggerFactory.getLogger(StackdriverExporter.class); - - private final StackdriverConfiguration stackdriverConfiguration; - - @Autowired - public StackdriverExporter(StackdriverConfiguration stackdriverConfiguration) { - this.stackdriverConfiguration = stackdriverConfiguration; - } - - public void initialize() { - logger.info("Stackdriver stats enabled: {}.", stackdriverConfiguration.isEnabled()); - if (!stackdriverConfiguration.isEnabled()) { - return; - } - try { - StackdriverStatsExporter.createAndRegister(); - } catch (IOException e) { - logger.error("Unable to initialize Stackdriver stats exporting.", e); - } - } -} diff --git a/src/main/java/bio/terra/janitor/service/stairway/StairwayComponent.java b/src/main/java/bio/terra/janitor/service/stairway/StairwayComponent.java index bb39afc6..f6fb2dca 100644 --- a/src/main/java/bio/terra/janitor/service/stairway/StairwayComponent.java +++ b/src/main/java/bio/terra/janitor/service/stairway/StairwayComponent.java @@ -9,6 +9,7 @@ import bio.terra.stairway.exception.StairwayException; import bio.terra.stairway.exception.StairwayExecutionException; import com.google.common.collect.ImmutableList; +import io.opentelemetry.api.OpenTelemetry; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,7 +57,7 @@ public StairwayComponent( .applicationContext(applicationContext) .stairwayName(stairwayConfiguration.getName()) .stairwayHook(new CleanupLoggingHook()) - .stairwayHook(new MonitoringHook()); + .stairwayHook(new MonitoringHook(applicationContext.getBean(OpenTelemetry.class))); try { stairway = builder.build(); } catch (StairwayExecutionException e) { diff --git a/src/main/java/bio/terra/janitor/service/workspace/WorkspaceManagerService.java b/src/main/java/bio/terra/janitor/service/workspace/WorkspaceManagerService.java index f72ba3fa..572351d2 100644 --- a/src/main/java/bio/terra/janitor/service/workspace/WorkspaceManagerService.java +++ b/src/main/java/bio/terra/janitor/service/workspace/WorkspaceManagerService.java @@ -6,8 +6,8 @@ import bio.terra.workspace.api.WorkspaceApi; import bio.terra.workspace.client.ApiClient; import bio.terra.workspace.client.ApiException; +import jakarta.ws.rs.client.Client; import java.util.UUID; -import javax.ws.rs.client.Client; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c2964b85..4bb405ce 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -19,8 +19,6 @@ janitor: subscription: ${TRACK_RESOURCE_PUBSUB_SUBSCRIPTION} server: port: 8080 - stackdriver: - enabled: true stairway: db: password: ${STAIRWAY_DATABASE_USER_PASSWORD} @@ -40,6 +38,15 @@ janitor: managed-app-client-secret: ${AZURE_MANAGED_APP_CLIENT_SECRET} managed-app-tenant-id: ${AZURE_MANAGED_APP_TENANT_ID} +terra.common: + tracing: + sampling-ratio: ${SAMPLING_PROBABILITY:0} + google: + metrics: + enabled: ${TERRA_COMMON_TRACING_STACKDRIVER_EXPORT_ENABLED:true} + tracing: + enabled: ${TRACING_ENABLED:false} + server: compression: enabled: true @@ -56,3 +63,12 @@ spring: static-locations: classpath:/api/ config: import: optional:file:config/local-properties.yml + +otel: + sdk: + disabled: false # set to true to disable all open telemetry features + springboot: + resource: + attributes: + service: + name: ${spring.application.name} diff --git a/src/test/java/bio/terra/janitor/app/controller/JanitorApiControllerTest.java b/src/test/java/bio/terra/janitor/app/controller/JanitorApiControllerTest.java index 89d7089a..6d63adac 100644 --- a/src/test/java/bio/terra/janitor/app/controller/JanitorApiControllerTest.java +++ b/src/test/java/bio/terra/janitor/app/controller/JanitorApiControllerTest.java @@ -37,7 +37,6 @@ import org.springframework.http.MediaType; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; @@ -45,8 +44,7 @@ @Tag("unit") @ActiveProfiles({"test", "unit"}) @ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = Main.class) -@SpringBootTest +@SpringBootTest(classes = Main.class) @AutoConfigureMockMvc @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) public class JanitorApiControllerTest { diff --git a/src/test/java/bio/terra/janitor/app/controller/UnauthenticatedApiControllerTest.java b/src/test/java/bio/terra/janitor/app/controller/UnauthenticatedApiControllerTest.java index 66a7fb5b..9be33380 100644 --- a/src/test/java/bio/terra/janitor/app/controller/UnauthenticatedApiControllerTest.java +++ b/src/test/java/bio/terra/janitor/app/controller/UnauthenticatedApiControllerTest.java @@ -18,15 +18,13 @@ import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; @Tag("unit") @ActiveProfiles({"test", "unit"}) @ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = Main.class) -@SpringBootTest +@SpringBootTest(classes = Main.class) @AutoConfigureMockMvc @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) public class UnauthenticatedApiControllerTest { diff --git a/src/test/java/bio/terra/janitor/common/BaseIntegrationTest.java b/src/test/java/bio/terra/janitor/common/BaseIntegrationTest.java index c24c32d7..2b7a4636 100644 --- a/src/test/java/bio/terra/janitor/common/BaseIntegrationTest.java +++ b/src/test/java/bio/terra/janitor/common/BaseIntegrationTest.java @@ -5,12 +5,10 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @Tag("integration") @ActiveProfiles({"test", "integration"}) @ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = Main.class) -@SpringBootTest +@SpringBootTest(classes = Main.class) public class BaseIntegrationTest {} diff --git a/src/test/java/bio/terra/janitor/common/BaseUnitTest.java b/src/test/java/bio/terra/janitor/common/BaseUnitTest.java index 1f0d6197..ad0561df 100644 --- a/src/test/java/bio/terra/janitor/common/BaseUnitTest.java +++ b/src/test/java/bio/terra/janitor/common/BaseUnitTest.java @@ -5,12 +5,10 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @Tag("unit") @ActiveProfiles({"test", "unit"}) @ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = Main.class) -@SpringBootTest +@SpringBootTest(classes = Main.class) public class BaseUnitTest {} diff --git a/src/test/java/bio/terra/janitor/db/BackwardsCompatibilityTest.java b/src/test/java/bio/terra/janitor/db/BackwardsCompatibilityTest.java index 04f7021b..927296af 100644 --- a/src/test/java/bio/terra/janitor/db/BackwardsCompatibilityTest.java +++ b/src/test/java/bio/terra/janitor/db/BackwardsCompatibilityTest.java @@ -30,8 +30,8 @@ public void resourceType() { assertEquals(ResourceType.GOOGLE_PROJECT, ResourceType.valueOf("GOOGLE_PROJECT")); assertEquals(ResourceType.AZURE_PUBLIC_IP, ResourceType.valueOf("AZURE_PUBLIC_IP")); assertEquals( - ResourceType.AZURE_NETWORK_SECURITY_GROUP, - ResourceType.valueOf("AZURE_NETWORK_SECURITY_GROUP")); + ResourceType.AZURE_NETWORK_SECURITY_GROUP, + ResourceType.valueOf("AZURE_NETWORK_SECURITY_GROUP")); assertEquals(ResourceType.AZURE_NETWORK, ResourceType.valueOf("AZURE_NETWORK")); assertEquals(ResourceType.AZURE_DISK, ResourceType.valueOf("AZURE_DISK")); assertEquals(ResourceType.AZURE_VIRTUAL_MACHINE, ResourceType.valueOf("AZURE_VIRTUAL_MACHINE")); @@ -39,7 +39,7 @@ public void resourceType() { assertEquals( ResourceType.AZURE_RELAY_CONNECTION, ResourceType.valueOf("AZURE_RELAY_CONNECTION")); assertEquals( - ResourceType.AZURE_CONTAINER_INSTANCE, ResourceType.valueOf("AZURE_CONTAINER_INSTANCE")); + ResourceType.AZURE_CONTAINER_INSTANCE, ResourceType.valueOf("AZURE_CONTAINER_INSTANCE")); assertEquals(ResourceType.TERRA_WORKSPACE, ResourceType.valueOf("TERRA_WORKSPACE")); assertEquals(ResourceType.AZURE_DATABASE, ResourceType.valueOf("AZURE_DATABASE")); assertEquals( diff --git a/src/test/java/bio/terra/janitor/service/cleanup/FlightManagerTest.java b/src/test/java/bio/terra/janitor/service/cleanup/FlightManagerTest.java index 062f3f6d..b79cc268 100644 --- a/src/test/java/bio/terra/janitor/service/cleanup/FlightManagerTest.java +++ b/src/test/java/bio/terra/janitor/service/cleanup/FlightManagerTest.java @@ -37,6 +37,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.ApplicationContext; import org.springframework.test.annotation.DirtiesContext; import org.springframework.transaction.support.TransactionTemplate; @@ -51,10 +52,15 @@ public class FlightManagerTest extends BaseUnitTest { @Autowired StairwayComponent stairwayComponent; @Autowired JanitorDao janitorDao; @Autowired TransactionTemplate transactionTemplate; + @MockBean private MetricsHelper mockMetricsHelper; private FlightManager createFlightManager(FlightSubmissionFactory submissionFactory) { return new FlightManager( - stairwayComponent.get(), janitorDao, transactionTemplate, submissionFactory); + stairwayComponent.get(), + janitorDao, + transactionTemplate, + submissionFactory, + mockMetricsHelper); } private static TrackedResource newResourceForCleaning() { diff --git a/src/test/java/bio/terra/janitor/service/cleanup/FlightSchedulerTest.java b/src/test/java/bio/terra/janitor/service/cleanup/FlightSchedulerTest.java index 483c0090..bacf58d8 100644 --- a/src/test/java/bio/terra/janitor/service/cleanup/FlightSchedulerTest.java +++ b/src/test/java/bio/terra/janitor/service/cleanup/FlightSchedulerTest.java @@ -1,13 +1,15 @@ package bio.terra.janitor.service.cleanup; import static bio.terra.janitor.service.cleanup.CleanupTestUtils.pollUntil; -import static bio.terra.janitor.service.cleanup.CleanupTestUtils.sleepForMetricsExport; -import static org.hamcrest.MatcherAssert.assertThat; +import static org.awaitility.Awaitility.await; +import static org.mockito.Mockito.verify; import bio.terra.janitor.app.configuration.PrimaryConfiguration; import bio.terra.janitor.common.BaseUnitTest; import bio.terra.janitor.db.JanitorDao; +import bio.terra.janitor.db.ResourceKind; import bio.terra.janitor.db.ResourceMetadata; +import bio.terra.janitor.db.ResourceType; import bio.terra.janitor.db.TrackedResource; import bio.terra.janitor.db.TrackedResourceId; import bio.terra.janitor.db.TrackedResourceState; @@ -21,11 +23,11 @@ import java.time.Duration; import java.time.Instant; import java.util.UUID; -import org.hamcrest.Matchers; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.annotation.DirtiesContext; import org.springframework.transaction.support.TransactionTemplate; @@ -38,6 +40,7 @@ public class FlightSchedulerTest extends BaseUnitTest { @Autowired JanitorDao janitorDao; @Autowired StairwayComponent stairwayComponent; @Autowired TransactionTemplate transactionTemplate; + @MockBean private MetricsHelper mockMetricsHelper; private void initializeScheduler(FlightSubmissionFactory submissionFactory) { flightScheduler = @@ -46,7 +49,8 @@ private void initializeScheduler(FlightSubmissionFactory submissionFactory) { stairwayComponent, janitorDao, transactionTemplate, - submissionFactory); + submissionFactory, + mockMetricsHelper); flightScheduler.initialize(); } @@ -121,7 +125,7 @@ public void fatalCleanupCompleted() throws Exception { } @Test - public void recordResourceCount() throws Exception { + public void recordResourceCount() { TrackedResource resource = newReadyExpiredResource(JanitorDao.currentInstant()); janitorDao.createResource(resource, ImmutableMap.of()); @@ -129,14 +133,15 @@ public void recordResourceCount() throws Exception { trackedResource -> FlightSubmissionFactory.FlightSubmission.create(FatalFlight.class, new FlightMap())); - sleepForMetricsExport(); - - assertThat( - MetricsHelper.VIEW_MANAGER - .getView(MetricsHelper.TRACKED_RESOURCE_COUNT_VIEW.getName()) - .getAggregationMap() - .size(), - Matchers.greaterThan(0)); + await() + .atMost(Duration.ofSeconds(30)) + .untilAsserted( + () -> + verify(mockMetricsHelper) + .recordResourceKindCount( + ResourceKind.create("", ResourceType.GOOGLE_BUCKET), + resource.trackedResourceState(), + 1)); } /** A {@link Flight} that ends fatally. */ diff --git a/src/test/java/bio/terra/janitor/service/cleanup/MetricsHelperTest.java b/src/test/java/bio/terra/janitor/service/cleanup/MetricsHelperTest.java new file mode 100644 index 00000000..d42cefea --- /dev/null +++ b/src/test/java/bio/terra/janitor/service/cleanup/MetricsHelperTest.java @@ -0,0 +1,138 @@ +package bio.terra.janitor.service.cleanup; + +import static bio.terra.janitor.service.cleanup.MetricsHelper.CLIENT_KEY; +import static bio.terra.janitor.service.cleanup.MetricsHelper.COMPLETION_DURATION_METER_NAME; +import static bio.terra.janitor.service.cleanup.MetricsHelper.FATAL_FLIGHT_UNDELETED_COUNT_METER_NAME; +import static bio.terra.janitor.service.cleanup.MetricsHelper.FATAL_UPDATE_DURATION_METER_NAME; +import static bio.terra.janitor.service.cleanup.MetricsHelper.RECOVERED_SUBMITTED_FLIGHTS_COUNT_METER_NAME; +import static bio.terra.janitor.service.cleanup.MetricsHelper.RESOURCE_STATE_KEY; +import static bio.terra.janitor.service.cleanup.MetricsHelper.RESOURCE_TYPE_KEY; +import static bio.terra.janitor.service.cleanup.MetricsHelper.SUBMISSION_DURATION_METER_NAME; +import static bio.terra.janitor.service.cleanup.MetricsHelper.TRACKED_RESOURCE_COUNT_METER_NAME; +import static org.awaitility.Awaitility.await; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import bio.terra.janitor.common.BaseUnitTest; +import bio.terra.janitor.db.ResourceKind; +import bio.terra.janitor.db.ResourceType; +import bio.terra.janitor.db.TrackedResourceState; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.Collection; +import java.util.function.Consumer; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +/** Test for {@link bio.terra.cloudres.util.MetricsHelper} */ +@Tag("unit") +public class MetricsHelperTest extends BaseUnitTest { + private static final Duration METRICS_COLLECTION_INTERVAL = Duration.ofMillis(10); + private MetricsHelper metricsHelper; + private TestMetricExporter testMetricExporter; + + @BeforeEach + void setup() { + testMetricExporter = new TestMetricExporter(); + metricsHelper = new MetricsHelper(openTelemetry(testMetricExporter)); + } + + @Test + public void testRecordSubmissionDuration() { + testHistogram( + d -> metricsHelper.recordSubmissionDuration(d, true), SUBMISSION_DURATION_METER_NAME); + } + + @Test + public void testRecordCompletionDuration() { + testHistogram( + d -> metricsHelper.recordCompletionDuration(d, true), COMPLETION_DURATION_METER_NAME); + } + + @Test + public void testRecordFatalUpdateDuration() { + testHistogram( + d -> metricsHelper.recordFatalUpdateDuration(d, true), FATAL_UPDATE_DURATION_METER_NAME); + } + + @Test + public void testRecordResourceKindCount() { + var resourceKind = ResourceKind.create("client", ResourceType.GOOGLE_BUCKET); + var trackedResourceState = TrackedResourceState.READY; + metricsHelper.recordResourceKindCount(resourceKind, trackedResourceState, 100); + var metricData = waitForMetrics(testMetricExporter, METRICS_COLLECTION_INTERVAL); + assertEquals(TRACKED_RESOURCE_COUNT_METER_NAME, metricData.getName()); + assertEquals(1, metricData.getLongSumData().getPoints().size()); + var point = metricData.getLongSumData().getPoints().iterator().next(); + assertEquals(100, point.getValue()); + assertEquals(trackedResourceState.toString(), point.getAttributes().get(RESOURCE_STATE_KEY)); + assertEquals( + resourceKind.resourceType().toString(), point.getAttributes().get(RESOURCE_TYPE_KEY)); + assertEquals(resourceKind.client(), point.getAttributes().get(CLIENT_KEY)); + } + + @Test + public void testIncrementRecoveredSubmittedFlight() { + metricsHelper.incrementRecoveredSubmittedFlight(); + var metricData = waitForMetrics(testMetricExporter, METRICS_COLLECTION_INTERVAL); + assertEquals(RECOVERED_SUBMITTED_FLIGHTS_COUNT_METER_NAME, metricData.getName()); + assertEquals(1, metricData.getLongSumData().getPoints().size()); + var point = metricData.getLongSumData().getPoints().iterator().next(); + assertEquals(1, point.getValue()); + } + + @Test + public void testIncrementFatalFlightUndeleted() { + metricsHelper.incrementFatalFlightUndeleted(); + var metricData = waitForMetrics(testMetricExporter, METRICS_COLLECTION_INTERVAL); + assertEquals(FATAL_FLIGHT_UNDELETED_COUNT_METER_NAME, metricData.getName()); + assertEquals(1, metricData.getLongSumData().getPoints().size()); + var point = metricData.getLongSumData().getPoints().iterator().next(); + assertEquals(1, point.getValue()); + } + + private void testHistogram(Consumer recordMetric, String name) { + var duration = Duration.of(5, ChronoUnit.MINUTES); + recordMetric.accept(duration); + var metricData = waitForMetrics(testMetricExporter, METRICS_COLLECTION_INTERVAL); + + assertEquals(name, metricData.getName()); + + assertEquals(1, metricData.getHistogramData().getPoints().size()); + assertEquals( + duration.toMillis(), metricData.getHistogramData().getPoints().iterator().next().getSum()); + } + + private static MetricData waitForMetrics( + TestMetricExporter testMetricExporter, Duration pollInterval) { + return waitForMetrics(testMetricExporter, pollInterval, 1).iterator().next(); + } + + private static Collection waitForMetrics( + TestMetricExporter testMetricExporter, Duration pollInterval, int expectedMetricsCount) { + await() + .atMost(pollInterval.multipliedBy(10)) + .pollInterval(pollInterval) + .until( + () -> + testMetricExporter.getLastMetrics() != null + && testMetricExporter.getLastMetrics().size() == expectedMetricsCount); + return testMetricExporter.getLastMetrics(); + } + + public OpenTelemetry openTelemetry(TestMetricExporter testMetricExporter) { + var sdkMeterProviderBuilder = + SdkMeterProvider.builder() + .registerMetricReader( + PeriodicMetricReader.builder(testMetricExporter) + .setInterval(METRICS_COLLECTION_INTERVAL) + .build()); + + return OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProviderBuilder.build()).build(); + } +} diff --git a/src/test/java/bio/terra/janitor/service/cleanup/TestMetricExporter.java b/src/test/java/bio/terra/janitor/service/cleanup/TestMetricExporter.java new file mode 100644 index 00000000..11d62321 --- /dev/null +++ b/src/test/java/bio/terra/janitor/service/cleanup/TestMetricExporter.java @@ -0,0 +1,39 @@ +package bio.terra.janitor.service.cleanup; + +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.metrics.InstrumentType; +import io.opentelemetry.sdk.metrics.data.AggregationTemporality; +import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.MetricExporter; +import java.util.Collection; +import java.util.List; + +/** A test metric exporter that stores the last metrics it received. */ +public class TestMetricExporter implements MetricExporter { + private Collection lastMetrics; + + @Override + public synchronized CompletableResultCode export(Collection metrics) { + lastMetrics = List.copyOf(metrics); + return CompletableResultCode.ofSuccess(); + } + + public synchronized Collection getLastMetrics() { + return lastMetrics; + } + + @Override + public CompletableResultCode flush() { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode shutdown() { + return CompletableResultCode.ofSuccess(); + } + + @Override + public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) { + return AggregationTemporality.CUMULATIVE; + } +} diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index 7c927034..33637ff6 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -32,3 +32,5 @@ janitor: terra.common: tracing: stackdriverExportEnabled: false + prometheus: + endpointEnabled: false