Compare commits
2 Commits
4137ac9ad8
...
8efe02cc86
| Author | SHA1 | Date | |
|---|---|---|---|
| 8efe02cc86 | |||
| 62a4a47373 |
39
Azure.Endpoints/ResourceGroup/ActivityLogReader.cs
Normal file
39
Azure.Endpoints/ResourceGroup/ActivityLogReader.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace ProperDI.Azure.Endpoints.ResourceGroup.LogLooker;
|
||||
|
||||
public interface IActivityLogReader
|
||||
{
|
||||
Task Scan(CancellationToken cancellationToken);
|
||||
}
|
||||
|
||||
public class ActivityLogReader : IActivityLogReader
|
||||
{
|
||||
private readonly ILogger<ActivityLogReader> _logger;
|
||||
private readonly HttpClient _httpClient;
|
||||
|
||||
public ActivityLogReader(IHttpClientFactory httpClientFactory, ILogger<ActivityLogReader> logger)
|
||||
{
|
||||
_httpClient = httpClientFactory.CreateClient() ?? throw new ArgumentNullException(nameof(httpClientFactory));
|
||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||
}
|
||||
|
||||
public async Task Scan(CancellationToken cancellationToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
var response = await _httpClient.GetAsync("https://ident.me", cancellationToken);
|
||||
var responseBody = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogInformation("Response body: {content}", responseBody);
|
||||
}
|
||||
catch (TaskCanceledException)
|
||||
{
|
||||
_logger.LogWarning("Task canceled");
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Http request failed");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
86
BackgroundService/BackgroundService.cs
Normal file
86
BackgroundService/BackgroundService.cs
Normal file
@@ -0,0 +1,86 @@
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using ProperDI.Azure.Endpoints.ResourceGroup.LogLooker;
|
||||
|
||||
public class RoleAssesorBackgroundService : IHostedService, IDisposable
|
||||
{
|
||||
private readonly IActivityLogReader _activityLogReader;
|
||||
private readonly ILogger<RoleAssesorBackgroundService> _logger;
|
||||
private readonly IOptionsMonitor<RoleAssesorBackgroundServiceOptions> _options;
|
||||
private Timer? _timer;
|
||||
private int _runFrequencyInMinutes;
|
||||
|
||||
public RoleAssesorBackgroundService(
|
||||
IActivityLogReader activityLogReader,
|
||||
ILogger<RoleAssesorBackgroundService> logger,
|
||||
IOptionsMonitor<RoleAssesorBackgroundServiceOptions> options)
|
||||
{
|
||||
_activityLogReader = activityLogReader;
|
||||
_logger = logger;
|
||||
_options = options;
|
||||
|
||||
// This sets our initial run frequency
|
||||
_runFrequencyInMinutes = _options.CurrentValue.RunFrequencyInMinutes;
|
||||
|
||||
// Subscribe to any changes in the config file
|
||||
_options.OnChange(UpdateTimerInterval);
|
||||
}
|
||||
|
||||
private void UpdateTimerInterval(RoleAssesorBackgroundServiceOptions options)
|
||||
{
|
||||
var newFreq = options.RunFrequencyInMinutes;
|
||||
|
||||
if (newFreq == _runFrequencyInMinutes)
|
||||
return;
|
||||
|
||||
_runFrequencyInMinutes = newFreq;
|
||||
_logger.LogInformation("Run frequency updated to {RunFreq} minutes", _runFrequencyInMinutes);
|
||||
_timer?.Change(TimeSpan.Zero, TimeSpan.FromMinutes(_runFrequencyInMinutes));
|
||||
}
|
||||
|
||||
public Task StartAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.LogInformation("Role Assessor background service is starting.");
|
||||
|
||||
_timer = new Timer(async _ => await ProcessAsync(cancellationToken), null, TimeSpan.Zero, TimeSpan.FromMinutes(1));
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private async Task ProcessAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.LogInformation("Role Assessor background service is running at: {time}", DateTimeOffset.Now);
|
||||
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
return;
|
||||
|
||||
await _activityLogReader.Scan(cancellationToken);
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
_logger.LogInformation("Operation was canceled");
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "An error occurred while reading the logs");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public Task StopAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.LogInformation("Stopping the Role Assessor background service.");
|
||||
|
||||
_timer?.Change(Timeout.Infinite, 0);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_timer?.Dispose();
|
||||
}
|
||||
}
|
||||
4
BackgroundService/BackgroundServiceOptions.cs
Normal file
4
BackgroundService/BackgroundServiceOptions.cs
Normal file
@@ -0,0 +1,4 @@
|
||||
public class RoleAssesorBackgroundServiceOptions
|
||||
{
|
||||
public int RunFrequencyInMinutes { get; set; } = 5; // Defaults to 5 minute.
|
||||
}
|
||||
15
Program.cs
Normal file
15
Program.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using ProperDI.Azure.Endpoints.ResourceGroup.LogLooker;
|
||||
|
||||
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
|
||||
|
||||
builder.Services.AddHttpClient();
|
||||
builder.Services.AddTransient<IActivityLogReader, ActivityLogReader>();
|
||||
|
||||
builder.Services.Configure<RoleAssesorBackgroundServiceOptions>(builder.Configuration.GetSection("RoleAssessorBackgroundService"));
|
||||
builder.Services.AddHostedService<RoleAssesorBackgroundService>();
|
||||
|
||||
var host = builder.Build();
|
||||
|
||||
await host.RunAsync();
|
||||
16
Sentinel.csproj
Normal file
16
Sentinel.csproj
Normal file
@@ -0,0 +1,16 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Version="8.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
13
appsettings.json
Normal file
13
appsettings.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft": "Warning",
|
||||
"Microsoft.Hosting.Lifetime": "Information",
|
||||
"System.Net": "Warning"
|
||||
}
|
||||
},
|
||||
"RoleAssessorBackgroundService": {
|
||||
"RunFrequencyInMinutes": 1
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user