SRE 必備利器:域名 DNS 探測排障工具

SRETalk發表於2024-04-12

問題背景

訪問某個 HTTP 域名介面,偶發性超時,原因可能多種多樣,比如 DNS 解析問題、網路質量問題、對端服務負載問題等,在客戶端沒有良好埋點的情況下,排查起來比較費勁,只能挨個方向嘗試,這裡送大家一個小工具,可以快速取樣 DNS 解析延遲,快速確認是否是 DNS 解析問題。

使用演示

執行工具,傳入域名,就開始探測,每秒探測一次,如果想控制頻率,也可以傳入第二個引數,比如 0.2 秒探測一次。

ulric@ulric-flashcat dns-lookup-latency % ./dns-lookup-latency baidu.com 0.2
Apr  7 09:25:15.414 : 26.060 ms
Apr  7 09:25:15.641 : 3.505 ms
Apr  7 09:25:15.846 : 4.584 ms
Apr  7 09:25:16.051 : 1.515 ms
Apr  7 09:25:16.253 : 6.028 ms
Apr  7 09:25:16.460 : 3.329 ms
Apr  7 09:25:16.665 : 2.943 ms
Apr  7 09:25:16.869 : 3.513 ms
Apr  7 09:25:17.073 : 1.969 ms
Apr  7 09:25:17.276 : 2.194 ms
Apr  7 09:25:17.480 : 2.394 ms
Apr  7 09:25:17.683 : 2.211 ms
Apr  7 09:25:17.886 : 3.497 ms
Apr  7 09:25:18.090 : 3.816 ms
Apr  7 09:25:18.294 : 1.672 ms
Apr  7 09:25:18.496 : 2.913 ms
Apr  7 09:25:18.700 : 2.693 ms
Apr  7 09:25:18.904 : 2.640 ms

冒號前面是時間戳,冒號後面是 DNS 解析延遲時間,單位是毫秒。對於內網域名解析,延遲一般都比較小,如果延遲偶發性變大,那就可以甩鍋給 DNS 維護人員了。

工具原始碼

這個需求比較簡單,可以用 shell 實現,不過我是用 go 實現的,程式碼如下:

https://github.com/UlricQin/dns-lookup-latency

package main

import (
	"fmt"
	"net"
	"os"
	"strconv"
	"time"
)

func main() {
	if len(os.Args) < 2 {
		fmt.Printf("Usage: %s <domain> <interval-seconds>\n", os.Args[0])
		os.Exit(1)
	}

	domain := os.Args[1]

	interval := 1.0
	if len(os.Args) == 3 {
		f, err := strconv.ParseFloat(os.Args[2], 64)
		if err != nil {
			fmt.Printf("failed to parse interval(%s): %v\n", os.Args[2], err)
			os.Exit(1)
		}
		interval = f
	}

	duration := time.Millisecond * time.Duration(interval*1000)

	for {
		resolveDomain(domain)
		time.Sleep(duration)
	}
}

func resolveDomain(domain string) {
	startTime := time.Now()
	_, err := net.LookupIP(domain)
	elapsed := time.Since(startTime)

	if err != nil {
		fmt.Printf("%v : %v\n", startTime.Format(time.StampMilli), err)
		return
	}

	fmt.Printf("%v : %.3f ms\n", startTime.Format(time.StampMilli), elapsed.Seconds()*1000)
}

不到 50 行程式碼,核心就是一個 net.LookupIP 函式,核心程式碼還是我向 gpt 諮詢的,哈哈。另外,我給大家打包好了二進位制檔案,可以直接下載使用:

https://github.com/UlricQin/dns-lookup-latency/releases

如上知識,希望對你有幫助。文末請允許我插播一個小廣告。本人創業兩年了,我們公司的業務如下,如果你有這方面的需求,歡迎聯絡我們做產品技術交流哈。

🎯 關於快貓星雲

快貓星雲是一家雲原生智慧運維科技公司,由知名開源專案“夜鶯(Nightingale)”的核心開發團隊組成,創始團隊均來⾃阿⾥、百度、滴滴等互聯⽹公司。夜鶯是一款開源雲原生監控工具,是中國計算機學會接受捐贈並託管的第一個開源專案,在GitHub上有超過8000顆星,迭代釋出了超過100多個版本,上百位社群貢獻者,是國內領先的開源可觀測性解決方案。

快貓星雲以開源夜鶯為核心打造的“Flashcat平臺”,是國內頂級互聯⽹公司可觀測性實踐的產品化落地,致力於讓可觀測性技術更好的服務企業,保障服務穩定性。Flashcat 平臺具有以下特點:

  • 統一採集:採用外掛化思路,內建整合上百種採集外掛,伺服器、網路裝置、中介軟體、資料庫、應用、業務,均可監控,開箱即用。
  • 統一告警:支援幾十種資料來源對接,收集各類監控系統的告警事件,進行統一的告警收斂、降噪、排班、認領、升級、協同,大幅提升告警處理效率。
  • 統一觀測:將 Metrics、Logs、Traces、Events、Profiling 等多種可觀測性資料融會貫通,並預置行業最佳實踐,既提供全域性業務視角、技術視角的駕駛艙,也提供層層下鑽的故障定位能力,有效縮短故障發現和定位時間。

快貓星雲,讓可觀測性資料更有價值!
https://flashcat.cloud/

相關文章