*/
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,
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
*
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(),
throw new BadMethodCallException( "Method is not supported." );
}
+ /**
+ * @return LoadBalancerSingle[] Map of (cluster name => LoadBalancer)
+ */
+ public function getAllMainLBs() {
+ return [ 'DEFAULT' => $this->lb ];
+ }
+
+ /**
+ * @return LoadBalancerSingle[] Map of (cluster name => LoadBalancer)
+ */
+ public function getAllExternalLBs() {
+ return [];
+ }
+
/**
* @param string|callable $callback
* @param array $params
require_once __DIR__ . '/Maintenance.php';
+use MediaWiki\MediaWikiServices;
+
/**
* Maintenance script that displays replication lag times.
*
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 );
+ }
}
}
}