Mercurial > prosody-modules
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; + } +});