aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>2025-04-07 16:59:41 +0000
committerGerrit Code Review <gerrit@wikimedia.org>2025-04-07 16:59:41 +0000
commit7cd0f4e62adc27c9c7a070bc89a88054795a923b (patch)
tree1819602db72949177b2e08ee1a73071160dfb020
parentd4a22ffd011b22087442d74bbbec1e69dae2b59b (diff)
parent4e4deeb895b7b9b5eff94ad840898e14126ae8a1 (diff)
downloadmediawikicore-7cd0f4e62adc27c9c7a070bc89a88054795a923b.tar.gz
mediawikicore-7cd0f4e62adc27c9c7a070bc89a88054795a923b.zip
Merge "Make stats from RevisionOutputCache consistent with those from ParserCache"HEADmaster
-rw-r--r--includes/parser/RevisionOutputCache.php51
-rw-r--r--tests/phpunit/includes/parser/RevisionOutputCacheTest.php8
2 files changed, 49 insertions, 10 deletions
diff --git a/includes/parser/RevisionOutputCache.php b/includes/parser/RevisionOutputCache.php
index d1223451e126..f9aaef30d060 100644
--- a/includes/parser/RevisionOutputCache.php
+++ b/includes/parser/RevisionOutputCache.php
@@ -27,6 +27,7 @@ use InvalidArgumentException;
use JsonException;
use MediaWiki\Json\JsonCodec;
use MediaWiki\Revision\RevisionRecord;
+use MediaWiki\Revision\SlotRecord;
use MediaWiki\Utils\MWTimestamp;
use Psr\Log\LoggerInterface;
use Wikimedia\ObjectCache\WANObjectCache;
@@ -104,14 +105,28 @@ class RevisionOutputCache {
}
/**
+ * @param RevisionRecord $revision
+ * @return string
+ */
+ private function getContentModelFromRevision( RevisionRecord $revision ) {
+ if ( !$revision->hasSlot( SlotRecord::MAIN ) ) {
+ return 'missing';
+ }
+ return str_replace( '.', '_', $revision->getMainContentModel() );
+ }
+
+ /**
+ * @param RevisionRecord $revision
* @param string $status e.g. hit, miss etc.
* @param string|null $reason
*/
- private function incrementStats( string $status, ?string $reason = null ) {
+ private function incrementStats( RevisionRecord $revision, string $status, ?string $reason = null ) {
+ $contentModel = $this->getContentModelFromRevision( $revision );
$metricSuffix = $reason ? "{$status}_{$reason}" : $status;
$this->stats->getCounter( 'RevisionOutputCache_operation_total' )
->setLabel( 'name', $this->name )
+ ->setLabel( 'contentModel', $contentModel )
->setLabel( 'status', $status )
->setLabel( 'reason', $reason ?: 'n/a' )
->copyToStatsdAt( "RevisionOutputCache.{$this->name}.{$metricSuffix}" )
@@ -119,6 +134,21 @@ class RevisionOutputCache {
}
/**
+ * @param RevisionRecord $revision
+ * @param string $renderReason
+ */
+ private function incrementRenderReasonStats( RevisionRecord $revision, $renderReason ) {
+ $contentModel = $this->getContentModelFromRevision( $revision );
+ $renderReason = preg_replace( '/\W+/', '_', $renderReason );
+
+ $this->stats->getCounter( 'RevisionOutputCache_render_total' )
+ ->setLabel( 'name', $this->name )
+ ->setLabel( 'contentModel', $contentModel )
+ ->setLabel( 'reason', $renderReason )
+ ->increment();
+ }
+
+ /**
* Get a key that will be used by this cache to store the content
* for a given page considering the given options and the array of
* used options.
@@ -198,7 +228,7 @@ class RevisionOutputCache {
}
if ( !$parserOptions->isSafeToCache() ) {
- $this->incrementStats( 'miss', 'unsafe' );
+ $this->incrementStats( $revision, 'miss', 'unsafe' );
return false;
}
@@ -206,13 +236,13 @@ class RevisionOutputCache {
$json = $this->cache->get( $cacheKey );
if ( $json === false ) {
- $this->incrementStats( 'miss', 'absent' );
+ $this->incrementStats( $revision, 'miss', 'absent' );
return false;
}
$output = $this->restoreFromJson( $json, $cacheKey, ParserOutput::class );
if ( $output === null ) {
- $this->incrementStats( 'miss', 'unserialize' );
+ $this->incrementStats( $revision, 'miss', 'unserialize' );
return false;
}
@@ -221,12 +251,12 @@ class RevisionOutputCache {
$expiryTime = max( $expiryTime, (int)MWTimestamp::now( TS_UNIX ) - $this->cacheExpiry );
if ( $cacheTime < $expiryTime ) {
- $this->incrementStats( 'miss', 'expired' );
+ $this->incrementStats( $revision, 'miss', 'expired' );
return false;
}
$this->logger->debug( 'old-revision cache hit' );
- $this->incrementStats( 'hit' );
+ $this->incrementStats( $revision, 'hit' );
return $output;
}
@@ -283,23 +313,24 @@ class RevisionOutputCache {
$expiry = $output->getCacheExpiry();
if ( $expiry <= 0 ) {
- $this->incrementStats( 'save', 'uncacheable' );
+ $this->incrementStats( $revision, 'save', 'uncacheable' );
return;
}
if ( !$parserOptions->isSafeToCache() ) {
- $this->incrementStats( 'save', 'unsafe' );
+ $this->incrementStats( $revision, 'save', 'unsafe' );
return;
}
$json = $this->encodeAsJson( $output, $cacheKey );
if ( $json === null ) {
- $this->incrementStats( 'save', 'nonserializable' );
+ $this->incrementStats( $revision, 'save', 'nonserializable' );
return;
}
$this->cache->set( $cacheKey, $json, $expiry );
- $this->incrementStats( 'save', 'success' );
+ $this->incrementStats( $revision, 'save', 'success' );
+ $this->incrementRenderReasonStats( $revision, $parserOptions->getRenderReason() );
}
/**
diff --git a/tests/phpunit/includes/parser/RevisionOutputCacheTest.php b/tests/phpunit/includes/parser/RevisionOutputCacheTest.php
index 0a0a028214ea..03419b88c1bf 100644
--- a/tests/phpunit/includes/parser/RevisionOutputCacheTest.php
+++ b/tests/phpunit/includes/parser/RevisionOutputCacheTest.php
@@ -3,6 +3,7 @@
namespace MediaWiki\Tests\Parser;
use InvalidArgumentException;
+use MediaWiki\Content\WikitextContent;
use MediaWiki\Json\JsonCodec;
use MediaWiki\Page\PageIdentity;
use MediaWiki\Page\PageIdentityValue;
@@ -11,6 +12,7 @@ use MediaWiki\Parser\ParserOutput;
use MediaWiki\Parser\RevisionOutputCache;
use MediaWiki\Revision\MutableRevisionRecord;
use MediaWiki\Revision\RevisionRecord;
+use MediaWiki\Revision\SlotRecord;
use MediaWiki\Tests\Json\JsonDeserializableSuperClass;
use MediaWiki\User\User;
use MediaWiki\Utils\MWTimestamp;
@@ -58,6 +60,12 @@ class RevisionOutputCacheTest extends MediaWikiIntegrationTestCase {
);
$this->revision->setId( 24 );
$this->revision->setTimestamp( MWTimestamp::convert( TS_MW, $this->time ) );
+ $this->revision->setSlot(
+ SlotRecord::newUnsaved(
+ SlotRecord::MAIN,
+ new WikitextContent( 'test test test' )
+ )
+ );
}
/**