如何在 Node.js/RoR 中监控 20 个网站(Ping 或 HTTP)的正常运行时间

How to Monitor Uptime of 20 Websites (Ping or HTTP) in Node.js/RoR

提问人:donald 提问时间:1/17/2011 最后编辑:700 Softwaredonald 更新时间:2/9/2015 访问量:8239

问:

例如,每 5 分钟对 20 个网站列表执行 ping 操作以了解该站点是否使用 HTTP 202 响应的最佳方法是什么?

不费吹灰之力的想法是将 20 个 URL 保存在数据库中,然后运行数据库并 ping 每个 URL。但是,当一个人不回答时会发生什么?在那之后会发生什么?

另外,有没有更好但更简单的解决方案?恐怕这个列表可以增长到 20000 个网站,然后没有足够的时间在我需要 ping 的 5 分钟内 ping 它们。

基本上,我正在描述 PingDom、UptimeRobot 等是如何工作的。

我正在使用 node.js 和 Ruby on Rails 构建这个系统。 我也倾向于使用MongoDB来保存所有ping和监控结果的历史记录。

建议?

非常感谢!

Ruby Ruby-on-Rails-3 节点.js pingdom

评论

0赞 the Tin Man 1/17/2011
此问题是今天早些时候迁移到服务器故障的类似问题的重新提交。
1赞 donald 1/17/2011
不,不是。这与编程有关。不是 Windows 命令。请不要将其移至服务器故障。
0赞 Mladen Jablanović 1/17/2011
是我错了,还是您本质上是在问如何构建强大、可靠和可扩展的网络监控应用程序?:)我认为你应该更具体。
0赞 donald 1/17/2011
@Mladen,基本上就是这样;)你能告诉我你会怎么做吗?谢谢!
0赞 Richard Knop 5/24/2016
您可以使用其中一个应用程序来实现此目的,例如 Pingdom 或由我开发的名为 Pinglist 的正常运行时间和性能监控应用程序:pingli.st

答:

0赞 c2h2 1/17/2011 #1

使用 Zabbix、Nagios、等等等监控工具,它们可以大量测量服务器的各种参数。

如果你想在JS中实现它,你可以做一个时间间隔的HTTP请求,然后确定HTTP返回状态码,并使用XPath或正则表达式来验证某个元素是否正确

对于 Ruby,一个守护进程,并使用线程池(多线程思想)和 URI open 来查看 HTTP 代码和内容,使用 XPath 来验证内容的行为是否正确。

9赞 Alfred 1/17/2011 #2

Github的

我真的很喜欢node.js,我想解决这个问题,并希望很快在github上分享一些代码来实现这一目标。请记住,我现在只有一个非常基本的设置托管在 https://github.com/alfredwesterveld/freakinping

ping 列表的最佳方式是什么 每 5 分钟 20 个网站(用于 example)以了解网站是否 是否响应 HTTP 202?

平(ICMP)

首先,我想知道你是否真的想做一个ping(ICMP),或者你是否只是想知道网站是否返回代码200(OK)并测量它所花费的时间。我相信从上下文来看,您并不是真的想做 ping,而只是想做一个 http 请求并测量时间。我问这个问题是因为(我相信)从 node.js/ruby/python 执行 ping 操作无法从普通用户完成,因为我们需要原始套接字(root 用户)从编程语言执行 ping(ICMP)。例如,我在 python 中找到了这个 ping 脚本(我也相信我在某处看到了一个简单的 ruby 脚本,尽管我不是一个非常大的 ruby 程序员),但需要 root 访问权限。我甚至不相信那里还没有用于 node.js 的 ping 模块。

消息队列

另外,有没有更好但不费吹灰之力 解决方案?恐怕名单 可以增长到 20000 个网站,然后 没有足够的时间来 ping 它们 在我需要的 5 分钟内 ping。

基本上,我描述了 PingDom 如何, UptimeRobot等工作。

要实现这种规模,您需要使用消息队列,例如 redisbeanstalkd 或 gearmand。在 PingDom 的规模上,一个工作进程不会削减它,但在你的情况下,它(我假设)一个工人会做。我认为(假设)redis 将是最快的消息队列,因为 C(node.js) 扩展,但话又说回来,我应该将其与 beanstalkd 进行基准测试,beanstalkd 是另一个流行的消息队列(但还没有 C 扩展)。

恐怕这个名单可以增长到20000 网站链接

如果你达到这个规模,你可能必须有多个盒子(很多工作线程/进程)来处理负载,但你还没有达到这个规模,node.js的速度非常快。它甚至可能用一个盒子来处理该负载,尽管我不确定(您需要执行/运行一些基准测试)。

数据存储/Redis

我认为这可以在 node.js 中轻松实现(我真的很喜欢 node.js)。我这样做的方法是使用 redis 作为我的数据存储,因为它非常快!

PING: 20000 ops 46189.38 ops/sec 1/4/1.082
SET: 20000 ops 41237.11 ops/sec 0/6/1.210
GET: 20000 ops 39682.54 ops/sec 1/7/1.257
INCR: 20000 ops 40080.16 ops/sec 0/8/1.242
LPUSH: 20000 ops 41152.26 ops/sec 0/3/1.212
LRANGE (10 elements): 20000 ops 36563.07 ops/sec 1/8/1.363
LRANGE (100 elements): 20000 ops 21834.06 ops/sec 0/9/2.287

使用 node_redis(使用 hredis(node.js) C 库)。我会使用 sadd 将 URL 添加到 redis。

每 5 分钟运行一次任务

这几乎可以不费吹灰之力地实现。我会使用 来反复测试服务器的响应时间。使用 smembers 从 redis 获取所有 URL。我会使用 rpush 将所有 URL(消息)放在消息队列中。setInterval(callback, delay, [arg], [...])callback

检查响应(时间)

但是,当一个人不这样做时会发生什么 答案?那些会发生什么 然后?

我可能不完全理解这句话,但就在这里。如果一个人失败了,它就会失败。您可以尝试在 5 秒后再次检查 response(time) 或其他东西,看看它是否在线。应该为此设计一个精确的算法。之后的 URL 应该与以前的 URL 没有任何关系,除非它们指向同一台服务器。我想,您也清楚地考虑过一些事情,因为这样您就不应该同时将所有这些 URL ping 到同一台服务器,而是将它们排队或其他什么。

处理 URL

从工作进程(现在只有一个就足够了)使用 brpop 命令从 redis 获取消息 (URL)。检查 URL(message) 的响应时间,并从列表中获取下一个 URL(message)。我可能会同时执行几个请求以加快该过程。

评论

0赞 donald 1/17/2011
精益求精!;)如果您编写了一些代码并将其发布到 GitHub 上,请告诉我!优秀的帖子!
0赞 Alfred 1/18/2011
我在 github 上托管了一个非常基本的项目设置,我喜欢在以后继续工作 => github.com/alfredwesterveld/freakinping
0赞 donald 1/18/2011
我去看看!谢谢。顺便说一句,你用什么来测试?谢谢。
0赞 Alfred 1/18/2011
现在我还没有任何测试。我想我应该为自己感到羞耻。这是清单上的大事之一!
0赞 donald 1/18/2011
@Alfred,我很想听听你对此的回答:stackoverflow.com/questions/4713751/......
0赞 Austin 11/9/2011 #3

如果你很好奇,我创建了一个名为 Pinger 的应用程序来做到这一点。它基于 Ruby on Rails 和 Resque 构建:

https://github.com/austinthecoder/pinger

5赞 François Zaninotto 5/3/2012 #4

没有“基本方法”,因为您必须处理很多用例:

  • HTTP 重定向,
  • https 页面,
  • 请求超时,
  • 用于 ping 的服务器的 CPU 负载,
  • 您需要的报告类型(可用性?正常运行时间?反应?停机时间?
  • 如何按时间聚合 QoS 测量值
  • 您收集的数据的生命周期(每五分钟对数十个目标执行 ping 操作,快速生成大量数据)
  • 实时警报
  • 等。

Pingdom 等不是“基本”工具,如果您想要类似的东西,您可能需要付费或依赖现有的开源替代品。我肯定知道这一点,因为我自己构建了一个远程监控应用程序。它被称为 Uptime,它是用 Node.js 和 MongoDB 编写的,它托管在 GitHub (https://github.com/fzaninotto/uptime) 上。开发它花了几个星期的艰苦工作,所以相信我:这不是一件容易的事。

0赞 Phuc 4/30/2014 #5

有一些免费的优质服务为我们提供了非常稳定的网站正常运行时间检查和通知。您可以查看此说明并查看 http://fastjoomlahost.com/how-to-monitor-website-up-time

0赞 codelion 2/9/2015 #6

您也可以在 Node.js 中使用 node-ping-monitor 软件包执行此操作。