Move StatsD key normalization from ProfilerOutputStats to BufferingStatsdDataFactory
authorOri Livneh <ori@wikimedia.org>
Mon, 13 Jul 2015 18:26:27 +0000 (11:26 -0700)
committerBryanDavis <bdavis@wikimedia.org>
Mon, 13 Jul 2015 19:07:02 +0000 (19:07 +0000)
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

includes/libs/BufferingStatsdDataFactory.php
includes/profiler/output/ProfilerOutputStats.php

index 0caf90b..192b119 100644 (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 );
index d816a01..52aa54a 100644 (file)
  */
 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 );