Graphite with powershell
Seems that nobody provided any suggestions and as such i have followed another approach. I am still very curious as to why Graphite doesn't interpret my sent message. The solution to this problem was using a UDP socket instead of a TCP one and sending the metrics to statsd which in term sends them to Graphite. This seems to work without any complications, and in if you think about it it's better for your network because it minimizes traffic(if you keep statsd and Graphite on the same node).
I'm posting the script in case anyone encounters my problem and his environment resembles mine. Here is the script
[int] $Port = 8125
$IP = "here is your IP"
$Address = [system.net.IPAddress]::Parse($IP)
$End = New-Object System.Net.IPEndPoint $address, $port
$Saddrf = [System.Net.Sockets.AddressFamily]::InterNetwork
$Stype = [System.Net.Sockets.SocketType]::Dgram
$Ptype = [System.Net.Sockets.ProtocolType]::UDP
$Sock = New-Object System.Net.Sockets.Socket $saddrf, $stype, $ptype
$sock.Connect($end)
function Send_Graphite
{param ($Metric)
$Enc = [System.Text.Encoding]::ASCII
$Buffer = $Enc.GetBytes($Metric)
$Sent = $Sock.Send($Buffer)
"{0} characters sent to: {1} " -f $Sent,$IP
"Message is:"
$Metric
sleep 1
}
while (1 -eq 1)
{
$DiskQue = [int]((get-counter -Counter "\PhysicalDisk(1 e: f:)\Current Disk Queue Length" ).countersamples | select -property cookedvalue).cookedvalue
$BytesReceived = [int]((get-counter -Counter "\Server\Bytes Received/sec" ).countersamples | select -property cookedvalue).cookedvalue
$BytesSent = [int]((get-counter -Counter "\Server\Bytes Transmitted/sec").countersamples | select -property cookedvalue).cookedvalue
$MemAvail = ((get-counter -Counter "\Memory\Available Bytes").countersamples | select -property cookedvalue).cookedvalue
$MemCommit = ((get-counter -Counter "\Memory\Committed Bytes").countersamples | select -property cookedvalue).cookedvalue
$ReadOp = [int]((get-counter -Counter "\System\File Read Operations/sec").countersamples | select -property cookedvalue).cookedvalue
$WriteOp = [int]((get-counter -Counter "\System\File Write Operations/sec").countersamples | select -property cookedvalue).cookedvalue
$Message1 = "MAIN.OSmetrics.DiscQueue:"+$DiskQue+"|c"
$Message2 = "MAIN.OSmetrics.BytesReceived:"+$BytesReceived+"|c"
$Message3 = "MAIN.OSmetrics.BytesSent:"+$BytesSent+"|c"
$Message4 = "MAIN.OSmetrics.MemAvail:"+$MemAvail+"|c"
$Message5 = "MAIN.OSmetrics.MemCommit:"+$MemCommit+"|c"
$Message6 = "MAIN.OSmetrics.ReadOp:"+$ReadOp+"|c"
$Message7 = "MAIN.OSmetrics.WriteOp:"+$WriteOp+"|c"
$Mesages = $Message1, $Message2, $Message3, $Message4, $Message5, $Message6, $Message7
foreach($Message in $Mesages)
{
Send_Graphite $Message
}
}
The script is extensible and you can monitor a lot of things, just run get-counter -ListSet *
and you will see. I've installed the script with TaskScheduler, and you can control the frequency with the while loop by inserting a sleep.