File size: 7,135 Bytes
78185c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php

/**
 * Matomo - free/libre analytics platform
 *
 * @link    https://matomo.org
 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
 */

declare(strict_types=1);

namespace Piwik\Plugins\BotTracking;

use Piwik\Piwik;
use Piwik\Columns\Dimension;

class Metrics
{
    public const METRIC_AI_CHATBOTS_REQUESTS = 'BotTracking_AIChatbotsRequests';
    public const METRIC_AI_CHATBOTS_ACQUIRED_VISITS = 'BotTracking_AIChatbotsAcquiredVisits';
    public const METRIC_AI_CHATBOTS_UNIQUE_PAGE_URLS = 'BotTracking_AIChatbotsUniquePageUrls';
    public const METRIC_AI_CHATBOTS_UNIQUE_DOCUMENT_URLS = 'BotTracking_AIChatbotsUniqueDocumentUrls';
    public const METRIC_AI_CHATBOTS_UNIQUE_CHATBOTS = 'BotTracking_AIChatbotsUniqueChatbots';
    public const METRIC_AI_CHATBOTS_NOT_FOUND_REQUESTS = 'BotTracking_AIChatbotsNotFoundRequests';
    public const METRIC_AI_CHATBOTS_SERVER_ERROR_REQUESTS = 'BotTracking_AIChatbotsServerErrorRequests';
    public const METRIC_AI_CHATBOTS_CLICK_THROUGH_RATE = 'BotTracking_AIChatbotsClickThroughRate';
    public const COLUMN_REQUESTS = 'requests';
    public const COLUMN_DOCUMENT_REQUESTS = 'document_requests';
    public const COLUMN_PAGE_REQUESTS = 'page_requests';
    public const COLUMN_ACQUIRED_VISITS = 'visits_acquired';
    public const COLUMN_AVG_SERVER_TIME = 'avg_server_time';
    public const COLUMN_AVG_RESPONSE_SIZE = 'avg_response_size';
    public const COLUMN_PAGE_NOT_FOUND_404_REQUESTS = 'page_not_found_404_requests';
    public const COLUMN_SERVER_ERROR_5XX_REQUESTS = 'server_error_5xx_requests';
    public const COLUMN_TOTAL_BROKEN_REQUESTS = 'total_broken_requests';

    // Columns for the Human/AI-Favoured Pages reports — computed at API time, not archived.
    public const COLUMN_UNIQUE_HUMAN_PAGEVIEWS = 'unique_human_pageviews';
    public const COLUMN_AI_CHATBOT_REQUESTS   = 'ai_chatbot_requests';
    public const COLUMN_DISCREPANCY_SCORE     = 'discrepancy_score';

    // Raw (blob-stored) accumulator columns used to compute the above averages at display time.
    public const COLUMN_SUM_SERVER_TIME = 'sum_server_time';
    public const COLUMN_NB_SERVER_TIME = 'nb_server_time';
    public const COLUMN_SUM_RESPONSE_SIZE = 'sum_response_size';
    public const COLUMN_NB_RESPONSE_SIZE = 'nb_response_size';


    // -----------------------------------------------------------------------------------------
    // Legacy translation/doc/semantic maps — AI Chatbots Overview numerics only.
    // New per-column metrics (COLUMN_AVG_*, COLUMN_*_5XX_REQUESTS, COLUMN_TOTAL_BROKEN_REQUESTS, …)
    // live on their Metric classes — do NOT add them here.
    // -----------------------------------------------------------------------------------------

    /**
     * Metrics displayed in the reports (including derived metrics).
     *
     * @return string[]
     */
    public static function getReportMetricColumns(): array
    {
        return [
            self::METRIC_AI_CHATBOTS_REQUESTS,
            self::METRIC_AI_CHATBOTS_ACQUIRED_VISITS,
            self::METRIC_AI_CHATBOTS_UNIQUE_PAGE_URLS,
            self::METRIC_AI_CHATBOTS_NOT_FOUND_REQUESTS,
            self::METRIC_AI_CHATBOTS_UNIQUE_CHATBOTS,
            self::METRIC_AI_CHATBOTS_UNIQUE_DOCUMENT_URLS,
            self::METRIC_AI_CHATBOTS_SERVER_ERROR_REQUESTS,
        ];
    }

    /**
     * Ordered list used for sparklines & graph selectors.
     *
     * @return string[]
     */
    public static function getSparklineMetricOrder(): array
    {
        return [
            self::METRIC_AI_CHATBOTS_REQUESTS,
            self::METRIC_AI_CHATBOTS_ACQUIRED_VISITS,
            self::METRIC_AI_CHATBOTS_UNIQUE_PAGE_URLS,
            self::METRIC_AI_CHATBOTS_UNIQUE_DOCUMENT_URLS,
            self::METRIC_AI_CHATBOTS_CLICK_THROUGH_RATE,
            self::METRIC_AI_CHATBOTS_UNIQUE_CHATBOTS,
            self::METRIC_AI_CHATBOTS_NOT_FOUND_REQUESTS,
            self::METRIC_AI_CHATBOTS_SERVER_ERROR_REQUESTS,
        ];
    }

    /**
     * @return array<string, string>
     */
    public static function getMetricTranslations(): array
    {
        return [
            self::METRIC_AI_CHATBOTS_REQUESTS              => Piwik::translate('BotTracking_ColumnRequests'),
            self::METRIC_AI_CHATBOTS_ACQUIRED_VISITS       => Piwik::translate('BotTracking_ColumnAcquiredVisits'),
            self::METRIC_AI_CHATBOTS_UNIQUE_PAGE_URLS      => Piwik::translate('BotTracking_ColumnUniquePageUrls'),
            self::METRIC_AI_CHATBOTS_UNIQUE_DOCUMENT_URLS  => Piwik::translate('BotTracking_ColumnUniqueDocumentUrls'),
            self::METRIC_AI_CHATBOTS_UNIQUE_CHATBOTS       => Piwik::translate('BotTracking_ColumnUniqueAiChatbots'),
            self::METRIC_AI_CHATBOTS_NOT_FOUND_REQUESTS    => Piwik::translate('BotTracking_ColumnNotFoundRequests'),
            self::METRIC_AI_CHATBOTS_SERVER_ERROR_REQUESTS => Piwik::translate('BotTracking_ColumnServerErrorRequests'),
            self::METRIC_AI_CHATBOTS_CLICK_THROUGH_RATE    => Piwik::translate('BotTracking_ColumnClickThroughRate'),
        ];
    }

    /**
     * @return array<string, string>
     */
    public static function getMetricDocumentation(): array
    {
        return [
            self::METRIC_AI_CHATBOTS_REQUESTS              => Piwik::translate('BotTracking_ColumnRequestsDocumentation'),
            self::METRIC_AI_CHATBOTS_ACQUIRED_VISITS       => Piwik::translate('BotTracking_ColumnAcquiredVisitsDocumentation'),
            self::METRIC_AI_CHATBOTS_UNIQUE_PAGE_URLS      => Piwik::translate('BotTracking_ColumnUniquePageUrlsDocumentation'),
            self::METRIC_AI_CHATBOTS_UNIQUE_DOCUMENT_URLS  => Piwik::translate('BotTracking_ColumnUniqueDocumentUrlsDocumentation'),
            self::METRIC_AI_CHATBOTS_UNIQUE_CHATBOTS       => Piwik::translate('BotTracking_ColumnUniqueAiChatbotsDocumentation'),
            self::METRIC_AI_CHATBOTS_NOT_FOUND_REQUESTS    => Piwik::translate('BotTracking_ColumnNotFoundRequestsDocumentation'),
            self::METRIC_AI_CHATBOTS_SERVER_ERROR_REQUESTS => Piwik::translate('BotTracking_ColumnServerErrorRequestsDocumentation'),
            self::METRIC_AI_CHATBOTS_CLICK_THROUGH_RATE    => Piwik::translate('BotTracking_ColumnClickThroughRateDocumentation'),
        ];
    }

    /**
     * @return array<string, string>
     */
    public static function getMetricSemanticTypes(): array
    {
        return [
            self::METRIC_AI_CHATBOTS_REQUESTS              => Dimension::TYPE_NUMBER,
            self::METRIC_AI_CHATBOTS_ACQUIRED_VISITS       => Dimension::TYPE_NUMBER,
            self::METRIC_AI_CHATBOTS_UNIQUE_PAGE_URLS      => Dimension::TYPE_NUMBER,
            self::METRIC_AI_CHATBOTS_UNIQUE_DOCUMENT_URLS  => Dimension::TYPE_NUMBER,
            self::METRIC_AI_CHATBOTS_UNIQUE_CHATBOTS       => Dimension::TYPE_NUMBER,
            self::METRIC_AI_CHATBOTS_NOT_FOUND_REQUESTS    => Dimension::TYPE_NUMBER,
            self::METRIC_AI_CHATBOTS_SERVER_ERROR_REQUESTS => Dimension::TYPE_NUMBER,
            self::METRIC_AI_CHATBOTS_CLICK_THROUGH_RATE    => Dimension::TYPE_PERCENT,
        ];
    }
}