*
* @file
* @ingroup StatCounter
+ * @author Aaron Schulz
*/
/**
* @ingroup StatCounter
*/
class StatCounter {
- /** @var Array */
+ /** @var array */
protected $deltas = array(); // (key => count)
- protected function __construct() {}
+ /** @var Config */
+ protected $config;
+ protected function __construct( Config $config ) {
+ $this->config = $config;
+ }
+
+ /**
+ * @return StatCounter
+ */
public static function singleton() {
static $instance = null;
if ( !$instance ) {
- $instance = new self();
+ $instance = new self(
+ ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+ );
}
return $instance;
}
* Increment a key by delta $count
*
* @param string $key
- * @param integer $count
+ * @param int $count
* @return void
*/
public function incr( $key, $count = 1 ) {
+ $this->deltas[$key] = isset( $this->deltas[$key] ) ? $this->deltas[$key] : 0;
+ $this->deltas[$key] += $count;
if ( PHP_SAPI === 'cli' ) {
- $this->sendDelta( $key, $count );
- } else {
- if ( !isset( $this->deltas[$key] ) ) {
- $this->deltas[$key] = 0;
- }
- $this->deltas[$key] += $count;
+ $this->flush();
}
}
* @return void
*/
public function flush() {
- try {
- foreach ( $this->deltas as $key => $count ) {
- $this->sendDelta( $key, $count );
- }
- } catch ( MWException $e ) {
- trigger_error( "Caught exception: {$e->getMessage()}");
+ $statsMethod = $this->config->get( 'StatsMethod' );
+ $deltas = array_filter( $this->deltas ); // remove 0 valued entries
+ if ( $statsMethod === 'udp' ) {
+ $this->sendDeltasUDP( $deltas );
+ } elseif ( $statsMethod === 'cache' ) {
+ $this->sendDeltasMemc( $deltas );
+ } else {
+ // disabled
}
$this->deltas = array();
}
/**
- * @param string $key
- * @param string $count
+ * @param array $deltas
* @return void
*/
- protected function sendDelta( $key, $count ) {
- global $wgStatsMethod;
+ protected function sendDeltasUDP( array $deltas ) {
+ $aggregateStatsID = $this->config->get( 'AggregateStatsID' );
+ $id = strlen( $aggregateStatsID ) ? $aggregateStatsID : wfWikiID();
- $count = intval( $count );
- if ( $count == 0 ) {
- return;
+ $lines = array();
+ foreach ( $deltas as $key => $count ) {
+ $lines[] = sprintf( $this->config->get( 'StatsFormatString' ), $id, $count, $key );
}
- if ( $wgStatsMethod == 'udp' ) {
- global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
- static $socket;
-
- $id = $wgAggregateStatsID !== false ? $wgAggregateStatsID : wfWikiID();
-
+ if ( count( $lines ) ) {
+ static $socket = null;
if ( !$socket ) {
$socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
- $statline = "stats/{$id} - 1 1 1 1 1 -total\n";
+ }
+ $packet = '';
+ $packets = array();
+ foreach ( $lines as $line ) {
+ if ( ( strlen( $packet ) + strlen( $line ) ) > 1450 ) {
+ $packets[] = $packet;
+ $packet = '';
+ }
+ $packet .= $line;
+ }
+ if ( $packet != '' ) {
+ $packets[] = $packet;
+ }
+ foreach ( $packets as $packet ) {
+ wfSuppressWarnings();
socket_sendto(
$socket,
- $statline,
- strlen( $statline ),
+ $packet,
+ strlen( $packet ),
0,
- $wgUDPProfilerHost,
- $wgUDPProfilerPort
+ $this->config->get( 'UDPProfilerHost' ),
+ $this->config->get( 'UDPProfilerPort' )
);
+ wfRestoreWarnings();
}
- $statline = "stats/{$id} - {$count} 1 1 1 1 {$key}\n";
- wfSuppressWarnings();
- socket_sendto(
- $socket,
- $statline,
- strlen( $statline ),
- 0,
- $wgUDPProfilerHost,
- $wgUDPProfilerPort
- );
- wfRestoreWarnings();
- } elseif ( $wgStatsMethod == 'cache' ) {
- global $wgMemc;
- $key = wfMemcKey( 'stats', $key );
- if ( is_null( $wgMemc->incr( $key, $count ) ) ) {
- $wgMemc->add( $key, $count );
+ }
+ }
+
+ /**
+ * @param array $deltas
+ * @return void
+ */
+ protected function sendDeltasMemc( array $deltas ) {
+ global $wgMemc;
+
+ foreach ( $deltas as $key => $count ) {
+ $ckey = wfMemcKey( 'stats', $key );
+ if ( $wgMemc->incr( $ckey, $count ) === null ) {
+ $wgMemc->add( $ckey, $count );
}
- } else {
- // Disabled
}
}
}