Skip to content

Commit 7aa7229

Browse files
committed
Add more logging to understand host secrets regeneration
1 parent 6ebe1e0 commit 7aa7229

File tree

7 files changed

+65
-19
lines changed

7 files changed

+65
-19
lines changed

src/WebJobs.Script.WebHost/Controllers/KeysController.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,8 @@ private async Task<IHttpActionResult> AddOrUpdateSecretAsync(string keyName, str
182182
}
183183

184184
string message = string.Format(Resources.TraceKeysApiSecretChange, keyName, keyScope ?? "host", operationResult.Result);
185-
_traceWriter.Verbose(message);
186-
_logger?.LogDebug(message);
185+
_traceWriter.Info(message);
186+
_logger?.LogInformation(message);
187187

188188
switch (operationResult.Result)
189189
{
@@ -248,8 +248,8 @@ private async Task<IHttpActionResult> DeleteFunctionSecretAsync(string keyName,
248248
}
249249

250250
string message = string.Format(Resources.TraceKeysApiSecretChange, keyName, keyScope ?? "host", "Deleted");
251-
_traceWriter.VerboseFormat(message);
252-
_logger?.LogDebug(message);
251+
_traceWriter.Info(message);
252+
_logger?.LogInformation(message);
253253

254254
return StatusCode(HttpStatusCode.NoContent);
255255
}

src/WebJobs.Script.WebHost/Properties/Resources.Designer.cs

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/WebJobs.Script.WebHost/Properties/Resources.resx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,12 @@
286286
<data name="TraceFunctionSecretGeneration" xml:space="preserve">
287287
<value>Function ('{0}') secrets do not exist. Generating secrets.</value>
288288
</data>
289+
<data name="TraceFunctionsKeysLoaded" xml:space="preserve">
290+
<value>Function ('{0}') keys are loaded.</value>
291+
</data>
292+
<data name="TraceHostKeysLoaded" xml:space="preserve">
293+
<value>Host keys are loaded.</value>
294+
</data>
289295
<data name="TraceHostSecretGeneration" xml:space="preserve">
290296
<value>Host secrets do not exist. Generating secrets.</value>
291297
</data>
@@ -304,6 +310,9 @@
304310
<data name="TraceSecretDeleted" xml:space="preserve">
305311
<value>{0} secret '{1}' deleted.</value>
306312
</data>
313+
<data name="TraceSecretsRepo" xml:space="preserve">
314+
<value>Secrets manager initialized, repository type: {0}</value>
315+
</data>
307316
<data name="TraceStaleFunctionSecretRefresh" xml:space="preserve">
308317
<value>Stale function ('{0}') secrets detected. Refreshing secrets.</value>
309318
</data>

src/WebJobs.Script.WebHost/Security/SecretManager.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,17 @@ public SecretManager(ISecretsRepository repository, IKeyValueConverterFactory ke
4343
_keyValueConverterFactory = keyValueConverterFactory;
4444
_traceWriter = traceWriter;
4545
_repository.SecretsChanged += OnSecretsChanged;
46-
_logger = loggerFactory?.CreateLogger(ScriptConstants.LogCategoryHostGeneral);
46+
_logger = loggerFactory?.CreateLogger(ScriptConstants.LogCategoryKeys);
4747

4848
if (createHostSecretsIfMissing)
4949
{
5050
// The SecretManager implementation of GetHostSecrets will
5151
// create a host secret if one is not present.
5252
GetHostSecretsAsync().GetAwaiter().GetResult();
5353
}
54+
55+
_traceWriter.Info(Resources.TraceSecretsRepo, repository.ToString());
56+
_logger?.LogInformation(Resources.TraceSecretsRepo, repository.ToString());
5457
}
5558

5659
public void Dispose()
@@ -124,6 +127,9 @@ public async virtual Task<HostSecretsInfo> GetHostSecretsAsync()
124127
}
125128
}
126129

130+
_traceWriter.Info(Resources.TraceHostKeysLoaded);
131+
_logger?.LogInformation(Resources.TraceHostKeysLoaded);
132+
127133
return _hostSecrets;
128134
}
129135

@@ -148,9 +154,9 @@ public async virtual Task<IDictionary<string, string>> GetFunctionSecretsAsync(s
148154
{
149155
// no secrets exist for this function so generate them
150156
string message = string.Format(Resources.TraceFunctionSecretGeneration, functionName);
151-
_traceWriter.Verbose(message, traceProperties);
157+
_traceWriter.Info(message, traceProperties);
152158

153-
_logger?.LogDebug(message);
159+
_logger?.LogInformation(message);
154160
secrets = new FunctionSecrets
155161
{
156162
Keys = new List<Key>
@@ -170,17 +176,17 @@ public async virtual Task<IDictionary<string, string>> GetFunctionSecretsAsync(s
170176
catch (CryptographicException)
171177
{
172178
string message = string.Format(Resources.TraceNonDecryptedFunctionSecretRefresh, functionName);
173-
_traceWriter.Verbose(message, traceProperties);
174-
_logger?.LogDebug(message);
179+
_traceWriter.Info(message, traceProperties);
180+
_logger?.LogInformation(message);
175181
await PersistSecretsAsync(secrets, functionName, true);
176182
await RefreshSecretsAsync(secrets, functionName);
177183
}
178184

179185
if (secrets.HasStaleKeys)
180186
{
181187
string message = string.Format(Resources.TraceStaleFunctionSecretRefresh, functionName);
182-
_traceWriter.Verbose(message);
183-
_logger?.LogDebug(message);
188+
_traceWriter.Info(message);
189+
_logger?.LogInformation(message);
184190
await RefreshSecretsAsync(secrets, functionName);
185191
}
186192

@@ -200,6 +206,9 @@ public async virtual Task<IDictionary<string, string>> GetFunctionSecretsAsync(s
200206
.ToDictionary(kv => kv.Key, kv => kv.Value);
201207
}
202208

209+
_traceWriter.Info(Resources.TraceFunctionsKeysLoaded, functionName);
210+
_logger?.LogInformation(Resources.TraceFunctionsKeysLoaded, functionName);
211+
203212
return functionSecrets;
204213
}
205214

@@ -426,8 +435,8 @@ private async Task PersistSecretsAsync<T>(T secrets, string keyScope = null, boo
426435
{
427436
string message = string.Format(Resources.ErrorTooManySecretBackups, ScriptConstants.MaximumSecretBackupCount, string.IsNullOrEmpty(keyScope) ? "host" : keyScope, await AnalizeSnapshots<T>(secretBackups));
428437
TraceEvent traceEvent = new TraceEvent(TraceLevel.Verbose, message);
429-
_traceWriter.Verbose(message);
430-
_logger?.LogDebug(message);
438+
_traceWriter.Info(message);
439+
_logger?.LogInformation(message);
431440
throw new InvalidOperationException(message);
432441
}
433442
await _repository.WriteSnapshotAsync(secretsType, keyScope, secretsContent);

src/WebJobs.Script/ScriptConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public static class ScriptConstants
4343
public const string LogCategoryAdminController = "Host.Controllers.Admin";
4444
public const string LogCategorySwaggerController = "Host.Controllers.Swagger";
4545
public const string LogCategoryKeysController = "Host.Controllers.Keys";
46+
public const string LogCategoryKeys = "Host.Keys";
4647
public const string LogCategoryHostGeneral = "Host.General";
4748

4849
// Define all system parameters we inject with a prefix to avoid collisions

test/WebJobs.Script.Tests.Integration/Host/StandbyManagerTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ public async Task StandbyMode_EndToEnd()
9595
TestHelpers.WaitForWebHost(httpClient);
9696

9797
var traces = traceWriter.GetTraces().ToArray();
98-
Assert.Equal($"Creating StandbyMode placeholder function directory ({Path.GetTempPath()}Functions\\Standby\\WWWRoot)", traces[0].Message);
99-
Assert.Equal("StandbyMode placeholder function directory created", traces[1].Message);
98+
Assert.Equal($"Creating StandbyMode placeholder function directory ({Path.GetTempPath()}Functions\\Standby\\WWWRoot)", traces[1].Message);
99+
Assert.Equal("StandbyMode placeholder function directory created", traces[2].Message);
100100

101101
// issue warmup request and verify
102102
var request = new HttpRequestMessage(HttpMethod.Get, "api/warmup");

test/WebJobs.Script.Tests/Security/SecretManagerTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public async Task GetFunctionSecrets_UpdatesStaleSecrets()
121121

122122
Assert.Equal(2, result.Keys.Count);
123123
Assert.True(functionSecretsConverted, "Function secrets were not persisted");
124-
Assert.True(traceWriter.GetTraces().Any(t => t.Level == TraceLevel.Verbose && t.Message.IndexOf(expectedTraceMessage) > -1));
124+
Assert.True(traceWriter.GetTraces().Any(t => t.Level == TraceLevel.Info && t.Message.IndexOf(expectedTraceMessage) > -1));
125125
}
126126
}
127127

@@ -245,7 +245,7 @@ public async Task GetFunctionSecrets_WhenNoSecretFileExists_CreatesDefaultSecret
245245
Assert.Equal(1, functionSecrets.Count);
246246
Assert.Equal(ScriptConstants.DefaultFunctionKeyName, functionSecrets.Keys.First());
247247
Assert.True(traceWriter.GetTraces().Any(
248-
t => t.Level == TraceLevel.Verbose && t.Message.IndexOf(expectedTraceMessage, StringComparison.OrdinalIgnoreCase) > -1),
248+
t => t.Level == TraceLevel.Info && t.Message.IndexOf(expectedTraceMessage, StringComparison.OrdinalIgnoreCase) > -1),
249249
"Expected Trace message not found");
250250
}
251251
}
@@ -578,7 +578,7 @@ public async Task GetFunctiontSecrets_WhenNonDecryptedSecrets_SavesAndRefreshes(
578578
Assert.Equal(1, Directory.GetFiles(directory.Path, $"{functionName}.{ScriptConstants.Snapshot}*").Length);
579579

580580
Assert.True(traceWriter.GetTraces().Any(
581-
t => t.Level == TraceLevel.Verbose && t.Message.IndexOf(expectedTraceMessage, StringComparison.OrdinalIgnoreCase) > -1),
581+
t => t.Level == TraceLevel.Info && t.Message.IndexOf(expectedTraceMessage, StringComparison.OrdinalIgnoreCase) > -1),
582582
"Expected Trace message not found");
583583
}
584584
}
@@ -645,7 +645,7 @@ public async Task GetHostSecrets_WhenTooManyBackups_ThrowsException()
645645

646646
Assert.True(Directory.GetFiles(directory.Path, $"{functionName}.{ScriptConstants.Snapshot}*").Length >= ScriptConstants.MaximumSecretBackupCount);
647647
Assert.True(traceWriter.GetTraces().Any(
648-
t => t.Level == TraceLevel.Verbose && t.Message.IndexOf(expectedTraceMessage, StringComparison.OrdinalIgnoreCase) > -1),
648+
t => t.Level == TraceLevel.Info && t.Message.IndexOf(expectedTraceMessage, StringComparison.OrdinalIgnoreCase) > -1),
649649
"Expected Trace message not found");
650650
}
651651
}

0 commit comments

Comments
 (0)