6-2 第二部分
最后更新于:2022-04-02 07:42:29
原文地址:https://developer.piwik.org/guides/data-model
> 此文中的内容和《Piwik数据库模式(一)》中相互参照
### 日志数据
HTTP跟踪API(即Piwik\Tracker组件)接收原始分析数据,我们称之为日志数据。
有四种类型的日志数据:
- 访问
- 动作类型
- 转换
- 电子商务项目
归档过程将日志数据聚合到归档数据中。
日志数据从不直接用于Piwik报告,而是使用归档数据。唯一的例外是使用日志数据生成实时报告的Live插件。
##### 持久化
日志数据在PHP中表示为Piwik\Tracker\Visit对象,并存储到下表中:
log_visit 每次访问包含一个条目(返回访问者)
log_action 包含网站上所有可能采取的行动(例如,唯一网址,网页标题,下载网址...)
log_link_visit_action 每个行动的访客包含一个条目(页面浏览,...)
log_conversion 包含访问期间发生的转化(与目标相符的操作)
log_conversion_item 包含电子商务转换项目
这些表(及其相关的PHP实体)的内容将在“ 数据库架构”指南中进行更详细的介绍。
### 存档过程
日志数据不能直接用于最终用户报告,因为它需要在每次需要报告时处理大量的数据。
为了解决这个问题,归档过程将日志数据聚合到归档数据中。然后使用归档数据构建报告。
例
我们举一个例子,在一天内收到1000页浏览量的网站。该日志数据将与其他信息,例如,沿着这1000个的事件列表:
```shell
URL Time ...
/homepage 17:00:19 ...
/about 17:01:10 ...
/homepage 17:05:30 ...
/categories 17:06:14 ...
/homepage 17:10:03 ...
...
```
该归档过程汇总这些原始数据到归档数据。
例如,要构建每页视图数量的报告(查看最受欢迎的页面),归档将列出所有页面并总计每个页面的视图数量:
```shell
URL Page views
/homepage 205
/categories 67
/about 5
...
```
该数据是归档数据。
虽然预计算档案数据对于1000页浏览量来说似乎是多余的,但是在处理较高数据量时并不是这样。
##### 什么时候?
默认情况下,归档数据的计算和缓存点播。当请求具体报告时,Piwik将检查所需的存档数据是否存在,如果不存在则生成。
预归档
当跟踪网站流量很大时,按需归档可能需要太多时间。在这种情况下,必须禁用存档归档,并且预先归档需要在预定时间内在后台运行。
可以使用core:archiveconsole命令为每个站点和期间(自定义日期范围除外)运行预归档:
```shell
$ ./console core:archive
```
通常的设置是使用固定间隔运行该命令cron。
该命令将记住上次执行时,只有存在新的访问时才会存档网站。
##### 怎么样?
日志数据被汇总到每个的归档数据中:
- 现场
- 期间:日,周,月,年或自定义日期范围(自定义日期范围不能预先归档)
- 分割
存档逻辑(即聚合日志数据的方式)由插件定义。由插件定义的所有报告都将归档而不是单独存档。
如果查询中没有分段,找不到数据,则每个插件的每个报告将一次生成并缓存。如果提供了一个段,则将生成和缓存属于与请求的数据相同的插件的报告。
期间聚合
归档数据的计算方式根据期间类型不同:
- “日”期是日志数据的聚合
- “周”,“月”,“年”和自定义日期范围是“日”报告的汇总
例如,通过聚合一周中的7天的归档数据创建一周的归档数据。这比聚合日志数据要快得多。
##### 插件存档
要归档报表和指标的插件定义了一个Archiver扩展的类Piwik\Plugin\Archiver。此类将在归档过程中自动检测并调用。
日志数据聚合由LogAggregator类处理。归档数据聚合由ArchiveProcessor::aggregateDataTableRecords()and ArchiveProcessor::aggregateNumericMetrics()方法处理。
插件可以访问LogAggregator和ArchiveProcessor实例Piwik\Plugin\Archiver。
要了解有关Piwik的MySQL后端如何实现聚合的更多信息,请阅读数据库模式。
##### 持久存档数据
存档数据使用ArchiveProcessor。
使用度量标准插入insertNumericRecord()。
报告首先使用序列化DataTable::getSerialized(),然后插入ArchiveProcessor::insertBlobRecord():
```php
// insert a numeric metric
$myFancyMetric = // ... calculate the metric value ...
$archiveProcessor->insertNumericRecord('MyPlugin_myFancyMetric', $myFancyMetric);
// insert a record (with all of its subtables)
$maxRowsInTable = Config::getInstance()->General['datatable_archiving_maximum_rows_standard'];j
$dataTable = // ... build by aggregating visits ...
$serializedData = $dataTable->getSerialized(
$maxRowsInTable,
$maxRowsInSubtable = $maxRowsInTable,
$columnToSortBy = Metrics::INDEX_NB_VISITS
);
$archiveProcessor->insertBlobRecords('MyPlugin_myFancyReport', $serializedData);
```
持续的报告和指标由网站ID,期间和分段索引。归档的日期和时间也附在数据上。要了解MySQL如何完成此细节,请参阅数据库架构。
##### 报告与记录
当报告被归档时,它被称为不是报告的记录。我们有区别,因为有时可以从一个记录生成多个报告。
例如,UserSettings插件使用一个记录来保存访问者的浏览器详细信息。此记录用于生成UserSettings.getBrowserVersion和UserSettings.getBrowser报告。第二份报告只是处理第一份报告。该插件可以归档这两个报告,但是这将大大浪费空间,考虑到新的报告将被缓存为每个网站/期间/段组合。
##### 记录存储准则
必须注意尽可能少的存放记录。在将记录作为归档数据插入之前,请务必遵循以下准则:
记录不应与字符串列名一起存储。相反,它们应该被替换为整数列ID(有关现有列表的列表,请参阅Metrics)。
可以使用现有数据添加的元数据不应与报告一起存储。相反,当将记录转换为报告时,应将其添加到API方法中。
### 归档数据
归档数据是在创建归档过程中通过汇总日志数据。
Piwik聚合并持续存在两种类型的存档数据:
```shell
度量,它们是单个数值
报告,是二维数组的值
```
报告通常包含指标值,但它们也可以包含其他数据(额外地或代替度量值)。
报告和指标由插件定义,允许任何插件扩展Piwik分析的数据。然而,有几个称为核心指标的指标,由Piwik Core定义。
##### 子集参数
报告和指标提供关于一组事物的分析数据。该集合由三个约束定义:
```shell
一个网站ID
一段时间
一段
```
该网站的ID选择被跟踪特定网站的访问。该ID在具有idSitequery参数的所有HTTP请求中指定。
的期间,选择被跟踪的特定日期范围内的访问。所有HTTP请求中指定的时间段date与period查询参数。
该段根据使用访问属性的布尔表达式选择访问。它在所有HTTP请求中由segmentquery参数指定,可用于选择几乎任何可能的访问子集。
Analytics(分析)参数作为元数据存储在报表中,这意味着它们作为DataTable元数据存储。
##### 度量
核心指标
核心指标是不是由插件定义的,而是Piwik Core。
分析访问次数,操作类型或转化次数的新报告应包含这些指标。
##### 访问指标
一组访问的核心指标:
|名称 | 公制编号 | 描述 |
|:------------ :| :------------ :|
|访问 | nb_visits | 跟踪访问次数 一次访问是一系列事件,每次事件发生不超过30分钟。 |
|独特的访客 | nb_uniq_visitors | 唯一访问来源的数量。访问来源是一个导致访问的实体。 |
|操作 | nb_actions | 跟踪的动作数量。一个行动是Piwik跟踪的一个事件。 |
|最大行动 | max_actions | 一次访问中发生的最大操作次数。 |
|总访问长度 | sum_visit_length | 每次访问的总和时间。 |
|反弹计数 | bounce_count | 仅由一个动作组成的访问次数。 |
|转换访问 | nb_visits_converted | 导致至少一次转化的访问次数。包含网站每个目标的转化。 |
|转换 | nb_conversions | 此次访问跟踪的转化次数。包含网站每个目标的转化。 |
|收入 | revenue | 这些访问产生的总收入。 包括网站的每个目标的收入以及电子商务收入。 |
##### 行动指标
单一动作类型的核心指标:
|名称|公制编号|描述|
| :------------ | :------------ |
|点击|nb_hits|这个动作曾经完成的次数。|
|总和花费时间|sum_time_spent|用户花费这个操作的总时间。|
|总和页面生成时间|sum_time_generation|服务器花费这项操作的总时间。|
|点击与生成时间|nb_hits_with_time_generation|包含生成时间信息的命中数。|
|最小页面生成时间|min_time_generation|服务器为此操作服务的最短时间。|
|最大页面生成时间|max_time_generation|服务器花费此操作的最长时间。|
|独特出境游客|exit_nb_uniq_visitors|在此行动之后退出网站的唯一身份访问者人数。|
|退出访问|exit_nb_visits|通过此操作结束的总访问次数。|
|独特的入场访客|entry_nb_uniq_visitors|通过此操作开始访问的唯一身份访问者总数。|
|入场访问|entry_nb_visits|以此操作开始的总访问次数。|
|进入动作|entry_nb_actions||
|入场和访问长度|entry_sum_visit_length|每次入场访问的总和经过时间。|
|入场反弹计数|entry_bounce_count|由这个动作组成的访问次数,没有其他。|
|点击搜索|nb_hits_following_search|在网站搜索后执行此操作的次数。|
##### 电子商务指标
针对一组访问记录的一组电子商务转换(所有订单或所有已放弃购物车)的核心指标:
|名称|公制编号|描述|
| :------------ | :------------ |
|收入小计|revenue_subtotal|作为这些订单或弃车的一部分的每个项目的总成本。|
|税收收入|revenue_tax|适用于这些订单/弃车的总税额。|
|收入运费|revenue_shipping|运送到这些订单/废弃车的运输总量。|
|收入折扣|revenue_discount|这些订单/弃车的折扣总额。|
|电子商务计数|items|这些订单/弃车的物品总数。
##### 目标指标
一组访问的核心指标和网站的一个目标:
|名称|公制编号|描述|
| :------------ | :------------ |
|目标转换|goal__nb_conversions|针对特定目标跟踪此次访问的转化。|
|目标收入|goal__revenue|特定目标的转化所产生的总收入。|
注意:应替换为目标的ID。
目标具体指标存储在goals序列化报告列中的数据库中。该列包含一个PHP数组,将目标ID与目标特定度量值的数组进行映射。这些值被设置为具有上述由AddColumnsProcessedMetricsGoal DataTable过滤器描述的度量名称的普通列值。
##### 已处理的指标
为了归档和数据库大小的效率,一些指标不存储在数据库中。而是在需要时使用其他指标来计算。这些指标称为处理指标。
以下是使用核心指标计算的已处理指标列表。分析访问次数,操作类型或转化次数的新报告应尽可能添加这些指标。
注意:以下列表中会显示多个已处理的指标。这些指标根据他们所在的报告有不同的含义。
一组访问的处理指标:
|名称|公制编号|描述|
| :------------ | :------------ |
|兑换率|conversion_rate|至少有一次转化的访问百分比。|
|每次访问行动|nb_actions_per_visit|单次访问的平均动作次数。|
|平均停机时间|avg_time_on_site|平均每次访问所花费的时间(秒)。|
|跳出率|bounce_rate|导致反弹的访问百分比。|
单个操作类型的已处理指标:
|名称|公制编号|描述|
| :------------ | :------------ |
|平均生成时间|avg_time_generation|服务器提供此操作所需的平均时间。|
|浏览的平均搜索结果页数|nb_pages_per_search|在网站搜索后查看的搜索结果页的平均数量。仅适用于网站搜索关键字和网站搜索类别。|
|平均时间页|avg_time_on_page|用户花费这个时间的平均时间。|
|入场跳出率|bounce_rate|所有访问的百分比组成的这个动作,没有其他。|
|退出率|exit_rate|以此动作结束的所有访问的百分比。|
针对一组访问记录的电子商务订单集的处理指标:
|名称|公制编号|描述|
| :------------ | :------------
|平均订单收入|avg_order_revenue|每个订单的平均收入。|
一组订单或废弃购物车中电子商务集合的处理指标:
|名称|公制编号|描述|
| :------------ | :------------
|平均价格|avg_price|每个项目的平均价格。|
|平均数量|avg_quantity|订单/已放弃购物车中每个商品的平均数量。|
|产品转化率|conversion_rate|包含此项目的订单/弃车的百分比。|
以下是一个特定于一个网站的一个目标的已处理指标列表:
|名称|公制编号|描述|
| :------------ | :------------
|每次访问平均收入|goal__revenue_per_visit|为此目标每次访问所产生的平均收入金额。|
##### 命名约定
由插件计算和持久化的度量必须使用以下格式命名:PluginName_metricName。例如:MyPlugin_myFancyMetric。
核心指标具有特殊名称,不符合此惯例。
#### 报告
报告使用DataTable类存储在内存中。A DataTable是由行和列组成的二维数组。
每行都包含与一组访问,操作,转换相关的度量...该集合由特殊标签列定义和描述。列描述的集合完全取决于具体的报告。例如,在UserSettings.getBrowser报告中,带有Firefox标签的行将包含使用Firefox浏览器的访问指标。
一些报告VisitsSummary.get就不会有一个标签列:它们只有一行引用整个实体集。
##### 报告元数据
除了指标之外,每一行还可以包含元数据。这个元数据通常会帮助标签列描述行代表的事物集。
一些元数据在Piwik有特殊的含义,例如:
```shell
logo:该值可以是将在UI中的每一行旁边显示的图像的路径
url:该值可以是该行将在UI中链接到的URL
```
##### 子表
报表可以是层次结构的:每行都可以附加到另一个DataTable。附加到行的表称为子表。
子表为行所代表的一组访问提供进一步的分析。例如,Referrers.getSearchEngines报告每个搜索引擎有一行。每行都有一个子表,描述与该搜索引擎一起使用的关键字。以下是一个示意图:
```shell
Search Engine Keyword (subtable) Visitors
--------------|-------------------|----------
Google | 207
--------------|------------------------------
| piwik | 11
| libre analytics | 6
| ...
---------------------------------------------
Duck Duck Go | 121
--------------|------------------------------
| ...
```
##### 命名约定
必须将报告命名为指标如下:PluginName_reportName。例如:MyPlugin_myFancyReport。
';