Diff

mod_http_stats_stream/mod_http_stats_stream.lua @ 2432:47a6f01231b2

mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
author Kim Alvefur <zash@zash.se>
date Wed, 04 Jan 2017 09:18:34 +0100
child 3635:fd054689a64c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_http_stats_stream/mod_http_stats_stream.lua	Wed Jan 04 09:18:34 2017 +0100
@@ -0,0 +1,50 @@
+local statsman = require "core.statsmanager";
+local json = require "util.json";
+
+local sessions = {};
+
+local function updates_client_closed(response)
+	module:log("debug", "Streamstats client closed");
+	sessions[response] = nil;
+end
+
+local function get_updates(event)
+	local request, response = event.request, event.response;
+
+	response.on_destroy = updates_client_closed;
+
+	response.conn:write(table.concat({
+		"HTTP/1.1 200 OK";
+		"Content-Type: text/event-stream";
+		"X-Accel-Buffering: no"; -- For nginx maybe?
+		"";
+		"event: stats-full";
+		"data: "..json.encode(statsman.get_stats());
+		"";
+		"";
+	}, "\r\n"));
+
+	sessions[response] = request;
+	return true;
+end
+
+
+module:hook_global("stats-updated", function (event)
+	local data = table.concat({
+		"event: stats-updated";
+		"data: "..json.encode(event.changed_stats);
+		"";
+		"";
+	}, "\r\n")
+	for response in pairs(sessions) do
+		response.conn:write(data);
+	end
+end);
+
+
+module:depends("http");
+module:provides("http", {
+	route = {
+		GET = get_updates;
+	}
+});