diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index c87b9935e8..9441d40269 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -79,7 +79,7 @@ body:
- type: input
attributes:
label: Runtime Version
- description: What .NET runtime version did you use? (e.g. `net462`, `net48`, `netcoreapp3.1`, `net6.0` etc. You can find this information from the `*.csproj` file)
+ description: What .NET runtime version did you use? (e.g. `net462`, `net48`, `net8.0` etc. You can find this information from the `*.csproj` file)
validations:
required: true
diff --git a/.github/codecov.yml b/.github/codecov.yml
index b235a093c0..ae835620c7 100644
--- a/.github/codecov.yml
+++ b/.github/codecov.yml
@@ -24,7 +24,6 @@ comment:
ignore:
- "**.md"
- - "src/Shared" # copied from main OTel project and has code coverage there
- "test"
- "examples"
- "build"
@@ -32,26 +31,41 @@ ignore:
- ".vscode"
flags:
- unittests-Solution:
+ unittests-Exporter.Geneva:
carryforward: true
paths:
- - src
+ - src/OpenTelemetry.Exporter.Geneva
- unittests-Exporter.Geneva:
+ unittests-Exporter.InfluxDB:
carryforward: true
paths:
- - src/OpenTelemetry.Exporter.Geneva
+ - src/OpenTelemetry.Exporter.InfluxDB
+
+ unittests-Exporter.Instana:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Exporter.Instana
unittests-Exporter.OneCollector:
carryforward: true
paths:
- src/OpenTelemetry.Exporter.OneCollector
+ unittests-Exporter.Stackdriver:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Exporter.Stackdriver
+
unittests-Extensions:
carryforward: true
paths:
- src/OpenTelemetry.Extensions
+ unittests-Extensions.Enrichment:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Extensions.Enrichment
+
unittests-Instrumentation.AspNet:
carryforward: true
paths:
@@ -63,26 +77,59 @@ flags:
paths:
- src/OpenTelemetry.Instrumentation.AspNetCore
+ unittests-Instrumentation.AWS:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Extensions.AWS
+ - src/OpenTelemetry.Instrumentation.AWS
+ - src/OpenTelemetry.Instrumentation.AWSLambda
+
+ # Note: No unit tests currently for Cassandra being run in CI.
+ #unittests-Instrumentation.Cassandra:
+ # carryforward: true
+ # paths:
+ # - src/OpenTelemetry.Instrumentation.Cassandra
+
unittests-Instrumentation.ConfluentKafka:
carryforward: true
paths:
- src/OpenTelemetry.Instrumentation.ConfluentKafka
+ unittests-Instrumentation.ElasticsearchClient:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Instrumentation.ElasticsearchClient
+
+ unittests-Instrumentation.EntityFrameworkCore:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Instrumentation.EntityFrameworkCore
+
unittests-Instrumentation.EventCounters:
carryforward: true
paths:
- src/OpenTelemetry.Instrumentation.EventCounters
- unittests-Instrumentation.Http:
+ unittests-Instrumentation.GrpcCore:
carryforward: true
paths:
- - src/OpenTelemetry.Instrumentation.Http
+ - src/OpenTelemetry.Instrumentation.GrpcCore
unittests-Instrumentation.GrpcNetClient:
carryforward: true
paths:
- src/OpenTelemetry.Instrumentation.GrpcNetClient
+ unittests-Instrumentation.Hangfire:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Instrumentation.Hangfire
+
+ unittests-Instrumentation.Http:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Instrumentation.Http
+
unittests-Instrumentation.Owin:
carryforward: true
paths:
@@ -93,6 +140,11 @@ flags:
paths:
- src/OpenTelemetry.Instrumentation.Process
+ unittests-Instrumentation.Quartz:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Instrumentation.Quartz
+
unittests-Instrumentation.Runtime:
carryforward: true
paths:
@@ -119,11 +171,21 @@ flags:
- src/OpenTelemetry.PersistentStorage.Abstractions
- src/OpenTelemetry.PersistentStorage.FileSystem
+ unittests-Resources.AWS:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Resources.AWS
+
unittests-Resources.Azure:
carryforward: true
paths:
- src/OpenTelemetry.Resources.Azure
+ unittests-Resources.Container:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Resources.Container
+
unittests-Resources.Gcp:
carryforward: true
paths:
@@ -149,7 +211,18 @@ flags:
paths:
- src/OpenTelemetry.Resources.ProcessRuntime
- unittests-SemanticConventions:
+ unittests-Sampler.AWS:
+ carryforward: true
+ paths:
+ - src/OpenTelemetry.Sampler.AWS
+
+ # Note: No unit tests currently for SemanticConventions being run in CI.
+ #unittests-SemanticConventions:
+ # carryforward: true
+ # paths:
+ # - src/OpenTelemetry.SemanticConventions
+
+ unittests-Contrib.Shared.Tests:
carryforward: true
paths:
- - src/OpenTelemetry.SemanticConventions
+ - src/Shared
diff --git a/.github/component_owners.yml b/.github/component_owners.yml
index ba7131f8eb..237de74f1f 100644
--- a/.github/component_owners.yml
+++ b/.github/component_owners.yml
@@ -29,6 +29,7 @@ components:
src/OpenTelemetry.Instrumentation.AWS/:
- srprash
- ppittle
+ - muhammad-othman
src/OpenTelemetry.Instrumentation.AWSLambda/:
- rypdal
- Oberon00
@@ -131,6 +132,7 @@ components:
test/OpenTelemetry.Instrumentation.AWS.Tests/:
- srprash
- ppittle
+ - muhammad-othman
test/OpenTelemetry.Instrumentation.AWSLambda.Tests/:
- rypdal
- Oberon00
diff --git a/.github/workflows/Component.BuildTest.yml b/.github/workflows/Component.BuildTest.yml
index b4b916c293..8d7a245595 100644
--- a/.github/workflows/Component.BuildTest.yml
+++ b/.github/workflows/Component.BuildTest.yml
@@ -6,6 +6,10 @@ on:
project-name:
required: true
type: string
+ run-tests:
+ required: false
+ default: true
+ type: boolean
code-cov-name:
required: true
type: string
@@ -18,7 +22,7 @@ on:
required: false
type: string
tfm-list:
- default: '[ "net462", "net6.0", "net8.0" ]'
+ default: '[ "net462", "net8.0" ]'
required: false
type: string
@@ -87,6 +91,7 @@ jobs:
run: dotnet build ${{ steps.resolve-project.outputs.project }} --configuration Release --no-restore
- name: dotnet test ${{ steps.resolve-project.outputs.title }}
+ if: ${{ inputs.run-tests }}
run: dotnet test ${{ steps.resolve-project.outputs.project }} --collect:"Code Coverage" --results-directory:TestResults --framework ${{ matrix.version }} --configuration Release --no-restore --no-build --logger:"console;verbosity=detailed" -- RunConfiguration.DisableAppDomain=true
- name: dotnet pack ${{ steps.resolve-project.outputs.title }}
@@ -94,14 +99,15 @@ jobs:
run: dotnet pack ${{ steps.resolve-project.outputs.project }} --configuration Release --no-restore --no-build -p:EnablePackageValidation=true
- name: Install coverage tool
+ if: ${{ inputs.run-tests }}
run: dotnet tool install -g dotnet-coverage
- name: Merging test results
- if: ${{ hashFiles('./TestResults/**/*.coverage') != '' }}
+ if: ${{ inputs.run-tests && hashFiles('./TestResults/**/*.coverage') != '' }}
run: dotnet-coverage merge -f cobertura -o ./TestResults/Cobertura.xml ./TestResults/**/*.coverage
- name: Upload code coverage ${{ inputs.code-cov-prefix }}-${{ inputs.code-cov-name }}
- if: ${{ hashFiles('./TestResults/Cobertura.xml') != '' }}
+ if: ${{ inputs.run-tests && hashFiles('./TestResults/Cobertura.xml') != '' }}
uses: codecov/codecov-action@v4
continue-on-error: true # Note: Don't fail for upload failures
env:
diff --git a/.github/workflows/ci-Exporter.OneCollector-Integration.yml b/.github/workflows/ci-Exporter.OneCollector-Integration.yml
index 4f1a2dd9d2..bac716d202 100644
--- a/.github/workflows/ci-Exporter.OneCollector-Integration.yml
+++ b/.github/workflows/ci-Exporter.OneCollector-Integration.yml
@@ -29,7 +29,7 @@ jobs:
fail-fast: false # ensures the entire test matrix is run, even if one permutation fails
matrix:
os: [ windows-latest, ubuntu-latest ]
- version: [ net462, net6.0, net8.0 ]
+ version: [ net462, net8.0 ]
exclude:
- os: ubuntu-latest
version: net462
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 28a3db1968..a158adc921 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -30,12 +30,10 @@ jobs:
exporter-onecollector: ['*/OpenTelemetry.Exporter.OneCollector*/**', '!**/*.md']
exporter-stackdriver: ['*/OpenTelemetry.Exporter.Stackdriver*/**', '!**/*.md']
extensions: ['*/OpenTelemetry.Extensions/**', '*/OpenTelemetry.Extensions.Tests/**', '!**/*.md']
- extensions-aws: ['*/OpenTelemetry.Extensions.AWS*/**', '!**/*.md']
extensions-enrichment: ['*/OpenTelemetry.Extensions.Enrichment*/**', '!**/*.md']
instrumentation-aspnet: ['*/OpenTelemetry.Instrumentation.AspNet/**', '*/OpenTelemetry.Instrumentation.AspNet.Tests/**', '*/OpenTelemetry.Instrumentation.OpenTelemetry.Instrumentation.AspNet.TelemetryHttpModule.*/**', 'examples/AspNet/**', '!**/*.md']
instrumentation-aspnetcore: ['*/OpenTelemetry.Instrumentation.AspNetCore*/**', '!**/*.md']
- instrumentation-aws: ['*/OpenTelemetry.Instrumentation.AWS/**', '*/OpenTelemetry.Instrumentation.AWS.Tests/**', '!**/*.md']
- instrumentation-aws-lambda: ['*/OpenTelemetry.Instrumentation.AWSLambda/**', '*/OpenTelemetry.Instrumentation.AWSLambda.Tests/**', '!**/*.md']
+ instrumentation-aws: ['*/OpenTelemetry.Extensions.AWS*/**', '*/OpenTelemetry.Instrumentation.AWS*/**', '!**/*.md']
instrumentation-cassandra: ['*/OpenTelemetry.Instrumentation.Cassandra*/**', '!**/*.md']
instrumentation-confluentkafka: ['*/OpenTelemetry.Instrumentation.ConfluentKafka*/**', 'examples/kafka/**', '!**/*.md']
instrumentation-elasticsearchclient: ['*/OpenTelemetry.Instrumentation.ElasticsearchClient*/**', '!**/*.md']
@@ -61,7 +59,7 @@ jobs:
resources-operatingsystem: ['*/OpenTelemetry.Resources.OperatingSystem/**', '*/OpenTelemetry.Resources.OperatingSystem.Tests/**', '!**/*.md']
resources-process: ['*/OpenTelemetry.Resources.Process/**', '*/OpenTelemetry.Resources.Process.Tests/**', '!**/*.md']
resources-processruntime: ['*/OpenTelemetry.Resources.ProcessRuntime/**', '*/OpenTelemetry.Resources.ProcessRuntime.Tests/**', '!**/*.md']
- sampler-aws: ['*/OpenTelemetry.Sampler.AWS**/**', '!**/*.md']
+ sampler-aws: ['*/OpenTelemetry.Sampler.AWS*/**', '!**/*.md']
semanticconventions: ['*/OpenTelemetry.SemanticConventions*/**', '!**/*.md']
lint-md:
@@ -151,17 +149,6 @@ jobs:
project-name: Component[OpenTelemetry.Extensions]
code-cov-name: Extensions
- build-test-extensions-aws:
- needs: detect-changes
- if: |
- contains(needs.detect-changes.outputs.changes, 'extensions-aws')
- || contains(needs.detect-changes.outputs.changes, 'build')
- || contains(needs.detect-changes.outputs.changes, 'shared')
- uses: ./.github/workflows/Component.BuildTest.yml
- with:
- project-name: Component[OpenTelemetry.Extensions.AWS]
- code-cov-name: Extensions.AWS
-
build-test-extensions-enrichment:
needs: detect-changes
if: |
@@ -196,7 +183,7 @@ jobs:
with:
project-name: OpenTelemetry.Instrumentation.AspNetCore
code-cov-name: Instrumentation.AspNetCore
- tfm-list: '[ "net6.0", "net8.0" ]'
+ tfm-list: '[ "net8.0" ]'
build-test-instrumentation-aws:
needs: detect-changes
@@ -206,21 +193,9 @@ jobs:
|| contains(needs.detect-changes.outputs.changes, 'shared')
uses: ./.github/workflows/Component.BuildTest.yml
with:
- project-name: Component[OpenTelemetry.Instrumentation.AWS]
+ project-name: OpenTelemetry.Instrumentation.AWS
code-cov-name: Instrumentation.AWS
- build-test-instrumentation-awslambda:
- needs: detect-changes
- if: |
- contains(needs.detect-changes.outputs.changes, 'instrumentation-awslambda')
- || contains(needs.detect-changes.outputs.changes, 'build')
- || contains(needs.detect-changes.outputs.changes, 'shared')
- uses: ./.github/workflows/Component.BuildTest.yml
- with:
- project-name: Component[OpenTelemetry.Instrumentation.AWSLambda]
- code-cov-name: Instrumentation.AWSLambda
- tfm-list: '[ "net6.0", "net8.0" ]'
-
build-test-instrumentation-cassandra:
needs: detect-changes
if: |
@@ -231,6 +206,11 @@ jobs:
with:
project-name: Component[OpenTelemetry.Instrumentation.Cassandra]
code-cov-name: Instrumentation.Cassandra
+ run-tests: false
+ # Note: There is a unit test project for Cassandra but it only contains
+ # integration tests, which get skipped. This results in empty coverage
+ # files which messes with codecov. Enable tests if any real unit tests
+ # get added.
build-test-instrumentation-confluentkafka:
needs: detect-changes
@@ -285,7 +265,7 @@ jobs:
with:
project-name: OpenTelemetry.Instrumentation.EventCounters
code-cov-name: Instrumentation.EventCounters
- tfm-list: '[ "net6.0", "net8.0" ]'
+ tfm-list: '[ "net8.0" ]'
build-test-instrumentation-grpccore:
needs: detect-changes
@@ -524,7 +504,7 @@ jobs:
build-test-sampler-aws:
needs: detect-changes
if: |
- contains(needs.detect-changes.outputs.changes, 'resources-sampler-aws')
+ contains(needs.detect-changes.outputs.changes, 'sampler-aws')
|| contains(needs.detect-changes.outputs.changes, 'build')
|| contains(needs.detect-changes.outputs.changes, 'shared')
uses: ./.github/workflows/Component.BuildTest.yml
@@ -542,6 +522,7 @@ jobs:
with:
project-name: OpenTelemetry.SemanticConventions
code-cov-name: SemanticConventions
+ run-tests: false # Note: No test project
build-test-contrib-shared-tests:
needs: detect-changes
@@ -563,7 +544,6 @@ jobs:
|| contains(needs.detect-changes.outputs.changes, 'extensions-enrichment')
|| contains(needs.detect-changes.outputs.changes, 'instrumentation-aspnetcore')
|| contains(needs.detect-changes.outputs.changes, 'instrumentation-aws')
- || contains(needs.detect-changes.outputs.changes, 'instrumentation-awslambda')
|| contains(needs.detect-changes.outputs.changes, 'instrumentation-confluentkafka')
|| contains(needs.detect-changes.outputs.changes, 'instrumentation-eventcounters')
|| contains(needs.detect-changes.outputs.changes, 'instrumentation-grpcnetclient')
@@ -598,12 +578,10 @@ jobs:
build-test-exporter-onecollector,
build-test-exporter-stackdriver,
build-test-extensions,
- build-test-extensions-aws,
build-test-extensions-enrichment,
build-test-instrumentation-aspnet,
build-test-instrumentation-aspnetcore,
build-test-instrumentation-aws,
- build-test-instrumentation-awslambda,
build-test-instrumentation-cassandra,
build-test-instrumentation-confluentkafka,
build-test-instrumentation-elasticsearchclient,
diff --git a/build/Common.nonprod.props b/build/Common.nonprod.props
index 4ba068d4b2..255792353f 100644
--- a/build/Common.nonprod.props
+++ b/build/Common.nonprod.props
@@ -25,7 +25,8 @@
Refer to https://docs.microsoft.com/en-us/nuget/concepts/package-versioning for semver syntax.
-->
[0.13.12,0.14)
- 8.0.0
+ 8.0.1
+ 8.0.1
[17.11.1,18.0)
$(OpenTelemetryCoreLatestVersion)
net8.0;net6.0
diff --git a/build/Common.props b/build/Common.props
index 9a5fbde756..d224b292ad 100644
--- a/build/Common.props
+++ b/build/Common.props
@@ -35,8 +35,8 @@
[5.0.0,6.0)
[8.0.1,)
[2.1.0,5.0)
- 8.0.0
- 8.0.0
+ [8.0.0,)
+ [8.0.0,)
[1.0.3,2.0)
[4.2.2,5.0)
[3.11.0-beta1.23525.2]
@@ -49,8 +49,13 @@
[3.16.0,4.0)
[1.2.0-beta.556,2.0)
[4.3.4,)
- 4.7.0
- [6.0.0,)
+ [4.7.0,)
+
+
+ [4.7.2,)
+ [4.7.2,)
+ [6.0.10,)
+ [8.0.5,)
diff --git a/build/Common.targets b/build/Common.targets
index faf2349bae..37e016c07d 100644
--- a/build/Common.targets
+++ b/build/Common.targets
@@ -1,3 +1,23 @@
+
+
+
+
+
+
+
+
diff --git a/build/Projects/OpenTelemetry.Instrumentation.AWS.proj b/build/Projects/OpenTelemetry.Instrumentation.AWS.proj
new file mode 100644
index 0000000000..3b569606ba
--- /dev/null
+++ b/build/Projects/OpenTelemetry.Instrumentation.AWS.proj
@@ -0,0 +1,41 @@
+
+
+
+ $([System.IO.Directory]::GetParent($(MSBuildThisFileDirectory)).Parent.Parent.FullName)
+ Instrumentation.AWS-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/docker-compose.net6.0.yml b/build/docker-compose.net6.0.yml
deleted file mode 100644
index 099f100727..0000000000
--- a/build/docker-compose.net6.0.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-version: '3.7'
-
-services:
- tests:
- build:
- args:
- PUBLISH_FRAMEWORK: net6.0
- TEST_SDK_VERSION: "6.0"
- BUILD_SDK_VERSION: "8.0"
diff --git a/examples/AspNet/Examples.AspNet.csproj b/examples/AspNet/Examples.AspNet.csproj
index f25b7b5887..265a3c3319 100644
--- a/examples/AspNet/Examples.AspNet.csproj
+++ b/examples/AspNet/Examples.AspNet.csproj
@@ -57,7 +57,7 @@
-
+
diff --git a/examples/kafka/Examples.ConfluentKafka.csproj b/examples/kafka/Examples.ConfluentKafka.csproj
index c10dbfcb21..3f60ecbc1b 100644
--- a/examples/kafka/Examples.ConfluentKafka.csproj
+++ b/examples/kafka/Examples.ConfluentKafka.csproj
@@ -10,12 +10,10 @@
-
+
-
-
diff --git a/examples/wcf/client-core/Examples.Wcf.Client.DotNet.csproj b/examples/wcf/client-core/Examples.Wcf.Client.DotNet.csproj
index ac31365665..75dc57fc09 100644
--- a/examples/wcf/client-core/Examples.Wcf.Client.DotNet.csproj
+++ b/examples/wcf/client-core/Examples.Wcf.Client.DotNet.csproj
@@ -8,11 +8,9 @@
-
-
+
+
-
-
diff --git a/opentelemetry-dotnet-contrib.sln b/opentelemetry-dotnet-contrib.sln
index 011dc08d79..2d829e94fd 100644
--- a/opentelemetry-dotnet-contrib.sln
+++ b/opentelemetry-dotnet-contrib.sln
@@ -55,7 +55,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{824BD1DE
build\Common.props = build\Common.props
build\Common.targets = build\Common.targets
build\debug.snk = build\debug.snk
- build\docker-compose.net6.0.yml = build\docker-compose.net6.0.yml
build\docker-compose.net8.0.yml = build\docker-compose.net8.0.yml
build\opentelemetry-icon-color.png = build\opentelemetry-icon-color.png
build\OpenTelemetryContrib.prod.ruleset = build\OpenTelemetryContrib.prod.ruleset
@@ -295,6 +294,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Projects", "Projects", "{04
build\Projects\OpenTelemetry.Extensions.Enrichment.proj = build\Projects\OpenTelemetry.Extensions.Enrichment.proj
build\Projects\OpenTelemetry.Instrumentation.AspNet.proj = build\Projects\OpenTelemetry.Instrumentation.AspNet.proj
build\Projects\OpenTelemetry.Instrumentation.AspNetCore.proj = build\Projects\OpenTelemetry.Instrumentation.AspNetCore.proj
+ build\Projects\OpenTelemetry.Instrumentation.AWS.proj = build\Projects\OpenTelemetry.Instrumentation.AWS.proj
build\Projects\OpenTelemetry.Instrumentation.ConfluentKafka.proj = build\Projects\OpenTelemetry.Instrumentation.ConfluentKafka.proj
build\Projects\OpenTelemetry.Instrumentation.EventCounters.proj = build\Projects\OpenTelemetry.Instrumentation.EventCounters.proj
build\Projects\OpenTelemetry.Instrumentation.GrpcCore.proj = build\Projects\OpenTelemetry.Instrumentation.GrpcCore.proj
diff --git a/src/OpenTelemetry.Exporter.Geneva/CHANGELOG.md b/src/OpenTelemetry.Exporter.Geneva/CHANGELOG.md
index 47b1b1f495..e1fbedc7df 100644
--- a/src/OpenTelemetry.Exporter.Geneva/CHANGELOG.md
+++ b/src/OpenTelemetry.Exporter.Geneva/CHANGELOG.md
@@ -5,6 +5,15 @@
* Drop support for .NET 6 as this target is no longer supported.
([#2117](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/2117))
+* Added support for exporting metrics via
+ [user_events](https://docs.kernel.org/trace/user_events.html) on Linux when
+ OTLP protobuf encoding is enabled via the
+ `PrivatePreviewEnableOtlpProtobufEncoding=true` connection string switch. With
+ this, `PrivatePreviewEnableOtlpProtobufEncoding=true` is now supported on both
+ Widows and Linux. Windows uses ETW as transport, while Linux uses user_events
+ as transport.
+ ([#2113](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/2113))
+
## 1.9.0
Released 2024-Jun-21
diff --git a/src/OpenTelemetry.Exporter.Geneva/EventNameExportMode.cs b/src/OpenTelemetry.Exporter.Geneva/EventNameExportMode.cs
index ab0183c1e5..dd87d4e8c9 100644
--- a/src/OpenTelemetry.Exporter.Geneva/EventNameExportMode.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/EventNameExportMode.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
namespace OpenTelemetry.Exporter.Geneva;
///
diff --git a/src/OpenTelemetry.Exporter.Geneva/ExceptionStackExportMode.cs b/src/OpenTelemetry.Exporter.Geneva/ExceptionStackExportMode.cs
index de9e62607c..9030a32b9c 100644
--- a/src/OpenTelemetry.Exporter.Geneva/ExceptionStackExportMode.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/ExceptionStackExportMode.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
namespace OpenTelemetry.Exporter.Geneva;
///
diff --git a/src/OpenTelemetry.Exporter.Geneva/External/TraceLoggingDynamic.cs b/src/OpenTelemetry.Exporter.Geneva/External/TraceLoggingDynamic.cs
index e2cea7bb1f..ef2395dad8 100644
--- a/src/OpenTelemetry.Exporter.Geneva/External/TraceLoggingDynamic.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/External/TraceLoggingDynamic.cs
@@ -71,7 +71,6 @@ Most ETW decoding tools are unable to decode an event with more than 128
fields.
*/
-#nullable enable
namespace OpenTelemetry.Exporter.Geneva.External;
diff --git a/src/OpenTelemetry.Exporter.Geneva/GenevaBaseExporter.cs b/src/OpenTelemetry.Exporter.Geneva/GenevaBaseExporter.cs
index 452ae78f1e..0dcfe55ce3 100644
--- a/src/OpenTelemetry.Exporter.Geneva/GenevaBaseExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/GenevaBaseExporter.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
namespace OpenTelemetry.Exporter.Geneva;
///
diff --git a/src/OpenTelemetry.Exporter.Geneva/GenevaExporterHelperExtensions.cs b/src/OpenTelemetry.Exporter.Geneva/GenevaExporterHelperExtensions.cs
index fda33995c1..380000d30c 100644
--- a/src/OpenTelemetry.Exporter.Geneva/GenevaExporterHelperExtensions.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/GenevaExporterHelperExtensions.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Diagnostics;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
diff --git a/src/OpenTelemetry.Exporter.Geneva/GenevaExporterOptions.cs b/src/OpenTelemetry.Exporter.Geneva/GenevaExporterOptions.cs
index 849b294894..2d508399f4 100644
--- a/src/OpenTelemetry.Exporter.Geneva/GenevaExporterOptions.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/GenevaExporterOptions.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Text;
using OpenTelemetry.Internal;
diff --git a/src/OpenTelemetry.Exporter.Geneva/GenevaLogExporter.cs b/src/OpenTelemetry.Exporter.Geneva/GenevaLogExporter.cs
index 199e46ea08..b7970d1169 100644
--- a/src/OpenTelemetry.Exporter.Geneva/GenevaLogExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/GenevaLogExporter.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Runtime.InteropServices;
using OpenTelemetry.Exporter.Geneva.MsgPack;
using OpenTelemetry.Exporter.Geneva.Tld;
diff --git a/src/OpenTelemetry.Exporter.Geneva/GenevaLoggingExtensions.cs b/src/OpenTelemetry.Exporter.Geneva/GenevaLoggingExtensions.cs
index bc6bc3371e..3a0e4d1189 100644
--- a/src/OpenTelemetry.Exporter.Geneva/GenevaLoggingExtensions.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/GenevaLoggingExtensions.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Diagnostics;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
diff --git a/src/OpenTelemetry.Exporter.Geneva/GenevaTraceExporter.cs b/src/OpenTelemetry.Exporter.Geneva/GenevaTraceExporter.cs
index 5d472e2519..9393e0aa85 100644
--- a/src/OpenTelemetry.Exporter.Geneva/GenevaTraceExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/GenevaTraceExporter.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Diagnostics;
using System.Runtime.InteropServices;
using OpenTelemetry.Exporter.Geneva.MsgPack;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/ConnectionStringBuilder.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/ConnectionStringBuilder.cs
index fa8515ba0a..169f3f1a7e 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/ConnectionStringBuilder.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/ConnectionStringBuilder.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using OpenTelemetry.Exporter.Geneva.Transports;
@@ -244,6 +242,16 @@ public string ParseUnixDomainSocketPath()
}
}
+ public bool TryGetMetricsAccountAndNamespace(
+ [NotNullWhen(true)] out string? metricsAccount,
+ [NotNullWhen(true)] out string? metricsNamespace)
+ {
+ var hasAccount = this.parts.TryGetValue(nameof(this.Account), out metricsAccount);
+ var hasNamespace = this.parts.TryGetValue(nameof(this.Namespace), out metricsNamespace);
+
+ return hasAccount && hasNamespace;
+ }
+
///
/// Replace first charater of string if it matches with with .
///
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/ExporterEventSource.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/ExporterEventSource.cs
index 107acaf52d..19c4d4014d 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/ExporterEventSource.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/ExporterEventSource.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Diagnostics.Tracing;
using OpenTelemetry.Internal;
@@ -18,6 +16,9 @@ internal sealed class ExporterEventSource : EventSource
private const int EVENT_ID_ERROR = 4; // Other common exporter exceptions
private const int EVENT_ID_OTLP_PROTOBUF_METRIC = 5; // Failed to serialize metric
private const int EVENT_ID_COMPLETED_EXPORT = 6; // Completed export
+ private const int EVENT_ID_TRANSPORT_ERROR = 7; // Transport error
+ private const int EVENT_ID_TRANSPORT_EXCEPTION = 8; // Transport exception
+ private const int EVENT_ID_TRANSPORT_INFO = 9; // Transport info
[NonEvent]
public void FailedToSendTraceData(Exception ex)
@@ -76,6 +77,16 @@ public void FailedToSerializeMetric(string metricName, Exception ex)
}
}
+ [NonEvent]
+ public void TransportException(string transportType, string message, Exception ex)
+ {
+ if (Log.IsEnabled(EventLevel.Error, EventKeywords.All))
+ {
+ // TODO: Do not hit ETW size limit even for external library exception stack.
+ this.TransportException(transportType, message, ex.ToInvariantString());
+ }
+ }
+
[Event(EVENT_ID_TRACE, Message = "Exporter failed to send trace data. Exception: {0}", Level = EventLevel.Error)]
public void FailedToSendTraceData(string error)
{
@@ -111,4 +122,22 @@ public void ExportCompleted(string exporterName)
{
this.WriteEvent(EVENT_ID_COMPLETED_EXPORT, exporterName);
}
+
+ [Event(EVENT_ID_TRANSPORT_ERROR, Message = "Transport '{0}' error. Message: {1}", Level = EventLevel.Error)]
+ public void TransportError(string transportType, string error)
+ {
+ this.WriteEvent(EVENT_ID_TRANSPORT_ERROR, transportType, error);
+ }
+
+ [Event(EVENT_ID_TRANSPORT_EXCEPTION, Message = "Transport '{0}' error. Message: {1}, Exception: {2}", Level = EventLevel.Error)]
+ public void TransportException(string transportType, string error, string ex)
+ {
+ this.WriteEvent(EVENT_ID_TRANSPORT_EXCEPTION, transportType, error, ex);
+ }
+
+ [Event(EVENT_ID_TRANSPORT_INFO, Message = "Transport '{0}' information. Message: {1}", Level = EventLevel.Informational)]
+ public void TransportInformation(string transportType, string error)
+ {
+ this.WriteEvent(EVENT_ID_TRANSPORT_INFO, transportType, error);
+ }
}
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MessagePackSerializer.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MessagePackSerializer.cs
index ca0a5a4ce9..dd5c0312ac 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MessagePackSerializer.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MessagePackSerializer.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
#if NET
using System.Buffers.Binary;
#endif
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackExporter.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackExporter.cs
index 3d7bb7def1..cf91ac510d 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackExporter.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
#if NET
using System.Collections.Frozen;
#endif
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackLogExporter.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackLogExporter.cs
index 4371d7d373..0c845aaa9f 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackLogExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackLogExporter.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
#if NET
using System.Collections.Frozen;
#endif
@@ -175,7 +173,6 @@ internal ArraySegment SerializeLogRecord(LogRecord logRecord)
// `LogRecord.State` and `LogRecord.StateValues` were marked Obsolete in https://github.com/open-telemetry/opentelemetry-dotnet/pull/4334
#pragma warning disable 0618
IReadOnlyList>? listKvp;
-
if (logRecord.StateValues != null)
{
listKvp = logRecord.StateValues;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackTraceExporter.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackTraceExporter.cs
index 9c0d15beef..675305ad16 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackTraceExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/MsgPack/MsgPackTraceExporter.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
#if NET
using System.Collections.Frozen;
#endif
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/ReentrantActivityExportProcessor.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/ReentrantActivityExportProcessor.cs
index 59e732a10d..fff9eebf9c 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/ReentrantActivityExportProcessor.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/ReentrantActivityExportProcessor.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Diagnostics;
namespace OpenTelemetry.Exporter.Geneva;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/ReentrantExportProcessor.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/ReentrantExportProcessor.cs
index b53e74861f..b0da2159fc 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/ReentrantExportProcessor.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/ReentrantExportProcessor.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Linq.Expressions;
using System.Reflection;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/Schema.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/Schema.cs
index 39a9fb2931..b665743364 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/Schema.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/Schema.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
namespace OpenTelemetry.Exporter.Geneva;
internal static class Schema
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/TableNameSerializer.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/TableNameSerializer.cs
index 15282d29ae..db60ffe605 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/TableNameSerializer.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/TableNameSerializer.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Text;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/JsonSerializer.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/JsonSerializer.cs
index 8249dc0b50..35a2d8a960 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/JsonSerializer.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/JsonSerializer.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Text;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldExporter.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldExporter.cs
index 9c3712a94c..ca52b09a1f 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldExporter.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Diagnostics;
using System.Globalization;
using System.Runtime.CompilerServices;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldLogExporter.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldLogExporter.cs
index 96e7062a11..4aeb5895e8 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldLogExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldLogExporter.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Diagnostics;
using System.Globalization;
using System.Runtime.CompilerServices;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldTraceExporter.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldTraceExporter.cs
index 062e97c875..4e1ae97ceb 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldTraceExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/TldTraceExporter.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Diagnostics;
using System.Globalization;
using System.Text;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/UncheckedASCIIEncoding.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/UncheckedASCIIEncoding.cs
index 04085f22c2..25c4f19591 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/UncheckedASCIIEncoding.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/Tld/UncheckedASCIIEncoding.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Text;
using OpenTelemetry.Internal;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/EtwDataTransport.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/EtwDataTransport.cs
index d25d88fcf3..16797ef848 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/EtwDataTransport.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/EtwDataTransport.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
#if NET
using System.Diagnostics.CodeAnalysis;
#endif
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/IDataTransport.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/IDataTransport.cs
index 36746697ee..daccc87059 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/IDataTransport.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/IDataTransport.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
namespace OpenTelemetry.Exporter.Geneva.Transports;
internal interface IDataTransport
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/UnixDomainSocketDataTransport.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/UnixDomainSocketDataTransport.cs
index 741daa7516..cf395e03f8 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/UnixDomainSocketDataTransport.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/UnixDomainSocketDataTransport.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Diagnostics.CodeAnalysis;
using System.Net;
using System.Net.Sockets;
@@ -73,7 +71,7 @@ private bool Connect()
}
catch (Exception ex)
{
- ExporterEventSource.Log.ExporterException("UDS Connect failed.", ex);
+ ExporterEventSource.Log.TransportException(nameof(UnixDomainSocketDataTransport), "Attempt to connect to socket failed. Connection will be retried periodically until established.", ex);
return false;
}
diff --git a/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/UnixDomainSocketEndPoint.cs b/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/UnixDomainSocketEndPoint.cs
index 62f87ce1f1..a4d6ca0fc6 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/UnixDomainSocketEndPoint.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Internal/Transports/UnixDomainSocketEndPoint.cs
@@ -3,8 +3,6 @@
#if !NET
-#nullable enable
-
using System.Text;
using OpenTelemetry.Internal;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporter.cs b/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporter.cs
index ade4ff8593..ed78dda6ee 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporter.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Reflection;
using System.Text.RegularExpressions;
using OpenTelemetry.Exporter.Geneva.Metrics;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporterExtensions.cs b/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporterExtensions.cs
index 9f876453d4..c2642a17ed 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporterExtensions.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporterExtensions.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using OpenTelemetry.Internal;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporterOptions.cs b/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporterOptions.cs
index ca14f2d939..f00ab46b77 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporterOptions.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Metrics/GenevaMetricExporterOptions.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-#nullable enable
-
using System.Globalization;
using OpenTelemetry.Internal;
diff --git a/src/OpenTelemetry.Exporter.Geneva/Metrics/MetricSerializer.cs b/src/OpenTelemetry.Exporter.Geneva/Metrics/MetricSerializer.cs
index 07912927c2..14634665da 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Metrics/MetricSerializer.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Metrics/MetricSerializer.cs
@@ -174,11 +174,11 @@ internal static class MetricSerializer
/// Index of the buffer.
/// The value.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static void SerializeString(byte[] buffer, ref int bufferIndex, string value)
+ public static void SerializeString(byte[] buffer, ref int bufferIndex, string? value)
{
if (!string.IsNullOrEmpty(value))
{
- if (bufferIndex + value.Length + sizeof(short) >= buffer.Length)
+ if (bufferIndex + value!.Length + sizeof(short) >= buffer.Length)
{
// TODO: What should we do when the data is invalid?
}
@@ -391,12 +391,13 @@ public static unsafe void SerializeFloat64(byte[] buffer, ref int bufferIndex, d
/// Index of the buffer.
/// The value.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static void SerializeBase128String(byte[] buffer, ref int bufferIndex, string value)
+ public static void SerializeBase128String(byte[] buffer, ref int bufferIndex, string? value)
{
if (!string.IsNullOrEmpty(value))
{
- if (bufferIndex + value.Length + sizeof(short) >= buffer.Length)
+ if (bufferIndex + value!.Length + sizeof(short) >= buffer.Length)
{
+ // TODO: What should we do when the data is invalid?
}
var encodedValue = Encoding.UTF8.GetBytes(value);
diff --git a/src/OpenTelemetry.Exporter.Geneva/Metrics/OtlpProtobuf/OtlpProtobufMetricExporter.cs b/src/OpenTelemetry.Exporter.Geneva/Metrics/OtlpProtobuf/OtlpProtobufMetricExporter.cs
index a6bdffad6c..174e5ded5c 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Metrics/OtlpProtobuf/OtlpProtobufMetricExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Metrics/OtlpProtobuf/OtlpProtobufMetricExporter.cs
@@ -1,6 +1,7 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
+using System.Diagnostics;
using System.Runtime.InteropServices;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
@@ -15,17 +16,32 @@ internal sealed class OtlpProtobufMetricExporter : IDisposable
private readonly Func getResource;
- public OtlpProtobufMetricExporter(Func getResource, ConnectionStringBuilder connectionStringBuilder, IReadOnlyDictionary prepopulatedMetricDimensions)
+ public OtlpProtobufMetricExporter(
+ Func getResource,
+ ConnectionStringBuilder connectionStringBuilder,
+ IReadOnlyDictionary? prepopulatedMetricDimensions)
{
+ Debug.Assert(getResource != null, "getResource was null");
+
+ this.getResource = getResource!;
+
+#if NET6_0_OR_GREATER
+ IMetricDataTransport transport = !RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
+ ? MetricUnixUserEventsDataTransport.Instance
+ : MetricWindowsEventTracingDataTransport.Instance;
+#else
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
- // Temporary until we add support for user_events.
throw new NotSupportedException("Exporting data in protobuf format is not supported on Linux.");
}
- this.getResource = getResource;
+ var transport = MetricWindowsEventTracingDataTransport.Instance;
+#endif
- this.otlpProtobufSerializer = new OtlpProtobufSerializer(MetricWindowsEventTracingDataTransport.Instance, connectionStringBuilder, prepopulatedMetricDimensions);
+ this.otlpProtobufSerializer = new OtlpProtobufSerializer(
+ transport,
+ connectionStringBuilder,
+ prepopulatedMetricDimensions);
}
public ExportResult Export(in Batch batch)
diff --git a/src/OpenTelemetry.Exporter.Geneva/Metrics/OtlpProtobuf/OtlpProtobufSerializer.cs b/src/OpenTelemetry.Exporter.Geneva/Metrics/OtlpProtobuf/OtlpProtobufSerializer.cs
index 4680b09887..73123d6b5f 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Metrics/OtlpProtobuf/OtlpProtobufSerializer.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Metrics/OtlpProtobuf/OtlpProtobufSerializer.cs
@@ -1,6 +1,7 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
+using System.Diagnostics;
using System.Globalization;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
@@ -14,13 +15,13 @@ internal sealed class OtlpProtobufSerializer
private const int TagAndLengthSize = 4;
private readonly Dictionary> scopeMetrics = new();
- private readonly string metricNamespace;
- private readonly string metricAccount;
- private readonly byte[] prepopulatedNumberDataPointAttributes;
+ private readonly string? metricNamespace;
+ private readonly string? metricAccount;
+ private readonly byte[]? prepopulatedNumberDataPointAttributes;
private readonly int prepopulatedNumberDataPointAttributesLength;
- private readonly byte[] prepopulatedHistogramDataPointAttributes;
+ private readonly byte[]? prepopulatedHistogramDataPointAttributes;
private readonly int prepopulatedHistogramDataPointAttributesLength;
- private readonly byte[] prepopulatedExponentialHistogramDataPointAttributes;
+ private readonly byte[]? prepopulatedExponentialHistogramDataPointAttributes;
private readonly int prepopulatedExponentialHistogramDataPointAttributesLength;
private int resourceMetricTagAndLengthIndex;
private int scopeMetricsTagAndLengthIndex;
@@ -34,9 +35,14 @@ internal sealed class OtlpProtobufSerializer
private int metricPointValueIndex;
private ExportResult metricExportResult;
- public OtlpProtobufSerializer(IMetricDataTransport metricDataTransport, ConnectionStringBuilder connectionStringBuilder, IReadOnlyDictionary prepopulatedMetricDimensions)
+ public OtlpProtobufSerializer(
+ IMetricDataTransport metricDataTransport,
+ ConnectionStringBuilder? connectionStringBuilder,
+ IReadOnlyDictionary? prepopulatedMetricDimensions)
{
- this.MetricDataTransport = metricDataTransport;
+ Debug.Assert(metricDataTransport != null, "metricDataTransport was null");
+
+ this.MetricDataTransport = metricDataTransport!;
// Taking a arbitrary number here for writing attributes.
byte[] temp = new byte[20000];
@@ -44,40 +50,31 @@ public OtlpProtobufSerializer(IMetricDataTransport metricDataTransport, Connecti
{
// Initialize numberDataPoint attributes.
int cursor = 0;
- SerializeTags(temp, ref cursor, prepopulatedMetricDimensions, FieldNumberConstants.NumberDataPoint_attributes);
+ SerializeTags(temp, ref cursor, prepopulatedMetricDimensions!, FieldNumberConstants.NumberDataPoint_attributes);
this.prepopulatedNumberDataPointAttributes = new byte[cursor];
Array.Copy(temp, this.prepopulatedNumberDataPointAttributes, cursor);
this.prepopulatedNumberDataPointAttributesLength = cursor;
// Initialize histogramDataPoint attributes.
cursor = 0;
- SerializeTags(temp, ref cursor, prepopulatedMetricDimensions, FieldNumberConstants.HistogramDataPoint_attributes);
+ SerializeTags(temp, ref cursor, prepopulatedMetricDimensions!, FieldNumberConstants.HistogramDataPoint_attributes);
this.prepopulatedHistogramDataPointAttributes = new byte[cursor];
Array.Copy(temp, this.prepopulatedHistogramDataPointAttributes, cursor);
this.prepopulatedHistogramDataPointAttributesLength = cursor;
cursor = 0;
- SerializeTags(temp, ref cursor, prepopulatedMetricDimensions, FieldNumberConstants.ExponentialHistogramDataPoint_attributes);
+ SerializeTags(temp, ref cursor, prepopulatedMetricDimensions!, FieldNumberConstants.ExponentialHistogramDataPoint_attributes);
this.prepopulatedExponentialHistogramDataPointAttributes = new byte[cursor];
Array.Copy(temp, this.prepopulatedExponentialHistogramDataPointAttributes, cursor);
this.prepopulatedExponentialHistogramDataPointAttributesLength = cursor;
}
- try
- {
- if (connectionStringBuilder != null && connectionStringBuilder.Namespace != null)
- {
- this.metricNamespace = connectionStringBuilder.Namespace;
- }
-
- if (connectionStringBuilder != null && connectionStringBuilder.Account != null)
- {
- this.metricAccount = connectionStringBuilder.Account;
- }
- }
- catch
+ if (connectionStringBuilder?.TryGetMetricsAccountAndNamespace(
+ out var metricsAccount,
+ out var metricsNamespace) == true)
{
- // TODO: add log.
+ this.metricAccount = metricsAccount;
+ this.metricNamespace = metricsNamespace;
}
}
@@ -99,7 +96,7 @@ internal static void WriteInstrumentDetails(byte[] buffer, ref int cursor, Metri
}
}
- internal static void SerializeInstrumentationScope(byte[] buffer, ref int cursor, string name, IEnumerable> meterTags)
+ internal static void SerializeInstrumentationScope(byte[] buffer, ref int cursor, string name, IEnumerable>? meterTags)
{
int tagAndLengthIndex = cursor;
cursor += TagAndLengthSize;
@@ -145,7 +142,7 @@ internal static void SerializeTag(byte[] buffer, ref int cursor, string key, obj
{
case char:
case string:
- ProtobufSerializerHelper.WriteStringTag(buffer, ref cursor, FieldNumberConstants.AnyValue_string_value, Convert.ToString(value, CultureInfo.InvariantCulture));
+ ProtobufSerializerHelper.WriteStringTag(buffer, ref cursor, FieldNumberConstants.AnyValue_string_value, Convert.ToString(value, CultureInfo.InvariantCulture)!);
break;
case bool b:
ProtobufSerializerHelper.WriteBoolWithTag(buffer, ref cursor, FieldNumberConstants.AnyValue_bool_value, (bool)value);
@@ -165,7 +162,17 @@ internal static void SerializeTag(byte[] buffer, ref int cursor, string key, obj
ProtobufSerializerHelper.WriteDoubleWithTag(buffer, ref cursor, FieldNumberConstants.AnyValue_double_value, Convert.ToDouble(value, CultureInfo.InvariantCulture));
break;
default:
- ProtobufSerializerHelper.WriteStringTag(buffer, ref cursor, FieldNumberConstants.AnyValue_string_value, Convert.ToString(value, CultureInfo.InvariantCulture));
+ string repr;
+ try
+ {
+ repr = Convert.ToString(value, CultureInfo.InvariantCulture) ?? string.Empty;
+ }
+ catch
+ {
+ repr = $"ERROR: type {value.GetType().FullName} is not supported";
+ }
+
+ ProtobufSerializerHelper.WriteStringTag(buffer, ref cursor, FieldNumberConstants.AnyValue_string_value, repr);
break;
// TODO: Handle array type.
@@ -277,11 +284,11 @@ private static void SerializeExemplar(byte[] buffer, ref int cursor, in Exemp
{
// Casting to ulong is ok here as the bit representation for long versus ulong will be the same
// The difference would in the way the bit representation is interpreted on decoding side (signed versus unsigned)
- ProtobufSerializerHelper.WriteFixed64WithTag(buffer, ref cursor, FieldNumberConstants.Exemplar_as_int, (ulong)(long)(object)value);
+ ProtobufSerializerHelper.WriteFixed64WithTag(buffer, ref cursor, FieldNumberConstants.Exemplar_as_int, (ulong)(long)(object)value!);
}
else if (typeof(T) == typeof(double))
{
- ProtobufSerializerHelper.WriteDoubleWithTag(buffer, ref cursor, FieldNumberConstants.Exemplar_as_double, (double)(object)value);
+ ProtobufSerializerHelper.WriteDoubleWithTag(buffer, ref cursor, FieldNumberConstants.Exemplar_as_double, (double)(object)value!);
}
var time = (ulong)exemplar.Timestamp.ToUnixTimeNanoseconds();
@@ -306,11 +313,14 @@ private static void SerializeExemplarTags(byte[] buffer, ref int cursor, ReadOnl
{
foreach (var tag in tags)
{
- SerializeTag(buffer, ref cursor, tag.Key, tag.Value, FieldNumberConstants.Exemplar_attributes);
+ if (tag.Value != null)
+ {
+ SerializeTag(buffer, ref cursor, tag.Key, tag.Value, FieldNumberConstants.Exemplar_attributes);
+ }
}
}
- private static void SerializeTags(byte[] buffer, ref int cursor, IEnumerable> attributes, int fieldNumber)
+ private static void SerializeTags(byte[] buffer, ref int cursor, IEnumerable>? attributes, int fieldNumber)
{
if (attributes != null)
{
@@ -661,11 +671,11 @@ private void WriteNumberDataPoint(byte[] buffer, ref int cursor, int fieldNum
{
// Casting to ulong is ok here as the bit representation for long versus ulong will be the same
// The difference would in the way the bit representation is interpreted on decoding side (signed versus unsigned)
- ProtobufSerializerHelper.WriteFixed64WithTag(buffer, ref cursor, FieldNumberConstants.NumberDataPoint_as_int, (ulong)(long)(object)value);
+ ProtobufSerializerHelper.WriteFixed64WithTag(buffer, ref cursor, FieldNumberConstants.NumberDataPoint_as_int, (ulong)(long)(object)value!);
}
else if (typeof(T) == typeof(double))
{
- ProtobufSerializerHelper.WriteDoubleWithTag(buffer, ref cursor, FieldNumberConstants.NumberDataPoint_as_double, (double)(object)value);
+ ProtobufSerializerHelper.WriteDoubleWithTag(buffer, ref cursor, FieldNumberConstants.NumberDataPoint_as_double, (double)(object)value!);
}
var startTime = (ulong)metricPoint.StartTime.ToUnixTimeNanoseconds();
@@ -740,7 +750,7 @@ private void SerializeResource(byte[] buffer, ref int cursor, Resource resource)
cursor += TagAndLengthSize;
int valueIndex = cursor;
- SerializeTags(buffer, ref cursor, resource.Attributes, FieldNumberConstants.Resource_attributes);
+ SerializeTags(buffer, ref cursor, resource.Attributes!, FieldNumberConstants.Resource_attributes);
// TODO: check to see if should de-dupe in case the values are also provided via resource attributes.
if (this.metricAccount != null)
diff --git a/src/OpenTelemetry.Exporter.Geneva/Metrics/TlvMetricExporter.cs b/src/OpenTelemetry.Exporter.Geneva/Metrics/TlvMetricExporter.cs
index 78fcd1cce8..1fb5931871 100644
--- a/src/OpenTelemetry.Exporter.Geneva/Metrics/TlvMetricExporter.cs
+++ b/src/OpenTelemetry.Exporter.Geneva/Metrics/TlvMetricExporter.cs
@@ -14,15 +14,17 @@ internal sealed class TlvMetricExporter : IDisposable
private readonly ushort prepopulatedDimensionsCount;
private readonly int fixedPayloadStartIndex;
private readonly IMetricDataTransport metricDataTransport;
- private readonly List serializedPrepopulatedDimensionsKeys;
- private readonly List serializedPrepopulatedDimensionsValues;
+ private readonly List? serializedPrepopulatedDimensionsKeys;
+ private readonly List? serializedPrepopulatedDimensionsValues;
private readonly byte[] buffer = new byte[GenevaMetricExporter.BufferSize];
private readonly string defaultMonitoringAccount;
private readonly string defaultMetricNamespace;
private bool isDisposed;
- internal TlvMetricExporter(ConnectionStringBuilder connectionStringBuilder, IReadOnlyDictionary prepopulatedMetricDimensions)
+ internal TlvMetricExporter(
+ ConnectionStringBuilder connectionStringBuilder,
+ IReadOnlyDictionary? prepopulatedMetricDimensions)
{
this.defaultMonitoringAccount = connectionStringBuilder.Account;
this.defaultMetricNamespace = connectionStringBuilder.Namespace;
@@ -581,6 +583,21 @@ private static void SerializeHistogramBucketWithTLV(in HistogramBucket bucket, b
MetricSerializer.SerializeUInt32(buffer, ref bufferIndex, Convert.ToUInt32(bucket.BucketCount));
}
+ private static string? ConvertTagValueToString(object? value)
+ {
+ string? repr;
+ try
+ {
+ repr = Convert.ToString(value, CultureInfo.InvariantCulture);
+ }
+ catch
+ {
+ repr = $"ERROR: type {value?.GetType().FullName} is not supported";
+ }
+
+ return repr;
+ }
+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void SerializeDimensionsAndGetCustomAccountNamespace(in ReadOnlyTagCollection tags, byte[] buffer, ref int bufferIndex, out string monitoringAccount, out string metricNamespace)
{
@@ -602,7 +619,7 @@ private void SerializeDimensionsAndGetCustomAccountNamespace(in ReadOnlyTagColle
// Serialize PrepopulatedDimensions keys
for (ushort i = 0; i < this.prepopulatedDimensionsCount; i++)
{
- MetricSerializer.SerializeEncodedString(buffer, ref bufferIndex, this.serializedPrepopulatedDimensionsKeys[i]);
+ MetricSerializer.SerializeEncodedString(buffer, ref bufferIndex, this.serializedPrepopulatedDimensionsKeys![i]);
}
if (this.prepopulatedDimensionsCount > 0)
@@ -635,7 +652,7 @@ private void SerializeDimensionsAndGetCustomAccountNamespace(in ReadOnlyTagColle
// Serialize PrepopulatedDimensions values
for (ushort i = 0; i < this.prepopulatedDimensionsCount; i++)
{
- MetricSerializer.SerializeEncodedString(buffer, ref bufferIndex, this.serializedPrepopulatedDimensionsValues[i]);
+ MetricSerializer.SerializeEncodedString(buffer, ref bufferIndex, this.serializedPrepopulatedDimensionsValues![i]);
}
// Serialize MetricPoint Dimension values
@@ -661,8 +678,8 @@ private void SerializeDimensionsAndGetCustomAccountNamespace(in ReadOnlyTagColle
continue;
}
- var dimensionValue = Convert.ToString(tag.Value, CultureInfo.InvariantCulture);
- if (dimensionValue.Length > GenevaMetricExporter.MaxDimensionValueSize)
+ var dimensionValue = ConvertTagValueToString(tag.Value);
+ if (dimensionValue?.Length > GenevaMetricExporter.MaxDimensionValueSize)
{
// TODO: Data Validation
}
@@ -693,8 +710,11 @@ private List SerializePrepopulatedDimensionsValues(IEnumerable