From 376696ce7d97f81987cb6e8e1744f2422a193b11 Mon Sep 17 00:00:00 2001 From: Karsten Schnitter Date: Tue, 17 Dec 2024 17:16:27 +0100 Subject: [PATCH 1/7] Add CloudFoundry Resource Provider Adds a new module, that parses the environment variable VCAP_APPLICATION for properties required for the CloudFoundry resource convention. This variable is present for applications running on CloudFoundry and contains all necessary information in a JSON object. Signed-off-by: Karsten Schnitter --- cloudfoundry-resource/build.gradle.kts | 24 ++++ .../resource/CloudFoundryResource.java | 106 ++++++++++++++++++ .../CloudFoundryResourceProvider.java | 18 +++ ...try.sdk.autoconfigure.spi.ResourceProvider | 1 + .../resource/CloudFoundryResourceTest.java | 89 +++++++++++++++ .../src/test/resources/vcap_application.json | 19 ++++ settings.gradle.kts | 1 + 7 files changed, 258 insertions(+) create mode 100644 cloudfoundry-resource/build.gradle.kts create mode 100644 cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResource.java create mode 100644 cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceProvider.java create mode 100644 cloudfoundry-resource/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider create mode 100644 cloudfoundry-resource/src/test/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceTest.java create mode 100644 cloudfoundry-resource/src/test/resources/vcap_application.json diff --git a/cloudfoundry-resource/build.gradle.kts b/cloudfoundry-resource/build.gradle.kts new file mode 100644 index 000000000..d43726165 --- /dev/null +++ b/cloudfoundry-resource/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + id("otel.java-conventions") + + id("otel.publish-conventions") +} + +description = "OpenTelemetry CloudFoundry Resource" +otelJava.moduleName.set("io.opentelemetry.contrib.cloudfoundry.resource") + +dependencies { + api("io.opentelemetry:opentelemetry-api") + api("io.opentelemetry:opentelemetry-sdk") + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") + + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") + + implementation("com.fasterxml.jackson.core:jackson-core") + implementation("io.opentelemetry.semconv:opentelemetry-semconv") + testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating") + + testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") + testImplementation("io.opentelemetry:opentelemetry-sdk-testing") + testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") +} diff --git a/cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResource.java b/cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResource.java new file mode 100644 index 000000000..4899f5c90 --- /dev/null +++ b/cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResource.java @@ -0,0 +1,106 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.contrib.cloudfoundry.resource; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.semconv.SchemaUrls; +import java.io.IOException; +import java.util.function.Function; +import java.util.logging.Logger; + +public final class CloudFoundryResource { + + private static final String ENV_VCAP_APPLICATION = "VCAP_APPLICATION"; + + // copied from CloudfoundryIncubatingAttributes + private static final AttributeKey CLOUDFOUNDRY_APP_ID = + AttributeKey.stringKey("cloudfoundry.app.id"); + private static final AttributeKey CLOUDFOUNDRY_APP_INSTANCE_ID = + AttributeKey.stringKey("cloudfoundry.app.instance.id"); + private static final AttributeKey CLOUDFOUNDRY_APP_NAME = + AttributeKey.stringKey("cloudfoundry.app.name"); + private static final AttributeKey CLOUDFOUNDRY_ORG_ID = + AttributeKey.stringKey("cloudfoundry.org.id"); + private static final AttributeKey CLOUDFOUNDRY_ORG_NAME = + AttributeKey.stringKey("cloudfoundry.org.name"); + private static final AttributeKey CLOUDFOUNDRY_PROCESS_ID = + AttributeKey.stringKey("cloudfoundry.process.id"); + private static final AttributeKey CLOUDFOUNDRY_PROCESS_TYPE = + AttributeKey.stringKey("cloudfoundry.process.type"); + private static final AttributeKey CLOUDFOUNDRY_SPACE_ID = + AttributeKey.stringKey("cloudfoundry.space.id"); + private static final AttributeKey CLOUDFOUNDRY_SPACE_NAME = + AttributeKey.stringKey("cloudfoundry.space.name"); + private static final Logger LOG = Logger.getLogger(CloudFoundryResource.class.getName()); + private static final JsonFactory JSON_FACTORY = new JsonFactory(); + private static final Resource INSTANCE = buildResource(System::getenv); + + private CloudFoundryResource() {} + + public static Resource get() { + return INSTANCE; + } + + static Resource buildResource(Function getenv) { + String vcapAppRaw = getenv.apply(ENV_VCAP_APPLICATION); + // If there is no VCAP_APPLICATION in the environment, we are likely not running in CloudFoundry + if (vcapAppRaw == null || vcapAppRaw.isEmpty()) { + return Resource.empty(); + } + + AttributesBuilder builder = Attributes.builder(); + try (JsonParser parser = JSON_FACTORY.createParser(vcapAppRaw)) { + parser.nextToken(); + while (parser.nextToken() != JsonToken.END_OBJECT) { + String name = parser.currentName(); + parser.nextToken(); + String value = parser.getValueAsString(); + switch (name) { + case "application_id": + builder.put(CLOUDFOUNDRY_APP_ID, value); + break; + case "application_name": + builder.put(CLOUDFOUNDRY_APP_NAME, value); + break; + case "instance_index": + builder.put(CLOUDFOUNDRY_APP_INSTANCE_ID, value); + break; + case "organization_id": + builder.put(CLOUDFOUNDRY_ORG_ID, value); + break; + case "organization_name": + builder.put(CLOUDFOUNDRY_ORG_NAME, value); + break; + case "process_id": + builder.put(CLOUDFOUNDRY_PROCESS_ID, value); + break; + case "process_type": + builder.put(CLOUDFOUNDRY_PROCESS_TYPE, value); + break; + case "space_id": + builder.put(CLOUDFOUNDRY_SPACE_ID, value); + break; + case "space_name": + builder.put(CLOUDFOUNDRY_SPACE_NAME, value); + break; + default: + parser.skipChildren(); + break; + } + } + } catch (IOException e) { + LOG.warning("Cannot parse contents of environment variable VCAP_APPLICATION. Invalid JSON"); + } + + return Resource.create(builder.build(), SchemaUrls.V1_24_0); + } +} diff --git a/cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceProvider.java b/cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceProvider.java new file mode 100644 index 000000000..b122b7a39 --- /dev/null +++ b/cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceProvider.java @@ -0,0 +1,18 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.contrib.cloudfoundry.resource; + +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; +import io.opentelemetry.sdk.resources.Resource; + +public class CloudFoundryResourceProvider implements ResourceProvider { + + @Override + public Resource createResource(ConfigProperties configProperties) { + return CloudFoundryResource.get(); + } +} diff --git a/cloudfoundry-resource/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider b/cloudfoundry-resource/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider new file mode 100644 index 000000000..461e3775c --- /dev/null +++ b/cloudfoundry-resource/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider @@ -0,0 +1 @@ +io.opentelemetry.contrib.cloudfoundry.resource.CloudFoundryResourceProvider diff --git a/cloudfoundry-resource/src/test/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceTest.java b/cloudfoundry-resource/src/test/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceTest.java new file mode 100644 index 000000000..1794a5ddc --- /dev/null +++ b/cloudfoundry-resource/src/test/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceTest.java @@ -0,0 +1,89 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.contrib.cloudfoundry.resource; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.semconv.SchemaUrls; +import io.opentelemetry.semconv.incubating.CloudfoundryIncubatingAttributes; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class CloudFoundryResourceTest { + + private static Map createVcapApplicationEnv(String value) { + Map environment = new HashMap<>(); + environment.put("VCAP_APPLICATION", value); + return environment; + } + + private static String loadVcapApplicationSample(String filename) { + try (InputStream is = + CloudFoundryResourceTest.class.getClassLoader().getResourceAsStream(filename)) { + if (is != null) { + return new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)) + .lines() + .collect(Collectors.joining()); + } + Assertions.fail("Cannot load resource " + filename); + } catch (IOException e) { + Assertions.fail("Error reading " + filename); + } + return ""; + } + + @Test + void noVcapApplication() { + Map env = Collections.emptyMap(); + Resource resource = CloudFoundryResource.buildResource(env::get); + assertThat(resource).isEqualTo(Resource.empty()); + } + + @Test + void emptyVcapApplication() { + Map env = createVcapApplicationEnv(""); + Resource resource = CloudFoundryResource.buildResource(env::get); + assertThat(resource).isEqualTo(Resource.empty()); + } + + @Test + void fullVcapApplication() { + String json = loadVcapApplicationSample("vcap_application.json"); + Map env = createVcapApplicationEnv(json); + + Resource resource = CloudFoundryResource.buildResource(env::get); + + assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); + assertThat(resource.getAttribute(CloudfoundryIncubatingAttributes.CLOUDFOUNDRY_APP_ID)) + .isEqualTo("0193a038-e615-7e5e-92ca-f4bcd7ba0a25"); + assertThat(resource.getAttribute(CloudfoundryIncubatingAttributes.CLOUDFOUNDRY_APP_INSTANCE_ID)) + .isEqualTo("1"); + assertThat(resource.getAttribute(CloudfoundryIncubatingAttributes.CLOUDFOUNDRY_APP_NAME)) + .isEqualTo("cf-app-name"); + assertThat(resource.getAttribute(CloudfoundryIncubatingAttributes.CLOUDFOUNDRY_ORG_ID)) + .isEqualTo("0193a375-8d8e-7e0c-a832-01ce9ded40dc"); + assertThat(resource.getAttribute(CloudfoundryIncubatingAttributes.CLOUDFOUNDRY_ORG_NAME)) + .isEqualTo("cf-org-name"); + assertThat(resource.getAttribute(CloudfoundryIncubatingAttributes.CLOUDFOUNDRY_PROCESS_ID)) + .isEqualTo("0193a4e3-8fd3-71b9-9fe3-5640c53bf1e2"); + assertThat(resource.getAttribute(CloudfoundryIncubatingAttributes.CLOUDFOUNDRY_PROCESS_TYPE)) + .isEqualTo("web"); + assertThat(resource.getAttribute(CloudfoundryIncubatingAttributes.CLOUDFOUNDRY_SPACE_ID)) + .isEqualTo("0193a7e7-da17-7ea4-8940-b1e07b401b16"); + assertThat(resource.getAttribute(CloudfoundryIncubatingAttributes.CLOUDFOUNDRY_SPACE_NAME)) + .isEqualTo("cf-space-name"); + } +} diff --git a/cloudfoundry-resource/src/test/resources/vcap_application.json b/cloudfoundry-resource/src/test/resources/vcap_application.json new file mode 100644 index 000000000..e6eb34eaa --- /dev/null +++ b/cloudfoundry-resource/src/test/resources/vcap_application.json @@ -0,0 +1,19 @@ +{ + "application_id": "0193a038-e615-7e5e-92ca-f4bcd7ba0a25", + "application_name": "cf-app-name", + "application_uris": [ + "testapp.example.com" + ], + "cf_api": "https://api.cf.example.com", + "limits": { + "fds": 256 + }, + "instance_index": 1, + "organization_id": "0193a375-8d8e-7e0c-a832-01ce9ded40dc", + "organization_name": "cf-org-name", + "process_id": "0193a4e3-8fd3-71b9-9fe3-5640c53bf1e2", + "process_type": "web", + "space_id": "0193a7e7-da17-7ea4-8940-b1e07b401b16", + "space_name": "cf-space-name", + "users": null +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 94edc1103..c4ff7a9b1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -33,6 +33,7 @@ include(":aws-xray") include(":aws-xray-propagator") include(":baggage-processor") include(":compressors:compressor-zstd") +include("cloudfoundry-resource") include(":consistent-sampling") include(":dependencyManagement") include(":disk-buffering") From 47605eaf5b5961f9fadc9339e9d2eee37f727331 Mon Sep 17 00:00:00 2001 From: Karsten Schnitter Date: Thu, 26 Dec 2024 20:09:28 +0100 Subject: [PATCH 2/7] Add draft README.md without code owner Code owners for the CloudFoundry module are yet to be determined. Signed-off-by: Karsten Schnitter --- cloudfoundry-resource/README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 cloudfoundry-resource/README.md diff --git a/cloudfoundry-resource/README.md b/cloudfoundry-resource/README.md new file mode 100644 index 000000000..5678525ae --- /dev/null +++ b/cloudfoundry-resource/README.md @@ -0,0 +1,27 @@ +# OpenTelemetry CloudFoundry Resource Support + +This module contains CloudFoundry resource detectors for OpenTelemetry. + +The module detects environment variable `VCAP_APPLICATION`, which is present for applications deployed in CloudFoundry. +This variable contains a JSON structure, which is parsed to fill the following attributes. + +| Resource attribute | `VCAP_APPLICATION` field | +|------------------------------|--------------------------| +| cloudfoundry.app.id | application_id | +| cloudfoundry.app.name | application_name | +| cloudfoundry.app.instance.id | instance_index | +| cloudfoundry.org.id | organization_id | +| cloudfoundry.org.name | organization_name | +| cloudfoundry.process.id | process_id | +| cloudfoundry.process.type | process_type | +| cloudfoundry.space.id | space_id | +| cloudfoundry.space.name | space_name | + +The resource attributes follow the [CloudFoundry semantic convention.](https://github.com/open-telemetry/semantic-conventions/blob/05b4c173bfdee2e972d252d14593b9fb653cc54a/docs/attributes-registry/cloudfoundry.md). +A description of `VCAP_APPLICATION` is available in the [CloudFoundry documentation](https://docs.cloudfoundry.org/devguide/deploy-apps/environment-variable.html#VCAP-APPLICATION). + +## Component owners + +- TBD + +Learn more about component owners in [component_owners.yml](../.github/component_owners.yml). From 392d35c0b1a98a99e33b5dcd7bc4cc127ef5c8c0 Mon Sep 17 00:00:00 2001 From: Karsten Schnitter Date: Tue, 14 Jan 2025 07:04:39 +0100 Subject: [PATCH 3/7] Add KarstenSchnitter as CF resource owner Signed-off-by: Karsten Schnitter --- .github/component_owners.yml | 2 ++ cloudfoundry-resource/README.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/component_owners.yml b/.github/component_owners.yml index a7489b9de..1f6aed4f5 100644 --- a/.github/component_owners.yml +++ b/.github/component_owners.yml @@ -22,6 +22,8 @@ components: baggage-procesor: - mikegoldsmith - zeitlinger + cloudfoundry-resource: + - KarstenSchnitter compressors: - jack-berg consistent-sampling: diff --git a/cloudfoundry-resource/README.md b/cloudfoundry-resource/README.md index 5678525ae..4e2e09779 100644 --- a/cloudfoundry-resource/README.md +++ b/cloudfoundry-resource/README.md @@ -22,6 +22,6 @@ A description of `VCAP_APPLICATION` is available in the [CloudFoundry documentat ## Component owners -- TBD +- [Karsten Schnitter](https://github.com/KarstenSchnitter), SAP Learn more about component owners in [component_owners.yml](../.github/component_owners.yml). From 51b6618303cf40db2caf2af8bc0ab47e271641e4 Mon Sep 17 00:00:00 2001 From: Karsten Schnitter Date: Wed, 29 Jan 2025 21:43:27 +0100 Subject: [PATCH 4/7] Improve OTel Sem Conv link Uses main branch. --- cloudfoundry-resource/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudfoundry-resource/README.md b/cloudfoundry-resource/README.md index 4e2e09779..355f9ce6e 100644 --- a/cloudfoundry-resource/README.md +++ b/cloudfoundry-resource/README.md @@ -17,7 +17,7 @@ This variable contains a JSON structure, which is parsed to fill the following a | cloudfoundry.space.id | space_id | | cloudfoundry.space.name | space_name | -The resource attributes follow the [CloudFoundry semantic convention.](https://github.com/open-telemetry/semantic-conventions/blob/05b4c173bfdee2e972d252d14593b9fb653cc54a/docs/attributes-registry/cloudfoundry.md). +The resource attributes follow the [CloudFoundry semantic convention.](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/attributes-registry/cloudfoundry.md). A description of `VCAP_APPLICATION` is available in the [CloudFoundry documentation](https://docs.cloudfoundry.org/devguide/deploy-apps/environment-variable.html#VCAP-APPLICATION). ## Component owners From 36d08f2073e29e8f0ef745c1091aea47747dc0de Mon Sep 17 00:00:00 2001 From: Karsten Schnitter Date: Thu, 30 Jan 2025 06:24:24 +0100 Subject: [PATCH 5/7] Rename to cloudfoundry-resources Uses plural form to align with aws-resources and gcp-resources subprojects. Signed-off-by: Karsten Schnitter --- .github/component_owners.yml | 2 +- .../io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider | 1 - {cloudfoundry-resource => cloudfoundry-resources}/README.md | 0 .../build.gradle.kts | 4 ++-- .../contrib/cloudfoundry/resources}/CloudFoundryResource.java | 2 +- .../cloudfoundry/resources}/CloudFoundryResourceProvider.java | 2 +- .../io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider | 1 + .../cloudfoundry/resources}/CloudFoundryResourceTest.java | 2 +- .../src/test/resources/vcap_application.json | 0 settings.gradle.kts | 2 +- 10 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 cloudfoundry-resource/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider rename {cloudfoundry-resource => cloudfoundry-resources}/README.md (100%) rename {cloudfoundry-resource => cloudfoundry-resources}/build.gradle.kts (93%) rename {cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource => cloudfoundry-resources/src/main/java/io/opentelemetry/contrib/cloudfoundry/resources}/CloudFoundryResource.java (98%) rename {cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource => cloudfoundry-resources/src/main/java/io/opentelemetry/contrib/cloudfoundry/resources}/CloudFoundryResourceProvider.java (89%) create mode 100644 cloudfoundry-resources/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider rename {cloudfoundry-resource/src/test/java/io/opentelemetry/contrib/cloudfoundry/resource => cloudfoundry-resources/src/test/java/io/opentelemetry/contrib/cloudfoundry/resources}/CloudFoundryResourceTest.java (98%) rename {cloudfoundry-resource => cloudfoundry-resources}/src/test/resources/vcap_application.json (100%) diff --git a/.github/component_owners.yml b/.github/component_owners.yml index 1f6aed4f5..d6647e332 100644 --- a/.github/component_owners.yml +++ b/.github/component_owners.yml @@ -22,7 +22,7 @@ components: baggage-procesor: - mikegoldsmith - zeitlinger - cloudfoundry-resource: + cloudfoundry-resources: - KarstenSchnitter compressors: - jack-berg diff --git a/cloudfoundry-resource/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider b/cloudfoundry-resource/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider deleted file mode 100644 index 461e3775c..000000000 --- a/cloudfoundry-resource/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider +++ /dev/null @@ -1 +0,0 @@ -io.opentelemetry.contrib.cloudfoundry.resource.CloudFoundryResourceProvider diff --git a/cloudfoundry-resource/README.md b/cloudfoundry-resources/README.md similarity index 100% rename from cloudfoundry-resource/README.md rename to cloudfoundry-resources/README.md diff --git a/cloudfoundry-resource/build.gradle.kts b/cloudfoundry-resources/build.gradle.kts similarity index 93% rename from cloudfoundry-resource/build.gradle.kts rename to cloudfoundry-resources/build.gradle.kts index d43726165..e768f7389 100644 --- a/cloudfoundry-resource/build.gradle.kts +++ b/cloudfoundry-resources/build.gradle.kts @@ -4,8 +4,8 @@ plugins { id("otel.publish-conventions") } -description = "OpenTelemetry CloudFoundry Resource" -otelJava.moduleName.set("io.opentelemetry.contrib.cloudfoundry.resource") +description = "OpenTelemetry CloudFoundry Resources" +otelJava.moduleName.set("io.opentelemetry.contrib.cloudfoundry.resources") dependencies { api("io.opentelemetry:opentelemetry-api") diff --git a/cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResource.java b/cloudfoundry-resources/src/main/java/io/opentelemetry/contrib/cloudfoundry/resources/CloudFoundryResource.java similarity index 98% rename from cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResource.java rename to cloudfoundry-resources/src/main/java/io/opentelemetry/contrib/cloudfoundry/resources/CloudFoundryResource.java index 4899f5c90..7d6313928 100644 --- a/cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResource.java +++ b/cloudfoundry-resources/src/main/java/io/opentelemetry/contrib/cloudfoundry/resources/CloudFoundryResource.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.contrib.cloudfoundry.resource; +package io.opentelemetry.contrib.cloudfoundry.resources; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; diff --git a/cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceProvider.java b/cloudfoundry-resources/src/main/java/io/opentelemetry/contrib/cloudfoundry/resources/CloudFoundryResourceProvider.java similarity index 89% rename from cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceProvider.java rename to cloudfoundry-resources/src/main/java/io/opentelemetry/contrib/cloudfoundry/resources/CloudFoundryResourceProvider.java index b122b7a39..e3f3e3c64 100644 --- a/cloudfoundry-resource/src/main/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceProvider.java +++ b/cloudfoundry-resources/src/main/java/io/opentelemetry/contrib/cloudfoundry/resources/CloudFoundryResourceProvider.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.contrib.cloudfoundry.resource; +package io.opentelemetry.contrib.cloudfoundry.resources; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; diff --git a/cloudfoundry-resources/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider b/cloudfoundry-resources/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider new file mode 100644 index 000000000..0b0f252ca --- /dev/null +++ b/cloudfoundry-resources/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider @@ -0,0 +1 @@ +io.opentelemetry.contrib.cloudfoundry.resources.CloudFoundryResourceProvider diff --git a/cloudfoundry-resource/src/test/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceTest.java b/cloudfoundry-resources/src/test/java/io/opentelemetry/contrib/cloudfoundry/resources/CloudFoundryResourceTest.java similarity index 98% rename from cloudfoundry-resource/src/test/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceTest.java rename to cloudfoundry-resources/src/test/java/io/opentelemetry/contrib/cloudfoundry/resources/CloudFoundryResourceTest.java index 1794a5ddc..1c533cd8a 100644 --- a/cloudfoundry-resource/src/test/java/io/opentelemetry/contrib/cloudfoundry/resource/CloudFoundryResourceTest.java +++ b/cloudfoundry-resources/src/test/java/io/opentelemetry/contrib/cloudfoundry/resources/CloudFoundryResourceTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.contrib.cloudfoundry.resource; +package io.opentelemetry.contrib.cloudfoundry.resources; import static org.assertj.core.api.Assertions.assertThat; diff --git a/cloudfoundry-resource/src/test/resources/vcap_application.json b/cloudfoundry-resources/src/test/resources/vcap_application.json similarity index 100% rename from cloudfoundry-resource/src/test/resources/vcap_application.json rename to cloudfoundry-resources/src/test/resources/vcap_application.json diff --git a/settings.gradle.kts b/settings.gradle.kts index c4ff7a9b1..b3353e4d5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -33,7 +33,7 @@ include(":aws-xray") include(":aws-xray-propagator") include(":baggage-processor") include(":compressors:compressor-zstd") -include("cloudfoundry-resource") +include("cloudfoundry-resources") include(":consistent-sampling") include(":dependencyManagement") include(":disk-buffering") From fde01692a825ac7b8755af6a40bbe3ed47fad4ca Mon Sep 17 00:00:00 2001 From: Karsten Schnitter Date: Fri, 31 Jan 2025 23:28:20 +0100 Subject: [PATCH 6/7] Update settings.gradle.kts Co-authored-by: Trask Stalnaker --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index b3353e4d5..969944ac7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -33,7 +33,7 @@ include(":aws-xray") include(":aws-xray-propagator") include(":baggage-processor") include(":compressors:compressor-zstd") -include("cloudfoundry-resources") +include(":cloudfoundry-resources") include(":consistent-sampling") include(":dependencyManagement") include(":disk-buffering") From c59c9b87e9abb443d6ffcd73f4ca484e45d4254b Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 21 Feb 2025 13:10:52 -0800 Subject: [PATCH 7/7] Update change log --- .github/scripts/draft-change-log-entries.sh | 2 +- CHANGELOG.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/scripts/draft-change-log-entries.sh b/.github/scripts/draft-change-log-entries.sh index 316621689..845c92672 100755 --- a/.github/scripts/draft-change-log-entries.sh +++ b/.github/scripts/draft-change-log-entries.sh @@ -29,6 +29,7 @@ component_names["aws-xray/"]="AWS X-Ray SDK support" component_names["aws-xray-propagator/"]="AWS X-Ray propagator" component_names["azure-resources/"]="Azure resources" component_names["baggage-processor/"]="Baggage processor" +component_names["cloudfoundry-resources/"]="CloudFoundry resources" component_names["compressors/"]="Compressors" component_names["consistent-sampling/"]="Consistent sampling" component_names["disk-buffering/"]="Disk buffering" @@ -49,7 +50,6 @@ component_names["runtime-attach/"]="Runtime attach" component_names["resource-providers/"]="Resource providers" component_names["samplers/"]="Samplers" component_names["span-stacktrace/"]="Span stack traces" -component_names["static-instrumenter/"]="Static instrumenter" echo "## Unreleased" echo diff --git a/CHANGELOG.md b/CHANGELOG.md index 328e26763..4ab17aaed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ - Support Lineage in XRay trace header and remove additional baggage from being added ([#1671](https://github.com/open-telemetry/opentelemetry-java-contrib/pull/1671)) +### CloudFoundry resources - New 🌟 + +CloudFoundry resource detector. + ### Disk buffering - Use delegate's temporality