原文地址: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个的事件列表:
URL Time ...
/homepage 17:00:19 ...
/about 17:01:10 ...
/homepage 17:05:30 ...
/categories 17:06:14 ...
/homepage 17:10:03 ...
...
该归档过程汇总这些原始数据到归档数据。
例如,要构建每页视图数量的报告(查看最受欢迎的页面),归档将列出所有页面并总计每个页面的视图数量:
URL Page views
/homepage 205
/categories 67
/about 5
...
该数据是归档数据。
虽然预计算档案数据对于1000页浏览量来说似乎是多余的,但是在处理较高数据量时并不是这样。
什么时候?
默认情况下,归档数据的计算和缓存点播。当请求具体报告时,Piwik将检查所需的存档数据是否存在,如果不存在则生成。
预归档 当跟踪网站流量很大时,按需归档可能需要太多时间。在这种情况下,必须禁用存档归档,并且预先归档需要在预定时间内在后台运行。
可以使用core:archiveconsole命令为每个站点和期间(自定义日期范围除外)运行预归档:
$ ./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():
// 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聚合并持续存在两种类型的存档数据:
度量,它们是单个数值
报告,是二维数组的值
报告通常包含指标值,但它们也可以包含其他数据(额外地或代替度量值)。
报告和指标由插件定义,允许任何插件扩展Piwik分析的数据。然而,有几个称为核心指标的指标,由Piwik Core定义。
子集参数
报告和指标提供关于一组事物的分析数据。该集合由三个约束定义:
一个网站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_ |
针对特定目标跟踪此次访问的转化。 |
目标收入 | goal_ |
特定目标的转化所产生的总收入。 |
注意:
目标具体指标存储在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_ |
为此目标每次访问所产生的平均收入金额。 |
命名约定
由插件计算和持久化的度量必须使用以下格式命名:PluginName_metricName。例如:MyPlugin_myFancyMetric。
核心指标具有特殊名称,不符合此惯例。
报告
报告使用DataTable类存储在内存中。A DataTable是由行和列组成的二维数组。
每行都包含与一组访问,操作,转换相关的度量...该集合由特殊标签列定义和描述。列描述的集合完全取决于具体的报告。例如,在UserSettings.getBrowser报告中,带有Firefox标签的行将包含使用Firefox浏览器的访问指标。
一些报告VisitsSummary.get就不会有一个标签列:它们只有一行引用整个实体集。
报告元数据
除了指标之外,每一行还可以包含元数据。这个元数据通常会帮助标签列描述行代表的事物集。
一些元数据在Piwik有特殊的含义,例如:
logo:该值可以是将在UI中的每一行旁边显示的图像的路径
url:该值可以是该行将在UI中链接到的URL
子表
报表可以是层次结构的:每行都可以附加到另一个DataTable。附加到行的表称为子表。
子表为行所代表的一组访问提供进一步的分析。例如,Referrers.getSearchEngines报告每个搜索引擎有一行。每行都有一个子表,描述与该搜索引擎一起使用的关键字。以下是一个示意图:
Search Engine Keyword (subtable) Visitors
--------------|-------------------|----------
Google | 207
--------------|------------------------------
| piwik | 11
| libre analytics | 6
| ...
---------------------------------------------
Duck Duck Go | 121
--------------|------------------------------
| ...
命名约定
必须将报告命名为指标如下:PluginName_reportName。例如:MyPlugin_myFancyReport。