@@ -23,18 +23,24 @@ public class AdminViewModelCache : IAdminViewModelCache
2323
2424 private readonly IServiceProvider _serviceProvider ;
2525 private readonly AdminViewModelCache _cache ;
26+ private readonly InitializerHostedService _initializer ;
2627 private readonly IOptions < NuGetInsightsWebsiteSettings > _options ;
28+ private readonly ITelemetryClient _telemetryClient ;
2729 private readonly ILogger < CachedAdminViewModelService > _logger ;
2830
2931 public CachedAdminViewModelService (
3032 IServiceProvider serviceProvider ,
3133 AdminViewModelCache cache ,
34+ InitializerHostedService initializer ,
3235 IOptions < NuGetInsightsWebsiteSettings > options ,
36+ ITelemetryClient telemetryClient ,
3337 ILogger < CachedAdminViewModelService > logger )
3438 {
3539 _serviceProvider = serviceProvider ;
3640 _cache = cache ;
41+ _initializer = initializer ;
3742 _options = options ;
43+ _telemetryClient = telemetryClient ;
3844 _logger = logger ;
3945 }
4046
@@ -45,37 +51,43 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
4551 return ;
4652 }
4753
54+ var stopwatch = Stopwatch . StartNew ( ) ;
4855 while ( ! stoppingToken . IsCancellationRequested )
4956 {
50- _cache . Refreshing = true ;
51- _logger . LogInformation ( "Loading latest admin view model." ) ;
52- var sw = Stopwatch . StartNew ( ) ;
53- try
57+ using ( _telemetryClient . StartOperation ( nameof ( CachedAdminViewModelService ) ) )
5458 {
55- var asOfTimestamp = DateTimeOffset . UtcNow ;
56- using ( var scope = _serviceProvider . CreateScope ( ) )
59+ await _initializer . WaitAsync ( ) ;
60+
61+ _cache . Refreshing = true ;
62+ _logger . LogInformation ( "Loading latest admin view model." ) ;
63+ var sw = Stopwatch . StartNew ( ) ;
64+ try
5765 {
58- var factory = scope . ServiceProvider . GetRequiredService < ViewModelFactory > ( ) ;
59- var data = await factory . GetAdminViewModelAsync ( ) ;
60- _cache . Value = new CachedAdminViewModel ( asOfTimestamp , data ) ;
61- _cache . Settings = scope . ServiceProvider . GetRequiredService < IOptions < NuGetInsightsWebsiteSettings > > ( ) . Value ;
66+ var asOfTimestamp = DateTimeOffset . UtcNow ;
67+ using ( var scope = _serviceProvider . CreateScope ( ) )
68+ {
69+ var factory = scope . ServiceProvider . GetRequiredService < ViewModelFactory > ( ) ;
70+ var data = await factory . GetAdminViewModelAsync ( ) ;
71+ _cache . Value = new CachedAdminViewModel ( asOfTimestamp , data ) ;
72+ _cache . Settings = scope . ServiceProvider . GetRequiredService < IOptions < NuGetInsightsWebsiteSettings > > ( ) . Value ;
73+ }
74+ _logger . LogInformation (
75+ "Latest admin view model loaded after {DurationMs}ms. Sleeping for {SleepMs}ms." ,
76+ sw . Elapsed . TotalMilliseconds ,
77+ _options . Value . CachedAdminViewModelMaxAge . TotalMilliseconds ) ;
78+ }
79+ catch ( Exception ex )
80+ {
81+ _logger . LogError (
82+ ex ,
83+ "Failed to load admin view model after {DurationMs}ms. Sleeping for {SleepMs}ms." ,
84+ sw . Elapsed . TotalMilliseconds ,
85+ _options . Value . CachedAdminViewModelMaxAge . TotalMilliseconds ) ;
86+ }
87+ finally
88+ {
89+ _cache . Refreshing = false ;
6290 }
63- _logger . LogInformation (
64- "Latest admin view model loaded after {DurationMs}ms. Sleeping for {SleepMs}ms." ,
65- sw . Elapsed . TotalMilliseconds ,
66- _options . Value . CachedAdminViewModelMaxAge . TotalMilliseconds ) ;
67- }
68- catch ( Exception ex )
69- {
70- _logger . LogError (
71- ex ,
72- "Failed to load admin view model after {DurationMs}ms. Sleeping for {SleepMs}ms." ,
73- sw . Elapsed . TotalMilliseconds ,
74- _options . Value . CachedAdminViewModelMaxAge . TotalMilliseconds ) ;
75- }
76- finally
77- {
78- _cache . Refreshing = false ;
7991 }
8092
8193 await Task . Delay ( _options . Value . CachedAdminViewModelMaxAge , stoppingToken ) ;
0 commit comments