jsdelivr / globalping-cli

A simple CLI tool to run networking commands remotely from hundreds of globally distributed servers
Mozilla Public License 2.0
118 stars 14 forks source link

Add rate limit and credits info to existing commands #107

Closed MartinKolarik closed 1 month ago

MartinKolarik commented 2 months ago

Requires https://github.com/jsdelivr/globalping-cli/issues/42#issuecomment-2187498105 (only the part with ENV support so that we can test the token cases).

First, here's the relevant part of the docs:

image

1. When creating a new measurement fails with a 429 status

Calculate XX = X-RateLimit-Remaining + X-Credits-Remaining Calculate YY = X-RateLimit-Remaining + X-Credits-Required

Note - X-Credits-Required is currently not returned by the API for requests without a token. This will be changed. Any missing header should be treated as 0.

1.1. If the user didn't provide a token

1.1.1. If XX > 0, print a message: "You only have XX credits remaining, and YY were required. Try requesting fewer probes or wait X-RateLimit-Reset minutes for the limit to reset. You can get higher limits by creating an account. Sign up at https://globalping.io"

1.1.2. If XX == 0, print a message: "You have run out of credits for this session. You can wait X-RateLimit-Reset minutes for the limit to reset or get higher limits by creating an account. Sign up at https://globalping.io"

1.2. If the user provided a token

1.2.1. If XX > 0, print a message: "You only have XX credits remaining, and YY were required. Try requesting fewer probes or wait X-RateLimit-Reset minutes for the limit to reset. You can get higher limits by sponsoring us or hosting probes."

1.2.2. If XX == 0, print a message: "You have run out of credits for this session. You can wait X-RateLimit-Reset minutes for the limit to reset or get higher limits by sponsoring us or hosting probes."

2. When infinite measurement fails while it's running (at least one test before succeeded)

Terminate, keep the output, and add a message below it (to stderr). If --share was used, the error message goes first, then the sharing message. The error message is the same as in 1.1.2/1.2.2 case, depending on if a token was used.

2.1. In single probe mode

Example:

> Santiago, CL, SA, The Constant Company, LLC (AS20473)
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=1.18 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=59 time=1.40 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=59 time=1.38 ms
--- 1.1.1.1 ping statistics ---
3 packets transmitted, 3 received, 0.00% packet loss, time 2106ms
rtt min/avg/max/mdev = 1.180/1.320/1.400/0.099 ms
> You have run out of credits for this session...

2.2. Table mode output

Example:

Location                                                                     | Sent |    Loss |     Last |      Min |      Avg |      Max
Los Angeles (CA), US, NA, MULTACOM CORPORATION (AS35916)                     |    2 |   0.00% |  1.78 ms |  1.78 ms |  2.12 ms |  2.45 ms
Beijing, CN, AS, Shenzhen Tencent Computer Systems Company Limited (AS45090) |    1 | 100.00% |        - |        - |        - |        -
> You have run out of credits for this session...

3. Warning while infinite mode runs

3.1 In single probe mode

Let's add one line (stderr) above location:

> This infinite ping will consume 1 API credit for every 16 packets until stopped.
> Falkenstein, DE, EU, Hetzner Online GmbH (AS24940)
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=55 time=5.63 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=55 time=5.32 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=55 time=5.28 ms
64 bytes from 1.1.1.1: icmp_seq=4 ttl=55 time=5.39 ms
64 bytes from 1.1.1.1: icmp_seq=5 ttl=55 time=5.35 ms
^C
--- 1.1.1.1 ping statistics ---
5 packets transmitted, 5 received, 0.00% packet loss, time 2621ms
rtt min/avg/max/mdev = 5.280/5.394/5.630/0.123 ms

3.2 Table mode

Let's add one line below and update it real-time:

Location                                               | Sent |    Loss |     Last |      Min |      Avg |      Max
Dallas (TX), US, NA, Baxet Group Inc. (AS398343)       |    6 |   0.00% |  7.19 ms |  7.16 ms |  7.27 ms |  7.36 ms
Kyiv, UA, EU, STARK INDUSTRIES SOLUTIONS LTD (AS44477) |    7 |   0.00% |  14.9 ms |  14.8 ms |  14.9 ms |  15.1 ms
Currently consuming ~XX API credits/minute.

Calculate XX as the sum of all probesCount (returned in the body response to POST) in the current infinite session (because 1 probe == 1 credit), divided by the session duration.

MartinKolarik commented 1 month ago

@radulucut let's do this next. Let me know if anything isn't clear.