Skip to content

Commit 6a1effa

Browse files
committed
address PR comments, refactor #2
1 parent a714a85 commit 6a1effa

File tree

12 files changed

+187
-106
lines changed

12 files changed

+187
-106
lines changed

tracer/src/Datadog.Trace/ClrProfiler/ServerlessInstrumentation/ServerlessMiniAgent.cs

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,9 @@ internal static class ServerlessMiniAgent
1414
{
1515
private static readonly IDatadogLogger Log = DatadogLogging.GetLoggerFor(typeof(ServerlessMiniAgent));
1616

17-
private static readonly string[] MiniAgentLogLevels = { "ERROR", "WARN", "INFO", "DEBUG" };
18-
19-
internal static string GetMiniAgentPath(PlatformID os)
17+
internal static string GetMiniAgentPath(PlatformID os, ImmutableTracerSettings settings)
2018
{
21-
var isGCPFunction = GetIsGCPFunction();
22-
var isAzureFunction = GetIsAzureFunction();
23-
if (!isGCPFunction && !isAzureFunction)
19+
if (!settings.IsRunningInGCPFunctions && !settings.IsRunningInAzureFunctions)
2420
{
2521
return null;
2622
}
@@ -45,7 +41,7 @@ internal static string GetMiniAgentPath(PlatformID os)
4541
var dirPathSep = isWindows ? "\\" : "/";
4642

4743
string rustBinaryPathRoot;
48-
if (isGCPFunction)
44+
if (settings.IsRunningInGCPFunctions)
4945
{
5046
rustBinaryPathRoot = "/layers/google.dotnet.publish/publish/bin";
5147
}
@@ -71,34 +67,6 @@ internal static string GetMiniAgentPath(PlatformID os)
7167
return rustBinaryPath;
7268
}
7369

74-
internal static bool GetIsGCPFunction()
75-
{
76-
bool isDeprecatedGCPFunction = Environment.GetEnvironmentVariable(ConfigurationKeys.GCPFunction.DeprecatedFunctionNameKey) != null && Environment.GetEnvironmentVariable(ConfigurationKeys.GCPFunction.DeprecatedProjectKey) != null;
77-
bool isNewerGCPFunction = Environment.GetEnvironmentVariable(ConfigurationKeys.GCPFunction.FunctionNameKey) != null && Environment.GetEnvironmentVariable(ConfigurationKeys.GCPFunction.FunctionTargetKey) != null;
78-
79-
return isDeprecatedGCPFunction || isNewerGCPFunction;
80-
}
81-
82-
internal static bool GetIsAzureFunction()
83-
{
84-
return Environment.GetEnvironmentVariable(ConfigurationKeys.AzureAppService.FunctionsExtensionVersionKey) != null && Environment.GetEnvironmentVariable(ConfigurationKeys.AzureAppService.SiteNameKey) != null;
85-
}
86-
87-
internal static string GetGCPAzureFunctionName()
88-
{
89-
if (GetIsAzureFunction())
90-
{
91-
return Environment.GetEnvironmentVariable(ConfigurationKeys.AzureAppService.SiteNameKey);
92-
}
93-
94-
if (GetIsGCPFunction())
95-
{
96-
return Environment.GetEnvironmentVariable(ConfigurationKeys.GCPFunction.FunctionNameKey) ?? Environment.GetEnvironmentVariable(ConfigurationKeys.GCPFunction.DeprecatedFunctionNameKey);
97-
}
98-
99-
return null;
100-
}
101-
10270
internal static Process StartServerlessMiniAgent(string path)
10371
{
10472
if (string.IsNullOrEmpty(path))
@@ -175,7 +143,7 @@ internal static Tuple<string, string> ProcessMiniAgentLog(string rawLog)
175143
}
176144

177145
string level = rawLog.Substring(0, logPrefixCutoff).Split(' ')[1];
178-
if (Array.IndexOf(MiniAgentLogLevels, level) < 0)
146+
if (!(level is "ERROR" or "WARN" or "INFO" or "DEBUG"))
179147
{
180148
return Tuple.Create("INFO", rawLog);
181149
}

tracer/src/Datadog.Trace/Configuration/ImmutableAzureAppServiceSettings.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,5 +183,11 @@ private static bool ShouldSkipClientSpanWithinFunctions(Scope? scope)
183183

184184
return null;
185185
}
186+
187+
// Checks for azure functions specific env vars. Used when configuration hasn't been initialized yet.
188+
internal static bool GetIsAzureFunction()
189+
{
190+
return Environment.GetEnvironmentVariable(ConfigurationKeys.AzureAppService.FunctionsExtensionVersionKey) != null || Environment.GetEnvironmentVariable(ConfigurationKeys.AzureAppService.FunctionsWorkerRuntimeKey) != null;
191+
}
186192
}
187193
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// <copyright file="ImmutableGCPFunctionSettings.cs" company="Datadog">
2+
// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License.
3+
// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc.
4+
// </copyright>
5+
6+
using System;
7+
8+
namespace Datadog.Trace.Configuration
9+
{
10+
/// <summary>
11+
/// Settings class for gathering metadata about the execution context in Google Cloud Functions
12+
/// References:
13+
/// https://cloud.google.com/functions/docs/configuring/env-var#runtime_environment_variables_set_automatically
14+
/// </summary>
15+
internal class ImmutableGCPFunctionSettings
16+
{
17+
internal static bool GetIsGCPFunction()
18+
{
19+
bool isDeprecatedGCPFunction = Environment.GetEnvironmentVariable(ConfigurationKeys.GCPFunction.DeprecatedFunctionNameKey) != null && Environment.GetEnvironmentVariable(ConfigurationKeys.GCPFunction.DeprecatedProjectKey) != null;
20+
bool isNewerGCPFunction = Environment.GetEnvironmentVariable(ConfigurationKeys.GCPFunction.FunctionNameKey) != null && Environment.GetEnvironmentVariable(ConfigurationKeys.GCPFunction.FunctionTargetKey) != null;
21+
22+
return isDeprecatedGCPFunction || isNewerGCPFunction;
23+
}
24+
}
25+
}

tracer/src/Datadog.Trace/Configuration/ImmutableTracerSettings.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ public ImmutableTracerSettings(TracerSettings settings)
125125
IsRunningInAzureAppService = settings.IsRunningInAzureAppService;
126126
AzureAppServiceMetadata = settings.AzureAppServiceMetadata;
127127

128+
IsRunningInAzureFunctions = settings.IsRunningInAzureFunctions;
129+
130+
IsRunningInGCPFunctions = settings.IsRunningInGCPFunctions;
131+
128132
TraceId128BitGenerationEnabled = settings.TraceId128BitGenerationEnabled;
129133
TraceId128BitLoggingEnabled = settings.TraceId128BitLoggingEnabled;
130134

@@ -438,6 +442,16 @@ public ImmutableTracerSettings(TracerSettings settings)
438442
/// </summary>
439443
internal bool IsRunningInAzureAppService { get; }
440444

445+
/// <summary>
446+
/// Gets a value indicating whether the tracer is running in AAS
447+
/// </summary>
448+
internal bool IsRunningInAzureFunctions { get; }
449+
450+
/// <summary>
451+
/// Gets a value indicating whether the tracer is running in Google Cloud Functions
452+
/// </summary>
453+
internal bool IsRunningInGCPFunctions { get; }
454+
441455
/// <summary>
442456
/// Gets a value indicating whether the tracer should propagate service data in db queries
443457
/// </summary>

tracer/src/Datadog.Trace/Configuration/TracerSettings.cs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,6 @@ internal TracerSettings(IConfigurationSource? source, IConfigurationTelemetry te
181181
.WithKeys(ConfigurationKeys.TracerMetricsEnabled)
182182
.AsBool(defaultValue: false);
183183

184-
StatsComputationEnabledInternal = config
185-
.WithKeys(ConfigurationKeys.StatsComputationEnabled)
186-
.AsBool(defaultValue: (ServerlessMiniAgent.GetIsAzureFunction() || ServerlessMiniAgent.GetIsGCPFunction()));
187-
188184
StatsComputationInterval = config.WithKeys(ConfigurationKeys.StatsComputationInterval).AsInt32(defaultValue: 10);
189185

190186
RuntimeMetricsEnabled = config.WithKeys(ConfigurationKeys.RuntimeMetricsEnabled).AsBool(defaultValue: false);
@@ -343,6 +339,13 @@ internal TracerSettings(IConfigurationSource? source, IConfigurationTelemetry te
343339
}
344340
}
345341

342+
IsRunningInAzureFunctions = ImmutableAzureAppServiceSettings.GetIsAzureFunction();
343+
IsRunningInGCPFunctions = ImmutableGCPFunctionSettings.GetIsGCPFunction();
344+
345+
StatsComputationEnabledInternal = config
346+
.WithKeys(ConfigurationKeys.StatsComputationEnabled)
347+
.AsBool(defaultValue: (IsRunningInGCPFunctions || IsRunningInAzureFunctions));
348+
346349
var urlSubstringSkips = config
347350
.WithKeys(ConfigurationKeys.HttpClientExcludedUrlSubstrings)
348351
.AsString(
@@ -801,6 +804,16 @@ public bool DiagnosticSourceEnabled
801804
/// </summary>
802805
internal bool IsRunningInAzureAppService { get; }
803806

807+
/// <summary>
808+
/// Gets a value indicating whether the tracer is running in AAS
809+
/// </summary>
810+
internal bool IsRunningInAzureFunctions { get; }
811+
812+
/// <summary>
813+
/// Gets a value indicating whether the tracer is running in Google Cloud Functions
814+
/// </summary>
815+
internal bool IsRunningInGCPFunctions { get; }
816+
804817
/// <summary>
805818
/// Gets a value indicating whether the tracer should propagate service data in db queries
806819
/// </summary>

tracer/src/Datadog.Trace/Logging/Internal/DatadogLoggingFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ private static string GetDefaultLogDirectory(string? logDirectory)
166166
#else
167167
var isWindows = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows);
168168

169-
if (ServerlessMiniAgent.GetIsAzureFunction())
169+
if (ImmutableAzureAppServiceSettings.GetIsAzureFunction())
170170
{
171171
return isWindows ? "C:\\home\\LogFiles" : "/home/site/wwwroot";
172172
}

tracer/src/Datadog.Trace/Tracer.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,19 +134,20 @@ public static Tracer Instance
134134
return _instance;
135135
}
136136

137-
var serverlessMiniAgentPath = ServerlessMiniAgent.GetMiniAgentPath(Environment.OSVersion.Platform);
138-
Process miniAgentProcess;
139-
if (!string.IsNullOrEmpty(serverlessMiniAgentPath))
140-
{
141-
miniAgentProcess = ServerlessMiniAgent.StartServerlessMiniAgent(serverlessMiniAgentPath);
142-
}
143-
144137
instance = new Tracer(tracerManager: null); // don't replace settings, use existing
145138
_instance = instance;
146139
_globalInstanceInitialized = true;
147140
}
148141

149142
instance.TracerManager.Start();
143+
144+
var serverlessMiniAgentPath = ServerlessMiniAgent.GetMiniAgentPath(Environment.OSVersion.Platform, instance.Settings);
145+
Process miniAgentProcess;
146+
if (!string.IsNullOrEmpty(serverlessMiniAgentPath))
147+
{
148+
miniAgentProcess = ServerlessMiniAgent.StartServerlessMiniAgent(serverlessMiniAgentPath);
149+
}
150+
150151
return instance;
151152
}
152153

tracer/src/Datadog.Trace/TracerManagerFactory.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ internal TracerManager CreateTracerManager(
9999
settings ??= ImmutableTracerSettings.FromDefaultSources();
100100

101101
var defaultServiceName = settings.ServiceName ??
102-
ServerlessMiniAgent.GetGCPAzureFunctionName() ??
103102
GetApplicationName(settings) ??
104103
UnknownServiceName;
105104

@@ -351,15 +350,6 @@ private static string GetApplicationName(ImmutableTracerSettings settings)
351350
return serviceName;
352351
}
353352

354-
if (ServerlessMiniAgent.GetIsGCPFunction() || ServerlessMiniAgent.GetIsAzureFunction())
355-
{
356-
var functionName = ServerlessMiniAgent.GetGCPAzureFunctionName();
357-
if (functionName != null)
358-
{
359-
return functionName;
360-
}
361-
}
362-
363353
try
364354
{
365355
if (TryLoadAspNetSiteName(out var siteName))

tracer/test/Datadog.Trace.Tests/Configuration/ImmutableAzureAppServiceSettingsTests.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc.
44
// </copyright>
55

6+
using System;
67
using Datadog.Trace.Configuration;
78
using Datadog.Trace.Configuration.Telemetry;
89
using Datadog.Trace.PlatformHelpers;
@@ -193,5 +194,23 @@ public void NeedsDogStatsD(string value, bool expected)
193194

194195
settings.NeedsDogStatsD.Should().Be(expected);
195196
}
197+
198+
[Fact]
199+
public void GetIsAzureFunctionTrueWhenFunctionsEnvVarsExist()
200+
{
201+
Environment.SetEnvironmentVariable(ConfigurationKeys.AzureAppService.FunctionsWorkerRuntimeKey, "dotnet");
202+
Environment.SetEnvironmentVariable(ConfigurationKeys.AzureAppService.FunctionsExtensionVersionKey, "4");
203+
204+
Assert.True(ImmutableAzureAppServiceSettings.GetIsAzureFunction());
205+
206+
Environment.SetEnvironmentVariable(ConfigurationKeys.AzureAppService.FunctionsWorkerRuntimeKey, null);
207+
Environment.SetEnvironmentVariable(ConfigurationKeys.AzureAppService.FunctionsExtensionVersionKey, null);
208+
}
209+
210+
[Fact]
211+
public void GetIsAzureFunctionFalseWhenNoFunctionsEnvVars()
212+
{
213+
Assert.False(ImmutableAzureAppServiceSettings.GetIsAzureFunction());
214+
}
196215
}
197216
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// <copyright file="ImmutableGCPFunctionSettingsTests.cs" company="Datadog">
2+
// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License.
3+
// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc.
4+
// </copyright>
5+
6+
using System;
7+
using Datadog.Trace.Configuration;
8+
using Datadog.Trace.Configuration.Telemetry;
9+
using Datadog.Trace.PlatformHelpers;
10+
using Datadog.Trace.TestHelpers;
11+
using FluentAssertions;
12+
using Xunit;
13+
14+
namespace Datadog.Trace.Tests.Configuration
15+
{
16+
public class ImmutableGCPFunctionSettingsTests : SettingsTestsBase
17+
{
18+
[Fact]
19+
public void GetIsGCPFunctionTrueWhenDeprecatedFunctionsEnvVarsExist()
20+
{
21+
Environment.SetEnvironmentVariable(ConfigurationKeys.GCPFunction.DeprecatedFunctionNameKey, "function_name");
22+
Environment.SetEnvironmentVariable(ConfigurationKeys.GCPFunction.DeprecatedProjectKey, "project_1");
23+
24+
Assert.True(ImmutableGCPFunctionSettings.GetIsGCPFunction());
25+
26+
Environment.SetEnvironmentVariable(ConfigurationKeys.GCPFunction.DeprecatedFunctionNameKey, null);
27+
Environment.SetEnvironmentVariable(ConfigurationKeys.GCPFunction.DeprecatedProjectKey, null);
28+
}
29+
30+
[Fact]
31+
public void GetIsGCPFunctionTrueWhenNonDeprecatedFunctionsEnvVarsExist()
32+
{
33+
Environment.SetEnvironmentVariable(ConfigurationKeys.GCPFunction.FunctionNameKey, "function_name");
34+
Environment.SetEnvironmentVariable(ConfigurationKeys.GCPFunction.FunctionTargetKey, "function_target");
35+
36+
Assert.True(ImmutableGCPFunctionSettings.GetIsGCPFunction());
37+
38+
Environment.SetEnvironmentVariable(ConfigurationKeys.GCPFunction.FunctionNameKey, null);
39+
Environment.SetEnvironmentVariable(ConfigurationKeys.GCPFunction.FunctionTargetKey, null);
40+
}
41+
42+
[Fact]
43+
public void GetIsGCPFunctionFalseWhenNoFunctionsEnvVars()
44+
{
45+
Assert.False(ImmutableGCPFunctionSettings.GetIsGCPFunction());
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)