teamneusta / sentry-tracing-typo3
TYPO3 的 Sentry 跟踪
Requires
- networkteam/sentry-client: *
- typo3/cms-core: ^12.4
Requires (Dev)
- ergebnis/composer-normalize: dev-main
- friendsofphp/php-cs-fixer: ^3.14
- phpstan/extension-installer: 1.2.x-dev
- phpstan/phpstan: 1.11.x-dev
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-strict-rules: 1.5.x-dev
- roave/security-advisories: dev-latest
- seld/jsonlint: dev-main
- symfony/yaml: 6.3.x-dev
- typo3/coding-standards: *
- typo3/testing-framework: *
This package is auto-updated.
Last update: 2024-09-12 09:49:49 UTC
README
使用 Sentry 跟踪为 TYPO3 提供性能监控。它提供了与管理员面板 TS 跟踪视图相同的功能信息。
此外,它还提供了一个 DataProcessor,可以将跟踪请求信息添加到前端,以便 Sentry 前端 JavaScript 添加前端性能信息,跟踪前端和后端。
先决条件
该扩展在 networkteam/sentry-client 的基础上提供了额外的功能。它需要安装并配置 networkteam/sentry-client 扩展,因为它使用相同的 Sentry 基本配置。
安装
使用 composer 安装扩展
composer require neusta/sentry-tracing-typo3
配置
转到扩展配置并启用跟踪功能。您可以配置采样率(其中 0.2 表示 20% 的请求被跟踪)。为了测试目的,您可以设置采样率为 1.0 以跟踪所有请求。
前端跟踪
此扩展默认不提供前端跟踪。您需要将 Sentry 前端 JavaScript 添加到您的客户端。有关详细信息,请参阅 Sentry 文档(https://docs.sentry.io/platforms/javascript/ - 严重依赖您的客户端设置)。
您可以使用提供的 DataProcessor 将跟踪信息添加到前端,以便连接后端和前端的跟踪。将 DataProcessor 添加到您的页面渲染配置中
例如
page.10.dataProcessing.100 = Neusta\SentryTracing\DataProcessing\SentryTraceProcessor
然后您可以在 Fluid 中访问跟踪信息。
请注意,跟踪信息可能会根据您如何和在哪里包含元标签而缓存。
如果您在项目中有一个元标签视图助手,您可以将跟踪信息添加到相应的元标签中
<nsd:metaTag content="{sentry.baggage}" name="baggage"/> <nsd:metaTag content="{sentry.trace}" name="sentry-trace"/>
一个示例元标签视图助手可能看起来像这样(受 news
扩展的启发)
<?php declare(strict_types=1); namespace Neusta\Theme\ViewHelpers; use TYPO3\CMS\Core\MetaTag\MetaTagManagerRegistry; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface; use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper; use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic; final class MetaTagViewHelper extends AbstractViewHelper { use CompileWithRenderStatic; /** * Arguments initialization */ public function initializeArguments() { $this->registerArgument('property', 'string', 'Property of meta tag', false, '', false); $this->registerArgument('name', 'string', 'Content of meta tag using the name attribute', false, '', false); $this->registerArgument('content', 'string', 'Content of meta tag', true, null, false); $this->registerArgument('useCurrentDomain', 'boolean', 'Use current domain', false, false); $this->registerArgument('forceAbsoluteUrl', 'boolean', 'Force absolut domain', false, false); $this->registerArgument('replace', 'boolean', 'Replace potential existing tag', false, false); } public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext) { $useCurrentDomain = $arguments['useCurrentDomain']; $forceAbsoluteUrl = $arguments['forceAbsoluteUrl']; $content = (string)$arguments['content']; // set current domain if ($useCurrentDomain) { $content = GeneralUtility::getIndpEnv('TYPO3_REQUEST_URL'); } // prepend current domain if ($forceAbsoluteUrl) { $parsedPath = parse_url($content); if (is_array($parsedPath) && !isset($parsedPath['host'])) { $content = rtrim(GeneralUtility::getIndpEnv('TYPO3_SITE_URL'), '/') . '/' . ltrim($content, '/'); } } if ($content !== '') { $registry = GeneralUtility::makeInstance(MetaTagManagerRegistry::class); if ($arguments['property']) { $manager = $registry->getManagerForProperty($arguments['property']); $manager->addProperty($arguments['property'], $content, [], $arguments['replace'], 'property'); } elseif ($arguments['name']) { $manager = $registry->getManagerForProperty($arguments['name']); $manager->addProperty($arguments['name'], $content, [], $arguments['replace'], 'name'); } } } }