{"id":866,"date":"2026-10-16T16:30:41","date_gmt":"2026-10-16T15:30:41","guid":{"rendered":"http:\/\/magnusmanske.de\/wordpress\/?p=866"},"modified":"2026-10-16T16:30:41","modified_gmt":"2026-10-16T15:30:41","slug":"buggregator-dashboard","status":"publish","type":"post","link":"http:\/\/magnusmanske.de\/wordpress\/archives\/866","title":{"rendered":"Buggregator dashboard"},"content":{"rendered":"<p>I have ~350 tools running on Toolforge (and on-wiki scripts), so some years ago, I wrote a tool to <s>rule<\/s> manage them all. That included core to scour my talk pages (and my tools talk pages) on various wikis, github, bitbucket, codeberg, etc. for issue reports, keyword-guess (on wikis) which tool they belong to, and unify the issue reports. As it&#8217;s aggregating bug reports, I called it <a href=\"https:\/\/magnustools.toolforge.org\/buggregator\/\">buggregator<\/a>.<\/p>\n<p>I recently thought about the various long-running Rust services I have running on Toolforge, including web pages with compute (e.g. PetScan), background jobs (e.g. Listeria), web APIs (e.g. wd-infernal), and both (Mix&#8217;n&#8217;match). These are different from the usual PHP-based webservices, which just spawn a script on demand, and forget about once it has run its course.<\/p>\n<p><a href=\"http:\/\/magnusmanske.de\/wordpress\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-16-at-16.14.42.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-867\" src=\"http:\/\/magnusmanske.de\/wordpress\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-16-at-16.14.42-300x120.png\" alt=\"\" width=\"300\" height=\"120\" srcset=\"http:\/\/magnusmanske.de\/wordpress\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-16-at-16.14.42-300x120.png 300w, http:\/\/magnusmanske.de\/wordpress\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-16-at-16.14.42-1024x410.png 1024w, http:\/\/magnusmanske.de\/wordpress\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-16-at-16.14.42-768x307.png 768w, http:\/\/magnusmanske.de\/wordpress\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-16-at-16.14.42-1536x615.png 1536w, http:\/\/magnusmanske.de\/wordpress\/wp-content\/uploads\/2026\/10\/Screenshot-2026-10-16-at-16.14.42-2048x820.png 2048w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>To keep an eye on the Rust services, I added a <strong><a href=\"https:\/\/magnustools.toolforge.org\/buggregator\/#\/dashboard\">dashboard<\/a><\/strong> to buggregator. It tracks all 8 (9 if you count Mix&#8217;n&#8217;match webservice and background jobs as two separate ones) long-running Rust services, records minutely metrics, and logs restarts and their causes (manually\/planned, out-of-memory, crash, killed by the Toolforge watchdog, etc.). It also shows a quick summary of the state of the services.<\/p>\n<p>This is primarily for myself, but if you ever find a service of mine unresponsive, feel free to have a look.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I have ~350 tools running on Toolforge (and on-wiki scripts), so some years ago, I wrote a tool to rule manage them all. That included core to scour my talk pages (and my tools talk pages) on various wikis, github, bitbucket, codeberg, etc. for issue reports, keyword-guess (on wikis) which tool they belong to, and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,7],"tags":[],"class_list":["post-866","post","type-post","status-publish","format-standard","hentry","category-rust","category-wikimedia-2"],"_links":{"self":[{"href":"http:\/\/magnusmanske.de\/wordpress\/wp-json\/wp\/v2\/posts\/866","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/magnusmanske.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/magnusmanske.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/magnusmanske.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/magnusmanske.de\/wordpress\/wp-json\/wp\/v2\/comments?post=866"}],"version-history":[{"count":1,"href":"http:\/\/magnusmanske.de\/wordpress\/wp-json\/wp\/v2\/posts\/866\/revisions"}],"predecessor-version":[{"id":868,"href":"http:\/\/magnusmanske.de\/wordpress\/wp-json\/wp\/v2\/posts\/866\/revisions\/868"}],"wp:attachment":[{"href":"http:\/\/magnusmanske.de\/wordpress\/wp-json\/wp\/v2\/media?parent=866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/magnusmanske.de\/wordpress\/wp-json\/wp\/v2\/categories?post=866"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/magnusmanske.de\/wordpress\/wp-json\/wp\/v2\/tags?post=866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}