forked from googleapis/google-cloud-dotnet
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Makes it easier to use tracing from non ASP.NET Core applications
Towards googleapis#5897 and googleapis#6367
- Loading branch information
1 parent
b427a00
commit ad42b2e
Showing
3 changed files
with
117 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
67 changes: 67 additions & 0 deletions
67
...le.Cloud.Diagnostics.Common/Google.Cloud.Diagnostics.Common/Trace/CloudTraceExtensions.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
// Copyright 2021 Google LLC | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// https://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
using Google.Api.Gax; | ||
using Google.Cloud.Trace.V1; | ||
using Microsoft.Extensions.DependencyInjection; | ||
using System; | ||
using System.Net.Http; | ||
|
||
namespace Google.Cloud.Diagnostics.Common | ||
{ | ||
/// <summary> | ||
/// Extension methods for registering Google Cloud Trace for | ||
/// dependency injection. | ||
/// </summary> | ||
public static class CloudTraceExtensions | ||
{ | ||
/// <summary> | ||
/// Cofigures Google Cloud Trace for dependency injection. | ||
/// </summary> | ||
public static IServiceCollection AddGoogleTrace( | ||
this IServiceCollection services, Action<TraceServiceOptions> setupAction) | ||
{ | ||
GaxPreconditions.CheckNotNull(services, nameof(services)); | ||
GaxPreconditions.CheckNotNull(setupAction, nameof(setupAction)); | ||
|
||
var serviceOptions = new TraceServiceOptions(); | ||
setupAction(serviceOptions); | ||
|
||
var client = serviceOptions.Client ?? TraceServiceClient.Create(); | ||
var options = serviceOptions.Options ?? TraceOptions.Create(); | ||
var projectId = Project.GetAndCheckProjectId(serviceOptions.ProjectId); | ||
|
||
var consumer = ManagedTracer.CreateConsumer(client, options); | ||
var tracerFactory = ManagedTracer.CreateFactory(projectId, consumer, options); | ||
|
||
services.AddSingleton(tracerFactory); | ||
services.AddSingleton(ManagedTracer.CreateDelegatingTracer(ContextTracerManager.GetCurrentTracer)); | ||
|
||
// On .Net Standard 2.0 or higher, we can use the System.Net.Http.IHttpClientFactory defined in Microsoft.Extensions.Http, | ||
// for which we need a DelagatingHandler with no InnerHandler set. This is the recommended way. | ||
// It should be registered as follows. | ||
return services.AddTransient(UnchainedTraceHeaderPropagatingHandlerFactory); | ||
} | ||
|
||
/// <summary> | ||
/// Returns an <see cref="UnchainedTraceHeaderPropagatingHandler"/> configured with the user specified trace context | ||
/// outgoing propagator. If user code has not specified a trace context outgoing propagator, the Google header will | ||
/// be propagated. | ||
/// </summary> | ||
internal static UnchainedTraceHeaderPropagatingHandler UnchainedTraceHeaderPropagatingHandlerFactory(IServiceProvider serviceProvider) => | ||
serviceProvider.GetService<Action<HttpRequestMessage, ITraceContext>>() is Action<HttpRequestMessage, ITraceContext> traceContextOutgoingPropagator ? | ||
new UnchainedTraceHeaderPropagatingHandler(ContextTracerManager.GetCurrentTracer, traceContextOutgoingPropagator) : | ||
new UnchainedTraceHeaderPropagatingHandler(ContextTracerManager.GetCurrentTracer); | ||
} | ||
} |
40 changes: 40 additions & 0 deletions
40
...gle.Cloud.Diagnostics.Common/Google.Cloud.Diagnostics.Common/Trace/TraceServiceOptions.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// Copyright 2021 Google LLC | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// https://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
using Google.Cloud.Trace.V1; | ||
|
||
namespace Google.Cloud.Diagnostics.Common | ||
{ | ||
/// <summary> | ||
/// Options for initializing tracing. | ||
/// </summary> | ||
public sealed class TraceServiceOptions | ||
{ | ||
/// <summary> | ||
/// The Google Cloud Platform project ID. If unspecified and running on GAE or GCE the project | ||
/// ID will be detected from the platform. | ||
/// </summary> | ||
public string ProjectId { get; set; } | ||
|
||
/// <summary> | ||
/// Trace options. May be null. | ||
/// </summary> | ||
public TraceOptions Options { get; set; } | ||
|
||
/// <summary> | ||
/// A client to send traces with. May be null. | ||
/// </summary> | ||
public TraceServiceClient Client { get; set; } | ||
} | ||
} |