Move StatsD key normalization from ProfilerOutputStats to BufferingStatsdDataFactory

I'm not sure why I stuck `normalizeMetricKey' in ProfilerOutputStats, because
the transformation it applies are suitable for converting any arbitrary string
into a StatsD-safe metric key. This patch moves the method to
BufferingStatsdDataFactory, which ensures it applies to all metrics logged
within MediaWiki, and not just the Profiler.

Supercedes If0237cdd0d.

Change-Id: I496ed748000d28f5399fee6e3cc271a1f68bd058
This commit is contained in:
Ori Livneh 2015-07-13 11:26:27 -07:00 committed by BryanDavis
parent 64b27eddd5
commit 0a25d776ad
2 changed files with 21 additions and 26 deletions

View file

@ -39,11 +39,28 @@ class BufferingStatsdDataFactory extends StatsdDataFactory {
$this->prefix = $prefix;
}
/**
* Normalize a metric key for StatsD
*
* Replace occurences of '::' with dots and any other non-alphabetic
* characters with underscores. Combine runs of dots or underscores.
* Then trim leading or trailing dots or underscores.
*
* @param string $key
* @since 1.26
*/
private static function normalizeMetricKey( $key ) {
$key = preg_replace( '/[:.]+/', '.', $key );
$key = preg_replace( '/[^a-z.]+/i', '_', $key );
$key = trim( $key, '_.' );
return str_replace( array( '._', '_.' ), '.', $key );
}
public function produceStatsdData( $key, $value = 1, $metric = StatsdDataInterface::STATSD_METRIC_COUNT ) {
$entity = $this->produceStatsdDataEntity();
if ( $key !== null ) {
$prefixedKey = ltrim( $this->prefix . '.' . $key, '.' );
$entity->setKey( $prefixedKey );
$key = self::normalizeMetricKey( "{$this->prefix}.{$key}" );
$entity->setKey( $key );
}
if ( $value !== null ) {
$entity->setValue( $value );

View file

@ -31,39 +31,17 @@
*/
class ProfilerOutputStats extends ProfilerOutput {
/**
* Normalize a metric key for StatsD
*
* Replace occurences of '::' with dots and any other non-alphabetic
* characters with underscores. Combine runs of dots or underscores.
* Then trim leading or trailing dots or underscores.
*
* @param string $key
* @since 1.26
*/
private static function normalizeMetricKey( $key ) {
$key = preg_replace( '/[:.]+/', '.', $key );
$key = preg_replace( '/[^a-z.]+/i', '_', $key );
$key = trim( $key, '_.' );
return str_replace( array( '._', '_.' ), '.', $key );
}
/**
* Flush profiling data to the current profiling context's stats buffer.
*
* @param array $stats
*/
public function log( array $stats ) {
if ( isset( $this->params['prefix'] ) ) {
$prefix = self::normalizeMetricKey( $this->params['prefix'] );
} else {
$prefix = '';
}
$prefix = isset( $this->params['prefix'] ) ? $this->params['prefix'] : '';
$contextStats = $this->collector->getContext()->getStats();
foreach ( $stats as $stat ) {
$key = self::normalizeMetricKey( "{$prefix}.{$stat['name']}" );
$key = "{$prefix}.{$stat['name']}";
// Convert fractional seconds to whole milliseconds
$cpu = round( $stat['cpu'] * 1000 );