我在一台服务器上配置了一个石墨实例,我用它来监视我的环境,遗憾的是它由 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检查了发送到石墨服务器的输出。它接缝在 Windows 中,消息附加有 CRLF,而不是在只有 LF 的 linux 中。我\n
手动添加了一小段时间,它成功了,但现在它停止了工作。
我的问题是我在传输过程中做错了什么,因为我一直在分析流量,来自被绘制图形的 linux 机器和来自未绘制图形的 Windows 的流量之间的唯一区别是线路终止符。在 linux 中它的 LF(0a) 和 windows 中是 CRLF(0d0a),但我再次尝试从 linux LFCRLF(0a0d0a) 发送,希望石墨服务器只会读取到第一个 LF,而不是解释消息,但我仍然' m 没有得到图表。
此外,当我从 linux 传输时,我只有一条消息,而当我从 powershell 传输时,我有三条消息。从我在 carbon-cache 进程上看到的 strace 中,我有一个带有我想要的消息的 recvfrom 系统调用,而我有另一个是空的和写系统调用(从 powershell 传输时)而不是哟只有一个带有消息和写入的recvfrom(在linux上使用netcat传输时),