Skip to content

Instantly share code, notes, and snippets.

@jbarciauskas
Created July 5, 2011 16:25
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save jbarciauskas/1065177 to your computer and use it in GitHub Desktop.
Save jbarciauskas/1065177 to your computer and use it in GitHub Desktop.
PHP client for StatsD
<?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;
}
}
@spatzle
Copy link

spatzle commented Oct 3, 2012

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

@liuggio
Copy link

liuggio commented Dec 8, 2012

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment