Skip to content

Add configuration for tracing log #531

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions casdk-docs/docs/tutorial-extras/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,16 @@ InstrumentationKey. For more details, please refer to
AppInsights_InstrumentationKey="AppInsightsInstrumentationKey"
```

#### Configuring telemetry log

WebAPI configures [console exporter of OpenTelemetry](https://opentelemetry.io/docs/languages/net/exporters/#console) by default.
You can configure whether the exporter is enabled with `EnableTelemetryLogging`.
Set `false` if you want to reduce the log.

```bash
CarbonAwareVars__EnableTelemetryLogging=false
```

### Prometheus exporter for emissions data

> DISCLAIMER: The `/metrics` Prometheus exporter is currently unsupported, and is used for internal GSF needs, and may change in the future. It will retrieve _all_ emissions data and create heavy load on your data API's. It is turned off by default.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using Microsoft.Extensions.Options;
using CarbonAware.WebApi.Metrics;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

namespace CarbonAware.WebApi.Configuration;

Expand Down Expand Up @@ -32,7 +34,23 @@
// Can be extended in the future to support a different provider like Zipkin, Prometheus etc
}

var enableTelemetryLogging = envVars?.EnableTelemetryLogging ?? true;
if (enableTelemetryLogging)
{
const string serviceName = "CarbonAware.WebAPI";
const string serviceVersion = "1.0.0";

services.AddOpenTelemetry()
.WithTracing(tracerProviderBuilder =>
tracerProviderBuilder
.AddConsoleExporter()
.AddSource(serviceName)
.SetResourceBuilder(
ResourceBuilder.CreateDefault()
.AddService(serviceName: serviceName, serviceVersion: serviceVersion))
.AddHttpClientInstrumentation()
.AddAspNetCoreInstrumentation());
}
}

public static IServiceCollection AddCarbonExporter(this IServiceCollection services, IConfiguration configuration)
Expand Down Expand Up @@ -70,7 +88,7 @@
bool isAppInsightsConfigured = true;
if (!String.IsNullOrEmpty(connectionStr))
{
logger.LogInformation("Application Insights connection string found");

Check warning on line 91 in src/CarbonAware.WebApi/src/Configuration/ServiceCollectionExtensions.cs

View workflow job for this annotation

GitHub Actions / api-comparison

Possible null reference argument for parameter 'configuration' in 'ILoggingBuilder LoggingBuilderExtensions.AddConfiguration(ILoggingBuilder builder, IConfiguration configuration)'.
}
else if (!String.IsNullOrEmpty(instrumentationKey))
{
Expand All @@ -88,7 +106,7 @@
public static ILogger CreateConsoleLogger(IConfiguration? config)
{
var factory = LoggerFactory.Create(b => {
b.AddConfiguration(config?.GetSection("Logging"));

Check warning on line 109 in src/CarbonAware.WebApi/src/Configuration/ServiceCollectionExtensions.cs

View workflow job for this annotation

GitHub Actions / sln-build-and-test (csharp)

Possible null reference argument for parameter 'configuration' in 'ILoggingBuilder LoggingBuilderExtensions.AddConfiguration(ILoggingBuilder builder, IConfiguration configuration)'.

Check warning on line 109 in src/CarbonAware.WebApi/src/Configuration/ServiceCollectionExtensions.cs

View workflow job for this annotation

GitHub Actions / webapp-container-dotnet-build

Possible null reference argument for parameter 'configuration' in 'ILoggingBuilder LoggingBuilderExtensions.AddConfiguration(ILoggingBuilder builder, IConfiguration configuration)'.
b.AddConsole();
});
return factory.CreateLogger<IServiceCollection>();
Expand Down
18 changes: 0 additions & 18 deletions src/CarbonAware.WebApi/src/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,11 @@
using GSF.CarbonAware.Configuration;
using GSF.CarbonAware.Exceptions;
using Microsoft.OpenApi.Models;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using OpenTelemetry.Metrics;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Reflection;

// Define constants to initialize tracing with
var serviceName = "CarbonAware.WebAPI";
var serviceVersion = "1.0.0";

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenTelemetry()
.WithTracing(tracerProviderBuilder =>
tracerProviderBuilder
.AddConsoleExporter()
.AddSource(serviceName)
.SetResourceBuilder(
ResourceBuilder.CreateDefault()
.AddService(serviceName: serviceName, serviceVersion: serviceVersion))
.AddHttpClientInstrumentation()
.AddAspNetCoreInstrumentation());

// Add services to the container.
builder.Services.AddControllers(options =>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using NUnit.Framework.Internal;
using OpenTelemetry.Trace;
using Microsoft.ApplicationInsights;

namespace CarbonAware.WepApi.UnitTests;

Expand All @@ -19,9 +21,9 @@
{
{ "CarbonAwareVars:TelemetryProvider", "ApplicationInsights" },
{ "ApplicationInsights_Connection_String", "AppInsightsConnectionString" }
};

Check warning on line 24 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / api-comparison

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)

Check warning on line 26 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / sln-build-and-test (csharp)

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.

Check warning on line 26 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / webapp-container-dotnet-build

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
.Build();

// Act & Assert
Expand All @@ -38,9 +40,9 @@
{
{ "CarbonAwareVars:TelemetryProvider", "ApplicationInsights" },
{ "AppInsights_InstrumentationKey", "AppInsightsInstrumentationKey" }
};

Check warning on line 43 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / api-comparison

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)

Check warning on line 45 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / sln-build-and-test (csharp)

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.

Check warning on line 45 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / webapp-container-dotnet-build

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
.Build();

// Act & Assert
Expand All @@ -56,9 +58,9 @@
var inMemorySettings = new Dictionary<string, string>
{
{ "CarbonAwareVars:TelemetryProvider", "ApplicationInsights" }
};

Check warning on line 61 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / api-comparison

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)

Check warning on line 63 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / sln-build-and-test (csharp)

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.

Check warning on line 63 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / webapp-container-dotnet-build

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
.Build();

// Act & Assert
Expand All @@ -72,15 +74,15 @@
// Arrange
var services = new ServiceCollection();

var inMemorySettings = new Dictionary<string, string>{};

Check warning on line 77 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / api-comparison

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)

Check warning on line 79 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / sln-build-and-test (csharp)

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.

Check warning on line 79 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / webapp-container-dotnet-build

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
.Build();

// Act & Assert
Assert.DoesNotThrow(() => services.AddMonitoringAndTelemetry(configuration));
Assert.That(services.Count, Is.EqualTo(0));
}
Assert.Null(services.BuildServiceProvider().GetService<TelemetryClient>());
}

[Test]
public void AddCarbonExporter_AddsServices_IsEnabledInConfiguration()
Expand All @@ -91,9 +93,9 @@
var inMemorySettings = new Dictionary<string, string>
{
{ "CarbonAwareVars:EnableCarbonExporter", "true" }
};

Check warning on line 96 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / api-comparison

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)

Check warning on line 98 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / sln-build-and-test (csharp)

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.

Check warning on line 98 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / webapp-container-dotnet-build

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
.Build();

// Act & Assert
Expand All @@ -110,9 +112,9 @@
var inMemorySettings = new Dictionary<string, string>
{
{ "CarbonAwareVars:EnableCarbonExporter", "false" }
};

Check warning on line 115 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / api-comparison

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)

Check warning on line 117 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / sln-build-and-test (csharp)

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.

Check warning on line 117 in src/CarbonAware.WebApi/test/unitTests/Configuration/ServiceCollectionExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / webapp-container-dotnet-build

Argument of type 'Dictionary<string, string>' cannot be used for parameter 'initialData' of type 'IEnumerable<KeyValuePair<string, string?>>' in 'IConfigurationBuilder MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string?>>? initialData)' due to differences in the nullability of reference types.
.Build();

// Act & Assert
Expand Down Expand Up @@ -156,4 +158,58 @@
// Assert
Assert.That(logger, Is.Not.Null);
}

[Test]
public void EnableTelemetryLogging_AddsServices_WithoutConfiguration()
{
// Arrange
var services = new ServiceCollection();

var inMemorySettings = new Dictionary<string, string> { };
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)
.Build();

// Act & Assert
Assert.DoesNotThrow(() => services.AddMonitoringAndTelemetry(configuration));
Assert.NotNull(services.BuildServiceProvider().GetService<TracerProvider>());
}

[Test]
public void EnableTelemetryLogging_AddsServices_IsEnabledInConfiguration()
{
// Arrange
var services = new ServiceCollection();

var inMemorySettings = new Dictionary<string, string>
{
{ "CarbonAwareVars:EnableTelemetryLogging", "true" }
};
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)
.Build();

// Act & Assert
Assert.DoesNotThrow(() => services.AddMonitoringAndTelemetry(configuration));
Assert.NotNull(services.BuildServiceProvider().GetService<TracerProvider>());
}

[Test]
public void EnableTelemetryLogging_AddsServices_IsDisabledInConfiguration()
{
// Arrange
var services = new ServiceCollection();

var inMemorySettings = new Dictionary<string, string>
{
{ "CarbonAwareVars:EnableTelemetryLogging", "false" }
};
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)
.Build();

// Act & Assert
Assert.DoesNotThrow(() => services.AddMonitoringAndTelemetry(configuration));
Assert.Null(services.BuildServiceProvider().GetService<TracerProvider>());
}
}
2 changes: 2 additions & 0 deletions src/CarbonAware/src/CarbonAwareVariablesConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ internal class CarbonAwareVariablesConfiguration

public string TelemetryProvider { get; set; }

public Boolean EnableTelemetryLogging { get; set; }

public Boolean EnableCarbonExporter { get;set; }

public Boolean VerboseApi {get; set;}
Expand Down
Loading