Code format
This commit is contained in:
206
Program.cs
206
Program.cs
@@ -3,141 +3,121 @@ using System.Text;
|
|||||||
using LibreHardwareMonitor.Hardware;
|
using LibreHardwareMonitor.Hardware;
|
||||||
|
|
||||||
var port = Environment.GetEnvironmentVariable("PORT");
|
var port = Environment.GetEnvironmentVariable("PORT");
|
||||||
if (!int.TryParse(port, out var httpPort))
|
if (!int.TryParse(port, out var httpPort)) {
|
||||||
{
|
httpPort = 9646; // default port
|
||||||
httpPort = 9646; // default port
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var listener = new HttpListener();
|
var listener = new HttpListener();
|
||||||
listener.Prefixes.Add($"http://*:{httpPort}/");
|
listener.Prefixes.Add($"http://*:{httpPort}/");
|
||||||
listener.Start();
|
listener.Start();
|
||||||
|
|
||||||
var computer = new Computer
|
var computer =
|
||||||
{
|
new Computer { IsCpuEnabled = true, IsGpuEnabled = true,
|
||||||
IsCpuEnabled = true,
|
IsMemoryEnabled = true, IsMotherboardEnabled = true,
|
||||||
IsGpuEnabled = true,
|
IsControllerEnabled = true, IsNetworkEnabled = true,
|
||||||
IsMemoryEnabled = true,
|
IsStorageEnabled = true };
|
||||||
IsMotherboardEnabled = true,
|
|
||||||
IsControllerEnabled = true,
|
|
||||||
IsNetworkEnabled = true,
|
|
||||||
IsStorageEnabled = true
|
|
||||||
};
|
|
||||||
|
|
||||||
computer.Open();
|
computer.Open();
|
||||||
|
|
||||||
Console.WriteLine($"LibreHardwareMonitorExporter listening on http://localhost:{httpPort}/metrics");
|
Console.WriteLine(
|
||||||
|
$"LibreHardwareMonitorExporter listening on http://localhost:{httpPort}/metrics");
|
||||||
|
|
||||||
while (true)
|
while (true) {
|
||||||
{
|
var context = await listener.GetContextAsync();
|
||||||
var context = await listener.GetContextAsync();
|
if (context.Request.HttpMethod != "GET") {
|
||||||
if (context.Request.HttpMethod != "GET")
|
context.Response.StatusCode = 405;
|
||||||
{
|
context.Response.Close();
|
||||||
context.Response.StatusCode = 405;
|
continue;
|
||||||
context.Response.Close();
|
}
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (context.Request.Url?.AbsolutePath != "/metrics")
|
if (context.Request.Url?.AbsolutePath != "/metrics") {
|
||||||
{
|
context.Response.StatusCode = 404;
|
||||||
context.Response.StatusCode = 404;
|
context.Response.Close();
|
||||||
context.Response.Close();
|
continue;
|
||||||
continue;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
var body = new StringBuilder();
|
var body = new StringBuilder();
|
||||||
AppendMetrics(body, computer);
|
AppendMetrics(body, computer);
|
||||||
var bytes = Encoding.UTF8.GetBytes(body.ToString());
|
var bytes = Encoding.UTF8.GetBytes(body.ToString());
|
||||||
context.Response.StatusCode = 200;
|
context.Response.StatusCode = 200;
|
||||||
context.Response.ContentType = "text/plain; version=0.0.4";
|
context.Response.ContentType = "text/plain; version=0.0.4";
|
||||||
context.Response.ContentEncoding = Encoding.UTF8;
|
context.Response.ContentEncoding = Encoding.UTF8;
|
||||||
context.Response.ContentLength64 = bytes.Length;
|
context.Response.ContentLength64 = bytes.Length;
|
||||||
await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);
|
await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);
|
||||||
context.Response.Close();
|
context.Response.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AppendMetrics(StringBuilder output, Computer computer)
|
static void AppendMetrics(StringBuilder output, Computer computer) {
|
||||||
{
|
var updateVisitor = new UpdateVisitor();
|
||||||
var updateVisitor = new UpdateVisitor();
|
computer.Accept(updateVisitor);
|
||||||
computer.Accept(updateVisitor);
|
|
||||||
|
|
||||||
// Basic example metrics for temperature, load, clock, power, fan
|
// Basic example metrics for temperature, load, clock, power, fan
|
||||||
foreach (var hardware in computer.Hardware)
|
foreach (var hardware in computer.Hardware) {
|
||||||
{
|
EmitHardwareMetrics(output, hardware);
|
||||||
EmitHardwareMetrics(output, hardware);
|
foreach (var sub in hardware.SubHardware) {
|
||||||
foreach (var sub in hardware.SubHardware)
|
EmitHardwareMetrics(output, sub);
|
||||||
{
|
}
|
||||||
EmitHardwareMetrics(output, sub);
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void EmitHardwareMetrics(StringBuilder output, IHardware hardware)
|
static void EmitHardwareMetrics(StringBuilder output, IHardware hardware) {
|
||||||
{
|
var hardwareLabel = SanitizeLabel(hardware.Name);
|
||||||
var hardwareLabel = SanitizeLabel(hardware.Name);
|
foreach (var sensor in hardware.Sensors) {
|
||||||
foreach (var sensor in hardware.Sensors)
|
if (sensor.Value is null)
|
||||||
{
|
continue;
|
||||||
if (sensor.Value is null) continue;
|
var sensorLabel = SanitizeLabel(sensor.Name);
|
||||||
var sensorLabel = SanitizeLabel(sensor.Name);
|
var value = sensor.Value.Value;
|
||||||
var value = sensor.Value.Value;
|
var metricName = sensor.SensorType switch {
|
||||||
var metricName = sensor.SensorType switch
|
SensorType.Temperature => "lhm_temperature_celsius",
|
||||||
{
|
SensorType.Load => "lhm_load_percent",
|
||||||
SensorType.Temperature => "lhm_temperature_celsius",
|
SensorType.Clock => "lhm_clock_mhz",
|
||||||
SensorType.Load => "lhm_load_percent",
|
SensorType.Power => "lhm_power_watts",
|
||||||
SensorType.Clock => "lhm_clock_mhz",
|
SensorType.Fan => "lhm_fan_rpm",
|
||||||
SensorType.Power => "lhm_power_watts",
|
SensorType.Voltage => "lhm_voltage_volts",
|
||||||
SensorType.Fan => "lhm_fan_rpm",
|
SensorType.Data => "lhm_data",
|
||||||
SensorType.Voltage => "lhm_voltage_volts",
|
SensorType.Level => "lhm_level",
|
||||||
SensorType.Data => "lhm_data",
|
SensorType.Throughput => "lhm_throughput_bytes_per_sec",
|
||||||
SensorType.Level => "lhm_level",
|
SensorType.Factor => "lhm_factor",
|
||||||
SensorType.Throughput => "lhm_throughput_bytes_per_sec",
|
SensorType.Flow => "lhm_flow_lph",
|
||||||
SensorType.Factor => "lhm_factor",
|
SensorType.Control => "lhm_control_percent",
|
||||||
SensorType.Flow => "lhm_flow_lph",
|
_ => null
|
||||||
SensorType.Control => "lhm_control_percent",
|
};
|
||||||
_ => null
|
|
||||||
};
|
|
||||||
|
|
||||||
if (metricName == null) continue;
|
if (metricName == null)
|
||||||
output.Append(metricName);
|
continue;
|
||||||
output.Append("{");
|
output.Append(metricName);
|
||||||
output.Append($"hardware=\"{hardwareLabel}\",sensor=\"{sensorLabel}\",type=\"{sensor.SensorType}\"");
|
output.Append("{");
|
||||||
output.Append("} ");
|
output.Append(
|
||||||
output.AppendLine(value.ToString(System.Globalization.CultureInfo.InvariantCulture));
|
$"hardware=\"{hardwareLabel}\",sensor=\"{sensorLabel}\",type=\"{sensor.SensorType}\"");
|
||||||
}
|
output.Append("} ");
|
||||||
|
output.AppendLine(
|
||||||
|
value.ToString(System.Globalization.CultureInfo.InvariantCulture));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static string SanitizeLabel(string raw)
|
static string SanitizeLabel(string raw) {
|
||||||
{
|
var sb = new StringBuilder(raw.Length);
|
||||||
var sb = new StringBuilder(raw.Length);
|
foreach (var ch in raw) {
|
||||||
foreach (var ch in raw)
|
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
|
||||||
{
|
(ch >= '0' && ch <= '9') || ch == '_' || ch == ':' || ch == '.') {
|
||||||
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == ':' || ch == '.')
|
sb.Append(ch);
|
||||||
{
|
} else {
|
||||||
sb.Append(ch);
|
sb.Append('_');
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
{
|
return sb.ToString();
|
||||||
sb.Append('_');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class UpdateVisitor : IVisitor
|
sealed class UpdateVisitor : IVisitor {
|
||||||
{
|
public void VisitComputer(IComputer computer) { computer.Traverse(this); }
|
||||||
public void VisitComputer(IComputer computer)
|
|
||||||
{
|
|
||||||
computer.Traverse(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void VisitHardware(IHardware hardware)
|
public void VisitHardware(IHardware hardware) {
|
||||||
{
|
hardware.Update();
|
||||||
hardware.Update();
|
foreach (var sub in hardware.SubHardware) {
|
||||||
foreach (var sub in hardware.SubHardware)
|
sub.Accept(this);
|
||||||
{
|
}
|
||||||
sub.Accept(this);
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void VisitSensor(ISensor sensor) { }
|
public void VisitSensor(ISensor sensor) {}
|
||||||
public void VisitParameter(IParameter parameter) { }
|
public void VisitParameter(IParameter parameter) {}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user