diff --git a/docs/instrumentation-list.yaml b/docs/instrumentation-list.yaml new file mode 100644 index 000000000000..604906f03b7a --- /dev/null +++ b/docs/instrumentation-list.yaml @@ -0,0 +1,1603 @@ +activej: + instrumentations: + - name: activej-http-6.0 + srcPath: instrumentation/activej-http-6.0 + target_versions: + javaagent: + - io.activej:activej-http:[6.0,) +akka: + instrumentations: + - name: akka-http-10.0 + srcPath: instrumentation/akka/akka-http-10.0 + target_versions: + javaagent: + - com.typesafe.akka:akka-http_2.12:[10,) + - com.typesafe.akka:akka-http_2.13:[10,) + - com.typesafe.akka:akka-http_2.11:[10,) + - name: akka-actor-fork-join-2.5 + srcPath: instrumentation/akka/akka-actor-fork-join-2.5 + target_versions: + javaagent: + - com.typesafe.akka:akka-actor_2.12:[2.5,2.6) + - com.typesafe.akka:akka-actor_2.13:[2.5.23,2.6) + - com.typesafe.akka:akka-actor_2.11:[2.5,) + - name: akka-actor-2.3 + srcPath: instrumentation/akka/akka-actor-2.3 + target_versions: + javaagent: + - com.typesafe.akka:akka-actor_2.11:[2.3,) + - com.typesafe.akka:akka-actor_2.12:[2.3,) + - com.typesafe.akka:akka-actor_2.13:[2.3,) +alibaba: + instrumentations: + - name: alibaba-druid-1.0 + srcPath: instrumentation/alibaba-druid-1.0 + target_versions: + javaagent: + - com.alibaba:druid:(,) + library: + - com.alibaba:druid:1.0.0 +apache: + instrumentations: + - name: apache-shenyu-2.4 + srcPath: instrumentation/apache-shenyu-2.4 + target_versions: + javaagent: + - org.apache.shenyu:shenyu-web:[2.4.0,) + - name: apache-httpclient-2.0 + srcPath: instrumentation/apache-httpclient/apache-httpclient-2.0 + target_versions: + javaagent: + - commons-httpclient:commons-httpclient:[2.0,4.0) + - name: apache-httpasyncclient-4.1 + srcPath: instrumentation/apache-httpasyncclient-4.1 + target_versions: + javaagent: + - org.apache.httpcomponents:httpasyncclient:[4.1,) + - name: apache-httpclient-4.3 + srcPath: instrumentation/apache-httpclient/apache-httpclient-4.3 + target_versions: + library: + - org.apache.httpcomponents:httpclient:4.3 + - name: apache-httpclient-4.0 + srcPath: instrumentation/apache-httpclient/apache-httpclient-4.0 + target_versions: + javaagent: + - io.dropwizard:dropwizard-client:(,3.0.0) + - org.apache.httpcomponents:httpclient:[4.0,) + - name: apache-dubbo-2.7 + srcPath: instrumentation/apache-dubbo-2.7 + target_versions: + javaagent: + - org.apache.dubbo:dubbo:[2.7,) + - name: apache-httpclient-5.2 + srcPath: instrumentation/apache-httpclient/apache-httpclient-5.2 + target_versions: + library: + - org.apache.httpcomponents.client5:httpclient5:5.2.1 + - name: apache-httpclient-5.0 + srcPath: instrumentation/apache-httpclient/apache-httpclient-5.0 + target_versions: + javaagent: + - org.apache.httpcomponents.client5:httpclient5:[5.0,) + - name: apache-dbcp-2.0 + srcPath: instrumentation/apache-dbcp-2.0 + target_versions: + javaagent: + - org.apache.commons:commons-dbcp2:[2,) + library: + - org.apache.commons:commons-dbcp2:2.0 +armeria: + instrumentations: + - name: armeria-1.3 + srcPath: instrumentation/armeria/armeria-1.3 + target_versions: + javaagent: + - com.linecorp.armeria:armeria:[1.3.0,) + library: + - com.linecorp.armeria:armeria:1.3.0 + - name: armeria-grpc-1.14 + srcPath: instrumentation/armeria/armeria-grpc-1.14 + target_versions: + javaagent: + - com.linecorp.armeria:armeria-grpc:[1.14.0,) +async: + instrumentations: + - name: async-http-client-1.9 + srcPath: instrumentation/async-http-client/async-http-client-1.9 + target_versions: + javaagent: + - com.ning:async-http-client:[1.9.0,) + - name: async-http-client-2.0 + srcPath: instrumentation/async-http-client/async-http-client-2.0 + target_versions: + javaagent: + - org.asynchttpclient:async-http-client:[2.0.0,) +aws: + instrumentations: + - name: aws-lambda-events-2.2 + srcPath: instrumentation/aws-lambda/aws-lambda-events-2.2 + target_versions: + javaagent: + - com.amazonaws:aws-lambda-java-core:[1.0.0,) + library: + - com.amazonaws:aws-lambda-java-events:2.2.1 + - com.amazonaws:aws-lambda-java-core:1.0.0 + - name: aws-lambda-core-1.0 + srcPath: instrumentation/aws-lambda/aws-lambda-core-1.0 + target_versions: + javaagent: + - com.amazonaws:aws-lambda-java-core:[1.0.0,) + library: + - com.amazonaws:aws-lambda-java-core:1.0.0 + - name: aws-sdk-1.11 + srcPath: instrumentation/aws-sdk/aws-sdk-1.11 + target_versions: + javaagent: + - com.amazonaws:aws-java-sdk-sqs:[1.10.33,) + - com.amazonaws:aws-java-sdk-core:[1.10.33,) + library: + - com.amazonaws:aws-java-sdk-sqs:1.11.106 + - com.amazonaws:aws-java-sdk-core:1.11.0 + - name: aws-sdk-2.2 + srcPath: instrumentation/aws-sdk/aws-sdk-2.2 + target_versions: + javaagent: + - software.amazon.awssdk:sns:[2.2.0,) + - software.amazon.awssdk:lambda:[2.17.0,) + - software.amazon.awssdk:bedrock-runtime:[2.25.63,) + - software.amazon.awssdk:aws-core:[2.2.0,) + - software.amazon.awssdk:sqs:[2.2.0,) + library: + - software.amazon.awssdk:aws-core:2.2.0 + - software.amazon.awssdk:aws-json-protocol:2.2.0 + - software.amazon.awssdk:sqs:2.2.0 + - software.amazon.awssdk:sns:2.2.0 + - software.amazon.awssdk:lambda:2.2.0 +azure: + instrumentations: + - name: azure-core-1.36 + srcPath: instrumentation/azure-core/azure-core-1.36 + target_versions: + javaagent: + - com.azure:azure-core:[1.36.0,) + - name: azure-core-1.19 + srcPath: instrumentation/azure-core/azure-core-1.19 + target_versions: + javaagent: + - com.azure:azure-core:[1.19.0,1.36.0) + - name: azure-core-1.14 + srcPath: instrumentation/azure-core/azure-core-1.14 + target_versions: + javaagent: + - com.azure:azure-core:[1.14.0,1.19.0) +c3p0: + instrumentations: + - name: c3p0-0.9 + srcPath: instrumentation/c3p0-0.9 + target_versions: + javaagent: + - com.mchange:c3p0:(,) + library: + - com.mchange:c3p0:0.9.2 +camel: + instrumentations: + - name: camel-2.20 + srcPath: instrumentation/camel-2.20 + target_versions: + javaagent: + - org.apache.camel:camel-core:[2.19,3) +cassandra: + instrumentations: + - name: cassandra-4.0 + srcPath: instrumentation/cassandra/cassandra-4.0 + target_versions: + javaagent: + - com.datastax.oss:java-driver-core:[4.0,4.4) + - name: cassandra-4.4 + srcPath: instrumentation/cassandra/cassandra-4.4 + target_versions: + javaagent: + - com.datastax.oss:java-driver-core:[4.4,] + library: + - com.datastax.oss:java-driver-core:4.4.0 + - name: cassandra-3.0 + srcPath: instrumentation/cassandra/cassandra-3.0 + target_versions: + javaagent: [] +clickhouse: + instrumentations: + - name: clickhouse-client-0.5 + srcPath: instrumentation/clickhouse-client-0.5 + target_versions: + javaagent: + - com.clickhouse.client:clickhouse-client:[0.5.0,) +couchbase: + instrumentations: + - name: couchbase-3.1.6 + srcPath: instrumentation/couchbase/couchbase-3.1.6 + target_versions: + javaagent: + - com.couchbase.client:java-client:[3.1.6,3.2.0) + - name: couchbase-2.6 + srcPath: instrumentation/couchbase/couchbase-2.6 + target_versions: + javaagent: + - com.couchbase.client:java-client:[2.6.0,3) + - name: couchbase-2.0 + srcPath: instrumentation/couchbase/couchbase-2.0 + target_versions: + javaagent: + - com.couchbase.client:java-client:[2,3) + - name: couchbase-3.2 + srcPath: instrumentation/couchbase/couchbase-3.2 + target_versions: + javaagent: + - com.couchbase.client:java-client:[3.2.0,) + - name: couchbase-3.1 + srcPath: instrumentation/couchbase/couchbase-3.1 + target_versions: + javaagent: + - com.couchbase.client:java-client:[3.1,3.1.6) +dropwizard: + instrumentations: + - name: dropwizard-metrics-4.0 + srcPath: instrumentation/dropwizard/dropwizard-metrics-4.0 + target_versions: + javaagent: + - io.dropwizard.metrics:metrics-core:[4.0.0,) + - name: dropwizard-views-0.7 + srcPath: instrumentation/dropwizard/dropwizard-views-0.7 + target_versions: + javaagent: + - io.dropwizard:dropwizard-views:(,3.0.0) +elasticsearch: + instrumentations: + - name: elasticsearch-rest-6.4 + srcPath: instrumentation/elasticsearch/elasticsearch-rest-6.4 + target_versions: + javaagent: + - org.elasticsearch.client:elasticsearch-rest-client:[6.4,7.0) + - name: elasticsearch-api-client-7.16 + srcPath: instrumentation/elasticsearch/elasticsearch-api-client-7.16 + target_versions: + javaagent: + - co.elastic.clients:elasticsearch-java:[7.16,7.17.20) + - co.elastic.clients:elasticsearch-java:[8.0.0,8.10) + - name: elasticsearch-rest-5.0 + srcPath: instrumentation/elasticsearch/elasticsearch-rest-5.0 + target_versions: + javaagent: + - org.elasticsearch.client:rest:[5.0,6.4) + - org.elasticsearch.client:elasticsearch-rest-client:[5.0,6.4) + - name: elasticsearch-rest-7.0 + srcPath: instrumentation/elasticsearch/elasticsearch-rest-7.0 + target_versions: + javaagent: + - org.elasticsearch.client:elasticsearch-rest-client:[7.0,) + library: + - org.elasticsearch.client:elasticsearch-rest-client:7.0.0 + - name: elasticsearch-transport-6.0 + srcPath: instrumentation/elasticsearch/elasticsearch-transport-6.0 + target_versions: + javaagent: + - org.elasticsearch:elasticsearch:[6.0.0,8.0.0) + - org.elasticsearch.client:transport:[6.0.0,) + - name: elasticsearch-transport-5.0 + srcPath: instrumentation/elasticsearch/elasticsearch-transport-5.0 + target_versions: + javaagent: + - org.elasticsearch.client:transport:[5.0.0,5.3.0) + - org.elasticsearch:elasticsearch:[5.0.0,5.3.0) + - name: elasticsearch-transport-5.3 + srcPath: instrumentation/elasticsearch/elasticsearch-transport-5.3 + target_versions: + javaagent: + - org.elasticsearch.client:transport:[5.3.0,6.0.0) + - org.elasticsearch:elasticsearch:[5.3.0,6.0.0) +executors: + instrumentations: + - name: executors + srcPath: instrumentation/executors + target_versions: + javaagent: [] +external: + instrumentations: + - name: external-annotations + srcPath: instrumentation/external-annotations + target_versions: + javaagent: [] +finagle: + instrumentations: + - name: finagle-http-23.11 + srcPath: instrumentation/finagle-http-23.11 + target_versions: + javaagent: + - com.twitter:finagle-http_2.13:[23.11.0,] + - com.twitter:finagle-http_2.12:[23.11.0,] +finatra: + instrumentations: + - name: finatra-2.9 + srcPath: instrumentation/finatra-2.9 + target_versions: + javaagent: + - com.twitter:finatra-http_2.11:[2.9.0,] + - com.twitter:finatra-http_2.12:[2.9.0,] +geode: + instrumentations: + - name: geode-1.4 + srcPath: instrumentation/geode-1.4 + target_versions: + javaagent: + - org.apache.geode:geode-core:[1.4.0,) +google: + instrumentations: + - name: google-http-client-1.19 + srcPath: instrumentation/google-http-client-1.19 + target_versions: + javaagent: + - com.google.http-client:google-http-client:[1.19.0,) +grails: + instrumentations: + - name: grails-3.0 + srcPath: instrumentation/grails-3.0 + target_versions: + javaagent: + - org.grails:grails-web-url-mappings:[3.0,) +graphql: + instrumentations: + - name: graphql-java-12.0 + srcPath: instrumentation/graphql-java/graphql-java-12.0 + target_versions: + javaagent: + - com.graphql-java:graphql-java:[12,20) + library: + - com.graphql-java:graphql-java:12.0 + - name: graphql-java-20.0 + srcPath: instrumentation/graphql-java/graphql-java-20.0 + target_versions: + javaagent: + - com.graphql-java:graphql-java:[20,) + library: + - com.graphql-java:graphql-java:20.0 +grizzly: + instrumentations: + - name: grizzly-2.3 + srcPath: instrumentation/grizzly-2.3 + target_versions: + javaagent: + - org.glassfish.grizzly:grizzly-http:[2.3,) +grpc: + instrumentations: + - name: grpc-1.6 + srcPath: instrumentation/grpc-1.6 + target_versions: + javaagent: + - io.grpc:grpc-core:[1.6.0,) + library: + - io.grpc:grpc-core:1.6.0 +guava: + instrumentations: + - name: guava-10.0 + srcPath: instrumentation/guava-10.0 + target_versions: + javaagent: + - com.google.guava:guava:[10.0,] + library: + - com.google.guava:guava:10.0 +gwt: + instrumentations: + - name: gwt-2.0 + srcPath: instrumentation/gwt-2.0 + target_versions: + javaagent: + - com.google.gwt:gwt-servlet:[2.0.0,) + - org.gwtproject:gwt-servlet:[2.10.0,) +hibernate: + instrumentations: + - name: hibernate-4.0 + srcPath: instrumentation/hibernate/hibernate-4.0 + target_versions: + javaagent: + - org.hibernate:hibernate-core:[4.0.0.Final,6) + - name: hibernate-procedure-call-4.3 + srcPath: instrumentation/hibernate/hibernate-procedure-call-4.3 + target_versions: + javaagent: + - org.hibernate:hibernate-core:[4.3.0.Final,) + - name: hibernate-3.3 + srcPath: instrumentation/hibernate/hibernate-3.3 + target_versions: + javaagent: + - org.hibernate:hibernate-core:[3.3.0.GA,4.0.0.Final) + - name: hibernate-6.0 + srcPath: instrumentation/hibernate/hibernate-6.0 + target_versions: + javaagent: + - org.hibernate:hibernate-core:[6.0.0.Final,) + - name: hibernate-reactive-1.0 + srcPath: instrumentation/hibernate/hibernate-reactive-1.0 + target_versions: + javaagent: + - org.hibernate.reactive:hibernate-reactive-core:(,) +hikaricp: + instrumentations: + - name: hikaricp-3.0 + srcPath: instrumentation/hikaricp-3.0 + target_versions: + javaagent: + - com.zaxxer:HikariCP:[3.0.0,) + library: + - com.zaxxer:HikariCP:3.0.0 +http: + instrumentations: + - name: http-url-connection + srcPath: instrumentation/http-url-connection + target_versions: + javaagent: [] +hystrix: + instrumentations: + - name: hystrix-1.4 + srcPath: instrumentation/hystrix-1.4 + target_versions: + javaagent: + - com.netflix.hystrix:hystrix-core:[1.4.0,) +influxdb: + instrumentations: + - name: influxdb-2.4 + srcPath: instrumentation/influxdb-2.4 + target_versions: + javaagent: + - org.influxdb:influxdb-java:[2.4,) +internal: + instrumentations: + - name: internal-application-logger + srcPath: instrumentation/internal/internal-application-logger + target_versions: + javaagent: + - org.springframework.boot:spring-boot:[1.2.0,) + - org.slf4j:slf4j-api:[1.4.0,) + - name: internal-class-loader + srcPath: instrumentation/internal/internal-class-loader + target_versions: + javaagent: [] + - name: internal-lambda-java9 + srcPath: instrumentation/internal/internal-lambda-java9 + target_versions: {} + - name: internal-reflection + srcPath: instrumentation/internal/internal-reflection + target_versions: + javaagent: [] + - name: internal-lambda + srcPath: instrumentation/internal/internal-lambda + target_versions: + javaagent: [] + - name: internal-eclipse-osgi-3.6 + srcPath: instrumentation/internal/internal-eclipse-osgi-3.6 + target_versions: + javaagent: [] + - name: internal-url-class-loader + srcPath: instrumentation/internal/internal-url-class-loader + target_versions: + javaagent: [] +java: + instrumentations: + - name: java-util-logging + srcPath: instrumentation/java-util-logging + target_versions: + javaagent: [] + - name: java-http-server + srcPath: instrumentation/java-http-server + target_versions: + javaagent: [] + library: [] + - name: java-http-client + srcPath: instrumentation/java-http-client + target_versions: + javaagent: [] + library: [] +javalin: + instrumentations: + - name: javalin-5.0 + srcPath: instrumentation/javalin-5.0 + target_versions: + javaagent: + - io.javalin:javalin:[5.0.0,) +jaxrs: + instrumentations: + - name: jaxrs-2.0-cxf-3.2 + srcPath: instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-cxf-3.2 + target_versions: + javaagent: + - org.apache.tomee:openejb-cxf-rs:(8,) + - org.apache.cxf:cxf-rt-frontend-jaxrs:[3.2,4) + - name: jaxrs-3.0-annotations + srcPath: instrumentation/jaxrs/jaxrs-3.0/jaxrs-3.0-annotations + target_versions: + javaagent: + - jakarta.ws.rs:jakarta.ws.rs-api:[3.0.0,) + - name: jaxrs-2.0-jersey-2.0 + srcPath: instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-jersey-2.0 + target_versions: + javaagent: + - org.glassfish.jersey.core:jersey-server:[2.0,3.0.0) + - org.glassfish.jersey.containers:jersey-container-servlet:[2.0,3.0.0) + - name: jaxrs-3.0-jersey-3.0 + srcPath: instrumentation/jaxrs/jaxrs-3.0/jaxrs-3.0-jersey-3.0 + target_versions: + javaagent: + - org.glassfish.jersey.core:jersey-server:[3.0.0,) + - name: jaxrs-2.0-resteasy-3.1 + srcPath: instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.1 + target_versions: + javaagent: + - org.jboss.resteasy:resteasy-jaxrs:[3.1.0.Final,3.5.0.Final) + - org.jboss.resteasy:resteasy-core:[4.0.0.Final,6) + - name: jaxrs-2.0-resteasy-3.0 + srcPath: instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.0 + target_versions: + javaagent: + - org.jboss.resteasy:resteasy-jaxrs:[3.0.0.Final,3.1.0.Final) + - org.jboss.resteasy:resteasy-jaxrs:[3.5.0.Final,4) + - name: jaxrs-2.0-annotations + srcPath: instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-annotations + target_versions: + javaagent: + - javax.ws.rs:javax.ws.rs-api:[,] + - name: jaxrs-client-1.1 + srcPath: instrumentation/jaxrs-client/jaxrs-client-1.1 + target_versions: {} + - name: jaxrs-3.0-resteasy-6.0 + srcPath: instrumentation/jaxrs/jaxrs-3.0/jaxrs-3.0-resteasy-6.0 + target_versions: + javaagent: + - org.jboss.resteasy:resteasy-core:[6.0.0.Final,) + - name: jaxrs-1.0 + srcPath: instrumentation/jaxrs/jaxrs-1.0 + target_versions: + javaagent: + - javax.ws.rs:jsr311-api:[0.5,) +jaxws: + instrumentations: + - name: jaxws-jws-api-1.1 + srcPath: instrumentation/jaxws/jaxws-jws-api-1.1 + target_versions: + javaagent: + - javax.jws:javax.jws-api:[1.1,] + - name: jaxws-2.0 + srcPath: instrumentation/jaxws/jaxws-2.0 + target_versions: + javaagent: + - javax.xml.ws:jaxws-api:[2.0,] + - name: jaxws-2.0-metro-2.2 + srcPath: instrumentation/jaxws/jaxws-2.0-metro-2.2 + target_versions: {} + - name: jaxws-cxf-3.0 + srcPath: instrumentation/jaxws/jaxws-cxf-3.0 + target_versions: + javaagent: + - org.apache.cxf:cxf-rt-frontend-jaxws:[3.0.0,) + - name: jaxws-2.0-axis2-1.6 + srcPath: instrumentation/jaxws/jaxws-2.0-axis2-1.6 + target_versions: + javaagent: + - org.apache.axis2:axis2-jaxws:[1.6.0,) + - name: jaxws-2.0-cxf-3.0 + srcPath: instrumentation/jaxws/jaxws-2.0-cxf-3.0 + target_versions: {} + - name: jaxws-metro-2.2 + srcPath: instrumentation/jaxws/jaxws-metro-2.2 + target_versions: + javaagent: + - com.sun.xml.ws:jaxws-rt:[2.2.0.1,) +jboss: + instrumentations: + - name: jboss-logmanager-appender-1.1 + srcPath: instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1 + target_versions: + javaagent: + - org.jboss.logmanager:jboss-logmanager:[1.1.0.GA,) + - name: jboss-logmanager-mdc-1.1 + srcPath: instrumentation/jboss-logmanager/jboss-logmanager-mdc-1.1 + target_versions: + javaagent: + - org.jboss.logmanager:jboss-logmanager:[1.1.0.GA,) +jdbc: + instrumentations: + - name: jdbc + srcPath: instrumentation/jdbc + target_versions: + javaagent: [] + library: [] +jedis: + instrumentations: + - name: jedis-1.4 + srcPath: instrumentation/jedis/jedis-1.4 + target_versions: + javaagent: + - redis.clients:jedis:[1.4.0,3.0.0) + - name: jedis-4.0 + srcPath: instrumentation/jedis/jedis-4.0 + target_versions: + javaagent: + - redis.clients:jedis:[4.0.0-beta1,) + - name: jedis-3.0 + srcPath: instrumentation/jedis/jedis-3.0 + target_versions: + javaagent: + - redis.clients:jedis:[3.0.0,4) +jetty: + instrumentations: + - name: jetty-httpclient-12.0 + srcPath: instrumentation/jetty-httpclient/jetty-httpclient-12.0 + target_versions: + javaagent: + - org.eclipse.jetty:jetty-client:[12,) + library: + - org.eclipse.jetty:jetty-client:12.0.0 + - name: jetty-12.0 + srcPath: instrumentation/jetty/jetty-12.0 + target_versions: + javaagent: + - org.eclipse.jetty:jetty-server:[12,) + - name: jetty-8.0 + srcPath: instrumentation/jetty/jetty-8.0 + target_versions: + javaagent: + - org.eclipse.jetty:jetty-server:[8.0.0.v20110901,11) + - name: jetty-httpclient-9.2 + srcPath: instrumentation/jetty-httpclient/jetty-httpclient-9.2 + target_versions: + javaagent: + - org.eclipse.jetty:jetty-client:[9.2,10) + library: + - org.eclipse.jetty:jetty-client:9.2.0.v20140526 + - name: jetty-11.0 + srcPath: instrumentation/jetty/jetty-11.0 + target_versions: + javaagent: + - org.eclipse.jetty:jetty-server:[11, 12) +jms: + instrumentations: + - name: jms-3.0 + srcPath: instrumentation/jms/jms-3.0 + target_versions: + javaagent: + - jakarta.jms:jakarta.jms-api:[3.0.0,) + - name: jms-1.1 + srcPath: instrumentation/jms/jms-1.1 + target_versions: + javaagent: + - javax.jms:javax.jms-api:(,) + - jakarta.jms:jakarta.jms-api:(,3) + - javax.jms:jms-api:(,) +jmx: + instrumentations: + - name: jmx-metrics + srcPath: instrumentation/jmx-metrics + target_versions: + javaagent: [] + library: [] +jodd: + instrumentations: + - name: jodd-http-4.2 + srcPath: instrumentation/jodd-http-4.2 + target_versions: + javaagent: + - org.jodd:jodd-http:[4.2.0,) +jsf: + instrumentations: + - name: jsf-myfaces-3.0 + srcPath: instrumentation/jsf/jsf-myfaces-3.0 + target_versions: + javaagent: + - org.apache.myfaces.core:myfaces-impl:[3,) + - name: jsf-mojarra-3.0 + srcPath: instrumentation/jsf/jsf-mojarra-3.0 + target_versions: + javaagent: + - org.glassfish:jakarta.faces:[3,) + - name: jsf-myfaces-1.2 + srcPath: instrumentation/jsf/jsf-myfaces-1.2 + target_versions: + javaagent: + - org.apache.myfaces.core:myfaces-impl:[1.2,3) + - name: jsf-mojarra-1.2 + srcPath: instrumentation/jsf/jsf-mojarra-1.2 + target_versions: + javaagent: + - com.sun.faces:jsf-impl:[2.1,2.2) + - org.glassfish:jakarta.faces:[2.3.9,3) + - com.sun.faces:jsf-impl:[2.0,2.1) + - org.glassfish:javax.faces:[2.0.7,3) + - javax.faces:jsf-impl:[1.2,2) +jsp: + instrumentations: + - name: jsp-2.3 + srcPath: instrumentation/jsp-2.3 + target_versions: + javaagent: + - org.apache.tomcat:tomcat-jasper:[7.0.19,10) +kafka: + instrumentations: + - name: kafka-streams-0.11 + srcPath: instrumentation/kafka/kafka-streams-0.11 + target_versions: + javaagent: + - org.apache.kafka:kafka-streams:[0.11.0.0,) + - name: kafka-clients-2.6 + srcPath: instrumentation/kafka/kafka-clients/kafka-clients-2.6 + target_versions: + library: + - org.apache.kafka:kafka-clients:2.6.0 + - name: kafka-clients-0.11 + srcPath: instrumentation/kafka/kafka-clients/kafka-clients-0.11 + target_versions: + javaagent: + - org.apache.kafka:kafka-clients:[0.11.0.0,) +kotlinx: + instrumentations: + - name: kotlinx-coroutines + srcPath: instrumentation/kotlinx-coroutines + target_versions: + javaagent: + - org.jetbrains.kotlinx:kotlinx-coroutines-core:[1.3.0,1.3.8) + - org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:[1.3.9,) + - org.jetbrains.kotlinx:kotlinx-coroutines-core:[1.0.0,1.3.8) + - name: kotlinx-coroutines-1.0 + srcPath: instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0 + target_versions: + javaagent: + - org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:[1.3.9,) + - org.jetbrains.kotlinx:kotlinx-coroutines-core:[1.0.0,1.3.8) + - name: kotlinx-coroutines-flow-1.3 + srcPath: instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3 + target_versions: + javaagent: + - org.jetbrains.kotlinx:kotlinx-coroutines-core:[1.3.0,1.3.8) + - org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:[1.3.9,) +ktor: + instrumentations: + - name: ktor-2.0 + srcPath: instrumentation/ktor/ktor-2.0 + target_versions: + javaagent: + - io.ktor:ktor-client-core:[2.0.0,3.0.0) + - io.ktor:ktor-server-core:[2.0.0,3.0.0) + library: + - io.ktor:ktor-server-core:2.0.0 + - io.ktor:ktor-client-core:2.0.0 + - name: ktor-3.0 + srcPath: instrumentation/ktor/ktor-3.0 + target_versions: + javaagent: + - io.ktor:ktor-server-core:[3.0.0,) + - io.ktor:ktor-client-core:[3.0.0,) + library: + - io.ktor:ktor-server-core:3.0.0 + - io.ktor:ktor-client-core:3.0.0 + - name: ktor-1.0 + srcPath: instrumentation/ktor/ktor-1.0 + target_versions: + library: + - io.ktor:ktor-server-core:1.0.0 +kubernetes: + instrumentations: + - name: kubernetes-client-7.0 + srcPath: instrumentation/kubernetes-client-7.0 + target_versions: + javaagent: + - io.kubernetes:client-java-api:[7.0.0,) +lettuce: + instrumentations: + - name: lettuce-5.1 + srcPath: instrumentation/lettuce/lettuce-5.1 + target_versions: + javaagent: + - io.lettuce:lettuce-core:[5.1.0.RELEASE,) + library: + - io.lettuce:lettuce-core:5.1.0.RELEASE + - name: lettuce-5.0 + srcPath: instrumentation/lettuce/lettuce-5.0 + target_versions: + javaagent: + - io.lettuce:lettuce-core:[5.0.0.RELEASE,5.1.0.RELEASE) + - name: lettuce-4.0 + srcPath: instrumentation/lettuce/lettuce-4.0 + target_versions: + javaagent: + - biz.paluch.redis:lettuce:[4.0.Final,) +liberty: + instrumentations: + - name: liberty-dispatcher-20.0 + srcPath: instrumentation/liberty/liberty-dispatcher-20.0 + target_versions: + javaagent: [] + - name: liberty-20.0 + srcPath: instrumentation/liberty/liberty-20.0 + target_versions: + javaagent: [] +log4j: + instrumentations: + - name: log4j-context-data-2.7 + srcPath: instrumentation/log4j/log4j-context-data/log4j-context-data-2.7 + target_versions: + javaagent: + - org.apache.logging.log4j:log4j-core:[2.7,2.17.0) + - name: log4j-appender-2.17 + srcPath: instrumentation/log4j/log4j-appender-2.17 + target_versions: + javaagent: + - org.apache.logging.log4j:log4j-core:[2.0,) + library: + - org.apache.logging.log4j:log4j-core:2.17.0 + - name: log4j-appender-1.2 + srcPath: instrumentation/log4j/log4j-appender-1.2 + target_versions: + javaagent: + - log4j:log4j:[1.2,) + - name: log4j-mdc-1.2 + srcPath: instrumentation/log4j/log4j-mdc-1.2 + target_versions: + javaagent: + - log4j:log4j:[1.2,) + - name: log4j-context-data-2.17 + srcPath: instrumentation/log4j/log4j-context-data/log4j-context-data-2.17 + target_versions: + javaagent: + - org.apache.logging.log4j:log4j-core:[2.17.0,) +logback: + instrumentations: + - name: logback-mdc-1.0 + srcPath: instrumentation/logback/logback-mdc-1.0 + target_versions: + javaagent: + - ch.qos.logback:logback-classic:[1.0.0,1.2.3] + library: + - ch.qos.logback:logback-classic:1.0.0 + - org.slf4j:slf4j-api:1.6.4 + - name: logback-appender-1.0 + srcPath: instrumentation/logback/logback-appender-1.0 + target_versions: + javaagent: + - ch.qos.logback:logback-classic:[0.9.16,) + library: + - net.logstash.logback:logstash-logback-encoder:3.0 + - org.slf4j:slf4j-api:2.0.0 + - ch.qos.logback:logback-classic:1.3.0 +methods: + instrumentations: + - name: methods + srcPath: instrumentation/methods + target_versions: + javaagent: [] +micrometer: + instrumentations: + - name: micrometer-1.5 + srcPath: instrumentation/micrometer/micrometer-1.5 + target_versions: + javaagent: + - io.micrometer:micrometer-core:[1.5.0,) + library: + - io.micrometer:micrometer-core:1.5.0 +mongo: + instrumentations: + - name: mongo-4.0 + srcPath: instrumentation/mongo/mongo-4.0 + target_versions: + javaagent: + - org.mongodb:mongodb-driver-core:[4.0,) + - name: mongo-3.1 + srcPath: instrumentation/mongo/mongo-3.1 + target_versions: + javaagent: + - org.mongodb:mongo-java-driver:[3.1,) + library: + - org.mongodb:mongo-java-driver:3.1.0 + - name: mongo-3.7 + srcPath: instrumentation/mongo/mongo-3.7 + target_versions: + javaagent: + - org.mongodb:mongodb-driver-core:[3.7, 4.0) + - org.mongodb:mongo-java-driver:[3.7, 4.0) + - name: mongo-async-3.3 + srcPath: instrumentation/mongo/mongo-async-3.3 + target_versions: + javaagent: + - org.mongodb:mongodb-driver-async:[3.3,) +mybatis: + instrumentations: + - name: mybatis-3.2 + srcPath: instrumentation/mybatis-3.2 + target_versions: + javaagent: + - org.mybatis:mybatis:[3.2.0,) +netty: + instrumentations: + - name: netty-3.8 + srcPath: instrumentation/netty/netty-3.8 + target_versions: + javaagent: + - io.netty:netty:[3.8.0.Final,4) + - name: netty-4.0 + srcPath: instrumentation/netty/netty-4.0 + target_versions: + javaagent: + - io.netty:netty-all:[4.0.0.Final,4.1.0.Final) + - io.netty:netty-codec-http:[4.0.0.Final,4.1.0.Final) + - name: netty-4.1 + srcPath: instrumentation/netty/netty-4.1 + target_versions: + javaagent: + - io.netty:netty-codec-http:[4.1.0.Final,5.0.0) + - io.netty:netty-all:[4.1.0.Final,5.0.0) + library: + - io.netty:netty-codec-http:4.1.0.Final +okhttp: + instrumentations: + - name: okhttp-3.0 + srcPath: instrumentation/okhttp/okhttp-3.0 + target_versions: + javaagent: + - com.squareup.okhttp3:okhttp:[3.0,) + library: + - com.squareup.okhttp3:okhttp:3.0.0 + - name: okhttp-2.2 + srcPath: instrumentation/okhttp/okhttp-2.2 + target_versions: + javaagent: + - com.squareup.okhttp:okhttp:[2.2,3) +opensearch: + instrumentations: + - name: opensearch-rest-1.0 + srcPath: instrumentation/opensearch/opensearch-rest-1.0 + target_versions: + javaagent: + - org.opensearch.client:opensearch-rest-client:[1.0,) + - name: opensearch-java-2.0 + srcPath: instrumentation/opensearch/opensearch-java-2.0 + target_versions: {} +opentelemetry: + instrumentations: + - name: opentelemetry-api-1.15 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.15 + target_versions: + javaagent: [] + - name: opentelemetry-api-1.10 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.10 + target_versions: + javaagent: [] + - name: opentelemetry-api-1.27 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.27 + target_versions: + javaagent: [] + - name: opentelemetry-extension-annotations-1.0 + srcPath: instrumentation/opentelemetry-extension-annotations-1.0 + target_versions: + javaagent: + - io.opentelemetry:opentelemetry-extension-annotations:[0.16.0,) + - name: opentelemetry-instrumentation-annotations-1.16 + srcPath: instrumentation/opentelemetry-instrumentation-annotations-1.16 + target_versions: + javaagent: + - io.opentelemetry:opentelemetry-instrumentation-annotations:(,) + - name: opentelemetry-instrumentation-api + srcPath: instrumentation/opentelemetry-instrumentation-api + target_versions: + javaagent: + - io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:[1.14.0-alpha,) + - name: opentelemetry-api-1.37 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.37 + target_versions: + javaagent: [] + - name: opentelemetry-api-1.38 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.38 + target_versions: + javaagent: [] + - name: opentelemetry-api-1.31 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.31 + target_versions: + javaagent: [] + - name: opentelemetry-api-1.32 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.32 + target_versions: + javaagent: [] + - name: opentelemetry-api-1.42 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.42 + target_versions: + javaagent: [] + - name: opentelemetry-api-1.40 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.40 + target_versions: + javaagent: [] + - name: opentelemetry-api-1.47 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.47 + target_versions: + javaagent: [] + - name: opentelemetry + srcPath: instrumentation/wicket-8.0/common-testing/src/main/java/io/opentelemetry + target_versions: {} + - name: opentelemetry-extension-kotlin-1.0 + srcPath: instrumentation/opentelemetry-extension-kotlin-1.0 + target_versions: + javaagent: + - io.opentelemetry:opentelemetry-extension-kotlin:[0.17.0,) + - name: opentelemetry-api-1.4 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.4 + target_versions: + javaagent: [] + - name: opentelemetry-api-1.0 + srcPath: instrumentation/opentelemetry-api/opentelemetry-api-1.0 + target_versions: + javaagent: + - io.opentelemetry:opentelemetry-api:[0.17.0,) +oracle: + instrumentations: + - name: oracle-ucp-11.2 + srcPath: instrumentation/oracle-ucp-11.2 + target_versions: + javaagent: + - com.oracle.database.jdbc:ucp:[,) + library: + - com.oracle.database.jdbc:ucp:11.2.0.4 + - com.oracle.database.jdbc:ojdbc8:12.2.0.1 +oshi: + instrumentations: + - name: oshi + srcPath: instrumentation/oshi + target_versions: + javaagent: + - com.github.oshi:oshi-core:[5.3.1,) + library: + - com.github.oshi:oshi-core:$oshiVersion +payara: + instrumentations: + - name: payara + srcPath: instrumentation/payara + target_versions: + javaagent: [] +pekko: + instrumentations: + - name: pekko-actor-1.0 + srcPath: instrumentation/pekko/pekko-actor-1.0 + target_versions: + javaagent: + - org.apache.pekko:pekko-actor_3:[1.0,) + - org.apache.pekko:pekko-actor_2.12:[1.0,) + - org.apache.pekko:pekko-actor_2.13:[1.0,) + - name: pekko-http-1.0 + srcPath: instrumentation/pekko/pekko-http-1.0 + target_versions: + javaagent: + - org.apache.pekko:pekko-http_2.12:[1.0,) + - org.apache.pekko:pekko-http_3:[1.0,) + - org.apache.pekko:pekko-http_2.13:[1.0,) +play: + instrumentations: + - name: play-ws-1.0 + srcPath: instrumentation/play/play-ws/play-ws-1.0 + target_versions: + javaagent: + - com.typesafe.play:play-ahc-ws-standalone_2.12:[1.0.0,2.0.0) + - com.typesafe.play:play-ahc-ws-standalone_2.11:[1.0.0,2.0.0) + - name: play-mvc-2.6 + srcPath: instrumentation/play/play-mvc/play-mvc-2.6 + target_versions: + javaagent: + - com.typesafe.play:play_$scalaVersion:[2.6.0,) + - com.typesafe.play:play_2.12:[2.6.0,) + - com.typesafe.play:play_2.13:[2.6.0,) + - name: play-mvc-2.4 + srcPath: instrumentation/play/play-mvc/play-mvc-2.4 + target_versions: + javaagent: + - com.typesafe.play:play_2.11:[2.4.0,2.6) + - name: play-ws-2.0 + srcPath: instrumentation/play/play-ws/play-ws-2.0 + target_versions: + javaagent: + - com.typesafe.play:play-ahc-ws-standalone_2.12:[2.0.0,2.1.0) + - com.typesafe.play:play-ahc-ws-standalone_2.13:[2.0.6,2.1.0) + - com.typesafe.play:play-ahc-ws-standalone_2.11:[2.0.0,] + - name: play-ws-2.1 + srcPath: instrumentation/play/play-ws/play-ws-2.1 + target_versions: + javaagent: + - com.typesafe.play:play-ahc-ws-standalone_2.13:[2.1.0,] + - com.typesafe.play:play-ahc-ws-standalone_2.12:[2.1.0,] +powerjob: + instrumentations: + - name: powerjob-4.0 + srcPath: instrumentation/powerjob-4.0 + target_versions: + javaagent: + - tech.powerjob:powerjob-worker:[4.0.0,) +pulsar: + instrumentations: + - name: pulsar-2.8 + srcPath: instrumentation/pulsar/pulsar-2.8 + target_versions: + javaagent: + - org.apache.pulsar:pulsar-client:[2.8.0,) +quarkus: + instrumentations: + - name: quarkus-resteasy-reactive + srcPath: instrumentation/quarkus-resteasy-reactive + target_versions: + javaagent: + - io.quarkus:quarkus-resteasy-reactive:(,3.9.0) +quartz: + instrumentations: + - name: quartz-2.0 + srcPath: instrumentation/quartz-2.0 + target_versions: + javaagent: + - org.quartz-scheduler:quartz:[2.0.0,) + library: + - org.quartz-scheduler:quartz:2.0.0 +r2dbc: + instrumentations: + - name: r2dbc-1.0 + srcPath: instrumentation/r2dbc-1.0 + target_versions: + javaagent: + - io.r2dbc:r2dbc-spi:[1.0.0.RELEASE,) + library: + - io.r2dbc:r2dbc-spi:1.0.0.RELEASE +rabbitmq: + instrumentations: + - name: rabbitmq-2.7 + srcPath: instrumentation/rabbitmq-2.7 + target_versions: + javaagent: + - com.rabbitmq:amqp-client:[2.7.0,) +ratpack: + instrumentations: + - name: ratpack-1.4 + srcPath: instrumentation/ratpack/ratpack-1.4 + target_versions: + javaagent: + - io.ratpack:ratpack-core:[1.4.0,) + - name: ratpack-1.7 + srcPath: instrumentation/ratpack/ratpack-1.7 + target_versions: + javaagent: + - io.ratpack:ratpack-core:[1.7.0,) + library: + - io.ratpack:ratpack-core:1.7.0 +reactor: + instrumentations: + - name: reactor-kafka-1.0 + srcPath: instrumentation/reactor/reactor-kafka-1.0 + target_versions: + javaagent: + - io.projectreactor.kafka:reactor-kafka:[1.0.0,) + - name: reactor-3.1 + srcPath: instrumentation/reactor/reactor-3.1 + target_versions: + javaagent: + - io.projectreactor:reactor-core:[3.1.0.RELEASE,) + library: [] + - name: reactor-3.4 + srcPath: instrumentation/reactor/reactor-3.4 + target_versions: + javaagent: + - io.projectreactor:reactor-core:[3.4.0,) + - name: reactor-netty-0.9 + srcPath: instrumentation/reactor/reactor-netty/reactor-netty-0.9 + target_versions: + javaagent: + - io.projectreactor.netty:reactor-netty:[0.8.2.RELEASE,1.0.0) + - name: reactor-netty-1.0 + srcPath: instrumentation/reactor/reactor-netty/reactor-netty-1.0 + target_versions: + javaagent: + - io.projectreactor.netty:reactor-netty-http:[1.0.0,) + - io.projectreactor.netty:reactor-netty:[1.0.0,) +rediscala: + instrumentations: + - name: rediscala-1.8 + srcPath: instrumentation/rediscala-1.8 + target_versions: + javaagent: + - com.github.Ma27:rediscala_2.11:[1.8.1,) + - com.github.etaty:rediscala_2.11:[1.5.0,) + - com.github.etaty:rediscala_2.12:[1.8.0,) + - com.github.Ma27:rediscala_2.13:[1.9.0,) + - io.github.rediscala:rediscala_2.13:[1.10.0,) + - com.github.etaty:rediscala_2.13:[1.9.0,) + - com.github.Ma27:rediscala_2.12:[1.8.1,) +redisson: + instrumentations: + - name: redisson-3.17 + srcPath: instrumentation/redisson/redisson-3.17 + target_versions: + javaagent: + - org.redisson:redisson:[3.17.0,) + - name: redisson-3.0 + srcPath: instrumentation/redisson/redisson-3.0 + target_versions: + javaagent: + - org.redisson:redisson:[3.0.0,3.17.0) +resources: + instrumentations: + - name: resources + srcPath: instrumentation/resources + target_versions: + library: [] +restlet: + instrumentations: + - name: restlet-1.1 + srcPath: instrumentation/restlet/restlet-1.1 + target_versions: + javaagent: + - org.restlet:org.restlet:[1.1.0, 1.2-M1) + library: + - org.restlet:org.restlet:1.1.5 + - com.noelios.restlet:com.noelios.restlet:1.1.5 + - name: restlet-2.0 + srcPath: instrumentation/restlet/restlet-2.0 + target_versions: + javaagent: + - org.restlet.jse:org.restlet:[2.0.0,) + library: + - org.restlet.jse:org.restlet:2.0.2 +rmi: + instrumentations: + - name: rmi + srcPath: instrumentation/rmi + target_versions: + javaagent: [] +rocketmq: + instrumentations: + - name: rocketmq-client-5.0 + srcPath: instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0 + target_versions: + javaagent: + - org.apache.rocketmq:rocketmq-client-java:[5.0.0,) + - name: rocketmq-client-4.8 + srcPath: instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8 + target_versions: + javaagent: + - org.apache.rocketmq:rocketmq-client:[4.0.0,) + library: + - org.apache.rocketmq:rocketmq-client:4.8.0 +runtime: + instrumentations: + - name: runtime-telemetry-java17 + srcPath: instrumentation/runtime-telemetry/runtime-telemetry-java17 + target_versions: + javaagent: [] + library: [] + - name: runtime-telemetry-java8 + srcPath: instrumentation/runtime-telemetry/runtime-telemetry-java8 + target_versions: + javaagent: [] + library: [] +rxjava: + instrumentations: + - name: rxjava-1.0 + srcPath: instrumentation/rxjava/rxjava-1.0 + target_versions: + library: + - io.reactivex:rxjava:1.0.7 + - name: rxjava-3.1.1 + srcPath: instrumentation/rxjava/rxjava-3.1.1 + target_versions: + javaagent: + - io.reactivex.rxjava3:rxjava:[3.1.1,) + library: + - io.reactivex.rxjava3:rxjava:3.1.1 + - name: rxjava-2.0 + srcPath: instrumentation/rxjava/rxjava-2.0 + target_versions: + javaagent: + - io.reactivex.rxjava2:rxjava:[2.0.6,) + library: + - io.reactivex.rxjava2:rxjava:2.1.3 + - name: rxjava-3.0 + srcPath: instrumentation/rxjava/rxjava-3.0 + target_versions: + javaagent: + - io.reactivex.rxjava3:rxjava:[3.0.0,3.1.0] + library: + - io.reactivex.rxjava3:rxjava:3.0.12 +scala: + instrumentations: + - name: scala-fork-join-2.8 + srcPath: instrumentation/scala-fork-join-2.8 + target_versions: + javaagent: + - org.scala-lang:scala-library:[2.8.0,2.12.0) +servlet: + instrumentations: + - name: servlet-5.0 + srcPath: instrumentation/servlet/servlet-5.0 + target_versions: + javaagent: + - jakarta.servlet:jakarta.servlet-api:[5.0.0,) + - name: servlet-2.2 + srcPath: instrumentation/servlet/servlet-2.2 + target_versions: + javaagent: + - javax.servlet:servlet-api:[2.2, 3.0) + - name: servlet-3.0 + srcPath: instrumentation/servlet/servlet-3.0 + target_versions: + javaagent: + - javax.servlet:javax.servlet-api:[3.0,) +spark: + instrumentations: + - name: spark-2.3 + srcPath: instrumentation/spark-2.3 + target_versions: + javaagent: + - com.sparkjava:spark-core:[2.3,) +spring: + instrumentations: + - name: spring-rabbit-1.0 + srcPath: instrumentation/spring/spring-rabbit-1.0 + target_versions: + javaagent: + - org.springframework.amqp:spring-rabbit:(,) + - name: spring-scheduling-3.1 + srcPath: instrumentation/spring/spring-scheduling-3.1 + target_versions: + javaagent: + - org.springframework:spring-context:[3.1.0.RELEASE,] + - name: spring-boot-resources + srcPath: instrumentation/spring/spring-boot-resources + target_versions: + javaagent: [] + - name: spring-batch-3.0 + srcPath: instrumentation/spring/spring-batch-3.0 + target_versions: + javaagent: + - org.springframework.batch:spring-batch-core:[3.0.0.RELEASE,5) + - name: spring-cloud-aws-3.0 + srcPath: instrumentation/spring/spring-cloud-aws-3.0 + target_versions: + javaagent: + - io.awspring.cloud:spring-cloud-aws-sqs:[3.0.0,) + - name: spring-webflux-5.0 + srcPath: instrumentation/spring/spring-webflux/spring-webflux-5.0 + target_versions: + javaagent: + - io.projectreactor.ipc:reactor-netty:[0.7.0.RELEASE,) + - org.springframework:spring-webflux:[5.0.0.RELEASE,) + - io.projectreactor.netty:reactor-netty:[0.8.0.RELEASE,) + - name: spring-webflux-5.3 + srcPath: instrumentation/spring/spring-webflux/spring-webflux-5.3 + target_versions: + library: + - org.springframework:spring-webflux:5.3.0 + - name: spring-jms-6.0 + srcPath: instrumentation/spring/spring-jms/spring-jms-6.0 + target_versions: + javaagent: + - org.springframework:spring-jms:[6.0.0,) + - name: spring-boot-actuator-autoconfigure-2.0 + srcPath: instrumentation/spring/spring-boot-actuator-autoconfigure-2.0 + target_versions: + javaagent: + - org.springframework.boot:spring-boot-actuator-autoconfigure:[2.0.0.RELEASE,) + - name: spring-rmi-4.0 + srcPath: instrumentation/spring/spring-rmi-4.0 + target_versions: + javaagent: + - org.springframework:spring-context:[4.0.0.RELEASE,6) + - name: spring-webmvc-3.1 + srcPath: instrumentation/spring/spring-webmvc/spring-webmvc-3.1 + target_versions: + javaagent: + - org.springframework:spring-webmvc:[3.1.0.RELEASE,6) + - name: spring-webmvc-6.0 + srcPath: instrumentation/spring/spring-webmvc/spring-webmvc-6.0 + target_versions: + javaagent: + - org.springframework:spring-webmvc:[6.0.0,) + library: [] + - name: spring-data-1.8 + srcPath: instrumentation/spring/spring-data/spring-data-1.8 + target_versions: + javaagent: + - org.springframework:spring-aop:[1.2,] + - org.springframework.data:spring-data-commons:[1.8.0.RELEASE,] + - name: spring-web-3.1 + srcPath: instrumentation/spring/spring-web/spring-web-3.1 + target_versions: + javaagent: + - org.springframework:spring-web:[3.1.0.RELEASE,6) + library: [] + - name: spring-kafka-2.7 + srcPath: instrumentation/spring/spring-kafka-2.7 + target_versions: + javaagent: + - org.springframework.kafka:spring-kafka:[2.7.0,) + library: [] + - name: spring-webmvc-5.3 + srcPath: instrumentation/spring/spring-webmvc/spring-webmvc-5.3 + target_versions: + library: [] + - name: spring-core-2.0 + srcPath: instrumentation/spring/spring-core-2.0 + target_versions: + javaagent: + - org.springframework:spring-core:[2.0,] + - name: spring-cloud-gateway-2.0 + srcPath: instrumentation/spring/spring-cloud-gateway/spring-cloud-gateway-2.0 + target_versions: + javaagent: + - org.springframework.cloud:spring-cloud-starter-gateway:[2.0.0.RELEASE,] + - name: spring-security-config-6.0 + srcPath: instrumentation/spring/spring-security-config-6.0 + target_versions: + javaagent: + - org.springframework.security:spring-security-config:[6.0.0,] + library: + - io.projectreactor:reactor-core:3.5.0 + - org.springframework.security:spring-security-config:6.0.0 + - org.springframework:spring-web:6.0.0 + - jakarta.servlet:jakarta.servlet-api:6.0.0 + - org.springframework.security:spring-security-web:6.0.0 + - name: spring-integration-4.1 + srcPath: instrumentation/spring/spring-integration-4.1 + target_versions: + javaagent: + - org.springframework.integration:spring-integration-core:[4.1.0.RELEASE,) + library: + - org.springframework.integration:spring-integration-core:4.1.0.RELEASE + - name: spring-jms-2.0 + srcPath: instrumentation/spring/spring-jms/spring-jms-2.0 + target_versions: + javaagent: + - org.springframework:spring-jms:[2.0,6) + - name: spring-ws-2.0 + srcPath: instrumentation/spring/spring-ws-2.0 + target_versions: + javaagent: + - org.springframework.ws:spring-ws-core:[2.0.0.RELEASE,] + - name: spring-web-6.0 + srcPath: instrumentation/spring/spring-web/spring-web-6.0 + target_versions: + javaagent: + - org.springframework:spring-web:[6.0.0,) +spymemcached: + instrumentations: + - name: spymemcached-2.12 + srcPath: instrumentation/spymemcached-2.12 + target_versions: + javaagent: + - net.spy:spymemcached:[2.12.0,) +struts: + instrumentations: + - name: struts-2.3 + srcPath: instrumentation/struts/struts-2.3 + target_versions: + javaagent: + - org.apache.struts:struts2-core:[2.1.0,7) + - name: struts-7.0 + srcPath: instrumentation/struts/struts-7.0 + target_versions: + javaagent: + - org.apache.struts:struts2-core:[7.0.0,) +tapestry: + instrumentations: + - name: tapestry-5.4 + srcPath: instrumentation/tapestry-5.4 + target_versions: + javaagent: + - org.apache.tapestry:tapestry-core:[5.4.0,) +tomcat: + instrumentations: + - name: tomcat-10.0 + srcPath: instrumentation/tomcat/tomcat-10.0 + target_versions: + javaagent: + - org.apache.tomcat.embed:tomcat-embed-core:[10,) + - name: tomcat-7.0 + srcPath: instrumentation/tomcat/tomcat-7.0 + target_versions: + javaagent: + - org.apache.tomcat.embed:tomcat-embed-core:[7.0.4, 10) +twilio: + instrumentations: + - name: twilio-6.6 + srcPath: instrumentation/twilio-6.6 + target_versions: + javaagent: + - com.twilio.sdk:twilio:(,8.0.0) +undertow: + instrumentations: + - name: undertow-1.4 + srcPath: instrumentation/undertow-1.4 + target_versions: + javaagent: + - io.undertow:undertow-core:[1.4.0.Final,) +vaadin: + instrumentations: + - name: vaadin-14.2 + srcPath: instrumentation/vaadin-14.2 + target_versions: + javaagent: + - com.vaadin:flow-server:[2.2.0,3) + - com.vaadin:flow-server:[3.1.0,) +vertx: + instrumentations: + - name: vertx-kafka-client-3.6 + srcPath: instrumentation/vertx/vertx-kafka-client-3.6 + target_versions: + javaagent: + - io.vertx:vertx-kafka-client:[3.5.1,) + - name: vertx-redis-client-4.0 + srcPath: instrumentation/vertx/vertx-redis-client-4.0 + target_versions: + javaagent: + - io.vertx:vertx-redis-client:[4.0.0,) + - name: vertx-web-3.0 + srcPath: instrumentation/vertx/vertx-web-3.0 + target_versions: + javaagent: + - io.vertx:vertx-web:[3.0.0,) + - name: vertx-sql-client-4.0 + srcPath: instrumentation/vertx/vertx-sql-client-4.0 + target_versions: + javaagent: + - io.vertx:vertx-sql-client:[4.0.0,) + - name: vertx-http-client-4.0 + srcPath: instrumentation/vertx/vertx-http-client/vertx-http-client-4.0 + target_versions: + javaagent: + - io.vertx:vertx-core:[4.0.0,) + - name: vertx-rx-java-3.5 + srcPath: instrumentation/vertx/vertx-rx-java-3.5 + target_versions: + javaagent: + - io.vertx:vertx-rx-java2:[3.5.0,) + - name: vertx-http-client-3.0 + srcPath: instrumentation/vertx/vertx-http-client/vertx-http-client-3.0 + target_versions: + javaagent: + - io.vertx:vertx-core:[3.0.0,4.0.0) +vibur: + instrumentations: + - name: vibur-dbcp-11.0 + srcPath: instrumentation/vibur-dbcp-11.0 + target_versions: + javaagent: + - org.vibur:vibur-dbcp:[11.0,) + library: + - org.vibur:vibur-dbcp:11.0 +wicket: + instrumentations: + - name: wicket-8.0 + srcPath: instrumentation/wicket-8.0 + target_versions: + javaagent: + - org.apache.wicket:wicket:[8.0.0,] +xxl: + instrumentations: + - name: xxl-job-2.3.0 + srcPath: instrumentation/xxl-job/xxl-job-2.3.0 + target_versions: + javaagent: + - com.xuxueli:xxl-job-core:[2.3.0,) + - name: xxl-job-2.1.2 + srcPath: instrumentation/xxl-job/xxl-job-2.1.2 + target_versions: + javaagent: + - com.xuxueli:xxl-job-core:[2.1.2,2.3.0) + - name: xxl-job-1.9.2 + srcPath: instrumentation/xxl-job/xxl-job-1.9.2 + target_versions: + javaagent: + - com.xuxueli:xxl-job-core:[1.9.2, 2.1.2) +zio: + instrumentations: + - name: zio-2.0 + srcPath: instrumentation/zio/zio-2.0 + target_versions: + javaagent: + - dev.zio:zio_2.13:[2.0.0,) + - dev.zio:zio_3:[2.0.0,) + - dev.zio:zio_2.12:[2.0.0,) diff --git a/instrumentation-docs/build.gradle.kts b/instrumentation-docs/build.gradle.kts new file mode 100644 index 000000000000..c60cb96af145 --- /dev/null +++ b/instrumentation-docs/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("otel.java-conventions") +} + +otelJava { + minJavaVersionSupported.set(JavaVersion.VERSION_17) +} + +dependencies { + implementation("org.yaml:snakeyaml:2.0") + + testImplementation(enforcedPlatform("org.junit:junit-bom:5.12.0")) + testImplementation("org.assertj:assertj-core:3.27.3") + testImplementation("org.junit.jupiter:junit-jupiter-api") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") +} + +tasks { + val generateDocs by registering(JavaExec::class) { + dependsOn(classes) + + mainClass.set("io.opentelemetry.instrumentation.docs.DocGeneratorApplication") + classpath(sourceSets["main"].runtimeClasspath) + } +} diff --git a/instrumentation-docs/readme.md b/instrumentation-docs/readme.md new file mode 100644 index 000000000000..a25caf1908eb --- /dev/null +++ b/instrumentation-docs/readme.md @@ -0,0 +1,63 @@ +# Doc Generator + +Runs analysis on instrumentation modules in order to generate documentation. + +## Instrumentation Hierarchy + +An "InstrumentationEntity" represents a module that that targets specific code in a framework/library/technology. +Each instrumentation uses muzzle to determine which versions of the target code it supports. + +Using these structures as examples: + +``` +├── instrumentation +│ ├── clickhouse-client-05 +│ ├── jaxrs +│ │ ├── jaxrs-1.0 +│ │ ├── jaxrs-2.0 +│ ├── spring +│ │ ├── spring-cloud-gateway +│ │ │ ├── spring-cloud-gateway-2.0 +│ │ │ ├── spring-cloud-gateway-2.2 +│ │ │ └── spring-cloud-gateway-common +``` + +* Name + * Ex: `clickhouse-client-05`, `jaxrs-1.0`, `spring-cloud-gateway-2.0` +* Namespace - direct parent. if none, use name and strip version + * `clickhouse-client`, `jaxrs`, `spring-cloud-gateway` +* Group - top most parent + * `clickhouse-client`, `jaxrs`, `spring` + +This information is also referenced in `InstrumentationModule` code for each module: + +```java +public class SpringWebInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { + public SpringWebInstrumentationModule() { + super("spring-web", "spring-web-3.1"); + } +``` + +## Instrumentation meta-data + +* name + * Identifier for instrumentation module, used to enable/disable + * Configured in `InstrumentationModule` code for each module +* versions + * List of supported versions by the module +* type + * List of instrumentation types, options of either `library` or `javaagent` + +## Methodology + +### Versions targeted + +Javaagent versions are determined by the `muzzle` plugin, so we can attempt to parse the gradle files + +Library versions are determined by the library versions used in the gradle files. + +### TODO / Notes + +- Is the `library` dependency actually the target version? Is there a better way to present the information? +- How to handle oshi target version with a conditional? diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/DocGeneratorApplication.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/DocGeneratorApplication.java new file mode 100644 index 000000000000..5cec7ac4ab9b --- /dev/null +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/DocGeneratorApplication.java @@ -0,0 +1,36 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs; + +import io.opentelemetry.instrumentation.docs.utils.FileManager; +import io.opentelemetry.instrumentation.docs.utils.YamlHelper; +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.logging.Logger; + +public class DocGeneratorApplication { + + private static final Logger logger = Logger.getLogger(DocGeneratorApplication.class.getName()); + + public static void main(String[] args) { + FileManager fileManager = new FileManager("instrumentation/"); + List entities = new InstrumentationAnalyzer(fileManager).analyze(); + + try (BufferedWriter writer = + Files.newBufferedWriter( + Paths.get("docs/instrumentation-list.yaml"), Charset.defaultCharset())) { + YamlHelper.printInstrumentationList(entities, writer); + } catch (IOException e) { + logger.severe("Error writing instrumentation list: " + e.getMessage()); + } + } + + private DocGeneratorApplication() {} +} diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/GradleParser.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/GradleParser.java new file mode 100644 index 000000000000..eaaebebff65c --- /dev/null +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/GradleParser.java @@ -0,0 +1,148 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +class GradleParser { + private static final Pattern passBlockPattern = + Pattern.compile("pass\\s*\\{(.*?)}", Pattern.DOTALL); + + private static final Pattern libraryPattern = + Pattern.compile("library\\(\"([^\"]+:[^\"]+:[^\"]+)\"\\)"); + + private static final Pattern variablePattern = + Pattern.compile("val\\s+(\\w+)\\s*=\\s*\"([^\"]+)\""); + + private static final Pattern compileOnlyPattern = + Pattern.compile( + "compileOnly\\(\"([^\"]+)\"\\)\\s*\\{\\s*version\\s*\\{(?:\\s*//.*\\n)*\\s*strictly\\(\"([^\"]+)\"\\)\\s*}\\s*}"); + + /** + * Parses gradle files for muzzle and dependency information + * + * @param gradleFileContents Contents of a Gradle build file as a String + * @return A set of strings summarizing the group, module, and version ranges + */ + public static Set parseGradleFile(String gradleFileContents, InstrumentationType type) { + Set results = new HashSet<>(); + Map variables = extractVariables(gradleFileContents); + + if (type.equals(InstrumentationType.JAVAAGENT)) { + results.addAll(parseMuzzle(gradleFileContents, variables)); + } else { + results.addAll(parseLibraryDependencies(gradleFileContents, variables)); + } + + return results; + } + + /** + * Parses the "muzzle" block from the given Gradle file content and extracts information about + * each "pass { ... }" entry, returning a set of version summary strings. + * + * @param gradleFileContents Contents of a Gradle build file as a String + * @param variables Map of variable names to their values + * @return A set of strings summarizing the group, module, and version ranges + */ + private static Set parseMuzzle(String gradleFileContents, Map variables) { + Set results = new HashSet<>(); + Matcher passBlockMatcher = passBlockPattern.matcher(gradleFileContents); + + while (passBlockMatcher.find()) { + String passBlock = passBlockMatcher.group(1); + + String group = extractValue(passBlock, "group\\.set\\(\"([^\"]+)\"\\)"); + String module = extractValue(passBlock, "module\\.set\\(\"([^\"]+)\"\\)"); + String versionRange = extractValue(passBlock, "versions\\.set\\(\"([^\"]+)\"\\)"); + + if (group != null && module != null && versionRange != null) { + String summary = group + ":" + module + ":" + interpolate(versionRange, variables); + results.add(summary); + } + } + return results; + } + + /** + * Parses the "dependencies" block from the given Gradle file content and extracts information + * about what library versions are supported. + * + * @param gradleFileContents Contents of a Gradle build file as a String + * @param variables Map of variable names to their values + * @return A set of strings summarizing the group, module, and versions + */ + private static Set parseLibraryDependencies( + String gradleFileContents, Map variables) { + Set results = new HashSet<>(); + Matcher libraryMatcher = libraryPattern.matcher(gradleFileContents); + while (libraryMatcher.find()) { + String dependency = libraryMatcher.group(1); + results.add(interpolate(dependency, variables)); + } + + Matcher compileOnlyMatcher = compileOnlyPattern.matcher(gradleFileContents); + while (compileOnlyMatcher.find()) { + String dependency = compileOnlyMatcher.group(1) + ":" + compileOnlyMatcher.group(2); + results.add(interpolate(dependency, variables)); + } + return results; + } + + /** + * Extracts variables from the given Gradle file content. + * + * @param gradleFileContents Contents of a Gradle build file as a String + * @return A map of variable names to their values + */ + private static Map extractVariables(String gradleFileContents) { + Map variables = new HashMap<>(); + Matcher variableMatcher = variablePattern.matcher(gradleFileContents); + + while (variableMatcher.find()) { + variables.put(variableMatcher.group(1), variableMatcher.group(2)); + } + + return variables; + } + + /** + * Interpolates variables in the given text using the provided variable map. + * + * @param text Text to interpolate + * @param variables Map of variable names to their values + * @return Interpolated text + */ + private static String interpolate(String text, Map variables) { + for (Map.Entry entry : variables.entrySet()) { + text = text.replace("$" + entry.getKey(), entry.getValue()); + } + return text; + } + + /** + * Utility method to extract the first captured group from matching the given regex. + * + * @param text Text to search + * @param regex Regex with a capturing group + * @return The first captured group, or null if not found + */ + private static String extractValue(String text, String regex) { + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(text); + if (matcher.find()) { + return matcher.group(1); + } + return null; + } + + private GradleParser() {} +} diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationAnalyzer.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationAnalyzer.java new file mode 100644 index 000000000000..25c45546f2e4 --- /dev/null +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationAnalyzer.java @@ -0,0 +1,89 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs; + +import static io.opentelemetry.instrumentation.docs.GradleParser.parseGradleFile; + +import io.opentelemetry.instrumentation.docs.utils.FileManager; +import io.opentelemetry.instrumentation.docs.utils.InstrumentationPath; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +class InstrumentationAnalyzer { + + private final FileManager fileSearch; + + InstrumentationAnalyzer(FileManager fileSearch) { + this.fileSearch = fileSearch; + } + + /** + * Converts a list of InstrumentationPath objects into a list of InstrumentationEntity objects. + * Each InstrumentationEntity represents a unique combination of group, namespace, and + * instrumentation name. The types of instrumentation (e.g., library, javaagent) are aggregated + * into a list within each entity. + * + * @param paths the list of InstrumentationPath objects to be converted + * @return a list of InstrumentationEntity objects with aggregated types + */ + public static List convertToEntities(List paths) { + Map entityMap = new HashMap<>(); + + for (InstrumentationPath path : paths) { + String key = path.group() + ":" + path.namespace() + ":" + path.instrumentationName(); + if (!entityMap.containsKey(key)) { + entityMap.put( + key, + new InstrumentationEntity( + path.srcPath().replace("/javaagent", "").replace("/library", ""), + path.instrumentationName(), + path.namespace(), + path.group())); + } + } + + return new ArrayList<>(entityMap.values()); + } + + /** + * Analyzes the given root directory to find all instrumentation paths and then analyze them. - + * Extracts version information from each instrumentation's build.gradle file. + * + * @return a list of InstrumentationEntity objects with target versions + */ + List analyze() { + List paths = fileSearch.getInstrumentationPaths(); + List entities = convertToEntities(paths); + + for (InstrumentationEntity entity : entities) { + List gradleFiles = fileSearch.findBuildGradleFiles(entity.getSrcPath()); + analyzeVersions(gradleFiles, entity); + } + return entities; + } + + void analyzeVersions(List files, InstrumentationEntity entity) { + Map> versions = new HashMap<>(); + for (String file : files) { + String fileContents = fileSearch.readFileToString(file); + + if (file.contains("/javaagent/")) { + Set results = parseGradleFile(fileContents, InstrumentationType.JAVAAGENT); + versions + .computeIfAbsent(InstrumentationType.JAVAAGENT, k -> new HashSet<>()) + .addAll(results); + } else if (file.contains("/library/")) { + Set results = parseGradleFile(fileContents, InstrumentationType.LIBRARY); + versions.computeIfAbsent(InstrumentationType.LIBRARY, k -> new HashSet<>()).addAll(results); + } + } + entity.setTargetVersions(versions); + } +} diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationEntity.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationEntity.java new file mode 100644 index 000000000000..f03e9dc22446 --- /dev/null +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationEntity.java @@ -0,0 +1,62 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs; + +import java.util.Map; +import java.util.Set; + +public class InstrumentationEntity { + private final String srcPath; + private final String instrumentationName; + private final String namespace; + private final String group; + private Map> targetVersions; + + public InstrumentationEntity( + String srcPath, String instrumentationName, String namespace, String group) { + this.srcPath = srcPath; + this.instrumentationName = instrumentationName; + this.namespace = namespace; + this.group = group; + } + + public InstrumentationEntity( + String srcPath, + String instrumentationName, + String namespace, + String group, + Map> targetVersions) { + this.srcPath = srcPath; + this.instrumentationName = instrumentationName; + this.namespace = namespace; + this.group = group; + this.targetVersions = targetVersions; + } + + public String getSrcPath() { + return srcPath; + } + + public String getInstrumentationName() { + return instrumentationName; + } + + public String getNamespace() { + return namespace; + } + + public String getGroup() { + return group; + } + + public Map> getTargetVersions() { + return targetVersions; + } + + public void setTargetVersions(Map> targetVersions) { + this.targetVersions = targetVersions; + } +} diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationType.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationType.java new file mode 100644 index 000000000000..42840e33ceba --- /dev/null +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationType.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs; + +import java.util.Locale; + +public enum InstrumentationType { + JAVAAGENT, + LIBRARY; + + public static InstrumentationType fromString(String type) { + return switch (type.toLowerCase(Locale.getDefault())) { + case "javaagent" -> JAVAAGENT; + case "library" -> LIBRARY; + default -> throw new IllegalArgumentException("Unknown instrumentation type: " + type); + }; + } + + @Override + public String toString() { + return name().toLowerCase(Locale.getDefault()); + } +} diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/FileManager.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/FileManager.java new file mode 100644 index 000000000000..dbd1dd20580f --- /dev/null +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/FileManager.java @@ -0,0 +1,113 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs.utils; + +import io.opentelemetry.instrumentation.docs.InstrumentationType; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class FileManager { + private static final Logger logger = Logger.getLogger(FileManager.class.getName()); + private final String rootDir; + + public FileManager(String rootDir) { + this.rootDir = rootDir; + } + + public List getInstrumentationPaths() { + Path rootPath = Paths.get(rootDir); + + try (Stream walk = Files.walk(rootPath)) { + return walk.filter(Files::isDirectory) + .filter(dir -> !dir.toString().contains("/build")) + .filter(dir -> isValidInstrumentationPath(dir.toString())) + .map(dir -> parseInstrumentationPath(dir.toString())) + .collect(Collectors.toList()); + } catch (IOException e) { + logger.severe("Error traversing directory: " + e.getMessage()); + return new ArrayList<>(); + } + } + + private static InstrumentationPath parseInstrumentationPath(String filePath) { + if (filePath == null || filePath.isEmpty()) { + return null; + } + + String instrumentationSegment = "/instrumentation/"; + int startIndex = filePath.indexOf(instrumentationSegment) + instrumentationSegment.length(); + String[] parts = filePath.substring(startIndex).split("/"); + + if (parts.length < 2) { + return null; + } + + InstrumentationType instrumentationType = + InstrumentationType.fromString(parts[parts.length - 1]); + String name = parts[parts.length - 2]; + String namespace = name.contains("-") ? name.split("-")[0] : name; + + return new InstrumentationPath(name, filePath, namespace, namespace, instrumentationType); + } + + public static boolean isValidInstrumentationPath(String filePath) { + if (filePath == null || filePath.isEmpty()) { + return false; + } + String instrumentationSegment = "instrumentation/"; + + if (!filePath.contains(instrumentationSegment)) { + return false; + } + + int javaagentCount = filePath.split("/javaagent", -1).length - 1; + if (javaagentCount > 1) { + return false; + } + + if (filePath.contains("/test/") + || filePath.contains("/testing") + || filePath.contains("-common/") + || filePath.contains("bootstrap/src")) { + return false; + } + + return filePath.endsWith("javaagent") || filePath.endsWith("library"); + } + + public List findBuildGradleFiles(String instrumentationDirectory) { + Path rootPath = Paths.get(instrumentationDirectory); + + try (Stream walk = Files.walk(rootPath)) { + return walk.filter(Files::isRegularFile) + .filter( + path -> + path.getFileName().toString().equals("build.gradle.kts") + && !path.toString().contains("/testing/")) + .map(Path::toString) + .collect(Collectors.toList()); + } catch (IOException e) { + logger.severe("Error traversing directory: " + e.getMessage()); + return new ArrayList<>(); + } + } + + public String readFileToString(String filePath) { + try { + return Files.readString(Paths.get(filePath)); + } catch (IOException e) { + logger.severe("Error reading file: " + e.getMessage()); + return null; + } + } +} diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/InstrumentationPath.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/InstrumentationPath.java new file mode 100644 index 000000000000..b491111088a5 --- /dev/null +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/InstrumentationPath.java @@ -0,0 +1,15 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs.utils; + +import io.opentelemetry.instrumentation.docs.InstrumentationType; + +public record InstrumentationPath( + String instrumentationName, + String srcPath, + String namespace, + String group, + InstrumentationType type) {} diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/YamlHelper.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/YamlHelper.java new file mode 100644 index 000000000000..f24f6d3f7c84 --- /dev/null +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/YamlHelper.java @@ -0,0 +1,64 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs.utils; + +import io.opentelemetry.instrumentation.docs.InstrumentationEntity; +import java.io.BufferedWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.stream.Collectors; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.representer.Representer; + +public class YamlHelper { + + public static void printInstrumentationList( + List list, BufferedWriter writer) { + Map> groupedByGroup = + list.stream() + .collect( + Collectors.groupingBy( + InstrumentationEntity::getGroup, TreeMap::new, Collectors.toList())); + + Map output = new TreeMap<>(); + groupedByGroup.forEach( + (group, entities) -> { + Map groupMap = new TreeMap<>(); + List> instrumentations = new ArrayList<>(); + for (InstrumentationEntity entity : entities) { + Map entityMap = new TreeMap<>(); + entityMap.put("name", entity.getInstrumentationName()); + entityMap.put("srcPath", entity.getSrcPath()); + + Map targetVersions = new TreeMap<>(); + if (entity.getTargetVersions() != null && !entity.getTargetVersions().isEmpty()) { + entity + .getTargetVersions() + .forEach( + (type, versions) -> { + targetVersions.put(type.toString(), new ArrayList<>(versions)); + }); + } + entityMap.put("target_versions", targetVersions); + instrumentations.add(entityMap); + } + groupMap.put("instrumentations", instrumentations); + output.put(group, groupMap); + }); + + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + Representer representer = new Representer(options); + representer.getPropertyUtils().setSkipMissingProperties(true); + Yaml yaml = new Yaml(representer, options); + yaml.dump(output, writer); + } + + private YamlHelper() {} +} diff --git a/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/GradleParserTest.java b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/GradleParserTest.java new file mode 100644 index 000000000000..d2543e410e58 --- /dev/null +++ b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/GradleParserTest.java @@ -0,0 +1,116 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Set; +import org.junit.jupiter.api.Test; + +class GradleParserTest { + + @Test + void testExtractMuzzleVersions_SinglePassBlock() { + String gradleBuildFileContent = + "muzzle {\n" + + " pass {\n" + + " group.set(\"org.elasticsearch.client\")\n" + + " module.set(\"rest\")\n" + + " versions.set(\"[5.0,6.4)\")\n" + + " }\n" + + "}"; + Set versions = + GradleParser.parseGradleFile(gradleBuildFileContent, InstrumentationType.JAVAAGENT); + assertThat(versions.size()).isEqualTo(1); + assertThat(versions.stream().findFirst().get()) + .isEqualTo("org.elasticsearch.client:rest:[5.0,6.4)"); + } + + @Test + void testExtractLibraryVersion() { + String gradleBuildFileContent = + "dependencies {\n" + + " library(\"org.apache.httpcomponents:httpclient:4.3\")\n" + + " testImplementation(project(\":instrumentation:apache-httpclient:apache-httpclient-4.3:testing\"))\n" + + " latestDepTestLibrary(\"org.apache.httpcomponents:httpclient:4.+\") // see apache-httpclient-5.0 module\n" + + "}"; + Set versions = + GradleParser.parseGradleFile(gradleBuildFileContent, InstrumentationType.LIBRARY); + assertThat(versions.size()).isEqualTo(1); + assertThat(versions.stream().findFirst().get()) + .isEqualTo("org.apache.httpcomponents:httpclient:4.3"); + } + + @Test + void testExtractMuzzleVersions_MultiplePassBlocks() { + String gradleBuildFileContent = + "plugins {\n" + + " id(\"otel.javaagent-instrumentation\")\n" + + " id(\"otel.nullaway-conventions\")\n" + + " id(\"otel.scala-conventions\")\n" + + "}\n" + + "\n" + + "val zioVersion = \"2.0.0\"\n" + + "val scalaVersion = \"2.12\"\n" + + "\n" + + "muzzle {\n" + + " pass {\n" + + " group.set(\"dev.zio\")\n" + + " module.set(\"zio_2.12\")\n" + + " versions.set(\"[$zioVersion,)\")\n" + + " assertInverse.set(true)\n" + + " }\n" + + " pass {\n" + + " group.set(\"dev.zio\")\n" + + " module.set(\"zio_2.13\")\n" + + " versions.set(\"[$zioVersion,)\")\n" + + " assertInverse.set(true)\n" + + " }\n" + + " pass {\n" + + " group.set(\"dev.zio\")\n" + + " module.set(\"zio_3\")\n" + + " versions.set(\"[$zioVersion,)\")\n" + + " assertInverse.set(true)\n" + + " }\n" + + "}\n"; + + Set versions = + GradleParser.parseGradleFile(gradleBuildFileContent, InstrumentationType.JAVAAGENT); + assertThat(versions) + .containsExactlyInAnyOrder( + "dev.zio:zio_2.12:[2.0.0,)", "dev.zio:zio_2.13:[2.0.0,)", "dev.zio:zio_3:[2.0.0,)"); + } + + @Test + void testExtractLogbackLibrary() { + String gradleBuildFileContent = + "compileOnly(\"ch.qos.logback:logback-classic\") {\n" + + " version {\n" + + " // compiling against newer version than the earliest supported version (1.0.0) to support\n" + + " // features added in 1.3.0\n" + + " strictly(\"1.3.0\")\n" + + " }\n" + + "}\n" + + "compileOnly(\"org.slf4j:slf4j-api\") {\n" + + " version {\n" + + " strictly(\"2.0.0\")\n" + + " }\n" + + "}\n" + + "compileOnly(\"net.logstash.logback:logstash-logback-encoder\") {\n" + + " version {\n" + + " strictly(\"3.0\")\n" + + " }\n" + + "}\n"; + + Set versions = + GradleParser.parseGradleFile(gradleBuildFileContent, InstrumentationType.LIBRARY); + assertThat(versions) + .containsExactlyInAnyOrder( + "ch.qos.logback:logback-classic:1.3.0", + "org.slf4j:slf4j-api:2.0.0", + "net.logstash.logback:logstash-logback-encoder:3.0"); + } +} diff --git a/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/InstrumentationAnalyzerTest.java b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/InstrumentationAnalyzerTest.java new file mode 100644 index 000000000000..d87901be6ffd --- /dev/null +++ b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/InstrumentationAnalyzerTest.java @@ -0,0 +1,65 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.instrumentation.docs.utils.InstrumentationPath; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Test; + +class InstrumentationAnalyzerTest { + + @Test + void testConvertToEntities() { + List paths = + Arrays.asList( + new InstrumentationPath( + "log4j-appender-2.17", + "instrumentation/log4j/log4j-appender-2.17/library", + "log4j", + "log4j", + InstrumentationType.LIBRARY), + new InstrumentationPath( + "log4j-appender-2.17", + "instrumentation/log4j/log4j-appender-2.17/javaagent", + "log4j", + "log4j", + InstrumentationType.JAVAAGENT), + new InstrumentationPath( + "spring-web", + "instrumentation/spring/spring-web/library", + "spring", + "spring", + InstrumentationType.LIBRARY)); + + List entities = InstrumentationAnalyzer.convertToEntities(paths); + + assertThat(entities.size()).isEqualTo(2); + + InstrumentationEntity log4jEntity = + entities.stream() + .filter(e -> e.getInstrumentationName().equals("log4j-appender-2.17")) + .findFirst() + .orElse(null); + + assertThat(log4jEntity.getNamespace()).isEqualTo("log4j"); + assertThat(log4jEntity.getGroup()).isEqualTo("log4j"); + assertThat(log4jEntity.getSrcPath()).isEqualTo("instrumentation/log4j/log4j-appender-2.17"); + + InstrumentationEntity springEntity = + entities.stream() + .filter(e -> e.getInstrumentationName().equals("spring-web")) + .findFirst() + .orElse(null); + + assertThat(springEntity).isNotNull(); + assertThat(springEntity.getNamespace()).isEqualTo("spring"); + assertThat(springEntity.getGroup()).isEqualTo("spring"); + assertThat(springEntity.getSrcPath()).isEqualTo("instrumentation/spring/spring-web"); + } +} diff --git a/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/utils/FileManagerTest.java b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/utils/FileManagerTest.java new file mode 100644 index 000000000000..f8eb745a9a62 --- /dev/null +++ b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/utils/FileManagerTest.java @@ -0,0 +1,55 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs.utils; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +class FileManagerTest { + + @TempDir Path tempDir; + + private FileManager fileManager; + + @BeforeEach + void setUp() { + fileManager = new FileManager(tempDir.toString()); + } + + @Test + void testGetInstrumentationPaths() throws IOException { + Path validDir = + Files.createDirectories(tempDir.resolve("instrumentation/my-instrumentation/javaagent")); + List paths = fileManager.getInstrumentationPaths(); + assertThat(paths).hasSize(1); + assertThat(paths.get(0).srcPath()).isEqualTo(validDir.toString()); + } + + @Test + void testIsValidInstrumentationPath() { + assertThat( + FileManager.isValidInstrumentationPath("/instrumentation/my-instrumentation/javaagent")) + .isTrue(); + assertThat(FileManager.isValidInstrumentationPath("invalid/test/javaagent")).isFalse(); + assertThat(FileManager.isValidInstrumentationPath("/instrumentation/test/javaagent")).isFalse(); + } + + @Test + void testFindBuildGradleFiles() throws IOException { + Path gradleFile = Files.createFile(tempDir.resolve("build.gradle.kts")); + Path nonGradleFile = Files.createFile(tempDir.resolve("gradle.properties")); + List gradleFiles = fileManager.findBuildGradleFiles(tempDir.toString()); + assertThat(gradleFiles).contains(gradleFile.toString()); + assertThat(gradleFiles).doesNotContain(nonGradleFile.toString()); + } +} diff --git a/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/utils/YamlHelperTest.java b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/utils/YamlHelperTest.java new file mode 100644 index 000000000000..c73077c6239d --- /dev/null +++ b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/utils/YamlHelperTest.java @@ -0,0 +1,75 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.docs.utils; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.instrumentation.docs.InstrumentationEntity; +import io.opentelemetry.instrumentation.docs.InstrumentationType; +import java.io.BufferedWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.junit.jupiter.api.Test; + +class YamlHelperTest { + @Test + public void testPrintInstrumentationList() throws Exception { + List entities = new ArrayList<>(); + Map> targetVersions1 = new HashMap<>(); + targetVersions1.put( + InstrumentationType.JAVAAGENT, + new HashSet<>(List.of("org.springframework:spring-web:[6.0.0,)"))); + + entities.add( + new InstrumentationEntity( + "instrumentation/spring/spring-web/spring-web-6.0", + "spring-web-6.0", + "spring", + "spring", + targetVersions1)); + + Map> targetVersions2 = new HashMap<>(); + targetVersions2.put( + InstrumentationType.LIBRARY, + new HashSet<>(List.of("org.apache.struts:struts2-core:2.1.0"))); + entities.add( + new InstrumentationEntity( + "instrumentation/struts/struts-2.3", + "struts-2.3", + "struts", + "struts", + targetVersions2)); + + StringWriter stringWriter = new StringWriter(); + BufferedWriter writer = new BufferedWriter(stringWriter); + + YamlHelper.printInstrumentationList(entities, writer); + writer.flush(); + + String expectedYaml = + "spring:\n" + + " instrumentations:\n" + + " - name: spring-web-6.0\n" + + " srcPath: instrumentation/spring/spring-web/spring-web-6.0\n" + + " target_versions:\n" + + " javaagent:\n" + + " - org.springframework:spring-web:[6.0.0,)\n" + + "struts:\n" + + " instrumentations:\n" + + " - name: struts-2.3\n" + + " srcPath: instrumentation/struts/struts-2.3\n" + + " target_versions:\n" + + " library:\n" + + " - org.apache.struts:struts2-core:2.1.0\n"; + + assertThat(expectedYaml).isEqualTo(stringWriter.toString()); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index d0b0eb823140..b686497b519a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -97,6 +97,7 @@ include(":instrumentation-annotations-support-testing") // misc include(":dependencyManagement") +include(":instrumentation-docs") include(":test-report") include(":testing:agent-exporter") include(":testing:agent-for-testing")