Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ OPTIONS:
-f, --file Write output to file.
--file-mode Append Determines file output behavior. <Append, Overwrite>
-q, --quiet Suppress all normal console output (file output still works).
--fail-on None Exit with a non-zero code on a failed measurement. <None, Total, Partial>
None (default) never affects the exit code; Total triggers when a dimension is all-failed; Partial triggers on any failed request. Fail-fast across --count and --loop.

COMMANDS:
servers Show the nearest speed test servers.
Expand Down
59 changes: 59 additions & 0 deletions USER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,65 @@ NetPace --profile large --downloadsize 200

---

## Detecting failed measurements

A speed test runs many small requests in parallel and reports the aggregate throughput. If some
of those requests fail (a dropped connection, a TLS error, a timeout, or a server that rejects the
transfer), NetPace does **not** silently treat them as zero-speed data — it counts them, so you can
tell a genuinely slow link from a server that isn't transferring at all. When *every* request to a
dimension fails, the speed reads `0 bps`, and the counts tell you it was a total failure rather than
a 0 bps link.

Every output format carries the counts:

- **Normal / Minimal** — the result token is annotated only when requests failed:
```
Latency: 24 ms, Download: 512.6 Mbps, Upload: 0 bps (32 of 32 requests failed)
```
In normal output, an all-failed dimension also prints a short notice on **standard error**:
```
Upload failed: all 32 requests to http://…/upload.php failed.
```
- **CSV** — a `Succeeded` and `Failed` column sits next to each speed column:
```
Timestamp,Latency,Download,DownloadSucceeded,DownloadFailed,Upload,UploadSucceeded,UploadFailed,IPAddress,Hostname
```
- **JSON** — each active dimension gains integer `…Succeeded` / `…Failed` fields; on a total
failure the speed field is omitted (there is no valid measurement) while the counts remain:
```json
{ "UploadSucceeded": 0, "UploadFailed": 32, … }
```

Machine formats (CSV, JSON) self-describe through the counts and never duplicate the notice on
standard error. At `--verbosity Debug`, the raw reason for each failed request is streamed live to
standard error.

### Exit codes

The exit code reports only whether **NetPace itself** functioned. Network conditions — a total
outage, 100% request failure, or no servers found — are *data*, not errors, and exit `0`. Only an
operational failure (for example, being unable to write the `--file` output) exits non-zero. So a
`0 bps` measurement still exits `0` by default: inspect the counts (or use `--fail-on`) to detect it.

If you want a failed measurement to fail the process — for scripting or CI — opt in with
`--fail-on`:

| Value | Exits non-zero when… |
|---|---|
| `None` (default) | never — measurement outcomes don't affect the exit code |
| `Total` | a requested dimension is all-failed (no request succeeded) |
| `Partial` | any request in a requested dimension failed (strict; intended for pristine-run checks) |

`--fail-on` is fail-fast and uniform across single runs, `--count`, and `--loop`: the process exits
`1` at the first measurement that meets the threshold.

```bash
# In CI: treat a totally-failed dimension as a build failure
NetPace --fail-on Total
```

---

For more options and details, run:
```bash
NetPace --help
Expand Down
10 changes: 10 additions & 0 deletions src/NetPace.Console.Tests/CommandLineTestHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@
using var testConsole = new TestConsole().Width(int.MaxValue);
serviceCollection.TryAddSingleton<IAnsiConsole>(testConsole);

// Register a separate standard-error console so tests can assert on stderr independently.
using var testErrorConsole = new TestConsole().Width(int.MaxValue);

Check warning

Code scanning / CodeQL

Missing Dispose call on local IDisposable Warning test

Disposable 'TestConsole' is created but not disposed.
Comment thread
FrankRay78 marked this conversation as resolved.
Dismissed
serviceCollection.TryAddSingleton(new ErrorConsole(testErrorConsole));

// Default IClientInfoProvider stub unless a test already registered one
serviceCollection.TryAddSingleton<IClientInfoProvider, ClientInfoProviderStub>();

Expand All @@ -48,6 +52,7 @@
{
ExitCode = exitCode,
Output = testConsole.Output,
Error = testErrorConsole.Output,
};
}
}
Expand All @@ -66,4 +71,9 @@
/// Gets the output written to stdout.
/// </summary>
public required string Output { get; init; }

/// <summary>
/// Gets the output written to stderr.
/// </summary>
public required string Error { get; init; }
}
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Timestamp,Latency,Download,Upload,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
Timestamp,Latency,Download,DownloadSucceeded,DownloadFailed,Upload,UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
Timestamp,Latency,Download,Upload,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:05,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:10,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:15,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:20,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:25,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:30,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:35,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:40,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:45,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
Timestamp,Latency,Download,DownloadSucceeded,DownloadFailed,Upload,UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:05,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:10,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:15,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:20,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:25,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:30,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:35,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:40,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:45,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Timestamp,Latency,Download,Upload,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
Timestamp,Latency,Download,DownloadSucceeded,DownloadFailed,Upload,UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Timestamp Latency Download Upload IPAddress Hostname
1980-01-01 10:05:00 100 ms 8 Kbps 18.67 Kbps 192.168.1.1 test-host
Timestamp Latency Download DownloadSucceeded DownloadFailed Upload UploadSucceeded UploadFailed IPAddress Hostname
1980-01-01 10:05:00 100 ms 8 Kbps 150 0 18.67 Kbps 32 0 192.168.1.1 test-host
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Timestamp;Latency;Download;Upload;IPAddress;Hostname
1980-01-01 10:05:00;100 ms;8 Kbps;18.67 Kbps;192.168.1.1;test-host
Timestamp;Latency;Download;DownloadSucceeded;DownloadFailed;Upload;UploadSucceeded;UploadFailed;IPAddress;Hostname
1980-01-01 10:05:00;100 ms;8 Kbps;150;0;18.67 Kbps;32;0;192.168.1.1;test-host
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Timestamp,Download (Kbps),Upload (Kbps),IPAddress,Hostname
1980-01-01 10:05:00,8,18.67,192.168.1.1,test-host
Timestamp,Download (Kbps),DownloadSucceeded,DownloadFailed,Upload (Kbps),UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,8,150,0,18.67,32,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
Timestamp,Latency,Download,Upload,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:05,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:10,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:15,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:20,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:25,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:30,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:35,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:40,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:45,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
Timestamp,Latency,Download,DownloadSucceeded,DownloadFailed,Upload,UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:05,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:10,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:15,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:20,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:25,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:30,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:35,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:40,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:45,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Timestamp,Latency,Download,Upload,IPAddress,Hostname
1980-01-01 10:05:00,75 ms,0.25 Mbps,0.5 Mbps,192.168.1.1,test-host
1980-01-01 10:05:05,100 ms,1 Mbps,3 Mbps,192.168.1.1,test-host
1980-01-01 10:05:10,150 ms,2.75 Mbps,1.33 Mbps,192.168.1.1,test-host
Timestamp,Latency,Download,DownloadSucceeded,DownloadFailed,Upload,UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,75 ms,0.25 Mbps,0,0,0.5 Mbps,0,0,192.168.1.1,test-host
1980-01-01 10:05:05,100 ms,1 Mbps,0,0,3 Mbps,0,0,192.168.1.1,test-host
1980-01-01 10:05:10,150 ms,2.75 Mbps,0,0,1.33 Mbps,0,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Timestamp,Latency (ms),Download (bps),Upload (bps),IPAddress,Hostname
1980-01-01 10:05:00,75,250000,500000,192.168.1.1,test-host
1980-01-01 10:05:05,100,1000000,3000000,192.168.1.1,test-host
1980-01-01 10:05:10,150,2750000,1330000,192.168.1.1,test-host
Timestamp,Latency (ms),Download (bps),DownloadSucceeded,DownloadFailed,Upload (bps),UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,75,250000,0,0,500000,0,0,192.168.1.1,test-host
1980-01-01 10:05:05,100,1000000,0,0,3000000,0,0,192.168.1.1,test-host
1980-01-01 10:05:10,150,2750000,0,0,1330000,0,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Timestamp,Latency (ms),Download (Kbps),Upload (Kbps),IPAddress,Hostname
1980-01-01 10:05:00,75,250,500,192.168.1.1,test-host
1980-01-01 10:05:05,100,1000,3000,192.168.1.1,test-host
1980-01-01 10:05:10,150,2750,1330,192.168.1.1,test-host
Timestamp,Latency (ms),Download (Kbps),DownloadSucceeded,DownloadFailed,Upload (Kbps),UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,75,250,0,0,500,0,0,192.168.1.1,test-host
1980-01-01 10:05:05,100,1000,0,0,3000,0,0,192.168.1.1,test-host
1980-01-01 10:05:10,150,2750,0,0,1330,0,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Timestamp,Latency (ms),Download (Mbps),Upload (Mbps),IPAddress,Hostname
1980-01-01 10:05:00,75,0.25,0.5,192.168.1.1,test-host
1980-01-01 10:05:05,100,1,3,192.168.1.1,test-host
1980-01-01 10:05:10,150,2.75,1.33,192.168.1.1,test-host
Timestamp,Latency (ms),Download (Mbps),DownloadSucceeded,DownloadFailed,Upload (Mbps),UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,75,0.25,0,0,0.5,0,0,192.168.1.1,test-host
1980-01-01 10:05:05,100,1,0,0,3,0,0,192.168.1.1,test-host
1980-01-01 10:05:10,150,2.75,0,0,1.33,0,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Timestamp,Latency,Download,Upload,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:05,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:10,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:15,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
1980-01-01 10:05:20,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
Timestamp,Latency,Download,DownloadSucceeded,DownloadFailed,Upload,UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:05,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:10,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:15,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
1980-01-01 10:05:20,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Timestamp,Latency,Upload,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,18.67 Kbps,192.168.1.1,test-host
Timestamp,Latency,Upload,UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,18.67 Kbps,32,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Timestamp,Download,Upload,IPAddress,Hostname
1980-01-01 10:05:00,8 Kbps,18.67 Kbps,192.168.1.1,test-host
Timestamp,Download,DownloadSucceeded,DownloadFailed,Upload,UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Timestamp,Latency,Download,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,192.168.1.1,test-host
Timestamp,Latency,Download,DownloadSucceeded,DownloadFailed,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,150,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Timestamp,Latency (ms),Download (Kbps),Upload (Kbps),IPAddress,Hostname
1980-01-01 10:05:00,75,250,500,192.168.1.1,test-host
Timestamp,Latency (ms),Download (Kbps),DownloadSucceeded,DownloadFailed,Upload (Kbps),UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,75,250,0,0,500,0,0,192.168.1.1,test-host

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Timestamp,Latency,Download,Upload,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,18.67 Kbps,192.168.1.1,test-host
Timestamp,Latency,Download,DownloadSucceeded,DownloadFailed,Upload,UploadSucceeded,UploadFailed,IPAddress,Hostname
1980-01-01 10:05:00,100 ms,8 Kbps,150,0,18.67 Kbps,32,0,192.168.1.1,test-host
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"ServerLocation":"Location 1","ServerSponsor":"Test Sponsor 1","ServerUrl":"http://test1.com","Timestamp":"1980-01-01 10:05:00","Latency":"100 ms","DownloadSpeed":"8 Kbps","UploadSpeed":"18.67 Kbps","IPAddress":"192.168.1.1","Hostname":"test-host"}
{"ServerLocation":"Location 1","ServerSponsor":"Test Sponsor 1","ServerUrl":"http://test1.com","Timestamp":"1980-01-01 10:05:00","Latency":"100 ms","DownloadSpeed":"8 Kbps","DownloadSucceeded":150,"DownloadFailed":0,"UploadSpeed":"18.67 Kbps","UploadSucceeded":32,"UploadFailed":0,"IPAddress":"192.168.1.1","Hostname":"test-host"}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@
"Timestamp": "1980-01-01 10:05:00",
"Latency": "100 ms",
"DownloadSpeed": "8 Kbps",
"DownloadSucceeded": 150,
"DownloadFailed": 0,
"UploadSpeed": "18.67 Kbps",
"UploadSucceeded": 32,
"UploadFailed": 0,
"IPAddress": "192.168.1.1",
"Hostname": "test-host"
}
Expand All @@ -16,7 +20,11 @@
"Timestamp": "1980-01-01 10:05:05",
"Latency": "100 ms",
"DownloadSpeed": "8 Kbps",
"DownloadSucceeded": 150,
"DownloadFailed": 0,
"UploadSpeed": "18.67 Kbps",
"UploadSucceeded": 32,
"UploadFailed": 0,
"IPAddress": "192.168.1.1",
"Hostname": "test-host"
}
Expand All @@ -27,7 +35,11 @@
"Timestamp": "1980-01-01 10:05:10",
"Latency": "100 ms",
"DownloadSpeed": "8 Kbps",
"DownloadSucceeded": 150,
"DownloadFailed": 0,
"UploadSpeed": "18.67 Kbps",
"UploadSucceeded": 32,
"UploadFailed": 0,
"IPAddress": "192.168.1.1",
"Hostname": "test-host"
}
Expand All @@ -38,7 +50,11 @@
"Timestamp": "1980-01-01 10:05:15",
"Latency": "100 ms",
"DownloadSpeed": "8 Kbps",
"DownloadSucceeded": 150,
"DownloadFailed": 0,
"UploadSpeed": "18.67 Kbps",
"UploadSucceeded": 32,
"UploadFailed": 0,
"IPAddress": "192.168.1.1",
"Hostname": "test-host"
}
Expand All @@ -49,7 +65,11 @@
"Timestamp": "1980-01-01 10:05:20",
"Latency": "100 ms",
"DownloadSpeed": "8 Kbps",
"DownloadSucceeded": 150,
"DownloadFailed": 0,
"UploadSpeed": "18.67 Kbps",
"UploadSucceeded": 32,
"UploadFailed": 0,
"IPAddress": "192.168.1.1",
"Hostname": "test-host"
}
Expand All @@ -60,7 +80,11 @@
"Timestamp": "1980-01-01 10:05:25",
"Latency": "100 ms",
"DownloadSpeed": "8 Kbps",
"DownloadSucceeded": 150,
"DownloadFailed": 0,
"UploadSpeed": "18.67 Kbps",
"UploadSucceeded": 32,
"UploadFailed": 0,
"IPAddress": "192.168.1.1",
"Hostname": "test-host"
}
Expand All @@ -71,7 +95,11 @@
"Timestamp": "1980-01-01 10:05:30",
"Latency": "100 ms",
"DownloadSpeed": "8 Kbps",
"DownloadSucceeded": 150,
"DownloadFailed": 0,
"UploadSpeed": "18.67 Kbps",
"UploadSucceeded": 32,
"UploadFailed": 0,
"IPAddress": "192.168.1.1",
"Hostname": "test-host"
}
Expand All @@ -82,7 +110,11 @@
"Timestamp": "1980-01-01 10:05:35",
"Latency": "100 ms",
"DownloadSpeed": "8 Kbps",
"DownloadSucceeded": 150,
"DownloadFailed": 0,
"UploadSpeed": "18.67 Kbps",
"UploadSucceeded": 32,
"UploadFailed": 0,
"IPAddress": "192.168.1.1",
"Hostname": "test-host"
}
Expand All @@ -93,7 +125,11 @@
"Timestamp": "1980-01-01 10:05:40",
"Latency": "100 ms",
"DownloadSpeed": "8 Kbps",
"DownloadSucceeded": 150,
"DownloadFailed": 0,
"UploadSpeed": "18.67 Kbps",
"UploadSucceeded": 32,
"UploadFailed": 0,
"IPAddress": "192.168.1.1",
"Hostname": "test-host"
}
Expand All @@ -104,7 +140,11 @@
"Timestamp": "1980-01-01 10:05:45",
"Latency": "100 ms",
"DownloadSpeed": "8 Kbps",
"DownloadSucceeded": 150,
"DownloadFailed": 0,
"UploadSpeed": "18.67 Kbps",
"UploadSucceeded": 32,
"UploadFailed": 0,
"IPAddress": "192.168.1.1",
"Hostname": "test-host"
}
Loading
Loading