teamneusta/sentry-tracing-typo3

TYPO3 的 Sentry 跟踪

安装次数: 1,161

依赖项: 0

建议者: 0

安全性: 0

星标: 0

关注者: 8

分支: 2

公开问题: 0

类型:typo3-cms-extension

dev-main 2024-01-12 08:18 UTC

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');
            }
        }
    }
}