Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Onboarding ADOT Java to v2.x - with otel v2.10.0 #975

Merged
merged 14 commits into from
Dec 19, 2024
2,250 changes: 1,818 additions & 432 deletions .github/patches/opentelemetry-java-instrumentation.patch

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion .github/patches/versions
Original file line number Diff line number Diff line change
@@ -1 +1 @@
OTEL_JAVA_INSTRUMENTATION_VERSION=v1.33.6
OTEL_JAVA_INSTRUMENTATION_VERSION=v2.10.0
13 changes: 13 additions & 0 deletions .github/workflows/docker-build-smoke-tests-fake-backend.yml
Original file line number Diff line number Diff line change
@@ -25,6 +25,19 @@ jobs:
with:
java-version: 17
distribution: 'temurin'
# cache local patch outputs
- name: Cache local Maven repository
uses: actions/cache@v3
with:
path: |
~/.m2/repository/io/opentelemetry/
key: ${{ runner.os }}-maven-local-${{ hashFiles('.github/patches/opentelemetry-java*.patch') }}

- name: Publish patched dependencies to maven local
uses: ./.github/actions/patch-dependencies
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
gpg_password: ${{ secrets.GPG_PASSPHRASE }}
- uses: gradle/wrapper-validation-action@v1
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
4 changes: 2 additions & 2 deletions .github/workflows/main-build.yml
Original file line number Diff line number Diff line change
@@ -194,7 +194,7 @@ jobs:
fetch-depth: 0
- uses: actions/setup-java@v4
with:
java-version: 21
java-version: 23
distribution: 'temurin'
- uses: gradle/wrapper-validation-action@v1

@@ -219,7 +219,7 @@ jobs:
key: ${{ runner.os }}-maven-local-${{ hashFiles('.github/patches/opentelemetry-java*.patch') }}

- name: Pull base image of Contract Tests Sample Apps
run: docker pull public.ecr.aws/docker/library/amazoncorretto:21-alpine
run: docker pull public.ecr.aws/docker/library/amazoncorretto:23-alpine

- name: Build snapshot with Gradle
uses: gradle/gradle-build-action@v3
18 changes: 16 additions & 2 deletions .github/workflows/nightly-upstream-snapshot-build.yml
Original file line number Diff line number Diff line change
@@ -32,6 +32,20 @@ jobs:
java-version: 17
distribution: 'temurin'

# cache local patch outputs
- name: Cache local Maven repository
uses: actions/cache@v3
with:
path: |
~/.m2/repository/io/opentelemetry/
key: ${{ runner.os }}-maven-local-${{ hashFiles('.github/patches/opentelemetry-java*.patch') }}

- name: Publish patched dependencies to maven local
uses: ./.github/actions/patch-dependencies
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
gpg_password: ${{ secrets.GPG_PASSPHRASE }}

- uses: gradle/wrapper-validation-action@v1

- name: Configure AWS Credentials
@@ -120,7 +134,7 @@ jobs:
fetch-depth: 0
- uses: actions/setup-java@v4
with:
java-version: 21
java-version: 23
distribution: 'temurin'
- uses: gradle/wrapper-validation-action@v1

@@ -136,7 +150,7 @@ jobs:
registry: public.ecr.aws

- name: Pull base image of Contract Tests Sample Apps
run: docker pull public.ecr.aws/docker/library/amazoncorretto:21-alpine
run: docker pull public.ecr.aws/docker/library/amazoncorretto:23-alpine

- name: Build snapshot with Gradle
uses: gradle/gradle-build-action@v3
2 changes: 1 addition & 1 deletion .github/workflows/patch-release-build.yml
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ on:

env:
AWS_DEFAULT_REGION: us-east-1
TEST_TAG: public.ecr.aws/aws-observability/adot-autoinstrumentation-java:test
TEST_TAG: public.ecr.aws/aws-observability/adot-autoinstrumentation-java:test-v2

permissions:
id-token: write
13 changes: 10 additions & 3 deletions .github/workflows/pr-build.yml
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@ on:
- main
- "release/v*"
env:
TEST_TAG: public.ecr.aws/aws-observability/adot-autoinstrumentation-java:test
TEST_TAG: public.ecr.aws/aws-observability/adot-autoinstrumentation-java:test-v2

jobs:
testpatch:
@@ -63,6 +63,13 @@ jobs:

- uses: gradle/wrapper-validation-action@v1

# Cleanup directories before proceeding with setup
- name: Clean up old installations
if: ${{ matrix.os != 'windows-latest' }}
run: |
sudo rm -rf /usr/local/lib/android
sudo rm -rf /usr/share/dotnet

# cache local patch outputs
- name: Cache local Maven repository
uses: actions/cache@v3
@@ -84,12 +91,12 @@ jobs:
- name: Set up Java version for tests
uses: actions/setup-java@v4
with:
java-version: 21
java-version: 23
distribution: temurin

- name: Pull base image of Contract Tests Sample Apps
if: ${{ matrix.os == 'ubuntu-latest' }}
run: docker pull public.ecr.aws/docker/library/amazoncorretto:21-alpine
run: docker pull public.ecr.aws/docker/library/amazoncorretto:23-alpine

- name: Run contract tests
uses: gradle/gradle-build-action@v3
2 changes: 1 addition & 1 deletion .github/workflows/release-build.yml
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ on:
env:
AWS_PUBLIC_ECR_REGION: us-east-1
AWS_PRIVATE_ECR_REGION: us-west-2
TEST_TAG: public.ecr.aws/aws-observability/adot-autoinstrumentation-java:test
TEST_TAG: public.ecr.aws/aws-observability/adot-autoinstrumentation-java:test-v2
PUBLIC_REPOSITORY: public.ecr.aws/aws-observability/adot-autoinstrumentation-java
PRIVATE_REPOSITORY: 020628701572.dkr.ecr.us-west-2.amazonaws.com/adot-autoinstrumentation-java
PRIVATE_REGISTRY: 020628701572.dkr.ecr.us-west-2.amazonaws.com
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -13,6 +13,11 @@ can be exported in a variety of formats. In addition, the agent and exporter can
command line arguments or environment variables. The net result is the ability to gather telemetry
data from a Java application without any code changes.

Note: There are 2.x releases and 1.x releases. The 2.0 release included significant breaking changes from [OpenTelemetry Agent for Java](https://github.com/open-telemetry/opentelemetry-java-instrumentation),
the details of which can be found in the [release notes](https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases).
It is recommended to use the latest 2.x release which will have the latest features and improvements.
1.x will receive security patches for a limited time and will not include other bug fixes and enhancements.

## Getting Started

Check out the [getting started documentation](https://aws-otel.github.io/docs/getting-started/java-sdk/auto-instr).
@@ -45,4 +50,4 @@ In addition to the sample apps in this repository, there are also a set of [stan
Please note that as per policy, we're providing support via GitHub on a best effort basis. However, if you have AWS Enterprise Support you can create a ticket and we will provide direct support within the respective SLAs.

## Security issue notifications
If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue.
If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue.
2 changes: 1 addition & 1 deletion appsignals-tests/contract-tests/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -33,7 +33,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
java
kotlin("jvm") version "1.8.22"
kotlin("jvm") version "2.1.0-RC2"
}

java {
Original file line number Diff line number Diff line change
@@ -263,19 +263,19 @@ private void assertSemanticConventionsAttributes(
List<KeyValue> attributesList,
String service,
String method,
String peerName,
int peerPort,
String address,
int port,
String url,
int statusCode) {
assertThat(attributesList)
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.RPC_METHOD, method))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.RPC_SERVICE, service))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.RPC_SYSTEM, "aws-api"))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.NET_PEER_NAME, peerName))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.NET_PEER_PORT, peerPort))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.SERVER_ADDRESS, address))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.SERVER_PORT, port))
.satisfiesOnlyOnce(
assertAttribute(SemanticConventionsConstants.HTTP_STATUS_CODE, statusCode))
.satisfiesOnlyOnce(assertAttributeStartsWith(SemanticConventionsConstants.HTTP_URL, url))
assertAttribute(SemanticConventionsConstants.HTTP_RESPONSE_STATUS_CODE, statusCode))
.satisfiesOnlyOnce(assertAttributeStartsWith(SemanticConventionsConstants.URL_FULL, url))
.satisfiesOnlyOnce(assertKeyIsPresent(SemanticConventionsConstants.THREAD_ID));
}

@@ -284,16 +284,16 @@ private void assertSemanticConventionsSqsConsumerAttributes(
List<KeyValue> attributesList,
String service,
String method,
String peerName,
int peerPort,
String address,
int port,
String url) {
assertThat(attributesList)
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.RPC_METHOD, method))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.RPC_SERVICE, service))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.RPC_SYSTEM, "aws-api"))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.NET_PEER_NAME, peerName))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.NET_PEER_PORT, peerPort))
.satisfiesOnlyOnce(assertAttributeStartsWith(SemanticConventionsConstants.HTTP_URL, url))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.SERVER_ADDRESS, address))
.satisfiesOnlyOnce(assertAttribute(SemanticConventionsConstants.SERVER_PORT, port))
.satisfiesOnlyOnce(assertAttributeStartsWith(SemanticConventionsConstants.URL_FULL, url))
.satisfiesOnlyOnce(assertKeyIsPresent(SemanticConventionsConstants.THREAD_ID));
}

@@ -308,8 +308,8 @@ private void assertSpanClientAttributes(
String type,
String identifier,
String cloudformationIdentifier,
String peerName,
int peerPort,
String address,
int port,
String url,
int statusCode,
List<ThrowingConsumer<KeyValue>> extraAssertions) {
@@ -327,8 +327,8 @@ private void assertSpanClientAttributes(
type,
identifier,
cloudformationIdentifier,
peerName,
peerPort,
address,
port,
url,
statusCode,
extraAssertions);
@@ -345,8 +345,8 @@ private void assertSpanProducerAttributes(
String type,
String identifier,
String cloudformationIdentifier,
String peerName,
int peerPort,
String address,
int port,
String url,
int statusCode,
List<ThrowingConsumer<KeyValue>> extraAssertions) {
@@ -363,8 +363,8 @@ private void assertSpanProducerAttributes(
type,
identifier,
cloudformationIdentifier,
peerName,
peerPort,
address,
port,
url,
statusCode,
extraAssertions);
@@ -377,8 +377,8 @@ private void assertSpanConsumerAttributes(
String operation,
String localService,
String method,
String peerName,
int peerPort,
String address,
int port,
String url,
int statusCode,
List<ThrowingConsumer<KeyValue>> extraAssertions) {
@@ -391,7 +391,7 @@ private void assertSpanConsumerAttributes(
assertThat(span.getKind()).isEqualTo(SpanKind.SPAN_KIND_CONSUMER);
assertThat(span.getName()).isEqualTo(spanName);
assertSemanticConventionsSqsConsumerAttributes(
spanAttributes, rpcService, method, peerName, peerPort, url);
spanAttributes, rpcService, method, address, port, url);
assertSqsConsumerAwsAttributes(span.getAttributesList(), operation);
for (var assertion : extraAssertions) {
assertThat(spanAttributes).satisfiesOnlyOnce(assertion);
@@ -412,8 +412,8 @@ private void assertSpanAttributes(
String type,
String identifier,
String cloudformationIdentifier,
String peerName,
int peerPort,
String address,
int port,
String url,
int statusCode,
List<ThrowingConsumer<KeyValue>> extraAssertions) {
@@ -425,9 +425,8 @@ private void assertSpanAttributes(
var spanAttributes = span.getAttributesList();
assertThat(span.getKind()).isEqualTo(spanKind);
assertThat(span.getName()).isEqualTo(spanName);

assertSemanticConventionsAttributes(
spanAttributes, rpcService, method, peerName, peerPort, url, statusCode);
spanAttributes, rpcService, method, address, port, url, statusCode);
assertAwsAttributes(
spanAttributes,
localService,
Original file line number Diff line number Diff line change
@@ -152,7 +152,9 @@ protected Map<String, String> getApplicationEnvironmentVariables() {
"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
COLLECTOR_HTTP_ENDPOINT,
"OTEL_RESOURCE_ATTRIBUTES",
getApplicationOtelResourceAttributes());
getApplicationOtelResourceAttributes(),
"OTEL_EXPORTER_OTLP_PROTOCOL",
"grpc");
}

protected Map<String, String> getApplicationExtraEnvironmentVariables() {
Original file line number Diff line number Diff line change
@@ -62,6 +62,11 @@ protected long getThreshold(String metricName) {
switch (metricName) {
// If maximum memory size is undefined, then value is -1
// https://docs.oracle.com/en/java/javase/17/docs/api/java.management/java/lang/management/MemoryUsage.html#getMax()
// Thread count can be negative when excutor is null
// https://github.com/apache/tomcat/blob/1afe41491f0e56ec0a776db5ff84607f87ce6640/java/org/apache/tomcat/util/net/AbstractEndpoint.java#L1204
case JMXMetricsConstants.TOMCAT_THREADS:
threshold = -2;
break;
case JMXMetricsConstants.JVM_HEAP_MAX:
case JMXMetricsConstants.JVM_NON_HEAP_MAX:
case JMXMetricsConstants.JVM_POOL_MAX:
Original file line number Diff line number Diff line change
@@ -229,12 +229,12 @@ protected void assertSemanticConventionsAttributes(
assertThat(attributesList)
.satisfiesOnlyOnce(
attribute -> {
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.NET_PEER_NAME);
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.SERVER_ADDRESS);
assertThat(attribute.getValue().getStringValue()).isEqualTo("server");
})
.satisfiesOnlyOnce(
attribute -> {
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.NET_PEER_PORT);
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.SERVER_PORT);
assertThat(attribute.getValue().getIntValue()).isEqualTo(50051L);
})
.satisfiesOnlyOnce(
@@ -266,15 +266,10 @@ protected void assertSemanticConventionsAttributes(
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.RPC_SERVICE);
assertThat(attribute.getValue().getStringValue()).isEqualTo(GRPC_SERVICE_NAME);
})
.satisfiesOnlyOnce(
attribute -> {
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.NET_PEER_NAME);
assertThat(attribute.getValue().getStringValue()).isEqualTo("server");
})
.satisfiesOnlyOnce(
attribute -> {
assertThat(attribute.getKey())
.isEqualTo(SemanticConventionsConstants.NET_SOCK_PEER_ADDR);
.isEqualTo(SemanticConventionsConstants.NETWORK_PEER_ADDRESS);
});
}

Original file line number Diff line number Diff line change
@@ -271,20 +271,20 @@ protected void assertSemanticConventionsAttributes(
.satisfiesOnlyOnce(
attribute -> {
assertThat(attribute.getKey())
.isEqualTo(SemanticConventionsConstants.NET_SOCK_PEER_ADDR);
.isEqualTo(SemanticConventionsConstants.NETWORK_PEER_ADDRESS);
})
.satisfiesOnlyOnce(
attribute -> {
assertThat(attribute.getKey())
.isEqualTo(SemanticConventionsConstants.NET_SOCK_PEER_PORT);
.isEqualTo(SemanticConventionsConstants.NETWORK_PEER_PORT);
})
.satisfiesOnlyOnce(
attribute -> {
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.NET_HOST_PORT);
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.SERVER_PORT);
})
.satisfiesOnlyOnce(
attribute -> {
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.NET_HOST_NAME);
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.SERVER_ADDRESS);
assertThat(attribute.getValue().getStringValue()).isEqualTo("localhost");
});
}
Loading