mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
--- /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;
+ }
+});