From: Kunal Mehta Date: Wed, 21 Sep 2016 07:47:55 +0000 (-0700) Subject: Move SamplingStatsdClient into stats/ subdirectory X-Git-Tag: 1.31.0-rc.0~5402^2 X-Git-Url: http://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/categories/modifier.php?a=commitdiff_plain;h=5f56f08dfa37b113cf33f64cdbdc14e9d4800b62;p=lhc%2Fweb%2Fwiklou.git Move SamplingStatsdClient into stats/ subdirectory Change-Id: Ib871aa5cd674d58da3d19bfbb5660539afc863b3 --- diff --git a/autoload.php b/autoload.php index 0c16e7625b..f2e1ed53c1 100644 --- a/autoload.php +++ b/autoload.php @@ -1224,7 +1224,7 @@ $wgAutoloadLocalClasses = [ 'SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.php', 'SVGMetadataExtractor' => __DIR__ . '/includes/media/SVGMetadataExtractor.php', 'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php', - 'SamplingStatsdClient' => __DIR__ . '/includes/libs/SamplingStatsdClient.php', + 'SamplingStatsdClient' => __DIR__ . '/includes/libs/stats/SamplingStatsdClient.php', 'Sanitizer' => __DIR__ . '/includes/Sanitizer.php', 'SavepointPostgres' => __DIR__ . '/includes/libs/rdbms/database/utils/SavepointPostgres.php', 'ScopedCallback' => __DIR__ . '/includes/libs/ScopedCallback.php', diff --git a/includes/libs/SamplingStatsdClient.php b/includes/libs/SamplingStatsdClient.php deleted file mode 100644 index dd1976c06e..0000000000 --- a/includes/libs/SamplingStatsdClient.php +++ /dev/null @@ -1,157 +0,0 @@ -samplingRates = $samplingRates; - } - - /** - * Sets sampling rate for all items in $data. - * The sample rate specified in a StatsdData entity overrides the sample rate specified here. - * - * {@inheritDoc} - */ - public function appendSampleRate( $data, $sampleRate = 1 ) { - $samplingRates = $this->samplingRates; - if ( !$samplingRates && $sampleRate !== 1 ) { - $samplingRates = [ '*' => $sampleRate ]; - } - if ( $samplingRates ) { - array_walk( $data, function( $item ) use ( $samplingRates ) { - /** @var $item StatsdData */ - foreach ( $samplingRates as $pattern => $rate ) { - if ( fnmatch( $pattern, $item->getKey(), FNM_NOESCAPE ) ) { - $item->setSampleRate( $item->getSampleRate() * $rate ); - break; - } - } - } ); - } - - return $data; - } - - /* - * Send the metrics over UDP - * Sample the metrics according to their sample rate and send the remaining ones. - * - * @param StatsdDataInterface|StatsdDataInterface[] $data message(s) to sent - * strings are not allowed here as sampleData requires a StatsdDataInterface - * @param int $sampleRate - * - * @return integer the data sent in bytes - */ - public function send( $data, $sampleRate = 1 ) { - if ( !is_array( $data ) ) { - $data = [ $data ]; - } - if ( !$data ) { - return; - } - foreach ( $data as $item ) { - if ( !( $item instanceof StatsdDataInterface ) ) { - throw new InvalidArgumentException( - 'SamplingStatsdClient does not accept stringified messages' ); - } - } - - // add sampling - $data = $this->appendSampleRate( $data, $sampleRate ); - $data = $this->sampleData( $data ); - - $data = array_map( 'strval', $data ); - - // reduce number of packets - if ( $this->getReducePacket() ) { - $data = $this->reduceCount( $data ); - } - - // failures in any of this should be silently ignored if .. - $written = 0; - try { - $fp = $this->getSender()->open(); - if ( !$fp ) { - return; - } - foreach ( $data as $message ) { - $written += $this->getSender()->write( $fp, $message ); - } - $this->getSender()->close( $fp ); - } catch ( Exception $e ) { - $this->throwException( $e ); - } - - return $written; - } - - /** - * Throw away some of the data according to the sample rate. - * @param StatsdDataInterface[] $data - * @return StatsdDataInterface[] - * @throws LogicException - */ - protected function sampleData( $data ) { - $newData = []; - $mt_rand_max = mt_getrandmax(); - foreach ( $data as $item ) { - $samplingRate = $item->getSampleRate(); - if ( $samplingRate <= 0.0 || $samplingRate > 1.0 ) { - throw new LogicException( 'Sampling rate shall be within ]0, 1]' ); - } - if ( - $samplingRate === 1 || - ( mt_rand() / $mt_rand_max <= $samplingRate ) - ) { - $newData[] = $item; - } - } - return $newData; - } - - /** - * {@inheritDoc} - */ - protected function throwException( Exception $exception ) { - if ( !$this->getFailSilently() ) { - throw $exception; - } - } -} diff --git a/includes/libs/stats/SamplingStatsdClient.php b/includes/libs/stats/SamplingStatsdClient.php new file mode 100644 index 0000000000..dd1976c06e --- /dev/null +++ b/includes/libs/stats/SamplingStatsdClient.php @@ -0,0 +1,157 @@ +samplingRates = $samplingRates; + } + + /** + * Sets sampling rate for all items in $data. + * The sample rate specified in a StatsdData entity overrides the sample rate specified here. + * + * {@inheritDoc} + */ + public function appendSampleRate( $data, $sampleRate = 1 ) { + $samplingRates = $this->samplingRates; + if ( !$samplingRates && $sampleRate !== 1 ) { + $samplingRates = [ '*' => $sampleRate ]; + } + if ( $samplingRates ) { + array_walk( $data, function( $item ) use ( $samplingRates ) { + /** @var $item StatsdData */ + foreach ( $samplingRates as $pattern => $rate ) { + if ( fnmatch( $pattern, $item->getKey(), FNM_NOESCAPE ) ) { + $item->setSampleRate( $item->getSampleRate() * $rate ); + break; + } + } + } ); + } + + return $data; + } + + /* + * Send the metrics over UDP + * Sample the metrics according to their sample rate and send the remaining ones. + * + * @param StatsdDataInterface|StatsdDataInterface[] $data message(s) to sent + * strings are not allowed here as sampleData requires a StatsdDataInterface + * @param int $sampleRate + * + * @return integer the data sent in bytes + */ + public function send( $data, $sampleRate = 1 ) { + if ( !is_array( $data ) ) { + $data = [ $data ]; + } + if ( !$data ) { + return; + } + foreach ( $data as $item ) { + if ( !( $item instanceof StatsdDataInterface ) ) { + throw new InvalidArgumentException( + 'SamplingStatsdClient does not accept stringified messages' ); + } + } + + // add sampling + $data = $this->appendSampleRate( $data, $sampleRate ); + $data = $this->sampleData( $data ); + + $data = array_map( 'strval', $data ); + + // reduce number of packets + if ( $this->getReducePacket() ) { + $data = $this->reduceCount( $data ); + } + + // failures in any of this should be silently ignored if .. + $written = 0; + try { + $fp = $this->getSender()->open(); + if ( !$fp ) { + return; + } + foreach ( $data as $message ) { + $written += $this->getSender()->write( $fp, $message ); + } + $this->getSender()->close( $fp ); + } catch ( Exception $e ) { + $this->throwException( $e ); + } + + return $written; + } + + /** + * Throw away some of the data according to the sample rate. + * @param StatsdDataInterface[] $data + * @return StatsdDataInterface[] + * @throws LogicException + */ + protected function sampleData( $data ) { + $newData = []; + $mt_rand_max = mt_getrandmax(); + foreach ( $data as $item ) { + $samplingRate = $item->getSampleRate(); + if ( $samplingRate <= 0.0 || $samplingRate > 1.0 ) { + throw new LogicException( 'Sampling rate shall be within ]0, 1]' ); + } + if ( + $samplingRate === 1 || + ( mt_rand() / $mt_rand_max <= $samplingRate ) + ) { + $newData[] = $item; + } + } + return $newData; + } + + /** + * {@inheritDoc} + */ + protected function throwException( Exception $exception ) { + if ( !$this->getFailSilently() ) { + throw $exception; + } + } +}