changeset 5667:9bcd257dea4e

mod_http_health: Provide a health check HTTP endpoint Someone in the chat asked about a health check endpoint, which reminded me of mod_http_status, which was simplified to produce this module.
author Kim Alvefur <zash@zash.se>
date Fri, 06 Oct 2023 16:49:57 +0200 (14 months ago)
parents e5ad3f1f48bd
children ecfd7aece33b
files mod_http_health/README.md mod_http_health/mod_http_health.lua
diffstat 2 files changed, 44 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_http_health/README.md	Fri Oct 06 16:49:57 2023 +0200
@@ -0,0 +1,23 @@
+Simple module adding an endpoint meant to be used for health checks.
+
+# Configuration
+
+After installing, enable by adding to [`modules_enabled`][doc:modules_enabled] like many other modules:
+
+``` lua
+-- in the global section
+modules_enabled = {
+    -- Other globally enabled modules here...
+    "http_health"; -- add
+}
+```
+
+# Details
+
+Adds a `http://your.prosody.example:5280/health` endpoint that returns either HTTP status code 200 when all appears to be good or 500 when any module
+[status][doc:developers:moduleapi#logging-and-status] has been set to `error`.
+
+# See also
+
+- [mod_measure_modules] provides module statues via OpenMetrics
+- [mod_http_status] provides all module status details as JSON via HTTP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_http_health/mod_http_health.lua	Fri Oct 06 16:49:57 2023 +0200
@@ -0,0 +1,21 @@
+module:set_global();
+
+
+local modulemanager = require "core.modulemanager";
+
+module:provides("http", {
+	route = {
+		GET = function()
+			for host in pairs(prosody.hosts) do
+				local mods = modulemanager.get_modules(host);
+				for _, mod in pairs(mods) do
+					if mod.module.status_type == "error" then
+						return { status_code = 500; headers = { content_type = "text/plain" }; body = "HAS ERRORS\n" };
+					end
+				end
+			end
+
+			return { status_code = 200; headers = { content_type = "text/plain" }; body = "OK\n" };
+		end;
+	};
+});