Joomla integration for Perfbase.
This package is a thin adapter over perfbase/php-sdk. It connects Joomla request and console lifecycle events to the Perfbase SDK while leaving extension interaction, payload construction, and submission to the shared SDK.
| Component | Supported |
|---|---|
| PHP | >=8.1 <9.0 |
| Joomla | 4.4 and 5.x |
| Package type | Joomla system plugin |
| Runtime contexts | HTTP and CLI |
| Perfbase SDK | ^1.0.0 |
| Perfbase PHP extension | Required at runtime |
This package supports:
- Site requests
- Administrator requests when
profile_adminis enabled - Joomla API requests as standard HTTP contexts
- Joomla console commands
This package does not currently provide:
- Dedicated Joomla scheduler or task lifecycles
- Deep component or template execution timelines beyond the main trace span
- End-to-end instrumentation tests inside full Joomla application installs
- HTTP profiling via Joomla lifecycle hooks
- CLI profiling for Joomla console commands
- Low-cardinality action and span naming
- Sanitized HTTP URLs without query strings
- Include and exclude filters for HTTP and CLI
- Production-safe failure handling
- Shutdown fallback cleanup for interrupted execution paths
- Runtime config validation for malformed adapter settings
Download the perfbase-joomla-<version>.zip artifact from the matching GitHub Release.
Release ZIPs are self-contained Joomla plugin artifacts. They include the production perfbase/php-sdk dependency under the plugin's own vendor/ directory, so normal Joomla Extension Manager installs do not require a Composer install in the Joomla root.
In Joomla administrator, go to:
System -> Install -> Extensions -> Upload Package File
Upload the release ZIP.
The plugin registers a Joomla update server:
https://raw.githubusercontent.com/perfbaseorg/joomla/main/updates/perfbase.xml
After the first ZIP install, Joomla can discover future releases through the administrator extension update UI. Release metadata points Joomla at the matching GitHub Release ZIP.
In Joomla administrator, enable:
System - Perfbase
The plugin depends on the Perfbase PHP extension at runtime. Without the extension, the plugin degrades safely but no traces will be captured.
For local development, place the source checkout under:
plugins/system/perfbase
Then install dependencies from the plugin directory:
composer install --no-dev --prefer-dist- Install and enable the Perfbase PHP extension.
- Install the release ZIP through Joomla Extension Manager.
- Enable
System - Perfbasein Joomla administrator. - Configure
api_key. - Set
enabled = yes. - Start with
sample_rate = 0.1. - Leave
profile_admin = nountil you want administrator coverage explicitly.
The plugin configuration UI is defined in perfbase.xml. Runtime normalization and validation live in ConfigResolver.php.
| Setting | Default | Description |
|---|---|---|
enabled |
false |
Master switch for profiling |
api_key |
empty | Required Perfbase project API key |
api_url |
https://ingress.perfbase.cloud |
Perfbase receiver URL |
sample_rate |
0.1 |
Fraction of requests and commands to profile |
timeout |
5 |
SDK request timeout in seconds |
proxy |
empty | Optional proxy URL |
flags |
8145 |
Curated Perfbase feature-flag bitmask |
| Setting | Default | Description |
|---|---|---|
profile_admin |
false |
Include administrator requests |
profile_http_status_codes |
200-299,500-599 |
HTTP status codes that should be submitted |
environment |
empty | Optional environment override |
app_version |
empty | Optional application-version override |
include_http |
* |
Newline-separated HTTP include filters |
exclude_http |
empty | Newline-separated HTTP exclude filters |
include_console |
* |
Newline-separated CLI include filters |
exclude_console |
empty | Newline-separated CLI exclude filters |
| Setting | Default | Description |
|---|---|---|
debug |
false |
Re-throw profiling errors during development |
log_errors |
true |
Log profiling errors when debug mode is off |
HTTP and CLI filters support:
*or.*to match everything- glob patterns like
cache:*orapi/* - regex patterns like
/^GET /
Examples:
include_http
*
GET com_content:article:display
api
exclude_http
/administrator/cache/*
/health
include_console
cache:*
database:*
Filters are matched against normalized identifiers rather than raw query-heavy URLs.
profile_http_status_codes accepts comma-separated values, newline-separated values, and ranges such as 200-299,500-599 or 200,201,404. The runtime config is normalized to an integer allowlist. Leave it blank if you want to disable HTTP trace submission entirely.
The plugin uses:
onAfterInitialiseonAfterRouteonAfterDispatchonAfterRespondregister_shutdown_function
HTTP actions are normalized to:
METHOD option:view:taskwhen Joomla route metadata existsMETHOD /sanitized/pathwhen it does not
Examples:
GET com_content:article:displayPOST /users/{id}
By default, 2xx and 5xx HTTP responses are submitted. A 404 will still be profiled in-process, but the trace is discarded unless profile_http_status_codes includes 404.
CLI spans are derived from the first non-option command token in $_SERVER['argv'].
Example:
cache:clean->console_cache_clean
source=httpactionhttp_methodhttp_urlhttp_status_codeuser_ipuser_agentuser_idhostnamephp_versionenvironmentapp_versionjoomla.clientjoomla.optionjoomla.viewjoomla.taskjoomla.format
Notes:
http_urlexcludes the query stringactionis low-cardinality by design- administrator requests are excluded unless
profile_adminis enabled
source=consoleactioncli.commandhostnamephp_versionenvironmentapp_version
- If the SDK cannot be initialized, the plugin fails open and does not break the host application.
- If the Perfbase extension is unavailable, the plugin no-ops safely.
- Invalid adapter config is validated at boot and logged in production mode.
- In production, profiling errors are logged only when
log_errorsis enabled. - In development, set
debug = yesif you want profiling errors to surface immediately.
Current package verification:
- PHPUnit: passing
- PHPStan: passing on
src/ - Overall line coverage:
99.52% - Overall method coverage:
98.55%
Key class coverage:
PerfbasePlugin.php:100%methods,100%linesHttpRequestLifecycle.php:100%methods,100%linesSpanNaming.php:100%methods,100%lines
CI coverage includes:
- the supported PHP baseline
- PHPUnit
- PHPStan
- Joomla framework-package smoke checks for the supported
4.4and5.xdependency lines - both HTTP and CLI smoke paths via
tests/Host/joomla-smoke.php - provider autoload coverage via
tests/Host/provider-autoload-smoke.php - local CMS stubs layered on top of
joomla/diandjoomla/event
The smoke job is not a full joomla/cms application install. It validates adapter compatibility against the supported Joomla framework-package lines plus local CMS stubs.
Commands used during development:
composer run test
./vendor/bin/phpstan analyse --memory-limit=2G --debug srcRelease artifacts are built automatically when a v<semver> tag is pushed on a commit reachable from main. The release workflow checks that the tag version matches perfbase.xml, builds dist/perfbase-joomla-<version>.zip, verifies the ZIP contents, attaches it to the GitHub Release, and commits updated Joomla update metadata to updates/perfbase.xml on main.
To build the same ZIP locally:
bin/build-release-zip v1.0.0
bin/verify-release-zip dist/perfbase-joomla-1.0.0.zip
bin/update-joomla-update-metadata v1.0.0
bin/verify-joomla-update-metadataIn this sandbox, composer run phpstan may fail because PHPStan tries to open a local TCP worker socket. The direct command above was used for the clean static-analysis run.
composer install
composer run test
./vendor/bin/phpstan analyse --memory-limit=2G --debug srcImportant files:
perfbase.xmlservices/provider.phpupdates/perfbase.xmlConfigResolver.phpPerfbasePlugin.phptests/ci.yml
Full documentation is available at perfbase.com/docs.
- Docs: perfbase.com/docs
- Issues: github.com/perfbaseorg/joomla/issues
- Support: support@perfbase.com
Apache-2.0. See LICENSE.txt.