Power service updates

- Upgrade to .NET 8
- Remove ApplicationInsights
- Add OpenTelemetry
This commit is contained in:
2024-01-22 18:54:18 -05:00
parent 911e7fbdb9
commit 2a58b26eb3
16 changed files with 361 additions and 366 deletions

View File

@@ -1,102 +1,94 @@
using ChrisKaczor.HomeMonitor.Power.Service.Data;
using ChrisKaczor.HomeMonitor.Power.Service.Models;
using JetBrains.Annotations;
using Microsoft.ApplicationInsights;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RestSharp;
using System;
using System.Diagnostics;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace ChrisKaczor.HomeMonitor.Power.Service
namespace ChrisKaczor.HomeMonitor.Power.Service;
[UsedImplicitly]
public class PowerReader(IConfiguration configuration, Database database, ILogger<PowerReader> logger) : IHostedService
{
[UsedImplicitly]
public class PowerReader : IHostedService
private readonly ActivitySource _activitySource = new(nameof(PowerReader));
private HubConnection _hubConnection;
private Timer _readTimer;
public Task StartAsync(CancellationToken cancellationToken)
{
private readonly IConfiguration _configuration;
private readonly Database _database;
private readonly TelemetryClient _telemetryClient;
logger.LogInformation($"{nameof(PowerReader)} - Start");
private HubConnection _hubConnection;
private Timer _readTimer;
_readTimer = new Timer(GetCurrentSample, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
public PowerReader(IConfiguration configuration, Database database, TelemetryClient telemetryClient)
if (!string.IsNullOrEmpty(configuration["Hub:Power"]))
_hubConnection = new HubConnectionBuilder().WithUrl(configuration["Hub:Power"]).Build();
return Task.CompletedTask;
}
private void GetCurrentSample(object state)
{
using var activity = _activitySource.StartActivity();
try
{
_configuration = configuration;
_database = database;
_telemetryClient = telemetryClient;
var client = new RestClient(configuration["Power:Host"]!);
var request = new RestRequest("current-sample");
request.AddHeader("Authorization", configuration["Power:AuthorizationHeader"]!);
var response = client.Execute(request);
var content = response.Content!;
logger.LogInformation("API response: {content}", content);
var sample = JsonSerializer.Deserialize<PowerSample>(content);
var generation = Array.Find(sample.Channels, c => c.Type == "GENERATION");
var consumption = Array.Find(sample.Channels, c => c.Type == "CONSUMPTION");
if (generation == null || consumption == null)
return;
var status = new PowerStatus { Generation = generation.RealPower, Consumption = consumption.RealPower };
database.StorePowerData(status);
var json = JsonSerializer.Serialize(status);
logger.LogInformation("Output message: {json}", json);
if (_hubConnection == null)
return;
if (_hubConnection.State == HubConnectionState.Disconnected)
_hubConnection.StartAsync().Wait();
_hubConnection.InvokeAsync("SendLatestSample", json).Wait();
}
public Task StartAsync(CancellationToken cancellationToken)
catch (Exception exception)
{
_telemetryClient.TrackTrace($"{nameof(PowerReader)} - Start");
_readTimer = new Timer(OnTimer, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
if (!string.IsNullOrEmpty(_configuration["Hub:Power"]))
_hubConnection = new HubConnectionBuilder().WithUrl(_configuration["Hub:Power"]).Build();
return Task.CompletedTask;
}
private void OnTimer(object state)
{
try
{
var client = new RestClient(_configuration["Power:Host"]);
var request = new RestRequest("current-sample", Method.GET);
request.AddHeader("Authorization", _configuration["Power:AuthorizationHeader"]);
var response = client.Execute(request);
var sample = JsonSerializer.Deserialize<PowerSample>(response.Content);
var generation = Array.Find(sample.Channels, c => c.Type == "GENERATION");
var consumption = Array.Find(sample.Channels, c => c.Type == "CONSUMPTION");
if (generation == null || consumption == null)
return;
var status = new PowerStatus { Generation = generation.RealPower, Consumption = consumption.RealPower };
_database.StorePowerData(status);
var json = JsonSerializer.Serialize(status);
Console.WriteLine(json);
if (_hubConnection == null)
return;
if (_hubConnection.State == HubConnectionState.Disconnected)
_hubConnection.StartAsync().Wait();
_hubConnection.InvokeAsync("SendLatestSample", json).Wait();
}
catch (Exception exception)
{
WriteLog($"Exception: {exception}");
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
_telemetryClient.TrackTrace($"{nameof(PowerReader)} - Stop");
_readTimer.Dispose();
_hubConnection?.StopAsync(cancellationToken).Wait(cancellationToken);
return Task.CompletedTask;
}
private static void WriteLog(string message)
{
Console.WriteLine(message);
logger.LogError(exception, "Exception");
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
logger.LogInformation($"{nameof(PowerReader)} - Stop");
_readTimer.Dispose();
_hubConnection?.StopAsync(cancellationToken).Wait(cancellationToken);
return Task.CompletedTask;
}
}