# HG changeset patch # User Kim Alvefur # Date 1483517914 -3600 # Node ID 47a6f01231b2dee55e1836cb3b38e35747500d53 # Parent 623e23190c3e0402133e963e67f5ca735d327f1e mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream diff -r 623e23190c3e -r 47a6f01231b2 mod_http_stats_stream/example.html --- /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 @@ + + + + +Stats + + +

Glorious statistics!

+ + + diff -r 623e23190c3e -r 47a6f01231b2 mod_http_stats_stream/mod_http_stats_stream.lua --- /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; + } +});