mod_http_stats_stream/mod_http_stats_stream.lua
author Matthew Wild <mwild1@gmail.com>
Sat, 24 Sep 2022 09:25:46 +0100
changeset 5062 39c2824c2880
parent 4599 bac3dae031ee
permissions -rw-r--r--
mod_cloud_notify: README overhaul
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3647
740870196b97 mod_http_stats_stream: Make global to simplify
Kim Alvefur <zash@zash.se>
parents: 3639
diff changeset
     1
module:set_global();
740870196b97 mod_http_stats_stream: Make global to simplify
Kim Alvefur <zash@zash.se>
parents: 3639
diff changeset
     2
2436
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
local statsman = require "core.statsmanager";
3639
fd054689a64c mod_http_stats_stream: Use existing header preparation
Kim Alvefur <zash@zash.se>
parents: 2436
diff changeset
     4
local http = require "net.http.server";
2436
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
local json = require "util.json";
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
4599
bac3dae031ee Add note of incompatibility with trunk since 5f15ab7c6ae5
Kim Alvefur <zash@zash.se>
parents: 3647
diff changeset
     7
assert(statsman.get_stats, "not compatible with trunk based on openmetrics");
bac3dae031ee Add note of incompatibility with trunk since 5f15ab7c6ae5
Kim Alvefur <zash@zash.se>
parents: 3647
diff changeset
     8
2436
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local sessions = {};
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
local function updates_client_closed(response)
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
	module:log("debug", "Streamstats client closed");
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
	sessions[response] = nil;
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
end
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
local function get_updates(event)
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
	local request, response = event.request, event.response;
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
	response.on_destroy = updates_client_closed;
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
3639
fd054689a64c mod_http_stats_stream: Use existing header preparation
Kim Alvefur <zash@zash.se>
parents: 2436
diff changeset
    21
	response.headers.content_type = "text/event-stream";
fd054689a64c mod_http_stats_stream: Use existing header preparation
Kim Alvefur <zash@zash.se>
parents: 2436
diff changeset
    22
	response.headers.x_accel_buffering = "no"; -- for nginx maybe?
fd054689a64c mod_http_stats_stream: Use existing header preparation
Kim Alvefur <zash@zash.se>
parents: 2436
diff changeset
    23
	local resp = http.prepare_header(response);
fd054689a64c mod_http_stats_stream: Use existing header preparation
Kim Alvefur <zash@zash.se>
parents: 2436
diff changeset
    24
	table.insert(resp, "event: stats-full\r\n");
fd054689a64c mod_http_stats_stream: Use existing header preparation
Kim Alvefur <zash@zash.se>
parents: 2436
diff changeset
    25
	table.insert(resp, "data: ");
fd054689a64c mod_http_stats_stream: Use existing header preparation
Kim Alvefur <zash@zash.se>
parents: 2436
diff changeset
    26
	table.insert(resp, json.encode(statsman.get_stats()));
fd054689a64c mod_http_stats_stream: Use existing header preparation
Kim Alvefur <zash@zash.se>
parents: 2436
diff changeset
    27
	table.insert(resp, "\r\n\r\n");
fd054689a64c mod_http_stats_stream: Use existing header preparation
Kim Alvefur <zash@zash.se>
parents: 2436
diff changeset
    28
	response.conn:write(table.concat(resp));
2436
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
	sessions[response] = request;
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
	return true;
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
end
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
3647
740870196b97 mod_http_stats_stream: Make global to simplify
Kim Alvefur <zash@zash.se>
parents: 3639
diff changeset
    35
module:hook("stats-updated", function (event)
2436
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
	local data = table.concat({
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
		"event: stats-updated";
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
		"data: "..json.encode(event.changed_stats);
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
		"";
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
		"";
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
	}, "\r\n")
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
	for response in pairs(sessions) do
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
		response.conn:write(data);
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
	end
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
end);
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
module:depends("http");
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
module:provides("http", {
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
	route = {
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
		GET = get_updates;
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
	}
47a6f01231b2 mod_http_stats_stream: Sends statistics from statsmanager over an HTTP event stream
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
});