<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Antonio Cotos</title>
    <description>The latest articles on DEV Community by Antonio Cotos (@antoniocotos).</description>
    <link>https://dev.to/antoniocotos</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4160673%2Fe2d97e06-d8df-45eb-9c13-dcc5bc63807e.png</url>
      <title>DEV Community: Antonio Cotos</title>
      <link>https://dev.to/antoniocotos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/antoniocotos"/>
    <language>en</language>
    <item>
      <title>From Ansible to AI: Automating Network Diagnostics with sping</title>
      <dc:creator>Antonio Cotos</dc:creator>
      <pubDate>Thu, 22 Oct 2026 23:35:27 +0000</pubDate>
      <link>https://dev.to/antoniocotos/from-ansible-to-ai-automating-network-diagnostics-with-sping-5cg1</link>
      <guid>https://dev.to/antoniocotos/from-ansible-to-ai-automating-network-diagnostics-with-sping-5cg1</guid>
      <description>&lt;p&gt;Imagine this: a deployment just finished, something is slow, and you have 60 machines in an Ansible inventory.&lt;/p&gt;

&lt;p&gt;You could SSH into each one. You could run &lt;code&gt;ping&lt;/code&gt; 60 times. You could copy terminal output into a spreadsheet and spend the next half hour figuring out which hosts actually have a problem.&lt;/p&gt;

&lt;p&gt;Or you could turn that inventory into a &lt;strong&gt;machine-readable network report&lt;/strong&gt;, filter it in a few seconds, and hand the evidence to a script—or even an AI assistant.&lt;/p&gt;

&lt;p&gt;That's one of the reasons I built &lt;a href="https://github.com/LambdaBytes/sping" rel="noopener noreferrer"&gt;sping&lt;/a&gt;, a small, open-source network diagnostics CLI written in Rust.&lt;/p&gt;

&lt;p&gt;The live terminal view is nice. &lt;strong&gt;But the surprising part is what happens when you stop treating ping output as text.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8b6og8olgmm562p81w4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8b6og8olgmm562p81w4.gif" alt="sping 1.7.1 — Live monitoring and automatic diagnostics" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The trick: JSON instead of lines of ping output
&lt;/h2&gt;

&lt;p&gt;A regular monitoring session can stream newline-delimited JSON (NDJSON):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sping example.com &lt;span class="nt"&gt;--view&lt;/span&gt; json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each line is a new measurement, with fields such as &lt;code&gt;rttavg&lt;/code&gt;&lt;em&gt;,&lt;/em&gt; &lt;code&gt;losspct&lt;/code&gt;, &lt;code&gt;jitter&lt;/code&gt;, &lt;code&gt;quality&lt;/code&gt;, &lt;code&gt;trend&lt;/code&gt;, and—when available—network context and diagnostic findings.&lt;/p&gt;

&lt;p&gt;For a list of machines, there's a different mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sping &lt;span class="nt"&gt;--batch&lt;/span&gt; hosts.txt &lt;span class="nt"&gt;-c&lt;/span&gt; 10 &lt;span class="nt"&gt;--view&lt;/span&gt; json &lt;span class="nt"&gt;-o&lt;/span&gt; fleet.ndjson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;One final JSON object per target.&lt;/strong&gt; The targets are probed in parallel, with 10 probes each. The result isn't a screenshot or an unstructured log; it's data you can filter, compare, archive, and analyze.&lt;/p&gt;

&lt;p&gt;Here are five things you can do with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Turn an Ansible inventory into a network health report
&lt;/h2&gt;

&lt;p&gt;Ansible already knows which machines exist. Let's reuse that information.&lt;/p&gt;

&lt;p&gt;If you have an INI or YAML inventory, use &lt;code&gt;ansible-inventory&lt;/code&gt; to resolve it into a plain host list. This example prefers &lt;code&gt;ansible_host&lt;/code&gt; when an alias points to a different address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ansible-inventory &lt;span class="nt"&gt;-i&lt;/span&gt; inventory.ini &lt;span class="nt"&gt;--list&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'._meta.hostvars | to_entries[] | (.value.ansible_host // .key)'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; hosts.txt

sping &lt;span class="nt"&gt;--batch&lt;/span&gt; hosts.txt &lt;span class="nt"&gt;-c&lt;/span&gt; 10 &lt;span class="nt"&gt;--view&lt;/span&gt; json &lt;span class="nt"&gt;-o&lt;/span&gt; fleet.ndjson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's your inventory transformed into a network snapshot. No agent to install on every machine, no dashboard to deploy.&lt;/p&gt;

&lt;p&gt;If you already maintain a text file containing one IP or hostname per line, skip the Ansible step and pass it straight to &lt;code&gt;--batch&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Show only the machines that need attention
&lt;/h2&gt;

&lt;p&gt;Now for the useful part. Rather than reading everything, ask &lt;code&gt;jq&lt;/code&gt; for machines with no replies or at least 20% packet loss:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
  select(.sent == 0 or .received == 0 or .loss_pct &amp;gt;= 20) |
  "\(.target_host): \(.received)/\(.sent) replies, \(.loss_pct)% loss"
'&lt;/span&gt; fleet.ndjson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suddenly, a long inventory becomes a short list to investigate.&lt;/p&gt;

&lt;p&gt;Want to make this part of a deployment preflight? Check TCP instead of ICMP, especially on networks where ping is filtered:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
sping &lt;span class="nt"&gt;--batch&lt;/span&gt; hosts.txt &lt;span class="nt"&gt;--tcp&lt;/span&gt; 22 &lt;span class="nt"&gt;-c&lt;/span&gt; 3 &lt;span class="nt"&gt;--view&lt;/span&gt; json &lt;span class="nt"&gt;-o&lt;/span&gt; ssh.ndjson &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-le&lt;/span&gt; 1 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

jq &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nt"&gt;--argjson&lt;/span&gt; expected &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; &amp;lt; hosts.txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'
  length == $expected and
  all(.[]; .sent == 3 and .received == 3 and (.refused // 0) == 0)
'&lt;/span&gt; ssh.ndjson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last command exits unsuccessfully unless &lt;strong&gt;every expected host&lt;/strong&gt; answered all three TCP attempts on port 22 &lt;em&gt;without a refusal&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A TCP refusal is still a network response, but it doesn't mean SSH is accepting connections. And an open TCP port doesn't guarantee a successful login. This is a connectivity gate, not an application health check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational detail:&lt;/strong&gt; sping may skip hostnames that fail DNS resolution (and warn on stderr), so compare the number of JSON records to the expected host count. The preflight above does exactly that. In batch mode, sping can also return exit code &lt;code&gt;1&lt;/code&gt; when a host receives no replies; that isn't the same as a CLI/runtime error (&lt;code&gt;2&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Compare the network before and after a change
&lt;/h2&gt;

&lt;p&gt;Ever changed a firewall rule, VPN, switch, or routing policy and then wondered which machines became worse?&lt;/p&gt;

&lt;p&gt;Keep two snapshots:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Before the change&lt;/span&gt;
sping &lt;span class="nt"&gt;--batch&lt;/span&gt; hosts.txt &lt;span class="nt"&gt;-c&lt;/span&gt; 10 &lt;span class="nt"&gt;--view&lt;/span&gt; json &lt;span class="nt"&gt;-o&lt;/span&gt; before.ndjson

&lt;span class="c"&gt;# After the change&lt;/span&gt;
sping &lt;span class="nt"&gt;--batch&lt;/span&gt; hosts.txt &lt;span class="nt"&gt;-c&lt;/span&gt; 10 &lt;span class="nt"&gt;--view&lt;/span&gt; json &lt;span class="nt"&gt;-o&lt;/span&gt; after.ndjson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then show the hosts whose packet-loss percentage increased:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--slurpfile&lt;/span&gt; before before.ndjson &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--slurpfile&lt;/span&gt; after after.ndjson &lt;span class="s1"&gt;'
  ($before | map({key: .target_host, value: .loss_pct}) | from_entries) as $old |
  $after[] |
  select($old[.target_host] != null and .loss_pct &amp;gt; $old[.target_host]) |
  "\(.target_host): \($old[.target_host])% -&amp;gt; \(.loss_pct)% loss"
'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can do the same with average latency or jitter. A before/after report turns a vague &lt;em&gt;"the network feels worse"&lt;/em&gt; into something you can investigate. It's an observation from the machine running sping, not proof of what caused the change.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Give an AI evidence instead of a screenshot
&lt;/h2&gt;

&lt;p&gt;This is the part I find especially interesting.&lt;/p&gt;

&lt;p&gt;Don't ask an AI to guess whether your infrastructure is healthy. Give it a &lt;strong&gt;small, structured report&lt;/strong&gt; with actual measurements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s1"&gt;'[.[] | {
  host: .target_host,
  ip: .target_ip,
  sent, received, loss_pct, rtt_avg, jitter,
  quality, trend,
  diagnosis: (.diagnosis // [])
}]'&lt;/span&gt; fleet.ndjson &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ai-report.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now paste &lt;code&gt;ai-report.json&lt;/code&gt; into an AI assistant, or pass it to a local model, with a prompt like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Group these hosts by symptoms. Prioritize which ones I should investigate first. Highlight total loss, intermittent loss, high latency, and consistent patterns. State what the data &lt;strong&gt;doesn't&lt;/strong&gt; prove. Don't assume an ICMP timeout means the server is down. Suggest the next checks, based only on the supplied measurements.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the workflow I find exciting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ansible inventory → sping → NDJSON → deterministic filters → AI-assisted triage.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The AI isn't doing the network measurements. sping is. The model helps you organize and interpret the evidence.&lt;/p&gt;

&lt;p&gt;If hostnames or internal IP addresses are sensitive, redact them or use a trusted local model before sharing the report.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Drill into one suspicious host with &lt;code&gt;--diagnose&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Batch mode answers &lt;strong&gt;which machines deserve a closer look&lt;/strong&gt;. For a single problematic endpoint, sping 1.8.0 has an experimental follow-up mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sping example.com &lt;span class="nt"&gt;--diagnose&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 10 &lt;span class="nt"&gt;--view&lt;/span&gt; json &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; incident.ndjson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the target stops answering, sping can try additional checks: alternative IPv4/IPv6 connectivity, TCP ports 443 and 80, and a bounded traceroute. Then you can inspect the additional findings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s1"&gt;'.[-1] | {
  target: .target_host,
  diagnosis: (.diagnosis // []),
  active_diagnosis: .active_diagnosis,
  gateway: .gateway,
  wan: .wan
}'&lt;/span&gt; incident.ndjson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The distinction matters: &lt;strong&gt;silence isn't proof of a firewall&lt;/strong&gt;, and a successful TCP response isn't proof that the application is healthy. &lt;code&gt;--diagnose&lt;/code&gt; reports observations, including checks it couldn't complete. It's experimental, single-target only, and intentionally separate from &lt;code&gt;--batch&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger idea
&lt;/h2&gt;

&lt;p&gt;I didn't want sping to be just a prettier &lt;code&gt;ping&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I wanted a tool that's useful when you're looking at a terminal &lt;strong&gt;and&lt;/strong&gt; when nobody is looking at the terminal: in scripts, CI jobs, inventory audits, incident reports, or an AI-assisted troubleshooting workflow.&lt;/p&gt;

&lt;p&gt;The terminal UI is for humans. &lt;strong&gt;The JSON is for everything you might build around it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;sping runs on Linux, macOS, and Windows. It's open source, MIT-licensed, and doesn't require a cloud service.&lt;/p&gt;

&lt;h3&gt;
  
  
  A small milestone: sping is now in Debian! 🐧
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Update (October 2026):&lt;/strong&gt; sping 1.8.0 has officially joined Debian unstable (sid), thanks to the Debian Rust Team and Simon Quigley's sponsorship.&lt;/p&gt;

&lt;p&gt;If you're running Debian sid, you can install it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;sping
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can follow the package on the &lt;a href="https://tracker.debian.org/pkg/rust-sping" rel="noopener noreferrer"&gt;Debian Package Tracker&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Want to try sping?
&lt;/h3&gt;

&lt;p&gt;If you have Rust 1.88+ installed, you can get started with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;sping
sping 1.1.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or download a prebuilt binary for your platform.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;a href="https://github.com/LambdaBytes/sping" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;a href="https://github.com/LambdaBytes/sping/releases/latest" rel="noopener noreferrer"&gt;Latest release and downloads&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/LambdaBytes/sping/blob/main/JSON_CONTRACT.md" rel="noopener noreferrer"&gt;JSON contract and documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find sping useful, feedback and contributions are always welcome. And if you like the project, a ⭐ on GitHub helps others discover it!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I'd love to hear what you'd build with it. What network check do you still run manually that should really be a script?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>rust</category>
      <category>networking</category>
    </item>
    <item>
      <title>Ping failed. Now what? I taught sping to investigate.</title>
      <dc:creator>Antonio Cotos</dc:creator>
      <pubDate>Mon, 19 Oct 2026 15:49:09 +0000</pubDate>
      <link>https://dev.to/antoniocotos/ping-failed-now-what-i-taught-sping-to-investigate-234k</link>
      <guid>https://dev.to/antoniocotos/ping-failed-now-what-i-taught-sping-to-investigate-234k</guid>
      <description>&lt;p&gt;We've all been there.&lt;/p&gt;

&lt;p&gt;A server suddenly stops responding. Your SSH session freezes. An API becomes unreachable.&lt;/p&gt;

&lt;p&gt;You open a terminal and run the command you've probably typed thousands of times:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request timed out.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Great. Now what?&lt;/p&gt;

&lt;p&gt;Is the server actually down? Is ICMP being blocked? Did your connection drop? Is DNS acting up? Did something change in your network?&lt;/p&gt;

&lt;p&gt;Traditional &lt;code&gt;ping&lt;/code&gt; tells you that packets aren't coming back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn't tell you what to investigate next.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the problem I wanted to tackle with the latest release of &lt;a href="https://github.com/LambdaBytes/sping" rel="noopener noreferrer"&gt;sping&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet sping 1.7.1
&lt;/h2&gt;

&lt;p&gt;A few weeks ago, I released &lt;strong&gt;sping&lt;/strong&gt;, an open-source, cross-platform network diagnostic tool written in Rust.&lt;/p&gt;

&lt;p&gt;The original idea was simple: build a modern ping that doesn't just display packet statistics, but helps humans understand what's happening with their connections.&lt;/p&gt;

&lt;p&gt;It already supported live latency monitoring, jitter, packet loss, quality scoring, network context, multi-target monitoring, and TCP probes.&lt;/p&gt;

&lt;p&gt;But there was something missing.&lt;/p&gt;

&lt;p&gt;When a connection failed, sping could show you the symptoms.&lt;/p&gt;

&lt;p&gt;I wanted it to go one step further.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the tool could automatically investigate what still works when the target stops responding?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's what version &lt;strong&gt;1.7.1&lt;/strong&gt; introduces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing &lt;code&gt;--diagnose&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The biggest addition is a new experimental diagnostic mode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sping example.com &lt;span class="nt"&gt;--diagnose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;You start monitoring your target as usual.&lt;/p&gt;

&lt;p&gt;But when it stops responding, sping doesn't just keep displaying timeouts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It starts gathering additional evidence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8kkwbjjy2p0nkk6nzck7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8kkwbjjy2p0nkk6nzck7.gif" alt="sping 1.7.1 — Automatic diagnostics and live network context" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the target becomes unreachable, sping can automatically perform several additional checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IPv4 / IPv6:&lt;/strong&gt; Can the same hostname be reached using the other address family?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TCP connectivity:&lt;/strong&gt; Does anything answer on ports 443 or 80, even when ICMP fails?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traceroute:&lt;/strong&gt; How far do packets get before responses disappear?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local network context:&lt;/strong&gt; Does the system have a suitable source address for the destination?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS evidence:&lt;/strong&gt; Did the latest hostname lookup fail or return no addresses for the requested family?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to magically identify every networking problem.&lt;/p&gt;

&lt;p&gt;It's to answer a much more useful question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"The target isn't answering. What else can we learn?"&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A timeout doesn't always mean a dead server
&lt;/h3&gt;

&lt;p&gt;Imagine you're monitoring a remote server.&lt;/p&gt;

&lt;p&gt;ICMP stops responding, but TCP port 443 still answers.&lt;/p&gt;

&lt;p&gt;That's useful information.&lt;/p&gt;

&lt;p&gt;It doesn't prove that the application is healthy, but it tells you that something along the network path is still responding.&lt;/p&gt;

&lt;p&gt;Or perhaps IPv4 fails while IPv6 works.&lt;/p&gt;

&lt;p&gt;Or the trace reaches several routers before responses disappear.&lt;/p&gt;

&lt;p&gt;Instead of jumping between &lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;traceroute&lt;/code&gt;, and other commands, sping can collect these observations as part of the same monitoring session.&lt;/p&gt;

&lt;p&gt;And because the diagnosis is evidence-based, it reports what was observed rather than pretending to know the exact root cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your network changes. Your diagnostics should notice.
&lt;/h2&gt;

&lt;p&gt;Another addition in 1.7.1 is &lt;strong&gt;live network context change detection&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think about switching from Ethernet to Wi-Fi while monitoring a connection.&lt;/p&gt;

&lt;p&gt;Or a VPN changing your default route.&lt;/p&gt;

&lt;p&gt;These changes can completely alter how traffic reaches a destination.&lt;/p&gt;

&lt;p&gt;sping already tracked network context, but now it can explicitly report when something changes.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;context changed 00:03 ago: interface eth0 → wlan0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It can also track changes in the source address, network prefix, default gateway, and destination classification.&lt;/p&gt;

&lt;p&gt;This is particularly useful when investigating intermittent problems.&lt;/p&gt;

&lt;p&gt;Sometimes the interesting question isn't just whether latency increased.&lt;/p&gt;

&lt;p&gt;It's &lt;strong&gt;what changed immediately before it increased&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for real-world troubleshooting
&lt;/h2&gt;

&lt;p&gt;One thing I wanted to preserve was the simplicity of the original tool.&lt;/p&gt;

&lt;p&gt;You can still run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sping 1.1.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And get the familiar real-time monitoring interface.&lt;/p&gt;

&lt;p&gt;The new diagnostic mode is entirely optional.&lt;/p&gt;

&lt;p&gt;When enabled, it only starts investigating after the target is considered offline: three consecutive failed probes, or a completed run where no replies were received.&lt;/p&gt;

&lt;p&gt;The additional diagnostic traffic is bounded, with limits on concurrent operations and the number of extra probes.&lt;/p&gt;

&lt;p&gt;The traceroute is also limited in time and hop count.&lt;/p&gt;

&lt;p&gt;I didn't want a failed connection to trigger an uncontrolled burst of network traffic.&lt;/p&gt;

&lt;p&gt;And if you're building monitoring or automation around sping, diagnostic results are also available in its structured JSON output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sping example.com &lt;span class="nt"&gt;--diagnose&lt;/span&gt; &lt;span class="nt"&gt;--view&lt;/span&gt; json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The new &lt;code&gt;active_diagnosis&lt;/code&gt; field exposes the additional observations programmatically.&lt;/p&gt;

&lt;p&gt;A quick note: &lt;code&gt;--diagnose&lt;/code&gt; is still experimental and currently supports one target at a time. Some checks depend on operating-system capabilities and permissions. On macOS, for example, the traceroute component currently supports IPv4 targets only.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few less visible improvements
&lt;/h2&gt;

&lt;p&gt;Version 1.7.1 also includes fixes and improvements across Linux, macOS, and Windows.&lt;/p&gt;

&lt;p&gt;These include more reliable ICMP reply matching on macOS, better handling of interfaces without an address in the requested IP family, and fixes for terminal views and piped output.&lt;/p&gt;

&lt;p&gt;They're not as exciting as a new feature, but they matter when you want a diagnostic tool you can actually rely on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try sping 1.7.1
&lt;/h2&gt;

&lt;p&gt;sping is free, open source, and available under the MIT license.&lt;/p&gt;

&lt;p&gt;It runs natively on &lt;strong&gt;Linux, macOS, and Windows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you have Rust installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;sping
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On macOS with Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;LambdaBytes/tap/sping
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows with Scoop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;scoop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lambdabytes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://github.com/LambdaBytes/scoop-bucket&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;scoop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lambdabytes/sping&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prebuilt binaries and Debian/Ubuntu packages are also available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/LambdaBytes/sping" rel="noopener noreferrer"&gt;https://github.com/LambdaBytes/sping&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Latest release:&lt;/strong&gt; &lt;a href="https://github.com/LambdaBytes/sping/releases/tag/v1.7.1" rel="noopener noreferrer"&gt;https://github.com/LambdaBytes/sping/releases/tag/v1.7.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full changelog:&lt;/strong&gt; &lt;a href="https://github.com/LambdaBytes/sping/blob/main/CHANGELOG.md" rel="noopener noreferrer"&gt;https://github.com/LambdaBytes/sping/blob/main/CHANGELOG.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;I'm continuing to develop sping with a simple philosophy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network diagnostics should help you understand problems, not just display numbers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's still plenty to improve, especially around automatic diagnostics, network context, and making the results easier to interpret.&lt;/p&gt;

&lt;p&gt;And that's where feedback from people actually using the tool becomes incredibly valuable.&lt;/p&gt;

&lt;p&gt;If you work with networks, servers, infrastructure, or simply spend too much time debugging connectivity issues, I'd love to hear what you think.&lt;/p&gt;

&lt;p&gt;What does your troubleshooting workflow look like when ping stops responding?&lt;/p&gt;

&lt;p&gt;What would you want a diagnostic tool to check automatically?&lt;/p&gt;

&lt;p&gt;Feel free to open an issue, share an idea, or contribute on GitHub.&lt;/p&gt;

&lt;p&gt;And if this is your first time hearing about sping, you can also check out my &lt;a href="https://dev.to/antoniocotos/sping-advanced-ping-cli-522c"&gt;original introduction to the project&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks for checking it out!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/LambdaBytes/sping" rel="noopener noreferrer"&gt;⭐ sping on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built with Rust. Made for humans.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>networking</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your ping works. Your connection doesn't. Meet sping.</title>
      <dc:creator>Antonio Cotos</dc:creator>
      <pubDate>Sun, 04 Oct 2026 00:36:20 +0000</pubDate>
      <link>https://dev.to/antoniocotos/sping-advanced-ping-cli-522c</link>
      <guid>https://dev.to/antoniocotos/sping-advanced-ping-cli-522c</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvf79bg9y56ug4jl83ooi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvf79bg9y56ug4jl83ooi.gif" alt="GIF EXAMPLE" width="560" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You're in the middle of debugging a connection problem.&lt;/p&gt;

&lt;p&gt;An SSH session freezes. An API request takes forever. Someone says, &lt;em&gt;"The network looks fine."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So you do what we've all done a thousand times:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
ping 1.1.1.1

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Packets come back. Nice.&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;what did that actually tell you?&lt;/strong&gt; Is the problem your local network, your connection to the internet, or the specific service you're trying to reach? And what about those occasional latency spikes that disappear before you can show anyone?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ping&lt;/code&gt; is great at answering a simple question. I wanted a terminal tool that would help answer the &lt;em&gt;next&lt;/em&gt; question.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;sping&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ping, with the context you actually need
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;sping&lt;/strong&gt; is a free, open-source network diagnostic CLI written in Rust. It keeps the simplicity of ping, but adds live measurements and a little more awareness of what's happening around your connection.&lt;/p&gt;

&lt;p&gt;Run it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
sping 1.1.1.1

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of scrolling lines of replies, you get a live terminal view with a pulse graph, latency, jitter, packet loss, quality scoring, and trends.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo24uqgxfikrwk9oihrsn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo24uqgxfikrwk9oihrsn.gif" alt="sping 1.6.0 in action: live diagnostics, multi-target monitoring, and TCP probes" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The part I find most useful isn't the graph, though. It's &lt;strong&gt;network context&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;While checking your target, sping can also monitor your default gateway and a separate internet reference. That helps you distinguish between situations like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The target stops responding, but your gateway and internet reference are reachable.&lt;/strong&gt; Start investigating the destination or the route to it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your gateway becomes unreachable.&lt;/strong&gt; Look closer to home: local connectivity, routing, or the gateway itself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your gateway responds, but the internet reference doesn't.&lt;/strong&gt; The problem may be upstream, or that reference may be unreachable.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are clues, not magical root-cause detection. But they're a lot more useful than staring at a timeout and guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  One command, several destinations
&lt;/h2&gt;

&lt;p&gt;Sometimes you don't want to diagnose one host. You want to see whether several things go wrong &lt;em&gt;at the same time&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
sping 192.168.1.1 1.1.1.1 example.com

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That switches to a multi-target dashboard, so you can compare latency, loss, quality, and trends side by side. It's particularly handy when an issue comes and goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What if the server doesn't answer ICMP?
&lt;/h2&gt;

&lt;p&gt;A failed ping doesn't necessarily mean a service is down. Some networks simply filter ICMP.&lt;/p&gt;

&lt;p&gt;sping 1.6.0 also supports TCP connection probes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
sping example.com &lt;span class="nt"&gt;--tcp&lt;/span&gt; 443

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This measures the TCP connection attempt instead of an ICMP echo. A connection refusal is still a response from the network, &lt;strong&gt;not&lt;/strong&gt; proof that the application is healthy. That distinction matters when you're troubleshooting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not just something pretty in the terminal
&lt;/h2&gt;

&lt;p&gt;I also wanted sping to be useful in scripts and automation, not only during an interactive debugging session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
sping example.com &lt;span class="nt"&gt;--view&lt;/span&gt; json

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its newline-delimited JSON output exposes measurements and structured diagnostic findings, so you can feed them into other tools without parsing a constantly changing terminal UI.&lt;/p&gt;

&lt;p&gt;sping runs on &lt;strong&gt;Linux, macOS, and Windows&lt;/strong&gt;. It's a native CLI, not a web service you need to deploy, and the project is available under the MIT license.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give it a try
&lt;/h2&gt;

&lt;p&gt;If you have Rust installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
cargo &lt;span class="nb"&gt;install &lt;/span&gt;sping

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On macOS, you can use Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;LambdaBytes/tap/sping

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or grab a prebuilt release for your platform from GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source code, releases, documentation:&lt;/strong&gt; &lt;a href="https://github.com/LambdaBytes/sping" rel="noopener noreferrer"&gt;github.com/LambdaBytes/sping&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm building sping because I think command-line tools can be both lightweight and genuinely helpful when something breaks.&lt;/p&gt;

&lt;p&gt;If you try it, I'd love to know: &lt;strong&gt;what's the first network problem you'd use it to investigate?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bugs, ideas, and real-world feedback are all welcome on &lt;a href="https://github.com/LambdaBytes/sping/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="//github.com/LambdaBytes/sping"&gt;github.com/LambdaBytes/sping&lt;/a&gt;&lt;br&gt;
Developer: Antonio Cotos&lt;br&gt;
License: MIT License&lt;/p&gt;

&lt;p&gt;#opensource #rust #networking #linux #windows #macos #devops #sysadmin #cli&lt;/p&gt;

</description>
      <category>sysadmin</category>
      <category>cli</category>
      <category>linux</category>
      <category>networking</category>
    </item>
  </channel>
</rss>
