function PerformanceTestTrait::collectPerformanceData
Same name in other branches
- 10 core/tests/Drupal/Tests/PerformanceTestTrait.php \Drupal\Tests\PerformanceTestTrait::collectPerformanceData()
Executes a callable and collects performance data.
Parameters
callable $callable: A callable, for example ::drupalGet().
string|null $service_name: An optional human readable identifier to enable sending traces to an Open Telemetry endpoint (if configured).
Return value
\Drupal\Tests\PerformanceData A PerformanceData value object.
17 calls to PerformanceTestTrait::collectPerformanceData()
- AssetAggregationAcrossPagesTest::testFrontAndRecipesPages in core/
profiles/ demo_umami/ tests/ src/ FunctionalJavascript/ AssetAggregationAcrossPagesTest.php - Checks the asset requests made when the front and recipe pages are visited.
- AssetAggregationAcrossPagesTest::testFrontAndRecipesPagesAuthenticated in core/
profiles/ demo_umami/ tests/ src/ FunctionalJavascript/ AssetAggregationAcrossPagesTest.php - Checks the asset requests made when the front and recipe pages are visited.
- OpenTelemetryAuthenticatedPerformanceTest::testFrontPageAuthenticatedWarmCache in core/
profiles/ demo_umami/ tests/ src/ FunctionalJavascript/ OpenTelemetryAuthenticatedPerformanceTest.php - Logs front page tracing data with an authenticated user and warm cache.
- OpenTelemetryFrontPagePerformanceTest::testFrontPageColdCache in core/
profiles/ demo_umami/ tests/ src/ FunctionalJavascript/ OpenTelemetryFrontPagePerformanceTest.php - Logs front page tracing data with a cold cache.
- OpenTelemetryFrontPagePerformanceTest::testFrontPageCoolCache in core/
profiles/ demo_umami/ tests/ src/ FunctionalJavascript/ OpenTelemetryFrontPagePerformanceTest.php - Logs front page tracing data with a lukewarm cache.
File
-
core/
tests/ Drupal/ Tests/ PerformanceTestTrait.php, line 98
Class
- PerformanceTestTrait
- Provides various methods to aid in collecting performance data during tests.
Namespace
Drupal\TestsCode
public function collectPerformanceData(callable $callable, ?string $service_name = NULL) : PerformanceData {
// Clear all existing performance logs before collecting new data. This is
// necessary because responses are returned back to tests prior to image
// and asset responses are returning to the browser, and before
// post-response tasks are guaranteed to have run. Assume that if there is
// no performance data logged by the child request within one second, that
// this means everything has finished.
$collection = \Drupal::keyValue('performance_test');
while ($collection->get('performance_test_data')) {
$collection->deleteAll();
sleep(1);
}
$session = $this->getSession();
$session->getDriver()
->getWebDriverSession()
->log('performance');
$collection->deleteAll();
$return = $callable();
$performance_data = $this->processChromeDriverPerformanceLogs($service_name);
if (isset($return)) {
$performance_data->setReturnValue($return);
}
$performance_test_data = $collection->get('performance_test_data');
if ($performance_test_data) {
// This property is set by \Drupal\Core\Test\TestSetupTrait and is needed.
if (!isset($this->databasePrefix)) {
throw new \Exception('Cannot log queries without knowing the database prefix.');
}
// Separate queries into two buckets, one for queries from the cache
// backend, and one for everything else (including those for cache tags).
$cache_get_count = 0;
$cache_set_count = 0;
$cache_delete_count = 0;
$cache_tag_is_valid_count = 0;
$cache_tag_invalidation_count = 0;
$cache_tag_checksum_count = 0;
$cache_tag_lookup_query_args = [];
foreach ($performance_test_data['database_events'] as $event) {
$normalized_query = static::normalizeQuery($event->queryString, $this->databasePrefix);
// Don't log queries from the database cache backend because they're
// logged separately as cache operations.
if (!static::isDatabaseCache($event)) {
static::logQuery($performance_data, $normalized_query, $event->args);
}
elseif (str_starts_with($normalized_query, 'SELECT "tag", "invalidations" FROM "cachetags"')) {
$cache_tag_lookup_query_args[] = array_values($event->args);
}
}
$cache_operations = [];
foreach ($performance_test_data['cache_operations'] as $operation) {
if (in_array($operation['operation'], [
'get',
'getMultiple',
], TRUE)) {
if (!isset($cache_operations['get'][$operation['bin']])) {
$cache_operations['get'][$operation['bin']] = [];
}
$cache_operations['get'][$operation['bin']][] = $operation['cids'];
$cache_get_count++;
}
elseif (in_array($operation['operation'], [
'set',
'setMultiple',
], TRUE)) {
if (!isset($cache_operations['get'][$operation['bin']])) {
$cache_operations['set'][$operation['bin']] = [];
}
$cache_operations['set'][$operation['bin']][] = $operation['cids'];
$cache_set_count++;
}
elseif (in_array($operation['operation'], [
'delete',
'deleteMultiple',
], TRUE)) {
if (!isset($cache_operations['delete'][$operation['bin']])) {
$cache_operations['delete'][$operation['bin']] = [];
}
$cache_operations['delete'][$operation['bin']][] = $operation['cids'];
$cache_delete_count++;
}
}
foreach ($performance_test_data['cache_tag_operations'] as $operation) {
match ($operation['operation']) { CacheTagOperation::GetCurrentChecksum => $cache_tag_checksum_count++,
CacheTagOperation::IsValid => $cache_tag_is_valid_count++,
CacheTagOperation::InvalidateTags => $cache_tag_invalidation_count++,
};
}
$performance_data->setCacheGetCount($cache_get_count);
$performance_data->setCacheSetCount($cache_set_count);
$performance_data->setCacheDeleteCount($cache_delete_count);
$performance_data->setCacheTagChecksumCount($cache_tag_checksum_count);
$performance_data->setCacheTagIsValidCount($cache_tag_is_valid_count);
$performance_data->setCacheTagInvalidationCount($cache_tag_invalidation_count);
$performance_data->setCacheOperations($cache_operations);
$performance_data->setCacheTagGroupedLookups($cache_tag_lookup_query_args);
}
return $performance_data;
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.