6

私は 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を使用して送信する場合)、

4

3 に答える 3

3

誰も提案を提供しなかったようです。そのため、私は別のアプローチに従いました。Graphite が送信したメッセージを解釈しない理由について、私はまだ非常に興味があります。この問題の解決策は、TCP ソケットの代わりに UDP ソケットを使用し、メトリクスを statsd に送信することでした。これは問題なく動作するようです。考えてみれば、トラフィックが最小限に抑えられるため、ネットワークにとってより良い方法です (同じノードに statsd と Graphite を保持している場合)。

誰かが私の問題に遭遇し、彼の環境が私の​​ものに似ている場合に備えて、スクリプトを投稿しています。ここにスクリプトがあります

[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 
    }
}

スクリプトは拡張可能で、実行するだけで多くのことを監視できget-counter -ListSet *ます。TaskScheduler を使用してスクリプトをインストールしました。sleep を挿入することで、while ループで頻度を制御できます。

于 2012-10-30T11:13:10.207 に答える
1

Graphite にメトリクスを簡単に送信するのに役立つ一連の PowerShell 関数を作成しました。すべての Windows パフォーマンス カウンターと、それらを Graphite サーバーに送信する頻度を構成できます。完全なソース コードはこちら: https://github.com/MattHodge/Graphite-PowerShell-Functions

于 2014-02-08T21:09:03.903 に答える