diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index f2e67d4e55..7e00791451 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -21,7 +21,7 @@ body: - OpenTelemetry.Exporter.InfluxDB - OpenTelemetry.Exporter.Instana - OpenTelemetry.Exporter.OneCollector - - OpenTelemetry.Exporter.Stackdriver + - OpenTelemetry.Exporter.GoogleCloud - OpenTelemetry.Extensions - OpenTelemetry.Extensions.AWS - OpenTelemetry.Extensions.Enrichment diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 5461bf353a..64a7c49a5b 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -21,7 +21,7 @@ body: - OpenTelemetry.Exporter.InfluxDB - OpenTelemetry.Exporter.Instana - OpenTelemetry.Exporter.OneCollector - - OpenTelemetry.Exporter.Stackdriver + - OpenTelemetry.Exporter.GoogleCloud - OpenTelemetry.Extensions - OpenTelemetry.Extensions.AWS - OpenTelemetry.Extensions.Enrichment diff --git a/.github/ISSUE_TEMPLATE/release_request.yml b/.github/ISSUE_TEMPLATE/release_request.yml index b219f533ff..e0ef6d871c 100644 --- a/.github/ISSUE_TEMPLATE/release_request.yml +++ b/.github/ISSUE_TEMPLATE/release_request.yml @@ -19,7 +19,7 @@ body: - OpenTelemetry.Exporter.InfluxDB - OpenTelemetry.Exporter.Instana - OpenTelemetry.Exporter.OneCollector - - OpenTelemetry.Exporter.Stackdriver + - OpenTelemetry.Exporter.GoogleCloud - OpenTelemetry.Extensions - OpenTelemetry.Extensions.AWS - OpenTelemetry.Extensions.Enrichment diff --git a/.github/codecov.yml b/.github/codecov.yml index b94a66eb52..bc338e88cf 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -51,10 +51,10 @@ flags: paths: - src/OpenTelemetry.Exporter.OneCollector - unittests-Exporter.Stackdriver: + unittests-Exporter.GoogleCloud: carryforward: true paths: - - src/OpenTelemetry.Exporter.Stackdriver + - src/OpenTelemetry.Exporter.GoogleCloud unittests-Extensions: carryforward: true diff --git a/.github/component_owners.yml b/.github/component_owners.yml index 9648725d7b..79c83d2fcf 100644 --- a/.github/component_owners.yml +++ b/.github/component_owners.yml @@ -12,7 +12,7 @@ components: - zivaninstana src/OpenTelemetry.Exporter.OneCollector/: - rajkumar-rangaraj - src/OpenTelemetry.Exporter.Stackdriver/: + src/OpenTelemetry.Exporter.GoogleCloudMonitoring /: - SergeyKanzhelev src/OpenTelemetry.Extensions/: - mikegoldsmith @@ -99,7 +99,7 @@ components: - rajkumar-rangaraj test/OpenTelemetry.Exporter.OneCollector.Tests/: - rajkumar-rangaraj - test/OpenTelemetry.Exporter.Stackdriver.Tests/: + test/OpenTelemetry.Exporter.GoogleCloudMonitoring .Tests/: - SergeyKanzhelev test/OpenTelemetry.Extensions.Tests/: - mikegoldsmith diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee82dfb329..c0b0804207 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: exporter-influxdb: ['*/OpenTelemetry.Exporter.InfluxDB*/**', '!**/*.md'] exporter-instana: ['*/OpenTelemetry.Exporter.Instana*/**', '!**/*.md'] exporter-onecollector: ['*/OpenTelemetry.Exporter.OneCollector*/**', '!**/*.md'] - exporter-stackdriver: ['*/OpenTelemetry.Exporter.Stackdriver*/**', '!**/*.md'] + exporter-googlecloud: ['*/OpenTelemetry.Exporter.GoogleCloud*/**', '!**/*.md'] extensions: ['*/OpenTelemetry.Extensions/**', '*/OpenTelemetry.Extensions.Tests/**', '!**/*.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'] @@ -142,16 +142,16 @@ jobs: project-name: Component[OpenTelemetry.Exporter.OneCollector] code-cov-name: Exporter.OneCollector - build-test-exporter-stackdriver: + build-test-exporter-googlecloud: needs: detect-changes if: | - contains(needs.detect-changes.outputs.changes, 'exporter-stackdriver') + contains(needs.detect-changes.outputs.changes, 'exporter-googlecloud') || 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.Exporter.Stackdriver] - code-cov-name: Exporter.Stackdriver + project-name: Component[OpenTelemetry.Exporter.GoogleCloud] + code-cov-name: Exporter.GoogleCloudMonitoring build-test-extensions: needs: detect-changes @@ -606,7 +606,7 @@ jobs: build-test-exporter-influxdb, build-test-exporter-instana, build-test-exporter-onecollector, - build-test-exporter-stackdriver, + build-test-exporter-googlecloud, build-test-extensions, build-test-extensions-enrichment, build-test-instrumentation-aspnet, diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index eb6f2b7b78..6dc79f1304 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -10,7 +10,7 @@ on: - OpenTelemetry.Exporter.InfluxDB - OpenTelemetry.Exporter.Instana - OpenTelemetry.Exporter.OneCollector - - OpenTelemetry.Exporter.Stackdriver + - OpenTelemetry.Exporter.GoogleCloud - OpenTelemetry.Extensions - OpenTelemetry.Extensions.AWS - OpenTelemetry.Extensions.Enrichment diff --git a/opentelemetry-dotnet-contrib.sln b/opentelemetry-dotnet-contrib.sln index 9dea59b245..42c19f755c 100644 --- a/opentelemetry-dotnet-contrib.sln +++ b/opentelemetry-dotnet-contrib.sln @@ -118,9 +118,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "owin", "owin", "{8D11A34C-D EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Examples.Owin", "examples\owin\Examples.Owin.csproj", "{6B3AA3F2-89A7-433F-918A-1E5E6AAF8423}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Exporter.Stackdriver", "src\OpenTelemetry.Exporter.Stackdriver\OpenTelemetry.Exporter.Stackdriver.csproj", "{8A25B43D-BBB2-40FF-B0EB-33AACCD15AD7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Exporter.GoogleCloud", "src\OpenTelemetry.Exporter.GoogleCloud\OpenTelemetry.Exporter.GoogleCloud.csproj", "{8A25B43D-BBB2-40FF-B0EB-33AACCD15AD7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Exporter.Stackdriver.Tests", "test\OpenTelemetry.Exporter.Stackdriver.Tests\OpenTelemetry.Exporter.Stackdriver.Tests.csproj", "{8DABC11A-624E-4554-ACA4-D5B80146B9C6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Exporter.GoogleCloud.Tests", "test\OpenTelemetry.Exporter.GoogleCloud.Tests\OpenTelemetry.Exporter.GoogleCloud.Tests.csproj", "{8DABC11A-624E-4554-ACA4-D5B80146B9C6}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Instrumentation.ElasticsearchClient", "src\OpenTelemetry.Instrumentation.ElasticsearchClient\OpenTelemetry.Instrumentation.ElasticsearchClient.csproj", "{96F5B85B-402B-4DFB-AF31-33D5A2EBE35B}" EndProject diff --git a/src/OpenTelemetry.Exporter.Stackdriver/.publicApi/PublicAPI.Shipped.txt b/src/OpenTelemetry.Exporter.GoogleCloud/.publicApi/PublicAPI.Shipped.txt similarity index 100% rename from src/OpenTelemetry.Exporter.Stackdriver/.publicApi/PublicAPI.Shipped.txt rename to src/OpenTelemetry.Exporter.GoogleCloud/.publicApi/PublicAPI.Shipped.txt diff --git a/src/OpenTelemetry.Exporter.Stackdriver/.publicApi/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Exporter.GoogleCloud/.publicApi/PublicAPI.Unshipped.txt similarity index 100% rename from src/OpenTelemetry.Exporter.Stackdriver/.publicApi/PublicAPI.Unshipped.txt rename to src/OpenTelemetry.Exporter.GoogleCloud/.publicApi/PublicAPI.Unshipped.txt diff --git a/src/OpenTelemetry.Exporter.Stackdriver/CHANGELOG.md b/src/OpenTelemetry.Exporter.GoogleCloud/CHANGELOG.md similarity index 84% rename from src/OpenTelemetry.Exporter.Stackdriver/CHANGELOG.md rename to src/OpenTelemetry.Exporter.GoogleCloud/CHANGELOG.md index ad37757863..2e1e032fa3 100644 --- a/src/OpenTelemetry.Exporter.Stackdriver/CHANGELOG.md +++ b/src/OpenTelemetry.Exporter.GoogleCloud/CHANGELOG.md @@ -13,7 +13,17 @@ * Updated OpenTelemetry core component version(s) to `1.12.0`. ([#2725](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/2725)) - +* Rename the namespaces to replace the `StackDrive` with GoogleCloud from them: + 1. `OpenTelemetry.Exporter.Stackdriver` -> + `OpenTelemetry.Exporter.GoogleCloud` + 2. `OpenTelemetry.Exporter.StackdriverImplementation` -> + `OpenTelemetry.Exporter.GoogleCloud.Implementation` + 3. `OpenTelemetry.Exporter.Stackdriver.Utils` -> + `OpenTelemetry.Exporter.GoogleCloud.Utils` +* Going forward the NuGet package will be + [`OpenTelemetry.Exporter.GoogleCloud`](https://www.nuget.org/packages/OpenTelemetry.Exporter.GoogleCloud). + Older versions will remain at + [`OpenTelemetry.Exporter.Stackdriver`](https://www.nuget.org/packages/OpenTelemetry.Exporter.Stackdriver). ## 1.0.0-beta.6 Released 2024-Apr-22 diff --git a/src/OpenTelemetry.Exporter.GoogleCloud/GoogleCloudMonitoringExporter.cs b/src/OpenTelemetry.Exporter.GoogleCloud/GoogleCloudMonitoringExporter.cs new file mode 100644 index 0000000000..a35869bf8d --- /dev/null +++ b/src/OpenTelemetry.Exporter.GoogleCloud/GoogleCloudMonitoringExporter.cs @@ -0,0 +1,245 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using Google.Api; +using Google.Api.Gax.Grpc; +using Google.Api.Gax.ResourceNames; +using Google.Cloud.Monitoring.V3; +using Google.Protobuf.Collections; +using Google.Protobuf.WellKnownTypes; +using Grpc.Core; +using OpenTelemetry.Exporter.GoogleCloud.Implementation; +using OpenTelemetry.Metrics; +using Metric = OpenTelemetry.Metrics.Metric; + +namespace OpenTelemetry.Exporter.GoogleCloud; + +/// +/// Exports a metrics to Google Cloud Monitoring . +/// +[Obsolete("This exporter is deprecated and might be removed in a future version. Please consider using directly OTPL directly: https://cloud.google.com/stackdriver/docs/reference/telemetry/overview")] +public class GoogleCloudMonitoringExporter : BaseExporter +{ + private readonly ProjectName projectName; + private readonly MetricServiceSettings? metricServiceSettings; + private MetricServiceClient? metricServiceClient; + +#pragma warning disable CA1810 // Initialize reference type static fields inline + static GoogleCloudMonitoringExporter() +#pragma warning restore CA1810 // Initialize reference type static fields inline + { + try + { + var assemblyPackageVersion = typeof(GoogleCloudTraceExporter).GetTypeInfo().Assembly + .GetCustomAttributes().First().InformationalVersion; + GoogleCloudMetricExportVersion = assemblyPackageVersion; + } + catch (Exception) + { + GoogleCloudMetricExportVersion = $"{Constants.PackagVersionUndefined}"; + } + + try + { + OpenTelemetryExporterVersion = Assembly.GetCallingAssembly().GetName().Version!.ToString(); + } + catch (Exception) + { + OpenTelemetryExporterVersion = $"{Constants.PackagVersionUndefined}"; + } + } + + private static string OpenTelemetryExporterVersion { get; set; } + + private static string GoogleCloudMetricExportVersion { get; set; } + + /// + /// Initializes a new instance of the class. + /// + /// Project ID to send telemetry to. + public GoogleCloudMonitoringExporter(string projectId) + { + this.projectName = new ProjectName(projectId); + + // Set header mutation for every outgoing API call to Google Cloud Monitoring so the BE knows + // which version of OC client is calling it as well as which version of the exporter + var callSettings = CallSettings.FromHeaderMutation(StackdriverCallHeaderAppender); + this.metricServiceSettings = new MetricServiceSettings { CallSettings = callSettings }; + } + + /// + /// Initializes a new instance of the class. + /// Only used internally for tests. + /// + /// Project ID to send telemetry to. + /// MetricServiceClient instance to use. + [ExcludeFromCodeCoverage] + internal GoogleCloudMonitoringExporter(string projectId, MetricServiceClient metricServiceClient) + : this(projectId) + { + this.metricServiceClient = metricServiceClient; + } + + /// + public override ExportResult Export(in Batch batch) + { + this.metricServiceClient ??= + new MetricServiceClientBuilder { Settings = this.metricServiceSettings, }.Build(); + var timeSeriesList = new List(); + + foreach (var metric in batch) + { + foreach (var point in metric.GetMetricPoints()) + { + var ts = CreateTimeSeriesForMetricPoint(metric, point); + timeSeriesList.Add(ts); + } + } + + if (timeSeriesList.Count > 0) + { + this.metricServiceClient.CreateTimeSeries(this.projectName, timeSeriesList); + } + + return ExportResult.Success; + } + + private static TimeSeries CreateTimeSeriesForMetricPoint(Metric metric, MetricPoint point) + { + MetricDescriptor.Types.MetricKind metricKind; + MetricDescriptor.Types.ValueType valueType; + TypedValue value; + + switch (metric.MetricType) + { + case MetricType.DoubleGauge: + metricKind = MetricDescriptor.Types.MetricKind.Gauge; + valueType = MetricDescriptor.Types.ValueType.Double; + value = new TypedValue { DoubleValue = point.GetGaugeLastValueDouble() }; + break; + case MetricType.LongGauge: + metricKind = MetricDescriptor.Types.MetricKind.Gauge; + valueType = MetricDescriptor.Types.ValueType.Int64; + value = new TypedValue { Int64Value = point.GetGaugeLastValueLong() }; + break; + case MetricType.DoubleSum: + metricKind = MetricDescriptor.Types.MetricKind.Cumulative; + valueType = MetricDescriptor.Types.ValueType.Double; + value = new TypedValue { DoubleValue = point.GetSumDouble() }; + break; + case MetricType.LongSum: + metricKind = MetricDescriptor.Types.MetricKind.Cumulative; + valueType = MetricDescriptor.Types.ValueType.Int64; + value = new TypedValue { Int64Value = point.GetSumLong() }; + break; + case MetricType.DoubleSumNonMonotonic: + metricKind = MetricDescriptor.Types.MetricKind.Gauge; + valueType = MetricDescriptor.Types.ValueType.Double; + value = new TypedValue { DoubleValue = point.GetSumDouble() }; + break; + case MetricType.LongSumNonMonotonic: + metricKind = MetricDescriptor.Types.MetricKind.Gauge; + valueType = MetricDescriptor.Types.ValueType.Int64; + value = new TypedValue { Int64Value = point.GetSumLong() }; + break; + case MetricType.Histogram: + metricKind = MetricDescriptor.Types.MetricKind.Cumulative; + valueType = MetricDescriptor.Types.ValueType.Distribution; + var count = point.GetHistogramCount(); + var sum = point.GetHistogramSum(); + var mean = count > 0 ? sum / count : 0; + var buckets = point.GetHistogramBuckets(); + + value = new TypedValue + { + DistributionValue = new Distribution + { + Count = count, + Mean = mean, + BucketCounts = { ToRepeatedField(buckets) }, + BucketOptions = new Distribution.Types.BucketOptions + { + ExplicitBuckets = new Distribution.Types.BucketOptions.Types.Explicit + { + Bounds = { ToRepeatedFieldBounds(buckets) }, + }, + }, + }, + }; + break; + case MetricType.ExponentialHistogram: + throw new NotImplementedException("ExponentialHistogram is not supported yet."); + default: + metricKind = MetricDescriptor.Types.MetricKind.Gauge; + valueType = MetricDescriptor.Types.ValueType.Double; + value = new TypedValue { DoubleValue = point.GetSumDouble() }; + break; + } + + return new TimeSeries + { + Metric = new Google.Api.Metric { Type = $"custom.googleapis.com/opentelemetry/{metric.Name}" }, + Resource = new MonitoredResource { Type = "global" }, + MetricKind = metricKind, + ValueType = valueType, + Points = + { + new Point + { + Interval = new TimeInterval + { + StartTime = Timestamp.FromDateTimeOffset(point.StartTime), + EndTime = Timestamp.FromDateTimeOffset(point.EndTime), + }, + Value = value, + }, + }, + }; + } + + private static RepeatedField ToRepeatedField(HistogramBuckets? buckets) + { + var result = new RepeatedField(); + if (buckets == null) + { + return result; + } + + foreach (var count in buckets) + { + result.Add(count.BucketCount); + } + + return result; + } + + private static RepeatedField ToRepeatedFieldBounds(HistogramBuckets? buckets) + { + var result = new RepeatedField(); + if (buckets == null) + { + return result; + } + + foreach (var bucket in buckets) + { + result.Add(bucket.ExplicitBound); + } + + return result; + } + + /// + /// Appends OpenTelemetry headers for every outgoing request to Stackdriver Backend. + /// + /// The metadata that is sent with every outgoing http request. + private static void StackdriverCallHeaderAppender(Metadata metadata) + { + metadata.Add("AGENT_LABEL_KEY", "g.co/agent"); + metadata.Add( + "AGENT_LABEL_VALUE_STRING", + $"{OpenTelemetryExporterVersion}; googlecloud-exporter {GoogleCloudMetricExportVersion}"); + } +} diff --git a/src/OpenTelemetry.Exporter.Stackdriver/StackdriverTraceExporter.cs b/src/OpenTelemetry.Exporter.GoogleCloud/GoogleCloudTraceExporter.cs similarity index 73% rename from src/OpenTelemetry.Exporter.Stackdriver/StackdriverTraceExporter.cs rename to src/OpenTelemetry.Exporter.GoogleCloud/GoogleCloudTraceExporter.cs index 5aa5067fd2..a880974f08 100644 --- a/src/OpenTelemetry.Exporter.Stackdriver/StackdriverTraceExporter.cs +++ b/src/OpenTelemetry.Exporter.GoogleCloud/GoogleCloudTraceExporter.cs @@ -7,16 +7,17 @@ using Google.Api.Gax.Grpc; using Google.Cloud.Trace.V2; using Grpc.Core; -using OpenTelemetry.Exporter.Stackdriver.Implementation; +using OpenTelemetry.Exporter.GoogleCloud.Implementation; -namespace OpenTelemetry.Exporter.Stackdriver; +namespace OpenTelemetry.Exporter.GoogleCloud; /// -/// Exports a group of spans to Stackdriver. +/// Exports a group of spans to Google Cloud. /// -public class StackdriverTraceExporter : BaseExporter +[Obsolete("This exporter is deprecated and might be removed in a future version. Please consider using directly OTPL directly: https://cloud.google.com/stackdriver/docs/reference/telemetry/overview")] +public class GoogleCloudTraceExporter : BaseExporter { - private static readonly string StackdriverExportVersion; + private static readonly string GoogleCloudTraceExportVersion; private static readonly string OpenTelemetryExporterVersion; private readonly Google.Api.Gax.ResourceNames.ProjectName googleCloudProjectId; @@ -24,17 +25,17 @@ public class StackdriverTraceExporter : BaseExporter private readonly TraceServiceClient? traceServiceClient; #pragma warning disable CA1810 // Initialize reference type static fields inline - static StackdriverTraceExporter() + static GoogleCloudTraceExporter() #pragma warning restore CA1810 // Initialize reference type static fields inline { try { - var assemblyPackageVersion = typeof(StackdriverTraceExporter).GetTypeInfo().Assembly.GetCustomAttributes().First().InformationalVersion; - StackdriverExportVersion = assemblyPackageVersion; + var assemblyPackageVersion = typeof(GoogleCloudTraceExporter).GetTypeInfo().Assembly.GetCustomAttributes().First().InformationalVersion; + GoogleCloudTraceExportVersion = assemblyPackageVersion; } catch (Exception) { - StackdriverExportVersion = $"{Constants.PackagVersionUndefined}"; + GoogleCloudTraceExportVersion = $"{Constants.PackagVersionUndefined}"; } try @@ -48,27 +49,27 @@ static StackdriverTraceExporter() } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// Project ID to send telemetry to. - public StackdriverTraceExporter(string projectId) + public GoogleCloudTraceExporter(string projectId) { this.googleCloudProjectId = new Google.Api.Gax.ResourceNames.ProjectName(projectId); - // Set header mutation for every outgoing API call to Stackdriver so the BE knows + // Set header mutation for every outgoing API call to Google Cloud so the BE knows // which version of OC client is calling it as well as which version of the exporter - var callSettings = CallSettings.FromHeaderMutation(StackdriverCallHeaderAppender); + var callSettings = CallSettings.FromHeaderMutation(GoogleCloudCallHeaderAppender); this.traceServiceSettings = new TraceServiceSettings { CallSettings = callSettings }; } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// Only used internally for tests. /// /// Project ID to send telemetry to. /// TraceServiceClient instance to use. [ExcludeFromCodeCoverage] - internal StackdriverTraceExporter(string projectId, TraceServiceClient traceServiceClient) + internal GoogleCloudTraceExporter(string projectId, TraceServiceClient traceServiceClient) : this(projectId) { this.traceServiceClient = traceServiceClient; @@ -111,7 +112,7 @@ public override ExportResult Export(in Batch batch) } catch (Exception ex) { - ExporterStackdriverEventSource.Log.ExportMethodException(ex); + ExporterGoogleCloudEventSource.Log.ExportMethodException(ex); return ExportResult.Failure; } @@ -123,9 +124,9 @@ public override ExportResult Export(in Batch batch) /// Appends OpenTelemetry headers for every outgoing request to Stackdriver Backend. /// /// The metadata that is sent with every outgoing http request. - private static void StackdriverCallHeaderAppender(Metadata metadata) + private static void GoogleCloudCallHeaderAppender(Metadata metadata) { metadata.Add("AGENT_LABEL_KEY", "g.co/agent"); - metadata.Add("AGENT_LABEL_VALUE_STRING", $"{OpenTelemetryExporterVersion}; stackdriver-exporter {StackdriverExportVersion}"); + metadata.Add("AGENT_LABEL_VALUE_STRING", $"{OpenTelemetryExporterVersion}; googlecloud-exporter {GoogleCloudTraceExportVersion}"); } } diff --git a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/ActivityExtensions.cs b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ActivityExtensions.cs similarity index 96% rename from src/OpenTelemetry.Exporter.Stackdriver/Implementation/ActivityExtensions.cs rename to src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ActivityExtensions.cs index d833dc9eed..5ca2216e01 100644 --- a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/ActivityExtensions.cs +++ b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ActivityExtensions.cs @@ -7,7 +7,7 @@ using Google.Protobuf.WellKnownTypes; using OpenTelemetry.Trace; -namespace OpenTelemetry.Exporter.Stackdriver.Implementation; +namespace OpenTelemetry.Exporter.GoogleCloud.Implementation; internal static class ActivityExtensions { @@ -24,7 +24,7 @@ internal static class ActivityExtensions }; /// - /// Translating to Stackdriver's Span + /// Translating to GoogleCloudMonitoring 's Span /// According to specifications. /// /// Activity in OpenTelemetry format. diff --git a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/Constants.cs b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/Constants.cs similarity index 81% rename from src/OpenTelemetry.Exporter.Stackdriver/Implementation/Constants.cs rename to src/OpenTelemetry.Exporter.GoogleCloud/Implementation/Constants.cs index 9a642cdda6..900297095c 100644 --- a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/Constants.cs +++ b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/Constants.cs @@ -1,7 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -namespace OpenTelemetry.Exporter.Stackdriver.Implementation; +namespace OpenTelemetry.Exporter.GoogleCloud.Implementation; internal class Constants { diff --git a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/ExporterStackdriverEventSource.cs b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ExporterGoogleCloudEventSource.cs similarity index 54% rename from src/OpenTelemetry.Exporter.Stackdriver/Implementation/ExporterStackdriverEventSource.cs rename to src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ExporterGoogleCloudEventSource.cs index 66715f6cb0..2f453459b5 100644 --- a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/ExporterStackdriverEventSource.cs +++ b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ExporterGoogleCloudEventSource.cs @@ -4,12 +4,12 @@ using System.Diagnostics.Tracing; using OpenTelemetry.Internal; -namespace OpenTelemetry.Exporter.Stackdriver.Implementation; +namespace OpenTelemetry.Exporter.GoogleCloud.Implementation; -[EventSource(Name = "OpenTelemetry-Exporter-Stackdriver")] -internal class ExporterStackdriverEventSource : EventSource +[EventSource(Name = "OpenTelemetry-Exporter-GoogleCloudMonitoring ")] +internal class ExporterGoogleCloudEventSource : EventSource { - public static readonly ExporterStackdriverEventSource Log = new(); + public static readonly ExporterGoogleCloudEventSource Log = new(); [NonEvent] public void ExportMethodException(Exception ex) @@ -20,7 +20,7 @@ public void ExportMethodException(Exception ex) } } - [Event(3, Message = "Stackdriver exporter encountered an error while exporting. Exception: {0}", Level = EventLevel.Error)] + [Event(3, Message = "GoogleCloudMonitoring exporter encountered an error while exporting. Exception: {0}", Level = EventLevel.Error)] public void ExportMethodException(string ex) { this.WriteEvent(1, ex); diff --git a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/GoogleCloudResourceUtils.cs b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/GoogleCloudResourceUtils.cs similarity index 94% rename from src/OpenTelemetry.Exporter.Stackdriver/Implementation/GoogleCloudResourceUtils.cs rename to src/OpenTelemetry.Exporter.GoogleCloud/Implementation/GoogleCloudResourceUtils.cs index 253b7c1169..d2acb297ba 100644 --- a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/GoogleCloudResourceUtils.cs +++ b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/GoogleCloudResourceUtils.cs @@ -3,7 +3,7 @@ using Google.Api; -namespace OpenTelemetry.Exporter.Stackdriver.Implementation; +namespace OpenTelemetry.Exporter.GoogleCloud.Implementation; /// /// Utility methods for working with Google Cloud Resources. @@ -44,7 +44,7 @@ public static class GoogleCloudResourceUtils /// Determining the resource to which the metrics belong. /// /// The project id. - /// Stackdriver Monitored Resource. + /// GoogleCloudMonitoring Monitored Resource. public static MonitoredResource GetDefaultResource(string? projectId) { var resource = new MonitoredResource(); diff --git a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/StackdriverStatsConfiguration.cs b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/GoogleCloudStatsConfiguration.cs similarity index 78% rename from src/OpenTelemetry.Exporter.Stackdriver/Implementation/StackdriverStatsConfiguration.cs rename to src/OpenTelemetry.Exporter.GoogleCloud/Implementation/GoogleCloudStatsConfiguration.cs index 06da734ec2..0fb26d5a29 100644 --- a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/StackdriverStatsConfiguration.cs +++ b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/GoogleCloudStatsConfiguration.cs @@ -4,23 +4,23 @@ using Google.Api; using Google.Apis.Auth.OAuth2; -namespace OpenTelemetry.Exporter.Stackdriver.Implementation; +namespace OpenTelemetry.Exporter.GoogleCloud.Implementation; /// -/// Configuration for exporting stats into Stackdriver. +/// Configuration for exporting stats into GoogleCloudMonitoring . /// -public class StackdriverStatsConfiguration +public class GoogleCloudStatsConfiguration { private static readonly TimeSpan DefaultInterval = TimeSpan.FromMinutes(1); /// - /// Gets default Stats Configuration for Stackdriver. + /// Gets default Stats Configuration for GoogleCloudMonitoring . /// - public static StackdriverStatsConfiguration Default + public static GoogleCloudStatsConfiguration Default { get { - var defaultConfig = new StackdriverStatsConfiguration + var defaultConfig = new GoogleCloudStatsConfiguration { ExportInterval = DefaultInterval, ProjectId = GoogleCloudResourceUtils.GetProjectId(), @@ -38,7 +38,7 @@ public static StackdriverStatsConfiguration Default public TimeSpan ExportInterval { get; set; } /// - /// Gets or sets the prefix to append to every OpenTelemetry metric name in Stackdriver. + /// Gets or sets the prefix to append to every OpenTelemetry metric name in GoogleCloudMonitoring . /// public string? MetricNamePrefix { get; set; } @@ -48,7 +48,7 @@ public static StackdriverStatsConfiguration Default public string? ProjectId { get; set; } /// - /// Gets or sets credential used to authenticate against Google Stackdriver Monitoring APIs. + /// Gets or sets credential used to authenticate against Google GoogleCloudMonitoring Monitoring APIs. /// public GoogleCredential? GoogleCredential { get; set; } diff --git a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/ResourceExtensions.cs b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ResourceExtensions.cs similarity index 95% rename from src/OpenTelemetry.Exporter.Stackdriver/Implementation/ResourceExtensions.cs rename to src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ResourceExtensions.cs index 0b4d791253..c7d2c15117 100644 --- a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/ResourceExtensions.cs +++ b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ResourceExtensions.cs @@ -4,7 +4,7 @@ using Google.Cloud.Trace.V2; using OpenTelemetry.Resources; -namespace OpenTelemetry.Exporter.Stackdriver.Implementation; +namespace OpenTelemetry.Exporter.GoogleCloud.Implementation; internal static class ResourceExtensions { diff --git a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/ResourceSemanticConventions.cs b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ResourceSemanticConventions.cs similarity index 80% rename from src/OpenTelemetry.Exporter.Stackdriver/Implementation/ResourceSemanticConventions.cs rename to src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ResourceSemanticConventions.cs index b9b1b59a39..2b81f1532a 100644 --- a/src/OpenTelemetry.Exporter.Stackdriver/Implementation/ResourceSemanticConventions.cs +++ b/src/OpenTelemetry.Exporter.GoogleCloud/Implementation/ResourceSemanticConventions.cs @@ -1,7 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -namespace OpenTelemetry.Exporter.Stackdriver.Implementation; +namespace OpenTelemetry.Exporter.GoogleCloud.Implementation; internal class ResourceSemanticConventions { diff --git a/src/OpenTelemetry.Exporter.Stackdriver/OpenTelemetry.Exporter.Stackdriver.csproj b/src/OpenTelemetry.Exporter.GoogleCloud/OpenTelemetry.Exporter.GoogleCloud.csproj similarity index 87% rename from src/OpenTelemetry.Exporter.Stackdriver/OpenTelemetry.Exporter.Stackdriver.csproj rename to src/OpenTelemetry.Exporter.GoogleCloud/OpenTelemetry.Exporter.GoogleCloud.csproj index a291cb8043..c51f9b3e90 100644 --- a/src/OpenTelemetry.Exporter.Stackdriver/OpenTelemetry.Exporter.Stackdriver.csproj +++ b/src/OpenTelemetry.Exporter.GoogleCloud/OpenTelemetry.Exporter.GoogleCloud.csproj @@ -4,8 +4,8 @@ $(NetMinimumSupportedVersion);$(NetStandardMinimumSupportedVersion);$(NetFrameworkMinimumSupportedVersion) An OpenTelemetry .NET exporter that sends telemetry to Google Stackdriver. - $(PackageTags);Stackdriver;Google;GCP;distributed-tracing - Exporter.Stackdriver- + $(PackageTags);Google;GCP;distributed-tracing + Exporter.GoogleCloud- $(SupportedNetTargets) $(TargetFrameworks);$(NetFrameworkMinimumSupportedVersion) - Unit test project for Stackdriver Exporter for OpenTelemetry. + Unit test project for GoogleCloud Exporter for OpenTelemetry. - + @@ -23,7 +23,7 @@ diff --git a/test/OpenTelemetry.Exporter.Stackdriver.Tests/ResourceExtensionsTests.cs b/test/OpenTelemetry.Exporter.GoogleCloud.Tests/ResourceExtensionsTests.cs similarity index 94% rename from test/OpenTelemetry.Exporter.Stackdriver.Tests/ResourceExtensionsTests.cs rename to test/OpenTelemetry.Exporter.GoogleCloud.Tests/ResourceExtensionsTests.cs index 8072d0aca7..42df160d3b 100644 --- a/test/OpenTelemetry.Exporter.Stackdriver.Tests/ResourceExtensionsTests.cs +++ b/test/OpenTelemetry.Exporter.GoogleCloud.Tests/ResourceExtensionsTests.cs @@ -2,11 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 using Google.Cloud.Trace.V2; -using OpenTelemetry.Exporter.Stackdriver.Implementation; +using OpenTelemetry.Exporter.GoogleCloud.Implementation; using OpenTelemetry.Resources; using Xunit; -namespace OpenTelemetry.Exporter.Stackdriver.Tests; +namespace OpenTelemetry.Exporter.GoogleCloud.Tests; public class ResourceExtensionsTests { diff --git a/test/OpenTelemetry.Exporter.Stackdriver.Tests/StackdriverExporterTests.cs b/test/OpenTelemetry.Exporter.GoogleCloud.Tests/StackdriverExporterTests.cs similarity index 90% rename from test/OpenTelemetry.Exporter.Stackdriver.Tests/StackdriverExporterTests.cs rename to test/OpenTelemetry.Exporter.GoogleCloud.Tests/StackdriverExporterTests.cs index 5d6a65772c..33116ec530 100644 --- a/test/OpenTelemetry.Exporter.Stackdriver.Tests/StackdriverExporterTests.cs +++ b/test/OpenTelemetry.Exporter.GoogleCloud.Tests/StackdriverExporterTests.cs @@ -2,16 +2,16 @@ // SPDX-License-Identifier: Apache-2.0 using System.Diagnostics; -using OpenTelemetry.Exporter.Stackdriver.Implementation; +using OpenTelemetry.Exporter.GoogleCloud.Implementation; using OpenTelemetry.Resources; using OpenTelemetry.Trace; using Xunit; -namespace OpenTelemetry.Exporter.Stackdriver.Tests; +namespace OpenTelemetry.Exporter.GoogleCloud.Tests; -public class StackdriverExporterTests +public class GoogleCloudMonitoringExporterTests { - static StackdriverExporterTests() + static GoogleCloudMonitoringExporterTests() { Activity.DefaultIdFormat = ActivityIdFormat.W3C; Activity.ForceDefaultIdFormat = true; @@ -26,7 +26,7 @@ static StackdriverExporterTests() } [Fact] - public void StackdriverExporter_CustomActivityProcessor() + public void GoogleCloudMonitoringExporter_CustomActivityProcessor() { const string ActivitySourceName = "stackdriver.test"; var requestId = Guid.NewGuid(); @@ -50,7 +50,7 @@ public void StackdriverExporter_CustomActivityProcessor() var openTelemetrySdk = Sdk.CreateTracerProviderBuilder() .AddSource(ActivitySourceName) .AddProcessor(testActivityProcessor) - .UseStackdriverExporter("test").Build(); + .UseGoogleCloudExporter("test").Build(); var source = new ActivitySource(ActivitySourceName); var activity = source.StartActivity("Test Activity"); @@ -61,12 +61,12 @@ public void StackdriverExporter_CustomActivityProcessor() } [Fact] - public void StackdriverExporter_WithServiceNameMetadata() + public void GoogleCloudMonitoringExporter_WithServiceNameMetadata() { const string ActivitySourceName = "stackdriver.test"; var traceClient = new TestTraceServiceClient(throwException: false); - var activityExporter = new StackdriverTraceExporter("test_project", traceClient); + var activityExporter = new GoogleCloudTraceExporter("test_project", traceClient); var openTelemetrySdk = Sdk.CreateTracerProviderBuilder() .AddSource(ActivitySourceName) @@ -83,7 +83,7 @@ public void StackdriverExporter_WithServiceNameMetadata() } [Fact] - public void StackdriverExporter_TraceClientThrows_ExportResultFailure() + public void GoogleCloudMonitoringExporter_TraceClientThrows_ExportResultFailure() { Exception? exception; var result = ExportResult.Success; @@ -91,7 +91,7 @@ public void StackdriverExporter_TraceClientThrows_ExportResultFailure() const string ActivitySourceName = "stackdriver.test"; var source = new ActivitySource(ActivitySourceName); var traceClient = new TestTraceServiceClient(throwException: true); - var activityExporter = new StackdriverTraceExporter("test", traceClient); + var activityExporter = new GoogleCloudTraceExporter("test", traceClient); var processor = new BatchActivityExportProcessor(new InMemoryExporter(exportedItems)); @@ -119,7 +119,7 @@ void RunTest(Batch batch) } [Fact] - public void StackdriverExporter_TraceClientDoesNotTrow_ExportResultSuccess() + public void GoogleCloudMonitoringExporter_TraceClientDoesNotTrow_ExportResultSuccess() { Exception? exception; var result = ExportResult.Failure; @@ -127,7 +127,7 @@ public void StackdriverExporter_TraceClientDoesNotTrow_ExportResultSuccess() const string ActivitySourceName = "stackdriver.test"; var source = new ActivitySource(ActivitySourceName); var traceClient = new TestTraceServiceClient(throwException: false); - var activityExporter = new StackdriverTraceExporter("test", traceClient); + var activityExporter = new GoogleCloudTraceExporter("test", traceClient); var processor = new BatchActivityExportProcessor(new InMemoryExporter(exportedItems)); diff --git a/test/OpenTelemetry.Exporter.Stackdriver.Tests/TestActivityProcessor.cs b/test/OpenTelemetry.Exporter.GoogleCloud.Tests/TestActivityProcessor.cs similarity index 96% rename from test/OpenTelemetry.Exporter.Stackdriver.Tests/TestActivityProcessor.cs rename to test/OpenTelemetry.Exporter.GoogleCloud.Tests/TestActivityProcessor.cs index e82193e16a..113cb32874 100644 --- a/test/OpenTelemetry.Exporter.Stackdriver.Tests/TestActivityProcessor.cs +++ b/test/OpenTelemetry.Exporter.GoogleCloud.Tests/TestActivityProcessor.cs @@ -3,7 +3,7 @@ using System.Diagnostics; -namespace OpenTelemetry.Exporter.Stackdriver.Tests; +namespace OpenTelemetry.Exporter.GoogleCloud.Tests; internal class TestActivityProcessor : BaseProcessor, IDisposable { diff --git a/test/OpenTelemetry.Exporter.Stackdriver.Tests/TestTraceServiceClient.cs b/test/OpenTelemetry.Exporter.GoogleCloud.Tests/TestTraceServiceClient.cs similarity index 92% rename from test/OpenTelemetry.Exporter.Stackdriver.Tests/TestTraceServiceClient.cs rename to test/OpenTelemetry.Exporter.GoogleCloud.Tests/TestTraceServiceClient.cs index 8baebef691..5dee351b8a 100644 --- a/test/OpenTelemetry.Exporter.Stackdriver.Tests/TestTraceServiceClient.cs +++ b/test/OpenTelemetry.Exporter.GoogleCloud.Tests/TestTraceServiceClient.cs @@ -5,7 +5,7 @@ using Google.Cloud.Trace.V2; using Grpc.Core; -namespace OpenTelemetry.Exporter.Stackdriver.Tests; +namespace OpenTelemetry.Exporter.GoogleCloud.Tests; internal class TestTraceServiceClient(bool throwException) : TraceServiceClient { diff --git a/test/OpenTelemetry.Exporter.Stackdriver.Tests/Implementation/StackdriverStatsConfigurationTests.cs b/test/OpenTelemetry.Exporter.Stackdriver.Tests/Implementation/StackdriverStatsConfigurationTests.cs deleted file mode 100644 index caaea64bc7..0000000000 --- a/test/OpenTelemetry.Exporter.Stackdriver.Tests/Implementation/StackdriverStatsConfigurationTests.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -using OpenTelemetry.Exporter.Stackdriver.Implementation; -using Xunit; - -namespace OpenTelemetry.Exporter.Stackdriver.Tests; - -public class StackdriverStatsConfigurationTests -{ - public StackdriverStatsConfigurationTests() - { - // Setting this for unit testing purposes, so we don't need credentials for real Google Cloud Account - Environment.SetEnvironmentVariable("GOOGLE_PROJECT_ID", "test", EnvironmentVariableTarget.Process); - } - - [Fact] - public void StatsConfiguration_ByDefault_MetricNamePrefixEmpty() - { - Assert.NotNull(StackdriverStatsConfiguration.Default); - Assert.Equal(GoogleCloudResourceUtils.GetProjectId(), StackdriverStatsConfiguration.Default.ProjectId); - Assert.Equal(string.Empty, StackdriverStatsConfiguration.Default.MetricNamePrefix); - } - - [Fact] - public void StatsConfiguration_ByDefault_ProjectIdIsGoogleCloudProjectId() - { - Assert.NotNull(StackdriverStatsConfiguration.Default); - Assert.Equal(GoogleCloudResourceUtils.GetProjectId(), StackdriverStatsConfiguration.Default.ProjectId); - } - - [Fact] - public void StatsConfiguration_ByDefault_ExportIntervalMinute() - { - Assert.Equal(TimeSpan.FromMinutes(1), StackdriverStatsConfiguration.Default.ExportInterval); - } - - [Fact] - public void StatsConfiguration_ByDefault_MonitoredResourceIsGlobal() - { - Assert.NotNull(StackdriverStatsConfiguration.Default.MonitoredResource); - - Assert.Equal(Constants.Global, StackdriverStatsConfiguration.Default.MonitoredResource.Type); - - Assert.NotNull(StackdriverStatsConfiguration.Default.MonitoredResource.Labels); - - Assert.True(StackdriverStatsConfiguration.Default.MonitoredResource.Labels.ContainsKey("project_id")); - Assert.True(StackdriverStatsConfiguration.Default.MonitoredResource.Labels.ContainsKey(Constants.ProjectIdLabelKey)); - Assert.Equal( - StackdriverStatsConfiguration.Default.ProjectId, - StackdriverStatsConfiguration.Default.MonitoredResource.Labels[Constants.ProjectIdLabelKey]); - } -}