如何使用 ELK 堆栈监控 nginx 响应时间?

How to monitor nginx response time with ELK stack?

我想创建一个监视器来显示 nginx 的近乎实时的平均响应时间。

下图显示了 CPU 用法,例如,我想为 avg response time

创建类似的东西

我知道如何跟踪单个请求的响应时间(https://lincolnloop.com/blog/tracking-application-response-time-nginx/)

尽管我将不得不考虑如何忽略非页面/api 请求,例如静态图像请求。

这一定是非常基本的要求,但找不到google如何去做。

这实际上比您预期的要棘手:

Metricbeat

Metricbeat 的 nginx 模块不包含此信息。它是围绕 stubstatus and is more around the process itself 而不是单个请求的时间构建的。

Filebeat

Filebeat 的 nginx 模块是您可能期望的地方。它围绕 nginx 访问日志构建,并具有单独的请求。不幸的是,默认情况下响应时间不是访问日志的一部分(至少在 Ubuntu 上)——只是发送的字节数。这是一个示例(响应代码 200,已发送 158 个字节):

34.24.14.22 - - [10/Nov/2019:06:54:51 +0000] "GET / HTTP/1.1" 200 159 "-" "Go-http-client/1.1"

Packetbeat

这个有一个名为 event.duration 的字段,听起来很有希望。但是要小心 HTTP 模块——这个模块实际上只用于 HTTP 流量而不是 HTTPS(因为你看不到加密的流量)。在大多数情况下,您会希望为您的应用程序使用 HTTPS,因此这并不是很有帮助,并且主要显示到 HTTPS 的重定向。

其他协议如TLS(这只是初始握手的时间)或流信息(这是一个group of packets)不是你在IMO之后的。

自定义

恐怕你需要一些定制,你基本上有两个选择:

  1. 按照您链接到的博客 post 中的描述自定义 nginx 的日志格式。您还需要更改 Elasticsearch 摄取管道中的模式以正确提取计时信息。
  2. 我假设你有一个支持 nginx 的应用程序。然后,您可能希望通过将 (APM / tracing](https://www.elastic.co/products/apm) 与各种语言的代理一起使用来获得更多的洞察力,而不仅仅是计时。这样您还可以自动跳过图像等静态资源并专注于你申请的相关部分。