28
28
using Microsoft . Azure . WebJobs . Script . WebHost . Diagnostics ;
29
29
using Microsoft . Azure . WebJobs . Script . WebHost . Extensions ;
30
30
using Microsoft . Extensions . Logging ;
31
+ using Newtonsoft . Json ;
32
+ using Newtonsoft . Json . Linq ;
31
33
32
34
namespace Microsoft . Azure . WebJobs . Script . WebHost
33
35
{
@@ -38,6 +40,7 @@ public class WebScriptHostManager : ScriptHostManager
38
40
private readonly WebHostMetricsLogger _metricsLogger ;
39
41
private readonly ISecretManager _secretManager ;
40
42
private readonly WebHostSettings _webHostSettings ;
43
+ private readonly ScriptSettingsManager _settingsManager ;
41
44
private readonly IWebJobsExceptionHandler _exceptionHandler ;
42
45
private readonly ScriptHostConfiguration _config ;
43
46
private readonly ISwaggerDocumentManager _swaggerDocumentManager ;
@@ -49,6 +52,7 @@ public class WebScriptHostManager : ScriptHostManager
49
52
private bool _hostStarted = false ;
50
53
private HttpRouteCollection _httpRoutes ;
51
54
private HttpRequestManager _httpRequestManager ;
55
+ private SystemTraceWriter _systemTraceWriter ;
52
56
53
57
public WebScriptHostManager ( ScriptHostConfiguration config ,
54
58
ISecretManagerFactory secretManagerFactory ,
@@ -66,18 +70,19 @@ public WebScriptHostManager(ScriptHostConfiguration config,
66
70
_metricsLogger = new WebHostMetricsLogger ( ) ;
67
71
_exceptionHandler = new WebScriptHostExceptionHandler ( this ) ;
68
72
_webHostSettings = webHostSettings ;
73
+ _settingsManager = settingsManager ;
69
74
_hostTimeoutSeconds = hostTimeoutSeconds ;
70
75
_hostRunningPollIntervalMilliseconds = hostPollingIntervalMilliseconds ;
71
76
72
77
var systemEventGenerator = config . HostConfig . GetService < IEventGenerator > ( ) ?? new EventGenerator ( ) ;
73
- var systemTraceWriter = new SystemTraceWriter ( systemEventGenerator , settingsManager , TraceLevel . Verbose ) ;
78
+ _systemTraceWriter = new SystemTraceWriter ( systemEventGenerator , settingsManager , TraceLevel . Verbose ) ;
74
79
if ( config . TraceWriter != null )
75
80
{
76
- config . TraceWriter = new CompositeTraceWriter ( new TraceWriter [ ] { config . TraceWriter , systemTraceWriter } ) ;
81
+ config . TraceWriter = new CompositeTraceWriter ( new TraceWriter [ ] { config . TraceWriter , _systemTraceWriter } ) ;
77
82
}
78
83
else
79
84
{
80
- config . TraceWriter = systemTraceWriter ;
85
+ config . TraceWriter = _systemTraceWriter ;
81
86
}
82
87
83
88
config . IsSelfHost = webHostSettings . IsSelfHost ;
@@ -169,7 +174,37 @@ public async Task<HttpResponseMessage> HandleRequestAsync(FunctionDescriptor fun
169
174
} ;
170
175
using ( logger . BeginScope ( scopeState ) )
171
176
{
177
+ JObject coldStartData = null ;
178
+ if ( request . IsColdStart ( ) )
179
+ {
180
+ coldStartData = new JObject
181
+ {
182
+ { "requestId" , request . GetRequestId ( ) } ,
183
+ { "language" , function . Metadata . ScriptType . ToString ( ) } ,
184
+ { "sku" , _settingsManager . WebsiteSku }
185
+ } ;
186
+
187
+ var dispatchStopwatch = request . GetPropertyOrDefault < Stopwatch > ( ScriptConstants . AzureFunctionsColdStartKey ) ;
188
+ if ( dispatchStopwatch != null )
189
+ {
190
+ dispatchStopwatch . Stop ( ) ;
191
+ coldStartData . Add ( "dispatchDuration" , dispatchStopwatch . ElapsedMilliseconds ) ;
192
+ }
193
+ }
194
+
195
+ var functionStopwatch = new Stopwatch ( ) ;
196
+ functionStopwatch . Start ( ) ;
172
197
await Instance . CallAsync ( function . Name , arguments , cancellationToken ) ;
198
+ functionStopwatch . Stop ( ) ;
199
+
200
+ if ( coldStartData != null )
201
+ {
202
+ coldStartData . Add ( "functionDuration" , functionStopwatch . ElapsedMilliseconds ) ;
203
+
204
+ var coldStartEvent = new TraceEvent ( TraceLevel . Info , coldStartData . ToString ( Formatting . None ) ) ;
205
+ coldStartEvent . Properties . Add ( ScriptConstants . TracePropertyEventNameKey , ScriptConstants . ColdStartEventName ) ;
206
+ _systemTraceWriter . Trace ( coldStartEvent ) ;
207
+ }
173
208
}
174
209
}
175
210
0 commit comments