Grafana新版本中的mDNS问题排查(mDNS系列2)

起因

近期将使用的Grafana的Docker镜像升级到了最新版本,却发现面板都报错了。在查找了一下后发现因为我数据源中的Host或URL字段都是使用的mDNS(.local)的域名,导致无法解析IP地址。

分析

因为我是在Grafana的Docker镜像的基础上经行了mDNS支持,Dockerfile如下:

1
2
3
FROM grafana/grafana:latest-ubuntu
USER root
RUN apt-get update && apt-get install avahi-utils -y

注:使用时需要挂载/run/avahi-daemon/socket

所以首先进入了运行中的容器测试了一下mDNS本身是否可用,有没有因为系统的其他组件的问题导致无法使用。发现没有问题,使用avahi-resolve-address等命令时也可以得到正确的结果。(注:此时需要挂载/var/run/dbus

接着添加环境变量GODEBUG=netdns=cgo+2重新运行容器,看打印出的日志,发现也没有问题,grafana使用的也是cgo。(注:纯Go版本的解析器是不支持mDNS的)

然后又用同版本的Golang编译了一个简单的Demo,放到了容器的环境下执行,发现同样可以解析mDNS,也没有问题。

此时常规排查陷入了僵局,无奈只能去翻Grafana官方文档及相关源码。

经过一番痛苦的排查后,终于发现了蛛丝马迹。原来Grafana在编译时使用的是基于Alpine镜像的Golang版本,且使用了参数-ldflags "-linkmode 'external' -extldflags '-static'",将库静态编译了进去,此时使用的libc是musl libc,而musl libc是不支持 NSS (Name Service Switch)的。接着将编译好的文件放到了基于Ubuntu的镜像中用于运行。所以即使运行环境是gnu libc,支持mDNS,但实际上Grafana使用的还是静态编译的musl libc,所以解析mDNS失败。

结果

知道了原因就有办法了,我选择了较为简单的一种。通过二分测试,找到了更改参数前的最后一个版本的Grafana,即10.0.3版本来使用,接着向官方提了Issue以期早日修复,具体详见参考1的链接。在刚发Issue后,官方就有了回复,但之后近两个多月没有其它动静。本文修改时(2024-01-05),发现有官方人于前几天认领了这个Issue,希望有所进展吧。

参考

  1. Data source: can’t lookup IP address when I use mDNS(.local) in URL or Host field