changeset 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
parents 623e23190c3e
children 1908e7aefca9
files mod_http_stats_stream/example.html mod_http_stats_stream/mod_http_stats_stream.lua
diffstat 2 files changed, 77 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_http_stats_stream/example.html	Wed Jan 04 09:18:34 2017 +0100
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Stats</title>
+</head>
+<body>
+<h1>Glorious statistics!</h1>
+<script>
+
+var evtSource = new EventSource("/streamstats");
+
+evtSource.addEventListener("stats-full", function(e) {
+	var initial_stats = JSON.parse(e.data);
+	console.log(initial_stats);
+
+}, false);
+
+evtSource.addEventListener("stats-updated", function(e) {
+	var updated_stats = JSON.parse(e.data);
+	console.log(updated_stats);
+
+}, false);
+
+</script>
+</body>
+</html>
--- /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;
+	}
+});