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

Reply via email to