我过去已经使用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
我遇到myapp
未收到udp://localhost:8125
telegraf
发送的指标的问题。
从telegraf到Influxdb和grafana的连接是可以的,因为我在应用服务器上运行了以下命令:
echo "foobar:1|c" | nc -u -w0 127.0.0.1 8125
我可以在格拉法纳内部看到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。
答案 0 :(得分:2)
正如作者在另一个主题中所要求的那样,解决方案似乎是:
By default, can a docker container call host's localhost UDP?
只有在您想要侦听未发送的请求时才需要打开端口。默认情况下,Docker为容器提供必要的网络命名空间,以便与主机或外部世界进行通信。
所以,你可以用两种方式做到:
在--net host
中使用docker run
并向localhost:8125
发送请求,在这种情况下,您的容器化应用有效地共享主机的网络堆栈。因此localhost指向已在主机中运行的守护程序。
与容器中的容器网络网关(通常为172.17.0.1
)或主机的主机名进行通信。然后,您就可以将数据包发送到主机中的守护程序。