在基于推送的监控系统中,发出的指标或事件要么直接从生产应用程序发送,要么从本地代理发送到收集服务,如下所示:
Figure 1.1: Push-based monitoring system
处理原始事件数据的系统通常更喜欢推送,因为事件生成的频率非常高——每个实例每秒数百、数千甚至数万次——这将使轮询数据变得不切实际和复杂。需要某种缓冲机制来保持轮询之间生成的事件,与仅推送数据相比,事件新鲜度仍然是一个问题。使用这种方法的一些示例包括 Riemann、StatsD、Elasticsearch、Logstash 和 Kibana(ELK ) 堆。
这并不是说只有这些类型的系统使用推送。一些监控系统,例如 Graphite、OpenTSDB,以及 Telegraf、InfluxDB、Chronograph 和 Kapacitor(TICK) 堆栈是使用这种方法设计的。即使是好的旧 Nagios 也支持通过 Nagios Service Check Acceptor (NSCA) 推送,通常称为被动检查:
Figure 1.2: Pull-based monitoring system
相比之下,基于拉的监控系统直接从应用程序或从使这些指标对系统可用的代理进程收集指标。一些著名的使用 pull 的监控软件是 Nagios 和 Nagios 风格的系统(Icinga、Zabbix、Zenoss 和 Sensu,仅举几例)。 Prometheus 也是接受拉取方法的公司之一,并且对此非常固执己见。