function PerformanceTestTrait::collectPerformanceData

Same name in other branches
  1. 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.

15 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.

... See full list

File

core/tests/Drupal/Tests/PerformanceTestTrait.php, line 98

Class

PerformanceTestTrait
Provides various methods to aid in collecting performance data during tests.

Namespace

Drupal\Tests

Code

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;
        foreach ($performance_test_data['database_events'] as $event) {
            // Don't log queries from the database cache backend because they're
            // logged separately as cache operations.
            if (!static::isDatabaseCache($event)) {
                // Make the query easier to read and log it.
                static::logQuery($performance_data, str_replace([
                    $this->databasePrefix,
                    "\r\n",
                    "\r",
                    "\n",
                ], [
                    '',
                    ' ',
                    ' ',
                    ' ',
                ], $event->queryString), $event->args);
            }
        }
        foreach ($performance_test_data['cache_operations'] as $operation) {
            if (in_array($operation['operation'], [
                'get',
                'getMultiple',
            ], TRUE)) {
                $cache_get_count++;
            }
            elseif (in_array($operation['operation'], [
                'set',
                'setMultiple',
            ], TRUE)) {
                $cache_set_count++;
            }
            elseif (in_array($operation['operation'], [
                'delete',
                'deleteMultiple',
            ], TRUE)) {
                $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);
    }
    return $performance_data;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.