jenkins-bot has submitted this change and it was merged.
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, 80 insertions(+), 7 deletions(-)
Approvals:
Legoktm: Looks good to me, approved
jenkins-bot: Verified
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 9424614..819375d 100644
--- a/includes/libs/rdbms/lbfactory/LBFactorySingle.php
+++ b/includes/libs/rdbms/lbfactory/LBFactorySingle.php
@@ -79,6 +79,20 @@
}
/**
+ * @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
*/
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: merged
Gerrit-Change-Id: I6eae25e29aecf21251ad0eec53c56a86f35007f5
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Aaron Schulz <[email protected]>
Gerrit-Reviewer: Krinkle <[email protected]>
Gerrit-Reviewer: Legoktm <[email protected]>
Gerrit-Reviewer: Parent5446 <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits