Skip to content

Instantly share code, notes, and snippets.

@scoates
Created May 24, 2011 18:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save scoates/989357 to your computer and use it in GitHub Desktop.
Save scoates/989357 to your computer and use it in GitHub Desktop.
<?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
try {
$host = 'localhost';
$port = 8125;
$fp = fsockopen("udp://$host", $port, $errno, $errstr);
if (! $fp) { return; }
foreach ($sampledData as $stat => $value) {
fwrite($fp, "$stat:$value");
}
fclose($fp);
} catch (Exception $e) {
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment