Skip to content
This repository was archived by the owner on Jun 29, 2026. It is now read-only.

Commit aedcc1d

Browse files
committed
fix: Handle DNS resolver initialization failure gracefully
In a container debugging tool, broken DNS config (/etc/resolv.conf) is a likely scenario to diagnose. Log the error and skip DNS lookups instead of panicking.
1 parent 4044279 commit aedcc1d

1 file changed

Lines changed: 31 additions & 18 deletions

File tree

‎src/system_information/network.rs‎

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,24 @@ use std::{
1111
};
1212
use tokio::task::JoinSet;
1313

14-
static GLOBAL_DNS_RESOLVER: LazyLock<TokioResolver> = LazyLock::new(|| {
15-
let (resolver_config, mut resolver_opts) =
16-
read_system_conf().expect("failed to read system resolv config");
14+
static GLOBAL_DNS_RESOLVER: LazyLock<Option<TokioResolver>> = LazyLock::new(|| {
15+
let (resolver_config, mut resolver_opts) = match read_system_conf() {
16+
Ok(conf) => conf,
17+
Err(err) => {
18+
tracing::error!(
19+
error = &err as &dyn std::error::Error,
20+
"failed to read system DNS config, DNS lookups will be skipped"
21+
);
22+
return None;
23+
}
24+
};
1725
resolver_opts.timeout = Duration::from_secs(5);
1826

19-
TokioResolver::builder_with_config(resolver_config, TokioConnectionProvider::default())
20-
.with_options(resolver_opts)
21-
.build()
27+
Some(
28+
TokioResolver::builder_with_config(resolver_config, TokioConnectionProvider::default())
29+
.with_options(resolver_opts)
30+
.build(),
31+
)
2232
});
2333

2434
/// Captures all system network information, including network interfaces,
@@ -64,12 +74,19 @@ impl SystemNetworkInfo {
6474
let ips: BTreeSet<IpAddr> = interfaces.values().flatten().copied().collect();
6575
tracing::info!(network.addresses.ip = ?ips, "ip addresses");
6676

67-
let mut reverse_lookups = JoinSet::new();
77+
let Some(resolver) = GLOBAL_DNS_RESOLVER.as_ref() else {
78+
return SystemNetworkInfo {
79+
interfaces,
80+
reverse_lookups: HashMap::new(),
81+
forward_lookups: HashMap::new(),
82+
};
83+
};
84+
85+
let mut reverse_lookup_tasks = JoinSet::new();
6886
for ip in ips {
69-
reverse_lookups
70-
.spawn(async move { (ip, GLOBAL_DNS_RESOLVER.reverse_lookup(ip).await) });
87+
reverse_lookup_tasks.spawn(async move { (ip, resolver.reverse_lookup(ip).await) });
7188
}
72-
let reverse_lookups: HashMap<IpAddr, Vec<String>> = reverse_lookups
89+
let reverse_lookups: HashMap<IpAddr, Vec<String>> = reverse_lookup_tasks
7390
.join_all()
7491
.await
7592
.into_iter()
@@ -96,16 +113,12 @@ impl SystemNetworkInfo {
96113
let hostname_set: BTreeSet<String> = reverse_lookups.values().flatten().cloned().collect();
97114
tracing::info!(network.addresses.hostname = ?hostname_set, "hostnames");
98115

99-
let mut forward_lookups = JoinSet::new();
116+
let mut forward_lookup_tasks = JoinSet::new();
100117
for hostname in hostname_set {
101-
forward_lookups.spawn(async move {
102-
(
103-
hostname.clone(),
104-
GLOBAL_DNS_RESOLVER.lookup_ip(hostname).await,
105-
)
106-
});
118+
forward_lookup_tasks
119+
.spawn(async move { (hostname.clone(), resolver.lookup_ip(hostname).await) });
107120
}
108-
let forward_lookups: HashMap<String, Vec<IpAddr>> = forward_lookups
121+
let forward_lookups: HashMap<String, Vec<IpAddr>> = forward_lookup_tasks
109122
.join_all()
110123
.await
111124
.into_iter()

0 commit comments

Comments
 (0)