Telegraf 守护程序未从使用 Dokku 部署的应用程序接收指标
Telegraf daemon not receiving metrics from app deployed with Dokku
过去我已经用 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
而且我可以在 Grafana 内部可视化 foobar
计数器增量。
所以我猜问题是由于 myapp
或我如何配置 Dokku。
在我的应用程序(一个节点 JS 应用程序)中,我使用 hot-shots package to send metrics (also tried with 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 请求到本地主机?
- 我可以做些什么来进一步调试它?
正如作者在另一个线程中所要求的那样,解决方案似乎是:
只有当你想监听未发送的请求时才需要打开端口。默认情况下 Docker 为您的容器提供必要的网络命名空间,以便与主机或外界通信。
因此,您可以通过两种方式完成:
在您的 docker run
中使用 --net host
并将请求发送到 localhost:8125
在这种情况下,您的容器化应用程序有效地共享主机的网络堆栈。所以 localhost 指向主机中已经 运行 的守护进程。
与容器网络网关(通常是 172.17.0.1
)或容器中主机的主机名对话。然后您就可以将数据包发送到主机中的守护进程。
过去我已经用 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
而且我可以在 Grafana 内部可视化 foobar
计数器增量。
所以我猜问题是由于 myapp
或我如何配置 Dokku。
在我的应用程序(一个节点 JS 应用程序)中,我使用 hot-shots package to send metrics (also tried with 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 请求到本地主机?
- 我可以做些什么来进一步调试它?
正如作者在另一个线程中所要求的那样,解决方案似乎是:
只有当你想监听未发送的请求时才需要打开端口。默认情况下 Docker 为您的容器提供必要的网络命名空间,以便与主机或外界通信。
因此,您可以通过两种方式完成:
在您的
docker run
中使用--net host
并将请求发送到localhost:8125
在这种情况下,您的容器化应用程序有效地共享主机的网络堆栈。所以 localhost 指向主机中已经 运行 的守护进程。与容器网络网关(通常是
172.17.0.1
)或容器中主机的主机名对话。然后您就可以将数据包发送到主机中的守护进程。