Getting data from Windows PC data

PS /home/pi> Options  
Options : The term 'Options' is not recognized as the name of a cmdlet, functionCheck the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Options
+ ~~~~~~~
+ CategoryInfo          : ObjectNotFound: (Options:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
 
PS /home/pi> Options = New-PSSessionOption
Options : The term 'Options' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Options = NSw-PSSessionOption
+ ~~~~~~~
ception
+ FullyQualifiedErrorId : CommandNotFoundException
 
PS /home/pi> Enter-PSSession -ComputerName 192.168.2.111 -Credential montaj -Authentication basic -UseSSL -SessionOption $Options

PowerShell credential request
Enter your credentials.
Password for user montaj: *****

Enter-PSSession : Cannot validate argument on parameter 'SessionOption'. The argument is null. Provide a valid value for the argument, and then try running the command again.
At line:1 char:109
+ ... edential montaj -Authentication basic -UseSSL -SessionOption $Options
+                                                                  ~~~~~~~~
+ CategoryInfo          : InvalidData: (:) [Enter-PSSession], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.EnterPSSessionCommand
 
PS /home/pi> Enter-PSSession -ComputerName 192.168.2.111 -Credential montaj -Authentication basic -UseSSL -SessionOption $Options

PowerShell credential request
Enter your credentials.
Password for user montaj: *****

Enter-PSSession : Cannot validate argument on parameter 'SessionOption'. The argument is null. Provide a valid value for the argument, and then try running the command again.
At line:1 char:109
+ ... edential montaj -Authentication basic -UseSSL -SessionOption $Options
+                                                                  ~~~~~~~~
+ CategoryInfo          : InvalidData: (:) [Enter-PSSession], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.EnterPSSessionCommand
 
PS /home/pi> 

Im trying to searches 20-30 times a day and looking almost all pages but didnt found some information useable. you can see my last 20 google searches. Looking for web always

Remember that PowerShell is a different language with its own syntax.

$options = New-PSSessionOption

You need the leading $ sign.

> $options = New-PSSessionOption
PS C:\Users
> $options                                                                                                                                       

MaximumConnectionRedirectionCount : 5
NoCompression                     : False
NoMachineProfile                  : False
ProxyAccessType                   : None
ProxyAuthentication               : Negotiate
ProxyCredential                   :
SkipCACheck                       : False
SkipCNCheck                       : False
SkipRevocationCheck               : False
OperationTimeout                  : 00:03:00
NoEncryption                      : False
UseUTF16                          : False
IncludePortInSPN                  : False
OutputBufferingMode               : None
MaxConnectionRetryCount           : 0
Culture                           :
UICulture                         :
MaximumReceivedDataSizePerCommand :
MaximumReceivedObjectSize         :
ApplicationArguments              :
OpenTimeout                       : 00:03:00
CancelTimeout                     : 00:01:00
IdleTimeout                       : -00:00:00.0010000



PS C:\Users
>                                                        
1 Like

Its working like this, you are right $ sign is necessary.
But I added below code again but didnt worked.

$ $Get-WMIObject -Computer 192.168.2.111 -Query "Select * From Win32_Service WHERE Name Like '%sqlexpress%'"`

result is this

At line:1 char:5
+ $Get-WMIObject -Computer 192.168.2.111 -Query "Select * From Win32_Se ...
+     ~~~~~~~~~~
Unexpected token '-WMIObject' in expression or statement.
At line:1 char:16
+ $Get-WMIObject -Computer 192.168.2.111 -Query "Select * From Win32_Se ...
+                ~~~~~~~~~
Unexpected token '-Computer' in expression or statement.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
PS /home/julian> Get-WMIObject
Get-WMIObject
Get-WMIObject : The term 'Get-WMIObject' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Get-WMIObject
+ ~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (Get-WMIObject:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

As I mentioned, it was possible that this command isn't included in PowerShell Core - and it isn't.

And here it tells me that the WMI commands have been deprecated in PowerShell Core:

"Get-WmiObject have been deprecated in PowerShell Core. Please use CIM cmdlets."

Grrr ... as usual, Microsoft making this much harder than it should be! They recommend using CIM but then don't say how it can be installed!

Drat! Finally got to something more explicit and now it seems that you can't use CIM either under Linux.

So we seem to be back to square 1.

1 Like

So it means we can't use Powershell right ? What is Square 1 option ?

Square 1 was to install a 3rd-party tool on your Windows device(s). Such as Telegraf which can grab the local data and forward it to something useful like MQTT or InluxDB.

There are other alternatives but all are complex. For example:

https://4sysops.com/archives/configure-ssh-based-powershell-core-remoting-between-windows-and-linux/

If it were me, I would use Telegraf as this is free to use and easy to set up.

1 Like

Thank you looking for telegraf immediately

What are you trying to accomplish? If windows is up and if the database is up?

If the database is up, windows is up.
Can you not connect to the database direct from nodered? Or simply test if the port is available (ie responding)

I just want to monitor some windows services, like sql service, time service,,,, etc

You can see below picture an example, I did pin High fake with Strach 2

Untitled

TBH, I would ditch WMI since its a windows only thing.

I would go with what @afelix suggested...

Yes, its all MQTT but that is not something to fear - it is something to embrace. It is very easy to get up and running - far easier than getting WMI on a PI to work.

You will get immediate access to CPU, Memory, network stats, Disk space, processes, boot time etc etc.
FYI: In the processes that library publishes, you will be able to determine that SQL Server (or any other process) is present.

To add to that, if you REALLY want SQL Server operational state (end to end check) then install one of the node-red-contrib MSSQL nodes & perform a simple query like "SELECT GETDATE()" - if it returns a time value, you know its working properly.

2 Likes

That's why I suggested Telegraf. It is a tool that requires only configuration not code and is designed for log and event aggregation across multiple systems.

It is cross-platform (I run it on my Pi's as well as Windows), reasonably light-weight and will post information out to external loggers, InfluxDB, MQTT and others. And free of course :slight_smile:

https://www.influxdata.com/time-series-platform/telegraf/

"Telegraf is the open source server agent to help you collect metrics from your stacks, sensors and systems."

1 Like

@TotallyInformation I only have an awareness of Telegraf (from a 10 min play with influxDB etc)

Can I ask...

  • Is it normal to install/run only Telegraf (stand alone)?
  • Can it publish results to MQTT (without need for Influx or other time-series DB?)
  • On a windows box (for example), can/does it report things like
    • CPU
    • Memory
    • Processes
    • Services state
  • Regarding this particular scenario of monitoring PC/Server states - is there other features that you might call exceptional / must have / unique / major plus etc?

Any leg up or info or sample you might have easily to hand - i'd appreciate info to evaluate telegraf. Much appreciated is so (no worries if not)

Yeah I could look this up but sometimes, its better to ask for info from a real user.

It is perhaps more normally used with InfluxDB but it works fine standalone.

Yes :slight_smile:

In addition to the above, you can also get access to the Windows Performance Counters via the following:

So yes, loads of information is available for Windows.

Of course, trying to ouput all of these to MQTT every second would probably give a rather large overhead but sensible use should be fine.

2 Likes

Here is a quick flow that runs Telegraf manually with a config that outputs to stdout so something very basic and rough.

Note that the output needs some more processing to enable it to be properly parsed by Node-RED because, although I've set the output to JSON, Telegraf seems to fire several outputs at once which the Exec node (in spawn mode) treats as a single message. So the output would need manually splitting on the text {"fields":{ before feeding through a JSON node.

If I'm bored later, I will see if I can get it to output direct to a Node-RED UDP/TCP node.

[{"id":"32e92aa6.b42a56","type":"inject","z":"63281c77.40a064","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":180,"y":560,"wires":[["8f973c9a.6ab93"]]},{"id":"f1835f8f.3c426","type":"debug","z":"63281c77.40a064","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":750,"y":520,"wires":[]},{"id":"8f973c9a.6ab93","type":"exec","z":"63281c77.40a064","command":"C:\\Apps\\DASHBOARDS\\telegraf\\telegraf.exe -config C:\\Apps\\DASHBOARDS\\telegraf\\telegraf.conf","addpay":false,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"Run Telegraf Manually","x":360,"y":560,"wires":[["b14e6574.1ddc58","dc234d3b.dc217"],["25e73eb8.c0ddd2"],["7e23bda9.29b1a4"]]},{"id":"25e73eb8.c0ddd2","type":"debug","z":"63281c77.40a064","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":750,"y":560,"wires":[]},{"id":"7e23bda9.29b1a4","type":"debug","z":"63281c77.40a064","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":750,"y":600,"wires":[]},{"id":"b14e6574.1ddc58","type":"json","z":"63281c77.40a064","name":"","property":"payload","action":"","pretty":false,"x":590,"y":520,"wires":[["f1835f8f.3c426"]]},{"id":"dc234d3b.dc217","type":"debug","z":"63281c77.40a064","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":750,"y":480,"wires":[]}]
# Telegraf Configuration
#
# Telegraf is entirely plugin driven. All metrics are gathered from the
# declared inputs, and sent to the declared outputs.
#
# Plugins must be declared in here to be active.
# To deactivate a plugin, comment out the name and any variables.
#
# Use 'telegraf -config telegraf.conf -test' to see what metrics a config
# file would generate.
#
# Environment variables can be used anywhere in this config file, simply prepend
# them with $. For strings the variable must be within quotes (ie, "$STR_VAR"),
# for numbers and booleans they should be plain (ie, $INT_VAR, $BOOL_VAR)


# Global tags can be specified here in key="value" format.
[global_tags]
  # dc = "us-east-1" # will tag all metrics with dc=us-east-1
  # rack = "1a"
  ## Environment variables can be used as tags, and throughout the config file
  # user = "$USER"


# Configuration for telegraf agent
[agent]
  ## Default data collection interval for all inputs
  interval = "10s"
  ## Rounds collection interval to 'interval'
  ## ie, if interval="10s" then always collect on :00, :10, :20, etc.
  round_interval = true

  ## Telegraf will send metrics to outputs in batches of at most
  ## metric_batch_size metrics.
  ## This controls the size of writes that Telegraf sends to output plugins.
  metric_batch_size = 1000

  ## For failed writes, telegraf will cache metric_buffer_limit metrics for each
  ## output, and will flush this buffer on a successful write. Oldest metrics
  ## are dropped first when this buffer fills.
  ## This buffer only fills when writes fail to output plugin(s).
  metric_buffer_limit = 10000

  ## Collection jitter is used to jitter the collection by a random amount.
  ## Each plugin will sleep for a random time within jitter before collecting.
  ## This can be used to avoid many plugins querying things like sysfs at the
  ## same time, which can have a measurable effect on the system.
  collection_jitter = "1s"

  ## Default flushing interval for all outputs. Maximum flush_interval will be
  ## flush_interval + flush_jitter
  flush_interval = "10s"
  ## Jitter the flush interval by a random amount. This is primarily to avoid
  ## large write spikes for users running a large number of telegraf instances.
  ## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s
  flush_jitter = "0s"

  ## By default or when set to "0s", precision will be set to the same
  ## timestamp order as the collection interval, with the maximum being 1s.
  ##   ie, when interval = "10s", precision will be "1s"
  ##       when interval = "250ms", precision will be "1ms"
  ## Precision will NOT be used for service inputs. It is up to each individual
  ## service input to set the timestamp at the appropriate precision.
  ## Valid time units are "ns", "us" (or "Āµs"), "ms", "s".
  precision = ""

  ## Logging configuration:
  ## Run telegraf with debug log messages.
  debug = false
  ## Run telegraf in quiet mode (error log messages only).
  quiet = false
  ## Specify the log file name. The empty string means to log to stderr.
  logfile = "C:\\Apps\\DASHBOARDS\\telegraf\\telegraf.log"

  ## Override default hostname, if empty use os.Hostname()
  hostname = ""
  ## If set to true, do no set the "host" tag in the telegraf agent.
  omit_hostname = false


###############################################################################
#                                  OUTPUTS                                    #
###############################################################################

# Configuration for sending metrics to InfluxDB
[[outputs.influxdb]]
  ## The full HTTP or UDP URL for your InfluxDB instance.
  ##
  ## Multiple URLs can be specified for a single cluster, only ONE of the
  ## urls will be written to each interval.
  # urls = ["unix:///var/run/influxdb.sock"]
  # urls = ["udp://127.0.0.1:8089"]
  # urls = ["http://127.0.0.1:8086"]

  ## The target database for metrics; will be created as needed.
  # database = "telegraf"

  ## If true, no CREATE DATABASE queries will be sent.  Set to true when using
  ## Telegraf with a user without permissions to create databases or when the
  ## database already exists.
  # skip_database_creation = false

  ## Name of existing retention policy to write to.  Empty string writes to
  ## the default retention policy.  Only takes effect when using HTTP.
  # retention_policy = ""

  ## Write consistency (clusters only), can be: "any", "one", "quorum", "all".
  ## Only takes effect when using HTTP.
  # write_consistency = "any"

  ## Timeout for HTTP messages.
  # timeout = "5s"

  ## HTTP Basic Auth
  # username = "telegraf"
  # password = "metricsmetricsmetricsmetrics"

  ## HTTP User-Agent
  # user_agent = "telegraf"

  ## UDP payload size is the maximum packet size to send.
  # udp_payload = "512B"

  ## Optional TLS Config for use on HTTP connections.
  # tls_ca = "/etc/telegraf/ca.pem"
  # tls_cert = "/etc/telegraf/cert.pem"
  # tls_key = "/etc/telegraf/key.pem"
  ## Use TLS but skip chain & host verification
  # insecure_skip_verify = false

  ## HTTP Proxy override, if unset values the standard proxy environment
  ## variables are consulted to determine which proxy, if any, should be used.
  # http_proxy = "http://corporate.proxy:3128"

  ## Additional HTTP headers
  # http_headers = {"X-Special-Header" = "Special-Value"}

  ## HTTP Content-Encoding for write request body, can be set to "gzip" to
  ## compress body or "identity" to apply no encoding.
  # content_encoding = "identity"

  ## When true, Telegraf will output unsigned integers as unsigned values,
  ## i.e.: "42u".  You will need a version of InfluxDB supporting unsigned
  ## integer values.  Enabling this option will result in field type errors if
  ## existing data has been written.
  # influx_uint_support = false

[[outputs.file]]
  ## Files to write to, "stdout" is a specially handled file.
  files = ["stdout"]

  ## The file will be rotated after the time interval specified.  When set
  ## to 0 no time based rotation is performed.
  # rotation_interval = "0h"

  ## The logfile will be rotated when it becomes larger than the specified
  ## size.  When set to 0 no size based rotation is performed.
  # rotation_max_size = "0MB"

  ## Maximum number of rotated archives to keep, any older logs are deleted.
  ## If set to -1, no archives are removed.
  # rotation_max_archives = 5

  ## Data format to output.
  ## Each data format has its own unique set of configuration options, read
  ## more about them here:
  ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md
  data_format = "json"

###############################################################################
#                                  INPUTS                                     #
###############################################################################

# Windows Performance Counters plugin.
# These are the recommended method of monitoring system metrics on windows,
# as the regular system plugins (inputs.cpu, inputs.mem, etc.) rely on WMI,
# which utilize more system resources.
#
# See more configuration examples at:
#   https://github.com/influxdata/telegraf/tree/master/plugins/inputs/win_perf_counters

[[inputs.win_perf_counters]]
  [[inputs.win_perf_counters.object]]
    # Processor usage, alternative to native, reports on a per core.
    ObjectName = "Processor"
    Instances = ["*"]
    Counters = [
      "% Idle Time",
      "% Interrupt Time",
      "% Privileged Time",
      "% User Time",
      "% Processor Time",
      "% DPC Time",
    ]
    Measurement = "win_cpu"
    # Set to true to include _Total instance when querying for all (*).
    IncludeTotal=true

  [[inputs.win_perf_counters.object]]
    # Disk times and queues
    ObjectName = "LogicalDisk"
    Instances = ["*"]
    Counters = [
      "% Idle Time",
      "% Disk Time",
      "% Disk Read Time",
      "% Disk Write Time",
      "Current Disk Queue Length",
      "% Free Space",
      "Free Megabytes",
    ]
    Measurement = "win_disk"
    # Set to true to include _Total instance when querying for all (*).
    #IncludeTotal=false

  [[inputs.win_perf_counters.object]]
    ObjectName = "PhysicalDisk"
    Instances = ["*"]
    Counters = [
      "Disk Read Bytes/sec",
      "Disk Write Bytes/sec",
      "Current Disk Queue Length",
      "Disk Reads/sec",
      "Disk Writes/sec",
      "% Disk Time",
      "% Disk Read Time",
      "% Disk Write Time",
    ]
    Measurement = "win_diskio"

  [[inputs.win_perf_counters.object]]
    ObjectName = "Network Interface"
    Instances = ["*"]
    Counters = [
      "Bytes Received/sec",
      "Bytes Sent/sec",
      "Packets Received/sec",
      "Packets Sent/sec",
      "Packets Received Discarded",
      "Packets Outbound Discarded",
      "Packets Received Errors",
      "Packets Outbound Errors",
    ]
    Measurement = "win_net"

  [[inputs.win_perf_counters.object]]
    ObjectName = "System"
    Counters = [
      "Context Switches/sec",
      "System Calls/sec",
      "Processor Queue Length",
      "System Up Time",
    ]
    Instances = ["------"]
    Measurement = "win_system"
    # Set to true to include _Total instance when querying for all (*).
    #IncludeTotal=false

  [[inputs.win_perf_counters.object]]
    # Example query where the Instance portion must be removed to get data back,
    # such as from the Memory object.
    ObjectName = "Memory"
    Counters = [
      "Available Bytes",
      "Cache Faults/sec",
      "Demand Zero Faults/sec",
      "Page Faults/sec",
      "Pages/sec",
      "Transition Faults/sec",
      "Pool Nonpaged Bytes",
      "Pool Paged Bytes",
      "Standby Cache Reserve Bytes",
      "Standby Cache Normal Priority Bytes",
      "Standby Cache Core Bytes",

    ]
    # Use 6 x - to remove the Instance bit from the query.
    Instances = ["------"]
    Measurement = "win_mem"
    # Set to true to include _Total instance when querying for all (*).
    #IncludeTotal=false

  [[inputs.win_perf_counters.object]]
    # Example query where the Instance portion must be removed to get data back,
    # such as from the Paging File object.
    ObjectName = "Paging File"
    Counters = [
      "% Usage",
    ]
    Instances = ["_Total"]
    Measurement = "win_swap"


# Windows system plugins using WMI (disabled by default, using
# win_perf_counters over WMI is recommended)


# # Read metrics about cpu usage
# [[inputs.cpu]]
#   ## Whether to report per-cpu stats or not
#   percpu = true
#   ## Whether to report total system cpu stats or not
#   totalcpu = true
#   ## If true, collect raw CPU time metrics.
#   collect_cpu_time = false
#   ## If true, compute and report the sum of all non-idle CPU states.
#   report_active = false


# # Read metrics about disk usage by mount point
# [[inputs.disk]]
#   ## By default stats will be gathered for all mount points.
#   ## Set mount_points will restrict the stats to only the specified mount points.
#   # mount_points = ["/"]
#
#   ## Ignore mount points by filesystem type.
#   ignore_fs = ["tmpfs", "devtmpfs", "devfs", "overlay", "aufs", "squashfs"]


# # Read metrics about disk IO by device
# [[inputs.diskio]]
#   ## By default, telegraf will gather stats for all devices including
#   ## disk partitions.
#   ## Setting devices will restrict the stats to the specified devices.
#   # devices = ["sda", "sdb", "vd*"]
#   ## Uncomment the following line if you need disk serial numbers.
#   # skip_serial_number = false
#   #
#   ## On systems which support it, device metadata can be added in the form of
#   ## tags.
#   ## Currently only Linux is supported via udev properties. You can view
#   ## available properties for a device by running:
#   ## 'udevadm info -q property -n /dev/sda'
#   # device_tags = ["ID_FS_TYPE", "ID_FS_USAGE"]
#   #
#   ## Using the same metadata source as device_tags, you can also customize the
#   ## name of the device via templates.
#   ## The 'name_templates' parameter is a list of templates to try and apply to
#   ## the device. The template may contain variables in the form of '$PROPERTY' or
#   ## '${PROPERTY}'. The first template which does not contain any variables not
#   ## present for the device is used as the device name tag.
#   ## The typical use case is for LVM volumes, to get the VG/LV name instead of
#   ## the near-meaningless DM-0 name.
#   # name_templates = ["$ID_FS_LABEL","$DM_VG_NAME/$DM_LV_NAME"]


# # Read metrics about memory usage
# [[inputs.mem]]
#   # no configuration


# # Read metrics about swap memory usage
# [[inputs.swap]]
#   # no configuration

You would normally run Telegraf as a service of course which you can easily do on Windows as well as Linux and Mac. As a service, you wouldn't output to stdout.

1 Like

A repository starting with installation through Ansible already has me smiling. Surely going to check it out to improve my server monitoring situation. Thanks for the suggestion here, reading through their plugin system I think itā€™s better suited than my earlier linked idea. And outputting to MQTT is only an extra plus for me :slight_smile:

2 Likes

It is rough and ready but a LOT cheaper than trying to wrangle Splunk.

1 Like

Even easier.

install (on the window machine):

python
python pip
glances

Run glances as glances -w which starts it as webserver

From node red you can make a request to http://<server-ip>:61208/api/3 and using the documentation you can retrieve all system info.

Updated flow (boring day at work for a change!):

[{"id":"32e92aa6.b42a56","type":"inject","z":"63281c77.40a064","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":180,"y":560,"wires":[["8f973c9a.6ab93"]]},{"id":"8f973c9a.6ab93","type":"exec","z":"63281c77.40a064","command":"C:\\Apps\\DASHBOARDS\\telegraf\\telegraf.exe -config C:\\Apps\\DASHBOARDS\\telegraf\\telegraf-nrmanual-stdout.conf","addpay":false,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"Run Telegraf Manually","x":360,"y":560,"wires":[["2a23a3a9.b2db6c"],["25e73eb8.c0ddd2"],["7e23bda9.29b1a4"]]},{"id":"25e73eb8.c0ddd2","type":"debug","z":"63281c77.40a064","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":750,"y":560,"wires":[]},{"id":"7e23bda9.29b1a4","type":"debug","z":"63281c77.40a064","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":750,"y":600,"wires":[]},{"id":"dc234d3b.dc217","type":"debug","z":"63281c77.40a064","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":750,"y":520,"wires":[]},{"id":"2a23a3a9.b2db6c","type":"function","z":"63281c77.40a064","name":"","func":"msg.payload = msg.payload.split('{\"fields\":{')\n\nmsg.payload.forEach((v,i) => {\n    if (v === '') return\n    v = '{\"fields\":{' + v\n    let pay = '', topic = msg.topic\n    try {\n        pay = JSON.parse(v.trim())\n        topic = pay.name\n    } catch(e) {\n        pay = msg.payload \n    }\n    node.send({'topic':topic,'payload':pay})\n})\n","outputs":1,"noerr":0,"x":580,"y":520,"wires":[["dc234d3b.dc217"]]},{"id":"1f8d207e.d644b","type":"udp in","z":"63281c77.40a064","name":"","iface":"","port":"8094","ipv":"udp4","multicast":"false","group":"","datatype":"utf8","x":180,"y":640,"wires":[["f451a5f1.aff128"]]},{"id":"81e6e26d.46a7f","type":"debug","z":"63281c77.40a064","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":470,"y":640,"wires":[]},{"id":"f451a5f1.aff128","type":"json","z":"63281c77.40a064","name":"","property":"payload","action":"","pretty":false,"x":320,"y":640,"wires":[["81e6e26d.46a7f"]]}]

Not only is the data now correctly parsed BUT :trumpet: ... The config has been changed so that you can pick up the output via a UDP connection straight into Node-RED.

# Use 'telegraf -config telegraf.conf -test' to see what metrics a config
# file would generate.
#
# Environment variables can be used anywhere in this config file, simply prepend
# them with $. For strings the variable must be within quotes (ie, "$STR_VAR"),
# for numbers and booleans they should be plain (ie, $INT_VAR, $BOOL_VAR)


# Global tags can be specified here in key="value" format.
[global_tags]
  # dc = "us-east-1" # will tag all metrics with dc=us-east-1
  # rack = "1a"
  ## Environment variables can be used as tags, and throughout the config file
  # user = "$USER"


# Configuration for telegraf agent
[agent]
  ## Default data collection interval for all inputs
  interval = "10s"
  ## Rounds collection interval to 'interval'
  ## ie, if interval="10s" then always collect on :00, :10, :20, etc.
  round_interval = true

  ## Telegraf will send metrics to outputs in batches of at most
  ## metric_batch_size metrics.
  ## This controls the size of writes that Telegraf sends to output plugins.
  metric_batch_size = 1000

  ## For failed writes, telegraf will cache metric_buffer_limit metrics for each
  ## output, and will flush this buffer on a successful write. Oldest metrics
  ## are dropped first when this buffer fills.
  ## This buffer only fills when writes fail to output plugin(s).
  metric_buffer_limit = 10000

  ## Collection jitter is used to jitter the collection by a random amount.
  ## Each plugin will sleep for a random time within jitter before collecting.
  ## This can be used to avoid many plugins querying things like sysfs at the
  ## same time, which can have a measurable effect on the system.
  collection_jitter = "1s"

  ## Default flushing interval for all outputs. Maximum flush_interval will be
  ## flush_interval + flush_jitter
  flush_interval = "10s"
  ## Jitter the flush interval by a random amount. This is primarily to avoid
  ## large write spikes for users running a large number of telegraf instances.
  ## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s
  flush_jitter = "0s"

  ## By default or when set to "0s", precision will be set to the same
  ## timestamp order as the collection interval, with the maximum being 1s.
  ##   ie, when interval = "10s", precision will be "1s"
  ##       when interval = "250ms", precision will be "1ms"
  ## Precision will NOT be used for service inputs. It is up to each individual
  ## service input to set the timestamp at the appropriate precision.
  ## Valid time units are "ns", "us" (or "Āµs"), "ms", "s".
  precision = ""

  ## Logging configuration:
  ## Run telegraf with debug log messages.
  debug = false
  ## Run telegraf in quiet mode (error log messages only).
  quiet = true
  ## Specify the log file name. The empty string means to log to stderr.
  #logfile = "C:\\Apps\\DASHBOARDS\\telegraf\\telegraf.log"
  logfile = ""

  ## Override default hostname, if empty use os.Hostname()
  hostname = ""
  ## If set to true, do no set the "host" tag in the telegraf agent.
  omit_hostname = true


###############################################################################
#                                  OUTPUTS                                    #
###############################################################################

[[outputs.file]]
  ## Files to write to, "stdout" is a specially handled file.
  files = ["stdout"]

  ## Data format to output.
  ## Each data format has its own unique set of configuration options, read
  ## more about them here:
  ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md
  data_format = "json"
  
[[outputs.socket_writer]]
  address = "udp4://127.0.0.1:8094"
  data_format = "json"

###############################################################################
#                                  INPUTS                                     #
###############################################################################

[[inputs.win_perf_counters]]
  [[inputs.win_perf_counters.object]]
    # Processor usage, alternative to native, reports on a per core.
    ObjectName = "Processor"
    # Only show the total CPU rather than each processor
    Instances = ["_Total"]
    Counters = ["% Idle Time", "% Interrupt Time", "% Privileged Time", "% User Time", "% Processor Time"]
    Measurement = "win_cpu"
    #IncludeTotal=false #Set to true to include _Total instance when querying for all (*).


#########################################
# THESE REQUIRE ADMIN ACCESS ON WINDOWS #
#########################################

# [[inputs.temp]]

# Requires Admin
#[[inputs.win_services]]
  ## Names of the services to monitor. Leave empty to monitor all the available services on the host
#  service_names = [
#    "Adguard Service",
#    "Grafana",
#	"ssh-agent",
#	"telegraf",
#	"Sense",
#	"WdNisSvc",
#	"WinDefend",
#	"mpssvc"
#  ]

  # "Sense", # Defender Adv Threat Protection
  #	"WdNisSvc", # Defender AV Network Inspector
  # "mpssvc" # Defender Firewall

Note the comments on some measurements requiring admin permissions. Running as a service should resolve that issue.

Not on this machine it isn't easier. :frowning:

Pip is refusing to play & the manual install failed.

Also glances, while good (I use it sometimes):

  1. You still need to configure it if you want output to anything other than the terminal.
  2. It is very heavy on resources - Telegraf is written in Go which is very light on resources.
  3. It doesn't have any Windows-friendly service installation instructions.
  4. It relies on a working version of Python.