Merge branch 'main' into low-allocation-marshalers-for-json-exporter
This commit is contained in:
commit
eccd941273
|
@ -171,7 +171,7 @@ jobs:
|
||||||
- 23
|
- 23
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
- uses: graalvm/setup-graalvm@01ed653ac833fe80569f1ef9f25585ba2811baab # v1.3.3
|
- uses: graalvm/setup-graalvm@e1df20a713a4cc6ab5b0eb03f0e0dcdc0199b805 # v1.3.4
|
||||||
with:
|
with:
|
||||||
java-version: ${{ matrix.test-graal-version }}
|
java-version: ${{ matrix.test-graal-version }}
|
||||||
distribution: 'graalvm'
|
distribution: 'graalvm'
|
||||||
|
|
|
@ -45,7 +45,7 @@ jobs:
|
||||||
uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1
|
uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# using "latest" helps to keep up with the latest Kotlin support
|
# using "latest" helps to keep up with the latest Kotlin support
|
||||||
|
@ -60,6 +60,6 @@ jobs:
|
||||||
run: ./gradlew assemble --no-build-cache --no-daemon
|
run: ./gradlew assemble --no-build-cache --no-daemon
|
||||||
|
|
||||||
- name: Perform CodeQL analysis
|
- name: Perform CodeQL analysis
|
||||||
uses: github/codeql-action/analyze@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
||||||
with:
|
with:
|
||||||
category: "/language:${{matrix.language}}"
|
category: "/language:${{matrix.language}}"
|
|
@ -42,6 +42,6 @@ jobs:
|
||||||
# Upload the results to GitHub's code scanning dashboard (optional).
|
# Upload the results to GitHub's code scanning dashboard (optional).
|
||||||
# Commenting out will disable upload of results to your repo's Code Scanning dashboard
|
# Commenting out will disable upload of results to your repo's Code Scanning dashboard
|
||||||
- name: "Upload to code-scanning"
|
- 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:
|
with:
|
||||||
sarif_file: results.sarif
|
sarif_file: results.sarif
|
||||||
|
|
|
@ -133,7 +133,7 @@ jobs:
|
||||||
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||||
echo "prior-version=$PRIOR_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:
|
permissions:
|
||||||
contents: write # for git push to PR branch
|
contents: write # for git push to PR branch
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -187,6 +187,13 @@ jobs:
|
||||||
./gradlew --refresh-dependencies japicmp
|
./gradlew --refresh-dependencies japicmp
|
||||||
git add docs/apidiffs
|
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
|
- name: Use CLA approved bot
|
||||||
run: .github/scripts/use-cla-approved-github-bot.sh
|
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
|
# not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows
|
||||||
GH_TOKEN: ${{ steps.otelbot-token.outputs.token }}
|
GH_TOKEN: ${{ steps.otelbot-token.outputs.token }}
|
||||||
run: |
|
run: |
|
||||||
message="Update apidiff baseline to released version $VERSION"
|
message="Update apidiff baseline and documentation versions to released version $VERSION"
|
||||||
body="Update apidiff baseline to released version \`$VERSION\`."
|
body="Update apidiff baseline and documentation versions to released version \`$VERSION\`."
|
||||||
branch="otelbot/update-apidiff-baseline-to-released-version-${VERSION}"
|
branch="otelbot/update-apidiff-baseline-and-documentation-to-released-version-${VERSION}"
|
||||||
|
|
||||||
git checkout -b $branch
|
git checkout -b $branch
|
||||||
git commit -m "$message"
|
git commit -m "$message"
|
||||||
|
|
56
CHANGELOG.md
56
CHANGELOG.md
|
@ -2,6 +2,62 @@
|
||||||
|
|
||||||
## Unreleased
|
## 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)
|
## Version 1.51.0 (2025-06-06)
|
||||||
|
|
||||||
### API
|
### API
|
||||||
|
|
73
README.md
73
README.md
|
@ -57,8 +57,8 @@ A bill of materials (or BOM) helps sync dependency versions of related artifacts
|
||||||
|
|
||||||
| Component | Description | Artifact ID | Version | Javadoc |
|
| 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 |
|
| [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.49.0-alpha<!--/VERSION_UNSTABLE--> | 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>
|
||||||
|
|
||||||
<details open>
|
<details open>
|
||||||
|
@ -68,9 +68,10 @@ The OpenTelemetry API for recording telemetry.
|
||||||
|
|
||||||
| Component | Description | Artifact ID | Version | Javadoc |
|
| 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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api) |
|
| [API](./api/all) | OpenTelemetry API, including metrics, traces, baggage, context | `opentelemetry-api` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api-incubator) |
|
| [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--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-context) |
|
| [Context API](./context) | OpenTelemetry context API | `opentelemetry-context` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-common) |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
@ -80,8 +81,8 @@ Extensions to the OpenTelemetry API.
|
||||||
|
|
||||||
| Component | Description | Artifact ID | Version | Javadoc |
|
| Component | Description | Artifact ID | Version | Javadoc |
|
||||||
|---------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------|-------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|---------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------|-------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| [Kotlin Extension](./extensions/kotlin) | Context extension for coroutines | `opentelemetry-extension-kotlin` | <!--VERSION_STABLE-->1.49.0<!--/VERSION_STABLE--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-extension-kotlin) |
|
| [Kotlin Extension](./extensions/kotlin) | Context extension for coroutines | `opentelemetry-extension-kotlin` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-extension-trace-propagators) |
|
| [Trace Propagators Extension](./extensions/trace-propagators) | Trace propagators, including B3, Jaeger, OT Trace | `opentelemetry-extension-trace-propagators` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-extension-trace-propagators) |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details open>
|
<details open>
|
||||||
|
@ -91,12 +92,12 @@ The OpenTelemetry SDK for managing telemetry producing by the API.
|
||||||
|
|
||||||
| Component | Description | Artifact ID | Version | Javadoc |
|
| 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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk) |
|
| [SDK](./sdk/all) | OpenTelemetry SDK, including metrics, traces, and logs | `opentelemetry-sdk` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-metrics) |
|
| [Metrics SDK](./sdk/metrics) | OpenTelemetry metrics SDK | `opentelemetry-sdk-metrics` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-trace) |
|
| [Trace SDK](./sdk/trace) | OpenTelemetry trace SDK | `opentelemetry-sdk-trace` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-logs) |
|
| [Log SDK](./sdk/logs) | OpenTelemetry log SDK | `opentelemetry-sdk-logs` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-common) |
|
| [SDK Common](./sdk/common) | Shared SDK components | `opentelemetry-sdk-common` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-testing) |
|
| [SDK Testing](./sdk/testing) | Components for testing OpenTelemetry instrumentation | `opentelemetry-sdk-testing` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-testing) |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
@ -106,16 +107,16 @@ SDK exporters for shipping traces, metrics, and logs out of process.
|
||||||
|
|
||||||
| Component | Description | Artifact ID | Version | Javadoc |
|
| 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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-otlp) |
|
| [OTLP Exporters](./exporters/otlp/all) | OTLP gRPC & HTTP exporters, including traces, metrics, and logs | `opentelemetry-exporter-otlp` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-logging-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--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-otlp-common) |
|
| [OTLP Common](./exporters/otlp/common) | Shared OTLP components (internal) | `opentelemetry-exporter-otlp-common` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-logging) |
|
| [Logging Exporter](./exporters/logging) | Logging exporters, including metrics, traces, and logs | `opentelemetry-exporter-logging` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-zipkin) |
|
| [Zipkin Exporter](./exporters/zipkin) | Zipkin trace exporter | `opentelemetry-exporter-zipkin` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-prometheus) |
|
| [Prometheus Exporter](./exporters/prometheus) | Prometheus metric exporter | `opentelemetry-exporter-prometheus` | <!--VERSION_UNSTABLE-->1.52.0-alpha<!--/VERSION_UNSTABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-common) |
|
| [Exporter Common](./exporters/common) | Shared exporter components (internal) | `opentelemetry-exporter-common` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-sender-okhttp) |
|
| [OkHttp Sender](./exporters/sender/okhttp) | OkHttp implementation of HttpSender (internal) | `opentelemetry-exporter-sender-okhttp` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-sender-jdk) | |
|
| [JDK Sender](./exporters/sender/jdk) | Java 11+ native HttpClient implementation of HttpSender (internal) | `opentelemetry-exporter-sender-jdk` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-sender-grpc-managed-channel) | |
|
| [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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-exporter-sender-grpc-managed-channel) | |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
@ -125,10 +126,10 @@ Extensions to the OpenTelemetry SDK.
|
||||||
|
|
||||||
| Component | Description | Artifact ID | Version | Javadoc |
|
| 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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure) |
|
| [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--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure-spi) |
|
| [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--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-jaeger-remote-sampler) |
|
| [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--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-incubator) |
|
| [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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-extension-incubator) |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
@ -138,8 +139,8 @@ Shims for bridging data from one observability library to another.
|
||||||
|
|
||||||
| Component | Description | Artifact ID | Version | Javadoc |
|
| 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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-opencensus-shim) |
|
| [OpenCensus Shim](./opencensus-shim) | Bridge opencensus metrics into the OpenTelemetry metrics SDK | `opentelemetry-opencensus-shim` | <!--VERSION_UNSTABLE-->1.52.0-alpha<!--/VERSION_UNSTABLE--> | [](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--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-opentracing-shim) |
|
| [OpenTracing Shim](./opentracing-shim) | Bridge opentracing spans into the OpenTelemetry trace API | `opentelemetry-opentracing-shim` | <!--VERSION_STABLE-->1.52.0<!--/VERSION_STABLE--> | [](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-opentracing-shim) |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
@ -180,7 +181,7 @@ repositories {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
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')
|
implementation('io.opentelemetry:opentelemetry-api')
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -202,7 +203,7 @@ dependencies {
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.opentelemetry</groupId>
|
<groupId>io.opentelemetry</groupId>
|
||||||
<artifactId>opentelemetry-bom</artifactId>
|
<artifactId>opentelemetry-bom</artifactId>
|
||||||
<version>1.50.0-SNAPSHOT</version>
|
<version>1.53.0-SNAPSHOT</version>
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
<scope>import</scope>
|
<scope>import</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@ -254,16 +255,14 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for:
|
||||||
* Keys to successful PRs
|
* Keys to successful PRs
|
||||||
* Guide to using gradle composite builds
|
* Guide to using gradle composite builds
|
||||||
|
|
||||||
### Code owners
|
### Maintainers
|
||||||
|
|
||||||
#### Maintainers
|
|
||||||
|
|
||||||
- [Jack Berg](https://github.com/jack-berg), New Relic
|
- [Jack Berg](https://github.com/jack-berg), New Relic
|
||||||
- [John Watson](https://github.com/jkwatson), Verta.ai
|
- [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).
|
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
|
- [Jason Plumb](https://github.com/breedx-splk), Splunk
|
||||||
- [Josh Suereth](https://github.com/jsuereth), Google
|
- [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).
|
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
|
- [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).
|
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 [Bogdan Drutu](https://github.com/BogdanDrutu)
|
||||||
- Maintainer [Carlos Alberto](https://github.com/carlosalberto)
|
- Maintainer [Carlos Alberto](https://github.com/carlosalberto)
|
||||||
|
|
|
@ -57,6 +57,11 @@ and deadlocks.
|
||||||
* Review and merge the pull request that it creates for updating the change log in main
|
* 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,
|
(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).
|
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
|
* 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.
|
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)
|
* The [website](https://opentelemetry.io/docs/languages/java/configuration/#zero-code-sdk-autoconfigure)
|
||||||
|
|
|
@ -28,7 +28,7 @@ class SdkDesignTest {
|
||||||
* Ensures that all SDK methods that: - are defined in classes that extend or implement API model
|
* 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
|
* 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
|
* 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
|
@Test
|
||||||
void sdkImplementationOfApiClassesShouldReturnApiTypeOnly() {
|
void sdkImplementationOfApiClassesShouldReturnApiTypeOnly() {
|
||||||
|
@ -45,7 +45,11 @@ class SdkDesignTest {
|
||||||
.and(implementOrOverride())
|
.and(implementOrOverride())
|
||||||
.should()
|
.should()
|
||||||
.haveRawReturnType(
|
.haveRawReturnType(
|
||||||
inPackage("io.opentelemetry.api..", "io.opentelemetry.context..", "java.."))
|
inPackage(
|
||||||
|
"io.opentelemetry.api..",
|
||||||
|
"io.opentelemetry.context..",
|
||||||
|
"io.opentelemetry.common..",
|
||||||
|
"java.."))
|
||||||
.orShould()
|
.orShould()
|
||||||
.haveRawReturnType("void");
|
.haveRawReturnType("void");
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,8 @@ public final class GlobalOpenTelemetry {
|
||||||
*
|
*
|
||||||
* <p>This method calls the given {@code supplier} and calls {@link #set(OpenTelemetry)}, all
|
* <p>This method calls the given {@code supplier} and calls {@link #set(OpenTelemetry)}, all
|
||||||
* while holding the {@link GlobalOpenTelemetry} mutex.
|
* while holding the {@link GlobalOpenTelemetry} mutex.
|
||||||
|
*
|
||||||
|
* @since 1.52.0
|
||||||
*/
|
*/
|
||||||
public static void set(Supplier<OpenTelemetry> supplier) {
|
public static void set(Supplier<OpenTelemetry> supplier) {
|
||||||
synchronized (mutex) {
|
synchronized (mutex) {
|
||||||
|
|
|
@ -12,6 +12,9 @@ otelJava.moduleName.set("io.opentelemetry.api.incubator")
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(":api:all"))
|
api(project(":api:all"))
|
||||||
|
|
||||||
|
// Supports optional InstrumentationConfigUtil#convertToModel
|
||||||
|
compileOnly("com.fasterxml.jackson.core:jackson-databind")
|
||||||
|
|
||||||
annotationProcessor("com.google.auto.value:auto-value")
|
annotationProcessor("com.google.auto.value:auto-value")
|
||||||
|
|
||||||
// To use parsed config file as input for InstrumentationConfigUtilTest
|
// To use parsed config file as input for InstrumentationConfigUtilTest
|
||||||
|
@ -24,3 +27,16 @@ dependencies {
|
||||||
|
|
||||||
testImplementation("com.google.guava:guava")
|
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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -7,7 +7,9 @@ package io.opentelemetry.api.incubator.config;
|
||||||
|
|
||||||
import static io.opentelemetry.api.internal.ConfigUtil.defaultIfNull;
|
import static io.opentelemetry.api.internal.ConfigUtil.defaultIfNull;
|
||||||
|
|
||||||
|
import io.opentelemetry.common.ComponentLoader;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
@ -36,6 +38,11 @@ public interface DeclarativeConfigProperties {
|
||||||
return EmptyDeclarativeConfigProperties.getInstance();
|
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.
|
* Returns a {@link String} configuration property.
|
||||||
*
|
*
|
||||||
|
@ -222,4 +229,7 @@ public interface DeclarativeConfigProperties {
|
||||||
* @return the configuration property keys
|
* @return the configuration property keys
|
||||||
*/
|
*/
|
||||||
Set<String> getPropertyKeys();
|
Set<String> getPropertyKeys();
|
||||||
|
|
||||||
|
/** Return a {@link ComponentLoader} that should be used to load SPIs. */
|
||||||
|
ComponentLoader getComponentLoader();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
package io.opentelemetry.api.incubator.config;
|
package io.opentelemetry.api.incubator.config;
|
||||||
|
|
||||||
|
import io.opentelemetry.common.ComponentLoader;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -15,6 +16,8 @@ final class EmptyDeclarativeConfigProperties implements DeclarativeConfigPropert
|
||||||
|
|
||||||
private static final EmptyDeclarativeConfigProperties INSTANCE =
|
private static final EmptyDeclarativeConfigProperties INSTANCE =
|
||||||
new EmptyDeclarativeConfigProperties();
|
new EmptyDeclarativeConfigProperties();
|
||||||
|
private static final ComponentLoader COMPONENT_LOADER =
|
||||||
|
ComponentLoader.forClassLoader(EmptyDeclarativeConfigProperties.class.getClassLoader());
|
||||||
|
|
||||||
private EmptyDeclarativeConfigProperties() {}
|
private EmptyDeclarativeConfigProperties() {}
|
||||||
|
|
||||||
|
@ -74,4 +77,9 @@ final class EmptyDeclarativeConfigProperties implements DeclarativeConfigPropert
|
||||||
public Set<String> getPropertyKeys() {
|
public Set<String> getPropertyKeys() {
|
||||||
return Collections.emptySet();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ComponentLoader getComponentLoader() {
|
||||||
|
return COMPONENT_LOADER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
package io.opentelemetry.api.incubator.config;
|
package io.opentelemetry.api.incubator.config;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -148,4 +149,49 @@ public class InstrumentationConfigUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
private 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,11 @@ class ExtendedDefaultLogger implements ExtendedLogger {
|
||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(Severity severity, Context context) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ExtendedLogRecordBuilder logRecordBuilder() {
|
public ExtendedLogRecordBuilder logRecordBuilder() {
|
||||||
return NOOP_LOG_RECORD_BUILDER;
|
return NOOP_LOG_RECORD_BUILDER;
|
||||||
|
|
|
@ -6,21 +6,41 @@
|
||||||
package io.opentelemetry.api.incubator.logs;
|
package io.opentelemetry.api.incubator.logs;
|
||||||
|
|
||||||
import io.opentelemetry.api.logs.Logger;
|
import io.opentelemetry.api.logs.Logger;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
|
import io.opentelemetry.context.Context;
|
||||||
|
|
||||||
/** Extended {@link Logger} with experimental APIs. */
|
/** Extended {@link Logger} with experimental APIs. */
|
||||||
public interface ExtendedLogger extends Logger {
|
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
|
* <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
|
* the response is subject to change over the application, callers should call this before each
|
||||||
* call to {@link #logRecordBuilder()}.
|
* call to {@link #logRecordBuilder()}.
|
||||||
*/
|
*/
|
||||||
default boolean isEnabled() {
|
default boolean isEnabled(Severity severity, Context context) {
|
||||||
return true;
|
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
|
@Override
|
||||||
ExtendedLogRecordBuilder logRecordBuilder();
|
ExtendedLogRecordBuilder logRecordBuilder();
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,6 +94,11 @@ class ExtendedDefaultMeter implements Meter {
|
||||||
private ExtendedDefaultMeter() {}
|
private ExtendedDefaultMeter() {}
|
||||||
|
|
||||||
private static class NoopLongCounter implements ExtendedLongCounter {
|
private static class NoopLongCounter implements ExtendedLongCounter {
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(long value, Attributes attributes, Context context) {}
|
public void add(long value, Attributes attributes, Context context) {}
|
||||||
|
|
||||||
|
@ -105,6 +110,11 @@ class ExtendedDefaultMeter implements Meter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class NoopDoubleCounter implements ExtendedDoubleCounter {
|
private static class NoopDoubleCounter implements ExtendedDoubleCounter {
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(double value, Attributes attributes, Context context) {}
|
public void add(double value, Attributes attributes, Context context) {}
|
||||||
|
|
||||||
|
@ -186,6 +196,11 @@ class ExtendedDefaultMeter implements Meter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class NoopLongUpDownCounter implements ExtendedLongUpDownCounter {
|
private static class NoopLongUpDownCounter implements ExtendedLongUpDownCounter {
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(long value, Attributes attributes, Context context) {}
|
public void add(long value, Attributes attributes, Context context) {}
|
||||||
|
|
||||||
|
@ -197,6 +212,11 @@ class ExtendedDefaultMeter implements Meter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class NoopDoubleUpDownCounter implements ExtendedDoubleUpDownCounter {
|
private static class NoopDoubleUpDownCounter implements ExtendedDoubleUpDownCounter {
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(double value, Attributes attributes, Context context) {}
|
public void add(double value, Attributes attributes, Context context) {}
|
||||||
|
|
||||||
|
@ -281,6 +301,11 @@ class ExtendedDefaultMeter implements Meter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class NoopDoubleHistogram implements ExtendedDoubleHistogram {
|
private static class NoopDoubleHistogram implements ExtendedDoubleHistogram {
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void record(double value, Attributes attributes, Context context) {}
|
public void record(double value, Attributes attributes, Context context) {}
|
||||||
|
|
||||||
|
@ -292,6 +317,11 @@ class ExtendedDefaultMeter implements Meter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class NoopLongHistogram implements ExtendedLongHistogram {
|
private static class NoopLongHistogram implements ExtendedLongHistogram {
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void record(long value, Attributes attributes, Context context) {}
|
public void record(long value, Attributes attributes, Context context) {}
|
||||||
|
|
||||||
|
@ -385,6 +415,11 @@ class ExtendedDefaultMeter implements Meter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class NoopDoubleGauge implements ExtendedDoubleGauge {
|
private static class NoopDoubleGauge implements ExtendedDoubleGauge {
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void set(double value) {}
|
public void set(double value) {}
|
||||||
|
|
||||||
|
@ -426,6 +461,11 @@ class ExtendedDefaultMeter implements Meter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class NoopLongGauge implements ExtendedLongGauge {
|
private static class NoopLongGauge implements ExtendedLongGauge {
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void set(long value) {}
|
public void set(long value) {}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,11 @@ final class ExtendedDefaultTracer implements ExtendedTracer {
|
||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ExtendedSpanBuilder spanBuilder(String spanName) {
|
public ExtendedSpanBuilder spanBuilder(String spanName) {
|
||||||
return NoopSpanBuilder.create();
|
return NoopSpanBuilder.create();
|
||||||
|
|
|
@ -150,7 +150,8 @@ class InstrumentationConfigUtilTest {
|
||||||
.isInstanceOfSatisfying(
|
.isInstanceOfSatisfying(
|
||||||
YamlDeclarativeConfigProperties.class,
|
YamlDeclarativeConfigProperties.class,
|
||||||
exampleConfig ->
|
exampleConfig ->
|
||||||
assertThat(exampleConfig.toMap()).isEqualTo(ImmutableMap.of("property", "value")));
|
assertThat(DeclarativeConfigProperties.toMap(exampleConfig))
|
||||||
|
.isEqualTo(ImmutableMap.of("property", "value")));
|
||||||
assertThat(
|
assertThat(
|
||||||
InstrumentationConfigUtil.javaInstrumentationConfig(kitchenSinkConfigProvider, "foo"))
|
InstrumentationConfigUtil.javaInstrumentationConfig(kitchenSinkConfigProvider, "foo"))
|
||||||
.isNull();
|
.isNull();
|
||||||
|
|
|
@ -10,7 +10,9 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import io.opentelemetry.api.common.Value;
|
import io.opentelemetry.api.common.Value;
|
||||||
import io.opentelemetry.api.logs.Logger;
|
import io.opentelemetry.api.logs.Logger;
|
||||||
import io.opentelemetry.api.logs.LoggerProvider;
|
import io.opentelemetry.api.logs.LoggerProvider;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
import io.opentelemetry.api.testing.internal.AbstractDefaultLoggerTest;
|
import io.opentelemetry.api.testing.internal.AbstractDefaultLoggerTest;
|
||||||
|
import io.opentelemetry.context.Context;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
class ExtendedDefaultLoggerTest extends AbstractDefaultLoggerTest {
|
class ExtendedDefaultLoggerTest extends AbstractDefaultLoggerTest {
|
||||||
|
@ -26,10 +28,18 @@ class ExtendedDefaultLoggerTest extends AbstractDefaultLoggerTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@SuppressWarnings("deprecation") // testing deprecated code
|
||||||
void incubatingApiIsLoaded() {
|
void incubatingApiIsLoaded() {
|
||||||
Logger logger = LoggerProvider.noop().get("test");
|
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();
|
ExtendedLogRecordBuilder builder = (ExtendedLogRecordBuilder) logger.logRecordBuilder();
|
||||||
assertThat(builder).isInstanceOf(ExtendedLogRecordBuilder.class);
|
assertThat(builder).isInstanceOf(ExtendedLogRecordBuilder.class);
|
||||||
assertThat(builder.setBody(Value.of(0))).isSameAs(builder);
|
assertThat(builder.setBody(Value.of(0))).isSameAs(builder);
|
||||||
|
|
|
@ -14,6 +14,7 @@ import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.api.incubator.common.ExtendedAttributeKey;
|
import io.opentelemetry.api.incubator.common.ExtendedAttributeKey;
|
||||||
import io.opentelemetry.api.incubator.common.ExtendedAttributes;
|
import io.opentelemetry.api.incubator.common.ExtendedAttributes;
|
||||||
import io.opentelemetry.api.logs.Logger;
|
import io.opentelemetry.api.logs.Logger;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
|
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
|
||||||
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
|
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
|
||||||
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
|
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
|
||||||
|
@ -53,24 +54,26 @@ class ExtendedLogsBridgeApiUsageTest {
|
||||||
ExtendedLogger loggerB = (ExtendedLogger) loggerProvider.get("loggerB");
|
ExtendedLogger loggerB = (ExtendedLogger) loggerProvider.get("loggerB");
|
||||||
|
|
||||||
// Check if logger is enabled before emitting log and avoid unnecessary computation
|
// Check if logger is enabled before emitting log and avoid unnecessary computation
|
||||||
if (loggerA.isEnabled()) {
|
if (loggerA.isEnabled(Severity.INFO)) {
|
||||||
loggerA
|
loggerA
|
||||||
.logRecordBuilder()
|
.logRecordBuilder()
|
||||||
|
.setSeverity(Severity.INFO)
|
||||||
.setBody("hello world!")
|
.setBody("hello world!")
|
||||||
.setAllAttributes(Attributes.builder().put("result", flipCoin()).build())
|
.setAllAttributes(Attributes.builder().put("result", flipCoin()).build())
|
||||||
.emit();
|
.emit();
|
||||||
}
|
}
|
||||||
if (loggerB.isEnabled()) {
|
if (loggerB.isEnabled(Severity.INFO)) {
|
||||||
loggerB
|
loggerB
|
||||||
.logRecordBuilder()
|
.logRecordBuilder()
|
||||||
|
.setSeverity(Severity.INFO)
|
||||||
.setBody("hello world!")
|
.setBody("hello world!")
|
||||||
.setAllAttributes(Attributes.builder().put("result", flipCoin()).build())
|
.setAllAttributes(Attributes.builder().put("result", flipCoin()).build())
|
||||||
.emit();
|
.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// loggerA is enabled, loggerB is disabled
|
// loggerA is enabled, loggerB is disabled
|
||||||
assertThat(loggerA.isEnabled()).isTrue();
|
assertThat(loggerA.isEnabled(Severity.INFO)).isTrue();
|
||||||
assertThat(loggerB.isEnabled()).isFalse();
|
assertThat(loggerB.isEnabled(Severity.INFO)).isFalse();
|
||||||
|
|
||||||
// Collected data only consists of logs from loggerA. Note, loggerB's logs would be
|
// 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
|
// omitted from the results even if logs were emitted. The check if enabled simply avoids
|
||||||
|
|
|
@ -11,7 +11,6 @@ import io.opentelemetry.api.OpenTelemetry;
|
||||||
import io.opentelemetry.api.metrics.Meter;
|
import io.opentelemetry.api.metrics.Meter;
|
||||||
import io.opentelemetry.api.metrics.MeterProvider;
|
import io.opentelemetry.api.metrics.MeterProvider;
|
||||||
import io.opentelemetry.api.testing.internal.AbstractDefaultMeterTest;
|
import io.opentelemetry.api.testing.internal.AbstractDefaultMeterTest;
|
||||||
import org.assertj.core.api.Assertions;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
class ExtendedDefaultMeterTest extends AbstractDefaultMeterTest {
|
class ExtendedDefaultMeterTest extends AbstractDefaultMeterTest {
|
||||||
|
@ -27,44 +26,53 @@ class ExtendedDefaultMeterTest extends AbstractDefaultMeterTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void incubatingApiIsLoaded() {
|
void incubatingApiIsLoaded() {
|
||||||
Meter meter = MeterProvider.noop().get("test");
|
Meter meter = MeterProvider.noop().get("test");
|
||||||
assertThat(meter).isSameAs(OpenTelemetry.noop().getMeter("test"));
|
assertThat(meter).isSameAs(OpenTelemetry.noop().getMeter("test"));
|
||||||
|
|
||||||
Assertions.assertThat(meter.gaugeBuilder("test").ofLongs())
|
assertThat(meter.gaugeBuilder("test").ofLongs()).isInstanceOf(ExtendedLongGaugeBuilder.class);
|
||||||
.isInstanceOf(ExtendedLongGaugeBuilder.class);
|
assertThat(meter.gaugeBuilder("test").ofLongs().build())
|
||||||
Assertions.assertThat(meter.gaugeBuilder("test").ofLongs().build())
|
.isInstanceOfSatisfying(
|
||||||
.isInstanceOf(ExtendedLongGauge.class);
|
ExtendedLongGauge.class, instrument -> assertThat(instrument.isEnabled()).isFalse());
|
||||||
Assertions.assertThat(meter.gaugeBuilder("test"))
|
assertThat(meter.gaugeBuilder("test")).isInstanceOf(ExtendedDoubleGaugeBuilder.class);
|
||||||
.isInstanceOf(ExtendedDoubleGaugeBuilder.class);
|
assertThat(meter.gaugeBuilder("test").build())
|
||||||
Assertions.assertThat(meter.gaugeBuilder("test").build())
|
.isInstanceOfSatisfying(
|
||||||
.isInstanceOf(ExtendedDoubleGauge.class);
|
ExtendedDoubleGauge.class, instrument -> assertThat(instrument.isEnabled()).isFalse());
|
||||||
|
|
||||||
Assertions.assertThat(meter.histogramBuilder("test").ofLongs())
|
assertThat(meter.histogramBuilder("test").ofLongs())
|
||||||
.isInstanceOf(ExtendedLongHistogramBuilder.class);
|
.isInstanceOf(ExtendedLongHistogramBuilder.class);
|
||||||
Assertions.assertThat(meter.histogramBuilder("test").ofLongs().build())
|
assertThat(meter.histogramBuilder("test").ofLongs().build())
|
||||||
.isInstanceOf(ExtendedLongHistogram.class);
|
.isInstanceOfSatisfying(
|
||||||
Assertions.assertThat(meter.histogramBuilder("test"))
|
ExtendedLongHistogram.class,
|
||||||
.isInstanceOf(ExtendedDoubleHistogramBuilder.class);
|
instrument -> assertThat(instrument.isEnabled()).isFalse());
|
||||||
Assertions.assertThat(meter.histogramBuilder("test").build())
|
assertThat(meter.histogramBuilder("test")).isInstanceOf(ExtendedDoubleHistogramBuilder.class);
|
||||||
.isInstanceOf(ExtendedDoubleHistogram.class);
|
assertThat(meter.histogramBuilder("test").build())
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
ExtendedDoubleHistogram.class,
|
||||||
|
instrument -> assertThat(instrument.isEnabled()).isFalse());
|
||||||
|
|
||||||
Assertions.assertThat(meter.counterBuilder("test"))
|
assertThat(meter.counterBuilder("test")).isInstanceOf(ExtendedLongCounterBuilder.class);
|
||||||
.isInstanceOf(ExtendedLongCounterBuilder.class);
|
assertThat(meter.counterBuilder("test").build())
|
||||||
Assertions.assertThat(meter.counterBuilder("test").build())
|
.isInstanceOfSatisfying(
|
||||||
.isInstanceOf(ExtendedLongCounter.class);
|
ExtendedLongCounter.class, instrument -> assertThat(instrument.isEnabled()).isFalse());
|
||||||
Assertions.assertThat(meter.counterBuilder("test").ofDoubles())
|
assertThat(meter.counterBuilder("test").ofDoubles())
|
||||||
.isInstanceOf(ExtendedDoubleCounterBuilder.class);
|
.isInstanceOf(ExtendedDoubleCounterBuilder.class);
|
||||||
Assertions.assertThat(meter.counterBuilder("test").ofDoubles().build())
|
assertThat(meter.counterBuilder("test").ofDoubles().build())
|
||||||
.isInstanceOf(ExtendedDoubleCounter.class);
|
.isInstanceOfSatisfying(
|
||||||
|
ExtendedDoubleCounter.class,
|
||||||
|
instrument -> assertThat(instrument.isEnabled()).isFalse());
|
||||||
|
|
||||||
Assertions.assertThat(meter.upDownCounterBuilder("test"))
|
assertThat(meter.upDownCounterBuilder("test"))
|
||||||
.isInstanceOf(ExtendedLongUpDownCounterBuilder.class);
|
.isInstanceOf(ExtendedLongUpDownCounterBuilder.class);
|
||||||
Assertions.assertThat(meter.upDownCounterBuilder("test").build())
|
assertThat(meter.upDownCounterBuilder("test").build())
|
||||||
.isInstanceOf(ExtendedLongUpDownCounter.class);
|
.isInstanceOfSatisfying(
|
||||||
Assertions.assertThat(meter.upDownCounterBuilder("test").ofDoubles())
|
ExtendedLongUpDownCounter.class,
|
||||||
|
instrument -> assertThat(instrument.isEnabled()).isFalse());
|
||||||
|
assertThat(meter.upDownCounterBuilder("test").ofDoubles())
|
||||||
.isInstanceOf(ExtendedDoubleUpDownCounterBuilder.class);
|
.isInstanceOf(ExtendedDoubleUpDownCounterBuilder.class);
|
||||||
Assertions.assertThat(meter.upDownCounterBuilder("test").ofDoubles().build())
|
assertThat(meter.upDownCounterBuilder("test").ofDoubles().build())
|
||||||
.isInstanceOf(ExtendedDoubleUpDownCounter.class);
|
.isInstanceOfSatisfying(
|
||||||
|
ExtendedDoubleUpDownCounter.class,
|
||||||
|
instrument -> assertThat(instrument.isEnabled()).isFalse());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
package io.opentelemetry.api.incubator.trace;
|
package io.opentelemetry.api.incubator.trace;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
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.OpenTelemetry;
|
||||||
import io.opentelemetry.api.testing.internal.AbstractDefaultTracerTest;
|
import io.opentelemetry.api.testing.internal.AbstractDefaultTracerTest;
|
||||||
|
@ -27,17 +29,20 @@ class ExtendedDefaultTracerTest extends AbstractDefaultTracerTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void incubatingApiIsLoaded() {
|
void incubatingApiIsLoaded() {
|
||||||
Tracer tracer = TracerProvider.noop().get("test");
|
Tracer tracer = TracerProvider.noop().get("test");
|
||||||
assertThat(tracer).isSameAs(OpenTelemetry.noop().getTracer("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);
|
assertThat(tracer.spanBuilder("test")).isInstanceOf(ExtendedSpanBuilder.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Test
|
@Test
|
||||||
public void incubatingApi() {
|
void incubatingApi() {
|
||||||
ExtendedSpanBuilder spanBuilder =
|
ExtendedSpanBuilder spanBuilder =
|
||||||
(ExtendedSpanBuilder) ExtendedDefaultTracer.getNoop().spanBuilder("test");
|
(ExtendedSpanBuilder) ExtendedDefaultTracer.getNoop().spanBuilder("test");
|
||||||
assertThat(spanBuilder.setParentFrom(null, null)).isSameAs(spanBuilder);
|
assertThat(spanBuilder.setParentFrom(null, null)).isSameAs(spanBuilder);
|
||||||
|
@ -45,21 +50,21 @@ class ExtendedDefaultTracerTest extends AbstractDefaultTracerTest {
|
||||||
SpanRunnable<RuntimeException> spanRunnable = Mockito.mock(SpanRunnable.class);
|
SpanRunnable<RuntimeException> spanRunnable = Mockito.mock(SpanRunnable.class);
|
||||||
|
|
||||||
spanBuilder.startAndRun(spanRunnable);
|
spanBuilder.startAndRun(spanRunnable);
|
||||||
Mockito.verify(spanRunnable).runInSpan();
|
verify(spanRunnable).runInSpan();
|
||||||
Mockito.reset(spanRunnable);
|
reset(spanRunnable);
|
||||||
|
|
||||||
spanBuilder.startAndRun(spanRunnable, null);
|
spanBuilder.startAndRun(spanRunnable, null);
|
||||||
Mockito.verify(spanRunnable).runInSpan();
|
verify(spanRunnable).runInSpan();
|
||||||
Mockito.reset(spanRunnable);
|
reset(spanRunnable);
|
||||||
|
|
||||||
SpanCallable<String, RuntimeException> spanCallable = Mockito.mock(SpanCallable.class);
|
SpanCallable<String, RuntimeException> spanCallable = Mockito.mock(SpanCallable.class);
|
||||||
|
|
||||||
spanBuilder.startAndCall(spanCallable);
|
spanBuilder.startAndCall(spanCallable);
|
||||||
Mockito.verify(spanCallable).callInSpan();
|
verify(spanCallable).callInSpan();
|
||||||
Mockito.reset(spanCallable);
|
reset(spanCallable);
|
||||||
|
|
||||||
spanBuilder.startAndCall(spanCallable, null);
|
spanBuilder.startAndCall(spanCallable, null);
|
||||||
Mockito.verify(spanCallable).callInSpan();
|
verify(spanCallable).callInSpan();
|
||||||
Mockito.reset(spanCallable);
|
reset(spanCallable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 + '\'' + '}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,7 +2,7 @@ plugins {
|
||||||
`kotlin-dsl`
|
`kotlin-dsl`
|
||||||
|
|
||||||
// When updating, update below in dependencies too
|
// 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)) {
|
if (!hasLauncherForJavaVersion(17)) {
|
||||||
|
@ -50,10 +50,10 @@ repositories {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
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")
|
implementation("com.google.auto.value:auto-value-annotations:1.11.0")
|
||||||
// When updating, update above in plugins too
|
// 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.gradle.develocity:com.gradle.develocity.gradle.plugin:4.0.2")
|
||||||
implementation("com.squareup:javapoet:1.13.0")
|
implementation("com.squareup:javapoet:1.13.0")
|
||||||
implementation("com.squareup.wire:wire-compiler")
|
implementation("com.squareup.wire:wire-compiler")
|
||||||
|
|
|
@ -42,7 +42,7 @@ java {
|
||||||
|
|
||||||
checkstyle {
|
checkstyle {
|
||||||
configDirectory.set(file("$rootDir/buildscripts/"))
|
configDirectory.set(file("$rootDir/buildscripts/"))
|
||||||
toolVersion = "10.26.0"
|
toolVersion = "10.26.1"
|
||||||
isIgnoreFailures = false
|
isIgnoreFailures = false
|
||||||
configProperties["rootDir"] = rootDir
|
configProperties["rootDir"] = rootDir
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 + "}";
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ description = "OpenTelemetry Context (Incubator)"
|
||||||
otelJava.moduleName.set("io.opentelemetry.context")
|
otelJava.moduleName.set("io.opentelemetry.context")
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
api(project(":common"))
|
||||||
// MustBeClosed
|
// MustBeClosed
|
||||||
compileOnly("com.google.errorprone:error_prone_annotations")
|
compileOnly("com.google.errorprone:error_prone_annotations")
|
||||||
|
|
||||||
|
|
|
@ -37,9 +37,9 @@
|
||||||
|
|
||||||
package io.opentelemetry.context;
|
package io.opentelemetry.context;
|
||||||
|
|
||||||
|
import io.opentelemetry.common.ComponentLoader;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ServiceLoader;
|
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
@ -103,9 +103,10 @@ final class LazyStorage {
|
||||||
return ContextStorage.defaultStorage();
|
return ContextStorage.defaultStorage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ComponentLoader componentLoader =
|
||||||
|
ComponentLoader.forClassLoader(LazyStorage.class.getClassLoader());
|
||||||
List<ContextStorageProvider> providers = new ArrayList<>();
|
List<ContextStorageProvider> providers = new ArrayList<>();
|
||||||
for (ContextStorageProvider provider :
|
for (ContextStorageProvider provider : componentLoader.load(ContextStorageProvider.class)) {
|
||||||
ServiceLoader.load(ContextStorageProvider.class, LazyStorage.class.getClassLoader())) {
|
|
||||||
if (provider
|
if (provider
|
||||||
.getClass()
|
.getClass()
|
||||||
.getName()
|
.getName()
|
||||||
|
|
|
@ -16,14 +16,14 @@ val DEPENDENCY_BOMS = listOf(
|
||||||
"com.fasterxml.jackson:jackson-bom:2.19.1",
|
"com.fasterxml.jackson:jackson-bom:2.19.1",
|
||||||
"com.google.guava:guava-bom:33.4.8-jre",
|
"com.google.guava:guava-bom:33.4.8-jre",
|
||||||
"com.google.protobuf:protobuf-bom:4.31.1",
|
"com.google.protobuf:protobuf-bom:4.31.1",
|
||||||
"com.squareup.okhttp3:okhttp-bom:4.12.0",
|
"com.squareup.okhttp3:okhttp-bom:5.1.0",
|
||||||
"com.squareup.okio:okio-bom:3.13.0", // applies to transitive dependencies of okhttp
|
"com.squareup.okio:okio-bom:3.15.0", // applies to transitive dependencies of okhttp
|
||||||
"io.grpc:grpc-bom:1.73.0",
|
"io.grpc:grpc-bom:1.73.0",
|
||||||
"io.netty:netty-bom:4.2.2.Final",
|
"io.netty:netty-bom:4.2.2.Final",
|
||||||
"io.zipkin.brave:brave-bom:6.3.0",
|
"io.zipkin.brave:brave-bom:6.3.0",
|
||||||
"io.zipkin.reporter2:zipkin-reporter-bom:3.5.1",
|
"io.zipkin.reporter2:zipkin-reporter-bom:3.5.1",
|
||||||
"org.assertj:assertj-bom:3.27.3",
|
"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"
|
"org.snakeyaml:snakeyaml-engine:2.9"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ val DEPENDENCIES = listOf(
|
||||||
"io.prometheus:prometheus-metrics-exposition-formats-no-protobuf:${prometheusServerVersion}",
|
"io.prometheus:prometheus-metrics-exposition-formats-no-protobuf:${prometheusServerVersion}",
|
||||||
"javax.annotation:javax.annotation-api:1.3.2",
|
"javax.annotation:javax.annotation-api:1.3.2",
|
||||||
"com.github.stefanbirkner:system-rules:1.19.0",
|
"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.code.findbugs:jsr305:3.0.2",
|
||||||
"com.google.guava:guava-beta-checker:1.0",
|
"com.google.guava:guava-beta-checker:1.0",
|
||||||
"com.sun.net.httpserver:http:20070405",
|
"com.sun.net.httpserver:http:20070405",
|
||||||
|
@ -78,7 +78,7 @@ val DEPENDENCIES = listOf(
|
||||||
"eu.rekawek.toxiproxy:toxiproxy-java:2.1.7",
|
"eu.rekawek.toxiproxy:toxiproxy-java:2.1.7",
|
||||||
"io.github.netmikey.logunit:logunit-jul:2.0.0",
|
"io.github.netmikey.logunit:logunit-jul:2.0.0",
|
||||||
"io.jaegertracing:jaeger-client:1.8.1",
|
"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.semconv:opentelemetry-semconv-incubating:1.34.0-alpha",
|
||||||
"io.opentelemetry.proto:opentelemetry-proto:1.7.0-alpha",
|
"io.opentelemetry.proto:opentelemetry-proto:1.7.0-alpha",
|
||||||
"io.opentracing:opentracing-api:0.33.0",
|
"io.opentracing:opentracing-api:0.33.0",
|
||||||
|
|
|
@ -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>)
|
|
@ -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
|
|
@ -0,0 +1,2 @@
|
||||||
|
Comparing source compatibility of opentelemetry-context-1.52.0.jar against opentelemetry-context-1.51.0.jar
|
||||||
|
No changes.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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)
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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()
|
|
@ -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)
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -0,0 +1,2 @@
|
||||||
|
Comparing source compatibility of opentelemetry-sdk-1.52.0.jar against opentelemetry-sdk-1.51.0.jar
|
||||||
|
No changes.
|
|
@ -1,4 +1,2 @@
|
||||||
Comparing source compatibility of opentelemetry-api-1.52.0-SNAPSHOT.jar against opentelemetry-api-1.51.0.jar
|
Comparing source compatibility of opentelemetry-api-1.53.0-SNAPSHOT.jar against opentelemetry-api-1.52.0.jar
|
||||||
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.api.GlobalOpenTelemetry (not serializable)
|
No changes.
|
||||||
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
|
|
||||||
+++ NEW METHOD: PUBLIC(+) STATIC(+) void set(java.util.function.Supplier<io.opentelemetry.api.OpenTelemetry>)
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Comparing source compatibility of opentelemetry-common-1.53.0-SNAPSHOT.jar against opentelemetry-common-1.52.0.jar
|
||||||
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -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.
|
No changes.
|
|
@ -8,9 +8,9 @@ package io.opentelemetry.exporter.internal.compression;
|
||||||
import static io.opentelemetry.api.internal.Utils.checkArgument;
|
import static io.opentelemetry.api.internal.Utils.checkArgument;
|
||||||
import static java.util.stream.Collectors.joining;
|
import static java.util.stream.Collectors.joining;
|
||||||
|
|
||||||
|
import io.opentelemetry.common.ComponentLoader;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.ServiceLoader;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
@ -24,7 +24,9 @@ import javax.annotation.Nullable;
|
||||||
*/
|
*/
|
||||||
public final class CompressorUtil {
|
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() {}
|
private CompressorUtil() {}
|
||||||
|
|
||||||
|
@ -36,8 +38,26 @@ public final class CompressorUtil {
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public static Compressor validateAndResolveCompressor(String compressionMethod) {
|
public static Compressor validateAndResolveCompressor(String compressionMethod) {
|
||||||
Set<String> supportedEncodings = compressorRegistry.keySet();
|
return validateAndResolveCompressor(compressionMethod, null);
|
||||||
Compressor compressor = compressorRegistry.get(compressionMethod);
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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(
|
checkArgument(
|
||||||
"none".equals(compressionMethod) || compressor != null,
|
"none".equals(compressionMethod) || compressor != null,
|
||||||
"Unsupported compressionMethod. Compression method must be \"none\" or one of: "
|
"Unsupported compressionMethod. Compression method must be \"none\" or one of: "
|
||||||
|
@ -45,10 +65,9 @@ public final class CompressorUtil {
|
||||||
return compressor;
|
return compressor;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String, Compressor> buildCompressorRegistry() {
|
private static Map<String, Compressor> buildCompressorRegistry(ComponentLoader componentLoader) {
|
||||||
Map<String, Compressor> compressors = new HashMap<>();
|
Map<String, Compressor> compressors = new HashMap<>();
|
||||||
for (CompressorProvider spi :
|
for (CompressorProvider spi : componentLoader.load(CompressorProvider.class)) {
|
||||||
ServiceLoader.load(CompressorProvider.class, CompressorUtil.class.getClassLoader())) {
|
|
||||||
Compressor compressor = spi.getInstance();
|
Compressor compressor = spi.getInstance();
|
||||||
compressors.put(compressor.getEncoding(), compressor);
|
compressors.put(compressor.getEncoding(), compressor);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,12 @@ import io.grpc.ManagedChannel;
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.api.internal.ConfigUtil;
|
import io.opentelemetry.api.internal.ConfigUtil;
|
||||||
import io.opentelemetry.api.metrics.MeterProvider;
|
import io.opentelemetry.api.metrics.MeterProvider;
|
||||||
|
import io.opentelemetry.common.ComponentLoader;
|
||||||
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
|
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
|
||||||
import io.opentelemetry.exporter.internal.TlsConfigHelper;
|
import io.opentelemetry.exporter.internal.TlsConfigHelper;
|
||||||
import io.opentelemetry.exporter.internal.compression.Compressor;
|
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.exporter.internal.marshal.Marshaler;
|
||||||
import io.opentelemetry.sdk.common.InternalTelemetryVersion;
|
import io.opentelemetry.sdk.common.InternalTelemetryVersion;
|
||||||
import io.opentelemetry.sdk.common.export.RetryPolicy;
|
import io.opentelemetry.sdk.common.export.RetryPolicy;
|
||||||
|
@ -26,7 +29,6 @@ import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.ServiceLoader;
|
|
||||||
import java.util.StringJoiner;
|
import java.util.StringJoiner;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -67,7 +69,8 @@ public class GrpcExporterBuilder<T extends Marshaler> {
|
||||||
private Supplier<MeterProvider> meterProviderSupplier = GlobalOpenTelemetry::getMeterProvider;
|
private Supplier<MeterProvider> meterProviderSupplier = GlobalOpenTelemetry::getMeterProvider;
|
||||||
private InternalTelemetryVersion internalTelemetryVersion = InternalTelemetryVersion.LEGACY;
|
private InternalTelemetryVersion internalTelemetryVersion = InternalTelemetryVersion.LEGACY;
|
||||||
|
|
||||||
private ClassLoader serviceClassLoader = GrpcExporterBuilder.class.getClassLoader();
|
private ComponentLoader componentLoader =
|
||||||
|
ComponentLoader.forClassLoader(GrpcExporterBuilder.class.getClassLoader());
|
||||||
@Nullable private ExecutorService executorService;
|
@Nullable private ExecutorService executorService;
|
||||||
|
|
||||||
// Use Object type since gRPC may not be on the classpath.
|
// Use Object type since gRPC may not be on the classpath.
|
||||||
|
@ -115,6 +118,17 @@ public class GrpcExporterBuilder<T extends Marshaler> {
|
||||||
return this;
|
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) {
|
public GrpcExporterBuilder<T> setTrustManagerFromCerts(byte[] trustedCertificatesPem) {
|
||||||
tlsConfigHelper.setTrustManagerFromCerts(trustedCertificatesPem);
|
tlsConfigHelper.setTrustManagerFromCerts(trustedCertificatesPem);
|
||||||
return this;
|
return this;
|
||||||
|
@ -158,8 +172,8 @@ public class GrpcExporterBuilder<T extends Marshaler> {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public GrpcExporterBuilder<T> setServiceClassLoader(ClassLoader servieClassLoader) {
|
public GrpcExporterBuilder<T> setComponentLoader(ComponentLoader componentLoader) {
|
||||||
this.serviceClassLoader = servieClassLoader;
|
this.componentLoader = componentLoader;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,7 +282,7 @@ public class GrpcExporterBuilder<T extends Marshaler> {
|
||||||
if (grpcChannel != null) {
|
if (grpcChannel != null) {
|
||||||
joiner.add("grpcChannel=" + grpcChannel);
|
joiner.add("grpcChannel=" + grpcChannel);
|
||||||
}
|
}
|
||||||
joiner.add("serviceClassLoader=" + serviceClassLoader);
|
joiner.add("componentLoader=" + componentLoader);
|
||||||
if (executorService != null) {
|
if (executorService != null) {
|
||||||
joiner.add("executorService=" + executorService);
|
joiner.add("executorService=" + executorService);
|
||||||
}
|
}
|
||||||
|
@ -302,8 +316,7 @@ public class GrpcExporterBuilder<T extends Marshaler> {
|
||||||
*/
|
*/
|
||||||
private GrpcSenderProvider resolveGrpcSenderProvider() {
|
private GrpcSenderProvider resolveGrpcSenderProvider() {
|
||||||
Map<String, GrpcSenderProvider> grpcSenderProviders = new HashMap<>();
|
Map<String, GrpcSenderProvider> grpcSenderProviders = new HashMap<>();
|
||||||
for (GrpcSenderProvider spi :
|
for (GrpcSenderProvider spi : componentLoader.load(GrpcSenderProvider.class)) {
|
||||||
ServiceLoader.load(GrpcSenderProvider.class, serviceClassLoader)) {
|
|
||||||
grpcSenderProviders.put(spi.getClass().getName(), spi);
|
grpcSenderProviders.put(spi.getClass().getName(), spi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,12 @@ package io.opentelemetry.exporter.internal.http;
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.api.internal.ConfigUtil;
|
import io.opentelemetry.api.internal.ConfigUtil;
|
||||||
import io.opentelemetry.api.metrics.MeterProvider;
|
import io.opentelemetry.api.metrics.MeterProvider;
|
||||||
|
import io.opentelemetry.common.ComponentLoader;
|
||||||
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
|
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
|
||||||
import io.opentelemetry.exporter.internal.TlsConfigHelper;
|
import io.opentelemetry.exporter.internal.TlsConfigHelper;
|
||||||
import io.opentelemetry.exporter.internal.compression.Compressor;
|
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.exporter.internal.marshal.Marshaler;
|
||||||
import io.opentelemetry.sdk.common.InternalTelemetryVersion;
|
import io.opentelemetry.sdk.common.InternalTelemetryVersion;
|
||||||
import io.opentelemetry.sdk.common.export.ProxyOptions;
|
import io.opentelemetry.sdk.common.export.ProxyOptions;
|
||||||
|
@ -24,7 +27,6 @@ import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.ServiceLoader;
|
|
||||||
import java.util.StringJoiner;
|
import java.util.StringJoiner;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -64,7 +66,8 @@ public final class HttpExporterBuilder<T extends Marshaler> {
|
||||||
@Nullable private RetryPolicy retryPolicy = RetryPolicy.getDefault();
|
@Nullable private RetryPolicy retryPolicy = RetryPolicy.getDefault();
|
||||||
private Supplier<MeterProvider> meterProviderSupplier = GlobalOpenTelemetry::getMeterProvider;
|
private Supplier<MeterProvider> meterProviderSupplier = GlobalOpenTelemetry::getMeterProvider;
|
||||||
private InternalTelemetryVersion internalTelemetryVersion = InternalTelemetryVersion.LEGACY;
|
private InternalTelemetryVersion internalTelemetryVersion = InternalTelemetryVersion.LEGACY;
|
||||||
private ClassLoader serviceClassLoader = HttpExporterBuilder.class.getClassLoader();
|
private ComponentLoader componentLoader =
|
||||||
|
ComponentLoader.forClassLoader(HttpExporterBuilder.class.getClassLoader());
|
||||||
@Nullable private ExecutorService executorService;
|
@Nullable private ExecutorService executorService;
|
||||||
|
|
||||||
public HttpExporterBuilder(
|
public HttpExporterBuilder(
|
||||||
|
@ -95,6 +98,17 @@ public final class HttpExporterBuilder<T extends Marshaler> {
|
||||||
return this;
|
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) {
|
public HttpExporterBuilder<T> addConstantHeaders(String key, String value) {
|
||||||
constantHeaders.put(key, value);
|
constantHeaders.put(key, value);
|
||||||
return this;
|
return this;
|
||||||
|
@ -143,8 +157,8 @@ public final class HttpExporterBuilder<T extends Marshaler> {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpExporterBuilder<T> setServiceClassLoader(ClassLoader servieClassLoader) {
|
public HttpExporterBuilder<T> setComponentLoader(ComponentLoader componentLoader) {
|
||||||
this.serviceClassLoader = servieClassLoader;
|
this.componentLoader = componentLoader;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,7 +279,7 @@ public final class HttpExporterBuilder<T extends Marshaler> {
|
||||||
if (retryPolicy != null) {
|
if (retryPolicy != null) {
|
||||||
joiner.add("retryPolicy=" + retryPolicy);
|
joiner.add("retryPolicy=" + retryPolicy);
|
||||||
}
|
}
|
||||||
joiner.add("serviceClassLoader=" + serviceClassLoader);
|
joiner.add("componentLoader=" + componentLoader);
|
||||||
if (executorService != null) {
|
if (executorService != null) {
|
||||||
joiner.add("executorService=" + executorService);
|
joiner.add("executorService=" + executorService);
|
||||||
}
|
}
|
||||||
|
@ -299,8 +313,7 @@ public final class HttpExporterBuilder<T extends Marshaler> {
|
||||||
*/
|
*/
|
||||||
private HttpSenderProvider resolveHttpSenderProvider() {
|
private HttpSenderProvider resolveHttpSenderProvider() {
|
||||||
Map<String, HttpSenderProvider> httpSenderProviders = new HashMap<>();
|
Map<String, HttpSenderProvider> httpSenderProviders = new HashMap<>();
|
||||||
for (HttpSenderProvider spi :
|
for (HttpSenderProvider spi : componentLoader.load(HttpSenderProvider.class)) {
|
||||||
ServiceLoader.load(HttpSenderProvider.class, serviceClassLoader)) {
|
|
||||||
httpSenderProviders.put(spi.getClass().getName(), spi);
|
httpSenderProviders.put(spi.getClass().getName(), spi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,11 +6,16 @@
|
||||||
package io.opentelemetry.exporter.internal.grpc;
|
package io.opentelemetry.exporter.internal.grpc;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
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.compression.GzipCompressor;
|
||||||
import io.opentelemetry.exporter.internal.marshal.Marshaler;
|
import io.opentelemetry.exporter.internal.marshal.Marshaler;
|
||||||
import io.opentelemetry.sdk.internal.StandardComponentId;
|
import io.opentelemetry.sdk.internal.StandardComponentId;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
@ -36,7 +41,7 @@ class GrpcExporterBuilderTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void compressionNone() {
|
void compressionNone() {
|
||||||
builder.setCompression(null);
|
builder.setCompression((Compressor) null);
|
||||||
|
|
||||||
assertThat(builder).extracting("compressor").isNull();
|
assertThat(builder).extracting("compressor").isNull();
|
||||||
}
|
}
|
||||||
|
@ -50,8 +55,45 @@ class GrpcExporterBuilderTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void compressionEnabledAndDisabled() {
|
void compressionEnabledAndDisabled() {
|
||||||
builder.setCompression(GzipCompressor.getInstance()).setCompression(null);
|
builder.setCompression(GzipCompressor.getInstance()).setCompression((Compressor) null);
|
||||||
|
|
||||||
assertThat(builder).extracting("compressor").isNull();
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,11 +9,10 @@ import static java.util.Collections.emptyMap;
|
||||||
import static java.util.Collections.singletonMap;
|
import static java.util.Collections.singletonMap;
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
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 static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.Streams;
|
|
||||||
import io.github.netmikey.logunit.api.LogCapturer;
|
import io.github.netmikey.logunit.api.LogCapturer;
|
||||||
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
|
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
|
||||||
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
|
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
|
||||||
|
@ -29,10 +28,10 @@ import java.io.UnsupportedEncodingException;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.ServiceLoader;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
import java.util.stream.StreamSupport;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import org.junit.jupiter.api.AfterAll;
|
import org.junit.jupiter.api.AfterAll;
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
@ -306,7 +305,7 @@ abstract class AbstractOtlpStdoutExporterTest<T> {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void componentProviderConfig() {
|
void componentProviderConfig() {
|
||||||
DeclarativeConfigProperties properties = mock(DeclarativeConfigProperties.class);
|
DeclarativeConfigProperties properties = spy(DeclarativeConfigProperties.empty());
|
||||||
T exporter = exporterFromComponentProvider(properties);
|
T exporter = exporterFromComponentProvider(properties);
|
||||||
|
|
||||||
assertThat(exporter).extracting("wrapperJsonObject").isEqualTo(true);
|
assertThat(exporter).extracting("wrapperJsonObject").isEqualTo(true);
|
||||||
|
@ -330,22 +329,22 @@ abstract class AbstractOtlpStdoutExporterTest<T> {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
protected T exporterFromComponentProvider(DeclarativeConfigProperties properties) {
|
protected T exporterFromComponentProvider(DeclarativeConfigProperties properties) {
|
||||||
return (T)
|
return (T)
|
||||||
((ComponentProvider<?>)
|
StreamSupport.stream(
|
||||||
loadSpi(ComponentProvider.class)
|
properties.getComponentLoader().load(ComponentProvider.class).spliterator(), false)
|
||||||
.filter(
|
.filter(
|
||||||
p -> {
|
p -> {
|
||||||
ComponentProvider<?> c = (ComponentProvider<?>) p;
|
ComponentProvider<?> c = p;
|
||||||
return "otlp_file/development".equals(c.getName())
|
return "otlp_file/development".equals(c.getName())
|
||||||
&& c.getType().equals(componentProviderType);
|
&& c.getType().equals(componentProviderType);
|
||||||
})
|
})
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElseThrow(() -> new IllegalStateException("No provider found")))
|
.orElseThrow(() -> new IllegalStateException("No provider found"))
|
||||||
.create(properties);
|
.create(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
protected T exporterFromProvider(ConfigProperties config) {
|
protected T exporterFromProvider(ConfigProperties config) {
|
||||||
Object provider = loadProvider();
|
Object provider = loadProvider(config);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return (T)
|
return (T)
|
||||||
|
@ -358,8 +357,9 @@ abstract class AbstractOtlpStdoutExporterTest<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object loadProvider() {
|
private Object loadProvider(ConfigProperties config) {
|
||||||
return loadSpi(providerClass)
|
return StreamSupport.stream(
|
||||||
|
config.getComponentLoader().load(providerClass).spliterator(), false)
|
||||||
.filter(
|
.filter(
|
||||||
p -> {
|
p -> {
|
||||||
try {
|
try {
|
||||||
|
@ -372,8 +372,4 @@ abstract class AbstractOtlpStdoutExporterTest<T> {
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElseThrow(() -> new IllegalStateException("No provider found"));
|
.orElseThrow(() -> new IllegalStateException("No provider found"));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static Stream<?> loadSpi(Class<?> type) {
|
|
||||||
return Streams.stream(ServiceLoader.load(type, type.getClassLoader()).iterator());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ package io.opentelemetry.exporter.logging.otlp;
|
||||||
|
|
||||||
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
|
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatCode;
|
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 static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
@ -81,7 +81,7 @@ class OtlpStdoutMetricExporterTest
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void componentProviderMetricConfig() {
|
void componentProviderMetricConfig() {
|
||||||
DeclarativeConfigProperties properties = mock(DeclarativeConfigProperties.class);
|
DeclarativeConfigProperties properties = spy(DeclarativeConfigProperties.empty());
|
||||||
when(properties.getString("temporality_preference")).thenReturn("DELTA");
|
when(properties.getString("temporality_preference")).thenReturn("DELTA");
|
||||||
when(properties.getString("default_histogram_aggregation"))
|
when(properties.getString("default_histogram_aggregation"))
|
||||||
.thenReturn("BASE2_EXPONENTIAL_BUCKET_HISTOGRAM");
|
.thenReturn("BASE2_EXPONENTIAL_BUCKET_HISTOGRAM");
|
||||||
|
|
|
@ -10,9 +10,8 @@ import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.api.metrics.MeterProvider;
|
import io.opentelemetry.api.metrics.MeterProvider;
|
||||||
|
import io.opentelemetry.common.ComponentLoader;
|
||||||
import io.opentelemetry.exporter.internal.compression.Compressor;
|
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.http.HttpExporterBuilder;
|
||||||
import io.opentelemetry.exporter.internal.marshal.Marshaler;
|
import io.opentelemetry.exporter.internal.marshal.Marshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.OtlpUserAgent;
|
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
|
* 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
|
* method "gzip" and "none" are supported out of the box. Additional compression methods can be
|
||||||
* methods is available by implementing {@link Compressor} and {@link CompressorProvider}.
|
* supported by providing custom {@link Compressor} implementations via the service loader.
|
||||||
*/
|
*/
|
||||||
public OtlpHttpLogRecordExporterBuilder setCompression(String compressionMethod) {
|
public OtlpHttpLogRecordExporterBuilder setCompression(String compressionMethod) {
|
||||||
requireNonNull(compressionMethod, "compressionMethod");
|
requireNonNull(compressionMethod, "compressionMethod");
|
||||||
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
|
delegate.setCompression(compressionMethod);
|
||||||
delegate.setCompression(compressor);
|
|
||||||
return this;
|
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
|
* @since 1.48.0
|
||||||
*/
|
*/
|
||||||
public OtlpHttpLogRecordExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
|
public OtlpHttpLogRecordExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
|
||||||
requireNonNull(serviceClassLoader, "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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,9 +10,8 @@ import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.api.metrics.MeterProvider;
|
import io.opentelemetry.api.metrics.MeterProvider;
|
||||||
|
import io.opentelemetry.common.ComponentLoader;
|
||||||
import io.opentelemetry.exporter.internal.compression.Compressor;
|
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.http.HttpExporterBuilder;
|
||||||
import io.opentelemetry.exporter.internal.marshal.Marshaler;
|
import io.opentelemetry.exporter.internal.marshal.Marshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.OtlpUserAgent;
|
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
|
* 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
|
* method "gzip" and "none" are supported out of the box. Additional compression methods can be
|
||||||
* methods is available by implementing {@link Compressor} and {@link CompressorProvider}.
|
* supported by providing custom {@link Compressor} implementations via the service loader.
|
||||||
*/
|
*/
|
||||||
public OtlpHttpMetricExporterBuilder setCompression(String compressionMethod) {
|
public OtlpHttpMetricExporterBuilder setCompression(String compressionMethod) {
|
||||||
requireNonNull(compressionMethod, "compressionMethod");
|
requireNonNull(compressionMethod, "compressionMethod");
|
||||||
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
|
delegate.setCompression(compressionMethod);
|
||||||
delegate.setCompression(compressor);
|
|
||||||
return this;
|
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
|
* @since 1.48.0
|
||||||
*/
|
*/
|
||||||
public OtlpHttpMetricExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
|
public OtlpHttpMetricExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
|
||||||
requireNonNull(serviceClassLoader, "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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,9 +10,8 @@ import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.api.metrics.MeterProvider;
|
import io.opentelemetry.api.metrics.MeterProvider;
|
||||||
|
import io.opentelemetry.common.ComponentLoader;
|
||||||
import io.opentelemetry.exporter.internal.compression.Compressor;
|
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.http.HttpExporterBuilder;
|
||||||
import io.opentelemetry.exporter.internal.marshal.Marshaler;
|
import io.opentelemetry.exporter.internal.marshal.Marshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.OtlpUserAgent;
|
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
|
* 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
|
* method "gzip" and "none" are supported out of the box. Additional compression methods can be
|
||||||
* methods is available by implementing {@link Compressor} and {@link CompressorProvider}.
|
* supported by providing custom {@link Compressor} implementations via the service loader.
|
||||||
*/
|
*/
|
||||||
public OtlpHttpSpanExporterBuilder setCompression(String compressionMethod) {
|
public OtlpHttpSpanExporterBuilder setCompression(String compressionMethod) {
|
||||||
requireNonNull(compressionMethod, "compressionMethod");
|
requireNonNull(compressionMethod, "compressionMethod");
|
||||||
Compressor compressor = CompressorUtil.validateAndResolveCompressor(compressionMethod);
|
delegate.setCompression(compressionMethod);
|
||||||
delegate.setCompression(compressor);
|
|
||||||
return this;
|
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
|
* @since 1.48.0
|
||||||
*/
|
*/
|
||||||
public OtlpHttpSpanExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
|
public OtlpHttpSpanExporterBuilder setServiceClassLoader(ClassLoader serviceClassLoader) {
|
||||||
requireNonNull(serviceClassLoader, "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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
package io.opentelemetry.exporter.otlp.internal;
|
package io.opentelemetry.exporter.otlp.internal;
|
||||||
|
|
||||||
|
import io.opentelemetry.common.ComponentLoader;
|
||||||
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
|
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
|
||||||
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
|
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
|
||||||
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
|
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
|
||||||
|
@ -53,6 +54,7 @@ public final class OtlpConfigUtil {
|
||||||
public static void configureOtlpExporterBuilder(
|
public static void configureOtlpExporterBuilder(
|
||||||
String dataType,
|
String dataType,
|
||||||
ConfigProperties config,
|
ConfigProperties config,
|
||||||
|
Consumer<ComponentLoader> setComponentLoader,
|
||||||
Consumer<String> setEndpoint,
|
Consumer<String> setEndpoint,
|
||||||
BiConsumer<String, String> addHeader,
|
BiConsumer<String, String> addHeader,
|
||||||
Consumer<String> setCompression,
|
Consumer<String> setCompression,
|
||||||
|
@ -61,6 +63,8 @@ public final class OtlpConfigUtil {
|
||||||
BiConsumer<byte[], byte[]> setClientTls,
|
BiConsumer<byte[], byte[]> setClientTls,
|
||||||
Consumer<RetryPolicy> setRetryPolicy,
|
Consumer<RetryPolicy> setRetryPolicy,
|
||||||
Consumer<MemoryMode> setMemoryMode) {
|
Consumer<MemoryMode> setMemoryMode) {
|
||||||
|
setComponentLoader.accept(config.getComponentLoader());
|
||||||
|
|
||||||
String protocol = getOtlpProtocol(dataType, config);
|
String protocol = getOtlpProtocol(dataType, config);
|
||||||
boolean isHttpProtobuf = protocol.equals(PROTOCOL_HTTP_PROTOBUF);
|
boolean isHttpProtobuf = protocol.equals(PROTOCOL_HTTP_PROTOBUF);
|
||||||
URL endpoint =
|
URL endpoint =
|
||||||
|
|
|
@ -11,6 +11,7 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.readFileByt
|
||||||
import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.validateEndpoint;
|
import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.validateEndpoint;
|
||||||
|
|
||||||
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
|
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
|
||||||
|
import io.opentelemetry.common.ComponentLoader;
|
||||||
import io.opentelemetry.exporter.internal.IncubatingExporterBuilderUtil;
|
import io.opentelemetry.exporter.internal.IncubatingExporterBuilderUtil;
|
||||||
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
|
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
|
||||||
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
|
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
|
||||||
|
@ -47,6 +48,7 @@ public final class OtlpDeclarativeConfigUtil {
|
||||||
public static void configureOtlpExporterBuilder(
|
public static void configureOtlpExporterBuilder(
|
||||||
String dataType,
|
String dataType,
|
||||||
DeclarativeConfigProperties config,
|
DeclarativeConfigProperties config,
|
||||||
|
Consumer<ComponentLoader> setComponentLoader,
|
||||||
Consumer<String> setEndpoint,
|
Consumer<String> setEndpoint,
|
||||||
BiConsumer<String, String> addHeader,
|
BiConsumer<String, String> addHeader,
|
||||||
Consumer<String> setCompression,
|
Consumer<String> setCompression,
|
||||||
|
@ -56,6 +58,8 @@ public final class OtlpDeclarativeConfigUtil {
|
||||||
Consumer<RetryPolicy> setRetryPolicy,
|
Consumer<RetryPolicy> setRetryPolicy,
|
||||||
Consumer<MemoryMode> setMemoryMode,
|
Consumer<MemoryMode> setMemoryMode,
|
||||||
boolean isHttpProtobuf) {
|
boolean isHttpProtobuf) {
|
||||||
|
setComponentLoader.accept(config.getComponentLoader());
|
||||||
|
|
||||||
URL endpoint = validateEndpoint(config.getString("endpoint"), isHttpProtobuf);
|
URL endpoint = validateEndpoint(config.getString("endpoint"), isHttpProtobuf);
|
||||||
if (endpoint != null) {
|
if (endpoint != null) {
|
||||||
setEndpoint.accept(endpoint.toString());
|
setEndpoint.accept(endpoint.toString());
|
||||||
|
|
|
@ -39,6 +39,7 @@ public class OtlpGrpcLogRecordExporterComponentProvider
|
||||||
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
||||||
DATA_TYPE_LOGS,
|
DATA_TYPE_LOGS,
|
||||||
config,
|
config,
|
||||||
|
builder::setComponentLoader,
|
||||||
builder::setEndpoint,
|
builder::setEndpoint,
|
||||||
builder::addHeader,
|
builder::addHeader,
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
|
|
|
@ -39,6 +39,7 @@ public class OtlpGrpcMetricExporterComponentProvider implements ComponentProvide
|
||||||
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
||||||
DATA_TYPE_METRICS,
|
DATA_TYPE_METRICS,
|
||||||
config,
|
config,
|
||||||
|
builder::setComponentLoader,
|
||||||
builder::setEndpoint,
|
builder::setEndpoint,
|
||||||
builder::addHeader,
|
builder::addHeader,
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
|
|
|
@ -38,6 +38,7 @@ public class OtlpGrpcSpanExporterComponentProvider implements ComponentProvider<
|
||||||
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
||||||
DATA_TYPE_TRACES,
|
DATA_TYPE_TRACES,
|
||||||
config,
|
config,
|
||||||
|
builder::setComponentLoader,
|
||||||
builder::setEndpoint,
|
builder::setEndpoint,
|
||||||
builder::addHeader,
|
builder::addHeader,
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
|
|
|
@ -39,6 +39,7 @@ public class OtlpHttpLogRecordExporterComponentProvider
|
||||||
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
||||||
DATA_TYPE_LOGS,
|
DATA_TYPE_LOGS,
|
||||||
config,
|
config,
|
||||||
|
builder::setComponentLoader,
|
||||||
builder::setEndpoint,
|
builder::setEndpoint,
|
||||||
builder::addHeader,
|
builder::addHeader,
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
|
|
|
@ -39,6 +39,7 @@ public class OtlpHttpMetricExporterComponentProvider implements ComponentProvide
|
||||||
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
||||||
DATA_TYPE_METRICS,
|
DATA_TYPE_METRICS,
|
||||||
config,
|
config,
|
||||||
|
builder::setComponentLoader,
|
||||||
builder::setEndpoint,
|
builder::setEndpoint,
|
||||||
builder::addHeader,
|
builder::addHeader,
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
|
|
|
@ -38,6 +38,7 @@ public class OtlpHttpSpanExporterComponentProvider implements ComponentProvider<
|
||||||
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder(
|
||||||
DATA_TYPE_TRACES,
|
DATA_TYPE_TRACES,
|
||||||
config,
|
config,
|
||||||
|
builder::setComponentLoader,
|
||||||
builder::setEndpoint,
|
builder::setEndpoint,
|
||||||
builder::addHeader,
|
builder::addHeader,
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
|
|
|
@ -45,6 +45,7 @@ public class OtlpLogRecordExporterProvider
|
||||||
OtlpConfigUtil.configureOtlpExporterBuilder(
|
OtlpConfigUtil.configureOtlpExporterBuilder(
|
||||||
DATA_TYPE_LOGS,
|
DATA_TYPE_LOGS,
|
||||||
config,
|
config,
|
||||||
|
builder::setComponentLoader,
|
||||||
builder::setEndpoint,
|
builder::setEndpoint,
|
||||||
builder::addHeader,
|
builder::addHeader,
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
|
@ -62,6 +63,7 @@ public class OtlpLogRecordExporterProvider
|
||||||
OtlpConfigUtil.configureOtlpExporterBuilder(
|
OtlpConfigUtil.configureOtlpExporterBuilder(
|
||||||
DATA_TYPE_LOGS,
|
DATA_TYPE_LOGS,
|
||||||
config,
|
config,
|
||||||
|
builder::setComponentLoader,
|
||||||
builder::setEndpoint,
|
builder::setEndpoint,
|
||||||
builder::addHeader,
|
builder::addHeader,
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
|
|
|
@ -38,6 +38,7 @@ public class OtlpMetricExporterProvider implements ConfigurableMetricExporterPro
|
||||||
OtlpConfigUtil.configureOtlpExporterBuilder(
|
OtlpConfigUtil.configureOtlpExporterBuilder(
|
||||||
DATA_TYPE_METRICS,
|
DATA_TYPE_METRICS,
|
||||||
config,
|
config,
|
||||||
|
builder::setComponentLoader,
|
||||||
builder::setEndpoint,
|
builder::setEndpoint,
|
||||||
builder::addHeader,
|
builder::addHeader,
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
|
@ -58,6 +59,7 @@ public class OtlpMetricExporterProvider implements ConfigurableMetricExporterPro
|
||||||
OtlpConfigUtil.configureOtlpExporterBuilder(
|
OtlpConfigUtil.configureOtlpExporterBuilder(
|
||||||
DATA_TYPE_METRICS,
|
DATA_TYPE_METRICS,
|
||||||
config,
|
config,
|
||||||
|
builder::setComponentLoader,
|
||||||
builder::setEndpoint,
|
builder::setEndpoint,
|
||||||
builder::addHeader,
|
builder::addHeader,
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue