Merge branch 'main' into low-allocation-marshalers-for-json-exporter

This commit is contained in:
Teja 2025-07-12 11:51:01 -04:00 committed by GitHub
commit eccd941273
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
166 changed files with 2583 additions and 653 deletions

View File

@ -171,7 +171,7 @@ jobs:
- 23
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: graalvm/setup-graalvm@01ed653ac833fe80569f1ef9f25585ba2811baab # v1.3.3
- uses: graalvm/setup-graalvm@e1df20a713a4cc6ab5b0eb03f0e0dcdc0199b805 # v1.3.4
with:
java-version: ${{ matrix.test-graal-version }}
distribution: 'graalvm'

View File

@ -45,7 +45,7 @@ jobs:
uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1
- name: Initialize CodeQL
uses: github/codeql-action/init@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
with:
languages: ${{ matrix.language }}
# using "latest" helps to keep up with the latest Kotlin support
@ -60,6 +60,6 @@ jobs:
run: ./gradlew assemble --no-build-cache --no-daemon
- name: Perform CodeQL analysis
uses: github/codeql-action/analyze@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
with:
category: "/language:${{matrix.language}}"

View File

@ -42,6 +42,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard (optional).
# Commenting out will disable upload of results to your repo's Code Scanning dashboard
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
uses: github/codeql-action/upload-sarif@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
with:
sarif_file: results.sarif

View File

@ -133,7 +133,7 @@ jobs:
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "prior-version=$PRIOR_VERSION" >> $GITHUB_OUTPUT
update-apidiff-baseline-to-released-version:
update-apidiff-baseline-and-docs-to-released-version:
permissions:
contents: write # for git push to PR branch
runs-on: ubuntu-latest
@ -187,6 +187,13 @@ jobs:
./gradlew --refresh-dependencies japicmp
git add docs/apidiffs
- name: Update versions in README.md
env:
VERSION: ${{ needs.release.outputs.version }}
run: |
./gradlew updateVersionInDocs -Prelease.version=$VERSION
git add README.md
- name: Use CLA approved bot
run: .github/scripts/use-cla-approved-github-bot.sh
@ -202,9 +209,9 @@ jobs:
# not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows
GH_TOKEN: ${{ steps.otelbot-token.outputs.token }}
run: |
message="Update apidiff baseline to released version $VERSION"
body="Update apidiff baseline to released version \`$VERSION\`."
branch="otelbot/update-apidiff-baseline-to-released-version-${VERSION}"
message="Update apidiff baseline and documentation versions to released version $VERSION"
body="Update apidiff baseline and documentation versions to released version \`$VERSION\`."
branch="otelbot/update-apidiff-baseline-and-documentation-to-released-version-${VERSION}"
git checkout -b $branch
git commit -m "$message"

View File

@ -2,6 +2,62 @@
## Unreleased
## Version 1.52.0 (2025-07-11)
### API
#### Common
* Promote `ComponentLoader` to new `opentelemetry-common` artifact,
standardize SPI loading
([#7446](https://github.com/open-telemetry/opentelemetry-java/pull/7446))
#### Context
* LazyStorage passes its ClassLoader when loading ContextStorageProvider SPI
([#7424](https://github.com/open-telemetry/opentelemetry-java/pull/7424))
#### Incubator
* Add context and severity params to ExtendedLogger#isEnabled
([#7268](https://github.com/open-telemetry/opentelemetry-java/pull/7268))
* Add new convenience methods for converting DeclarativeConfigProperties to config model
([#7453](https://github.com/open-telemetry/opentelemetry-java/pull/7453))
### SDK
* Add custom stacktrace renderer which is length limit aware
([#7281](https://github.com/open-telemetry/opentelemetry-java/pull/7281))
#### Metrics
* Propagate flush to PeriodicMetricReader's metricExporter.
([#7410](https://github.com/open-telemetry/opentelemetry-java/pull/7410))
#### Exporters
* OTLP - JdkHttpSender: ensure proper closure of HttpClient in shutdown method
([#7390](https://github.com/open-telemetry/opentelemetry-java/pull/7390))
* OTLP: profile exporters fix and test improvements
([#7442](https://github.com/open-telemetry/opentelemetry-java/pull/7442))
* OTLP: Loading Compressor SPI via ComponentLoader configured through setComponentLoader
([#7428](https://github.com/open-telemetry/opentelemetry-java/pull/7428))
* Prometheus: add scope schema URL and attributes
([#7356](https://github.com/open-telemetry/opentelemetry-java/pull/7356))
* Prometheus: extend prometheus declarative config support to include without_scope_info,
with_resource_constant_labels
([#6840](https://github.com/open-telemetry/opentelemetry-java/pull/6840))
#### Extensions
* Autoconfigure: fix race condition of `GlobalOpenTelemetry` initialization with
`AutoConfiguredOpenTelemetrySdkBuilder`
([#7365](https://github.com/open-telemetry/opentelemetry-java/pull/7365))
* Declarative config: update to declarative config 1.0-rc.1
([#7436](https://github.com/open-telemetry/opentelemetry-java/pull/7436))
* Declarative config: resolve environment variable substitution for mixed quotes
([#7433](https://github.com/open-telemetry/opentelemetry-java/pull/7433))
## Version 1.51.0 (2025-06-06)
### API

View File

@ -57,8 +57,8 @@ A bill of materials (or BOM) helps sync dependency versions of related artifacts
| Component | Description | Artifact ID | Version | Javadoc |
|----------------------------------------------|----------------------------------------|---------------------------|-------------------------------------------------------------|---------|
| [Bill of Materials (BOM)](./bom) | Bill of materials for stable artifacts | `opentelemetry-bom` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | N/A |
| [Alpha Bill of Materials (BOM)](./bom-alpha) | Bill of materials for alpha artifacts | `opentelemetry-bom-alpha` | <!--VERSION_UNSTABLE-->1.49.0-alpha<!--/VERSION_UNSTABLE--> | N/A |
| [Bill of Materials (BOM)](./bom) | Bill of materials for stable artifacts | `opentelemetry-bom` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | N/A |
| [Alpha Bill of Materials (BOM)](./bom-alpha) | Bill of materials for alpha artifacts | `opentelemetry-bom-alpha` | <!--VERSION_UNSTABLE-->1.52.0-alpha<!--/VERSION_UNSTABLE--> | N/A |
</details>
<details open>
@ -68,9 +68,10 @@ The OpenTelemetry API for recording telemetry.
| Component | Description | Artifact ID | Version | Javadoc |
|-----------------------------------|--------------------------------------------------------------------------------------|-------------------------------|-------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [API](./api/all) | OpenTelemetry API, including metrics, traces, baggage, context | `opentelemetry-api` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-api.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api) |
| [API Incubator](./api/incubator) | API incubator, including pass through propagator, and extended tracer, and Event API | `opentelemetry-api-incubator` | <!--VERSION_UNSTABLE-->1.49.0-alpha<!--/VERSION_UNSTABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-api-incubator.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api-incubator) |
| [Context API](./context) | OpenTelemetry context API | `opentelemetry-context` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-context.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-context) |
| [API](./api/all) | OpenTelemetry API, including metrics, traces, baggage, context | `opentelemetry-api` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-api.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api) |
| [API Incubator](./api/incubator) | API incubator, including pass through propagator, and extended tracer, and Event API | `opentelemetry-api-incubator` | <!--VERSION_UNSTABLE-->1.52.0-alpha<!--/VERSION_UNSTABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-api-incubator.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api-incubator) |
| [Context API](./context) | OpenTelemetry context API | `opentelemetry-context` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-context.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-context) |
| [Common](./common) | Common utility methods used across API components | `opentelemetry-common` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-common.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-common) |
</details>
<details>
@ -80,8 +81,8 @@ Extensions to the OpenTelemetry API.
| Component | Description | Artifact ID | Version | Javadoc |
|---------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------|-------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [Kotlin Extension](./extensions/kotlin) | Context extension for coroutines | `opentelemetry-extension-kotlin` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-extension-kotlin.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-extension-kotlin) |
| [Trace Propagators Extension](./extensions/trace-propagators) | Trace propagators, including B3, Jaeger, OT Trace | `opentelemetry-extension-trace-propagators` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-extension-trace-propagators.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-extension-trace-propagators) |
| [Kotlin Extension](./extensions/kotlin) | Context extension for coroutines | `opentelemetry-extension-kotlin` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-extension-kotlin.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-extension-kotlin) |
| [Trace Propagators Extension](./extensions/trace-propagators) | Trace propagators, including B3, Jaeger, OT Trace | `opentelemetry-extension-trace-propagators` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-extension-trace-propagators.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-extension-trace-propagators) |
</details>
<details open>
@ -91,12 +92,12 @@ The OpenTelemetry SDK for managing telemetry producing by the API.
| Component | Description | Artifact ID | Version | Javadoc |
|------------------------------|--------------------------------------------------------|-----------------------------|---------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [SDK](./sdk/all) | OpenTelemetry SDK, including metrics, traces, and logs | `opentelemetry-sdk` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk) |
| [Metrics SDK](./sdk/metrics) | OpenTelemetry metrics SDK | `opentelemetry-sdk-metrics` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-metrics.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-metrics) |
| [Trace SDK](./sdk/trace) | OpenTelemetry trace SDK | `opentelemetry-sdk-trace` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-trace.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-trace) |
| [Log SDK](./sdk/logs) | OpenTelemetry log SDK | `opentelemetry-sdk-logs` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-logs.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-logs) |
| [SDK Common](./sdk/common) | Shared SDK components | `opentelemetry-sdk-common` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-common.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-common) |
| [SDK Testing](./sdk/testing) | Components for testing OpenTelemetry instrumentation | `opentelemetry-sdk-testing` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-testing.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-testing) |
| [SDK](./sdk/all) | OpenTelemetry SDK, including metrics, traces, and logs | `opentelemetry-sdk` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk) |
| [Metrics SDK](./sdk/metrics) | OpenTelemetry metrics SDK | `opentelemetry-sdk-metrics` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-metrics.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-metrics) |
| [Trace SDK](./sdk/trace) | OpenTelemetry trace SDK | `opentelemetry-sdk-trace` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-trace.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-trace) |
| [Log SDK](./sdk/logs) | OpenTelemetry log SDK | `opentelemetry-sdk-logs` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-logs.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-logs) |
| [SDK Common](./sdk/common) | Shared SDK components | `opentelemetry-sdk-common` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-common.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-common) |
| [SDK Testing](./sdk/testing) | Components for testing OpenTelemetry instrumentation | `opentelemetry-sdk-testing` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-testing.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-testing) |
</details>
<details>
@ -106,16 +107,16 @@ SDK exporters for shipping traces, metrics, and logs out of process.
| Component | Description | Artifact ID | Version | Javadoc |
|-----------------------------------------------------------------------|------------------------------------------------------------------------------|------------------------------------------------------|-------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [OTLP Exporters](./exporters/otlp/all) | OTLP gRPC & HTTP exporters, including traces, metrics, and logs | `opentelemetry-exporter-otlp` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-otlp.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-otlp) |
| [OTLP Logging Exporters](./exporters/logging-otlp) | Logging exporters in OTLP JSON encoding, including traces, metrics, and logs | `opentelemetry-exporter-logging-otlp` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-logging-otlp.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-logging-otlp) |
| [OTLP Common](./exporters/otlp/common) | Shared OTLP components (internal) | `opentelemetry-exporter-otlp-common` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-otlp-common.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-otlp-common) |
| [Logging Exporter](./exporters/logging) | Logging exporters, including metrics, traces, and logs | `opentelemetry-exporter-logging` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-logging.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-logging) |
| [Zipkin Exporter](./exporters/zipkin) | Zipkin trace exporter | `opentelemetry-exporter-zipkin` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-zipkin.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-zipkin) |
| [Prometheus Exporter](./exporters/prometheus) | Prometheus metric exporter | `opentelemetry-exporter-prometheus` | <!--VERSION_UNSTABLE-->1.49.0-alpha<!--/VERSION_UNSTABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-prometheus.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-prometheus) |
| [Exporter Common](./exporters/common) | Shared exporter components (internal) | `opentelemetry-exporter-common` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-common.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-common) |
| [OkHttp Sender](./exporters/sender/okhttp) | OkHttp implementation of HttpSender (internal) | `opentelemetry-exporter-sender-okhttp` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-sender-okhttp.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-sender-okhttp) |
| [JDK Sender](./exporters/sender/jdk) | Java 11+ native HttpClient implementation of HttpSender (internal) | `opentelemetry-exporter-sender-jdk` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-sender-jdk.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-sender-jdk) | |
| [gRPC ManagedChannel Sender](./exporters/sender/grpc-managed-channel) | gRPC ManagedChannel implementation of GrpcSender (internal) | `opentelemetry-exporter-sender-grpc-managed-channel` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-sender-grpc-managed-channel.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-sender-grpc-managed-channel) | |
| [OTLP Exporters](./exporters/otlp/all) | OTLP gRPC & HTTP exporters, including traces, metrics, and logs | `opentelemetry-exporter-otlp` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-otlp.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-otlp) |
| [OTLP Logging Exporters](./exporters/logging-otlp) | Logging exporters in OTLP JSON encoding, including traces, metrics, and logs | `opentelemetry-exporter-logging-otlp` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-logging-otlp.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-logging-otlp) |
| [OTLP Common](./exporters/otlp/common) | Shared OTLP components (internal) | `opentelemetry-exporter-otlp-common` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-otlp-common.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-otlp-common) |
| [Logging Exporter](./exporters/logging) | Logging exporters, including metrics, traces, and logs | `opentelemetry-exporter-logging` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-logging.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-logging) |
| [Zipkin Exporter](./exporters/zipkin) | Zipkin trace exporter | `opentelemetry-exporter-zipkin` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-zipkin.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-zipkin) |
| [Prometheus Exporter](./exporters/prometheus) | Prometheus metric exporter | `opentelemetry-exporter-prometheus` | <!--VERSION_UNSTABLE-->1.52.0-alpha<!--/VERSION_UNSTABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-prometheus.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-prometheus) |
| [Exporter Common](./exporters/common) | Shared exporter components (internal) | `opentelemetry-exporter-common` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-common.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-common) |
| [OkHttp Sender](./exporters/sender/okhttp) | OkHttp implementation of HttpSender (internal) | `opentelemetry-exporter-sender-okhttp` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-sender-okhttp.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-sender-okhttp) |
| [JDK Sender](./exporters/sender/jdk) | Java 11+ native HttpClient implementation of HttpSender (internal) | `opentelemetry-exporter-sender-jdk` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-sender-jdk.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-sender-jdk) | |
| [gRPC ManagedChannel Sender](./exporters/sender/grpc-managed-channel) | gRPC ManagedChannel implementation of GrpcSender (internal) | `opentelemetry-exporter-sender-grpc-managed-channel` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-exporter-sender-grpc-managed-channel.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-sender-grpc-managed-channel) | |
</details>
<details>
@ -125,10 +126,10 @@ Extensions to the OpenTelemetry SDK.
| Component | Description | Artifact ID | Version | Javadoc |
|-------------------------------------------------------------------------------|------------------------------------------------------------------------------------|-----------------------------------------------------|-------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [SDK Autoconfigure](./sdk-extensions/autoconfigure) | Autoconfigure OpenTelemetry SDK from env vars, system properties, and SPI | `opentelemetry-sdk-extension-autoconfigure` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure) |
| [SDK Autoconfigure SPI](./sdk-extensions/autoconfigure-spi) | Service Provider Interface (SPI) definitions for autoconfigure | `opentelemetry-sdk-extension-autoconfigure-spi` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure-spi.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure-spi) |
| [SDK Jaeger Remote Sampler Extension](./sdk-extensions/jaeger-remote-sampler) | Sampler which obtains sampling configuration from remote Jaeger server | `opentelemetry-sdk-extension-jaeger-remote-sampler` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-extension-jaeger-remote-sampler.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-jaeger-remote-sampler) |
| [SDK Incubator](./sdk-extensions/incubator) | SDK incubator, including YAML based view configuration, LeakDetectingSpanProcessor | `opentelemetry-sdk-extension-incubator` | <!--VERSION_UNSTABLE-->1.49.0-alpha<!--/VERSION_UNSTABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-extension-incubator.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-incubator) |
| [SDK Autoconfigure](./sdk-extensions/autoconfigure) | Autoconfigure OpenTelemetry SDK from env vars, system properties, and SPI | `opentelemetry-sdk-extension-autoconfigure` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure) |
| [SDK Autoconfigure SPI](./sdk-extensions/autoconfigure-spi) | Service Provider Interface (SPI) definitions for autoconfigure | `opentelemetry-sdk-extension-autoconfigure-spi` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure-spi.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure-spi) |
| [SDK Jaeger Remote Sampler Extension](./sdk-extensions/jaeger-remote-sampler) | Sampler which obtains sampling configuration from remote Jaeger server | `opentelemetry-sdk-extension-jaeger-remote-sampler` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-extension-jaeger-remote-sampler.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-jaeger-remote-sampler) |
| [SDK Incubator](./sdk-extensions/incubator) | SDK incubator, including YAML based view configuration, LeakDetectingSpanProcessor | `opentelemetry-sdk-extension-incubator` | <!--VERSION_UNSTABLE-->1.52.0-alpha<!--/VERSION_UNSTABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-sdk-extension-incubator.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-incubator) |
</details>
<details>
@ -138,8 +139,8 @@ Shims for bridging data from one observability library to another.
| Component | Description | Artifact ID | Version | Javadoc |
|----------------------------------------|--------------------------------------------------------------|----------------------------------|-------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [OpenCensus Shim](./opencensus-shim) | Bridge opencensus metrics into the OpenTelemetry metrics SDK | `opentelemetry-opencensus-shim` | <!--VERSION_UNSTABLE-->1.49.0-alpha<!--/VERSION_UNSTABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-opencensus-shim.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-opencensus-shim) |
| [OpenTracing Shim](./opentracing-shim) | Bridge opentracing spans into the OpenTelemetry trace API | `opentelemetry-opentracing-shim` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-opentracing-shim.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-opentracing-shim) |
| [OpenCensus Shim](./opencensus-shim) | Bridge opencensus metrics into the OpenTelemetry metrics SDK | `opentelemetry-opencensus-shim` | <!--VERSION_UNSTABLE-->1.52.0-alpha<!--/VERSION_UNSTABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-opencensus-shim.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-opencensus-shim) |
| [OpenTracing Shim](./opentracing-shim) | Bridge opentracing spans into the OpenTelemetry trace API | `opentelemetry-opentracing-shim` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [![Javadocs](https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-opentracing-shim.svg)](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-opentracing-shim) |
</details>
## Dependencies
@ -180,7 +181,7 @@ repositories {
}
dependencies {
implementation platform("io.opentelemetry:opentelemetry-bom:1.50.0-SNAPSHOT")
implementation platform("io.opentelemetry:opentelemetry-bom:1.53.0-SNAPSHOT")
implementation('io.opentelemetry:opentelemetry-api')
}
```
@ -202,7 +203,7 @@ dependencies {
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-bom</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.53.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
@ -254,16 +255,14 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for:
* Keys to successful PRs
* Guide to using gradle composite builds
### Code owners
#### Maintainers
### Maintainers
- [Jack Berg](https://github.com/jack-berg), New Relic
- [John Watson](https://github.com/jkwatson), Verta.ai
For more information about the maintainer role, see the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#maintainer).
#### Approvers
### Approvers
- [Jason Plumb](https://github.com/breedx-splk), Splunk
- [Josh Suereth](https://github.com/jsuereth), Google
@ -272,13 +271,13 @@ For more information about the maintainer role, see the [community repository](h
For more information about the approver role, see the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#approver).
#### Triagers
### Triagers
- [Gregor Zeitlinger](https://github.com/zeitlinger), Grafana Labs
For more information about the triager role, see the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#triager).
#### Emeritus
### Emeritus
- Maintainer [Bogdan Drutu](https://github.com/BogdanDrutu)
- Maintainer [Carlos Alberto](https://github.com/carlosalberto)

View File

@ -57,6 +57,11 @@ and deadlocks.
* Review and merge the pull request that it creates for updating the change log in main
(note that if this is not a patch release then the change log on main may already be up-to-date,
in which case no pull request will be created).
* Once the release artifacts become available on Maven Central, the system will automatically
generate a new pull request titled `Update apidiff baseline and documentation versions to
released version $VERSION`. This pull request will contain updates to both the API diff baseline
and version references in the documentation files (README.md). Please review and merge this
automated pull request.
* The [website](https://github.com/open-telemetry/opentelemetry.io) contains automation to update
to the newly released version. Review and approve the pull request when available.
* The [website](https://opentelemetry.io/docs/languages/java/configuration/#zero-code-sdk-autoconfigure)

View File

@ -28,7 +28,7 @@ class SdkDesignTest {
* Ensures that all SDK methods that: - are defined in classes that extend or implement API model
* and are public (to exclude protected builders) - are public (avoids issues with protected
* methods returning classes unavailable to test's CL) - override or implement parent method
* return only API, Context or generic Java type.
* return only API, Context, Common, or generic Java type.
*/
@Test
void sdkImplementationOfApiClassesShouldReturnApiTypeOnly() {
@ -45,7 +45,11 @@ class SdkDesignTest {
.and(implementOrOverride())
.should()
.haveRawReturnType(
inPackage("io.opentelemetry.api..", "io.opentelemetry.context..", "java.."))
inPackage(
"io.opentelemetry.api..",
"io.opentelemetry.context..",
"io.opentelemetry.common..",
"java.."))
.orShould()
.haveRawReturnType("void");

View File

@ -122,6 +122,8 @@ public final class GlobalOpenTelemetry {
*
* <p>This method calls the given {@code supplier} and calls {@link #set(OpenTelemetry)}, all
* while holding the {@link GlobalOpenTelemetry} mutex.
*
* @since 1.52.0
*/
public static void set(Supplier<OpenTelemetry> supplier) {
synchronized (mutex) {

View File

@ -12,6 +12,9 @@ otelJava.moduleName.set("io.opentelemetry.api.incubator")
dependencies {
api(project(":api:all"))
// Supports optional InstrumentationConfigUtil#convertToModel
compileOnly("com.fasterxml.jackson.core:jackson-databind")
annotationProcessor("com.google.auto.value:auto-value")
// To use parsed config file as input for InstrumentationConfigUtilTest
@ -24,3 +27,16 @@ dependencies {
testImplementation("com.google.guava:guava")
}
testing {
suites {
register<JvmTestSuite>("testConvertToModel") {
dependencies {
implementation("com.fasterxml.jackson.core:jackson-databind")
implementation(project(":sdk-extensions:incubator"))
implementation(project(":sdk-extensions:autoconfigure"))
implementation("com.google.guava:guava")
}
}
}
}

View File

@ -7,7 +7,9 @@ package io.opentelemetry.api.incubator.config;
import static io.opentelemetry.api.internal.ConfigUtil.defaultIfNull;
import io.opentelemetry.common.ComponentLoader;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
@ -36,6 +38,11 @@ public interface DeclarativeConfigProperties {
return EmptyDeclarativeConfigProperties.getInstance();
}
/** Return a map representation of the {@code declarativeConfigProperties}. */
static Map<String, Object> toMap(DeclarativeConfigProperties declarativeConfigProperties) {
return DeclarativeConfigPropertyUtil.toMap(declarativeConfigProperties);
}
/**
* Returns a {@link String} configuration property.
*
@ -222,4 +229,7 @@ public interface DeclarativeConfigProperties {
* @return the configuration property keys
*/
Set<String> getPropertyKeys();
/** Return a {@link ComponentLoader} that should be used to load SPIs. */
ComponentLoader getComponentLoader();
}

View File

@ -0,0 +1,126 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.api.incubator.config;
import static java.util.stream.Collectors.toList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiFunction;
import javax.annotation.Nullable;
final class DeclarativeConfigPropertyUtil {
private DeclarativeConfigPropertyUtil() {}
private static final List<BiFunction<String, DeclarativeConfigProperties, Object>>
valueResolvers =
Arrays.asList(
DeclarativeConfigPropertyUtil::getString,
DeclarativeConfigPropertyUtil::getBoolean,
DeclarativeConfigPropertyUtil::getLong,
DeclarativeConfigPropertyUtil::getDouble,
DeclarativeConfigPropertyUtil::getStringList,
DeclarativeConfigPropertyUtil::getBooleanList,
DeclarativeConfigPropertyUtil::getLongList,
DeclarativeConfigPropertyUtil::getDoubleList,
DeclarativeConfigPropertyUtil::getStringList,
DeclarativeConfigPropertyUtil::getStructuredList,
DeclarativeConfigPropertyUtil::getStructured);
static Map<String, Object> toMap(DeclarativeConfigProperties declarativeConfigProperties) {
Set<String> propertyKeys = declarativeConfigProperties.getPropertyKeys();
Map<String, Object> result = new HashMap<>(propertyKeys.size());
for (String key : declarativeConfigProperties.getPropertyKeys()) {
result.put(key, resolveValue(key, declarativeConfigProperties));
}
return result;
}
@Nullable
private static Object resolveValue(
String key, DeclarativeConfigProperties declarativeConfigProperties) {
for (int i = 0; i < valueResolvers.size(); i++) {
try {
Object value = valueResolvers.get(i).apply(key, declarativeConfigProperties);
if (value != null) {
return value;
}
} catch (DeclarativeConfigException e) {
// Ignore and continue
}
}
return null;
}
@Nullable
private static Object getString(
String key, DeclarativeConfigProperties declarativeConfigProperties) {
return declarativeConfigProperties.getString(key);
}
@Nullable
private static Object getBoolean(
String key, DeclarativeConfigProperties declarativeConfigProperties) {
return declarativeConfigProperties.getBoolean(key);
}
@Nullable
private static Object getLong(
String key, DeclarativeConfigProperties declarativeConfigProperties) {
return declarativeConfigProperties.getLong(key);
}
@Nullable
private static Object getDouble(
String key, DeclarativeConfigProperties declarativeConfigProperties) {
return declarativeConfigProperties.getDouble(key);
}
@Nullable
private static Object getStringList(
String key, DeclarativeConfigProperties declarativeConfigProperties) {
return declarativeConfigProperties.getScalarList(key, String.class);
}
@Nullable
private static Object getBooleanList(
String key, DeclarativeConfigProperties declarativeConfigProperties) {
return declarativeConfigProperties.getScalarList(key, Boolean.class);
}
@Nullable
private static Object getLongList(
String key, DeclarativeConfigProperties declarativeConfigProperties) {
return declarativeConfigProperties.getScalarList(key, Long.class);
}
@Nullable
private static Object getDoubleList(
String key, DeclarativeConfigProperties declarativeConfigProperties) {
return declarativeConfigProperties.getScalarList(key, Double.class);
}
@Nullable
private static Object getStructuredList(
String key, DeclarativeConfigProperties declarativeConfigProperties) {
return Optional.ofNullable(declarativeConfigProperties.getStructuredList(key))
.map(list -> list.stream().map(DeclarativeConfigPropertyUtil::toMap).collect(toList()))
.orElse(null);
}
@Nullable
private static Object getStructured(
String key, DeclarativeConfigProperties declarativeConfigProperties) {
return Optional.ofNullable(declarativeConfigProperties.getStructured(key))
.map(DeclarativeConfigPropertyUtil::toMap)
.orElse(null);
}
}

View File

@ -5,6 +5,7 @@
package io.opentelemetry.api.incubator.config;
import io.opentelemetry.common.ComponentLoader;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@ -15,6 +16,8 @@ final class EmptyDeclarativeConfigProperties implements DeclarativeConfigPropert
private static final EmptyDeclarativeConfigProperties INSTANCE =
new EmptyDeclarativeConfigProperties();
private static final ComponentLoader COMPONENT_LOADER =
ComponentLoader.forClassLoader(EmptyDeclarativeConfigProperties.class.getClassLoader());
private EmptyDeclarativeConfigProperties() {}
@ -74,4 +77,9 @@ final class EmptyDeclarativeConfigProperties implements DeclarativeConfigPropert
public Set<String> getPropertyKeys() {
return Collections.emptySet();
}
@Override
public ComponentLoader getComponentLoader() {
return COMPONENT_LOADER;
}
}

View File

@ -5,6 +5,7 @@
package io.opentelemetry.api.incubator.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -148,4 +149,49 @@ public class InstrumentationConfigUtil {
}
private InstrumentationConfigUtil() {}
/**
* Return {@code .instrumentation.java.<instrumentationName>}, after converting it to the {@code
* modelType} using the {@code objectMapper}. If no configuration exists for the {@code
* instrumentationName}, returns {@code null}.
*
* <p>This method is a convenience method for a common instrumentation library workflow:
*
* <ul>
* <li>During initialization, an instrumentation library is given an {@link ConfigProvider} and
* must initialize according to the relevant config
* <li>It checks if the user has provided configuration for it, and if so...
* <li>It converts the configuration to an in-memory model representing all of its relevant
* properties
* <li>It initializes using the strongly typed in-memory model
* </ul>
*
* <p>Conversion is done using {@link ObjectMapper#convertValue(Object, Class)} from {@code
* com.fasterxml.jackson.databind}, and assumes the {@code modelType} is a POJO written /
* annotated to support jackson databinding.
*
* <p>NOTE: callers MUST add their own dependency on {@code
* com.fasterxml.jackson.core:jackson-databind}. This module's dependency is {@code compileOnly}
* since jackson is a large dependency that many users will not require. It's very possible to
* convert between {@link DeclarativeConfigProperties} (or a map representation from {@link
* DeclarativeConfigProperties#toMap(DeclarativeConfigProperties)}) and a target model type
* without jackson. This method is provided as an optional convenience method.
*
* @throws IllegalArgumentException if conversion fails. See {@link
* ObjectMapper#convertValue(Object, Class)} for details.
*/
@Nullable
public static <T> T getInstrumentationConfigModel(
ConfigProvider configProvider,
String instrumentationName,
ObjectMapper objectMapper,
Class<T> modelType) {
DeclarativeConfigProperties properties =
javaInstrumentationConfig(configProvider, instrumentationName);
if (properties == null) {
return null;
}
Map<String, Object> configPropertiesMap = DeclarativeConfigProperties.toMap(properties);
return objectMapper.convertValue(configPropertiesMap, modelType);
}
}

View File

@ -27,6 +27,11 @@ class ExtendedDefaultLogger implements ExtendedLogger {
return INSTANCE;
}
@Override
public boolean isEnabled(Severity severity, Context context) {
return false;
}
@Override
public ExtendedLogRecordBuilder logRecordBuilder() {
return NOOP_LOG_RECORD_BUILDER;

View File

@ -6,21 +6,41 @@
package io.opentelemetry.api.incubator.logs;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.context.Context;
/** Extended {@link Logger} with experimental APIs. */
public interface ExtendedLogger extends Logger {
/**
* Returns {@code true} if the logger is enabled.
* Returns {@code true} if the logger is enabled for the given {@code context} and {@code
* severity}.
*
* <p>This allows callers to avoid unnecessary compute when nothing is consuming the data. Because
* the response is subject to change over the application, callers should call this before each
* call to {@link #logRecordBuilder()}.
*/
default boolean isEnabled() {
default boolean isEnabled(Severity severity, Context context) {
return true;
}
/** Overload of {@link #isEnabled(Severity, Context)} assuming {@link Context#current()}. */
default boolean isEnabled(Severity severity) {
return isEnabled(severity, Context.current());
}
/**
* Overload of {@link #isEnabled(Severity, Context)} assuming {@link
* Severity#UNDEFINED_SEVERITY_NUMBER} and {@link Context#current()}.
*
* @deprecated for removal after 1.55.0. Use {@link #isEnabled(Severity, Context)} or {@link
* #isEnabled(Severity)} instead.
*/
@Deprecated
default boolean isEnabled() {
return isEnabled(Severity.UNDEFINED_SEVERITY_NUMBER);
}
@Override
ExtendedLogRecordBuilder logRecordBuilder();
}

View File

@ -94,6 +94,11 @@ class ExtendedDefaultMeter implements Meter {
private ExtendedDefaultMeter() {}
private static class NoopLongCounter implements ExtendedLongCounter {
@Override
public boolean isEnabled() {
return false;
}
@Override
public void add(long value, Attributes attributes, Context context) {}
@ -105,6 +110,11 @@ class ExtendedDefaultMeter implements Meter {
}
private static class NoopDoubleCounter implements ExtendedDoubleCounter {
@Override
public boolean isEnabled() {
return false;
}
@Override
public void add(double value, Attributes attributes, Context context) {}
@ -186,6 +196,11 @@ class ExtendedDefaultMeter implements Meter {
}
private static class NoopLongUpDownCounter implements ExtendedLongUpDownCounter {
@Override
public boolean isEnabled() {
return false;
}
@Override
public void add(long value, Attributes attributes, Context context) {}
@ -197,6 +212,11 @@ class ExtendedDefaultMeter implements Meter {
}
private static class NoopDoubleUpDownCounter implements ExtendedDoubleUpDownCounter {
@Override
public boolean isEnabled() {
return false;
}
@Override
public void add(double value, Attributes attributes, Context context) {}
@ -281,6 +301,11 @@ class ExtendedDefaultMeter implements Meter {
}
private static class NoopDoubleHistogram implements ExtendedDoubleHistogram {
@Override
public boolean isEnabled() {
return false;
}
@Override
public void record(double value, Attributes attributes, Context context) {}
@ -292,6 +317,11 @@ class ExtendedDefaultMeter implements Meter {
}
private static class NoopLongHistogram implements ExtendedLongHistogram {
@Override
public boolean isEnabled() {
return false;
}
@Override
public void record(long value, Attributes attributes, Context context) {}
@ -385,6 +415,11 @@ class ExtendedDefaultMeter implements Meter {
}
private static class NoopDoubleGauge implements ExtendedDoubleGauge {
@Override
public boolean isEnabled() {
return false;
}
@Override
public void set(double value) {}
@ -426,6 +461,11 @@ class ExtendedDefaultMeter implements Meter {
}
private static class NoopLongGauge implements ExtendedLongGauge {
@Override
public boolean isEnabled() {
return false;
}
@Override
public void set(long value) {}

View File

@ -31,6 +31,11 @@ final class ExtendedDefaultTracer implements ExtendedTracer {
return INSTANCE;
}
@Override
public boolean isEnabled() {
return false;
}
@Override
public ExtendedSpanBuilder spanBuilder(String spanName) {
return NoopSpanBuilder.create();

View File

@ -150,7 +150,8 @@ class InstrumentationConfigUtilTest {
.isInstanceOfSatisfying(
YamlDeclarativeConfigProperties.class,
exampleConfig ->
assertThat(exampleConfig.toMap()).isEqualTo(ImmutableMap.of("property", "value")));
assertThat(DeclarativeConfigProperties.toMap(exampleConfig))
.isEqualTo(ImmutableMap.of("property", "value")));
assertThat(
InstrumentationConfigUtil.javaInstrumentationConfig(kitchenSinkConfigProvider, "foo"))
.isNull();

View File

@ -10,7 +10,9 @@ import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.api.common.Value;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.api.logs.LoggerProvider;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.testing.internal.AbstractDefaultLoggerTest;
import io.opentelemetry.context.Context;
import org.junit.jupiter.api.Test;
class ExtendedDefaultLoggerTest extends AbstractDefaultLoggerTest {
@ -26,10 +28,18 @@ class ExtendedDefaultLoggerTest extends AbstractDefaultLoggerTest {
}
@Test
@SuppressWarnings("deprecation") // testing deprecated code
void incubatingApiIsLoaded() {
Logger logger = LoggerProvider.noop().get("test");
assertThat(logger).isInstanceOf(ExtendedLogger.class);
assertThat(logger)
.isInstanceOfSatisfying(
ExtendedLogger.class,
extendedLogger -> {
assertThat(extendedLogger.isEnabled(Severity.ERROR, Context.current())).isFalse();
assertThat(extendedLogger.isEnabled(Severity.ERROR)).isFalse();
assertThat(extendedLogger.isEnabled()).isFalse();
});
ExtendedLogRecordBuilder builder = (ExtendedLogRecordBuilder) logger.logRecordBuilder();
assertThat(builder).isInstanceOf(ExtendedLogRecordBuilder.class);
assertThat(builder.setBody(Value.of(0))).isSameAs(builder);

View File

@ -14,6 +14,7 @@ import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.incubator.common.ExtendedAttributeKey;
import io.opentelemetry.api.incubator.common.ExtendedAttributes;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
@ -53,24 +54,26 @@ class ExtendedLogsBridgeApiUsageTest {
ExtendedLogger loggerB = (ExtendedLogger) loggerProvider.get("loggerB");
// Check if logger is enabled before emitting log and avoid unnecessary computation
if (loggerA.isEnabled()) {
if (loggerA.isEnabled(Severity.INFO)) {
loggerA
.logRecordBuilder()
.setSeverity(Severity.INFO)
.setBody("hello world!")
.setAllAttributes(Attributes.builder().put("result", flipCoin()).build())
.emit();
}
if (loggerB.isEnabled()) {
if (loggerB.isEnabled(Severity.INFO)) {
loggerB
.logRecordBuilder()
.setSeverity(Severity.INFO)
.setBody("hello world!")
.setAllAttributes(Attributes.builder().put("result", flipCoin()).build())
.emit();
}
// loggerA is enabled, loggerB is disabled
assertThat(loggerA.isEnabled()).isTrue();
assertThat(loggerB.isEnabled()).isFalse();
assertThat(loggerA.isEnabled(Severity.INFO)).isTrue();
assertThat(loggerB.isEnabled(Severity.INFO)).isFalse();
// Collected data only consists of logs from loggerA. Note, loggerB's logs would be
// omitted from the results even if logs were emitted. The check if enabled simply avoids

View File

@ -11,7 +11,6 @@ import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.api.testing.internal.AbstractDefaultMeterTest;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
class ExtendedDefaultMeterTest extends AbstractDefaultMeterTest {
@ -27,44 +26,53 @@ class ExtendedDefaultMeterTest extends AbstractDefaultMeterTest {
}
@Test
public void incubatingApiIsLoaded() {
void incubatingApiIsLoaded() {
Meter meter = MeterProvider.noop().get("test");
assertThat(meter).isSameAs(OpenTelemetry.noop().getMeter("test"));
Assertions.assertThat(meter.gaugeBuilder("test").ofLongs())
.isInstanceOf(ExtendedLongGaugeBuilder.class);
Assertions.assertThat(meter.gaugeBuilder("test").ofLongs().build())
.isInstanceOf(ExtendedLongGauge.class);
Assertions.assertThat(meter.gaugeBuilder("test"))
.isInstanceOf(ExtendedDoubleGaugeBuilder.class);
Assertions.assertThat(meter.gaugeBuilder("test").build())
.isInstanceOf(ExtendedDoubleGauge.class);
assertThat(meter.gaugeBuilder("test").ofLongs()).isInstanceOf(ExtendedLongGaugeBuilder.class);
assertThat(meter.gaugeBuilder("test").ofLongs().build())
.isInstanceOfSatisfying(
ExtendedLongGauge.class, instrument -> assertThat(instrument.isEnabled()).isFalse());
assertThat(meter.gaugeBuilder("test")).isInstanceOf(ExtendedDoubleGaugeBuilder.class);
assertThat(meter.gaugeBuilder("test").build())
.isInstanceOfSatisfying(
ExtendedDoubleGauge.class, instrument -> assertThat(instrument.isEnabled()).isFalse());
Assertions.assertThat(meter.histogramBuilder("test").ofLongs())
assertThat(meter.histogramBuilder("test").ofLongs())
.isInstanceOf(ExtendedLongHistogramBuilder.class);
Assertions.assertThat(meter.histogramBuilder("test").ofLongs().build())
.isInstanceOf(ExtendedLongHistogram.class);
Assertions.assertThat(meter.histogramBuilder("test"))
.isInstanceOf(ExtendedDoubleHistogramBuilder.class);
Assertions.assertThat(meter.histogramBuilder("test").build())
.isInstanceOf(ExtendedDoubleHistogram.class);
assertThat(meter.histogramBuilder("test").ofLongs().build())
.isInstanceOfSatisfying(
ExtendedLongHistogram.class,
instrument -> assertThat(instrument.isEnabled()).isFalse());
assertThat(meter.histogramBuilder("test")).isInstanceOf(ExtendedDoubleHistogramBuilder.class);
assertThat(meter.histogramBuilder("test").build())
.isInstanceOfSatisfying(
ExtendedDoubleHistogram.class,
instrument -> assertThat(instrument.isEnabled()).isFalse());
Assertions.assertThat(meter.counterBuilder("test"))
.isInstanceOf(ExtendedLongCounterBuilder.class);
Assertions.assertThat(meter.counterBuilder("test").build())
.isInstanceOf(ExtendedLongCounter.class);
Assertions.assertThat(meter.counterBuilder("test").ofDoubles())
assertThat(meter.counterBuilder("test")).isInstanceOf(ExtendedLongCounterBuilder.class);
assertThat(meter.counterBuilder("test").build())
.isInstanceOfSatisfying(
ExtendedLongCounter.class, instrument -> assertThat(instrument.isEnabled()).isFalse());
assertThat(meter.counterBuilder("test").ofDoubles())
.isInstanceOf(ExtendedDoubleCounterBuilder.class);
Assertions.assertThat(meter.counterBuilder("test").ofDoubles().build())
.isInstanceOf(ExtendedDoubleCounter.class);
assertThat(meter.counterBuilder("test").ofDoubles().build())
.isInstanceOfSatisfying(
ExtendedDoubleCounter.class,
instrument -> assertThat(instrument.isEnabled()).isFalse());
Assertions.assertThat(meter.upDownCounterBuilder("test"))
assertThat(meter.upDownCounterBuilder("test"))
.isInstanceOf(ExtendedLongUpDownCounterBuilder.class);
Assertions.assertThat(meter.upDownCounterBuilder("test").build())
.isInstanceOf(ExtendedLongUpDownCounter.class);
Assertions.assertThat(meter.upDownCounterBuilder("test").ofDoubles())
assertThat(meter.upDownCounterBuilder("test").build())
.isInstanceOfSatisfying(
ExtendedLongUpDownCounter.class,
instrument -> assertThat(instrument.isEnabled()).isFalse());
assertThat(meter.upDownCounterBuilder("test").ofDoubles())
.isInstanceOf(ExtendedDoubleUpDownCounterBuilder.class);
Assertions.assertThat(meter.upDownCounterBuilder("test").ofDoubles().build())
.isInstanceOf(ExtendedDoubleUpDownCounter.class);
assertThat(meter.upDownCounterBuilder("test").ofDoubles().build())
.isInstanceOfSatisfying(
ExtendedDoubleUpDownCounter.class,
instrument -> assertThat(instrument.isEnabled()).isFalse());
}
}

View File

@ -6,6 +6,8 @@
package io.opentelemetry.api.incubator.trace;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.testing.internal.AbstractDefaultTracerTest;
@ -27,17 +29,20 @@ class ExtendedDefaultTracerTest extends AbstractDefaultTracerTest {
}
@Test
public void incubatingApiIsLoaded() {
void incubatingApiIsLoaded() {
Tracer tracer = TracerProvider.noop().get("test");
assertThat(tracer).isSameAs(OpenTelemetry.noop().getTracer("test"));
assertThat(tracer).isInstanceOf(ExtendedTracer.class);
assertThat(tracer)
.isInstanceOfSatisfying(
ExtendedTracer.class,
extendedTracer -> assertThat(extendedTracer.isEnabled()).isFalse());
assertThat(tracer.spanBuilder("test")).isInstanceOf(ExtendedSpanBuilder.class);
}
@SuppressWarnings("unchecked")
@Test
public void incubatingApi() {
void incubatingApi() {
ExtendedSpanBuilder spanBuilder =
(ExtendedSpanBuilder) ExtendedDefaultTracer.getNoop().spanBuilder("test");
assertThat(spanBuilder.setParentFrom(null, null)).isSameAs(spanBuilder);
@ -45,21 +50,21 @@ class ExtendedDefaultTracerTest extends AbstractDefaultTracerTest {
SpanRunnable<RuntimeException> spanRunnable = Mockito.mock(SpanRunnable.class);
spanBuilder.startAndRun(spanRunnable);
Mockito.verify(spanRunnable).runInSpan();
Mockito.reset(spanRunnable);
verify(spanRunnable).runInSpan();
reset(spanRunnable);
spanBuilder.startAndRun(spanRunnable, null);
Mockito.verify(spanRunnable).runInSpan();
Mockito.reset(spanRunnable);
verify(spanRunnable).runInSpan();
reset(spanRunnable);
SpanCallable<String, RuntimeException> spanCallable = Mockito.mock(SpanCallable.class);
spanBuilder.startAndCall(spanCallable);
Mockito.verify(spanCallable).callInSpan();
Mockito.reset(spanCallable);
verify(spanCallable).callInSpan();
reset(spanCallable);
spanBuilder.startAndCall(spanCallable, null);
Mockito.verify(spanCallable).callInSpan();
Mockito.reset(spanCallable);
verify(spanCallable).callInSpan();
reset(spanCallable);
}
}

View File

@ -0,0 +1,259 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.api.incubator;
import static org.assertj.core.api.Assertions.assertThat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableMap;
import io.opentelemetry.api.incubator.config.ConfigProvider;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil;
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLanguageSpecificInstrumentationModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.InstrumentationModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.junit.jupiter.api.Test;
class InstrumentationConfigUtilTest {
private static final ObjectMapper MAPPER = new ObjectMapper();
@Test
void toMap_RoundTrip() throws JsonProcessingException {
Map<String, Object> map = new HashMap<>();
map.put("string", "val");
map.put("boolean", true);
map.put("long", 1L);
map.put("double", 1.1);
map.put("null", null);
map.put("stringList", Arrays.asList("val1", "val2"));
map.put("boolList", Arrays.asList(true, false));
map.put("longList", Arrays.asList(1L, 2L));
map.put("doubleList", Arrays.asList(1.1d, 2.2d));
map.put(
"structuredList", Collections.singletonList(Collections.singletonMap("childKey", "val")));
map.put("emptyList", Collections.emptyList());
map.put("structured", Collections.singletonMap("childKey", "val"));
map.put("emptyStructured", Collections.emptyMap());
String mapJson = MAPPER.writeValueAsString(map);
DeclarativeConfigProperties properties =
DeclarativeConfiguration.toConfigProperties(
new ByteArrayInputStream(mapJson.getBytes(StandardCharsets.UTF_8)));
assertThat(DeclarativeConfigProperties.toMap(properties)).isEqualTo(map);
}
@Test
void getInstrumentationConfigModel_UnsetConfig() {
ConfigProvider configProvider = () -> null;
assertThat(
InstrumentationConfigUtil.getInstrumentationConfigModel(
configProvider, "my_instrumentation_library", MAPPER, Model.class))
.isEqualTo(null);
}
@Test
void getInstrumentationConfigModel_EmptyConfig() {
ConfigProvider configProvider =
withInstrumentationConfig("my_instrumentation_library", Collections.emptyMap());
assertThat(
InstrumentationConfigUtil.getInstrumentationConfigModel(
configProvider, "my_instrumentation_library", MAPPER, Model.class))
.isEqualTo(new Model());
}
@Test
void getInstrumentationConfigModel_KitchenSink() {
ConfigProvider configProvider =
withInstrumentationConfig(
"my_instrumentation_library",
ImmutableMap.<String, Object>builder()
.put("string_property", "value")
.put("boolean_property", true)
.put("long_property", 1L)
.put("double_property", 1.1d)
.put("string_list_property", Arrays.asList("val1", "val2"))
.put("boolean_list_property", Arrays.asList(true, false))
.put("long_list_property", Arrays.asList(1L, 2L))
.put("double_list_property", Arrays.asList(1.1d, 2.2d))
.put("map_property", Collections.singletonMap("childKey", "val"))
.put(
"structured_list_property",
Collections.singletonList(
ImmutableMap.of("key", "the_key", "value", "the_value")))
.build());
Model expected = new Model();
expected.stringProperty = "value";
expected.booleanProperty = true;
expected.longProperty = 1L;
expected.doubleProperty = 1.1d;
expected.stringListProperty = Arrays.asList("val1", "val2");
expected.booleanListProperty = Arrays.asList(true, false);
expected.longListProperty = Arrays.asList(1L, 2L);
expected.doubleListProperty = Arrays.asList(1.1d, 2.2d);
expected.mapProperty = Collections.singletonMap("childKey", "val");
ListEntryModel listEntryModel = new ListEntryModel();
listEntryModel.key = "the_key";
listEntryModel.value = "the_value";
expected.structuredListProperty = Collections.singletonList(listEntryModel);
assertThat(
InstrumentationConfigUtil.getInstrumentationConfigModel(
configProvider, "my_instrumentation_library", MAPPER, Model.class))
.isEqualTo(expected);
}
private static ConfigProvider withInstrumentationConfig(
String instrumentationName, Map<String, Object> instrumentationConfig) {
ExperimentalLanguageSpecificInstrumentationModel javaConfig =
new ExperimentalLanguageSpecificInstrumentationModel();
javaConfig.setAdditionalProperty(instrumentationName, instrumentationConfig);
return SdkConfigProvider.create(
new OpenTelemetryConfigurationModel()
.withInstrumentationDevelopment(new InstrumentationModel().withJava(javaConfig)));
}
private static class Model {
@JsonProperty("string_property")
private String stringProperty;
@JsonProperty("boolean_property")
private Boolean booleanProperty;
@JsonProperty("long_property")
private Long longProperty;
@JsonProperty("double_property")
private Double doubleProperty;
@JsonProperty("string_list_property")
private List<String> stringListProperty;
@JsonProperty("boolean_list_property")
private List<Boolean> booleanListProperty;
@JsonProperty("long_list_property")
private List<Long> longListProperty;
@JsonProperty("double_list_property")
private List<Double> doubleListProperty;
;
@JsonProperty("map_property")
private Map<String, Object> mapProperty;
@JsonProperty("structured_list_property")
private List<ListEntryModel> structuredListProperty;
@Override
public boolean equals(Object o) {
if (!(o instanceof Model)) {
return false;
}
Model model = (Model) o;
return Objects.equals(stringProperty, model.stringProperty)
&& Objects.equals(booleanProperty, model.booleanProperty)
&& Objects.equals(longProperty, model.longProperty)
&& Objects.equals(doubleProperty, model.doubleProperty)
&& Objects.equals(stringListProperty, model.stringListProperty)
&& Objects.equals(booleanListProperty, model.booleanListProperty)
&& Objects.equals(longListProperty, model.longListProperty)
&& Objects.equals(doubleListProperty, model.doubleListProperty)
&& Objects.equals(mapProperty, model.mapProperty)
&& Objects.equals(structuredListProperty, model.structuredListProperty);
}
@Override
public int hashCode() {
return Objects.hash(
stringProperty,
booleanProperty,
longProperty,
doubleProperty,
stringListProperty,
booleanListProperty,
longListProperty,
doubleListProperty,
mapProperty,
structuredListProperty);
}
@Override
public String toString() {
return "Model{"
+ "stringProperty='"
+ stringProperty
+ '\''
+ ", booleanProperty='"
+ booleanProperty
+ '\''
+ ", longProperty='"
+ longProperty
+ '\''
+ ", doubleProperty='"
+ doubleProperty
+ '\''
+ ", stringListProperty="
+ stringListProperty
+ ", booleanListProperty="
+ booleanListProperty
+ ", longListProperty="
+ longListProperty
+ ", doubleListProperty="
+ doubleListProperty
+ ", mapProperty="
+ mapProperty
+ ", structuredListProperty="
+ structuredListProperty
+ '}';
}
}
private static final class ListEntryModel {
@JsonProperty("key")
private String key;
@JsonProperty("value")
private String value;
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
ListEntryModel that = (ListEntryModel) o;
return Objects.equals(key, that.key) && Objects.equals(value, that.value);
}
@Override
public int hashCode() {
return Objects.hash(key, value);
}
@Override
public String toString() {
return "ListEntryModel{" + "key='" + key + '\'' + ", value='" + value + '\'' + '}';
}
}
}

View File

@ -2,7 +2,7 @@ plugins {
`kotlin-dsl`
// When updating, update below in dependencies too
id("com.diffplug.spotless") version "7.0.4"
id("com.diffplug.spotless") version "7.1.0"
}
if (!hasLauncherForJavaVersion(17)) {
@ -50,10 +50,10 @@ repositories {
}
dependencies {
implementation(enforcedPlatform("com.squareup.wire:wire-bom:5.3.3"))
implementation(enforcedPlatform("com.squareup.wire:wire-bom:5.3.5"))
implementation("com.google.auto.value:auto-value-annotations:1.11.0")
// When updating, update above in plugins too
implementation("com.diffplug.spotless:spotless-plugin-gradle:7.0.4")
implementation("com.diffplug.spotless:spotless-plugin-gradle:7.1.0")
implementation("com.gradle.develocity:com.gradle.develocity.gradle.plugin:4.0.2")
implementation("com.squareup:javapoet:1.13.0")
implementation("com.squareup.wire:wire-compiler")

View File

@ -42,7 +42,7 @@ java {
checkstyle {
configDirectory.set(file("$rootDir/buildscripts/"))
toolVersion = "10.26.0"
toolVersion = "10.26.1"
isIgnoreFailures = false
configProperties["rootDir"] = rootDir
}

12
common/build.gradle.kts Normal file
View File

@ -0,0 +1,12 @@
plugins {
id("otel.java-conventions")
id("otel.publish-conventions")
id("otel.animalsniffer-conventions")
}
description = "OpenTelemetry API Common"
otelJava.moduleName.set("io.opentelemetry.common")
dependencies {
}

View File

@ -0,0 +1,28 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.common;
import java.util.ServiceLoader;
/** A loader for components that are discovered via SPI. */
public interface ComponentLoader {
/**
* Load implementations of an SPI.
*
* @param spiClass the SPI class
* @param <T> the SPI type
* @return iterable of SPI implementations
*/
<T> Iterable<T> load(Class<T> spiClass);
/**
* Create an instance for the {@code classLoader} using {@link ServiceLoader#load(Class,
* ClassLoader)}.
*/
static ComponentLoader forClassLoader(ClassLoader classLoader) {
return new ServiceLoaderComponentLoader(classLoader);
}
}

View File

@ -0,0 +1,27 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.common;
import java.util.ServiceLoader;
class ServiceLoaderComponentLoader implements ComponentLoader {
private final ClassLoader classLoader;
ServiceLoaderComponentLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
@Override
public <T> Iterable<T> load(Class<T> spiClass) {
return ServiceLoader.load(spiClass, classLoader);
}
@Override
public String toString() {
return "ServiceLoaderComponentLoader{classLoader=" + classLoader + "}";
}
}

View File

@ -10,6 +10,7 @@ description = "OpenTelemetry Context (Incubator)"
otelJava.moduleName.set("io.opentelemetry.context")
dependencies {
api(project(":common"))
// MustBeClosed
compileOnly("com.google.errorprone:error_prone_annotations")

View File

@ -37,9 +37,9 @@
package io.opentelemetry.context;
import io.opentelemetry.common.ComponentLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.logging.Level;
@ -103,9 +103,10 @@ final class LazyStorage {
return ContextStorage.defaultStorage();
}
ComponentLoader componentLoader =
ComponentLoader.forClassLoader(LazyStorage.class.getClassLoader());
List<ContextStorageProvider> providers = new ArrayList<>();
for (ContextStorageProvider provider :
ServiceLoader.load(ContextStorageProvider.class, LazyStorage.class.getClassLoader())) {
for (ContextStorageProvider provider : componentLoader.load(ContextStorageProvider.class)) {
if (provider
.getClass()
.getName()

View File

@ -16,14 +16,14 @@ val DEPENDENCY_BOMS = listOf(
"com.fasterxml.jackson:jackson-bom:2.19.1",
"com.google.guava:guava-bom:33.4.8-jre",
"com.google.protobuf:protobuf-bom:4.31.1",
"com.squareup.okhttp3:okhttp-bom:4.12.0",
"com.squareup.okio:okio-bom:3.13.0", // applies to transitive dependencies of okhttp
"com.squareup.okhttp3:okhttp-bom:5.1.0",
"com.squareup.okio:okio-bom:3.15.0", // applies to transitive dependencies of okhttp
"io.grpc:grpc-bom:1.73.0",
"io.netty:netty-bom:4.2.2.Final",
"io.zipkin.brave:brave-bom:6.3.0",
"io.zipkin.reporter2:zipkin-reporter-bom:3.5.1",
"org.assertj:assertj-bom:3.27.3",
"org.testcontainers:testcontainers-bom:1.21.2",
"org.testcontainers:testcontainers-bom:1.21.3",
"org.snakeyaml:snakeyaml-engine:2.9"
)
@ -68,7 +68,7 @@ val DEPENDENCIES = listOf(
"io.prometheus:prometheus-metrics-exposition-formats-no-protobuf:${prometheusServerVersion}",
"javax.annotation:javax.annotation-api:1.3.2",
"com.github.stefanbirkner:system-rules:1.19.0",
"com.google.api.grpc:proto-google-common-protos:2.58.2",
"com.google.api.grpc:proto-google-common-protos:2.59.1",
"com.google.code.findbugs:jsr305:3.0.2",
"com.google.guava:guava-beta-checker:1.0",
"com.sun.net.httpserver:http:20070405",
@ -78,7 +78,7 @@ val DEPENDENCIES = listOf(
"eu.rekawek.toxiproxy:toxiproxy-java:2.1.7",
"io.github.netmikey.logunit:logunit-jul:2.0.0",
"io.jaegertracing:jaeger-client:1.8.1",
"io.opentelemetry.contrib:opentelemetry-aws-xray-propagator:1.46.0-alpha",
"io.opentelemetry.contrib:opentelemetry-aws-xray-propagator:1.47.0-alpha",
"io.opentelemetry.semconv:opentelemetry-semconv-incubating:1.34.0-alpha",
"io.opentelemetry.proto:opentelemetry-proto:1.7.0-alpha",
"io.opentracing:opentracing-api:0.33.0",

View File

@ -0,0 +1,4 @@
Comparing source compatibility of opentelemetry-api-1.52.0.jar against opentelemetry-api-1.51.0.jar
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.api.GlobalOpenTelemetry (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) STATIC(+) void set(java.util.function.Supplier<io.opentelemetry.api.OpenTelemetry>)

View File

@ -0,0 +1,7 @@
Comparing source compatibility of opentelemetry-common-1.52.0.jar against
+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.common.ComponentLoader (not serializable)
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
+++ NEW SUPERCLASS: java.lang.Object
+++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.common.ComponentLoader forClassLoader(java.lang.ClassLoader)
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.Iterable<T> load(java.lang.Class<T>)
GENERIC TEMPLATES: +++ T:java.lang.Object

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-context-1.52.0.jar against opentelemetry-context-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-common-1.52.0.jar against opentelemetry-exporter-common-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-logging-otlp-1.52.0.jar against opentelemetry-exporter-logging-otlp-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-logging-1.52.0.jar against opentelemetry-exporter-logging-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-otlp-common-1.52.0.jar against opentelemetry-exporter-otlp-common-1.51.0.jar
No changes.

View File

@ -0,0 +1,19 @@
Comparing source compatibility of opentelemetry-exporter-otlp-1.52.0.jar against opentelemetry-exporter-otlp-1.51.0.jar
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder setComponentLoader(io.opentelemetry.common.ComponentLoader)
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder setComponentLoader(io.opentelemetry.common.ComponentLoader)
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder setComponentLoader(io.opentelemetry.common.ComponentLoader)
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder setComponentLoader(io.opentelemetry.common.ComponentLoader)
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder setComponentLoader(io.opentelemetry.common.ComponentLoader)
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder setComponentLoader(io.opentelemetry.common.ComponentLoader)

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-sender-grpc-managed-channel-1.52.0.jar against opentelemetry-exporter-sender-grpc-managed-channel-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-sender-jdk-1.52.0.jar against opentelemetry-exporter-sender-jdk-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-sender-okhttp-1.52.0.jar against opentelemetry-exporter-sender-okhttp-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-zipkin-1.52.0.jar against opentelemetry-exporter-zipkin-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-extension-kotlin-1.52.0.jar against opentelemetry-extension-kotlin-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-extension-trace-propagators-1.52.0.jar against opentelemetry-extension-trace-propagators-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-opentracing-shim-1.52.0.jar against opentelemetry-opentracing-shim-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-common-1.52.0.jar against opentelemetry-sdk-common-1.51.0.jar
No changes.

View File

@ -0,0 +1,4 @@
Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-spi-1.52.0.jar against opentelemetry-sdk-extension-autoconfigure-spi-1.51.0.jar
*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.common.ComponentLoader getComponentLoader()

View File

@ -0,0 +1,4 @@
Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-1.52.0.jar against opentelemetry-sdk-extension-autoconfigure-1.51.0.jar
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder setComponentLoader(io.opentelemetry.common.ComponentLoader)

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-extension-jaeger-remote-sampler-1.52.0.jar against opentelemetry-sdk-extension-jaeger-remote-sampler-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-logs-1.52.0.jar against opentelemetry-sdk-logs-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-metrics-1.52.0.jar against opentelemetry-sdk-metrics-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-testing-1.52.0.jar against opentelemetry-sdk-testing-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-trace-1.52.0.jar against opentelemetry-sdk-trace-1.51.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-1.52.0.jar against opentelemetry-sdk-1.51.0.jar
No changes.

View File

@ -1,4 +1,2 @@
Comparing source compatibility of opentelemetry-api-1.52.0-SNAPSHOT.jar against opentelemetry-api-1.51.0.jar
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.api.GlobalOpenTelemetry (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) STATIC(+) void set(java.util.function.Supplier<io.opentelemetry.api.OpenTelemetry>)
Comparing source compatibility of opentelemetry-api-1.53.0-SNAPSHOT.jar against opentelemetry-api-1.52.0.jar
No changes.

View File

@ -0,0 +1,2 @@
Comparing source compatibility of opentelemetry-common-1.53.0-SNAPSHOT.jar against opentelemetry-common-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-context-1.52.0-SNAPSHOT.jar against opentelemetry-context-1.51.0.jar
Comparing source compatibility of opentelemetry-context-1.53.0-SNAPSHOT.jar against opentelemetry-context-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-common-1.52.0-SNAPSHOT.jar against opentelemetry-exporter-common-1.51.0.jar
Comparing source compatibility of opentelemetry-exporter-common-1.53.0-SNAPSHOT.jar against opentelemetry-exporter-common-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-logging-1.52.0-SNAPSHOT.jar against opentelemetry-exporter-logging-1.51.0.jar
Comparing source compatibility of opentelemetry-exporter-logging-1.53.0-SNAPSHOT.jar against opentelemetry-exporter-logging-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-otlp-common-1.52.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-common-1.51.0.jar
Comparing source compatibility of opentelemetry-exporter-otlp-common-1.53.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-common-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-otlp-1.52.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-1.51.0.jar
Comparing source compatibility of opentelemetry-exporter-otlp-1.53.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-sender-grpc-managed-channel-1.52.0-SNAPSHOT.jar against opentelemetry-exporter-sender-grpc-managed-channel-1.51.0.jar
Comparing source compatibility of opentelemetry-exporter-sender-grpc-managed-channel-1.53.0-SNAPSHOT.jar against opentelemetry-exporter-sender-grpc-managed-channel-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-sender-jdk-1.52.0-SNAPSHOT.jar against opentelemetry-exporter-sender-jdk-1.51.0.jar
Comparing source compatibility of opentelemetry-exporter-sender-jdk-1.53.0-SNAPSHOT.jar against opentelemetry-exporter-sender-jdk-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-sender-okhttp-1.52.0-SNAPSHOT.jar against opentelemetry-exporter-sender-okhttp-1.51.0.jar
Comparing source compatibility of opentelemetry-exporter-sender-okhttp-1.53.0-SNAPSHOT.jar against opentelemetry-exporter-sender-okhttp-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-exporter-zipkin-1.52.0-SNAPSHOT.jar against opentelemetry-exporter-zipkin-1.51.0.jar
Comparing source compatibility of opentelemetry-exporter-zipkin-1.53.0-SNAPSHOT.jar against opentelemetry-exporter-zipkin-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-extension-kotlin-1.52.0-SNAPSHOT.jar against opentelemetry-extension-kotlin-1.51.0.jar
Comparing source compatibility of opentelemetry-extension-kotlin-1.53.0-SNAPSHOT.jar against opentelemetry-extension-kotlin-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-extension-trace-propagators-1.52.0-SNAPSHOT.jar against opentelemetry-extension-trace-propagators-1.51.0.jar
Comparing source compatibility of opentelemetry-extension-trace-propagators-1.53.0-SNAPSHOT.jar against opentelemetry-extension-trace-propagators-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-opentracing-shim-1.52.0-SNAPSHOT.jar against opentelemetry-opentracing-shim-1.51.0.jar
Comparing source compatibility of opentelemetry-opentracing-shim-1.53.0-SNAPSHOT.jar against opentelemetry-opentracing-shim-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-common-1.52.0-SNAPSHOT.jar against opentelemetry-sdk-common-1.51.0.jar
Comparing source compatibility of opentelemetry-sdk-common-1.53.0-SNAPSHOT.jar against opentelemetry-sdk-common-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-spi-1.52.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-spi-1.51.0.jar
Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-spi-1.53.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-spi-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-1.52.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-1.51.0.jar
Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-1.53.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-extension-jaeger-remote-sampler-1.52.0-SNAPSHOT.jar against opentelemetry-sdk-extension-jaeger-remote-sampler-1.51.0.jar
Comparing source compatibility of opentelemetry-sdk-extension-jaeger-remote-sampler-1.53.0-SNAPSHOT.jar against opentelemetry-sdk-extension-jaeger-remote-sampler-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-logs-1.52.0-SNAPSHOT.jar against opentelemetry-sdk-logs-1.51.0.jar
Comparing source compatibility of opentelemetry-sdk-logs-1.53.0-SNAPSHOT.jar against opentelemetry-sdk-logs-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-metrics-1.52.0-SNAPSHOT.jar against opentelemetry-sdk-metrics-1.51.0.jar
Comparing source compatibility of opentelemetry-sdk-metrics-1.53.0-SNAPSHOT.jar against opentelemetry-sdk-metrics-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-testing-1.52.0-SNAPSHOT.jar against opentelemetry-sdk-testing-1.51.0.jar
Comparing source compatibility of opentelemetry-sdk-testing-1.53.0-SNAPSHOT.jar against opentelemetry-sdk-testing-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-trace-1.52.0-SNAPSHOT.jar against opentelemetry-sdk-trace-1.51.0.jar
Comparing source compatibility of opentelemetry-sdk-trace-1.53.0-SNAPSHOT.jar against opentelemetry-sdk-trace-1.52.0.jar
No changes.

View File

@ -1,2 +1,2 @@
Comparing source compatibility of opentelemetry-sdk-1.52.0-SNAPSHOT.jar against opentelemetry-sdk-1.51.0.jar
Comparing source compatibility of opentelemetry-sdk-1.53.0-SNAPSHOT.jar against opentelemetry-sdk-1.52.0.jar
No changes.

View File

@ -8,9 +8,9 @@ package io.opentelemetry.exporter.internal.compression;
import static io.opentelemetry.api.internal.Utils.checkArgument;
import static java.util.stream.Collectors.joining;
import io.opentelemetry.common.ComponentLoader;
import java.util.HashMap;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.Set;
import javax.annotation.Nullable;
@ -24,7 +24,9 @@ import javax.annotation.Nullable;
*/
public final class CompressorUtil {
private static final Map<String, Compressor> compressorRegistry = buildCompressorRegistry();
private static final Map<String, Compressor> compressorRegistry =
buildCompressorRegistry(
ComponentLoader.forClassLoader(CompressorUtil.class.getClassLoader()));
private CompressorUtil() {}
@ -36,8 +38,26 @@ public final class CompressorUtil {
*/
@Nullable
public static Compressor validateAndResolveCompressor(String compressionMethod) {
Set<String> supportedEncodings = compressorRegistry.keySet();
Compressor compressor = compressorRegistry.get(compressionMethod);
return validateAndResolveCompressor(compressionMethod, null);
}
/**
* Validate that the {@code compressionMethod} is "none" or matches a registered compressor.
*
* @param compressionMethod the compression method to validate and resolve
* @param componentLoader the component loader to use for loading SPI implementations, or null to
* use the default
* @return {@code null} if {@code compressionMethod} is "none" or the registered compressor
* @throws IllegalArgumentException if no match is found
*/
@Nullable
public static Compressor validateAndResolveCompressor(
String compressionMethod, @Nullable ComponentLoader componentLoader) {
Map<String, Compressor> registry =
componentLoader == null ? compressorRegistry : buildCompressorRegistry(componentLoader);
Set<String> supportedEncodings = registry.keySet();
Compressor compressor = registry.get(compressionMethod);
checkArgument(
"none".equals(compressionMethod) || compressor != null,
"Unsupported compressionMethod. Compression method must be \"none\" or one of: "
@ -45,10 +65,9 @@ public final class CompressorUtil {
return compressor;
}
private static Map<String, Compressor> buildCompressorRegistry() {
private static Map<String, Compressor> buildCompressorRegistry(ComponentLoader componentLoader) {
Map<String, Compressor> compressors = new HashMap<>();
for (CompressorProvider spi :
ServiceLoader.load(CompressorProvider.class, CompressorUtil.class.getClassLoader())) {
for (CompressorProvider spi : componentLoader.load(CompressorProvider.class)) {
Compressor compressor = spi.getInstance();
compressors.put(compressor.getEncoding(), compressor);
}

View File

@ -10,9 +10,12 @@ import io.grpc.ManagedChannel;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.internal.ConfigUtil;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
import io.opentelemetry.exporter.internal.TlsConfigHelper;
import io.opentelemetry.exporter.internal.compression.Compressor;
import io.opentelemetry.exporter.internal.compression.CompressorProvider;
import io.opentelemetry.exporter.internal.compression.CompressorUtil;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.sdk.common.InternalTelemetryVersion;
import io.opentelemetry.sdk.common.export.RetryPolicy;
@ -26,7 +29,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.StringJoiner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
@ -67,7 +69,8 @@ public class GrpcExporterBuilder<T extends Marshaler> {
private Supplier<MeterProvider> meterProviderSupplier = GlobalOpenTelemetry::getMeterProvider;
private InternalTelemetryVersion internalTelemetryVersion = InternalTelemetryVersion.LEGACY;
private ClassLoader serviceClassLoader = GrpcExporterBuilder.class.getClassLoader();
private ComponentLoader componentLoader =
ComponentLoader.forClassLoader(GrpcExporterBuilder.class.getClassLoader());
@Nullable private ExecutorService executorService;
// Use Object type since gRPC may not be on the classpath.
@ -115,6 +118,17 @@ public class GrpcExporterBuilder<T extends Marshaler> {
return this;
}
/**
* Sets the method used to compress payloads. If unset, compression is disabled. Compression
* method "gzip" and "none" are supported out of the box. Support for additional compression
* methods is available by implementing {@link Compressor} and {@link CompressorProvider}.
*/
public GrpcExporterBuilder<T> setCompression(String compressionMethod) {
Compressor compressor =
CompressorUtil.validateAndResolveCompressor(compressionMethod, componentLoader);
return setCompression(compressor);
}
public GrpcExporterBuilder<T> setTrustManagerFromCerts(byte[] trustedCertificatesPem) {
tlsConfigHelper.setTrustManagerFromCerts(trustedCertificatesPem);
return this;
@ -158,8 +172,8 @@ public class GrpcExporterBuilder<T extends Marshaler> {
return this;
}
public GrpcExporterBuilder<T> setServiceClassLoader(ClassLoader servieClassLoader) {
this.serviceClassLoader = servieClassLoader;
public GrpcExporterBuilder<T> setComponentLoader(ComponentLoader componentLoader) {
this.componentLoader = componentLoader;
return this;
}
@ -268,7 +282,7 @@ public class GrpcExporterBuilder<T extends Marshaler> {
if (grpcChannel != null) {
joiner.add("grpcChannel=" + grpcChannel);
}
joiner.add("serviceClassLoader=" + serviceClassLoader);
joiner.add("componentLoader=" + componentLoader);
if (executorService != null) {
joiner.add("executorService=" + executorService);
}
@ -302,8 +316,7 @@ public class GrpcExporterBuilder<T extends Marshaler> {
*/
private GrpcSenderProvider resolveGrpcSenderProvider() {
Map<String, GrpcSenderProvider> grpcSenderProviders = new HashMap<>();
for (GrpcSenderProvider spi :
ServiceLoader.load(GrpcSenderProvider.class, serviceClassLoader)) {
for (GrpcSenderProvider spi : componentLoader.load(GrpcSenderProvider.class)) {
grpcSenderProviders.put(spi.getClass().getName(), spi);
}

View File

@ -8,9 +8,12 @@ package io.opentelemetry.exporter.internal.http;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.internal.ConfigUtil;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
import io.opentelemetry.exporter.internal.TlsConfigHelper;
import io.opentelemetry.exporter.internal.compression.Compressor;
import io.opentelemetry.exporter.internal.compression.CompressorProvider;
import io.opentelemetry.exporter.internal.compression.CompressorUtil;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.sdk.common.InternalTelemetryVersion;
import io.opentelemetry.sdk.common.export.ProxyOptions;
@ -24,7 +27,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.StringJoiner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
@ -64,7 +66,8 @@ public final class HttpExporterBuilder<T extends Marshaler> {
@Nullable private RetryPolicy retryPolicy = RetryPolicy.getDefault();
private Supplier<MeterProvider> meterProviderSupplier = GlobalOpenTelemetry::getMeterProvider;
private InternalTelemetryVersion internalTelemetryVersion = InternalTelemetryVersion.LEGACY;
private ClassLoader serviceClassLoader = HttpExporterBuilder.class.getClassLoader();
private ComponentLoader componentLoader =
ComponentLoader.forClassLoader(HttpExporterBuilder.class.getClassLoader());
@Nullable private ExecutorService executorService;
public HttpExporterBuilder(
@ -95,6 +98,17 @@ public final class HttpExporterBuilder<T extends Marshaler> {
return this;
}
/**
* Sets the method used to compress payloads. If unset, compression is disabled. Compression
* method "gzip" and "none" are supported out of the box. Support for additional compression
* methods is available by implementing {@link Compressor} and {@link CompressorProvider}.
*/
public HttpExporterBuilder<T> setCompression(String compressionMethod) {
Compressor compressor =
CompressorUtil.validateAndResolveCompressor(compressionMethod, componentLoader);
return setCompression(compressor);
}
public HttpExporterBuilder<T> addConstantHeaders(String key, String value) {
constantHeaders.put(key, value);
return this;
@ -143,8 +157,8 @@ public final class HttpExporterBuilder<T extends Marshaler> {
return this;
}
public HttpExporterBuilder<T> setServiceClassLoader(ClassLoader servieClassLoader) {
this.serviceClassLoader = servieClassLoader;
public HttpExporterBuilder<T> setComponentLoader(ComponentLoader componentLoader) {
this.componentLoader = componentLoader;
return this;
}
@ -265,7 +279,7 @@ public final class HttpExporterBuilder<T extends Marshaler> {
if (retryPolicy != null) {
joiner.add("retryPolicy=" + retryPolicy);
}
joiner.add("serviceClassLoader=" + serviceClassLoader);
joiner.add("componentLoader=" + componentLoader);
if (executorService != null) {
joiner.add("executorService=" + executorService);
}
@ -299,8 +313,7 @@ public final class HttpExporterBuilder<T extends Marshaler> {
*/
private HttpSenderProvider resolveHttpSenderProvider() {
Map<String, HttpSenderProvider> httpSenderProviders = new HashMap<>();
for (HttpSenderProvider spi :
ServiceLoader.load(HttpSenderProvider.class, serviceClassLoader)) {
for (HttpSenderProvider spi : componentLoader.load(HttpSenderProvider.class)) {
httpSenderProviders.put(spi.getClass().getName(), spi);
}

View File

@ -0,0 +1,87 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.exporter.internal.compression;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import io.opentelemetry.common.ComponentLoader;
import java.net.URL;
import java.net.URLClassLoader;
import org.junit.jupiter.api.Test;
class CompressorUtilTest {
private final ComponentLoader componentLoader =
ComponentLoader.forClassLoader(CompressorUtilTest.class.getClassLoader());
@Test
void validateAndResolveCompressor_none() {
assertThat(CompressorUtil.validateAndResolveCompressor("none")).isNull();
}
@Test
void validateAndResolveCompressor_gzip() {
assertThat(CompressorUtil.validateAndResolveCompressor("gzip"))
.isEqualTo(GzipCompressor.getInstance());
}
@Test
void validateAndResolveCompressor_invalid() {
assertThatThrownBy(() -> CompressorUtil.validateAndResolveCompressor("invalid"))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("Unsupported compressionMethod");
}
@Test
void validateAndResolveCompressor_withClassLoader_none() {
assertThat(CompressorUtil.validateAndResolveCompressor("none", componentLoader)).isNull();
}
@Test
void validateAndResolveCompressor_withClassLoader_gzip() {
assertThat(CompressorUtil.validateAndResolveCompressor("gzip", componentLoader))
.isEqualTo(GzipCompressor.getInstance());
}
@Test
void validateAndResolveCompressor_withClassLoader_invalid() {
assertThatThrownBy(
() -> CompressorUtil.validateAndResolveCompressor("invalid", componentLoader))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("Unsupported compressionMethod");
}
@Test
void validateAndResolveCompressor_emptyClassLoader() {
// Create a class loader that cannot load CompressorProvider services
ComponentLoader emptyComponentLoader =
ComponentLoader.forClassLoader(new URLClassLoader(new URL[0], null));
// Gzip should still work because it's hardcoded
assertThat(CompressorUtil.validateAndResolveCompressor("gzip", emptyComponentLoader))
.isEqualTo(GzipCompressor.getInstance());
// None should still work because it doesn't require loading services
assertThat(CompressorUtil.validateAndResolveCompressor("none", emptyComponentLoader)).isNull();
// Any SPI-based compressor should not be available
assertThatThrownBy(
() -> CompressorUtil.validateAndResolveCompressor("base64", emptyComponentLoader))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("Unsupported compressionMethod");
}
@Test
void validateAndResolveCompressor_delegatesCorrectly() {
// Test that single-parameter method delegates to two-parameter method
assertThat(CompressorUtil.validateAndResolveCompressor("gzip"))
.isEqualTo(CompressorUtil.validateAndResolveCompressor("gzip", componentLoader));
assertThat(CompressorUtil.validateAndResolveCompressor("none"))
.isEqualTo(CompressorUtil.validateAndResolveCompressor("none", componentLoader));
}
}

View File

@ -6,11 +6,16 @@
package io.opentelemetry.exporter.internal.grpc;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.exporter.internal.compression.Compressor;
import io.opentelemetry.exporter.internal.compression.GzipCompressor;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.sdk.internal.StandardComponentId;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@ -36,7 +41,7 @@ class GrpcExporterBuilderTest {
@Test
void compressionNone() {
builder.setCompression(null);
builder.setCompression((Compressor) null);
assertThat(builder).extracting("compressor").isNull();
}
@ -50,8 +55,45 @@ class GrpcExporterBuilderTest {
@Test
void compressionEnabledAndDisabled() {
builder.setCompression(GzipCompressor.getInstance()).setCompression(null);
builder.setCompression(GzipCompressor.getInstance()).setCompression((Compressor) null);
assertThat(builder).extracting("compressor").isNull();
}
@Test
void compressionString_none() {
builder.setCompression("none");
assertThat(builder).extracting("compressor").isNull();
}
@Test
void compressionString_gzip() {
builder.setCompression("gzip");
assertThat(builder).extracting("compressor").isEqualTo(GzipCompressor.getInstance());
}
@Test
void compressionString_invalid() {
assertThatThrownBy(() -> builder.setCompression("invalid-compression"))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("Unsupported compressionMethod");
}
@Test
void compressionString_usesServiceClassLoader() {
// Create a class loader that cannot load CompressorProvider services
ComponentLoader emptyComponentLoader =
ComponentLoader.forClassLoader(new URLClassLoader(new URL[0], null));
builder.setComponentLoader(emptyComponentLoader);
// This should still work because gzip compressor is hardcoded
builder.setCompression("gzip");
assertThat(builder).extracting("compressor").isEqualTo(GzipCompressor.getInstance());
// This should still work because "none" doesn't require loading services
builder.setCompression("none");
assertThat(builder).extracting("compressor").isNull();
}
}

View File

@ -0,0 +1,94 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.exporter.internal.http;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.exporter.internal.compression.Compressor;
import io.opentelemetry.exporter.internal.compression.GzipCompressor;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.sdk.internal.StandardComponentId;
import java.net.URL;
import java.net.URLClassLoader;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class HttpExporterBuilderTest {
private HttpExporterBuilder<Marshaler> builder;
@BeforeEach
void setUp() {
builder =
new HttpExporterBuilder<>(
StandardComponentId.ExporterType.OTLP_HTTP_SPAN_EXPORTER, "http://localhost:4318");
}
@Test
void compressionDefault() {
assertThat(builder).extracting("compressor").isNull();
}
@Test
void compressionNone() {
builder.setCompression((Compressor) null);
assertThat(builder).extracting("compressor").isNull();
}
@Test
void compressionGzip() {
builder.setCompression(GzipCompressor.getInstance());
assertThat(builder).extracting("compressor").isEqualTo(GzipCompressor.getInstance());
}
@Test
void compressionEnabledAndDisabled() {
builder.setCompression(GzipCompressor.getInstance()).setCompression((Compressor) null);
assertThat(builder).extracting("compressor").isNull();
}
@Test
void compressionString_none() {
builder.setCompression("none");
assertThat(builder).extracting("compressor").isNull();
}
@Test
void compressionString_gzip() {
builder.setCompression("gzip");
assertThat(builder).extracting("compressor").isEqualTo(GzipCompressor.getInstance());
}
@Test
void compressionString_invalid() {
assertThatThrownBy(() -> builder.setCompression("invalid-compression"))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("Unsupported compressionMethod");
}
@Test
void compressionString_usesServiceClassLoader() {
// Create a class loader that cannot load CompressorProvider services
ComponentLoader emptyComponentLoader =
ComponentLoader.forClassLoader(new URLClassLoader(new URL[0], null));
builder.setComponentLoader(emptyComponentLoader);
// This should still work because gzip compressor is hardcoded
builder.setCompression("gzip");
assertThat(builder).extracting("compressor").isEqualTo(GzipCompressor.getInstance());
// This should still work because "none" doesn't require loading services
builder.setCompression("none");
assertThat(builder).extracting("compressor").isNull();
}
}

View File

@ -9,11 +9,10 @@ import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonMap;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Streams;
import io.github.netmikey.logunit.api.LogCapturer;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
@ -29,10 +28,10 @@ import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ServiceLoader;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import javax.annotation.Nullable;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
@ -306,7 +305,7 @@ abstract class AbstractOtlpStdoutExporterTest<T> {
@Test
void componentProviderConfig() {
DeclarativeConfigProperties properties = mock(DeclarativeConfigProperties.class);
DeclarativeConfigProperties properties = spy(DeclarativeConfigProperties.empty());
T exporter = exporterFromComponentProvider(properties);
assertThat(exporter).extracting("wrapperJsonObject").isEqualTo(true);
@ -330,22 +329,22 @@ abstract class AbstractOtlpStdoutExporterTest<T> {
@SuppressWarnings("unchecked")
protected T exporterFromComponentProvider(DeclarativeConfigProperties properties) {
return (T)
((ComponentProvider<?>)
loadSpi(ComponentProvider.class)
.filter(
p -> {
ComponentProvider<?> c = (ComponentProvider<?>) p;
return "otlp_file/development".equals(c.getName())
&& c.getType().equals(componentProviderType);
})
.findFirst()
.orElseThrow(() -> new IllegalStateException("No provider found")))
StreamSupport.stream(
properties.getComponentLoader().load(ComponentProvider.class).spliterator(), false)
.filter(
p -> {
ComponentProvider<?> c = p;
return "otlp_file/development".equals(c.getName())
&& c.getType().equals(componentProviderType);
})
.findFirst()
.orElseThrow(() -> new IllegalStateException("No provider found"))
.create(properties);
}
@SuppressWarnings("unchecked")
protected T exporterFromProvider(ConfigProperties config) {
Object provider = loadProvider();
Object provider = loadProvider(config);
try {
return (T)
@ -358,8 +357,9 @@ abstract class AbstractOtlpStdoutExporterTest<T> {
}
}
private Object loadProvider() {
return loadSpi(providerClass)
private Object loadProvider(ConfigProperties config) {
return StreamSupport.stream(
config.getComponentLoader().load(providerClass).spliterator(), false)
.filter(
p -> {
try {
@ -372,8 +372,4 @@ abstract class AbstractOtlpStdoutExporterTest<T> {
.findFirst()
.orElseThrow(() -> new IllegalStateException("No provider found"));
}
protected static Stream<?> loadSpi(Class<?> type) {
return Streams.stream(ServiceLoader.load(type, type.getClassLoader()).iterator());
}
}

View File

@ -7,7 +7,7 @@ package io.opentelemetry.exporter.logging.otlp;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableMap;
@ -81,7 +81,7 @@ class OtlpStdoutMetricExporterTest
@Test
void componentProviderMetricConfig() {
DeclarativeConfigProperties properties = mock(DeclarativeConfigProperties.class);
DeclarativeConfigProperties properties = spy(DeclarativeConfigProperties.empty());
when(properties.getString("temporality_preference")).thenReturn("DELTA");
when(properties.getString("default_histogram_aggregation"))
.thenReturn("BASE2_EXPONENTIAL_BUCKET_HISTOGRAM");

View File

@ -10,9 +10,8 @@ import static java.util.Objects.requireNonNull;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.exporter.internal.compression.Compressor;
import io.opentelemetry.exporter.internal.compression.CompressorProvider;
import io.opentelemetry.exporter.internal.compression.CompressorUtil;
import io.opentelemetry.exporter.internal.http.HttpExporterBuilder;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.exporter.otlp.internal.OtlpUserAgent;
@ -112,13 +111,12 @@ public final class OtlpHttpLogRecordExporterBuilder {
/**
* Sets the method used to compress payloads. If unset, compression is disabled. Compression
* method "gzip" and "none" are supported out of the box. Support for additional compression
* methods is available by implementing {@link Compressor} and {@link CompressorProvider}.
* method "gzip" and "none" are supported out of the box. Additional compression methods can be
* supported by providing custom {@link Compressor} implementations via the service loader.
*/
public OtlpHttpLogRecordExporterBuilder setCompression(String compressionMethod) {
requireNonNull(compressionMethod, "compressionMethod");
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
delegate.setCompression(compressor);
delegate.setCompression(compressionMethod);
return this;
}
@ -245,13 +243,20 @@ public final class OtlpHttpLogRecordExporterBuilder {
}
/**
* Set the {@link ClassLoader} used to load the sender API.
* Set the {@link ClassLoader} used to load the sender API. Variant of {@link
* #setComponentLoader(ComponentLoader)}.
*
* @since 1.48.0
*/
public OtlpHttpLogRecordExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
requireNonNull(serviceClassLoader, "serviceClassLoader");
delegate.setServiceClassLoader(serviceClassLoader);
return setComponentLoader(ComponentLoader.forClassLoader(serviceClassLoader));
}
/** Set the {@link ComponentLoader} used to load the sender API. */
public OtlpHttpLogRecordExporterBuilder setComponentLoader(ComponentLoader componentLoader) {
requireNonNull(componentLoader, "componentLoader");
delegate.setComponentLoader(componentLoader);
return this;
}

View File

@ -10,9 +10,8 @@ import static java.util.Objects.requireNonNull;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.exporter.internal.compression.Compressor;
import io.opentelemetry.exporter.internal.compression.CompressorProvider;
import io.opentelemetry.exporter.internal.compression.CompressorUtil;
import io.opentelemetry.exporter.internal.http.HttpExporterBuilder;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.exporter.otlp.internal.OtlpUserAgent;
@ -132,13 +131,12 @@ public final class OtlpHttpMetricExporterBuilder {
/**
* Sets the method used to compress payloads. If unset, compression is disabled. Compression
* method "gzip" and "none" are supported out of the box. Support for additional compression
* methods is available by implementing {@link Compressor} and {@link CompressorProvider}.
* method "gzip" and "none" are supported out of the box. Additional compression methods can be
* supported by providing custom {@link Compressor} implementations via the service loader.
*/
public OtlpHttpMetricExporterBuilder setCompression(String compressionMethod) {
requireNonNull(compressionMethod, "compressionMethod");
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
delegate.setCompression(compressor);
delegate.setCompression(compressionMethod);
return this;
}
@ -304,13 +302,20 @@ public final class OtlpHttpMetricExporterBuilder {
}
/**
* Set the {@link ClassLoader} used to load the sender API.
* Set the {@link ClassLoader} used to load the sender API. Variant of {@link
* #setComponentLoader(ComponentLoader)}.
*
* @since 1.48.0
*/
public OtlpHttpMetricExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
requireNonNull(serviceClassLoader, "serviceClassLoader");
delegate.setServiceClassLoader(serviceClassLoader);
return setComponentLoader(ComponentLoader.forClassLoader(serviceClassLoader));
}
/** Set the {@link ComponentLoader} used to load the sender API. */
public OtlpHttpMetricExporterBuilder setComponentLoader(ComponentLoader componentLoader) {
requireNonNull(componentLoader, "componentLoader");
delegate.setComponentLoader(componentLoader);
return this;
}

View File

@ -10,9 +10,8 @@ import static java.util.Objects.requireNonNull;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.exporter.internal.compression.Compressor;
import io.opentelemetry.exporter.internal.compression.CompressorProvider;
import io.opentelemetry.exporter.internal.compression.CompressorUtil;
import io.opentelemetry.exporter.internal.http.HttpExporterBuilder;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.exporter.otlp.internal.OtlpUserAgent;
@ -112,13 +111,12 @@ public final class OtlpHttpSpanExporterBuilder {
/**
* Sets the method used to compress payloads. If unset, compression is disabled. Compression
* method "gzip" and "none" are supported out of the box. Support for additional compression
* methods is available by implementing {@link Compressor} and {@link CompressorProvider}.
* method "gzip" and "none" are supported out of the box. Additional compression methods can be
* supported by providing custom {@link Compressor} implementations via the service loader.
*/
public OtlpHttpSpanExporterBuilder setCompression(String compressionMethod) {
requireNonNull(compressionMethod, "compressionMethod");
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
delegate.setCompression(compressor);
delegate.setCompression(compressionMethod);
return this;
}
@ -246,13 +244,20 @@ public final class OtlpHttpSpanExporterBuilder {
}
/**
* Set the {@link ClassLoader} used to load the sender API.
* Set the {@link ClassLoader} used to load the sender API. Variant of {@link
* #setComponentLoader(ComponentLoader)}.
*
* @since 1.48.0
*/
public OtlpHttpSpanExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
requireNonNull(serviceClassLoader, "serviceClassLoader");
delegate.setServiceClassLoader(serviceClassLoader);
return setComponentLoader(ComponentLoader.forClassLoader(serviceClassLoader));
}
/** Set the {@link ComponentLoader} used to load the sender API. */
public OtlpHttpSpanExporterBuilder setComponentLoader(ComponentLoader componentLoader) {
requireNonNull(componentLoader, "componentLoader");
delegate.setComponentLoader(componentLoader);
return this;
}

View File

@ -5,6 +5,7 @@
package io.opentelemetry.exporter.otlp.internal;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
@ -53,6 +54,7 @@ public final class OtlpConfigUtil {
public static void configureOtlpExporterBuilder(
String dataType,
ConfigProperties config,
Consumer<ComponentLoader> setComponentLoader,
Consumer<String> setEndpoint,
BiConsumer<String, String> addHeader,
Consumer<String> setCompression,
@ -61,6 +63,8 @@ public final class OtlpConfigUtil {
BiConsumer<byte[], byte[]> setClientTls,
Consumer<RetryPolicy> setRetryPolicy,
Consumer<MemoryMode> setMemoryMode) {
setComponentLoader.accept(config.getComponentLoader());
String protocol = getOtlpProtocol(dataType, config);
boolean isHttpProtobuf = protocol.equals(PROTOCOL_HTTP_PROTOBUF);
URL endpoint =

View File

@ -11,6 +11,7 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.readFileByt
import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.validateEndpoint;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.exporter.internal.IncubatingExporterBuilderUtil;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
@ -47,6 +48,7 @@ public final class OtlpDeclarativeConfigUtil {
public static void configureOtlpExporterBuilder(
String dataType,
DeclarativeConfigProperties config,
Consumer<ComponentLoader> setComponentLoader,
Consumer<String> setEndpoint,
BiConsumer<String, String> addHeader,
Consumer<String> setCompression,
@ -56,6 +58,8 @@ public final class OtlpDeclarativeConfigUtil {
Consumer<RetryPolicy> setRetryPolicy,
Consumer<MemoryMode> setMemoryMode,
boolean isHttpProtobuf) {
setComponentLoader.accept(config.getComponentLoader());
URL endpoint = validateEndpoint(config.getString("endpoint"), isHttpProtobuf);
if (endpoint != null) {
setEndpoint.accept(endpoint.toString());

View File

@ -39,6 +39,7 @@ public class OtlpGrpcLogRecordExporterComponentProvider
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_LOGS,
config,
builder::setComponentLoader,
builder::setEndpoint,
builder::addHeader,
builder::setCompression,

View File

@ -39,6 +39,7 @@ public class OtlpGrpcMetricExporterComponentProvider implements ComponentProvide
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_METRICS,
config,
builder::setComponentLoader,
builder::setEndpoint,
builder::addHeader,
builder::setCompression,

View File

@ -38,6 +38,7 @@ public class OtlpGrpcSpanExporterComponentProvider implements ComponentProvider<
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_TRACES,
config,
builder::setComponentLoader,
builder::setEndpoint,
builder::addHeader,
builder::setCompression,

View File

@ -39,6 +39,7 @@ public class OtlpHttpLogRecordExporterComponentProvider
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_LOGS,
config,
builder::setComponentLoader,
builder::setEndpoint,
builder::addHeader,
builder::setCompression,

View File

@ -39,6 +39,7 @@ public class OtlpHttpMetricExporterComponentProvider implements ComponentProvide
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_METRICS,
config,
builder::setComponentLoader,
builder::setEndpoint,
builder::addHeader,
builder::setCompression,

View File

@ -38,6 +38,7 @@ public class OtlpHttpSpanExporterComponentProvider implements ComponentProvider<
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_TRACES,
config,
builder::setComponentLoader,
builder::setEndpoint,
builder::addHeader,
builder::setCompression,

View File

@ -45,6 +45,7 @@ public class OtlpLogRecordExporterProvider
OtlpConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_LOGS,
config,
builder::setComponentLoader,
builder::setEndpoint,
builder::addHeader,
builder::setCompression,
@ -62,6 +63,7 @@ public class OtlpLogRecordExporterProvider
OtlpConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_LOGS,
config,
builder::setComponentLoader,
builder::setEndpoint,
builder::addHeader,
builder::setCompression,

View File

@ -38,6 +38,7 @@ public class OtlpMetricExporterProvider implements ConfigurableMetricExporterPro
OtlpConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_METRICS,
config,
builder::setComponentLoader,
builder::setEndpoint,
builder::addHeader,
builder::setCompression,
@ -58,6 +59,7 @@ public class OtlpMetricExporterProvider implements ConfigurableMetricExporterPro
OtlpConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_METRICS,
config,
builder::setComponentLoader,
builder::setEndpoint,
builder::addHeader,
builder::setCompression,

Some files were not shown because too many files have changed in this diff Show More