public
Last active

PHP client for StatsD

  • Download Gist
StatsD.php
PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
<?php
 
/**
* Sends statistics to the stats daemon over UDP
*
**/
 
class StatsD {
 
/**
* Log timing information
*
* @param string $stats The metric to in log timing info for.
* @param float $time The ellapsed time (ms) to log
* @param float|1 $sampleRate the rate (0-1) for sampling.
**/
public static function timing($stat, $time, $sampleRate=1) {
StatsD::send(array($stat => "$time|ms"), $sampleRate);
}
 
/**
* Increments one or more stats counters
*
* @param string|array $stats The metric(s) to increment.
* @param float|1 $sampleRate the rate (0-1) for sampling.
* @return boolean
**/
public static function increment($stats, $sampleRate=1) {
StatsD::updateStats($stats, 1, $sampleRate);
}
 
/**
* Decrements one or more stats counters.
*
* @param string|array $stats The metric(s) to decrement.
* @param float|1 $sampleRate the rate (0-1) for sampling.
* @return boolean
**/
public static function decrement($stats, $sampleRate=1) {
StatsD::updateStats($stats, -1, $sampleRate);
}
 
/**
* Updates one or more stats counters by arbitrary amounts.
*
* @param string|array $stats The metric(s) to update. Should be either a string or array of metrics.
* @param int|1 $delta The amount to increment/decrement each metric by.
* @param float|1 $sampleRate the rate (0-1) for sampling.
* @return boolean
**/
public static function updateStats($stats, $delta=1, $sampleRate=1) {
if (!is_array($stats)) { $stats = array($stats); }
$data = array();
foreach($stats as $stat) {
$data[$stat] = "$delta|c";
}
 
StatsD::send($data, $sampleRate);
}
 
/*
* Squirt the metrics over UDP
**/
public static function send($data, $sampleRate=1) {
 
// 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
$fp = fsockopen("udp://localhost", 8125, $errno, $errstr);
if (! $fp) { return; }
foreach ($sampledData as $stat => $value) {
echo "$stat:$value";
fwrite($fp, "$stat:$value");
}
fclose($fp);
echo $errno . "\t" . $errstr;
}
}

out of curiosity, can we have gauges in the client, too? Thanks J

I suggest take a look to this library
stats-php-client

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.