From 029719cafeb79104f611ec489dc5d00ba868e6d9 Mon Sep 17 00:00:00 2001 From: Shish Date: Fri, 22 Jun 2012 18:34:23 +0100 Subject: [PATCH] statsd ext, for trivially making graphs of site activity --- ext/statsd/main.php | 102 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 ext/statsd/main.php diff --git a/ext/statsd/main.php b/ext/statsd/main.php new file mode 100644 index 00000000..d9a79679 --- /dev/null +++ b/ext/statsd/main.php @@ -0,0 +1,102 @@ + +* License: GPLv2 +* Visibility: admin +* Description: Sends Shimmie stats to a StatsD server +* Documentation: +* define('STATSD_HOST', 'my.server.com:8125'); in shimmie.conf.php to set the host +*/ + +_d("STATSD_HOST", null); + +function dstat($name, $val) { + StatsDInterface::$stats["shimmie.$name"] = $val; +} + +class StatsDInterface extends Extension { + public static $stats = array(); + + private function _stats($type) { + global $config, $_event_count, $database, $_execs, $_load_start; + $time = microtime(true) - $_load_start; + StatsDInterface::$stats["shimmie.$type.hits"] = "1|c"; + StatsDInterface::$stats["shimmie.$type.time"] = "$time|ms"; + StatsDInterface::$stats["shimmie.$type.memory"] = memory_get_peak_usage(true)."|c"; + StatsDInterface::$stats["shimmie.$type.files"] = count(get_included_files())."|c"; + StatsDInterface::$stats["shimmie.$type.queries"] = $_execs."|c"; + StatsDInterface::$stats["shimmie.$type.events"] = $_event_count."|c"; + StatsDInterface::$stats["shimmie.$type.cache-hits"] = $database->cache->get_hits()."|c"; + StatsDInterface::$stats["shimmie.$type.cache-misses"] = $database->cache->get_misses()."|c"; + } + + public function onPageRequest($event) { + $this->_stats("overall"); + + if($event->page_matches("post/list")) { + $this->_stats("post-list"); + } + else if($event->page_matches("post/view")) { + $this->_stats("post-view"); + } + else { + $this->_stats("other"); + } + + $this->send(StatsDInterface::$stats, 1.0); + StatsDInterface::$stats = array(); + } + + public function onUserCreation($event) { + StatsDInterface::$stats["shimmie.events.user_creations"] = "1|c"; + } + + public function onDataUpload($event) { + StatsDInterface::$stats["shimmie.events.uploads"] = "1|c"; + } + + public function onCommentPosting($event) { + StatsDInterface::$stats["shimmie.events.comments"] = "1|c"; + } + + public function onImageInfoSet($event) { + StatsDInterface::$stats["shimmie.events.info-sets"] = "1|c"; + } + + public function get_priority() {return 99;} + + + private function send($data, $sampleRate=1) { + if (!STATSD_HOST) { return; } + + // sampling + $sampledData = array(); + + if ($sampleRate < 1) { + foreach ($data as $stat => $value) { + if ((mt_rand() / mt_getrandmax()) <= $sampleRate) { + $sampledData[$stat] = "$value|@$sampleRate"; + } + } + } else { + $sampledData = $data; + } + + if (empty($sampledData)) { return; } + + // Wrap this in a try/catch - failures in any of this should be silently ignored + try { + $parts = explode(":", STATSD_HOST); + $host = $parts[0]; + $port = $parts[1]; + $fp = fsockopen("udp://$host", $port, $errno, $errstr); + if (! $fp) { return; } + foreach ($sampledData as $stat => $value) { + fwrite($fp, "$stat:$value"); + } + fclose($fp); + } catch (Exception $e) { + } + } +}