私は 1 つのサーバーにグラファイトのインスタンスを構成しており、それを使用して、悲しいことに Linux と Windows の両方のマシンで構成される環境を監視しています。サーバーの正常性を監視したいので、Linux マシンでシステム統計を収集する良い仕事をする collectl を選択しました。
悲しいことに、Windows の場合、システム統計を取得してグラファイトに送信するためのソリューションはそれほど多くないようですが、私はこの状況を powershell で処理することができました。ここで提案されたスクリプトを使用していますhttp://josh.behrends.us/2012/07/windows-powershell-graphite-awesome/グラファイト接続と、使用しているコンピューターからメトリックを取得するためget-counter コマンドレットは、驚くべきことに、多くの情報を収集できます。
私のスクリプトは次のようになります。
while (1 -eq 1)
{
$carbonServer = "hostname"
$carbonServerPort = 2003
$epochtime = [int][double]::Parse((Get-Date -UFormat %s))
$socket = New-Object System.Net.Sockets.TCPClient
$socket.connect($carbonServer, $carbonServerPort)
$stream = $socket.GetStream()
$writer = new-object System.IO.StreamWriter($stream)
#Write out metric to the stream.
$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
$metric7 = ("hostname.metrics.WriteOp " + $WriteOp + " " + $epochTime+"`n")
$metric7
$writer.WriteLine($metric7)
$writer.Flush() #Flush and write our metrics.
$writer.Close()
$stream.Close()
sleep 5
}
これで、このスクリプトは一見すると想定どおりの出力を実行します。出力にはフォーマットhostname.metrics.name $metric_value $epochTime
がありますが、グラフ化されているグラフはありません。それらはグラファイト ダッシュボードに表示されますが、空です。グラファイト サーバーに送信された出力を、wireshark で調べました。LFしかないLinuxとは対照的に、WindowsではメッセージにCRLFが追加されるようです。私は手で追加\n
しましたが、しばらくの間はうまくいきましたが、今は機能しなくなりました。
私の質問は、トラフィックを分析していて、グラフ化されたLinuxマシンからのトラフィックとグラフ化されていないウィンドウからのトラフィックの唯一の違いは、ラインターミネータであるため、送信で何か間違ったことをしているのでしょうか。Linux では LF(0a) で、Windows では CRLF(0d0a) ですが、再び Linux LFCRLF(0a0d0a) から送信しようとしましたが、グラファイト サーバーが最初の LF までしか読み取らず、メッセージを解釈することを望んでいますが、それでも私は ' m グラフが表示されません。
また、Linux から送信する場合はメッセージが 1 つしかなく、powershell から送信する場合は 3 つのメッセージがあります。カーボン キャッシュ プロセスで strace を使用して見たものから、必要なメッセージを含む recvfrom システム コールが 1 つあります。メッセージと書き込みを含む1つのrecvfromのみ(Linuxでnetcatを使用して送信する場合)、