ProfilerOutputStats: allow a key prefix to be specified
authorOri Livneh <ori@wikimedia.org>
Thu, 21 May 2015 18:07:39 +0000 (11:07 -0700)
committerOri Livneh <ori@wikimedia.org>
Thu, 21 May 2015 18:11:21 +0000 (11:11 -0700)
If one wants to nest all metrics emitted by the profiler under a metric
namespace, one can now set the 'prefix' param.

Task: T66301
Change-Id: I6c52f20e39017f4c818ca6623bb7f48683fc8abc

includes/profiler/output/ProfilerOutputStats.php

index a635793..0d75191 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 = str_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 = '';
+               }
+
                $contextStats = $this->collector->getContext()->getStats();
 
                foreach ( $stats as $stat ) {
-                       // Sanitize the key
-                       $key = str_replace( '::', '.', $stat['name'] );
-                       $key = preg_replace( '/[^a-z.]+/i', '_', $key );
-                       $key = trim( $key, '_.' );
-                       $key = str_replace( array( '._', '_.' ), '.', $key );
+                       $key = self::normalizeMetricKey( "{$prefix}.{$stat['name']}" );
 
                        // Convert fractional seconds to whole milliseconds
                        $cpu = round( $stat['cpu'] * 1000 );