2

过去我已经用 Telegraf+InfluxDB+Grafana 监控过 NodeJS 应用程序,但这是我第一次尝试监控 Dokku 应用程序,到目前为止还没有成功。

我有以下设置

app server                                          monitoring serveur
- telegraf daemon (listening on udp 8125)   ------> InfluxDB + Grafana
- dokku
  - myapp : sending metrics on localhost:udp:8125

我有一个问题,从myappon发送的指标udp://localhost:8125没有被telegraf.

从 telegraf 到 influxdb 和 grafana 的连接是好的,因为我在应用服务器上运行了以下命令:

echo "foobar:1|c" | nc -u -w0 127.0.0.1 8125

我可以在 Grafana 中看到foobar计数器增量。

所以我猜这个问题是由于myapp或者我是如何配置 Dokku 的。

在 myapp (一个节点 JS 应用程序)中,我使用hot-shots包发送指标(也尝试使用lynx没有成功)。

这是我用来实例化 statsd 客户端的代码。

var StatsD = require('hot-shots');
var client = new StatsD();
// Attaching an error handler to client's socket
client.socket.on('error', function(error) {
  console.error('StatsD client error in socket: ', error);
});

我在应用程序启动时增加一个计数器以发出重启信号。这是通过以下代码完成的:

metrics.increment('server_restart', function(err, bytes) {
  if (err) {
    console.log(err);
  } else {
    console.log('StatsD sent : ', bytes);
  }
});

在应用服务器内部,我dokku logs myapp在执行部署后运行。

我得到以下输出

$ dokku logs myapp
2017-05-06T14:51:19.977938845Z app[web.1]:
2017-05-06T14:51:19.977996938Z app[web.1]: > myapp@1.0.0 start /app
2017-05-06T14:51:19.978002950Z app[web.1]: > node .
2017-05-06T14:51:19.978005766Z app[web.1]:
2017-05-06T14:51:21.849086537Z app[web.1]: StatsD sent :  18
$

因此,似乎指标有效负载已在正确的端口上正确发送,但从未到达 telegraf。

  • 在 Dokku 中是否有任何配置可以授权外部 UDP 请求到 localhost ?
  • 我能做些什么来进一步调试呢?
4

1 回答 1

3

正如作者在另一个线程中要求的那样,解决方案似乎是:

默认情况下,docker容器可以调用主机的localhost UDP吗?

仅当您要侦听未发送的请求时才需要打开端口。默认情况下,Docker 为您的容器提供必要的网络命名空间,以便与主机或外部世界进行通信。

所以,你可以通过两种方式做到这一点:

  1. --net host在这种情况下,在您的容器化应用程序中使用docker run并向其发送请求localhost:8125是有效地共享主机的网络堆栈。所以 localhost 指向已经在你的主机中运行的守护进程。

  2. 从容器中与容器网络网关(通常是172.17.0.1)或主机的主机名交谈。然后您就可以将数据包发送到您主机中的守护进程。

于 2017-05-14T11:05:23.860 回答