Skip to content

Commit f887558

Browse files
committed
SyncTriggers improvements #4401
1 parent db44a46 commit f887558

File tree

3 files changed

+27
-13
lines changed

3 files changed

+27
-13
lines changed

src/WebJobs.Script.WebHost/Management/FunctionsSyncManager.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -413,15 +413,17 @@ internal static HttpRequestMessage BuildSetTriggersRequest()
413413
sanitizedContent.Remove("secrets");
414414
sanitizedContentString = sanitizedContent.ToString();
415415
}
416-
_logger.LogDebug($"SyncTriggers content: {sanitizedContentString}");
417416

418417
using (var request = BuildSetTriggersRequest())
419418
{
420-
// This has to start with Mozilla because the frontEnd checks for it.
421-
request.Headers.Add("User-Agent", "Mozilla/5.0");
419+
var requestId = Guid.NewGuid().ToString();
420+
request.Headers.Add(ScriptConstants.AntaresLogIdHeaderName, requestId);
421+
request.Headers.Add("User-Agent", ScriptConstants.FunctionsUserAgent);
422422
request.Headers.Add("x-ms-site-restricted-token", token);
423423
request.Content = new StringContent(content, Encoding.UTF8, "application/json");
424424

425+
_logger.LogDebug($"Making SyncTriggers request (RequestId={requestId}, Uri={request.RequestUri.ToString()}, Content={sanitizedContentString}).");
426+
425427
var response = await _httpClient.SendAsync(request);
426428
if (response.IsSuccessStatusCode)
427429
{
@@ -430,7 +432,7 @@ internal static HttpRequestMessage BuildSetTriggersRequest()
430432
}
431433
else
432434
{
433-
string message = $"SyncTriggers call failed. StatusCode={response.StatusCode}";
435+
string message = $"SyncTriggers call failed (StatusCode={response.StatusCode}).";
434436
_logger.LogDebug(message);
435437
return (false, message);
436438
}

src/WebJobs.Script/ScriptConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public static class ScriptConstants
7171
public const string DynamicSku = "Dynamic";
7272
public const string DefaultProductionSlotName = "production";
7373

74+
public const string FunctionsUserAgent = "AzureFunctionsRuntime";
7475
public const string AntaresDefaultHostNameHeader = "WAS-DEFAULT-HOSTNAME";
7576
public const string AzureProxyFunctionLocalRedirectHeaderName = "X-PROXY-LOCAL-REDIRECT-COUNT";
7677
public const int AzureProxyFunctionMaxLocalRedirects = 10;

test/WebJobs.Script.Tests/Management/FunctionsSyncManagerTests.cs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,10 @@ public async Task TrySyncTriggers_PostsExpectedContent(bool cacheEnabled)
209209
Assert.True(syncResult.Success, "SyncTriggers should return success true");
210210
Assert.True(string.IsNullOrEmpty(syncResult.Error), "Error should be null or empty");
211211

212+
// verify expected headers
213+
Assert.Equal(ScriptConstants.FunctionsUserAgent, _mockHttpHandler.LastRequest.Headers.UserAgent.ToString());
214+
Assert.True(_mockHttpHandler.LastRequest.Headers.Contains(ScriptConstants.AntaresLogIdHeaderName));
215+
212216
if (cacheEnabled)
213217
{
214218
// verify triggers
@@ -253,8 +257,9 @@ public async Task TrySyncTriggers_PostsExpectedContent(bool cacheEnabled)
253257

254258
var logs = _loggerProvider.GetAllLogMessages();
255259
var log = logs.First();
256-
int idx = log.FormattedMessage.IndexOf(':');
257-
var triggersLog = log.FormattedMessage.Substring(idx + 1).Trim();
260+
int startIdx = log.FormattedMessage.IndexOf("Content=") + 8;
261+
int endIdx = log.FormattedMessage.LastIndexOf(')');
262+
var triggersLog = log.FormattedMessage.Substring(startIdx, endIdx - startIdx).Trim();
258263
var logObject = JObject.Parse(triggersLog);
259264

260265
Assert.Equal(_expectedSyncTriggersPayload, logObject["triggers"].ToString(Formatting.None));
@@ -267,8 +272,9 @@ public async Task TrySyncTriggers_PostsExpectedContent(bool cacheEnabled)
267272

268273
var logs = _loggerProvider.GetAllLogMessages();
269274
var log = logs.First();
270-
int idx = log.FormattedMessage.IndexOf(':');
271-
var triggersLog = log.FormattedMessage.Substring(idx + 1).Trim();
275+
int startIdx = log.FormattedMessage.IndexOf("Content=") + 8;
276+
int endIdx = log.FormattedMessage.LastIndexOf(')');
277+
var triggersLog = log.FormattedMessage.Substring(startIdx, endIdx - startIdx).Trim();
272278
Assert.Equal(_expectedSyncTriggersPayload, triggersLog);
273279
}
274280
}
@@ -294,9 +300,10 @@ public async Task TrySyncTriggers_CheckHash_PostsExpectedContent()
294300

295301
// verify log statements
296302
var logMessages = _loggerProvider.GetAllLogMessages().Select(p => p.FormattedMessage).ToArray();
297-
Assert.True(logMessages[0].StartsWith("SyncTriggers content: {"));
298-
var idx = logMessages[0].IndexOf('{');
299-
var sanitizedContent = logMessages[0].Substring(idx);
303+
Assert.True(logMessages[0].StartsWith("Making SyncTriggers request"));
304+
var startIdx = logMessages[0].IndexOf("Content=") + 8;
305+
var endIdx = logMessages[0].LastIndexOf(')');
306+
var sanitizedContent = logMessages[0].Substring(startIdx, endIdx - startIdx);
300307
var sanitizedObject = JObject.Parse(sanitizedContent);
301308
JToken value = null;
302309
var secretsLogged = sanitizedObject.TryGetValue("secrets", out value);
@@ -339,7 +346,7 @@ public async Task TrySyncTriggers_CheckHash_SetTriggersFailure_HashNotUpdated()
339346
_mockHttpHandler.MockStatusCode = HttpStatusCode.InternalServerError;
340347
var syncResult = await _functionsSyncManager.TrySyncTriggersAsync(checkHash: true);
341348
Assert.False(syncResult.Success);
342-
string expectedErrorMessage = "SyncTriggers call failed. StatusCode=InternalServerError";
349+
string expectedErrorMessage = "SyncTriggers call failed (StatusCode=InternalServerError).";
343350
Assert.Equal(expectedErrorMessage, syncResult.Error);
344351
Assert.Equal(1, _mockHttpHandler.RequestCount);
345352
var result = JObject.Parse(_contentBuilder.ToString());
@@ -350,7 +357,7 @@ public async Task TrySyncTriggers_CheckHash_SetTriggersFailure_HashNotUpdated()
350357

351358
// verify log statements
352359
var logMessages = _loggerProvider.GetAllLogMessages().Select(p => p.FormattedMessage).ToArray();
353-
Assert.True(logMessages[0].StartsWith("SyncTriggers content: {"));
360+
Assert.True(logMessages[0].Contains("Content="));
354361
Assert.Equal(expectedErrorMessage, logMessages[1]);
355362
}
356363
}
@@ -553,15 +560,19 @@ public MockHttpHandler(StringBuilder content)
553560

554561
public HttpStatusCode MockStatusCode { get; set; }
555562

563+
public HttpRequestMessage LastRequest { get; set; }
564+
556565
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
557566
{
567+
LastRequest = request;
558568
RequestCount++;
559569
_content.Append(await request.Content.ReadAsStringAsync());
560570
return new HttpResponseMessage(MockStatusCode);
561571
}
562572

563573
public void Reset()
564574
{
575+
LastRequest = null;
565576
_content.Clear();
566577
RequestCount = 0;
567578
}

0 commit comments

Comments
 (0)