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:
parent
64b27eddd5
commit
0a25d776ad
2 changed files with 21 additions and 26 deletions
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
Loading…
Reference in a new issue