Home | Markdown | Gemini | Microblog | Street photography | Wishlist

Unveiling guprecords.raku: Global Uptime Records with Raku



Published at 2023-04-30T13:10:26+03:00, last updated Fri 20 Feb 21:18:46 EET 2026

+-----+-----------------+-----------------------------+
| Pos |            Host |                    Lifespan |
+-----+-----------------+-----------------------------+
|  1. |        dionysus |  8 years, 6 months, 17 days |
|  2. |          uranus |  7 years, 2 months, 16 days |
|  3. |   alphacentauri |  6 years, 9 months, 13 days |
|  4. |         *vulcan |   4 years, 5 months, 6 days |
|  5. |             sun |  3 years, 10 months, 2 days |
|  6. |           uugrn |   3 years, 5 months, 5 days |
|  7. |       deltavega |  3 years, 1 months, 21 days |
|  8. |           pluto | 2 years, 10 months, 30 days |
|  9. |         tauceti |  2 years, 3 months, 22 days |
| 10. |        callisto |  2 years, 3 months, 13 days |
+-----+-----------------+-----------------------------+

Table of Contents




Introduction



For fun, I am tracking the uptime of various personal machines (servers, laptops, workstations...). I have been doing this for over ten years now, so I have a lot of statistics collected.

So I wrote guprecords.raku, a Raku script which merges the uptime stats of all my machines into one report. This post shows what it does, with some examples, plus a few notes on Raku.

Guprecords stands for global uptime records. The code is here:

Guprecords (Raku)
Goprecords (Go)
The Raku Programming Language
The Go Programming Language

Update 2026-02-20: I've since rewritten Guprecords in Go as goprecords. It's faster and easier to distribute. It does the same things (same categories, metrics and output formats) and additionally has a server mode with an API. I maintain both.

A previous version of Guprecords was written in Perl. The main reason for the rewrite was to learn Raku, Perl's younger sibling.

Over the last years, I have been reading the following books and resources about Raku:


And I have been following the Raku newsletter, and sometimes I have been lurking around in the IRC channels, too. Watching Raku coding challenges on YouTube was pretty fun, too. However, nothing beats actually using Raku to learn the language. After reading all of these resources, I may have a good idea about the features and paradigms, but I am by far not an expert.

How Guprecords works



Guprecords works in three stages:


$ raku guprecords.raku --stats=dir=$HOME/git/uprecords/stats --all

That prints the full report.

Guprecords supports the following features:


Example



You have already seen an example at the very top of this post, where the hosts were grouped by their total lifespans (uptime+downtime). Here's an example of what the global uptime report (grouped by total host uptimes) might look like:

Top 20 Uptime's by Host

+-----+-----------------+-----------------------------+
| Pos |            Host |                      Uptime |
+-----+-----------------+-----------------------------+
|  1. |         *vulcan |   4 years, 5 months, 6 days |
|  2. |          uranus | 3 years, 11 months, 21 days |
|  3. |             sun |  3 years, 9 months, 26 days |
|  4. |           uugrn |   3 years, 5 months, 5 days |
|  5. |       deltavega |  3 years, 1 months, 21 days |
|  6. |           pluto | 2 years, 10 months, 29 days |
|  7. |         tauceti |  2 years, 3 months, 19 days |
|  8. |       tauceti-f |  1 years, 9 months, 18 days |
|  9. | *ultramega15289 |  1 years, 8 months, 17 days |
| 10. |          *earth |  1 years, 5 months, 22 days |
| 11. |       *blowfish |  1 years, 4 months, 20 days |
| 12. |   ultramega8477 |  1 years, 3 months, 25 days |
| 13. |           host0 |   1 years, 3 months, 9 days |
| 14. |       tauceti-e |  1 years, 2 months, 20 days |
| 15. |        makemake |   1 years, 1 months, 6 days |
| 16. |        callisto | 0 years, 10 months, 31 days |
| 17. |   alphacentauri | 0 years, 10 months, 28 days |
| 18. |          london |  0 years, 9 months, 16 days |
| 19. |         twofish |  0 years, 8 months, 31 days |
| 20. |     *fishfinger |  0 years, 8 months, 17 days |
+-----+-----------------+-----------------------------+

The hosts marked with * are still active, means stats were collected within the last couple of months.

My up to date stats can be seen here:

My machine uptime stats

Just recently, I decommissioned vulcan (the number one stop from above), which used to be my CentOS 7 (initially CentOS 6) VM hosting my personal NextCloud and Wallabag (which I modernised just recently with a brand new shiny Rocky Linux 9 VM). This was the last uptimed output before shutting it down (it always makes me feel sentimental decommissioning one of my machines :'-():

     #               Uptime | System                                     Boot up
----------------------------+---------------------------------------------------
     1   545 days, 17:58:15 | Linux 3.10.0-1160.15.2.e  Sun Jul 25 19:32:25 2021
     2   279 days, 10:12:14 | Linux 3.10.0-957.21.3.el  Sun Jun 30 12:43:41 2019
     3   161 days, 06:08:43 | Linux 3.10.0-1160.15.2.e  Sun Feb 14 11:05:38 2021
     4   107 days, 01:26:35 | Linux 3.10.0-957.1.3.el7  Thu Dec 20 09:29:13 2018
     5    96 days, 21:13:49 | Linux 3.10.0-1127.13.1.e  Sat Jul 25 17:56:22 2020
->   6    89 days, 23:05:32 | Linux 3.10.0-1160.81.1.e  Sun Jan 22 12:39:36 2023
     7    63 days, 18:30:45 | Linux 3.10.0-957.10.1.el  Sat Apr 27 18:12:43 2019
     8    63 days, 06:53:33 | Linux 3.10.0-1127.8.2.el  Sat May 23 10:41:08 2020
     9    48 days, 11:44:49 | Linux 3.10.0-1062.18.1.e  Sat Apr  4 22:56:07 2020
    10    42 days, 08:00:13 | Linux 3.10.0-1127.19.1.e  Sat Nov  7 11:47:33 2020
    11    36 days, 22:57:19 | Linux 3.10.0-1160.6.1.el  Sat Dec 19 19:47:57 2020
    12    21 days, 06:16:28 | Linux 3.10.0-957.10.1.el  Sat Apr  6 11:56:01 2019
    13    12 days, 20:11:53 | Linux 3.10.0-1160.11.1.e  Mon Jan 25 18:45:27 2021
    14     7 days, 21:29:18 | Linux 3.10.0-1127.13.1.e  Fri Oct 30 14:18:04 2020
    15     6 days, 20:07:18 | Linux 3.10.0-1160.15.2.e  Sun Feb  7 14:57:35 2021
    16     1 day , 21:46:41 | Linux 3.10.0-957.1.3.el7  Tue Dec 18 11:42:19 2018
    17     0 days, 01:25:57 | Linux 3.10.0-957.1.3.el7  Tue Dec 18 10:16:08 2018
    18     0 days, 00:42:34 | Linux 3.10.0-1160.15.2.e  Sun Jul 25 18:49:38 2021
    19     0 days, 00:08:32 | Linux 3.10.0-1160.81.1.e  Sun Jan 22 12:30:52 2023
----------------------------+---------------------------------------------------
1up in     6 days, 22:08:18 | at                        Sat Apr 29 10:53:25 2023
no1 in   455 days, 18:52:44 | at                        Sun Jul 21 07:37:51 2024
    up  1586 days, 00:20:28 | since                     Tue Dec 18 10:16:08 2018
  down     0 days, 01:08:32 | since                     Tue Dec 18 10:16:08 2018
   %up               99.997 | since                     Tue Dec 18 10:16:08 2018

Conclusion



Guprecords is a small tool, but writing it made me like Raku a lot. The language is very expressive; you can say what you mean in very few lines.

Multiple paradigms, grammars, lazy evaluation: there is a lot in there.

So far, I have only scratched the surface of what Raku can do. I hope to find more time to become a regular Rakoon (a Raku Programmer). I have many Ideas for other small tools like Guprecords, but the challenge is finding the time. I'd love to explore Raku Grammars and also I would love to explore writing concurrent code in Raku (I also love Go (Golang), btw!). Ideas for future Raku personal projects include:


E-Mail your comments to hi@foo.zone :-)

Other related posts are:

2025-11-02 Perl New Features and Foostats
2023-05-01 Unveiling guprecords.raku: Global Uptime Records with Raku (You are currently reading this)
2022-06-15 Sweating the small stuff - Tiny projects of mine
2022-05-27 Perl is still a great choice
2011-05-07 Perl Daemon (Service Framework)
2008-06-26 Perl Poetry

Back to the main site