This repository has been archived on 2024-09-05. You can view files and clone it, but cannot push or open issues or pull requests.
shimmie2/ext/statsd/main.php

120 lines
3.5 KiB
PHP
Raw Normal View History

<?php
/*
* Name: StatsD Interface
* Author: Shish <webmaster@shishnet.org>
* 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.time-db"] = "{$database->dbtime}|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");
2013-07-05 21:22:39 +00:00
if($event->page_matches("post/view")) { # 40%
$this->_stats("post-view");
}
else if($event->page_matches("post/list")) { # 30%
$this->_stats("post-list");
}
2013-07-05 21:22:39 +00:00
else if($event->page_matches("user")) {
$this->_stats("user");
}
else if($event->page_matches("upload")) {
$this->_stats("upload");
}
else if($event->page_matches("rss")) {
$this->_stats("rss");
}
else {
2013-07-05 21:22:39 +00:00
#global $_load_start;
#$time = microtime(true) - $_load_start;
#file_put_contents("data/other.log", "{$_SERVER['REQUEST_URI']} $time\n", FILE_APPEND);
$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";
}
2014-04-29 21:45:13 +00:00
/**
* @return int
*/
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) {
// ignore any failures.
}
}
}