2828using Microsoft . Azure . WebJobs . Script . WebHost . Diagnostics ;
2929using Microsoft . Azure . WebJobs . Script . WebHost . Extensions ;
3030using Microsoft . Extensions . Logging ;
31+ using Newtonsoft . Json ;
32+ using Newtonsoft . Json . Linq ;
3133
3234namespace Microsoft . Azure . WebJobs . Script . WebHost
3335{
@@ -38,6 +40,7 @@ public class WebScriptHostManager : ScriptHostManager
3840 private readonly WebHostMetricsLogger _metricsLogger ;
3941 private readonly ISecretManager _secretManager ;
4042 private readonly WebHostSettings _webHostSettings ;
43+ private readonly ScriptSettingsManager _settingsManager ;
4144 private readonly IWebJobsExceptionHandler _exceptionHandler ;
4245 private readonly ScriptHostConfiguration _config ;
4346 private readonly ISwaggerDocumentManager _swaggerDocumentManager ;
@@ -49,6 +52,7 @@ public class WebScriptHostManager : ScriptHostManager
4952 private bool _hostStarted = false ;
5053 private HttpRouteCollection _httpRoutes ;
5154 private HttpRequestManager _httpRequestManager ;
55+ private SystemTraceWriter _systemTraceWriter ;
5256
5357 public WebScriptHostManager ( ScriptHostConfiguration config ,
5458 ISecretManagerFactory secretManagerFactory ,
@@ -66,18 +70,19 @@ public WebScriptHostManager(ScriptHostConfiguration config,
6670 _metricsLogger = new WebHostMetricsLogger ( ) ;
6771 _exceptionHandler = new WebScriptHostExceptionHandler ( this ) ;
6872 _webHostSettings = webHostSettings ;
73+ _settingsManager = settingsManager ;
6974 _hostTimeoutSeconds = hostTimeoutSeconds ;
7075 _hostRunningPollIntervalMilliseconds = hostPollingIntervalMilliseconds ;
7176
7277 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 ) ;
7479 if ( config . TraceWriter != null )
7580 {
76- config . TraceWriter = new CompositeTraceWriter ( new TraceWriter [ ] { config . TraceWriter , systemTraceWriter } ) ;
81+ config . TraceWriter = new CompositeTraceWriter ( new TraceWriter [ ] { config . TraceWriter , _systemTraceWriter } ) ;
7782 }
7883 else
7984 {
80- config . TraceWriter = systemTraceWriter ;
85+ config . TraceWriter = _systemTraceWriter ;
8186 }
8287
8388 config . IsSelfHost = webHostSettings . IsSelfHost ;
@@ -169,7 +174,37 @@ public async Task<HttpResponseMessage> HandleRequestAsync(FunctionDescriptor fun
169174 } ;
170175 using ( logger . BeginScope ( scopeState ) )
171176 {
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 ( ) ;
172197 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+ }
173208 }
174209 }
175210
0 commit comments