当前位置: 首页 > 知识库问答 >
问题:

powershell石墨

卢普松
2023-03-14
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检查了发送到graphite服务器的输出。与只有LF的linux相反,在windows中,消息被附加了CRLF。我手工添加了\n,在一小段时间内,它确实发挥了作用,但现在它停止工作了。

我的问题是,我在传输中做错了什么,因为我一直在分析trafic,来自linux机器的流量和来自windows的流量之间唯一的区别是线结束符。在linux中,它的LF(0a)和在windows中是CRLF(0d0a),但我再次尝试从linux发送LFCRLF(0a0d0a),希望graphite服务器只读,直到第一个LF和than interepret消息,但我仍然没有使用图形。

另外,当我从linux传输时,我只有一条消息,而当我从powershell传输时,我有三条消息。从我在carbon-cache进程中使用strace所看到的情况来看,我有一个recvfrom系统调用,其中包含我想要的消息,i还有一个空的系统调用和write系统调用(当从powershell传输时),而不是一个recvfrom包含消息和write(当在linux上使用netcat传输时),

共有1个答案

丰岳
2023-03-14

似乎没有人提供任何建议,因此我遵循了另一种方法。我仍然很好奇为什么石墨不能解释我发送的信息。这个问题的解决方案是使用UDP套接字而不是TCP套接字,并将指标发送到statsd,后者将它们发送到Graphite。这似乎没有任何复杂的工作,如果您仔细考虑,这对您的网络更好,因为它最大限度地减少了通信量(如果您将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循环的频率。

 类似资料:
  • 取水滴石穿之意,计划类app,一切始于计划成于计划。 使用html5+ + mui+hbuilder构建 基于html5+规范 HTML5中国产业联盟,简称“HTML5+联盟”,是为了更好的推进HTML5的商用、更好的为HTML5开发者服务而由产 业链主流厂商共同组成的一个联盟。 基于mui 最接近原生APP体验的高性能前端框架 基于nativejs 如果说nodejs把js带向服务器,那么nat

  • PowerShell 是一个跨平台的 (Windows, Linux 和 OS X) 自动化和配置工具(框架),可以和已有的工具友好集成,特别优化用于处理结构化数据 (如 JSON, CSV, XML 等), REST APIs 以及对象模型。它包含一个命令行 Shell、一个关联的脚本语言以及一个用于处理 cmdlets 的框架。 PowerShell 就相当于 Linux 下的 Bash 以及

  • 在我的docker服务器上,我在sidekiq/redis URL-URL-Sespecification上出错: 我明白了 URI::InvalidURIError:方案redis不接受注册表部分:bsc\u redis:6379(或错误的主机名?)来自/usr/local/lib/ruby/2.0.0/uri/generic。rb:214:innew'from/usr/local/lib/ru

  • 我想检查是否存在某种类型。例如: 但是GetType()不适用于我的“测试”类型。

  • 问题内容: 似乎Quartz Scheduler每秒可以运行的作业数量受到限制。在我们的方案中,我们每秒大约有20个作业,可以进行24x7的启动,而石英可以很好地完成每秒10个作业(对于JDBC支持的JobStore,它具有100个石英线程和100个数据库连接池大小),但是,当我们将其增加到20个时每秒的作业数量,石英变得非常非常慢,与实际的计划时间相比,石英的触发作业非常晚,从而导致许多失火,并

  • 我正在使用带有TerracottaJobStore Class的石英调度程序来每5分钟调度一次作业。我的工作配置是: 组织。石英jobStore。class=org。陶土。石英EnterpriseTerracottaJobStore组织。石英jobStore。tcconfig=localhost:9510 org。石英线程池。线程数=25 我有一个附加了5000个触发器的单个作业,然后该作业被安排