Coder Social home page Coder Social logo

matthodge / graphite-powershell-functions Goto Github PK

View Code? Open in Web Editor NEW
218.0 40.0 72.0 199 KB

A group of PowerShell functions that allow you to send Windows Performance counters to a Graphite Server, all configurable from a simple XML file.

Home Page: https://hodgkins.io/using-powershell-to-send-metrics-graphite

License: GNU General Public License v3.0

PowerShell 100.00%

graphite-powershell-functions's Introduction

Notice (30th July, 2016)

I am no longer maintaining this project as there is a far better tool to do this now called Telagraf, which supports sending to InfluxDB and Graphite.

You can a blog post on how to set it up here: https://hodgkins.io/windows-metric-dashboards-with-influxdb-and-grafana

Graphite PowerShell Functions

A group of PowerShell functions that allow you to send Windows Performance counters to a Graphite Server, all configurable from a simple XML file.

GitHub Version

More details at http://www.hodgkins.net.au/mswindows/using-powershell-to-send-metrics-graphite/

Features

  • Sends Metrics to Graphite's Carbon daemon using TCP or UDP
  • Can collect Windows Performance Counters
  • Can collect values by using T-SQL queries against MS SQL databases
  • Converts time to UTC on sending
  • All configuration can be done from a simple XML file
  • Allows you to override the hostname in Windows Performance Counters before sending on to Graphite
  • Allows renaming of metric names using regex via the configuration file
  • Reloads the XML configuration file automatically. For example, if more counters are added to the configuration file, the script will notice and start sending metrics for them to Graphite in the next send interval
  • Additional functions are exposed that allow you to send data to Graphite from PowerShell easily. Here is the list of included functions
  • Script can be installed to run as a service
  • Installable by Chef Cookbook which is available here
  • Installable by Puppet which is available here
  • Supports Hosted Graphite (https://www.hostedgraphite.com)

Installation

  1. Download the repository and place into a PowerShell Modules directory called Graphite-Powershell. The module directories can be found by running $env:PSModulePath in PowerShell. For example, C:\Program Files\WindowsPowerShell\Modules\Graphite-PowerShell
  2. Verify your folder structure looks like this, with the .psd1 and .psm1 files inside the Graphite-Powershell folder:

alt text 3. Make sure the files are un-blocked by right clicking on them and going to properties. 4. Modify the StatsToGraphiteConfig.xml configuration file. Instructions here. 5. Open PowerShell and ensure you set your Execution Policy to allow scripts be run. For example Set-ExecutionPolicy RemoteSigned.

Modifying the Configuration File

The configuration file is fairly self-explanatory, but here is a description for each of the values.

Graphite Configuration Section

Configuration Name Description
CarbonServer The server name where Carbon is running. The Carbon daemon is usually running on the Graphite server.
CarbonServerPort The port number for Carbon. Its default port number is 2003.
MetricPath The path of the metric you want to be sent to the server. If you are using HostedGraphite, put your API key before the rest of the metric path, for example YOUR-API-KEY.datacenter1.servers.
NodeHostName This allows you to override the hostname of the server before sending the metrics on to Graphite. Default is use $env:COMPUTERNAME, which will use the local computer name.
MetricSendIntervalSeconds The interval to send metrics to Carbon; I recommend 5 seconds or greater. The more metrics you are collecting the longer it takes to send them to the Graphite server. You can see how long it takes to send the metrics each time the loop runs by using running the Start-StatsToGraphite function and having VerboseOutput set to True.
SendUsingUDP Sends metrics via UDP instead of TCP.

Performance Counters Configuration Section

This section lists the performance counters you want the machine to send to Graphite. You can get these from Performance Monitor (perfmon.exe) or by using the command typeperf -qx in a command prompt.

I have included some basic performance counters in the configuration file. Asterisks can be used as a wildcard.

Here are some other examples:

  • <Counter Name="\Web Service(YourIISWebSite)\Total Bytes Received"/>
  • <Counter Name="\Web Service(YourIISWebSite)\Total Bytes Sent"/>
  • <Counter Name="\ASP.NET Apps v4.0.30319(_lm_w3svc_1_Root_YourIISApp)\Request Wait Time"/>
  • <Counter Name="\PhysicalDisk(*)\Avg. Disk Write Queue Length"/>

MetricReplace Configuration Section

This section lists regex find and replace rules used to clean up the Windows performance counters before sending them on to Graphite. Most people will be able to leave this section alone as it configured using sensible defaults.

The script processes these in the order they appear in the configuration file. Order is important!

There are two methods for replacing metrics with custom names:

  1. Replace with custom value. This does a regex search on This, and replaces it with the value in With. For example: <MetricReplace This="\#" With="num"/> This would find the # symbol and replace it with the text num
  2. Replace with RegEx capture group. This does a regex search on This, and then replaces it with the value in With. It then uses the RegEx capture that was found and substities it for #{CAPTUREGROUP}. This this will only work for the first capture. For example: <MetricReplace This="physicaldisk\(.* (.*)\:\)" With="physicaldisk.#{CAPTUREGROUP}-drive"/> This would capture the drive letter of the phyiscal disk, and replace the whole string with physicaldisk.DriverLetter-drive.

If you want to use the regex capture replace, I recommend doing this first, as it's easier to capture these sections before the metrics get cleaned.

Filtering Configuration Section

This section lists names you want to filter out of the Performance Counter list. Filtering is useful when you want to use a wildcard in the performance counter, but want to exclude some of the returned counters. I have included isatap and teredo tunneling by default to filter out IPv6 interfaces. Remove all tags if you want no filtering.

MSSQLMetics Configuration Section

This section allows you to configure the additional settings that will be used when running the Start-SQLStatsToGraphite command.

Configuration Name Description
MetricPath The path of the SQL metric you want to be sent to the server
MetricSendIntervalSeconds The interval to send SQL metrics to Carbon. I recommend 5 seconds or greater. The more queries you are running the longer it takes to send them to the Graphite server. You can see how long it takes to send the metrics each time the loop runs by using running the Start-SQLStatsToGraphite -Verbose -TestMode.
SQLConnectionTimeoutSeconds The time out period when attempting to connect to the SQL Server.
SQLQueryTimeoutSeconds The time out period when waiting for a SQL query to return.

The next section allows you to configure a list of SQL servers and the queries that will be run against those servers. You can add as many queries or servers as required. The only constraint is that they all need to be able to run within the time given by the MetricSendIntervalSeconds configuration value.

<SQLServer> Configuration Values Description
ServerInstance The hostname or Server Instance of the SQL server you want to connect to. SQL servers with instances can also be used.
Username The username to connect to SQL with using SQL Authentication. Leaving this and the Password option blank will make the script use Windows Authentication against the SQL Server. The current credentials that the PowerShell window are running under will be used.
Password The password to connect to SQL with using SQL Authentication. Leaving this and the Username option blank will make the script use Windows Authentication against the SQL Server. The current credentials that the PowerShell window are running under will be used.

The next part of the configuration allows you to add a list of the T-SQL queries that will be run against the SQL server.

<Query> Configuration Values Description
Database The database that the SQL query will be run against.
MetricName The Graphite metric name to use for this SQL query.
TSQL The T-SQL query to run against the SQL Server. If you need to use characters such as < or > in your query, you will need to replace them with the appropriate XML entity reference. For example, > would be replaced with &gt;. A full list of these can be found on MSDN.

There are a few important things to keep in mind when using this feature.

  • If you provide the SQL Username and Password options, they is stored in plain text in the configuration file. If you do not provide a username and password, the windows account that the PowerShell window is running under will be used against the SQL Server. This is a good way to protect the credentials.
  • There is no verification that the SQL command in the configuration file is not destructive. Be sure to use a low privilege account to authenticate against SQL so that any malicious T-SQL queries don't destroy your data.
  • If your T-SQL query returns multiple results, only the first one will be sent over to Graphite.

Logging Configuration Section

This section allows you to turn on or off Verbose output. This is useful when testing but is better left off when running as a service as you won't be able to see the output.

Configuration Name Description
VerboseOutput Will provide each of the metrics that were sent over to Carbon and the total execution time of the loop.

Usage - Windows Performance Counters

The following shows how to use the Start-StatsToGraphite, which will collect Windows performance counters and send them to Graphite.

  1. Open PowerShell
  2. Import the Module by running Import-Module -Name Graphite-PowerShell
  3. Start the script by using the function Start-StatsToGraphite. If you want Verbose details, use Start-StatsToGraphite -Verbose.

You may need to run the PowerShell instance with Administrative rights depending on the performance counters you want to access. This is due to the scripts use of the Get-Counter CmdLet.

From the Get-Counter help page on TechNet:

Performance counters are often protected by access control lists (ACLs). To get all available performance counters, open Windows PowerShell with the "Run as administrator" option.

The below image is what Start-StatsToGraphite like with VerboseOutput turned on in the XML configuration file looks like.

alt text

That is all there is to getting your Windows performance counters into Graphite.

Usage - SQL Query Results

The following shows how to use the Start-SQLStatsToGraphite, which will execute any SQL queries listed in the configuration file and send the result (which needs to be an integer) to Graphite.

  1. Open PowerShell
  2. Import the Module by running Import-Module -Name Graphite-PowerShell
  3. Start the script by using the function Start-SQLStatsToGraphite. If you want Verbose detailed use Start-SQLStatsToGraphite -Verbose. If you want to see what would be sent to Graphite, without actually sending the metrics, use Start-SQLStatsToGraphite -Verbose -TestMode

The below image is what Start-SQLStatsToGraphite like with VerboseOutput turned on in the XML configuration file looks like.

alt text

This function requires the Microsoft SQL PowerShell Modules/SnapIns. The easiest way to get these is to download them from the SQL 2012 R2 SP1 Feature Pack. You will need to grab the following:

  • Microsoft® SQL Server® 2012 Shared Management Object
  • Microsoft® System CLR Types for Microsoft® SQL Server® 2012
  • Microsoft® Windows PowerShell Extensions for Microsoft® SQL Server® 2012

Installing as a Service

Once you have edited the configuration file and verified everything is functioning correctly by running either Start-StatsToGraphite or Start-SQLStatsToGraphite in an interactive PowerShell session, you might want to install one or both of these scripts as a service.

The easiest way to achieve this is using NSSM - the Non-Sucking Service Manager.

  1. Download nssm from nssm.cc
  2. Open up an Administrative command prompt and run nssm install GraphitePowerShell. (You can call the service whatever you want).
  3. A dialog will pop up allowing you to enter in settings for the new service. The following two tables below contains the settings to use.

alt text

  1. Click Install Service
  2. Make sure the service is started and it is set to Automatic
  3. Check your Graphite server and make sure the metrics are coming in

The below configurations will show how to run either Start-StatsToGraphite or Start-SQLStatsToGraphite as a service. If you want to run both on the same server, you will need to create two seperate services, one for each script.

Running Start-StatsToGraphite as a Service

The following configuration can be used to run Start-StatsToGraphite as a service.

Setting Name Value
Path C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Startup Directory Leave Blank
Options -command "& { Import-Module -Name Graphite-PowerShell ; Start-StatsToGraphite }"

Running Start-SQLStatsToGraphite as a Service

The following configuration can be used to run Start-SQLStatsToGraphite as a service.

Setting Name Value
Path C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Startup Directory Leave Blank
Options -command "& { Import-Module -Name Graphite-PowerShell ; Start-SQLStatsToGraphite }"

If you want to remove a service, read the NSSM documentation http://nssm.cc/commands for instructions.

Installing as a Service Using PowerShell

  1. Download nssm from nssm.cc and save it into a directory
  2. Open an Administrative PowerShell consolen and browse to the directory you saved NSSM
  3. Run Start-Process -FilePath .\nssm.exe -ArgumentList 'install GraphitePowerShell "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-command "& { Import-Module -Name Graphite-PowerShell ; Start-StatsToGraphite }"" ' -NoNewWindow -Wait
  4. Check the service installed successfully Get-Service -Name GraphitePowerShell
  5. Start the service Start-Service -Name GraphitePowerShell

There are several functions that are exposed by the module which are available to use in an ad-hoc manner.

For a list of functions in the module, run Get-Command -Module Graphite-PowerShell. For full help for these functions run Get-Help | <Function Name>

Function Name Description
ConvertTo-GraphiteMetric Takes the Windows Performance counter name and coverts it to something that Graphite can use.
Send-BulkGraphiteMetrics Sends several Graphite Metrics to a Carbon server with one request. Bulk requests save a lot of resources for Graphite server.
Send-GraphiteEvent Sends an event to Graphite using the Graphite Event API. More information about the events API can be found in this blog post.
Send-GraphiteMetric Allows you to send metrics to Graphite in an ad-hoc manner.
Start-SQLStatsToGraphite The function to query SQL. This is an endless loop which will send metrics to Graphite.
Start-StatsToGraphite The function to collect Windows Performance Counters. This is an endless loop which will send metrics to Graphite.

graphite-powershell-functions's People

Contributors

beevee avatar daks avatar ghostsquad avatar matthodge avatar tas50 avatar wyrdvans 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  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

graphite-powershell-functions's Issues

PowerShell error

Absolute PoweShell noob here and this is probably to wrong place to ask but, when trying to execute . .\Graphite-PowerShell.ps1 I receive the following error:

The '<' operator is reserved for future use.
At C:\graphite\Graphite-PowerShell.ps1:120 char:19
+           </div> < <<<< !-- /.select-menu-item -->
+ CategoryInfo          : ParserError: (<:Operato
+ FullyQualifiedErrorId : RedirectionNotSupported
  • I've made sure to Set-ExecutionPolicy RemoteSigned
  • and tried Set-ExecutionPolicy Unrestricted
  • I've tried to Google around for PowerShell advice and failed.
  • I dug through the .ps1 file and see numerous < so I figure my powershell isn't configured correctly.
  • Launched PowerShell as Administrator
  • I even tried it in the PowerShell ISE thingy

Is there anything you can advise ?

Thanks in advance!

perf-counters

Thanks to Matt for this nice PowerShell-Script and his documentation.
One note: "typeperf -qx" is perhaps an easier way to get the perf-counter.
(I used that for Zabbix some time ago)
Kind regards
Ulrich

Error : Cannot Process argument transformation on parameter 'DateTime'

Hi,

I tried to push the Windows Metric to Graphite. But its failed. I followed same steps as described in this installation guide.

Tried to connect from Windows Server 2008 R2 to Graphite server. When I run Start-StatsToGraphite , I getting error as like in the attached file.

Note : I used the same Graphite-PowerShell.ps1 file

And from this link, i get the xml file. "http://www.hodgkins.net.au/category/powershell/ "

Kindly help to fix this issue

error

No UTC timezone?

I'm unable to run Convert-TimeZone -DateTime (Get-Date) -ToTimeZone UTC like I see I should in

Convert-TimeZone -DateTime (Get-Date) -ToTimeZone UTC
.

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS E:\test> . .\Graphite-PowerShell.ps1
PS E:\test> Convert-TimeZone -DateTime (Get-Date) -ToTimeZone UTC
Exception calling "ConvertTime" with "2" argument(s): "Value cannot be null.
Parameter name: destinationTimeZone"
At E:\test\Graphite-PowerShell.ps1:930 char:61
+         $TargetZoneTime = [System.TimeZoneInfo]::ConvertTime <<<< ($DateTime,
 $TimeZoneObject)
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException


LocalTimeZone       LocalTime           TargetTime          TargetTimeZone
-------------       ---------           ----------          --------------
Eastern Standard... 2014-09-11 09:42:40


PS E:\test>
PS E:\test> Convert-TimeZone -ListTimeZones

Id                         : Greenwich Standard Time
DisplayName                : (GMT) Casablanca, Monrovia, Reykjavik
StandardName               : Greenwich Standard Time
DaylightName               : Greenwich Daylight Time
BaseUtcOffset              : 00:00:00
SupportsDaylightSavingTime : False

Id                         : GMT Standard Time
DisplayName                : (GMT) Greenwich Mean Time : Dublin, Edinburgh, Lis
                             bon, London
StandardName               : GMT Standard Time
DaylightName               : GMT Daylight Time
BaseUtcOffset              : 00:00:00
SupportsDaylightSavingTime : True

Id                         : W. Europe Standard Time
DisplayName                : (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockho
                             lm, Vienna
StandardName               : W. Europe Standard Time
DaylightName               : W. Europe Daylight Time
BaseUtcOffset              : 01:00:00
SupportsDaylightSavingTime : True

Id                         : Central Europe Standard Time
DisplayName                : (GMT+01:00) Belgrade, Bratislava, Budapest, Ljublj
                             ana, Prague
StandardName               : Central Europe Standard Time
DaylightName               : Central Europe Daylight Time
BaseUtcOffset              : 01:00:00
SupportsDaylightSavingTime : True

Id                         : Romance Standard Time
DisplayName                : (GMT+01:00) Brussels, Copenhagen, Madrid, Paris
StandardName               : Romance Standard Time
DaylightName               : Romance Daylight Time
BaseUtcOffset              : 01:00:00
SupportsDaylightSavingTime : True

Id                         : Central European Standard Time
DisplayName                : (GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb
StandardName               : Central European Standard Time
DaylightName               : Central European Daylight Time
BaseUtcOffset              : 01:00:00
SupportsDaylightSavingTime : True

Id                         : W. Central Africa Standard Time
DisplayName                : (GMT+01:00) West Central Africa
StandardName               : W. Central Africa Standard Time
DaylightName               : W. Central Africa Daylight Time
BaseUtcOffset              : 01:00:00
SupportsDaylightSavingTime : False

Id                         : Jordan Standard Time
DisplayName                : (GMT+02:00) Amman
StandardName               : Jordan Standard Time
DaylightName               : Jordan Daylight Time
BaseUtcOffset              : 02:00:00
SupportsDaylightSavingTime : True

Id                         : GTB Standard Time
DisplayName                : (GMT+02:00) Athens, Bucharest, Istanbul
StandardName               : GTB Standard Time
DaylightName               : GTB Daylight Time
BaseUtcOffset              : 02:00:00
SupportsDaylightSavingTime : True

Id                         : Middle East Standard Time
DisplayName                : (GMT+02:00) Beirut
StandardName               : Middle East Standard Time
DaylightName               : Middle East Daylight Time
BaseUtcOffset              : 02:00:00
SupportsDaylightSavingTime : True

Id                         : Egypt Standard Time
DisplayName                : (GMT+02:00) Cairo
StandardName               : Egypt Standard Time
DaylightName               : Egypt Daylight Time
BaseUtcOffset              : 02:00:00
SupportsDaylightSavingTime : True

Id                         : South Africa Standard Time
DisplayName                : (GMT+02:00) Harare, Pretoria
StandardName               : South Africa Standard Time
DaylightName               : South Africa Daylight Time
BaseUtcOffset              : 02:00:00
SupportsDaylightSavingTime : False

Id                         : FLE Standard Time
DisplayName                : (GMT+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, 
                             Vilnius
StandardName               : FLE Standard Time
DaylightName               : FLE Daylight Time
BaseUtcOffset              : 02:00:00
SupportsDaylightSavingTime : True

Id                         : Israel Standard Time
DisplayName                : (GMT+02:00) Jerusalem
StandardName               : Jerusalem Standard Time
DaylightName               : Jerusalem Daylight Time
BaseUtcOffset              : 02:00:00
SupportsDaylightSavingTime : True

Id                         : E. Europe Standard Time
DisplayName                : (GMT+02:00) Minsk
StandardName               : E. Europe Standard Time
DaylightName               : E. Europe Daylight Time
BaseUtcOffset              : 02:00:00
SupportsDaylightSavingTime : True

Id                         : Namibia Standard Time
DisplayName                : (GMT+02:00) Windhoek
StandardName               : Namibia Standard Time
DaylightName               : Namibia Daylight Time
BaseUtcOffset              : 02:00:00
SupportsDaylightSavingTime : True

Id                         : Arabic Standard Time
DisplayName                : (GMT+03:00) Baghdad
StandardName               : Arabic Standard Time
DaylightName               : Arabic Daylight Time
BaseUtcOffset              : 03:00:00
SupportsDaylightSavingTime : True

Id                         : Arab Standard Time
DisplayName                : (GMT+03:00) Kuwait, Riyadh
StandardName               : Arab Standard Time
DaylightName               : Arab Daylight Time
BaseUtcOffset              : 03:00:00
SupportsDaylightSavingTime : False

Id                         : Russian Standard Time
DisplayName                : (GMT+03:00) Moscow, St. Petersburg, Volgograd
StandardName               : Russian Standard Time
DaylightName               : Russian Daylight Time
BaseUtcOffset              : 03:00:00
SupportsDaylightSavingTime : True

Id                         : E. Africa Standard Time
DisplayName                : (GMT+03:00) Nairobi
StandardName               : E. Africa Standard Time
DaylightName               : E. Africa Daylight Time
BaseUtcOffset              : 03:00:00
SupportsDaylightSavingTime : False

Id                         : Georgian Standard Time
DisplayName                : (GMT+03:00) Tbilisi
StandardName               : Georgian Standard Time
DaylightName               : Georgian Daylight Time
BaseUtcOffset              : 03:00:00
SupportsDaylightSavingTime : False

Id                         : Iran Standard Time
DisplayName                : (GMT+03:30) Tehran
StandardName               : Iran Standard Time
DaylightName               : Iran Daylight Time
BaseUtcOffset              : 03:30:00
SupportsDaylightSavingTime : True

Id                         : Arabian Standard Time
DisplayName                : (GMT+04:00) Abu Dhabi, Muscat
StandardName               : Arabian Standard Time
DaylightName               : Arabian Daylight Time
BaseUtcOffset              : 04:00:00
SupportsDaylightSavingTime : False

Id                         : Azerbaijan Standard Time
DisplayName                : (GMT+04:00) Baku
StandardName               : Azerbaijan Standard Time
DaylightName               : Azerbaijan Daylight Time
BaseUtcOffset              : 04:00:00
SupportsDaylightSavingTime : True

Id                         : Caucasus Standard Time
DisplayName                : (GMT+04:00) Yerevan
StandardName               : Caucasus Standard Time
DaylightName               : Caucasus Daylight Time
BaseUtcOffset              : 04:00:00
SupportsDaylightSavingTime : True

Id                         : Afghanistan Standard Time
DisplayName                : (GMT+04:30) Kabul
StandardName               : Afghanistan Standard Time
DaylightName               : Afghanistan Daylight Time
BaseUtcOffset              : 04:30:00
SupportsDaylightSavingTime : False

Id                         : Ekaterinburg Standard Time
DisplayName                : (GMT+05:00) Ekaterinburg
StandardName               : Ekaterinburg Standard Time
DaylightName               : Ekaterinburg Daylight Time
BaseUtcOffset              : 05:00:00
SupportsDaylightSavingTime : True

Id                         : West Asia Standard Time
DisplayName                : (GMT+05:00) Islamabad, Karachi, Tashkent
StandardName               : West Asia Standard Time
DaylightName               : West Asia Daylight Time
BaseUtcOffset              : 05:00:00
SupportsDaylightSavingTime : False

Id                         : India Standard Time
DisplayName                : (GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi
StandardName               : India Standard Time
DaylightName               : India Daylight Time
BaseUtcOffset              : 05:30:00
SupportsDaylightSavingTime : False

Id                         : Sri Lanka Standard Time
DisplayName                : (GMT+05:30) Sri Jayawardenepura
StandardName               : Sri Lanka Standard Time
DaylightName               : Sri Lanka Daylight Time
BaseUtcOffset              : 05:30:00
SupportsDaylightSavingTime : False

Id                         : Nepal Standard Time
DisplayName                : (GMT+05:45) Kathmandu
StandardName               : Nepal Standard Time
DaylightName               : Nepal Daylight Time
BaseUtcOffset              : 05:45:00
SupportsDaylightSavingTime : False

Id                         : N. Central Asia Standard Time
DisplayName                : (GMT+06:00) Almaty, Novosibirsk
StandardName               : N. Central Asia Standard Time
DaylightName               : N. Central Asia Daylight Time
BaseUtcOffset              : 06:00:00
SupportsDaylightSavingTime : True

Id                         : Central Asia Standard Time
DisplayName                : (GMT+06:00) Astana, Dhaka
StandardName               : Central Asia Standard Time
DaylightName               : Central Asia Daylight Time
BaseUtcOffset              : 06:00:00
SupportsDaylightSavingTime : False

Id                         : Myanmar Standard Time
DisplayName                : (GMT+06:30) Yangon (Rangoon)
StandardName               : Myanmar Standard Time
DaylightName               : Myanmar Daylight Time
BaseUtcOffset              : 06:30:00
SupportsDaylightSavingTime : False

Id                         : SE Asia Standard Time
DisplayName                : (GMT+07:00) Bangkok, Hanoi, Jakarta
StandardName               : SE Asia Standard Time
DaylightName               : SE Asia Daylight Time
BaseUtcOffset              : 07:00:00
SupportsDaylightSavingTime : False

Id                         : North Asia Standard Time
DisplayName                : (GMT+07:00) Krasnoyarsk
StandardName               : North Asia Standard Time
DaylightName               : North Asia Daylight Time
BaseUtcOffset              : 07:00:00
SupportsDaylightSavingTime : True

Id                         : China Standard Time
DisplayName                : (GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi
StandardName               : China Standard Time
DaylightName               : China Daylight Time
BaseUtcOffset              : 08:00:00
SupportsDaylightSavingTime : False

Id                         : North Asia East Standard Time
DisplayName                : (GMT+08:00) Irkutsk, Ulaan Bataar
StandardName               : North Asia East Standard Time
DaylightName               : North Asia East Daylight Time
BaseUtcOffset              : 08:00:00
SupportsDaylightSavingTime : True

Id                         : Singapore Standard Time
DisplayName                : (GMT+08:00) Kuala Lumpur, Singapore
StandardName               : Malay Peninsula Standard Time
DaylightName               : Malay Peninsula Daylight Time
BaseUtcOffset              : 08:00:00
SupportsDaylightSavingTime : False

Id                         : W. Australia Standard Time
DisplayName                : (GMT+08:00) Perth
StandardName               : W. Australia Standard Time
DaylightName               : W. Australia Daylight Time
BaseUtcOffset              : 08:00:00
SupportsDaylightSavingTime : True

Id                         : Taipei Standard Time
DisplayName                : (GMT+08:00) Taipei
StandardName               : Taipei Standard Time
DaylightName               : Taipei Daylight Time
BaseUtcOffset              : 08:00:00
SupportsDaylightSavingTime : False

Id                         : Tokyo Standard Time
DisplayName                : (GMT+09:00) Osaka, Sapporo, Tokyo
StandardName               : Tokyo Standard Time
DaylightName               : Tokyo Daylight Time
BaseUtcOffset              : 09:00:00
SupportsDaylightSavingTime : False

Id                         : Korea Standard Time
DisplayName                : (GMT+09:00) Seoul
StandardName               : Korea Standard Time
DaylightName               : Korea Daylight Time
BaseUtcOffset              : 09:00:00
SupportsDaylightSavingTime : False

Id                         : Yakutsk Standard Time
DisplayName                : (GMT+09:00) Yakutsk
StandardName               : Yakutsk Standard Time
DaylightName               : Yakutsk Daylight Time
BaseUtcOffset              : 09:00:00
SupportsDaylightSavingTime : True

Id                         : Cen. Australia Standard Time
DisplayName                : (GMT+09:30) Adelaide
StandardName               : Cen. Australia Standard Time
DaylightName               : Cen. Australia Daylight Time
BaseUtcOffset              : 09:30:00
SupportsDaylightSavingTime : True

Id                         : AUS Central Standard Time
DisplayName                : (GMT+09:30) Darwin
StandardName               : AUS Central Standard Time
DaylightName               : AUS Central Daylight Time
BaseUtcOffset              : 09:30:00
SupportsDaylightSavingTime : False

Id                         : E. Australia Standard Time
DisplayName                : (GMT+10:00) Brisbane
StandardName               : E. Australia Standard Time
DaylightName               : E. Australia Daylight Time
BaseUtcOffset              : 10:00:00
SupportsDaylightSavingTime : False

Id                         : AUS Eastern Standard Time
DisplayName                : (GMT+10:00) Canberra, Melbourne, Sydney
StandardName               : AUS Eastern Standard Time
DaylightName               : AUS Eastern Daylight Time
BaseUtcOffset              : 10:00:00
SupportsDaylightSavingTime : True

Id                         : West Pacific Standard Time
DisplayName                : (GMT+10:00) Guam, Port Moresby
StandardName               : West Pacific Standard Time
DaylightName               : West Pacific Daylight Time
BaseUtcOffset              : 10:00:00
SupportsDaylightSavingTime : False

Id                         : Tasmania Standard Time
DisplayName                : (GMT+10:00) Hobart
StandardName               : Tasmania Standard Time
DaylightName               : Tasmania Daylight Time
BaseUtcOffset              : 10:00:00
SupportsDaylightSavingTime : True

Id                         : Vladivostok Standard Time
DisplayName                : (GMT+10:00) Vladivostok
StandardName               : Vladivostok Standard Time
DaylightName               : Vladivostok Daylight Time
BaseUtcOffset              : 10:00:00
SupportsDaylightSavingTime : True

Id                         : Central Pacific Standard Time
DisplayName                : (GMT+11:00) Magadan, Solomon Is., New Caledonia
StandardName               : Central Pacific Standard Time
DaylightName               : Central Pacific Daylight Time
BaseUtcOffset              : 11:00:00
SupportsDaylightSavingTime : False

Id                         : New Zealand Standard Time
DisplayName                : (GMT+12:00) Auckland, Wellington
StandardName               : New Zealand Standard Time
DaylightName               : New Zealand Daylight Time
BaseUtcOffset              : 12:00:00
SupportsDaylightSavingTime : True

Id                         : Fiji Standard Time
DisplayName                : (GMT+12:00) Fiji, Kamchatka, Marshall Is.
StandardName               : Fiji Standard Time
DaylightName               : Fiji Daylight Time
BaseUtcOffset              : 12:00:00
SupportsDaylightSavingTime : False

Id                         : Tonga Standard Time
DisplayName                : (GMT+13:00) Nuku'alofa
StandardName               : Tonga Standard Time
DaylightName               : Tonga Daylight Time
BaseUtcOffset              : 13:00:00
SupportsDaylightSavingTime : False

Id                         : Azores Standard Time
DisplayName                : (GMT-01:00) Azores
StandardName               : Azores Standard Time
DaylightName               : Azores Daylight Time
BaseUtcOffset              : -01:00:00
SupportsDaylightSavingTime : True

Id                         : Cape Verde Standard Time
DisplayName                : (GMT-01:00) Cape Verde Is.
StandardName               : Cape Verde Standard Time
DaylightName               : Cape Verde Daylight Time
BaseUtcOffset              : -01:00:00
SupportsDaylightSavingTime : False

Id                         : Mid-Atlantic Standard Time
DisplayName                : (GMT-02:00) Mid-Atlantic
StandardName               : Mid-Atlantic Standard Time
DaylightName               : Mid-Atlantic Daylight Time
BaseUtcOffset              : -02:00:00
SupportsDaylightSavingTime : True

Id                         : E. South America Standard Time
DisplayName                : (GMT-03:00) Brasilia
StandardName               : E. South America Standard Time
DaylightName               : E. South America Daylight Time
BaseUtcOffset              : -03:00:00
SupportsDaylightSavingTime : True

Id                         : SA Eastern Standard Time
DisplayName                : (GMT-03:00) Buenos Aires, Georgetown
StandardName               : SA Eastern Standard Time
DaylightName               : SA Eastern Daylight Time
BaseUtcOffset              : -03:00:00
SupportsDaylightSavingTime : False

Id                         : Greenland Standard Time
DisplayName                : (GMT-03:00) Greenland
StandardName               : Greenland Standard Time
DaylightName               : Greenland Daylight Time
BaseUtcOffset              : -03:00:00
SupportsDaylightSavingTime : True

Id                         : Montevideo Standard Time
DisplayName                : (GMT-03:00) Montevideo
StandardName               : Montevideo Standard Time
DaylightName               : Montevideo Daylight Time
BaseUtcOffset              : -03:00:00
SupportsDaylightSavingTime : True

Id                         : Newfoundland Standard Time
DisplayName                : (GMT-03:30) Newfoundland
StandardName               : Newfoundland Standard Time
DaylightName               : Newfoundland Daylight Time
BaseUtcOffset              : -03:30:00
SupportsDaylightSavingTime : True

Id                         : Atlantic Standard Time
DisplayName                : (GMT-04:00) Atlantic Time (Canada)
StandardName               : Atlantic Standard Time
DaylightName               : Atlantic Daylight Time
BaseUtcOffset              : -04:00:00
SupportsDaylightSavingTime : True

Id                         : SA Western Standard Time
DisplayName                : (GMT-04:00) Caracas, La Paz
StandardName               : SA Western Standard Time
DaylightName               : SA Western Daylight Time
BaseUtcOffset              : -04:00:00
SupportsDaylightSavingTime : False

Id                         : Central Brazilian Standard Time
DisplayName                : (GMT-04:00) Manaus
StandardName               : Central Brazilian Standard Time
DaylightName               : Central Brazilian Daylight Time
BaseUtcOffset              : -04:00:00
SupportsDaylightSavingTime : True

Id                         : Pacific SA Standard Time
DisplayName                : (GMT-04:00) Santiago
StandardName               : Pacific SA Standard Time
DaylightName               : Pacific SA Daylight Time
BaseUtcOffset              : -04:00:00
SupportsDaylightSavingTime : True

Id                         : SA Pacific Standard Time
DisplayName                : (GMT-05:00) Bogota, Lima, Quito, Rio Branco
StandardName               : SA Pacific Standard Time
DaylightName               : SA Pacific Daylight Time
BaseUtcOffset              : -05:00:00
SupportsDaylightSavingTime : False

Id                         : Eastern Standard Time
DisplayName                : (GMT-05:00) Eastern Time (US & Canada)
StandardName               : Eastern Standard Time
DaylightName               : Eastern Daylight Time
BaseUtcOffset              : -05:00:00
SupportsDaylightSavingTime : True

Id                         : US Eastern Standard Time
DisplayName                : (GMT-05:00) Indiana (East)
StandardName               : US Eastern Standard Time
DaylightName               : US Eastern Daylight Time
BaseUtcOffset              : -05:00:00
SupportsDaylightSavingTime : False

Id                         : Central America Standard Time
DisplayName                : (GMT-06:00) Central America
StandardName               : Central America Standard Time
DaylightName               : Central America Daylight Time
BaseUtcOffset              : -06:00:00
SupportsDaylightSavingTime : False

Id                         : Central Standard Time
DisplayName                : (GMT-06:00) Central Time (US & Canada)
StandardName               : Central Standard Time
DaylightName               : Central Daylight Time
BaseUtcOffset              : -06:00:00
SupportsDaylightSavingTime : True

Id                         : Central Standard Time (Mexico)
DisplayName                : (GMT-06:00) Guadalajara, Mexico City, Monterrey - 
                             New
StandardName               : Central Standard Time (Mexico)
DaylightName               : Central Daylight Time (Mexico)
BaseUtcOffset              : -06:00:00
SupportsDaylightSavingTime : True

Id                         : Mexico Standard Time
DisplayName                : (GMT-06:00) Guadalajara, Mexico City, Monterrey - 
                             Old
StandardName               : Mexico Standard Time
DaylightName               : Mexico Daylight Time
BaseUtcOffset              : -06:00:00
SupportsDaylightSavingTime : True

Id                         : Canada Central Standard Time
DisplayName                : (GMT-06:00) Saskatchewan
StandardName               : Canada Central Standard Time
DaylightName               : Canada Central Daylight Time
BaseUtcOffset              : -06:00:00
SupportsDaylightSavingTime : False

Id                         : US Mountain Standard Time
DisplayName                : (GMT-07:00) Arizona
StandardName               : US Mountain Standard Time
DaylightName               : US Mountain Daylight Time
BaseUtcOffset              : -07:00:00
SupportsDaylightSavingTime : False

Id                         : Mountain Standard Time (Mexico)
DisplayName                : (GMT-07:00) Chihuahua, La Paz, Mazatlan - New
StandardName               : Mountain Standard Time (Mexico)
DaylightName               : Mountain Daylight Time (Mexico)
BaseUtcOffset              : -07:00:00
SupportsDaylightSavingTime : True

Id                         : Mexico Standard Time 2
DisplayName                : (GMT-07:00) Chihuahua, La Paz, Mazatlan - Old
StandardName               : Mexico Standard Time 2
DaylightName               : Mexico Daylight Time 2
BaseUtcOffset              : -07:00:00
SupportsDaylightSavingTime : True

Id                         : Mountain Standard Time
DisplayName                : (GMT-07:00) Mountain Time (US & Canada)
StandardName               : Mountain Standard Time
DaylightName               : Mountain Daylight Time
BaseUtcOffset              : -07:00:00
SupportsDaylightSavingTime : True

Id                         : Pacific Standard Time
DisplayName                : (GMT-08:00) Pacific Time (US & Canada)
StandardName               : Pacific Standard Time
DaylightName               : Pacific Daylight Time
BaseUtcOffset              : -08:00:00
SupportsDaylightSavingTime : True

Id                         : Pacific Standard Time (Mexico)
DisplayName                : (GMT-08:00) Tijuana, Baja California
StandardName               : Pacific Standard Time (Mexico)
DaylightName               : Pacific Daylight Time (Mexico)
BaseUtcOffset              : -08:00:00
SupportsDaylightSavingTime : True

Id                         : Alaskan Standard Time
DisplayName                : (GMT-09:00) Alaska
StandardName               : Alaskan Standard Time
DaylightName               : Alaskan Daylight Time
BaseUtcOffset              : -09:00:00
SupportsDaylightSavingTime : True

Id                         : Hawaiian Standard Time
DisplayName                : (GMT-10:00) Hawaii
StandardName               : Hawaiian Standard Time
DaylightName               : Hawaiian Daylight Time
BaseUtcOffset              : -10:00:00
SupportsDaylightSavingTime : False

Id                         : Samoa Standard Time
DisplayName                : (GMT-11:00) Midway Island, Samoa
StandardName               : Samoa Standard Time
DaylightName               : Samoa Daylight Time
BaseUtcOffset              : -11:00:00
SupportsDaylightSavingTime : False

Id                         : Dateline Standard Time
DisplayName                : (GMT-12:00) International Date Line West
StandardName               : Dateline Standard Time
DaylightName               : Dateline Daylight Time
BaseUtcOffset              : -12:00:00
SupportsDaylightSavingTime : False

[Feature Request] improve log counter name when counter not found.

While doing some installations there were some errors trying to get some counters. ( After commenting all counters on the config.xml file we realized that the problem was missing PhisicalDisk counters)

Here the output:

Get-Counter : Internal performance counter API call failed. Error: c0000bb8.
At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Graphite-PowerShell\Funct
ions\Start-StatsToGraphite.ps1:119 char:28
+             $collections = Get-Counter -Counter $Config.Counters 
-SampleInterval ...

As you can see the output is not reporting the counter name, would be easier if the output could print the counter name

Thank you very much

Errors on counter API Call Failed

Hi @MattHodge .

We have woking with the last master scripts and sometimes we have this out error messages when executing graphite-powershell. with some counters,

In this example the error messages began after add these counter metrics.

<Counter Name="\Web Service(_Total)\Current Connections"/>
<Counter Name="\Web Service(*)\Current Connections"/>

image

There is any way to avoid this errors, even when we don't have this counters ?

problem with accented characters in counters: possibility to change the metrics name?

Hello,

I discovered your scripts which seems to suit my needs, but I found a problem in my situation: we use localized versions of Windows (French) and Windows performance counters names are translated in French, we got for example "\Mémoire\Mégaoctets disponibles" or "Mémoire\Écritures de pages/s"

Counters are retrieved well and sent correctly to Graphite, the problem is not here. The problem is directly with graphite (or another frontend like Grafana): metrics with accented characters can't be displayed.

I thought my problem could be solved just by indicating the counter name i want to retrieve AND the metrics name associated. Is it actually possible to do it? Or could it be added to your code?

Thanks for your code.

Sends data in UTC

For whatever reason, Graphite-Powershell was sending metrics with the Unix timestamp at UTC regardless of whatever timezone I had set in the XML config file. In our case, both our Graphite server and the sending server are in PDT as of this writing. I could shift the Unix timestamp around a bit by changing the timezone to one that is purposefully wrong; in other words, it was possible to get the graphs to end up at the right time by purposefully setting the XML config to Azores Standard Time (even though we are in Pacific Daylight Time now).

Anyway, after doing some research, I found that the cause is that Get-Date -uformat %s produces the Unix timestamp (seconds since the epoch) relative to UTC.

The fix was to modify this code:

Get-Date $DateTime -UFormat %s

and change it to:

Get-Date (Get-Date $DateTime).ToUniversalTime() -UFormat %s

I did this in two places in the script, and it seems to work. However, I have by no means exhaustively tested this in all the modes the script can be run. It just works for me when using the script in its simplest, default mode, which I understand is the bulk send.

Matt, I figure you'll want to test and bless my suggested change before closing this issue.

Unable to find type [System.TimeZoneInfo]

I'm working on win2k3 R2 with Powershell2.0 and I'm getting this error...

any workarround for old windows servers ?

Thanks a lot!!

PS C:\GraphitePS> Convert-TimeZone -ListTimeZones
Unable to find type [System.TimeZoneInfo]: make sure that the assembly containing this type is loaded.
At C:\GraphitePS\Graphite-PowerShell.ps1:399 char:30
+         [System.TimeZoneInfo] <<<< ::GetSystemTimeZones()
    + CategoryInfo          : InvalidOperation: (System.TimeZoneInfo:String) [], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound

Some stats not being sent

I am trying to add various metrics for our different windows machines.
For example.

But all I am getting back from our 2012 server is:
VERBOSE: Metric Received: My.server.hdd.s-drive.diskbytes-sec 0 1460556980

No data, just a date.

From a windows 10 machine, I get
VERBOSE: Metric Received: 85752.2772612114 1460557190

Here are the powershell versions of the 2012 machine:
PS C:\Windows\system32> $psversiontable

Name Value


PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.42000
BuildVersion 6.3.9600.17400
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2

thanks

Re-work SQL metrics

  • Better authentication method
  • Possibly separate configuration file
  • Method to secure password

carbon only storing some metrics

Any idea why only the memory related metrics are stored by my carbon server, somehow all others are ignored! I can't seem to find anything useful in carbon's logs!

PerfMon Job Execution Time: 2.5722656 seconds
VERBOSE: Metric Received:
datacenter1.servers.ml623-win7-1.networkinterface.intelrpro1000mtdesktopadapter.bytesreceived-sec 1490.05686793278
1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.networkinterface.localareaconnection*11.bytesreceived-sec 0
1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.networkinterface.6to4adapter.bytesreceived-sec 0 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.networkinterface.intelrpro1000mtdesktopadapter.bytessent-sec
 112.567250795146 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.networkinterface.localareaconnection*11.bytessent-sec 0
1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.networkinterface.6to4adapter.bytessent-sec 0 1405990035
VERBOSE: Metric Received:
datacenter1.servers.ml623-win7-1.networkinterface.intelrpro1000mtdesktopadapter.packetsreceivedunicast-sec
1.6676629747429 1405990035
VERBOSE: Metric Received:
datacenter1.servers.ml623-win7-1.networkinterface.localareaconnection*11.packetsreceivedunicast-sec 0 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.networkinterface.6to4adapter.packetsreceivedunicast-sec 0
1405990035
VERBOSE: Metric Received:
datacenter1.servers.ml623-win7-1.networkinterface.intelrpro1000mtdesktopadapter.packetssentunicast-sec
0.833831487371452 1405990035
VERBOSE: Metric Received:
datacenter1.servers.ml623-win7-1.networkinterface.localareaconnection*11.packetssentunicast-sec 0 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.networkinterface.6to4adapter.packetssentunicast-sec 0
1405990035
VERBOSE: Metric Received:
datacenter1.servers.ml623-win7-1.networkinterface.intelrpro1000mtdesktopadapter.packetsreceivednon-unicast-sec
10.0059778484574 1405990035
VERBOSE: Metric Received:
datacenter1.servers.ml623-win7-1.networkinterface.localareaconnection*11.packetsreceivednon-unicast-sec 0 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.networkinterface.6to4adapter.packetsreceivednon-unicast-sec
0 1405990035
VERBOSE: Metric Received:
datacenter1.servers.ml623-win7-1.networkinterface.intelrpro1000mtdesktopadapter.packetssentnon-unicast-sec 0 1405990035
VERBOSE: Metric Received:
datacenter1.servers.ml623-win7-1.networkinterface.localareaconnection*11.packetssentnon-unicast-sec 0 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.networkinterface.6to4adapter.packetssentnon-unicast-sec 0
1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.processor.total.processortime 3.17848094483736 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.memory.availablembytes 1662 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.memory.pages-sec 0 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.memory.pagesinput-sec 0 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.system.processorqueuelength 0 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.system.threads 893 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.physicaldisk.c-drive.diskwritequeuelength
0.000667644654811857 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.physicaldisk.total.diskwritequeuelength 0.000667644654811857
 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.physicaldisk.c-drive.diskreadqueuelength 0 1405990035
VERBOSE: Metric Received: datacenter1.servers.ml623-win7-1.physicaldisk.total.diskreadqueuelength 0 1405990035�
        �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

Issues with InfluxDB's Carbon plugin

Not necessarily an issue with this module, more of a usability issue and something you may want to document on the Readme page...

InfluxDB provides a carbon plugin which is supposed to be 100% compatible with Graphite's Carbon aggregator, but there is a problem. For bulk metric submitting, InfluxDB does not like the use of "r" (carriage return) as a delimiter between metrics. You have to use "n" (newline).

Single metric submits using Send-GraphiteMetric() worked okay for me, but not Send-BulkGraphiteMetrics(). I had to modify the code in Internal.ps1 (SendMetrics function) to use newline as mentioned above.

If Graphite Carbon can handle newlines instead of carriage returns, it might be prudent to simply switch to using that character. If Graphite does NOT work well with newlines, then a documentation note would be helpful for others who might come across this issue.

timezone / standardname vs daylightname

Matt, thanks a lot for your work on this. Hugely helpful.

I ran into an issue where my systems were reporting metrics an hour in the future to graphite. Being the deep thinker I am, I just subtracted an hour:

 $UnixTime = ($UnixTime - 3600);

In the middle of setting this up on some systems, I noticed that this reports "PST" even though we're currently in daylight savings time:

PS C:\WINDOWS\system32> [System.TimeZoneInfo]::LOCAL.id
Pacific Standard Time

So, I removed my subtract-an-hour solution and added this to determine my local timezone instead:

# determine if we're in dst
$wmisys = get-wmiobject "Win32_ComputerSystem"
$dst = $wmisys.DaylightInEffect
if ($dst -eq 'True') {
     $LocalTimeZone = [TimeZone]::CurrentTimeZone.daylightname
}
else {
     $LocalTimeZone = [TimeZone]::CurrentTimeZone.standardname
}

Its now "working", and my metrics show up correctly in graphite. Am I completely off track with this?

Question About behavior on load balanced environments.

Hi @MattHodge I'm using your powerful tools to send windows stats to graphite and we are working on a environment with load balancers in front of several graphite carbon daemons.

I would like to know how Graphite-powershell-Functions works when configured as a service on this environment. ( always assuming TCP connections)

In a failover contingency scenario ( one graphite carbon fails and close all its TCP connections).

  • is Graphite-Powershell-Service able to do a reconnection ? in that case which is reconnection frequency until it finally reconnects?

In a recovery scenario (we can recover a carbon server after a crash and load balancers are beginning to distribute load again over all our carbon servers).

  • is Graphite-Powershell-Service able to Force a Reconnect (periodically each 3 or 6 hours perhaps) to enabling load redistribution over all carbon servers?

Thank you very much

How to get % Physical used Memory with Graphite-PowerShell ?

Hi @MattHodge . I'm working with this wonderful tool and we are getting these memory counters.

        <Counter Name="\Memory\Available MBytes" /> 
        <Counter Name="\Memory\Pages/sec" />
        <Counter Name="\Memory\Pages Input/sec" /> 

But we also need the % physical used memory . In this case we can compute the value if either of those values could be obtained.

  • % physical used memory.
  • % physical Available memory.
  • Total amount of physical Memory in Mb/Kb/Bytes.
  • used amount phisical memory Mb/Kb/Bytes

There is any counter matching these values?
There any workaround to get these values from other scripts like perhaps this other( https://github.com/pdxcat/PowerShell-Graphite/blob/master/Get-MemStats.ps1)

Missing properties

Edit: I would like to add, this could very well be user error, so please point it out if so!

Thanks so much for writing and sharing this!! Found that installing via Chef cookbook just wouldn't do anything (2008R2), so tried the manual version here to troubleshoot. (2012R2)

When I first tried to run the startup script on 2008R2:

PS C:\Windows\system32> Import-Module graphite-powershell
Import-Module : The 'C:\Windows\system32\WindowsPowerShell\v1.0\Modules\graphite-powershell\graphite-powershell.psd1' m
odule cannot be imported because its manifest contains one or more members that are not valid. The valid manifest membe
rs are ('ModuleToProcess', 'NestedModules', 'GUID', 'Author', 'CompanyName', 'Copyright', 'ModuleVersion', 'Description
', 'PowerShellVersion', 'PowerShellHostName', 'PowerShellHostVersion', 'CLRVersion', 'DotNetFrameworkVersion', 'Process
orArchitecture', 'RequiredModules', 'TypesToProcess', 'FormatsToProcess', 'ScriptsToProcess', 'PrivateData', 'RequiredA
ssemblies', 'ModuleList', 'FileList', 'FunctionsToExport', 'VariablesToExport', 'AliasesToExport', 'CmdletsToExport').
Remove the members that are not valid ('RootModule'), then try to import the module again.
At line:1 char:14
+ Import-Module <<<<  graphite-powershell
    + CategoryInfo          : InvalidData: (C:\Windows\syst...powershell.psd1:String) [Import-Module], InvalidOperatio
   nException
    + FullyQualifiedErrorId : Modules_InvalidManifestMember,Microsoft.PowerShell.Commands.ImportModuleCommand

Googling gave me a fix:

# This is the PSD1 file...
# Script module or binary module file associated with this manifest.
OLD:   RootModule = 'Graphite-Powershell.psm1'
NEW:  ModuleToProcess = 'Graphite-Powershell.psm1'

Now that it's actually running...I get a bunch of these:

PS C:\GraphitePowershellFunctions> start-statstographite -verbose
The property 'NodeHostName' cannot be found on this object. Verify that the property exists.
At C:\Program Files\WindowsPowerShell\Modules\graphite-powershell\Functions\Internal.ps1:40 char:5
+     $Config.NodeHostName = $xmlfile.Configuration.Graphite.NodeHostName
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
    + FullyQualifiedErrorId : PropertyNotFoundStrict

<snip, a lot of these>

The property 'SendUsingUDP' cannot be found on this object. Verify that the property exists.
At C:\Program Files\WindowsPowerShell\Modules\graphite-powershell\Functions\Internal.ps1:52 char:5
+     [bool]$Config.SendUsingUDP = [System.Convert]::ToBoolean($xmlfile.Configurat ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
    + FullyQualifiedErrorId : PropertyNotFoundStrict
The property 'MSSQLMetics' cannot be found on this object. Verify that the property exists.
At C:\Program Files\WindowsPowerShell\Modules\graphite-powershell\Functions\Internal.ps1:93 char:5
+     $Config.MSSQLMetricPath = $xmlfile.Configuration.MSSQLMetics.MetricPath
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
    + FullyQualifiedErrorId : PropertyNotFoundStrict

<snip, a lot of these>

I found the first one is resolved by modifying the config XML:
OLD: $env:COMPUTERNAME
NEW: $env:COMPUTERNAME

The 2nd (IIRC) was resolved by adding in the 'SendUsingUDP' config option.

The 3rd is clearly a typo: 'MSSQLMetics'.

After finally getting it started and letting it run for a while, started getting these: (snipped)

The property 'MSSQLMetics' cannot be found on this object. Verify that the property exists.
At C:\Program Files\WindowsPowerShell\Modules\graphite-powershell\Functions\Internal.ps1:96 char:5
+     [int]$Config.MSSQLConnectTimeout = $xmlfile.Configuration.MSSQLMetics.SQLCon ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
    + FullyQualifiedErrorId : PropertyNotFoundStrict

The property 'MSSQLMetics' cannot be found on this object. Verify that the property exists.
At C:\Program Files\WindowsPowerShell\Modules\graphite-powershell\Functions\Internal.ps1:97 char:5
+     [int]$Config.MSSQLQueryTimeout = $xmlfile.Configuration.MSSQLMetics.SQLQuery ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
    + FullyQualifiedErrorId : PropertyNotFoundStrict

The property 'MSSQLMetics' cannot be found on this object. Verify that the property exists.
At C:\Program Files\WindowsPowerShell\Modules\graphite-powershell\Functions\Internal.ps1:102 char:28
+     foreach ($sqlServer in $xmlfile.Configuration.MSSQLMetics.SQLServers.SQLServ ...
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
    + FullyQualifiedErrorId : PropertyNotFoundStrict

Again, looks like something from the XML file. Interestingly, your main readme has a similar typo: MSSQLMetics Configuration Section

I think I can get it working enough for my purposes (guessing this is just a case of missing stuff from the config file - even though you'd think it wasn't required), just thought I'd let you know it was slightly broken.

Various Module Issues

Thanks a lot for a great project! I found some issues with it though:

--> I was getting no such method Dispose() on Windows 2008 with PowerShell 2.0 installed here:

function PSUsing
{
param (
[System.IDisposable] $inputObject = $(throw "The parameter -inputObject is required."),
[ScriptBlock] $scriptBlock = $(throw "The parameter -scriptBlock is required.")
)
Try
{
&$scriptBlock
}
Finally
{
if ($inputObject -ne $null)
{
if ($inputObject.psbase -eq $null)
{
$inputObject.Dispose()
}
else
{
$inputObject.psbase.Dispose() <-------- No such method psbase.Dispose() in PowerShell 2.0
}
}
}
}

I had to comment that line out to make module work.

--> Module was erroring on that line with PowerShell 2.0:

RootModule = 'Graphite-Powershell.psm1'

I had to replace it with:

ModuleToProcess = 'Graphite-Powershell.psm1'

All these issues go away if I upgrade to PowerShell 3.0 though.

Single threaded?

Hi there im wanting to monitor metrics from a fairly busy web app hosted on an IIS box. I came across this which is great but the script takes about 120 seconds on a big box (16 cpu 64gb ram etc) to push all the metrics I want to graphite. Im assuming this is because its processing them in single threaded fashion. Is there a way to make this multi-threaded at all?

Microsoft SQL PowerShell Modules/SnapIns for 2008 R2?

Hi, we are testing last Graphite-PowerShell version 1.2.2 , in Windows 2008-R2 with PowerShell 3.0

And we need to collect metrics from SQL Server with the SQL Powershell Modules.

There is such modules for 2008 R2 ?

MetricReplace find and replace on the node hostname too

I'm trying v1.2.0 of the module, with an explicit NodeHostName (I need the FQDN hostname) like

<NodeHostName>host_domain_tld</NodeHostName>

When the script send metrics to Graphite, it does find and replace on the node hostname which is not the intended behaviour, so my hostname become hostdomaintld (because of the default rule finding "_").

Memory continuously increase

Hi there,

Our current StatsToGraphite service continuously increases its memory consume during the day having to restart it daily.
We are have the scripts installed as a service using NSSM.
Any idea about why is this happening ?

Thanks

Parsing of CSV perfmon files

First wanted to say this is an amazing script, many thanks for making it. I just wanted to check whether you were thinking of adding some additional functionality where previously logged perfmon counters to .csv file could be parsed?

Send-GraphiteMetric does not work with -DateTime

The conversion from DateTime to Unix time is broken

>Send-GraphiteMetric -CarbonServer 127.0.0.1 -MetricPath 'test' -MetricValue 123 -DateTime (Get-Date)
Send-GraphiteMetric : Cannot convert value "24/05/2016 09:38:46" to type "System.UInt64". Error: "Invalid cast from
'DateTime' to 'UInt64'."
At line:1 char:1
+ Send-GraphiteMetric -CarbonServer 127.0.0.1 -MetricPath 'test' -Metri ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Send-GraphiteMetric], RuntimeException
    + FullyQualifiedErrorId : InvalidCastIConvertible,Send-GraphiteMetric

Unable to uninstall/delete

Hello,
I've been working with your script and indeed it's a really nice method of sending data to graphite. I've used previously perftab.
Anyway, everything works good except that nssm cannot be removed without restarting the server
It's used by the DHCP client and doesn't work if you restart the service, only if you stop it.
If the DHCP service is stopped, it's then used by Windows Event viewer which in turn depends on multiple services.
Bottom line, I couldn't implement in chef a method to remove the whole script/exe files. Considering the fact that I want to push it to a production environment, do you guys have an idea on how should i proceed?
Thank you,
Dan Popescu

Unix time too long when sending to influxDB

I've noticed that the date that gets sent is 15 characters long, for example: 141882399527883

When sending to InfluxDB this results in an error such as this:
GraphiteServer:%!(EXTRA *strconv.NumError=strconv.ParseUint: parsing "141882399527883": value out of range).

A correct unix time would normally be 10 characters long, such as 1418823995
which in turn would result in:
$ date --date='@1418823995'
Wed Dec 17 13:46:35 UTC 2014

I'm guessing that you're adding microseconds or something to the output, in that case the number should be decimal such as:

$ date --date='@1418823995.27883'
Wed Dec 17 13:46:35 UTC 2014

Do we really need microseconds in the output date? Any ideas on how to change the date to make it epoch time accurate to the second or decimal and thus allow compatibility with the InfluxDB storage engine?

Thanks!

Steps to reproduce:

  1. Enable input_graphite to InfluxDB by changing this part in /opt/influxdb/shared/config.toml

Configure the graphite api

[input_plugins.graphite]
enabled = true
port = 2003
database = "graphite_db"
2. Direct Graphite-PowerShell metrics to InfluxDB
3. tail -f /opt/influxdb/shared/log.txt

"dot" in counter title

Hi,

I have a IIS server, where my websites is named "www.siteX.com". When i send this to graphite, it will be showed like this "webservices>www>siteX>com" but i would like do replace the dot in the counter name with "-" so it will end up in graphite like this "webservices>www-siteX-com"

Kristian

PowerShell Module

I'd like to see this as a module, that way, private functions are hidden away, and things like

Import-Module SQLPS
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100

Can be done when the module is imported, instead of when a function is run.

Error with Lync Counter

When trying to use the counter:

I get the following error:

Get-Counter : The specified object was not found on the computer.
At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Graphite-PowerShell\Functions\Start-StatsToGraphite.ps1:119
char:28

  •         $collections = Get-Counter -Counter $Config.Counters -SampleInterval ...
    
  •                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : InvalidResult: (:) [Get-Counter], Exception
    • FullyQualifiedErrorId : CounterApiError,Microsoft.PowerShell.Commands.GetCounterCommand

It looks like it is because the output has multiple "sources" for the output instead of just one value. When i change the counter to just one value like:

It works fine.

Eric

Metrics collected differ from get-counter

I have an issue where the metrics that are collected for CPU processor time differing from running get-counter cmdlet. I can have the Start-StatsToGraphite running in a console side-by-side to another PS console running get-counter cmdlet, both polling \Processor(*)% Processor Time, at 5 second intervals, and the metrics vary greatly. On the side with the cmdlet running I will have cookedvalues of 6 to 17, however on the side running the Start-StatsToGraphite the verbose output says 0 to 1.5.

Dynamic lists on SQL metrics.

Hi,

Would it be possible to change the SQLMetric collection to multiple rows in the resultset.
E.g. grabbing multiple performance counters from dm_os_performance_counters
and also generating the Graphite metric based on SQL resultset instead of having it hardcoded in the configXML

SELECT
GETDATE() AS LogDate
, object_name AS object_name
, CASE instance_name WHEN '' THEN '_Total' ELSE instance_name END AS instance_name
, counter_name AS counter_name
, cntr_value AS cntr_value
FROM
sys.dm_os_performance_counters WITH (NOLOCK)

                # Run the SQL Command
                try
                {
                    $commandMeasurement = Measure-Command -Expression {
                        $sqlresult = Invoke-SQLCmd @sqlCmdParams

                        # Build the MetricPath that will be used to send the metric to Graphite
                        $metricPath = $Config.MSSQLMetricPath + '.' + $query.MetricName

                        $metricsToSend[$metricPath] = $sqlresult[0]
                    }

There are no SQL Servers in your configuration file. No SQL metrics will be collected.

I am obviously being a complete fool, but I when I try and collect SQL stats I just get the error "There are no SQL Servers in your configuration file. No SQL metrics will be collected."

I have tweaked the below lines with my SQL details

    <SQLServers>
        <!-- A SQL Server Connection Using SQL Authentication -->
        <SQLServer ServerInstance="MYSERVERNAME" Username="mysauser" Password="PASSWORD1!">

and I have edited the query.

What am I doing wrong?

Thanks

Not sending metrics - Printing config file into verbose log as error

So i had followed instructions and setup windows metrics being pumped into Hosted Graphite, it was installed as a service and all ran fine for 3 days.
Someone restarted the service and now no metrics are making it to hosted graphite.

When i look into the powershell and run with verbose output i find that my config file is being printed out - rather than read and followed.

PS C:\Users\Administrator.FOE> Start-StatsToGraphite -verbose
Cannot convert value "


REMOVED REST OF CONFIG FILE

Getting errors like:

" to type "System.Xml.XmlDocument". Error: "'<', hexadecimal value 0x3C, is an invalid attribute character. Line 65,
position 3."
At C:\Program Files\WindowsPowerShell\Modules\Graphite-PowerShell\Functions\Internal.ps1:33 char:5

  • $xmlfile = [xml]([System.IO.File]::ReadAllText%28$configPath%29)
    
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : InvalidArgument: (:) [], RuntimeException
    • FullyQualifiedErrorId : InvalidCastToXmlDocument

The property 'Configuration' cannot be found on this object. Verify that the property exists.
At C:\Program Files\WindowsPowerShell\Modules\Graphite-PowerShell\Functions\Internal.ps1:36 char:5

  • $Config.CarbonServer = $xmlfile.Configuration.Graphite.CarbonServer
    
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : NotSpecified: (:) [], PropertyNotFoundException
    • FullyQualifiedErrorId : PropertyNotFoundStrict

The property 'Configuration' cannot be found on this object. Verify that the property exists.
At C:\Program Files\WindowsPowerShell\Modules\Graphite-PowerShell\Functions\Internal.ps1:37 char:5

Any idea what has happened?

Some metrics do not get sent when sending over UDP.

<Counter Name="\SQLSERVER:General Statistics\User Connections" /> is not being sent when sending via UDP. Over TCP it works fine.

XML configuration file where issues are occurring:

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
  <Graphite>
    <CarbonServer>IP</CarbonServer>
    <CarbonServerPort>2003</CarbonServerPort>
    <MetricPath>my.servers</MetricPath>
    <MetricSendIntervalSeconds>15</MetricSendIntervalSeconds>
    <TimeZoneOfGraphiteServer>UTC</TimeZoneOfGraphiteServer>
    <SendUsingUDP>True</SendUsingUDP>
  </Graphite>
  <PerformanceCounters>
    <Counter Name="\Memory\Available MBytes" />
    <Counter Name="\Memory\Pages Input/sec" />
    <Counter Name="\Memory\Pages/sec" />
    <Counter Name="\Network Interface(*)\Bytes Received/sec" />
    <Counter Name="\Network Interface(*)\Bytes Sent/sec" />
    <Counter Name="\Network Interface(*)\Packets Received Non-Unicast/sec" />
    <Counter Name="\Network Interface(*)\Packets Received Unicast/sec" />
    <Counter Name="\Network Interface(*)\Packets Sent Non-Unicast/sec" />
    <Counter Name="\Network Interface(*)\Packets Sent Unicast/sec" />
    <Counter Name="\PhysicalDisk(*)\Avg. Disk Read Queue Length" />
    <Counter Name="\PhysicalDisk(*)\Avg. Disk Write Queue Length" />
    <Counter Name="\PhysicalDisk(*)\Disk Read Bytes/sec" />
    <Counter Name="\PhysicalDisk(*)\% Idle Time" />
    <Counter Name="\PhysicalDisk(*)\Disk Write Bytes/sec" />
    <Counter Name="\Processor(_Total)\% Processor Time" />
    <Counter Name="\SQLSERVER:Access Methods\Full Scans/sec" />
    <Counter Name="\SQLSERVER:Access Methods\Page Splits/sec" />
    <Counter Name="\SQLSERVER:Access Methods\Workfiles Created/sec" />
    <Counter Name="\SQLSERVER:Access Methods\Worktables Created/sec" />
    <Counter Name="\SQLSERVER:Buffer Manager\Page Life Expectancy" />
    <Counter Name="\SQLSERVER:Buffer Manager\Page lookups/sec" />
    <Counter Name="\SQLSERVER:General Statistics\Logins/sec" />
    <Counter Name="\SQLSERVER:General Statistics\User Connections" />
    <Counter Name="\SQLSERVER:Locks(*)\Lock Requests/sec" />
    <Counter Name="\SQLSERVER:Memory Manager\Memory Grants Pending" />
    <Counter Name="\SQLSERVER:Memory Manager\Total Server Memory (KB)" />
    <Counter Name="\SQLSERVER:SQL Statistics\Batch Requests/sec" />
    <Counter Name="\SQLSERVER:SQL Statistics\SQL Compilations/sec" />
    <Counter Name="\SQLSERVER:SQL Statistics\SQL Re-Compilations/sec" />
    <Counter Name="\System\Processor Queue Length" />
    <Counter Name="\System\Threads" />
    <Counter Name="\System\Context Switches/sec" />
  </PerformanceCounters>
  <Filtering>
    <MetricFilter Name="isatap" />
    <MetricFilter Name="teredo tunneling" />
  </Filtering>
  <Logging>
    <VerboseOutput>True</VerboseOutput>
  </Logging>
</Configuration>

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.