問題背景
訪問某個 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/