Enable AppInsights dependency tracking (#2315)

This commit is contained in:
George Pollard
2022-08-30 16:35:35 +12:00
committed by GitHub
parent ef434db201
commit 63c54193a9
6 changed files with 204 additions and 153 deletions

View File

@ -8,6 +8,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Azure.ResourceManager.Monitor" Version="1.0.0-beta.2" /> <PackageReference Include="Azure.ResourceManager.Monitor" Version="1.0.0-beta.2" />
<PackageReference Include="Faithlife.Utility" Version="0.12.2" /> <PackageReference Include="Faithlife.Utility" Version="0.12.2" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.21.0" />
<PackageReference Include="Semver" Version="2.1.0" /> <PackageReference Include="Semver" Version="2.1.0" />
<PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.3.0" /> <PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.3.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Storage" Version="5.0.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Storage" Version="5.0.0" />
@ -19,7 +20,7 @@
<PackageReference Include="Microsoft.Azure.Management.OperationalInsights" Version="0.24.0-preview" /> <PackageReference Include="Microsoft.Azure.Management.OperationalInsights" Version="0.24.0-preview" />
<PackageReference Include="Microsoft.Azure.Management.Monitor" Version="0.28.0-preview" /> <PackageReference Include="Microsoft.Azure.Management.Monitor" Version="0.28.0-preview" />
<PackageReference Include="Microsoft.Extensions.Logging.ApplicationInsights" Version="2.20.0" /> <PackageReference Include="Microsoft.Extensions.Logging.ApplicationInsights" Version="2.21.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.3.0" OutputItemType="Analyzer" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.3.0" OutputItemType="Analyzer" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.6.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.6.0" />
<PackageReference Include="Azure.Data.Tables" Version="12.5.0" /> <PackageReference Include="Azure.Data.Tables" Version="12.5.0" />

View File

@ -13,10 +13,10 @@ public interface ILog {
} }
class AppInsights : ILog { class AppInsights : ILog {
private TelemetryClient _telemetryClient; private readonly TelemetryClient _telemetryClient;
public AppInsights(string instrumentationKey) { public AppInsights(TelemetryConfiguration config) {
_telemetryClient = new TelemetryClient(new TelemetryConfiguration(instrumentationKey)); _telemetryClient = new TelemetryClient(config);
} }
public void Log(Guid correlationId, String message, SeverityLevel level, IReadOnlyDictionary<string, string> tags, string? caller) { public void Log(Guid correlationId, String message, SeverityLevel level, IReadOnlyDictionary<string, string> tags, string? caller) {
@ -25,6 +25,7 @@ class AppInsights : ILog {
if (caller is not null) copyTags["CalledBy"] = caller; if (caller is not null) copyTags["CalledBy"] = caller;
_telemetryClient.TrackTrace(message, level, copyTags); _telemetryClient.TrackTrace(message, level, copyTags);
} }
public void LogEvent(Guid correlationId, String evt, IReadOnlyDictionary<string, string> tags, IReadOnlyDictionary<string, double>? metrics, string? caller) { public void LogEvent(Guid correlationId, String evt, IReadOnlyDictionary<string, string> tags, IReadOnlyDictionary<string, double>? metrics, string? caller) {
Dictionary<string, string> copyTags = new(tags); Dictionary<string, string> copyTags = new(tags);
copyTags["Correlation ID"] = correlationId.ToString(); copyTags["Correlation ID"] = correlationId.ToString();
@ -37,6 +38,7 @@ class AppInsights : ILog {
_telemetryClient.TrackEvent(evt, properties: copyTags, metrics: copyMetrics); _telemetryClient.TrackEvent(evt, properties: copyTags, metrics: copyMetrics);
} }
public void LogException(Guid correlationId, Exception ex, string message, IReadOnlyDictionary<string, string> tags, IReadOnlyDictionary<string, double>? metrics, string? caller) { public void LogException(Guid correlationId, Exception ex, string message, IReadOnlyDictionary<string, string> tags, IReadOnlyDictionary<string, double>? metrics, string? caller) {
Dictionary<string, string> copyTags = new(tags); Dictionary<string, string> copyTags = new(tags);
copyTags["Correlation ID"] = correlationId.ToString(); copyTags["Correlation ID"] = correlationId.ToString();
@ -290,12 +292,12 @@ public interface ILogSinks {
public class LogSinks : ILogSinks { public class LogSinks : ILogSinks {
private readonly List<ILog> _loggers; private readonly List<ILog> _loggers;
public LogSinks(IServiceConfig config) { public LogSinks(IServiceConfig config, TelemetryConfiguration telemetryConfiguration) {
_loggers = new List<ILog>(); _loggers = new List<ILog>();
foreach (var dest in config.LogDestinations) { foreach (var dest in config.LogDestinations) {
_loggers.Add( _loggers.Add(
dest switch { dest switch {
LogDestination.AppInsights => new AppInsights(config.ApplicationInsightsInstrumentationKey!), LogDestination.AppInsights => new AppInsights(telemetryConfiguration),
LogDestination.Console => new Console(), LogDestination.Console => new Console(),
_ => throw new Exception($"Unhandled Log Destination type: {dest}"), _ => throw new Exception($"Unhandled Log Destination type: {dest}"),
} }

View File

@ -9,6 +9,8 @@ using Async = System.Threading.Tasks;
using System.Text.Json; using System.Text.Json;
using ApiService.OneFuzzLib.Orm; using ApiService.OneFuzzLib.Orm;
using Azure.Core.Serialization; using Azure.Core.Serialization;
using Microsoft.ApplicationInsights.DependencyCollector;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Middleware; using Microsoft.Azure.Functions.Worker.Middleware;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -39,8 +41,9 @@ public class Program {
//Move out expensive resources into separate class, and add those as Singleton //Move out expensive resources into separate class, and add those as Singleton
// ArmClient, Table Client(s), Queue Client(s), HttpClient, etc. // ArmClient, Table Client(s), Queue Client(s), HttpClient, etc.
public async static Async.Task Main() { public static async Async.Task Main() {
var host = new HostBuilder() using var host =
new HostBuilder()
.ConfigureFunctionsWorkerDefaults( .ConfigureFunctionsWorkerDefaults(
builder => { builder => {
builder.UseMiddleware<LoggingMiddleware>(); builder.UseMiddleware<LoggingMiddleware>();
@ -103,6 +106,13 @@ public class Program {
.AddScoped<ISubnet, Subnet>() .AddScoped<ISubnet, Subnet>()
.AddScoped<IAutoScaleOperations, AutoScaleOperations>() .AddScoped<IAutoScaleOperations, AutoScaleOperations>()
.AddSingleton<TelemetryConfiguration>(provider => {
var config = provider.GetRequiredService<IServiceConfig>();
return new() {
ConnectionString = $"InstrumentationKey={config.ApplicationInsightsInstrumentationKey}",
};
})
.AddSingleton<DependencyTrackingTelemetryModule>()
.AddSingleton<ICreds, Creds>() .AddSingleton<ICreds, Creds>()
.AddSingleton<EntityConverter>() .AddSingleton<EntityConverter>()
.AddSingleton<IServiceConfig, ServiceConfiguration>() .AddSingleton<IServiceConfig, ServiceConfiguration>()
@ -113,6 +123,14 @@ public class Program {
}) })
.Build(); .Build();
// Set up Application Insights dependency tracking:
{
var telemetryConfig = host.Services.GetRequiredService<TelemetryConfiguration>();
var module = host.Services.GetRequiredService<DependencyTrackingTelemetryModule>();
module.Initialize(telemetryConfig);
}
// Initialize expected Storage tables:
await SetupStorage( await SetupStorage(
host.Services.GetRequiredService<IStorage>(), host.Services.GetRequiredService<IStorage>(),
host.Services.GetRequiredService<IServiceConfig>()); host.Services.GetRequiredService<IServiceConfig>());

View File

@ -157,6 +157,16 @@
"resolved": "0.12.2", "resolved": "0.12.2",
"contentHash": "JgMAGj8ekeAzKkagubXqf1UqgfHq89GyA1UQYWbkAe441uRr2Rh2rktkx5Z0LPwmD/aOqu9cxjekD2GZjP8rbw==" "contentHash": "JgMAGj8ekeAzKkagubXqf1UqgfHq89GyA1UQYWbkAe441uRr2Rh2rktkx5Z0LPwmD/aOqu9cxjekD2GZjP8rbw=="
}, },
"Microsoft.ApplicationInsights.DependencyCollector": {
"type": "Direct",
"requested": "[2.21.0, )",
"resolved": "2.21.0",
"contentHash": "XArm5tBEUdWs05eDKxnsUUQBduJ45DEQOMnpL7wNWxBpgxn+dbl8nObA2jzExbQhbw6P74lc/1f+RdV4iPaOgg==",
"dependencies": {
"Microsoft.ApplicationInsights": "2.21.0",
"System.Diagnostics.DiagnosticSource": "5.0.0"
}
},
"Microsoft.Azure.Functions.Worker": { "Microsoft.Azure.Functions.Worker": {
"type": "Direct", "type": "Direct",
"requested": "[1.6.0, )", "requested": "[1.6.0, )",
@ -253,11 +263,11 @@
}, },
"Microsoft.Extensions.Logging.ApplicationInsights": { "Microsoft.Extensions.Logging.ApplicationInsights": {
"type": "Direct", "type": "Direct",
"requested": "[2.20.0, )", "requested": "[2.21.0, )",
"resolved": "2.20.0", "resolved": "2.21.0",
"contentHash": "phuNUDeTlffkJi6zAsMQNOpijNOQ4Olda1WL2L+F33u4fqXmY+EGQnPg81rHW6dOXIYCQvrQUr2gVN5NNMvwKA==", "contentHash": "tjzErt5oaLs1caaThu6AbtJuHH0oIGDG/rYCXDruHVGig3m8MyCDuwDsGQwzimY7g4aFyLOKfHc3unBN2G96gw==",
"dependencies": { "dependencies": {
"Microsoft.ApplicationInsights": "2.20.0", "Microsoft.ApplicationInsights": "2.21.0",
"Microsoft.Extensions.Logging": "2.1.1" "Microsoft.Extensions.Logging": "2.1.1"
} }
}, },
@ -374,8 +384,8 @@
}, },
"Microsoft.ApplicationInsights": { "Microsoft.ApplicationInsights": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.20.0", "resolved": "2.21.0",
"contentHash": "mb+EC5j06Msn5HhKrhrsMAst6JxvYUnphQMGY2cixCabgGAO3q79Y8o/p1Zce1Azgd1IVkRKAMzAV4vDCbXOqA==", "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==",
"dependencies": { "dependencies": {
"System.Diagnostics.DiagnosticSource": "5.0.0" "System.Diagnostics.DiagnosticSource": "5.0.0"
} }

View File

@ -257,12 +257,21 @@
}, },
"Microsoft.ApplicationInsights": { "Microsoft.ApplicationInsights": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.20.0", "resolved": "2.21.0",
"contentHash": "mb+EC5j06Msn5HhKrhrsMAst6JxvYUnphQMGY2cixCabgGAO3q79Y8o/p1Zce1Azgd1IVkRKAMzAV4vDCbXOqA==", "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==",
"dependencies": { "dependencies": {
"System.Diagnostics.DiagnosticSource": "5.0.0" "System.Diagnostics.DiagnosticSource": "5.0.0"
} }
}, },
"Microsoft.ApplicationInsights.DependencyCollector": {
"type": "Transitive",
"resolved": "2.21.0",
"contentHash": "XArm5tBEUdWs05eDKxnsUUQBduJ45DEQOMnpL7wNWxBpgxn+dbl8nObA2jzExbQhbw6P74lc/1f+RdV4iPaOgg==",
"dependencies": {
"Microsoft.ApplicationInsights": "2.21.0",
"System.Diagnostics.DiagnosticSource": "5.0.0"
}
},
"Microsoft.AspNetCore.Cryptography.Internal": { "Microsoft.AspNetCore.Cryptography.Internal": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.8", "resolved": "5.0.8",
@ -637,10 +646,10 @@
}, },
"Microsoft.Extensions.Logging.ApplicationInsights": { "Microsoft.Extensions.Logging.ApplicationInsights": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.20.0", "resolved": "2.21.0",
"contentHash": "phuNUDeTlffkJi6zAsMQNOpijNOQ4Olda1WL2L+F33u4fqXmY+EGQnPg81rHW6dOXIYCQvrQUr2gVN5NNMvwKA==", "contentHash": "tjzErt5oaLs1caaThu6AbtJuHH0oIGDG/rYCXDruHVGig3m8MyCDuwDsGQwzimY7g4aFyLOKfHc3unBN2G96gw==",
"dependencies": { "dependencies": {
"Microsoft.ApplicationInsights": "2.20.0", "Microsoft.ApplicationInsights": "2.21.0",
"Microsoft.Extensions.Logging": "2.1.1" "Microsoft.Extensions.Logging": "2.1.1"
} }
}, },
@ -2134,37 +2143,38 @@
"apiservice": { "apiservice": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Azure.Core": "[1.25.0, )", "Azure.Core": "1.25.0",
"Azure.Data.Tables": "[12.5.0, )", "Azure.Data.Tables": "12.5.0",
"Azure.Identity": "[1.6.0, )", "Azure.Identity": "1.6.0",
"Azure.Messaging.EventGrid": "[4.10.0, )", "Azure.Messaging.EventGrid": "4.10.0",
"Azure.ResourceManager": "[1.2.1, )", "Azure.ResourceManager": "1.2.1",
"Azure.ResourceManager.Compute": "[1.0.0-beta.8, )", "Azure.ResourceManager.Compute": "1.0.0-beta.8",
"Azure.ResourceManager.Monitor": "[1.0.0-beta.2, )", "Azure.ResourceManager.Monitor": "1.0.0-beta.2",
"Azure.ResourceManager.Network": "[1.0.0, )", "Azure.ResourceManager.Network": "1.0.0",
"Azure.ResourceManager.Resources": "[1.0.0, )", "Azure.ResourceManager.Resources": "1.0.0",
"Azure.ResourceManager.Storage": "[1.0.0-beta.11, )", "Azure.ResourceManager.Storage": "1.0.0-beta.11",
"Azure.Security.KeyVault.Secrets": "[4.3.0, )", "Azure.Security.KeyVault.Secrets": "4.3.0",
"Azure.Storage.Blobs": "[12.13.0, )", "Azure.Storage.Blobs": "12.13.0",
"Azure.Storage.Queues": "[12.11.0, )", "Azure.Storage.Queues": "12.11.0",
"Faithlife.Utility": "[0.12.2, )", "Faithlife.Utility": "0.12.2",
"Microsoft.Azure.Functions.Worker": "[1.6.0, )", "Microsoft.ApplicationInsights.DependencyCollector": "2.21.0",
"Microsoft.Azure.Functions.Worker.Extensions.EventGrid": "[2.1.0, )", "Microsoft.Azure.Functions.Worker": "1.6.0",
"Microsoft.Azure.Functions.Worker.Extensions.Http": "[3.0.13, )", "Microsoft.Azure.Functions.Worker.Extensions.EventGrid": "2.1.0",
"Microsoft.Azure.Functions.Worker.Extensions.SignalRService": "[1.7.0, )", "Microsoft.Azure.Functions.Worker.Extensions.Http": "3.0.13",
"Microsoft.Azure.Functions.Worker.Extensions.Storage": "[5.0.0, )", "Microsoft.Azure.Functions.Worker.Extensions.SignalRService": "1.7.0",
"Microsoft.Azure.Functions.Worker.Extensions.Timer": "[4.1.0, )", "Microsoft.Azure.Functions.Worker.Extensions.Storage": "5.0.0",
"Microsoft.Azure.Functions.Worker.Sdk": "[1.3.0, )", "Microsoft.Azure.Functions.Worker.Extensions.Timer": "4.1.0",
"Microsoft.Azure.Management.Monitor": "[0.28.0-preview, )", "Microsoft.Azure.Functions.Worker.Sdk": "1.3.0",
"Microsoft.Azure.Management.OperationalInsights": "[0.24.0-preview, )", "Microsoft.Azure.Management.Monitor": "0.28.0-preview",
"Microsoft.Extensions.Logging.ApplicationInsights": "[2.20.0, )", "Microsoft.Azure.Management.OperationalInsights": "0.24.0-preview",
"Microsoft.Graph": "[4.24.0, )", "Microsoft.Extensions.Logging.ApplicationInsights": "2.21.0",
"Microsoft.Identity.Client": "[4.43.0, )", "Microsoft.Graph": "4.24.0",
"Microsoft.Identity.Web.TokenCache": "[1.23.1, )", "Microsoft.Identity.Client": "4.43.0",
"Semver": "[2.1.0, )", "Microsoft.Identity.Web.TokenCache": "1.23.1",
"System.IdentityModel.Tokens.Jwt": "[6.17.0, )", "Semver": "2.1.0",
"System.Linq.Async": "[6.0.1, )", "System.IdentityModel.Tokens.Jwt": "6.17.0",
"TaskTupleAwaiter": "[2.0.0, )" "System.Linq.Async": "6.0.1",
"TaskTupleAwaiter": "2.0.0"
} }
} }
} }

View File

@ -306,12 +306,21 @@
}, },
"Microsoft.ApplicationInsights": { "Microsoft.ApplicationInsights": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.20.0", "resolved": "2.21.0",
"contentHash": "mb+EC5j06Msn5HhKrhrsMAst6JxvYUnphQMGY2cixCabgGAO3q79Y8o/p1Zce1Azgd1IVkRKAMzAV4vDCbXOqA==", "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==",
"dependencies": { "dependencies": {
"System.Diagnostics.DiagnosticSource": "5.0.0" "System.Diagnostics.DiagnosticSource": "5.0.0"
} }
}, },
"Microsoft.ApplicationInsights.DependencyCollector": {
"type": "Transitive",
"resolved": "2.21.0",
"contentHash": "XArm5tBEUdWs05eDKxnsUUQBduJ45DEQOMnpL7wNWxBpgxn+dbl8nObA2jzExbQhbw6P74lc/1f+RdV4iPaOgg==",
"dependencies": {
"Microsoft.ApplicationInsights": "2.21.0",
"System.Diagnostics.DiagnosticSource": "5.0.0"
}
},
"Microsoft.AspNetCore.Cryptography.Internal": { "Microsoft.AspNetCore.Cryptography.Internal": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.0.8", "resolved": "5.0.8",
@ -686,10 +695,10 @@
}, },
"Microsoft.Extensions.Logging.ApplicationInsights": { "Microsoft.Extensions.Logging.ApplicationInsights": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.20.0", "resolved": "2.21.0",
"contentHash": "phuNUDeTlffkJi6zAsMQNOpijNOQ4Olda1WL2L+F33u4fqXmY+EGQnPg81rHW6dOXIYCQvrQUr2gVN5NNMvwKA==", "contentHash": "tjzErt5oaLs1caaThu6AbtJuHH0oIGDG/rYCXDruHVGig3m8MyCDuwDsGQwzimY7g4aFyLOKfHc3unBN2G96gw==",
"dependencies": { "dependencies": {
"Microsoft.ApplicationInsights": "2.20.0", "Microsoft.ApplicationInsights": "2.21.0",
"Microsoft.Extensions.Logging": "2.1.1" "Microsoft.Extensions.Logging": "2.1.1"
} }
}, },
@ -2261,37 +2270,38 @@
"apiservice": { "apiservice": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Azure.Core": "[1.25.0, )", "Azure.Core": "1.25.0",
"Azure.Data.Tables": "[12.5.0, )", "Azure.Data.Tables": "12.5.0",
"Azure.Identity": "[1.6.0, )", "Azure.Identity": "1.6.0",
"Azure.Messaging.EventGrid": "[4.10.0, )", "Azure.Messaging.EventGrid": "4.10.0",
"Azure.ResourceManager": "[1.2.1, )", "Azure.ResourceManager": "1.2.1",
"Azure.ResourceManager.Compute": "[1.0.0-beta.8, )", "Azure.ResourceManager.Compute": "1.0.0-beta.8",
"Azure.ResourceManager.Monitor": "[1.0.0-beta.2, )", "Azure.ResourceManager.Monitor": "1.0.0-beta.2",
"Azure.ResourceManager.Network": "[1.0.0, )", "Azure.ResourceManager.Network": "1.0.0",
"Azure.ResourceManager.Resources": "[1.0.0, )", "Azure.ResourceManager.Resources": "1.0.0",
"Azure.ResourceManager.Storage": "[1.0.0-beta.11, )", "Azure.ResourceManager.Storage": "1.0.0-beta.11",
"Azure.Security.KeyVault.Secrets": "[4.3.0, )", "Azure.Security.KeyVault.Secrets": "4.3.0",
"Azure.Storage.Blobs": "[12.13.0, )", "Azure.Storage.Blobs": "12.13.0",
"Azure.Storage.Queues": "[12.11.0, )", "Azure.Storage.Queues": "12.11.0",
"Faithlife.Utility": "[0.12.2, )", "Faithlife.Utility": "0.12.2",
"Microsoft.Azure.Functions.Worker": "[1.6.0, )", "Microsoft.ApplicationInsights.DependencyCollector": "2.21.0",
"Microsoft.Azure.Functions.Worker.Extensions.EventGrid": "[2.1.0, )", "Microsoft.Azure.Functions.Worker": "1.6.0",
"Microsoft.Azure.Functions.Worker.Extensions.Http": "[3.0.13, )", "Microsoft.Azure.Functions.Worker.Extensions.EventGrid": "2.1.0",
"Microsoft.Azure.Functions.Worker.Extensions.SignalRService": "[1.7.0, )", "Microsoft.Azure.Functions.Worker.Extensions.Http": "3.0.13",
"Microsoft.Azure.Functions.Worker.Extensions.Storage": "[5.0.0, )", "Microsoft.Azure.Functions.Worker.Extensions.SignalRService": "1.7.0",
"Microsoft.Azure.Functions.Worker.Extensions.Timer": "[4.1.0, )", "Microsoft.Azure.Functions.Worker.Extensions.Storage": "5.0.0",
"Microsoft.Azure.Functions.Worker.Sdk": "[1.3.0, )", "Microsoft.Azure.Functions.Worker.Extensions.Timer": "4.1.0",
"Microsoft.Azure.Management.Monitor": "[0.28.0-preview, )", "Microsoft.Azure.Functions.Worker.Sdk": "1.3.0",
"Microsoft.Azure.Management.OperationalInsights": "[0.24.0-preview, )", "Microsoft.Azure.Management.Monitor": "0.28.0-preview",
"Microsoft.Extensions.Logging.ApplicationInsights": "[2.20.0, )", "Microsoft.Azure.Management.OperationalInsights": "0.24.0-preview",
"Microsoft.Graph": "[4.24.0, )", "Microsoft.Extensions.Logging.ApplicationInsights": "2.21.0",
"Microsoft.Identity.Client": "[4.43.0, )", "Microsoft.Graph": "4.24.0",
"Microsoft.Identity.Web.TokenCache": "[1.23.1, )", "Microsoft.Identity.Client": "4.43.0",
"Semver": "[2.1.0, )", "Microsoft.Identity.Web.TokenCache": "1.23.1",
"System.IdentityModel.Tokens.Jwt": "[6.17.0, )", "Semver": "2.1.0",
"System.Linq.Async": "[6.0.1, )", "System.IdentityModel.Tokens.Jwt": "6.17.0",
"TaskTupleAwaiter": "[2.0.0, )" "System.Linq.Async": "6.0.1",
"TaskTupleAwaiter": "2.0.0"
} }
} }
} }