Mercurial > prosody-hg
comparison core/statsmanager.lua @ 6554:6c22bec3e8d0
statsmanager, prosody: New core module and API for gathering statistics about the running server
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 20 Jan 2015 12:33:20 +0000 |
| parents | |
| children | 7b2d16c14659 |
comparison
equal
deleted
inserted
replaced
| 6553:0e29c05c3503 | 6554:6c22bec3e8d0 |
|---|---|
| 1 | |
| 2 local stats = require "util.statistics".new(); | |
| 3 local config = require "core.configmanager"; | |
| 4 local log = require "util.logger".init("stats"); | |
| 5 local timer = require "util.timer"; | |
| 6 local fire_event = prosody.events.fire_event; | |
| 7 | |
| 8 local stats_config = config.get("*", "statistics_interval"); | |
| 9 local stats_interval = tonumber(stats_config); | |
| 10 if stats_config and not stats_interval then | |
| 11 log("error", "Invalid 'statistics_interval' setting, statistics will be disabled"); | |
| 12 end | |
| 13 | |
| 14 local measure, collect; | |
| 15 local latest_stats = {}; | |
| 16 local changed_stats = {}; | |
| 17 local stats_extra = {}; | |
| 18 | |
| 19 if stats_interval then | |
| 20 log("debug", "Statistics collection is enabled every %d seconds", stats_interval); | |
| 21 function measure(type, name) | |
| 22 local f = assert(stats[type], "unknown stat type: "..type); | |
| 23 return f(name); | |
| 24 end | |
| 25 | |
| 26 local mark_collection_start = measure("duration", "stats.collection_time"); | |
| 27 local mark_processing_start = measure("duration", "stats.processing_time"); | |
| 28 | |
| 29 function collect() | |
| 30 local mark_collection_done = mark_collection_start(); | |
| 31 changed_stats, stats_extra = {}, {}; | |
| 32 for name, getter in pairs(stats.get_stats()) do | |
| 33 local type, value, extra = getter(); | |
| 34 local stat_name = name..":"..type; | |
| 35 local old_value = latest_stats[stat_name]; | |
| 36 latest_stats[stat_name] = value; | |
| 37 if value ~= old_value then | |
| 38 changed_stats[stat_name] = value; | |
| 39 end | |
| 40 if extra then | |
| 41 print(stat_name, extra) | |
| 42 stats_extra[stat_name] = extra; | |
| 43 if type == "duration" then | |
| 44 local rate = extra.rate; | |
| 45 local rate_name = name..":rate"; | |
| 46 latest_stats[rate_name] = rate; | |
| 47 changed_stats[rate_name] = rate; | |
| 48 end | |
| 49 end | |
| 50 end | |
| 51 mark_collection_done(); | |
| 52 local mark_processing_done = mark_processing_start(); | |
| 53 fire_event("stats-updated", { stats = latest_stats, changed_stats = changed_stats, stats_extra = stats_extra }); | |
| 54 mark_processing_done(); | |
| 55 return stats_interval; | |
| 56 end | |
| 57 | |
| 58 timer.add_task(stats_interval, collect); | |
| 59 else | |
| 60 log("debug", "Statistics collection is disabled"); | |
| 61 -- nop | |
| 62 function measure() | |
| 63 return measure; | |
| 64 end | |
| 65 function collect() | |
| 66 end | |
| 67 end | |
| 68 | |
| 69 return { | |
| 70 measure = measure; | |
| 71 collect = collect; | |
| 72 get_stats = function () | |
| 73 return latest_stats, changed_stats, stats_extra; | |
| 74 end; | |
| 75 }; |
