0%

logagent 根据 IP 获取配置

logagent 根据 IP 获取配置

1 上一个版本的问题

  • 每台服务器上的 logagent 的收集项可能都不一致,我们需要让 logagent 去 etcd 中根据 IP 地址获取自己的配置

2 如何获取本机的 IP

2.1 net.InterfaceAddrs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func GetLocalIP() (ip string, err error) {
addrs, err := net.InterfaceAddrs() // 获取所有的网卡IP
if err != nil {
return "", err
}
for _, addr := range addrs {
ipAddr, ok := addr.(*net.IPNet)
if !ok {
continue
}

if ipAddr.IP.IsLoopback() {
continue
}

if !ipAddr.IP.IsGlobalUnicast() {
continue
}

return ipAddr.IP.String(), nil
}
return "", fmt.Errorf("empty ip addr list")
}

2.2 net.Dial

1
2
3
4
5
6
7
8
9
10
11
// Get preferred outbound ip of this machine
func GetOutboundIP() (string, error) {
conn, err := net.Dial("udp", "8.8.8.8:80")
if err != nil {
return "", err
}
defer conn.Close()

localAddr := conn.LocalAddr().(*net.UDPAddr)
return strings.Split(localAddr.IP.String(), ":")[0], nil
}

3 logagent 中集成根据 ip 拉取配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func GetCollectConfig(ip string) (config []common.CollectConfigEntry, err error) {
key := fmt.Sprintf(conf.DefaultConfig.ETCD.CollectConfKey, ip)
logrus.Info("etcd key:", key)
configStr, err := GetValue(key)
if err != nil {
logrus.Errorf("get collect config error: %w", err)
return nil, err
}
err = json.Unmarshal([]byte(configStr), &config)
if err != nil {
logrus.Errorf("unmarshal config str error: %w", err)
return nil, err
}
return config, nil
}
  • 根据本机 ip 计算出在 etcd 配置中心的 key,从而取出配置项