Skip to content

Commit efb55da

Browse files
committed
First Application Insights E2E test
1 parent 968b322 commit efb55da

20 files changed

+488
-22
lines changed

src/WebJobs.Script/Config/ScriptSettingsManager.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,32 @@ public virtual string AzureWebsiteUniqueSlotName
6868
}
6969
}
7070

71+
public virtual string ApplicationInsightsInstrumentationKey
72+
{
73+
get => GetSettingFromCache(EnvironmentSettingNames.AppInsightsInstrumentationKey);
74+
set => UpdateSettingInCache(EnvironmentSettingNames.AppInsightsInstrumentationKey, value);
75+
}
76+
77+
private string GetSettingFromCache(string settingKey)
78+
{
79+
if (string.IsNullOrEmpty(settingKey))
80+
{
81+
throw new ArgumentNullException(nameof(settingKey));
82+
}
83+
84+
return _settingsCache.GetOrAdd(settingKey, (key) => Utility.GetSettingFromConfigOrEnvironment(key));
85+
}
86+
87+
private void UpdateSettingInCache(string settingKey, string settingValue)
88+
{
89+
if (string.IsNullOrEmpty(settingKey))
90+
{
91+
throw new ArgumentNullException(nameof(settingKey));
92+
}
93+
94+
_settingsCache.AddOrUpdate(settingKey, settingValue, (a, b) => settingValue);
95+
}
96+
7197
public virtual void Reset()
7298
{
7399
_settingsCache.Clear();

src/WebJobs.Script/Description/FunctionInvokerBase.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using Microsoft.Azure.WebJobs.Logging;
1616
using Microsoft.Azure.WebJobs.Script.Diagnostics;
1717
using Microsoft.Azure.WebJobs.Script.Eventing;
18-
using Microsoft.Azure.WebJobs.Script.IO;
1918
using Microsoft.CodeAnalysis;
2019
using Microsoft.Extensions.Logging;
2120

src/WebJobs.Script/Diagnostics/DefaultLoggerFactoryBuilder.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
using Microsoft.Azure.WebJobs.Logging.ApplicationInsights;
55
using Microsoft.Azure.WebJobs.Script.Config;
6-
using Microsoft.Azure.WebJobs.Script.Host;
6+
using Microsoft.Azure.WebJobs.Script.Diagnostics;
77
using Microsoft.Extensions.Logging;
88

9-
namespace Microsoft.Azure.WebJobs.Script.Diagnostics
9+
namespace Microsoft.Azure.WebJobs.Script
1010
{
1111
/// <summary>
1212
/// Provides ways to plug into the ScriptHost ILoggerFactory initialization.
@@ -18,18 +18,17 @@ public class DefaultLoggerFactoryBuilder : ILoggerFactoryBuilder
1818
/// </summary>
1919
/// <param name="factory">The <see cref="ILoggerFactory"/>.</param>
2020
/// <param name="scriptConfig">The configuration.</param>
21-
public void AddLoggerProviders(ILoggerFactory factory, ScriptHostConfiguration scriptConfig, ScriptSettingsManager settingsManager)
21+
public virtual void AddLoggerProviders(ILoggerFactory factory, ScriptHostConfiguration scriptConfig, ScriptSettingsManager settingsManager)
2222
{
2323
IMetricsLogger metricsLogger = scriptConfig.HostConfig.GetService<IMetricsLogger>();
2424

2525
// Automatically register App Insights if the key is present
26-
string instrumentationKey = settingsManager?.GetSetting(ScriptConstants.AppInsightsInstrumentationKey);
27-
if (!string.IsNullOrEmpty(instrumentationKey))
26+
if (!string.IsNullOrEmpty(settingsManager?.ApplicationInsightsInstrumentationKey))
2827
{
2928
metricsLogger?.LogEvent(MetricEventNames.ApplicationInsightsEnabled);
3029

3130
ITelemetryClientFactory clientFactory = scriptConfig.HostConfig.GetService<ITelemetryClientFactory>() ??
32-
new ScriptTelemetryClientFactory(instrumentationKey, scriptConfig.ApplicationInsightsSamplingSettings, scriptConfig.LogFilter.Filter);
31+
new ScriptTelemetryClientFactory(settingsManager.ApplicationInsightsInstrumentationKey, scriptConfig.ApplicationInsightsSamplingSettings, scriptConfig.LogFilter.Filter);
3332

3433
scriptConfig.HostConfig.LoggerFactory.AddApplicationInsights(clientFactory);
3534
}

src/WebJobs.Script/Diagnostics/FileLogger.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,12 @@ public bool IsEnabled(LogLevel logLevel)
4242

4343
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
4444
{
45-
// We don't support any other type of state.
4645
IEnumerable<KeyValuePair<string, object>> properties = state as IEnumerable<KeyValuePair<string, object>>;
4746
string formattedMessage = formatter?.Invoke(state, exception);
4847

49-
if (string.IsNullOrEmpty(formattedMessage) || properties == null || !IsEnabled(logLevel) || IsFromTraceWriter(properties))
48+
// If we have no structured data and no message, there's nothing to log
49+
if ((string.IsNullOrEmpty(formattedMessage) && properties == null) ||
50+
!IsEnabled(logLevel) || IsFromTraceWriter(properties))
5051
{
5152
return;
5253
}
@@ -107,7 +108,14 @@ private static TraceLevel GetTraceLevel(LogLevel logLevel)
107108

108109
private static bool IsFromTraceWriter(IEnumerable<KeyValuePair<string, object>> properties)
109110
{
110-
return properties.Any(kvp => kvp.Key == ScriptConstants.TracePropertyIsUserTraceKey);
111+
if (properties == null)
112+
{
113+
return false;
114+
}
115+
else
116+
{
117+
return properties.Any(kvp => string.Equals(kvp.Key, ScriptConstants.TracePropertyIsUserTraceKey, StringComparison.OrdinalIgnoreCase));
118+
}
111119
}
112120
}
113121
}

src/WebJobs.Script/Diagnostics/ILoggerFactoryBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
using Microsoft.Azure.WebJobs.Script.Config;
55
using Microsoft.Extensions.Logging;
66

7-
namespace Microsoft.Azure.WebJobs.Script.Diagnostics
7+
namespace Microsoft.Azure.WebJobs.Script
88
{
99
/// <summary>
1010
/// Provides ways to plug into the ScriptHost ILoggerFactory initialization.

src/WebJobs.Script/EnvironmentSettingNames.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the MIT License. See License.txt in the project root for license information.
33

4-
using System;
5-
64
namespace Microsoft.Azure.WebJobs.Script
75
{
86
public static class EnvironmentSettingNames
@@ -23,5 +21,6 @@ public static class EnvironmentSettingNames
2321
public const string AzureWebJobsExtensionsPath = "AzureWebJobs_ExtensionsPath";
2422
public const string AzureWebsiteAppCountersName = "WEBSITE_COUNTERS_APP";
2523
public const string AzureWebJobsSecretStorageType = "AzureWebJobsSecretStorageType";
24+
public const string AppInsightsInstrumentationKey = "APPINSIGHTS_INSTRUMENTATIONKEY";
2625
}
2726
}

src/WebJobs.Script/GlobalSuppressions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,5 +187,5 @@
187187
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.FunctionTraceWriterFactory.#Create()")]
188188
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.Description.FunctionInvokerBase.#.ctor(Microsoft.Azure.WebJobs.Script.ScriptHost,Microsoft.Azure.WebJobs.Script.Description.FunctionMetadata)")]
189189
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.FunctionTraceWriterFactory.#CreateTraceWriter(Microsoft.Azure.WebJobs.Script.ScriptHostConfiguration,System.String)")]
190-
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.Diagnostics.DefaultLoggerFactoryBuilder.#AddLoggerProviders(Microsoft.Extensions.Logging.ILoggerFactory,Microsoft.Azure.WebJobs.Script.ScriptHostConfiguration,Microsoft.Azure.WebJobs.Script.Config.ScriptSettingsManager)")]
191-
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.ScriptHost.#ConfigureLoggerFactory(Microsoft.Azure.WebJobs.Script.ScriptHostConfiguration,Microsoft.Azure.WebJobs.Script.IFunctionTraceWriterFactory,Microsoft.Azure.WebJobs.Script.Config.ScriptSettingsManager,System.Func`1<System.Boolean>)")]
190+
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.ScriptHost.#ConfigureLoggerFactory(Microsoft.Azure.WebJobs.Script.ScriptHostConfiguration,Microsoft.Azure.WebJobs.Script.IFunctionTraceWriterFactory,Microsoft.Azure.WebJobs.Script.Config.ScriptSettingsManager,System.Func`1<System.Boolean>)")]
191+
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.DefaultLoggerFactoryBuilder.#AddLoggerProviders(Microsoft.Extensions.Logging.ILoggerFactory,Microsoft.Azure.WebJobs.Script.ScriptHostConfiguration,Microsoft.Azure.WebJobs.Script.Config.ScriptSettingsManager)")]

src/WebJobs.Script/Host/ScriptTelemetryClientFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
using Microsoft.Azure.WebJobs.Logging.ApplicationInsights;
99
using Microsoft.Extensions.Logging;
1010

11-
namespace Microsoft.Azure.WebJobs.Script.Host
11+
namespace Microsoft.Azure.WebJobs.Script
1212
{
1313
/// <summary>
1414
/// Overrides the default client creation by adding a custom SdkVersion for backend tracking.

src/WebJobs.Script/ScriptConstants.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,5 @@ public static class ScriptConstants
7171
public const string SwaggerDocumentationKey = "swaggerdocumentationkey";
7272

7373
public const int MaximumHostIdLength = 32;
74-
public const string AppInsightsInstrumentationKey = "APPINSIGHTS_INSTRUMENTATIONKEY";
7574
}
7675
}

src/WebJobs.Script/Utility.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ public static bool IsDynamic
4343
public static string GetSettingFromConfigOrEnvironment(string settingName)
4444
{
4545
string configValue = ConfigurationManager.AppSettings[settingName];
46-
if (!string.IsNullOrEmpty(configValue))
46+
47+
// Empty strings are allowed. Null indicates that the setting was not found.
48+
if (configValue != null)
4749
{
4850
// config values take precedence over environment values
4951
return configValue;

0 commit comments

Comments
 (0)