SRE 必备利器:域名 DNS 探测排障工具

  金牌会员 | 2024-5-17 03:54:21 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 872|帖子 872|积分 2616

问题背景

访问某个 HTTP 域名接口,偶发性超时,原因可能多种多样,比如 DNS 解析问题、网络质量问题、对端服务负载问题等,在客户端没有精良埋点的情况下,排查起来比较费劲,只能挨个方向尝试,这里送各人一个小工具,可以快速采样 DNS 解析延迟,快速确认是否是 DNS 解析问题。
使用演示

运行工具,传入域名,就开始探测,每秒探测一次,假如想控制频率,也可以传入第二个参数,比如 0.2 秒探测一次。
  1. ulric@ulric-flashcat dns-lookup-latency % ./dns-lookup-latency baidu.com 0.2
  2. Apr  7 09:25:15.414 : 26.060 ms
  3. Apr  7 09:25:15.641 : 3.505 ms
  4. Apr  7 09:25:15.846 : 4.584 ms
  5. Apr  7 09:25:16.051 : 1.515 ms
  6. Apr  7 09:25:16.253 : 6.028 ms
  7. Apr  7 09:25:16.460 : 3.329 ms
  8. Apr  7 09:25:16.665 : 2.943 ms
  9. Apr  7 09:25:16.869 : 3.513 ms
  10. Apr  7 09:25:17.073 : 1.969 ms
  11. Apr  7 09:25:17.276 : 2.194 ms
  12. Apr  7 09:25:17.480 : 2.394 ms
  13. Apr  7 09:25:17.683 : 2.211 ms
  14. Apr  7 09:25:17.886 : 3.497 ms
  15. Apr  7 09:25:18.090 : 3.816 ms
  16. Apr  7 09:25:18.294 : 1.672 ms
  17. Apr  7 09:25:18.496 : 2.913 ms
  18. Apr  7 09:25:18.700 : 2.693 ms
  19. Apr  7 09:25:18.904 : 2.640 ms
复制代码
冒号前面是时间戳,冒号背面是 DNS 解析延迟时间,单位是毫秒。对于内网域名解析,延迟一样寻常都比较小,假如延迟偶发性变大,那就可以甩锅给 DNS 维护职员了。
工具源码

这个需求比较简朴,可以用 shell 实现,不外我是用 go 实现的,代码如下:
https://github.com/UlricQin/dns-lookup-latency
  1. package main
  2. import (
  3.         "fmt"
  4.         "net"
  5.         "os"
  6.         "strconv"
  7.         "time"
  8. )
  9. func main() {
  10.         if len(os.Args) < 2 {
  11.                 fmt.Printf("Usage: %s <domain> <interval-seconds>\n", os.Args[0])
  12.                 os.Exit(1)
  13.         }
  14.         domain := os.Args[1]
  15.         interval := 1.0
  16.         if len(os.Args) == 3 {
  17.                 f, err := strconv.ParseFloat(os.Args[2], 64)
  18.                 if err != nil {
  19.                         fmt.Printf("failed to parse interval(%s): %v\n", os.Args[2], err)
  20.                         os.Exit(1)
  21.                 }
  22.                 interval = f
  23.         }
  24.         duration := time.Millisecond * time.Duration(interval*1000)
  25.         for {
  26.                 resolveDomain(domain)
  27.                 time.Sleep(duration)
  28.         }
  29. }
  30. func resolveDomain(domain string) {
  31.         startTime := time.Now()
  32.         _, err := net.LookupIP(domain)
  33.         elapsed := time.Since(startTime)
  34.         if err != nil {
  35.                 fmt.Printf("%v : %v\n", startTime.Format(time.StampMilli), err)
  36.                 return
  37.         }
  38.         fmt.Printf("%v : %.3f ms\n", startTime.Format(time.StampMilli), elapsed.Seconds()*1000)
  39. }
复制代码
不到 50 行代码,核心就是一个 net.LookupIP 函数,核心代码还是我向 gpt 咨询的,哈哈。另外,我给各人打包好了二进制文件,可以直接下载使用:
https://github.com/UlricQin/dns-lookup-latency/releases


如上知识,盼望对你有资助。文末请允许我插播一个小广告。本人创业两年了,我们公司的业务如下,假如你有这方面的需求,欢迎联系我们做产品技能交流哈。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表