Aaron Schulz has uploaded a new change for review. https://gerrit.wikimedia.org/r/318215
Change subject: Improve getLagTimes.php output and add statsD flag ...................................................................... Improve getLagTimes.php output and add statsD flag * The script now lists all DBs in the LBFactory, not just those of the current wiki cluster. * Add a --report option to send the metrics to statsD so that the MediaWiki view of lag can be measured, rather than just the DB-level view. This avoids some noise with depooled servers. Bug: T149210 Change-Id: I6eae25e29aecf21251ad0eec53c56a86f35007f5 --- M includes/libs/rdbms/lbfactory/ILBFactory.php M includes/libs/rdbms/lbfactory/LBFactoryMulti.php M includes/libs/rdbms/lbfactory/LBFactorySimple.php M includes/libs/rdbms/lbfactory/LBFactorySingle.php M maintenance/getLagTimes.php 5 files changed, 81 insertions(+), 16 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core refs/changes/15/318215/1 diff --git a/includes/libs/rdbms/lbfactory/ILBFactory.php b/includes/libs/rdbms/lbfactory/ILBFactory.php index ff1bd43..5288c24 100644 --- a/includes/libs/rdbms/lbfactory/ILBFactory.php +++ b/includes/libs/rdbms/lbfactory/ILBFactory.php @@ -107,6 +107,22 @@ public function getExternalLB( $cluster ); /** + * Get cached (tracked) load balancers for all main database clusters + * + * @return LoadBalancer[] Map of (cluster name => LoadBalancer) + * @since 1.29 + */ + public function getAllMainLBs(); + + /** + * Get cached (tracked) load balancers for all external database clusters + * + * @return LoadBalancer[] Map of (cluster name => LoadBalancer) + * @since 1.29 + */ + public function getAllExternalLBs(); + + /** * Execute a function for each tracked load balancer * The callback is called with the load balancer as the first parameter, * and $params passed as the subsequent parameters. diff --git a/includes/libs/rdbms/lbfactory/LBFactoryMulti.php b/includes/libs/rdbms/lbfactory/LBFactoryMulti.php index a7cc16c..1d22873 100644 --- a/includes/libs/rdbms/lbfactory/LBFactoryMulti.php +++ b/includes/libs/rdbms/lbfactory/LBFactoryMulti.php @@ -284,6 +284,26 @@ return $this->extLBs[$cluster]; } + public function getAllMainLBs() { + $lbs = []; + foreach ( $this->sectionsByDB as $db => $section ) { + if ( !isset( $lbs[$section] ) ) { + $lbs[$section] = $this->getMainLB( $db ); + } + } + + return $lbs; + } + + public function getAllExternalLBs() { + $lbs = []; + foreach ( $this->externalLoads as $cluster => $unused ) { + $lbs[$cluster] = $this->getExternalLB( $cluster ); + } + + return $lbs; + } + /** * Make a new load balancer object based on template and load array * diff --git a/includes/libs/rdbms/lbfactory/LBFactorySimple.php b/includes/libs/rdbms/lbfactory/LBFactorySimple.php index 1e69d8f..5bf5032 100644 --- a/includes/libs/rdbms/lbfactory/LBFactorySimple.php +++ b/includes/libs/rdbms/lbfactory/LBFactorySimple.php @@ -108,6 +108,19 @@ return $this->extLBs[$cluster]; } + public function getAllMainLBs() { + return [ 'DEFAULT' => $this->getMainLB() ]; + } + + public function getAllExternalLBs() { + $lbs = []; + foreach ( $this->externalClusters as $cluster => $unused ) { + $lbs[$cluster] = $this->getExternalLB( $cluster ); + } + + return $lbs; + } + private function newLoadBalancer( array $servers ) { $lb = new LoadBalancer( array_merge( $this->baseLoadBalancerParams(), diff --git a/includes/libs/rdbms/lbfactory/LBFactorySingle.php b/includes/libs/rdbms/lbfactory/LBFactorySingle.php index e116888..819375d 100644 --- a/includes/libs/rdbms/lbfactory/LBFactorySingle.php +++ b/includes/libs/rdbms/lbfactory/LBFactorySingle.php @@ -70,20 +70,26 @@ return $this->lb; } - /** - * @param string $cluster External storage cluster name (unused) - * @return LoadBalancerSingle - */ public function newExternalLB( $cluster ) { - return $this->lb; + throw new BadMethodCallException( "Method is not supported." ); + } + + public function getExternalLB( $cluster ) { + throw new BadMethodCallException( "Method is not supported." ); } /** - * @param string $cluster External storage cluster name (unused) - * @return LoadBalancerSingle + * @return LoadBalancerSingle[] Map of (cluster name => LoadBalancer) */ - public function getExternalLB( $cluster ) { - return $this->lb; + public function getAllMainLBs() { + return [ 'DEFAULT' => $this->lb ]; + } + + /** + * @return LoadBalancerSingle[] Map of (cluster name => LoadBalancer) + */ + public function getAllExternalLBs() { + return []; } /** diff --git a/maintenance/getLagTimes.php b/maintenance/getLagTimes.php index c2c6958..677bfa2 100644 --- a/maintenance/getLagTimes.php +++ b/maintenance/getLagTimes.php @@ -23,6 +23,8 @@ require_once __DIR__ . '/Maintenance.php'; +use MediaWiki\MediaWikiServices; + /** * Maintenance script that displays replication lag times. * @@ -32,27 +34,35 @@ public function __construct() { parent::__construct(); $this->addDescription( 'Dump replication lag times' ); + $this->addOption( 'report', "Report the lag values to StatsD" ); } public function execute() { - $lb = wfGetLB(); + $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); + $stats = MediaWikiServices::getInstance()->getStatsdDataFactory(); - if ( $lb->getServerCount() == 1 ) { - $this->error( "This script dumps replication lag times, but you don't seem to have\n" - . "a multi-host db server configuration." ); - } else { + $lbs = $lbFactory->getAllMainLBs() + $lbFactory->getAllExternalLBs(); + foreach ( $lbs as $cluster => $lb ) { + if ( $lb->getServerCount() <= 1 ) { + continue; + } $lags = $lb->getLagTimes(); - foreach ( $lags as $n => $lag ) { - $host = $lb->getServerName( $n ); + foreach ( $lags as $serverIndex => $lag ) { + $host = $lb->getServerName( $serverIndex ); if ( IP::isValid( $host ) ) { $ip = $host; $host = gethostbyaddr( $host ); } else { $ip = gethostbyname( $host ); } + $starLen = min( intval( $lag ), 40 ); $stars = str_repeat( '*', $starLen ); $this->output( sprintf( "%10s %20s %3d %s\n", $ip, $host, $lag, $stars ) ); + + if ( $this->hasOption( 'report' ) ) { + $stats->gauge( "loadbalancer.lag.$cluster.$host", $lag ); + } } } } -- To view, visit https://gerrit.wikimedia.org/r/318215 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6eae25e29aecf21251ad0eec53c56a86f35007f5 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: Aaron Schulz <asch...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits