GithubHelp home page GithubHelp logo

nickbabcock / ohmgraphite Goto Github PK

View Code? Open in Web Editor NEW
406.0 12.0 37.0 5.1 MB

Expose hardware sensor data to Graphite / InfluxDB / Prometheus / Postgres / Timescaledb

License: Other

C# 99.44% Shell 0.38% Dockerfile 0.18%
graphite openhardwaremonitor grafana hardware-sensors gpu-monitoring influxdb prometheus timescaledb

ohmgraphite's Introduction

CI

OhmGraphite

OhmGraphite is a Windows service that exposes hardware sensor data to a metric store, allowing one to create informative and beautiful dashboards in Grafana or another time series UI:

dashboard

The above dashboard captures:

  • Power consumption of the CPU and GPU
  • CPU voltages and frequencies
  • Load breakdown on individual GPU components
  • CPU, GPU, disk, and motherboard temperature readings
  • Disk activity, space remaining, and error monitoring
  • Fan speed
  • Network consumption

Supported metric stores:

Hardware support is provided through LibreHardwareMonitor. Since detected sensors is hardware dependent, one can use the LibreHardwareMonitor GUI to preview a subset of metrics that will be exported by OhmGraphite. If a GUI of hardware sensors is all that is desired, and the thought of running and configuring Grafana and a metric store sounds overwhelming, I'd recommend HWINFO.

Installation

  • Create a directory that will be the home base for OhmGraphite (I use C:\Apps\OhmGraphite).
  • Download the latest zip and extract to our directory.
  • Update app configuration (located at OhmGraphite.exe.config). See configs for Graphite, InfluxDB, Prometheus, Timescale / Postgres
  • To install the app .\OhmGraphite.exe install. The command will install OhmGraphite as a Windows service (so you can manage it with your favorite powershell commands or services.msc)
  • To start the app after installation: .\OhmGraphite.exe start or your favorite Windows service management tool
  • If immediately installing the app is unnerving, the app can be ran interactively by executing .\OhmGraphite.exe run. Executing as administrator will most likely increase the number of sensors found (OhmGraphite will log how many sensors are found).

Congrats! Installation is done and you'll start seeing metrics flowing into your desired metric store.

Upgrades

  • Stop OhmGraphite service .\OhmGraphite.exe stop
  • Unzip latest release and copy OhmGraphite.exe to your installation directory.
  • Start OhmGraphite service .\OhmGraphite.exe start

Uninstall

  • Stop OhmGraphite service .\OhmGraphite.exe stop
  • Run uninstall command .\OhmGraphite.exe uninstall
  • Remove files

Configuration

App configuration is located in the installation directory at OhmGraphite.exe.config.

Config updates require an app restart to take effect.

Graphite Configuration

The config below polls our hardware every 5 seconds and sends the results to a graphite server listening on localhost:2003.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="host" value="localhost" />
    <add key="port" value="2003" />
    <add key="interval" value="5" />
    <add key="tags" value="false" />
  </appSettings>
</configuration>

Starting with Graphite v1.1.0, Graphite supports tags (similar to InfluxDB's tags). When enabled in OhmGraphite the data format switches from <name> <value> <timestamp> to <name>;tag1=a;tag2=b <value> <timestamp>. Since tags are such a new feature, OhmGraphite has it disabled by default to prevent cumbersome usage with Graphite 0.9 and 1.0 installations.

Examples of types of tags used (same for InfluxDB):

  • sensor_type: temperature, load, watts, rpms
  • hardware_type: cpu, gpu, hdd
  • host: my-pc
  • app: ohm
  • hardware: Nvidia GTX 970, Intel i7 6700k
  • raw_name (sensor name): CPU DRAM, CPU graphics

For any serious interest in tags, make sure to use external db like postgres, mysql, or redis, as sqlite won't cut it.

InfluxDB Configuration

Graphite is the default export style, but if you're an InfluxDB user you can change the type to influxdb and fill out InfluxDB specific options:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="type" value="influxdb" />
    <add key="interval" value="5" />
    <add key="influx_address" value="http://localhost:8086" />
    <add key="influx_db" value="mydb" />
<!--
    <add key="influx_user" value="myuser" />
    <add key="influx_password" value="mypassword" />
    <add key="interval" value="5" />
-->
  </appSettings>
</configuration>

If OhmGraphite will be connecting to InfluxDB 2, the configuration will need to be changed accordingly.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="type" value="influx2" />
    <add key="influx2_address" value="http://localhost:8086" />
    <add key="influx2_org" value="myorg" />
    <add key="influx2_bucket" value="mydb" />
    <add key="influx2_token" value="thisistheinfluxdbtoken" />
    <add key="interval" value="5" />
  </appSettings>
</configuration>

Prometheus Configuration

Configuring the Prometheus exporter will create a server that listens on prometheus_port. Instead of creating outbound data like the other exporters, OhmGraphite's Prometheus config creates inbound data. OhmGraphite will only poll the hardware sensors when scraped by the Prometheus service.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="type" value="prometheus" />
    <add key="prometheus_port" value="4445" />
    
    <!-- This is the host that OhmGraphite listens on.
         `*` means that it will listen on all interfaces.
         Consider restricting to a given IP address -->
    <add key="prometheus_host" value="*" />
    <add key="prometheus_path" value="metrics/" /> 
  </appSettings>
</configuration>

Then you'll need add the OhmGraphite instance to your Prometheus config. This can be done with the method of your choosing but for the sake of example here is a possible prometheus.yml:

global:
  scrape_interval: 15s
scrape_configs:
  - job_name: 'ohmgraphite'
    static_configs:
    - targets: ['10.0.0.200:4445']

In the above example, the Prometheus server and OhmGraphite are not on the same machine, so Prometheus accesses OhmGraphite through the machine that is hosting OhmGraphite via the IP address (10.0.0.200).

If the Prometheus service accessing OhmGraphite is not on the same machine, one may have to enable the port through the windows firewall.

Here's one example of enabling it in powershell. Note that there are further ways to configure the firewall for additional tightening of access (ie: only allow certain IPs to connect).

New-NetFirewallRule -DisplayName "Allow port 4445 for OhmGraphite" -Direction Inbound -LocalPort 4445 -Protocol TCP -Action Allow

Prometheus HTTPS Configuration

This section will walkthrough setting up HTTPS communication with a self signed certificate between OhmGraphite and Prometheus:

Execute the instructions below with an admin powershell terminal to generate the certificate, import it into the machine, and then bind the certificate to the configured port.

# Create a new self signed certificate with a subject equal to host used to
# access OhmGraphite. If an IP address is used to access OhmGraphite,
# you'll need the IPAddress field, otherwise the `TextExtension` param can be
# replaced with the DnsName param.
$params = @{
  FriendlyName = 'OhmGraphite'
  Subject = '10.0.0.200'
  TextExtension = @('2.5.29.17={text}&IPAddress=10.0.0.200')
}
$cert = New-SelfSignedCertificate @params
$thumb = $cert.Thumbprint

# Export and then import our cert into Windows certificate store
Export-Certificate -Cert $cert -FilePath ohmgraphite.cer
Import-Certificate -FilePath .\ohmgraphite.cer -CertStoreLocation Cert:\LocalMachine\Root

# Bind our cert to the port OhmGraphite is listening on
netsh http add sslcert ipport=0.0.0.0:4445 certhash=$thumb

Enable HTTPS in OhmGraphite.exe.config with prometheus_https:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="type" value="prometheus" />
    <add key="prometheus_port" value="4445" />
    <add key="prometheus_host" value="*" />
    <add key="prometheus_https" value="true" />
  </appSettings>
</configuration>

With OhmGraphite configured, the prometheus server is next. In order to have prometheus verify against a self signed certificate, the certificate must be converted into a format prometheus understands:

# Linux:
openssl x509 -inform der -in ohmgraphite.cer -out ohmgraphite.pem

# Windows:
# certutil -encode .\ohmgraphite.cer .\ohmgraphite.pem

Then update the prometheus config to expect our certificate:

   - job_name: 'ohmgraphite'
+    scheme: https
+    tls_config:
+      ca_file: /etc/prometheus/ohmgraphite.pem
     static_configs:
     - targets: ['10.0.0.200:4445']

TimescaleDB Configuration

One can configure OhmGraphite to send to Timescale / Postgres with the following (configuration values will differ depending on your environment):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="type" value="timescale" />
    <add key="timescale_connection" value="Host=vm-ubuntu;Username=ohm;Password=123456;Database=postgres" />
    <add key="timescale_setup" value="false" />
  </appSettings>
</configuration>

By leaving timescale_setup to false (the default) OhmGraphite can insert into any plain Postgres table that follows this table structure:

CREATE TABLE IF NOT EXISTS ohm_stats (
   time TIMESTAMPTZ NOT NULL,
   host TEXT,
   hardware TEXT,
   hardware_type TEXT,
   identifier TEXT,
   sensor TEXT,
   sensor_type TEXT,
   sensor_index INT,
   value REAL
);

Ensure that the OhmGraphite user that inserts the metrics (ohm in our example) has appropriate permissions:

CREATE USER ohm WITH PASSWORD 'xxx';
GRANT INSERT ON ohm_stats TO ohm;

If timescale_setup is true then OhmGraphite will create the following schema, so make sure Timescale is enabled on the server and the user connecting has appropriate permissions

CREATE TABLE IF NOT EXISTS ohm_stats (
   time TIMESTAMPTZ NOT NULL,
   host TEXT,
   hardware TEXT,
   hardware_type TEXT,
   identifier TEXT,
   sensor TEXT,
   sensor_type TEXT,
   sensor_index INT,
   value REAL
);

SELECT create_hypertable('ohm_stats', 'time', if_not_exists => TRUE);
CREATE INDEX IF NOT EXISTS idx_ohm_host ON ohm_stats (host);
CREATE INDEX IF NOT EXISTS idx_ohm_identifier ON ohm_stats (identifier);

Currently the schema and the columns are not configurable.

Hostname Resolution

When OhmGraphite sends metrics to the desired sink, it includes the computers hostname for additional context to allow scenarios where one has a grafana template variable based on hostname. There are three possible ways for OhmGraphite to resolve the hostname: NetBIOS (the default), DNS, and a static user-configured name.

NOTE: It's hard to say exactly how a machine's NetBIOS name and internet host name will differ, but to give an example, a NetBIOS name of TINI can have a host name of Tini.

To switch to DNS hostname resolution, update the configuration to include name_lookup, else any other value will be assumed to be a custom static name.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="name_lookup" value="dns" />
  </appSettings>
</configuration>

Prometheus setups are unaffected by name_lookup, as Prometheus automatically creates the instance label when scraping. If renaming is desired, you'll want to change the instance label by either hardcoding the alias in the Prometheus config or using DNS.

Metric Name Aliasing

It is possible that the sensor names exposed through OhmGraphite are not descriptive enough. For instance, "Fan #2" could have RPM exposed, but you know that a more descriptive name would be "CPU Fan". To have OhmGraphite export the sensor under the "CPU Fan" name, one will need to add the mapping from sensor id (+ /name suffix) to the desired name like so:

    <add key="/lpc/nct6792d/fan/1/name" value="CPU Fan" />

Hiding Sensors

There may be a sensor that should be hidden. Maybe it's a temperature sensor that reports negative values, or maybe a sensor reporting aggregated values that has no use. Whatever the case, OhmGraphite allows one to exclude a sensor from being exported by modifying the OhmGraphite config and adding the /hidden suffix to the sensor id or name like so:

<add key="/lpc/nct6792d/temperature/1/hidden" />
<add key="CPU Core Max/hidden" />

One can use globs to ignore a group of sensors. For instance, to hide all power sensors and hide clock sensors from an AMD CPU:

<add key="/amdcpu/*/clock/*/hidden" />
<add key="/*/power/*/hidden" />

Determine Sensor Id

There are several ways to determine the sensor id of a metric:

  • Postgres / Timescale and Influxdb users can examine their data store for the sensor id
  • Perform the rename in LibreHardwareMonitor and copy and paste the line from LibreHardwareMonitor.config into OhmGraphite.exe.config.
  • Search the OhmGraphite.log for the sensor's name that you'd like to rename (in the example, I'd search for "Fan #2"):
Sensor added: /lpc/nct6792d/fan/1 "Fan #2"

Disabling Hardware

By default, all hardware sensor collection is enabled to allow for minimal configuration in common use cases. However, some hardware may be susceptible to instability when polled. Hiding all of the sensors from unstable hardware isn't sufficient as sensor name filtering occurs after querying hardware. Thus there is configuration to determine what hardware is enabled.

The snippet below shows all the options that can be used to disable hardware.

<add key="/cpu/enabled" value="FaLsE" />
<add key="/gpu/enabled" value="false" />
<add key="/motherboard/enabled" value="false" />
<add key="/ram/enabled" value="false" />
<add key="/network/enabled" value="false" />
<add key="/storage/enabled" value="false" />
<add key="/controller/enabled" value="false" />
<add key="/psu/enabled" value="false" />
<add key="/battery/enabled" value="false" />

Since disabling sensors at the hardware level is more efficient than a glob to hide desired sensors, disabling hardware is desirable even if the underlying hardware is stable.

When hardware is disabled, all instances of that hardware are disabled. For instance, if one has multiple storage devices and only one is unstable, disabling storage hardware will halt sensor collection from all of them.

Certificates

By default, OhmGraphite will fail to communicate with servers that present certificates that can't be verified. To workaround this issue, the server's certificate should be imported on the OhmGraphite machine.

Below shows an example setup where Influxdb v1 is running on a linux server with a domain name of vm-ubuntu:

Generate certificate:

mkdir ssl
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -keyout ssl/ohm.key -out ssl/ohm.crt -subj "/CN=vm-ubuntu" \
  -addext "subjectAltName=DNS:vm-ubuntu,IP:172.22.24.52"

Run influxdb (via docker-compose) with our certificate:

version: "3"
services:
  influxdb:
    image: influxdb:1.8
    ports:
      - "8086:8086"
    volumes:
      - influxdb:/var/lib/influxdb
      - ./ssl:/etc/ssl/
    environment:
      - INFLUXDB_DB=db0
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=supersecretpassword
      - INFLUXDB_HTTP_HTTPS_ENABLED=true
      - INFLUXDB_HTTP_HTTPS_CERTIFICATE=/etc/ssl/ohm.crt
      - INFLUXDB_HTTP_HTTPS_PRIVATE_KEY=/etc/ssl/ohm.key
      - INFLUXDB_HTTP_AUTH_ENABLED=true

volumes:
  influxdb:

Then on the OhmGraphite machine, import the certificate with an admin powershell instance:

Import-Certificate -FilePath .\ohm.crt -CertStoreLocation 'Cert:\LocalMachine\Root'

certificate_verification (deprecated)

This config option has been deprecated due to not working as intended with later .NET versions

When connecting to a service that presents a self signed certificate, one can specify certificate_verification

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="certificate_verification"
         value="C:\apps\OhmGraphite\influxdb-selfsigned.crt" />
   </appSettings>
</configuration>

The possible values:

  • True (the default): all certificates are verified
  • False: No certificates are verified (INSECURE)
  • a file path of a certificate that the server is allowed to return and still be considered a valid request (useful for self signed certificates). Recommended to be an absolute file path.

Debugging Tips

Something wrong? Try these steps

  • Enter the directory where OhmGraphite is installed
  • Examine OhmGraphite.log, do you see any lines with an "ERROR"? Fix the error.
  • To see what hardward and sensors have been detected, and when metrics are pushed to the destination, enable more logging in NLog.config. Change the following line
      <logger name="*" minlevel="Info" writeTo="file" />
    to
      <logger name="*" minlevel="Debug" writeTo="file" />
  • Restart OhmGraphite for the logging changes to take effect
  • To see every sensor update logged (WARNING: your log file will grow large), enable trace logging
      <logger name="*" minlevel="Trace" writeTo="file" />
  • Stumped? Open an issue with relevant parts of the log included.

ohmgraphite's People

Contributors

aaronjwood avatar dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar henriquegemignani avatar iamoverit avatar jonasbleyl avatar nickbabcock avatar roy-spark avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ohmgraphite's Issues

NaN values causing the endpoint to fail

Hi, I have noticed some strange behavior on my PC, I can see in the log OG logfile that some of the sensors have an NaN value and the endpoint goes down and is not available, prometheus can not scrape the endpoint and it is shown in grafana as a gap.

2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/hdd/4/load/32 had a NaN value
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/hdd/4/load/32 had a NaN value
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/hdd/4/load/32 had a NaN value
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/ssd/1/load/32 had a NaN value
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/ssd/1/load/32 had a NaN value
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/hdd/3/load/32 had a NaN value
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/ssd/1/load/32 had a NaN value
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/hdd/2/load/32 had a NaN value
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/hdd/3/load/32 had a NaN value
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/hdd/3/load/32 had a NaN value
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.PrometheusCollection|Finished: prometheus update metrics
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/hdd/2/load/32 had a NaN value
2020-11-24 14:59:24.4258|DEBUG|OhmGraphite.SensorCollector|/hdd/2/load/32 had a NaN value

nay Idea what could be wrong ?

Prometheus multi-CPU / GPU / Disk concern

LHM gives unique identifers for all sensors. For instance the system's first temperature sensor on the first cpu would have an identifier like:

/intelcpu/0/temperature/0

Using this scheme, all sensors are unique. OhmGraphite exposes this identifier for Graphite, influx, and timescale but not Prometheus. I suspect this could be problematic for systems with multiple CPUs, GPUs, or hard drives (of which I have none of, so I'm unsure how to test this 😦 ). OhmGraphite metrics in Prometheus look like

ohm_hdd_percent{hardware="Generic Hard Disk",instance="localhost:4445",job="ohmgraphite",sensor="Used Space"}
ohm_cpu_hertz{hardware="AMD Ryzen 7 2700",instance="localhost:4445",job="ohmgraphite",sensor="Core #0"}

If I had multiple hard drives with a name of "Generic Hard Disk", I'd suspect that one hard drive would overshadow the other one. Very bad

I think it would be beneficial to extract a hardware identifier:

ohm_hdd_percent{hardware_id="0",hardware="Generic Hard Disk",instance="localhost:4445",job="ohmgraphite",sensor="Used Space"}
ohm_cpu_hertz{hardware_id="0",hardware="AMD Ryzen 7 2700",instance="localhost:4445",job="ohmgraphite",sensor="Core #0"}

Both have a hardware index of 0 representing they are the first in their category (hdd, cpu). Not all hardware has a descriptive id ("ram" is just "ram"). IDs are Hardware NIC's would have their GUIDs.

This should be fixed as I'm assuming it is quite popular to have multiple hard drives at least (and if their names conflict)

Prometheus sub-categorize percent data

Currently the following share the same percent suffix in prometheus: control, level, and load. This is sub-optimal for hard drives that have a load (the amount of used space as a percentage) and level (the SMART remaining life as a percentage) as these metrics will conflict with each other. The metrics should be split out to contain suffixes like: "control_percent", "load_percent", and "level_percent". This, unfortunately, would be a breaking change

Dashboards|Units

Are there any Dashboards available for Import in Grafana? would make a lot things easier :) or a doku that shows what measurement is what unit ? i get raw numbers but cant interpret them without knowing what units are used. And thanks for your work :)

RX 5700 Not Ingesting to InfluxDB

This might be a similar issue to ticket #153 but figured I would open a separate issue just in case.

All but 1 of my GPU's are appearing in Grafana, which is the RX 5700 mention in the title. I can confirm that HWInfo is logging the temperature data from this GPU:

2020-09-13 20_05_20-DinklerProd2 - TeamViewer - Free license (non-commercial use only)

Here is the log file for the host in question:

OhmGraphite.5.log

Short snip-it of the logs for 4/5 of the GPU's:

2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/0/temperature/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/0/fan/0 "GPU Fan"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/0/control/0 "GPU Fan"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/0/clock/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/0/clock/2 "GPU Memory"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/0/voltage/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/0/load/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/8/power/3 "GPU Package"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/8/temperature/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/8/fan/0 "GPU Fan"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/8/control/0 "GPU Fan"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/8/clock/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/8/clock/2 "GPU Memory"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/8/voltage/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/8/load/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/16/power/3 "GPU Package"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/16/temperature/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/16/fan/0 "GPU Fan"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/16/control/0 "GPU Fan"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/16/clock/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/16/clock/2 "GPU Memory"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/16/voltage/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/16/load/0 "GPU Core"
2020-09-07 11:27:46.0958|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/24/power/3 "GPU Package"
2020-09-07 11:27:46.1099|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/24/temperature/0 "GPU Core"
2020-09-07 11:27:46.1099|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/24/fan/0 "GPU Fan"
2020-09-07 11:27:46.1099|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/24/control/0 "GPU Fan"
2020-09-07 11:27:46.1099|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/24/clock/0 "GPU Core"
2020-09-07 11:27:46.1099|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/24/clock/2 "GPU Memory"
2020-09-07 11:27:46.1099|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/24/voltage/0 "GPU Core"
2020-09-07 11:27:46.1099|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-amd/24/load/0 "GPU Core"

Can not start OhmGraphite service in Windows 10 Pro

I have been using OhmGraphite for a while, unfortunately it started to make some trouble. I cannot start the service anymore, when I run .\OhmGraphite.exe run I get this error. Reinstalling did not help

2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{4B41FD5F-6169-4389-AABC-8DCC82F41CC8}/data/3 "Data Downloaded"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{4B41FD5F-6169-4389-AABC-8DCC82F41CC8}/throughput/7 "Upload Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{4B41FD5F-6169-4389-AABC-8DCC82F41CC8}/throughput/8 "Download Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{4B41FD5F-6169-4389-AABC-8DCC82F41CC8}/load/1 "Network Utilization"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{FCBF1FC4-1BEF-49A0-9B0A-0F049B2F2F34}/data/2 "Data Uploaded"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{FCBF1FC4-1BEF-49A0-9B0A-0F049B2F2F34}/data/3 "Data Downloaded"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{FCBF1FC4-1BEF-49A0-9B0A-0F049B2F2F34}/throughput/7 "Upload Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{FCBF1FC4-1BEF-49A0-9B0A-0F049B2F2F34}/throughput/8 "Download Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{FCBF1FC4-1BEF-49A0-9B0A-0F049B2F2F34}/load/1 "Network Utilization"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{9382E7DA-B465-40A8-A4BA-C394A2FDCEFD}/data/2 "Data Uploaded"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{9382E7DA-B465-40A8-A4BA-C394A2FDCEFD}/data/3 "Data Downloaded"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{9382E7DA-B465-40A8-A4BA-C394A2FDCEFD}/throughput/7 "Upload Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{9382E7DA-B465-40A8-A4BA-C394A2FDCEFD}/throughput/8 "Download Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{9382E7DA-B465-40A8-A4BA-C394A2FDCEFD}/load/1 "Network Utilization"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{5D7C2CD5-9A75-1AC5-6245-118F1C411193}/data/2 "Data Uploaded"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{5D7C2CD5-9A75-1AC5-6245-118F1C411193}/data/3 "Data Downloaded"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{5D7C2CD5-9A75-1AC5-6245-118F1C411193}/throughput/7 "Upload Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{5D7C2CD5-9A75-1AC5-6245-118F1C411193}/throughput/8 "Download Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{5D7C2CD5-9A75-1AC5-6245-118F1C411193}/load/1 "Network Utilization"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{271D0142-8048-4C2B-BAC1-19CDBB270D29}/data/3 "Data Downloaded"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{271D0142-8048-4C2B-BAC1-19CDBB270D29}/throughput/7 "Upload Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{271D0142-8048-4C2B-BAC1-19CDBB270D29}/throughput/8 "Download Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{271D0142-8048-4C2B-BAC1-19CDBB270D29}/load/1 "Network Utilization"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{14C5E932-86A3-4B5C-B160-FAD66CB57E37}/data/2 "Data Uploaded"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{14C5E932-86A3-4B5C-B160-FAD66CB57E37}/data/3 "Data Downloaded"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{14C5E932-86A3-4B5C-B160-FAD66CB57E37}/throughput/7 "Upload Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{14C5E932-86A3-4B5C-B160-FAD66CB57E37}/throughput/8 "Download Speed"
2020-09-21 17:53:33.3454|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{14C5E932-86A3-4B5C-B160-FAD66CB57E37}/load/1 "Network Utilization"
2020-09-21 17:53:33.3454|ERROR|OhmGraphite.PrometheusServer|Exception: starting prometheus server!System.Net.HttpListenerException (0x80004005): The format of the specified network name is invalid
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at Prometheus.MetricServer.StartServer(CancellationToken cancel)
   at Prometheus.MetricHandler.Start()
   at OhmGraphite.LoggerUtils.LogAction(Logger logger, String msg, Action action)
2020-09-21 17:53:33.3634|ERROR|OhmGraphite.Program|OhmGraphite TopShelf encountered an error!System.Exception: Exception with starting prometheus server ---> System.Net.HttpListenerException: The format of the specified network name is invalid
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at Prometheus.MetricServer.StartServer(CancellationToken cancel)
   at Prometheus.MetricHandler.Start()
   at OhmGraphite.LoggerUtils.LogAction(Logger logger, String msg, Action action)
   --- End of inner exception stack trace ---
   at OhmGraphite.LoggerUtils.LogAction(Logger logger, String msg, Action action)
   at Topshelf.ServiceConfiguratorExtensions.<>c__DisplayClass2_0`1.<WhenStarted>b__0(T service, HostControl control)
   at Topshelf.Builders.DelegateServiceBuilder`1.DelegateServiceHandle.Start(HostControl hostControl)
   at Topshelf.Hosts.ConsoleRunHost.Run()
2020-09-21 17:53:33.3634|ERROR|Topshelf.Hosts.ConsoleRunHost|An exception occurred!System.Exception: Exception with starting prometheus server ---> System.Net.HttpListenerException: The format of the specified network name is invalid
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at Prometheus.MetricServer.StartServer(CancellationToken cancel)
   at Prometheus.MetricHandler.Start()
   at OhmGraphite.LoggerUtils.LogAction(Logger logger, String msg, Action action)
   --- End of inner exception stack trace ---
   at OhmGraphite.LoggerUtils.LogAction(Logger logger, String msg, Action action)
   at Topshelf.ServiceConfiguratorExtensions.<>c__DisplayClass2_0`1.<WhenStarted>b__0(T service, HostControl control)
   at Topshelf.Builders.DelegateServiceBuilder`1.DelegateServiceHandle.Start(HostControl hostControl)
   at Topshelf.Hosts.ConsoleRunHost.Run()

Adding to grafana

no errors in ohmgraphite and i can view the metrics in a web browser on my network. What i cannot seem to do is get the data into grafana. Is there a special way to add a data source for it or some other config i'm not seeing. Using Prometheus.

Support for AMD rx5700 cards

Looking at LibreHardwareMonitor there was an issue where it did not return any data for rx5700s, so I assume this is why OhmGraphite does not return data on these cards. LibreHardwareMonitor has now been updated to resolve this (Issue linked below), is it possible to integrate this fix into OhmGraphite?

LibreHardwareMonitor/LibreHardwareMonitor#177

Error: "The format of the specified network name is invalid"

I am trying to use Prometheus as the endpoint/server and have configured the file as such (i have the actual IP in my real file):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="type" value="prometheus" />
    <add key="prometheus_port" value="4445" />
    <add key="prometheus_host" value="255.255.255.255" />
  </appSettings>
</configuration>

But when I go to run ohmgraphite.exe i get this error message:

2020-08-25 15:03:57.8483|ERROR|OhmGraphite.PrometheusServer|Exception: starting prometheus server!System.Net.HttpListenerException (0x80004005): The format of the specified network name is invalid
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at Prometheus.MetricServer.StartServer(CancellationToken cancel)
   at Prometheus.MetricHandler.Start()
   at OhmGraphite.LoggerUtils.LogAction(Logger logger, String msg, Action action)
2020-08-25 15:03:57.8640|ERROR|OhmGraphite.Program|OhmGraphite TopShelf encountered an error!System.Exception: Exception with starting prometheus server ---> System.Net.HttpListenerException: The format of the specified network name is invalid
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at Prometheus.MetricServer.StartServer(CancellationToken cancel)
   at Prometheus.MetricHandler.Start()
   at OhmGraphite.LoggerUtils.LogAction(Logger logger, String msg, Action action)
   --- End of inner exception stack trace ---
   at OhmGraphite.LoggerUtils.LogAction(Logger logger, String msg, Action action)
   at Topshelf.ServiceConfiguratorExtensions.<>c__DisplayClass2_0`1.<WhenStarted>b__0(T service, HostControl control)
   at Topshelf.Builders.DelegateServiceBuilder`1.DelegateServiceHandle.Start(HostControl hostControl)
   at Topshelf.Hosts.ConsoleRunHost.Run()
2020-08-25 15:03:57.8640|ERROR|Topshelf.Hosts.ConsoleRunHost|An exception occurred!System.Exception: Exception with starting prometheus server ---> System.Net.HttpListenerException: The format of the specified network name is invalid
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at Prometheus.MetricServer.StartServer(CancellationToken cancel)
   at Prometheus.MetricHandler.Start()
   at OhmGraphite.LoggerUtils.LogAction(Logger logger, String msg, Action action)
   --- End of inner exception stack trace ---
   at OhmGraphite.LoggerUtils.LogAction(Logger logger, String msg, Action action)
   at Topshelf.ServiceConfiguratorExtensions.<>c__DisplayClass2_0`1.<WhenStarted>b__0(T service, HostControl control)
   at Topshelf.Builders.DelegateServiceBuilder`1.DelegateServiceHandle.Start(HostControl hostControl)
   at Topshelf.Hosts.ConsoleRunHost.Run()

Am i only able to use a domain or am I not entering the IP correctly? If i switch it to key="prometheus_host" value="*" it works. If i switch it to key="prometheus_host" value="example.com" it will start. But I'd prefer to use an IP, any help would be appreciated.

Feature request: Allow metric names edit

Hi there! Boy oh boy I am happy I've found your project :)

I started homelabbing not so long ago and after doing a bit of research I was actually giving up on an idea that I will be able to include my Windows workstation in Grafana dashboard I was slowly building for my server. But apparently I can, with the metrics I wanted (thermals, THERMALS!) :)

I have a small question/feature request. I know I can achieve this by changing display (crude way I've found so far was to split values I want to change to separate queries instead of doing GROUP BY tag(sensor) - not that efficient) but I would rather fix the data than the display, if possible that is.
So..I would like to have the ability to to set names for the sensors/metrics like it is possible in the LHM app by editing in the UI that gets stored in AppSettings in LibreHardwareMonitor.config

<add key="/amdcpu/0/load/1/name" value="CPU Core 0 T0" />
<add key="/amdcpu/0/load/2/name" value="CPU Core 0 T1" />
<add key="/amdcpu/0/load/3/name" value="CPU Core 1 T0" />
<add key="/amdcpu/0/load/4/name" value="CPU Core 1 T1" />
<add key="/amdcpu/0/load/5/name" value="CPU Core 2 T0" />
<add key="/amdcpu/0/load/6/name" value="CPU Core 2 T1" />
<add key="/amdcpu/0/load/7/name" value="CPU Core 3 T0" />
<add key="/amdcpu/0/load/8/name" value="CPU Core 3 T1" />
<add key="/amdcpu/0/load/9/name" value="CPU Core 4 T0" />
<add key="/amdcpu/0/load/10/name" value="CPU Core 4 T1" />
<add key="/amdcpu/0/load/11/name" value="CPU Core 5 T0" />
<add key="/amdcpu/0/load/12/name" value="CPU Core 5 T1" />
<add key="/amdcpu/0/load/13/name" value="CPU Core 6 T0" />
<add key="/amdcpu/0/load/14/name" value="CPU Core 6 T1" />
<add key="/amdcpu/0/load/15/name" value="CPU Core 7 T0" />
<add key="/amdcpu/0/load/16/name" value="CPU Core 7 T1" />

Not able to see CCD temps on a Zen 2 chip (3950x)

The latest version of LHM shows me my CCD temps like so:
Capture
I'm not sure if this needs to be pulled out separately with some extra code or if the current .dll being used by this project doesn't support this but it would be super nice to be able report on the CCD temps. The only thing I can pull out right now is this:
Capture
AFAIK the CCD temps (Tdie) are the actual temps at the dies, the Tctl/Tdie that's reported now are the actual temps with an offset applied which is not at all what I think most people would want to see.

Clickhouse database

Hello, is anyone wanted to use clickhouse to store data?

I am new with C++ and any advice how to adopt current writes for CH?
I suppose it must be very close to InfuxDB, no?

InfluxDB v2 Support

Hi,

Now that InfluxDB v2 is out for some time, there are any plans supporting the new version?

Feature request: SMART support

First of all, I'd like to say nice work on this tool! It complements telegraf on Windows very well and fills in a lot of gaps. It'd be awesome if the tool could monitor SMART similar to how you can do it with telegraf on Linux:
Capture

AFAIK there is nothing in telegraf for SMART on Windows. LibreHardwareMonitor seems to have decent support for reading SMART attributes.

Hostname capital and lowercase collection problem

My computer‘s hostname is 'Inspiron-3568' ,'I' is in capital, ohmGraphite collect “INSPIRON-3568” as the hostname and exports “INSPIRON-3568” to the InfluxDB.I used ohmGraphite and Telegraf at the same time to collect data.This problem caused a host to have two pieces of information when I used hostname to distinguish devices,How can i deall this ? And thanks for your OhmGraphite :)

Graphite Tag Support

Since graphite 1.1, graphite supports tags, so the name hierarchy may not always be the best fit. I don't know the best way to break up openhardware's sensors into appropriate tags. collectd/collectd#2631 gives an inkling of how it could be done.

Maybe something along the lines of:

hardware=gpu
measurement=temperature
sensor=gpucore
name=0

Still not sold -- may have to think about it for awhile 🤔

On additional sensor libraries

LibrehardwareMonitor is good, but there may be other sensor libraries that expose more sensors or may be more complete. I will always back LibrehardwareMonitor as the default sensor library but it may prove useful to add additional integrations:

hwinfo allows one to export a csv of the data like so:

Date,Time,"Virtual Memory Commited [MB]","Virtual Memory Available [MB]","Virtual Memory Load [%]","Physical Memory Used [MB]","Physical Memory Available [MB]","Physical Memory Load [%]","Page File Usage [%]","Core #0 VID [V]","Core #1 VID [V]","Core #2 VID [V]","Core #3 VID [V]","Core #4 VID [V]","Core #5 VID [V]","Core #6 VID [V]","Core #7 VID [V]","Core #0 Clock (perf #8) [MHz]","Core #1 Clock (perf #6) [MHz]","Core #2 Clock (perf #7) [MHz]","Core #3 Clock (perf #5) [MHz]","Core #4 Clock (perf #2) [MHz]","Core #5 Clock (perf #3) [MHz]","Core #6 Clock (perf #1) [MHz]","Core #7 Clock (perf #4) [MHz]","CPU (Tctl/Tdie) [°C]","CPU Core Voltage (SVI2 TFN) [V]","SoC Voltage (SVI2 TFN) [V]","CPU Core Current (SVI2 TFN) [A]","SoC Current (SVI2 TFN) [A]","CPU Package Power (SMU) [W]","Core #0 Power (SMU) [W]","Core #1 Power (SMU) [W]","Core #2 Power (SMU) [W]","Core #3 Power (SMU) [W]","Core #4 Power (SMU) [W]","Core #5 Power (SMU) [W]","Core #6 Power (SMU) [W]","Core #7 Power (SMU) [W]","CPU Core Power (SVI2 TFN) [W]","SoC Power (SVI2 TFN) [W]","CPU+SoC Power (SVI2 TFN) [W]","Memory Controller Clock (UCLK) [MHz]","Motherboard [°C]","CPU [°C]","Auxiliary [°C]","AUXTIN1 [°C]","AUXTIN2 [°C]","CPU (PECI) [°C]","Vcore [V]","AVCC [V]","3VCC [V]","VIN4 [V]","3VSB [V]","VTT [V]","VIN5 [V]","VIN6 [V]","VIN2 [V]","VIN3 [V]","CPUFANIN0 [RPM]","Chassis Intrusion [Yes/No]","Drive Temperature [°C]","Drive Remaining Life [%]","Drive Failure [Yes/No]","Drive Warning [Yes/No]","Total Host Writes [GB]","Total Host Reads [GB]","Read Activity [%]","Write Activity [%]","Total Activity [%]","Read Rate [MB/s]","Write Rate [MB/s]","Read Total [MB]","Write Total [MB]","GPU Temperature [°C]","GPU Core Voltage [V]","GPU Fan [RPM]","GPU Power [W]","GPU Clock [MHz]","GPU Memory Clock [MHz]","GPU Video Clock [MHz]","GPU Core Load [%]","GPU Memory Controller Load [%]","GPU Video Engine Load [%]","GPU Bus Load [%]","GPU Memory Usage [%]","GPU D3D Usage [%]","GPU Video Decode 0 Usage [%]","GPU Video Encode 0 Usage [%]","GPU Video Encode 1 Usage [%]","GPU Computing (Compute_0) Usage [%]","GPU Computing (Compute_1) Usage [%]","GPU VR Usage [%]","GPU Fan [%]","Performance Limit - Power [Yes/No]","Performance Limit - Thermal [Yes/No]","Performance Limit - Reliability Voltage [Yes/No]","Performance Limit - Max Operating Voltage [Yes/No]","Performance Limit - Utilization [Yes/No]","Performance Limit - SLI GPUBoost Sync [Yes/No]","Total GPU Power (normalized) [% of TDP] [%]","Total GPU Power [% of TDP] [%]","GPU Memory Allocated [MB]","GPU D3D Memory Dedicated [MB]","GPU D3D Memory Dynamic [MB]","PCIe Link Speed [GT/s]","Total DL [MB]","Total UP [MB]","Current DL rate [KB/s]","Current UP rate [KB/s]","Total DL [MB]","Total UP [MB]","Current DL rate [KB/s]","Current UP rate [KB/s]","Total Errors []",
22.1.2020,5:27:6.575,27355,10209,72.8,20781,11919,63.5,4.3,1.100,1.025,1.075,1.087,1.138,1.150,1.131,1.188,3639.1,3391.6,3540.1,2360.1,2772.7,1639.4,1485.4,1386.3,42.0,1.019,0.912,10.541,9.118,25.681,0.449,1.137,0.799,0.519,0.519,0.560,0.512,0.811,10.739,8.320,19.059,1452.4,36.0,42.0,36.0,108.0,109.0,40.0,0.592,3.376,3.360,0.816,3.424,1.848,0.176,0.128,1.808,1.736,982,No,54,100.0,No,No,10305,3956,0.1,0.3,0.4,0.040,0.232,17088,51386,50,0.725,917,34.454,1531.0,2003.4,1366.5,1.0,1.0,0.0,0.0,12.9,2.0,0.0,0.0,0.0,0.0,0.0,0.0,40.0,No,No,No,No,Yes,No,29.4,22.8,1053,958,239,8.0,0,0,0.000,0.000,25,5,0.163,0.104,0,

The csv isn't perfect. The header Core #3 Power (SMU) [W] lacks the context that it's from my Ryzen 2700. This label is provided in hwinfo's UI. Currently OhmGraphite provides hardware labels to sensor readings, so ideally there would be a way to extract this.

hwinfo also has an SDK, but it appears to be under wraps (not open sourced / available)

Aida64 allows external applications to access sensor readings. This is done via memmap. Aida64 is a paid-for application, right? So can't say my motivation is high.

lm-sensors on linux?

Force host name

Hello! Ir's a very good program!! congratulations!.
I have a question, is it posible to set hostname by parameter? Not to get it from dns or machine name.
I'm using InfluxDB.
Thannks!!!

No Connection

Hi,

I have tried to follow the steps to get this up and running but i am seeing this error:

2020-05-02 08:14:32.9422|ERROR|OhmGraphite.MetricTimer|Unable to send metrics!System.NullReferenceException: Object reference not set to an instance of an object.
at System.Net.Sockets.TcpClient.EndConnect(IAsyncResult asyncResult)
at System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action1 endAction, Task1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at OhmGraphite.GraphiteWriter.d__9.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at OhmGraphite.MetricTimer.d__6.MoveNext()
2020-05-02 08:14:34.9424|ERROR|OhmGraphite.MetricTimer|Unable to send metrics!System.Net.Sockets.SocketException (0x80004005): No connection could be made because the target machine actively refused it 127.0.0.1:2003
at System.Net.Sockets.Socket.InternalEndConnect(IAsyncResult asyncResult)
at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
at System.Net.Sockets.TcpClient.EndConnect(IAsyncResult asyncResult)
at System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action1 endAction, Task1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at OhmGraphite.GraphiteWriter.d__9.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at OhmGraphite.MetricTimer.d__6.MoveNext()

Any idea as to what i need to do?

Change of graphicscard

I have bought a new GPU, moved from a Geforce 660 -> GTX 1070 and now my graphs doesn't get updated. Do I need to change anything in the configuration os something else?

Crash in x86 Win7sp1 Ultimate When Strart the OhmGraphite.exe

Here is exception info:

Topshelf.HostFactory Error: 0 : An exception occurred creating the host, System.TypeInitializationException: The type initializer for 'OhmGraphite.Program' threw an exception. ---> System.MissingMethodException: Method not found: 'Int32 System.Environment.get_CurrentManagedThreadId()'.
at NLog.LogFactory.d__84..ctor(Int32 <>1__state)
at NLog.LogFactory.GetCandidateConfigFilePaths()
at NLog.LogFactory.TryLoadFromFilePaths()
at NLog.LogFactory.get_Configuration()
at NLog.LogFactory.GetLogger(LoggerCacheKey cacheKey)
at NLog.LogFactory.GetLogger(String name)
at NLog.LogManager.GetCurrentClassLogger()
at OhmGraphite.Program..cctor()
--- End of inner exception stack trace ---
at OhmGraphite.Program.<>c.<Main>b__1_1(ServiceConfigurator1 s) at Topshelf.ServiceExtensions.CreateServiceBuilderFactory[TService](Action1 callback)
at Topshelf.ServiceExtensions.Service[TService](HostConfigurator configurator, Action1 callback) at OhmGraphite.Program.<>c.<Main>b__1_0(HostConfigurator x) at Topshelf.HostFactory.New(Action1 configureCallback)
Topshelf.HostFactory Error: 0 : The service terminated abnormally, System.TypeInitializationException: The type initializer for 'OhmGraphite.Program' threw an exception. ---> System.MissingMethodException: Method not found: 'Int32 System.Environment.get_CurrentManagedThreadId()'.
at NLog.LogFactory.d__84..ctor(Int32 <>1__state)
at NLog.LogFactory.GetCandidateConfigFilePaths()
at NLog.LogFactory.TryLoadFromFilePaths()
at NLog.LogFactory.get_Configuration()
at NLog.LogFactory.GetLogger(LoggerCacheKey cacheKey)
at NLog.LogFactory.GetLogger(String name)
at NLog.LogManager.GetCurrentClassLogger()
at OhmGraphite.Program..cctor()
--- End of inner exception stack trace ---
at OhmGraphite.Program.<>c.<Main>b__1_1(ServiceConfigurator1 s) at Topshelf.ServiceExtensions.CreateServiceBuilderFactory[TService](Action1 callback)
at Topshelf.ServiceExtensions.Service[TService](HostConfigurator configurator, Action1 callback) at OhmGraphite.Program.<>c.<Main>b__1_0(HostConfigurator x) at Topshelf.HostFactory.New(Action1 configureCallback)
at Topshelf.HostFactory.Run(Action`1 configureCallback)

I tryed OhmGraphite.exe start ,OhmGraphite.exe run and OhmGraphite.exe install,all of them was not work.
The OhmGraphite.exe work well in x64 Win7

Cant login to influxDB

I have tried to login to Influxdb, I know that my login info is correct based on using the same info to login to telegraf. I am trying to log in from a windows server to a linux VM on a different machine both on the same vlan of the network in my homelab. Windows firewall and linux firewall are both disabled completely but the traffic is behind a pfsense router. Any ideas would be great.

OhmGraphite Logs.zip

Unable to send metrics error

When running OhmGraphite using the following command, the process starts and seems to add sensors, but loops through an exception.

C:\Monitoring\OhmGraphite-0.14.0\OhmGraphite.exe run

I can run LibreHardwareMonitor as a GUI and see all the proper data.

Here's the exception:

2020-06-01 12:53:44.0342|ERROR|OhmGraphite.MetricTimer|Unable to send metrics!System.ArgumentNullException: Value cannot be null.
Parameter name: stringToEscape
   at System.Uri.EscapeDataString(String stringToEscape)
   at InfluxDB.LineProtocol.Client.LineProtocolClient.<OnSendAsync>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at OhmGraphite.InfluxWriter.<ReportMetrics>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at OhmGraphite.MetricTimer.<ReportMetrics>d__6.MoveNext()

And here's the full output from OhmGraphite.exe:

PS C:\Monitoring\OhmGraphite-0.14.0> C:\Monitoring\OhmGraphite-0.14.0\OhmGraphite.exe run
2020-06-01 13:49:47.6166|INFO|OhmGraphite.Program|Influxdb address: http://192.168.1.29:8086/ db: gaming
2020-06-01 13:49:47.6825|INFO|Topshelf.HostFactory|Configuration Result:
[Success] Name OhmGraphite
[Success] DisplayName Ohm Graphite
[Success] Description Extract hardware sensor data and exports it to a given host and port in a graphite compatible format
[Success] ServiceName OhmGraphite
2020-06-01 13:49:47.6893|INFO|Topshelf.HostConfigurators.HostConfiguratorImpl|Topshelf v4.2.1.215, .NET Framework v4.0.30319.42000
2020-06-01 13:49:47.7892|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/control/0 "Fan Control #1"
2020-06-01 13:49:47.7892|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/control/1 "Fan Control #2"
2020-06-01 13:49:47.7892|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/control/2 "Fan Control #3"
2020-06-01 13:49:47.7892|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/control/3 "Fan Control #4"
2020-06-01 13:49:47.7892|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/control/4 "Fan Control #5"
2020-06-01 13:49:47.7892|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/control/5 "Fan Control #6"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/1 "CPU Core #1"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/2 "CPU Core #2"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/3 "CPU Core #3"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/4 "CPU Core #4"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/0 "CPU Total"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/0 "CPU Core #1"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/1 "CPU Core #2"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/2 "CPU Core #3"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/3 "CPU Core #4"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/4 "CPU Package"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/5 "CPU Core #1 Distance to TjMax"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/6 "CPU Core #2 Distance to TjMax"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/7 "CPU Core #3 Distance to TjMax"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/8 "CPU Core #4 Distance to TjMax"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/9 "Core Max"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/10 "Core Average"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/1 "CPU Core #1"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/2 "CPU Core #2"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/3 "CPU Core #3"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/4 "CPU Core #4"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/power/0 "CPU Package"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/power/1 "CPU Cores"
2020-06-01 13:49:47.8466|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/power/2 "CPU Graphics"
2020-06-01 13:49:47.8599|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/power/3 "CPU Memory"
2020-06-01 13:49:47.8599|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/0 "Bus Speed"
2020-06-01 13:49:47.8599|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/data/0 "Memory Used"
2020-06-01 13:49:47.8599|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/data/1 "Memory Available"
2020-06-01 13:49:47.8599|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/load/0 "Memory"
2020-06-01 13:49:47.8599|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/data/2 "Virtual Memory Used"
2020-06-01 13:49:47.8599|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/data/3 "Virtual Memory Available"
2020-06-01 13:49:47.8599|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/load/1 "Virtual Memory"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/temperature/0 "GPU Core"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/clock/0 "GPU Core"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/clock/1 "GPU Memory"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/clock/2 "GPU Shader"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/fan/0 "GPU"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/load/0 "GPU Core"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/load/1 "GPU Memory Controller"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/load/2 "GPU Video Engine"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/load/4 "GPU Bus"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/control/0 "GPU Fan"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/smalldata/3 "GPU Memory Total"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/smalldata/2 "GPU Memory Used"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/smalldata/1 "GPU Memory Free"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/load/3 "GPU Memory"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/power/0 "GPU Package"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/throughput/0 "GPU PCIe Rx"
2020-06-01 13:49:47.9576|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu/0/throughput/1 "GPU PCIe Tx"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/temperature/0 "Temperature"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/level/1 "Available Spare"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/level/2 "Available Spare Threshold"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/level/3 "Percentage Used"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/data/4 "Data Read"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/data/5 "Data Written"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/temperature/6 "Temperature 1"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/temperature/7 "Temperature 2"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/load/0 "Used Space"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/load/32 "Write Activity"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/load/33 "Total Activity"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/throughput/34 "Read Rate"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/throughput/35 "Write Rate"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/factor/media_errors "Media Errors"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/factor/power_cycles "Power Cycles"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/factor/error_info_log_entries "Error Info Log Entries"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/0/factor/unsafe_shutdowns "Unsafe Shutdowns"
2020-06-01 13:49:48.5212|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/1/temperature/0 "Temperature"
2020-06-01 13:49:48.5324|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/1/data/0 "Total Bytes Written"
2020-06-01 13:49:48.5324|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/1/load/0 "Used Space"
2020-06-01 13:49:48.5324|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/1/load/32 "Write Activity"
2020-06-01 13:49:48.5324|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/1/load/33 "Total Activity"
2020-06-01 13:49:48.5324|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/1/throughput/34 "Read Rate"
2020-06-01 13:49:48.5324|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/1/throughput/35 "Write Rate"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{5F02ECD9-DB56-4927-AC8B-BFBB27B5FA93}/data/2 "Data Uploaded"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{5F02ECD9-DB56-4927-AC8B-BFBB27B5FA93}/data/3 "Data Downloaded"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{5F02ECD9-DB56-4927-AC8B-BFBB27B5FA93}/throughput/7 "Upload Speed"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{5F02ECD9-DB56-4927-AC8B-BFBB27B5FA93}/throughput/8 "Download Speed"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{5F02ECD9-DB56-4927-AC8B-BFBB27B5FA93}/load/1 "Network Utilization"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{4F3BADD3-42A0-4C70-BFB6-FC170A0916E8}/data/2 "Data Uploaded"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{4F3BADD3-42A0-4C70-BFB6-FC170A0916E8}/data/3 "Data Downloaded"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{4F3BADD3-42A0-4C70-BFB6-FC170A0916E8}/throughput/7 "Upload Speed"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{4F3BADD3-42A0-4C70-BFB6-FC170A0916E8}/throughput/8 "Download Speed"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{4F3BADD3-42A0-4C70-BFB6-FC170A0916E8}/load/1 "Network Utilization"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{D3D36BA9-9896-41D4-B153-0E2CFE41C534}/data/2 "Data Uploaded"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{D3D36BA9-9896-41D4-B153-0E2CFE41C534}/data/3 "Data Downloaded"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{D3D36BA9-9896-41D4-B153-0E2CFE41C534}/throughput/7 "Upload Speed"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{D3D36BA9-9896-41D4-B153-0E2CFE41C534}/throughput/8 "Download Speed"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{D3D36BA9-9896-41D4-B153-0E2CFE41C534}/load/1 "Network Utilization"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{EF18B914-72BF-4D67-AD4B-16EBA4524F64}/data/2 "Data Uploaded"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{EF18B914-72BF-4D67-AD4B-16EBA4524F64}/data/3 "Data Downloaded"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{EF18B914-72BF-4D67-AD4B-16EBA4524F64}/throughput/7 "Upload Speed"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{EF18B914-72BF-4D67-AD4B-16EBA4524F64}/throughput/8 "Download Speed"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{EF18B914-72BF-4D67-AD4B-16EBA4524F64}/load/1 "Network Utilization"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{1C2FBA5E-9C8D-4876-877E-70FD91477545}/data/2 "Data Uploaded"
2020-06-01 13:49:48.7382|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{1C2FBA5E-9C8D-4876-877E-70FD91477545}/data/3 "Data Downloaded"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{1C2FBA5E-9C8D-4876-877E-70FD91477545}/throughput/7 "Upload Speed"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{1C2FBA5E-9C8D-4876-877E-70FD91477545}/throughput/8 "Download Speed"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{1C2FBA5E-9C8D-4876-877E-70FD91477545}/load/1 "Network Utilization"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{44879B29-07E4-4E02-A8FA-5F947AB3E0BE}/data/2 "Data Uploaded"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{44879B29-07E4-4E02-A8FA-5F947AB3E0BE}/data/3 "Data Downloaded"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{44879B29-07E4-4E02-A8FA-5F947AB3E0BE}/throughput/7 "Upload Speed"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{44879B29-07E4-4E02-A8FA-5F947AB3E0BE}/throughput/8 "Download Speed"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{44879B29-07E4-4E02-A8FA-5F947AB3E0BE}/load/1 "Network Utilization"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{E2E10ED1-A00C-4597-B841-EFBF1D410A4E}/data/2 "Data Uploaded"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{E2E10ED1-A00C-4597-B841-EFBF1D410A4E}/data/3 "Data Downloaded"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{E2E10ED1-A00C-4597-B841-EFBF1D410A4E}/throughput/7 "Upload Speed"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{E2E10ED1-A00C-4597-B841-EFBF1D410A4E}/throughput/8 "Download Speed"
2020-06-01 13:49:48.7506|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{E2E10ED1-A00C-4597-B841-EFBF1D410A4E}/load/1 "Network Utilization"
2020-06-01 13:49:48.7506|INFO|Topshelf.Hosts.ConsoleRunHost|The OhmGraphite service is now running, press Control+C to exit.
2020-06-01 13:49:53.7641|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/0 "Vcore"
2020-06-01 13:49:53.7641|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/1 "Voltage #2"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/2 "AVCC"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/3 "+3.3V"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/4 "Voltage #5"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/5 "Voltage #6"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/6 "Voltage #7"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/7 "3VSB"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/9 "VTT"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/10 "Voltage #11"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/11 "Voltage #12"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/12 "Voltage #13"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/13 "Voltage #14"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/voltage/14 "Voltage #15"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/temperature/0 "CPU Core"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/temperature/1 "Temperature #1"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/temperature/2 "Temperature #2"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/temperature/3 "Temperature #3"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/temperature/4 "Temperature #4"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/temperature/5 "Temperature #5"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/temperature/6 "Temperature #6"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/fan/0 "Fan #1"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/fan/1 "Fan #2"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/fan/2 "Fan #3"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/fan/3 "Fan #4"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/fan/4 "Fan #5"
2020-06-01 13:49:53.7661|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/nct6791d/fan/5 "Fan #6"
2020-06-01 13:49:53.9265|ERROR|OhmGraphite.MetricTimer|Unable to send metrics!System.ArgumentNullException: Value cannot be null.
Parameter name: stringToEscape
   at System.Uri.EscapeDataString(String stringToEscape)
   at InfluxDB.LineProtocol.Client.LineProtocolClient.<OnSendAsync>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at OhmGraphite.InfluxWriter.<ReportMetrics>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at OhmGraphite.MetricTimer.<ReportMetrics>d__6.MoveNext()
2020-06-01 13:49:58.8290|ERROR|OhmGraphite.MetricTimer|Unable to send metrics!System.ArgumentNullException: Value cannot be null.
Parameter name: stringToEscape
   at System.Uri.EscapeDataString(String stringToEscape)
   at InfluxDB.LineProtocol.Client.LineProtocolClient.<OnSendAsync>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at OhmGraphite.InfluxWriter.<ReportMetrics>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at OhmGraphite.MetricTimer.<ReportMetrics>d__6.MoveNext()
2020-06-01 13:49:59.4190|INFO|Topshelf.Hosts.ConsoleRunHost|Control+C detected, attempting to stop service.
2020-06-01 13:49:59.4938|INFO|Topshelf.Hosts.ConsoleRunHost|The OhmGraphite service has stopped.

Unable to startup on Windows 10 professional

Awesome plugin, this should do exactly what I need (send hardware temperature data to Influx).

The initial setup docs are very straightforward and I got going almost immediately after downloading the app. However, upon first startup, the metric-reporting process errors out. It is unable to send any metrics at all.

I have set my log level to Debug and the output is below. It appears that a sensor with a null value causes the entire metric reporting process to fail.

I have tried adding sensors selectively to OhmGraphite.exe.config under <appSettings> section with the /hidden flag to attempt to weed out the problematic values. Example of how I'm hiding them: <add key="/nic/{2A2F495E-FA5C-4393-8549-C471BE4AD0F7}/data/2/hidden" />

After hiding the sensors that I thought looked problematic, same issue. Would it be a better option to just ignore null sensors values (and not send them), and allow the rest of the metrics to send or am I doing something wrong here?

2020-09-25 12:16:23.0581|DEBUG|OhmGraphite.Program|Starting: parse config
2020-09-25 12:16:23.0919|DEBUG|OhmGraphite.Program|Finished: parse config
2020-09-25 12:16:23.1147|INFO|OhmGraphite.Program|Influxdb address: http://192.168.2.17:8086/ db: win10ohw
2020-09-25 12:16:23.1509|INFO|Topshelf.HostFactory|Configuration Result:
[Success] Name OhmGraphite
[Success] DisplayName Ohm Graphite
[Success] Description Extract hardware sensor data and exports it to a given host and port in a graphite compatible format
[Success] ServiceName OhmGraphite
2020-09-25 12:16:23.1509|INFO|Topshelf.HostConfigurators.HostConfiguratorImpl|Topshelf v4.2.1.215, .NET Framework v4.0.30319.42000
2020-09-25 12:16:23.1751|DEBUG|Topshelf.Builders.RunBuilder|Running as a console application, creating the console host.
2020-09-25 12:16:23.1751|DEBUG|Topshelf.Hosts.ConsoleRunHost|Starting up as a console application
2020-09-25 12:16:23.1751|DEBUG|OhmGraphite.MetricTimer|Starting: starting metric timer
2020-09-25 12:16:23.3035|DEBUG|OhmGraphite.SensorCollector|Hardware added: /motherboard
2020-09-25 12:16:23.3035|DEBUG|OhmGraphite.SensorCollector|Hardware added: /lpc/it8688e
2020-09-25 12:16:23.3035|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/control/0 "Fan Control #1"
2020-09-25 12:16:23.3035|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/control/1 "Fan Control #2"
2020-09-25 12:16:23.3035|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/control/2 "Fan Control #3"
2020-09-25 12:16:23.3035|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/control/3 "Fan Control #4"
2020-09-25 12:16:23.3035|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/control/4 "Fan Control #5"
2020-09-25 12:16:23.3035|DEBUG|OhmGraphite.SensorCollector|Hardware added: /lpc/it879xe
2020-09-25 12:16:23.3035|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/control/0 "Fan Control #1"
2020-09-25 12:16:23.3035|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/control/1 "Fan Control #2"
2020-09-25 12:16:23.3035|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/control/2 "Fan Control #3"
2020-09-25 12:16:23.4732|DEBUG|OhmGraphite.SensorCollector|Hardware added: /intelcpu/0
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/1 "CPU Core #1"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/2 "CPU Core #2"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/3 "CPU Core #3"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/4 "CPU Core #4"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/5 "CPU Core #5"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/6 "CPU Core #6"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/7 "CPU Core #7"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/8 "CPU Core #8"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/load/0 "CPU Total"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/0 "CPU Core #1"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/1 "CPU Core #2"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/2 "CPU Core #3"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/3 "CPU Core #4"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/4 "CPU Core #5"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/5 "CPU Core #6"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/6 "CPU Core #7"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/7 "CPU Core #8"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/8 "CPU Package"
2020-09-25 12:16:23.4732|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/9 "CPU Core #1 Distance to TjMax"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/10 "CPU Core #2 Distance to TjMax"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/11 "CPU Core #3 Distance to TjMax"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/12 "CPU Core #4 Distance to TjMax"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/13 "CPU Core #5 Distance to TjMax"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/14 "CPU Core #6 Distance to TjMax"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/15 "CPU Core #7 Distance to TjMax"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/16 "CPU Core #8 Distance to TjMax"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/17 "Core Max"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/temperature/18 "Core Average"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/1 "CPU Core #1"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/2 "CPU Core #2"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/3 "CPU Core #3"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/4 "CPU Core #4"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/5 "CPU Core #5"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/6 "CPU Core #6"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/7 "CPU Core #7"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/8 "CPU Core #8"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/power/0 "CPU Package"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/power/1 "CPU Cores"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/power/2 "CPU Graphics"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/power/3 "CPU Memory"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /intelcpu/0/clock/0 "Bus Speed"
2020-09-25 12:16:23.4837|DEBUG|OhmGraphite.SensorCollector|Hardware added: /ram
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/data/0 "Memory Used"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/data/1 "Memory Available"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/load/0 "Memory"
2020-09-25 12:16:23.4837|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/data/2 "Virtual Memory Used"
2020-09-25 12:16:23.4990|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/data/3 "Virtual Memory Available"
2020-09-25 12:16:23.4990|INFO|OhmGraphite.SensorCollector|Sensor added: /ram/load/1 "Virtual Memory"
2020-09-25 12:16:23.5964|DEBUG|OhmGraphite.SensorCollector|Hardware added: /gpu-nvidia/0
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/temperature/0 "GPU Core"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/clock/0 "GPU Core"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/clock/1 "GPU Memory"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/clock/2 "GPU Shader"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/fan/0 "GPU"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/load/0 "GPU Core"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/load/1 "GPU Memory Controller"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/load/2 "GPU Video Engine"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/load/4 "GPU Bus"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/control/0 "GPU Fan"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/smalldata/3 "GPU Memory Total"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/smalldata/2 "GPU Memory Used"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/smalldata/1 "GPU Memory Free"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/load/3 "GPU Memory"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/power/0 "GPU Package"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/throughput/0 "GPU PCIe Rx"
2020-09-25 12:16:23.5964|INFO|OhmGraphite.SensorCollector|Sensor added: /gpu-nvidia/0/throughput/1 "GPU PCIe Tx"
2020-09-25 12:16:23.8966|DEBUG|OhmGraphite.SensorCollector|Hardware added: /ssd/0
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/0/temperature/0 "Temperature"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/0/data/0 "Total Bytes Written"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/0/load/0 "Used Space"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/0/load/32 "Write Activity"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/0/load/33 "Total Activity"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/0/throughput/34 "Read Rate"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /ssd/0/throughput/35 "Write Rate"
2020-09-25 12:16:23.8966|DEBUG|OhmGraphite.SensorCollector|Hardware added: /nvme/1
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/temperature/0 "Temperature"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/level/1 "Available Spare"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/level/2 "Available Spare Threshold"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/level/3 "Percentage Used"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/data/4 "Data Read"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/data/5 "Data Written"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/temperature/6 "Temperature 1"
2020-09-25 12:16:23.8966|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/temperature/7 "Temperature 2"
2020-09-25 12:16:23.9060|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/load/0 "Used Space"
2020-09-25 12:16:23.9060|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/load/32 "Write Activity"
2020-09-25 12:16:23.9060|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/load/33 "Total Activity"
2020-09-25 12:16:23.9060|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/throughput/34 "Read Rate"
2020-09-25 12:16:23.9060|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/throughput/35 "Write Rate"
2020-09-25 12:16:23.9060|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/factor/media_errors "Media Errors"
2020-09-25 12:16:23.9060|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/factor/power_cycles "Power Cycles"
2020-09-25 12:16:23.9060|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/factor/error_info_log_entries "Error Info Log Entries"
2020-09-25 12:16:23.9060|INFO|OhmGraphite.SensorCollector|Sensor added: /nvme/1/factor/unsafe_shutdowns "Unsafe Shutdowns"
2020-09-25 12:16:24.0451|DEBUG|OhmGraphite.SensorCollector|Hardware added: /nic/{2A2F495E-FA5C-4393-8549-C471BE4AD0F7}
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{2A2F495E-FA5C-4393-8549-C471BE4AD0F7}/data/2 "Data Uploaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{2A2F495E-FA5C-4393-8549-C471BE4AD0F7}/data/3 "Data Downloaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{2A2F495E-FA5C-4393-8549-C471BE4AD0F7}/throughput/7 "Upload Speed"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{2A2F495E-FA5C-4393-8549-C471BE4AD0F7}/throughput/8 "Download Speed"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{2A2F495E-FA5C-4393-8549-C471BE4AD0F7}/load/1 "Network Utilization"
2020-09-25 12:16:24.0460|DEBUG|OhmGraphite.SensorCollector|Hardware added: /nic/{3CCFBC25-1440-4ED4-BD8C-A283D8A92374}
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{3CCFBC25-1440-4ED4-BD8C-A283D8A92374}/data/2 "Data Uploaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{3CCFBC25-1440-4ED4-BD8C-A283D8A92374}/data/3 "Data Downloaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{3CCFBC25-1440-4ED4-BD8C-A283D8A92374}/throughput/7 "Upload Speed"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{3CCFBC25-1440-4ED4-BD8C-A283D8A92374}/throughput/8 "Download Speed"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{3CCFBC25-1440-4ED4-BD8C-A283D8A92374}/load/1 "Network Utilization"
2020-09-25 12:16:24.0460|DEBUG|OhmGraphite.SensorCollector|Hardware added: /nic/{D348F34D-B185-4FB3-BE67-FCDC1D1E391A}
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{D348F34D-B185-4FB3-BE67-FCDC1D1E391A}/data/2 "Data Uploaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{D348F34D-B185-4FB3-BE67-FCDC1D1E391A}/data/3 "Data Downloaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{D348F34D-B185-4FB3-BE67-FCDC1D1E391A}/throughput/7 "Upload Speed"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{D348F34D-B185-4FB3-BE67-FCDC1D1E391A}/throughput/8 "Download Speed"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{D348F34D-B185-4FB3-BE67-FCDC1D1E391A}/load/1 "Network Utilization"
2020-09-25 12:16:24.0460|DEBUG|OhmGraphite.SensorCollector|Hardware added: /nic/{284D7060-BA63-4C8A-8C7A-3B9B5A67D347}
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{284D7060-BA63-4C8A-8C7A-3B9B5A67D347}/data/2 "Data Uploaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{284D7060-BA63-4C8A-8C7A-3B9B5A67D347}/data/3 "Data Downloaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{284D7060-BA63-4C8A-8C7A-3B9B5A67D347}/throughput/7 "Upload Speed"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{284D7060-BA63-4C8A-8C7A-3B9B5A67D347}/throughput/8 "Download Speed"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{284D7060-BA63-4C8A-8C7A-3B9B5A67D347}/load/1 "Network Utilization"
2020-09-25 12:16:24.0460|DEBUG|OhmGraphite.SensorCollector|Hardware added: /nic/{EBBA0D0D-2416-4178-B739-967F6B18A5F7}
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{EBBA0D0D-2416-4178-B739-967F6B18A5F7}/data/2 "Data Uploaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{EBBA0D0D-2416-4178-B739-967F6B18A5F7}/data/3 "Data Downloaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{EBBA0D0D-2416-4178-B739-967F6B18A5F7}/throughput/7 "Upload Speed"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{EBBA0D0D-2416-4178-B739-967F6B18A5F7}/throughput/8 "Download Speed"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{EBBA0D0D-2416-4178-B739-967F6B18A5F7}/load/1 "Network Utilization"
2020-09-25 12:16:24.0460|DEBUG|OhmGraphite.SensorCollector|Hardware added: /nic/{1AD9736C-F1B1-4A2D-838C-69E3CE069EE5}
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{1AD9736C-F1B1-4A2D-838C-69E3CE069EE5}/data/2 "Data Uploaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{1AD9736C-F1B1-4A2D-838C-69E3CE069EE5}/data/3 "Data Downloaded"
2020-09-25 12:16:24.0460|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{1AD9736C-F1B1-4A2D-838C-69E3CE069EE5}/throughput/7 "Upload Speed"
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{1AD9736C-F1B1-4A2D-838C-69E3CE069EE5}/throughput/8 "Download Speed"
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{1AD9736C-F1B1-4A2D-838C-69E3CE069EE5}/load/1 "Network Utilization"
2020-09-25 12:16:24.0619|DEBUG|OhmGraphite.SensorCollector|Hardware added: /nic/{8BDFFA62-60D7-48F8-B373-D35DF29B1A7A}
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{8BDFFA62-60D7-48F8-B373-D35DF29B1A7A}/data/2 "Data Uploaded"
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{8BDFFA62-60D7-48F8-B373-D35DF29B1A7A}/data/3 "Data Downloaded"
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{8BDFFA62-60D7-48F8-B373-D35DF29B1A7A}/throughput/7 "Upload Speed"
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{8BDFFA62-60D7-48F8-B373-D35DF29B1A7A}/throughput/8 "Download Speed"
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{8BDFFA62-60D7-48F8-B373-D35DF29B1A7A}/load/1 "Network Utilization"
2020-09-25 12:16:24.0619|DEBUG|OhmGraphite.SensorCollector|Hardware added: /nic/{3914ED0C-653D-4A4B-8EB4-F2DA833DA929}
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{3914ED0C-653D-4A4B-8EB4-F2DA833DA929}/data/2 "Data Uploaded"
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{3914ED0C-653D-4A4B-8EB4-F2DA833DA929}/data/3 "Data Downloaded"
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{3914ED0C-653D-4A4B-8EB4-F2DA833DA929}/throughput/7 "Upload Speed"
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{3914ED0C-653D-4A4B-8EB4-F2DA833DA929}/throughput/8 "Download Speed"
2020-09-25 12:16:24.0619|INFO|OhmGraphite.SensorCollector|Sensor added: /nic/{3914ED0C-653D-4A4B-8EB4-F2DA833DA929}/load/1 "Network Utilization"
2020-09-25 12:16:24.0619|DEBUG|OhmGraphite.MetricTimer|Finished: starting metric timer
2020-09-25 12:16:24.0619|INFO|Topshelf.Hosts.ConsoleRunHost|The OhmGraphite service is now running, press Control+C to exit.
2020-09-25 12:16:29.0780|DEBUG|OhmGraphite.MetricTimer|Starting to report metrics
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/voltage/0 "Vcore"
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/voltage/1 "DIMM"
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/voltage/2 "+3.3V"
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/voltage/3 "+5V"
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/voltage/5 "Voltage #6"
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/voltage/6 "Voltage #7"
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/voltage/7 "Voltage #8"
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/voltage/8 "VBat"
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/temperature/0 "Temperature #1"
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/temperature/1 "Temperature #2"
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/temperature/2 "Temperature #3"
2020-09-25 12:16:29.0780|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/temperature/3 "Temperature #4"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/temperature/4 "Temperature #5"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/fan/0 "Fan #1"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/fan/1 "Fan #2"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/fan/2 "Fan #3"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/fan/3 "Fan #4"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it8688e/fan/4 "Fan #5"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/voltage/0 "Vcore"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/voltage/1 "DIMM"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/voltage/2 "+3.3V"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/voltage/3 "+5V"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/voltage/4 "Voltage #5"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/voltage/5 "Voltage #6"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/voltage/6 "Voltage #7"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/voltage/7 "Voltage #8"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/voltage/8 "VBat"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/temperature/0 "Temperature #1"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/temperature/2 "Temperature #3"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/fan/0 "Fan #1"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/fan/1 "Fan #2"
2020-09-25 12:16:29.0929|INFO|OhmGraphite.SensorCollector|Sensor added: /lpc/it879xe/fan/2 "Fan #3"
2020-09-25 12:16:29.4752|DEBUG|OhmGraphite.SensorCollector|/lpc/it8688e/control/2 did not have a value
2020-09-25 12:16:29.4752|DEBUG|OhmGraphite.SensorCollector|/lpc/it8688e/control/0 did not have a value
2020-09-25 12:16:29.4752|DEBUG|OhmGraphite.SensorCollector|/lpc/it8688e/control/1 did not have a value
2020-09-25 12:16:29.4752|DEBUG|OhmGraphite.SensorCollector|/lpc/it8688e/control/3 did not have a value
2020-09-25 12:16:29.4752|DEBUG|OhmGraphite.SensorCollector|/lpc/it8688e/control/4 did not have a value
2020-09-25 12:16:29.5137|ERROR|OhmGraphite.MetricTimer|Unable to send metrics!System.ArgumentNullException: Value cannot be null.
Parameter name: stringToEscape
   at System.Uri.EscapeDataString(String stringToEscape)
   at InfluxDB.LineProtocol.Client.LineProtocolClient.<OnSendAsync>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at OhmGraphite.InfluxWriter.<ReportMetrics>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at OhmGraphite.MetricTimer.<ReportMetrics>d__6.MoveNext()
2020-09-25 12:16:33.0044|INFO|Topshelf.Hosts.ConsoleRunHost|Control+C detected, attempting to stop service.
2020-09-25 12:16:33.0044|DEBUG|OhmGraphite.MetricTimer|Starting: stopping metric timer

Normalize values and units on all exporters

After implementing #67 to conform to prometheus best practices, I'd like to apply that PR to the other exporters. I want:

  • One type to represent number of bytes. SmallData (2^20) and Data (2^30) should just become bytes, so that one doesn't need to lookup source code to figure out how to convert them to bytes.
  • One type to represent frequency (Hz). Frequency (Hz) and Clock (MHz) should be consolidated into hertz. Clock is annoying in grafana as there isn't a native MHz unit, so one has to multiply values by 1000000 before mapping to Hz.
  • All exporters to be consistent in the data they are exporting

I haven't decided yet if the other exporters should adopt the more descriptive names like prometheus (eg: prefer "bytes_per_second" over "Throughput"), so I'm unlikely to act on this issue immediately.

I think any solution will require the use of a config field like normalize_units that will be enabled by default. That way new installations will, by default, use the improved units and values, while ongoing installations can opt into preserving their desired behavior

Using Prometheus

Hi,

I couldn't find a way to get metrics from Prometheus.
It's not really a bug, but any help would be greatly appreciated, as I didn't know where to ask for support.

OhmGraphite is installed on Windows Server 2012 R2, with this config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="type" value="prometheus" />
    <add key="prometheus_port" value="4445" />
    <add key="prometheus_host" value="127.0.0.1" />
    <add key="tags" value="true" />
  </appSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
</configuration>

Service is running and according to netstat, the process is listening on port 4445.
Firewall has open this port for TCP in & out.

Then, on the Prometheus machine, I've configured:

scrape_configs:
  - job_name: 'node'
    static_configs:
    - targets: ['winsrv:4445']
      labels:
        host: 'coin'

So far I haven't seen any error in the log.
But when asking Prometheus for metrics on {host="coin"}, I get only:

scrape_duration_seconds{host="coin",instance="winsrv:4445",job="node"} | 8.581074809
scrape_samples_post_metric_relabeling{host="coin",instance="winsrv:4445",job="node"} | 0
scrape_samples_scraped{host="coin",instance="winsrv:4445",job="node"} | 0
up{host="coin",instance="winsrv:4445",job="node"} | 0

However, I'm sucessfully monitoring with wmi_exporter on the same machine.
What am I missing here ?

Feature request: Allow metric hiding

Hi Nick!

Great work on adding the aliasing in v0.13.0, works like a charm! I have another one for you that is kind of a followup to my previous request.

It would be great to add ability to hide specific metrics and not log them. OHM supports this type of config entries that make then not appear on the list unless show hidden is turned on:

<add key="/lpc/it8665e/temperature/0/hidden" value="true" />

OhmGraphite could skip entries with hidden = true so we're not sending data we do not want/do not need, or simply because OHM values are incorrect and therefore bring no value to the monitoring.

For example, on my Asus Crosshair Hero VII those temps are useless because they are just duplicated CPU Socket Temperatures.

ohmGraphite sends float with comma instead of dots

Hey,

i tried your project and so far really like it. Unfortunately it seems that due to my locale the floating points are being sent as comma instead of a dot. This seems to be due to the german locale and the automatic formatting of data.Value ( https://github.com/nickbabcock/OhmGraphite/blob/master/OhmGraphite/MetricTimer.cs#L88 ). It would be fantastic if you patch the code to always format float with dots instead of comma to avoid any locale issues. I'd fix the issue myself but unfortunately i do not have any experience with C#.

This is the log of the carbonCache:

May 03 22:19:36 wolf carbon-cache-a[633]: [listener] invalid line received from client 10.42.27.207:50415, ignoring [ohm.KAFFEEHALTER.hdd.0.factor.writeamplification 2,228571 1525378776]

Thanks in advance!

[help required] Volts and FAN RPM Not Visible

I have set up the utility and configured user provided Grafana dashboard for InfluxDB.
I can see that all the parameters like Temperature, Frequencies are properly visible.
I can not see any values for Volts and FAN RPM.
Do I need to do any additional configuration ?

Allow password key omission from influxdb config on passwordless user

Currently, when specifying a influxdb user, one must specify also specify at least a blank password.

This has confused users:

This appears to be a limitation of the underlying influx library, so we should just do the user friendly thing and pass in the empty string if we detect a user is supplied but no password.

Combine Ati and Nvidia GPUs

For hardware types there are multiple GPU brands listed (ATI and Nvidia). This distinction is only for GPUs (ie: there is only one cpu hardware type -- it's not broken into amd and intel). The consequence of this distinction is that if one were to swap out their GPU for another brand, then all metric names would need to be migrated over or one would need the foresight to cover both use cases like:

SELECT * FROM ohm_stats
    WHERE hardware_type = 'GpuNvidia' OR
                 hardware_type = 'GpuAti'

A potential solutions would be to simply export both of these metrics under the single label of "gpu". This would be a breaking change to all users, something I try very hard to avoid.

So I'll leave this issue open and if there has been significant feedback or if it is bothersome, then I can look implement something (ie: a config flag).

Cannot change password

I've configured 2 hosts to access grafana:

Here is the Apache configuration:

<VirtualHost *:80>
    ServerName grafana

    ErrorLog /var/log/apache2/grafana-error
    CustomLog /var/log/apache2/grafana-access combined

    TimeOut 600
    ProxyPass / http://<grafana-ip>:3000/
    ProxyPassReverse / http://<grafana-ip>:3000/
    ProxyPreserveHost on
    RemoteIPHeader X-Forwarded-For
    RemoteIPTrustedProxy 127.0.0.1 ::1
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
    RequestHeader set "X-WEBAUTH-USER" ""

    <ifModule mod_headers.c>
        Header unset ETag
        Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
        Header set Pragma "no-cache"
        Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
    </ifModule>
</VirtualHost>
<VirtualHost *:80>
    ServerName monitoring

    ErrorLog /var/log/apache2/grafana-error
    CustomLog /var/log/apache2/grafana-access combined

    TimeOut 600
    ProxyPass / http://<grafana-ip>:3000/
    ProxyPassReverse / http://<grafana-ip>:3000/
    ProxyPreserveHost on
    RemoteIPHeader X-Forwarded-For
    RemoteIPTrustedProxy 127.0.0.1 ::1
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
    RequestHeader set "X-WEBAUTH-USER" "public"

    <ifModule mod_headers.c>
        Header unset ETag
        Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
        Header set Pragma "no-cache"
        Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
    </ifModule>
</VirtualHost>

With this configuration, I have an access for users without login on monitoring and a required login box on grafana, which is the desired behavior.

However, when connected as an admin, I cannot change my password in the Preferences interface, it says:
You cannot change password when ldap or auth proxy authentication is enabled.

Locking the password change is expected for the public access, but not for the admin one.
I've tried to remove the line in apache vhost

# RequestHeader set "X-WEBAUTH-USER" ""

but this didn't resolve the issue.

I didn't configure any LDAP nor Auth Proxy, so the message confuses me.
Any advice on this ?

Monitoring data is not available from some machines

I'm having an issue with one of the machine I have ohmgraphite installed and running as a service but at my graphite server there's no data from the certain machine.

No firewall (also on linux server the firewall and SELinux has been disabled).
No antivirus.
The IP address pointer is correct.

I would like to know if there is anything I missed to configure.

Metric names are occasionally clobbered

I observed occasional clobbered (truncated or mixed) metric names in my Carbon database, e.g.:

./ohm/DRAGON/gpu-nvidia/0/temperature/gohm/DRAGON/nic/266FD541-153A-4BCF-B510-CAD4858E01AA/throughput/uploadspeed.wsp
./rature/temperature/2.wsp
./ohm/DRAoltage/+5v.wsp
./ohm/DRA/DRAGON/gpu-nvidia/0/power/gpupackage.wsp
./ohm/DRAGO/2270CAF9-24FF-4E2F-AFD5-FBB23C11E87F/data/datauploaded.wsp

Based on the time stamps of the database files, I found that each of them corresponds to a log entry of OhmGraphite where the reported time for sending is longer than the polling interval, e.g.:

2020-11-23 20:33:51.1512|INFO|OhmGraphite.MetricTimer|Sent 133 metrics in 5262,329ms
2020-11-24 00:02:57.0687|INFO|OhmGraphite.MetricTimer|Sent 133 metrics in 5140,7891ms

There are no log entries other than the once-per-interval Sent message. I'm currently waiting for the problem to trigger once again with Debug log level and will update this issue if anything suspicious shows in the log.

Network load

I can't see any network load in Grafana, so I guess it's not send by OhmGraphit. Is it possible to add it in the futur ?
Regards

Update Sample Dashboards with Grafana 7 Usage

Grafana 7 has some nice visualizations like tables with inlined gauges

image

side note: I should be hiding those faulty sensors via https://github.com/nickbabcock/OhmGraphite#hiding-sensors

This table provides a nice, at a glance, summary of temperatures across all components. Tables like this could lead a row and be followed by the detailed breakdown of each hardware instance by time (like how it currently is).

It looks like the samples dashboards have been downloaded ~200 so some people are finding them useful. Probably a good idea to keep updated with grafana.

If anyone has panels they'd like to share, feel free to showcase them. I'll play around some more -- see what sticks. Grafana 7 is still newish, so I don't imagine I'll push this change too quickly.

No flag to specify config location

Hi - great tool. I love it! :)

I tried running --help to see the available options but couldn't find a flag for specifying the location of the config file when running the binary. For example:

PS D:\> .\Monitor\programs\OhmGraphite-0.16.0\OhmGraphite.exe --config .\Far\Far\Away\config.xml

I'm not familiar with Topshelf or .NET development in general, so hopefully adding functionality for custom flags isn't too involved.

When use Prometheus ,OhmGraphite.MetricTimer|Unable to send metrics!System.IO.IOException

I use Prometheus.

So i according to the Prometheus Configuration docs update the config file to the Prometheus host and port.
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="host" value="localhost" /> <add key="port" value="9090" /> <add key="interval" value="5" /> </appSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> </startup> </configuration>
But when i do that, I see this in the log:
2020-08-28 13:46:23.1390|ERROR|OhmGraphite.MetricTimer|Unable to send metrics!System.IO.IOException: 无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。。 ---> System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接。 在 System.Net.Sockets.Socket.BeginSend(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state) 在 System.Net.Sockets.NetworkStream.BeginWrite(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state) --- 内部异常堆栈跟踪的结尾 --- 在 System.Net.Sockets.NetworkStream.BeginWrite(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state) 在 System.IO.Stream.<>c.<BeginEndWriteAsync>b__53_0(Stream stream, ReadWriteParameters args, AsyncCallback callback, Object state) 在 System.Threading.Tasks.TaskFactory1.FromAsyncTrim[TInstance,TArgs](TInstance thisRef, TArgs args, Func5 beginMethod, Func3 endMethod)
在 System.IO.Stream.BeginEndWriteAsync(Byte[] buffer, Int32 offset, Int32 count)
在 System.IO.Stream.WriteAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
在 System.IO.Stream.WriteAsync(Byte[] buffer, Int32 offset, Int32 count)
在 System.IO.StreamWriter.d__68.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.IO.StreamWriter.d__55.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 OhmGraphite.GraphiteWriter.d__9.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 OhmGraphite.MetricTimer.d__7.MoveNext()
2020-08-28 13:46:24.3130|INFO|OhmGraphite.Program|Graphite host: localhost port: 9090 interval: 5 tags: False
2020-08-28 13:46:24.4157|INFO|Topshelf.HostFactory|Configuration Result:`

Prometheus requires Metric Name sanitizing

Some of names that Open Hardware Monitor spits out (in my case nic_{hexhex-hex-hex-hex-hexhex}_data_2) don’t pass ^[a-zA-Z_:][a-zA-Z0-9_:]*$ regex check performed by Prometheus.MetricFactory.CreateGauge for name, causing exception and http error 500.

Adding some additional character removing/replacing at the end of

sensor.Identifier.Substring(1).Replace('/', '_'),
does solve the problem.

And by the way, thank you very much for writing this tool!

Clickhouse db

Hello, is anyone wanted to use clickhouse to store data?

I am new with C++ and any advice how to adopt current writes for CH?
I suppose it must be very close to InfuxDB, no?

No power for nvidia gpu (it has worked for a while)

Hello, i think after a couple driver updates from nvidia i did not get any power readings anymore for the gpu.
I the logfile there are all sorts of readings for load/clock but no power.

I use the latest version 0.16.
Nvidia is 460.89 / RTX3070

After influxdb down for 20min, reported Temperature values are nonsensical

My influxdb machine was off the air for 20m. After it booted, the temperatures reported are silly, like 4,294,955 degrees C.

Here's what it looks like in my dashboard:
2020-03-24 20_59_59-OhmGraphite Influx - Grafana

Here's how I got there:

  • installed v0.12.0 and configured it for InfluxDB
  • installed the sample dashboard https://grafana.com/grafana/dashboards/11601 (and fixed all the Temperature graphs that were labelled "Wattage")
  • turned of my influx box, turned in on 20 min later

Sample influx query:

> SELECT mean("value") FROM "Temperature" WHERE ("app" = 'ohm' AND "hardware_type" =~ /^CPU$/ AND "host" =~ /^PEPE$/) AND time >= now() - 1h GROUP BY time(120s), "sensor" fill(null)


name: Temperature
tags: sensor=Core CCDs Average (Tdie)
time                 mean
----                 ----
2020-03-25T00:20:00Z
2020-03-25T00:22:00Z
2020-03-25T00:24:00Z
2020-03-25T00:26:00Z
2020-03-25T00:28:00Z
2020-03-25T00:30:00Z 2147497
2020-03-25T00:32:00Z 2147497.0833333335
2020-03-25T00:34:00Z 2684289.1666666665
2020-03-25T00:36:00Z 2863219.1666666665
2020-03-25T00:38:00Z 2863219
2020-03-25T00:40:00Z 2863219
2020-03-25T00:42:00Z 2863219
2020-03-25T00:44:00Z 2863219.1666666665
2020-03-25T00:46:00Z 2863219.3333333335
2020-03-25T00:48:00Z 2863220
2020-03-25T00:50:00Z 2863221.6666666665
2020-03-25T00:52:00Z 2863224.5
2020-03-25T00:54:00Z 2863224.25
2020-03-25T00:56:00Z 2863224.25
2020-03-25T00:58:00Z 2863224
2020-03-25T01:00:00Z 2863224.625

name: Temperature
tags: sensor=Core CCDs Max (Tdie)
time                 mean
----                 ----
2020-03-25T00:20:00Z
2020-03-25T00:22:00Z
2020-03-25T00:24:00Z
2020-03-25T00:26:00Z
2020-03-25T00:28:00Z
2020-03-25T00:30:00Z 4294955
2020-03-25T00:32:00Z 4294955
2020-03-25T00:34:00Z 4294955
2020-03-25T00:36:00Z 4294955
2020-03-25T00:38:00Z 4294955
2020-03-25T00:40:00Z 4294955
2020-03-25T00:42:00Z 4294955
2020-03-25T00:44:00Z 4294955
2020-03-25T00:46:00Z 4294955
2020-03-25T00:48:00Z 4294955
2020-03-25T00:50:00Z 4294955
2020-03-25T00:52:00Z 4294955
2020-03-25T00:54:00Z 4294955
2020-03-25T00:56:00Z 4294955
2020-03-25T00:58:00Z 4294955
2020-03-25T01:00:00Z 4294955

Service Install Not Reading All Sensors

Hello,

If i run the executable directly from power shell all of my sensors are picked up and log into influx and Grafana. However if i install as a service, some of the sensors like GPU activity and temp stop getting logged.

Is there a way to install the service and run it as an admin? I looked but couldn’t figure it out last night.

Linux Alternative

just to start, i love OhmGraphite. Simple and quick method to track our infra, with a standardised set of metadata and structure!

I am looking for something that does the same thing, but for linux, preferably with the same naming conventions as OG, and ease of install/config

any ideas?

thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.