トップページに戻る

recalculation 再集計

概要

何らかの理由である期間だけ Piwik へのログの取り込みおよび集計が行われていないときも後追いでログを取り込みたいことがあります。 このとき、後追いで取り込んだ期間のリアルタイムのビジターなどは出るのですが、集計プロセスを動かしても、日別ユニークビジター数などの集計された数値がかけてしまうときがあります。 こういう現象↓が起こったときの対処方法です。

方法は以下の二通りがあります。

  • API による再集計
    • core:archive の実行で再集計が始まります。
    • 再集計したい日付について、すでに再集計されていても作り直します(過去の集計データはデータベース上には残ります)
  • core:archive の引数を指定する(めんどくさいから全部計算したいときはこちら)
    • API とは違いすぐに再集計が始まります。
    • 再集計したい日は一度も集計していない場合に限ります(つまり午前の集計まではできていたけど後から午後のログをインポートして再集計... なんてのは対応できない)

API による再集計

ざっと読んでください How do I tell Matomo to invalidate the past historical reports so they can be re-processed from the logs?

上記のリンク先にもあるように、 (実際は一行です)

?module=API&method=CoreAdminHome.invalidateArchivedReports&
idSites=1,3,5&dates=2012-01-01,2011-10-15&token_auth=xyz
のような URL リクエストをだし、次回の core:archive でどの期間を再集計するか指定します。core:archive は別途実行しなければならず、さらに 再集計したい日付が 3 週間以上の前のときはパラメータを付加して手動実行しなければなりません。

例をあげます(wget は一行です) 。

% wget -O - "http://piwik.example.com/?module=API&method=CoreAdminHome.invalidateArchivedReports&idSites=7&dates=2014-08-16&token_auth=your_token" 
--2015-03-17 09:11:01--  http://piwik.example.com/?module=API&method=CoreAdminHome.invalidateArchivedReports&idSites=7&dates=2014-08-16&token_auth=your_token http://piwik.example.com
piwik.example.com をDNSに問いあわせています... 192.168.0.12
piwik.example.com|192.168.0.12|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 141 [text/xml]
`STDOUT' に保存中

 0% [                                                                                                                                                                                                                                 ] 0           --.-K/s              <?xml version="1.0" encoding="utf-8" ?>
<result>
        <row>Success. The following dates were invalidated successfully: 2014-08-16</row>
100%[================================================================================================================================================================================================================================>] 141         --.-K/s 時間 0s

2015-03-17 09:11:10- (19.0 MB/s) - stdout へ出力完了 [141/141]

上記は daily のみ再集計します。weekly、monthly、yearly、range は再集計されません。ということで、period 引数を与えてさらに再集計の指示をだします。 下記の例は、週の再集計です(実際は一行です) 。複数回 API を叩いて複数の対象日付を指定し、結果として指定した日付がすべて同じ週のときは、週の再集計の指示は最後の一度だけでいいです(おそらく、最後ではなくどこかの一度だけでもいいはずであるが未検証)。

% wget -O - "http://piwik.example.com/?module=API&method=CoreAdminHome.invalidateArchivedReports&idSites=7&period=week&dates=2014-08-16&token_auth=your_token" 

同様に、period を month、year (year は必要であれば、下記)、range に入れ替えてリクエストを投げてください(連続で投げるとキューに溜まります)。複数回 API を叩いて複数の対象日付を指定し、が結果として指定した日付がすべて同じ月(または同じ年)にかかるときは、月(または年)の再集計の指示は最後の一度だけでいいです(おそらく、最後ではなくどこかの一度だけでもいいはずであるが未検証)。

range (Piwik の公式サイトで説明なし)は、Piwik で計算期間を任意の日付で指定できる 期間 (カレンダーで選択できるアレ)です。 期間 で月初と月末を指定すると計算結果は で指定した一カ月と同じになりますが、内部的には別に処理されています。 daily、weekly、monthly、yearly は、core:archive が動く毎の再集計結果を用いるので表示は速いですが、 range はその場で集計を始めるので 結果的に daily、weekly、monthly、yearly と同じ期間でも応答が遅い です。

Piwik デフォルトは、年単位の集計は負荷がかかるので行わないようになっています。

config/config.ini.php

[General]
enable_processing_unique_visitors_year = 1
とあれば、年単位の集計を行うようになっています(デフォルトは 0 です)。

再集計したい日付が 3 週間以上の前のとき

再集計は、 ./console core:archive で行うのですが、下記条件

  • period=day のとき再集計したい日付が今日から 52 日前まで
  • period=week のとき再集計したい日付が今日から 2 週前まで(日曜日起点です)
  • period=month のとき再集計したい日付が今日から 2 か月前まで(毎月 1 日が起点です)
  • period=year のとき再集計したい日付が今日から 2 年前まで(毎年 1 月 1 日が起点です)
  • period=range のとき再集計したい日付が? 未調査ですが day と同じであると考える

のとき再集計します。 つまり、一番短い再集計のレンジは、week の 2 週となるため、 3 週間以上前の再集計はオプションが必要としました。

再集計の範囲を広げるには二通りの方法があります。

その 1、force-date-last-n オプション

遡って集計する範囲を広げるため、 --force-date-last-n=365 を付加します。

% cd piwik をインストールしたディレクトリ名
% ./console --url=http://piwik.example.com/ core:archive --force-idsites=7 --force-date-last-n=365

--force-date-last-n=365 で次のように振る舞いをむりくり変更します:

  • period=day のとき今日から 365 日前まで
  • period=week のとき今日から 365 週前まで(日曜日起点です)
  • period=month のとき今日から 365 か月前まで(毎月 1 日が起点です)
  • period=year のとき今日から 365 年前まで(毎年 1 月 1 日が起点です)
  • period=range のとき再集計したい日付が? 未調査ですが day と同じであると考える

を再集計。 How do I reprocess all websites, all dates and all periods, after initial import of logs? には、--force-date-last-n=1000 なんて記述もあります。

例えば、2015/3/18 に 2014/9/20 の再計算を行うのであれば、 --force-date-last-n=180 以上であればよいです。 --force-date-last-n=179 では再計算されません。

その 2、force-date-range オプション

こちらは、再計算の範囲を from, to で指定します。

% cd piwik をインストールしたディレクトリ名
% ./console --url=http://piwik.example.com/ core:archive --force-idsites=7 --force-date-range=2014-08-16,2014-08-16

上記は、2014-08-16 だけを再集計の対象とします。--force-date-range=2014-08-16,2014-09-01 であれば、2014-08-16 から 2014-09-01 までを再集計の対象とします。

CoreAdminHome.invalidateArchivedReports API 引数まとめ

  • 別途 ./console core:archive を実行するまでは再集計は始まりません。
    • 再集計したい日付が 3 週間以上の前のときは、 --force-date-last-n または --force-date-range オプションが必要です
  • 再集計したい日付について、すでに再集計されていても作り直します(過去の集計データはデータベース上には残ります)
  • http://piwik.example.com/ は、Piwik が動いているサイト URL です。
  • idSites=idsite は 再集計したい idsite です。カンマ区切りで複数指定できます。どのサイトを再集計するのか管理画面より調べておきます。
  • dates=YYYY-MM-DD は、再集計したいしたい日付です。カンマ区切りで複数指定できます。
  • token_auth=your_token は 管理者権限のある トークンです。サイトの管理画面で調べておきます。
  • period=[day|week|month|year|range] は、日、週、月、年、期間単位での再集計(無指定は day)。どれか一つ選択します。

core:archive の引数による再集計(ただし、その日について一度も集計していない場合に限ります)

参考 How do I reprocess all websites, all dates and all periods, after initial import of logs? リンクにあるように core:archive でも再集計可能です。ただ、説明がアバウトで、特定の日だけ集計したい方法が書いていないので、ここで説明します。

% cd piwik をインストールしたディレクトリ名
% ./console core:archive --url=http://piwik.example.com --force-idsites=7 --force-periods=day,week,month --force-date-range=2014-08-16,2014-08-16

core:archive 引数まとめ

  • いろいろ条件があるようなのでうまくいかないときは上記、API による再集計 を検討してください
  • API とは違いすぐに再集計が始まります。
  • 再集計したい日付が今日から 3 か月以上前で、その日について一度も集計していない場合に限ります
  • --url=http://piwik.example.com は、Piwik が動いているサイト URL です。
  • --force-idsites=idsite は 再集計したい idsite です。カンマ区切りで複数指定できます。どのサイトを再集計するのか管理画面より調べておきます。
  • --force-periods=day,week,month,range で日、週、月単位での再集計。カンマ区切りで複数指定できます。必要であれば year で年単位の集計(Piwik デフォルトでは年集計は行いません)。
  • --force-date-range=YYYY-MM-DD,YYYY-MM-DD 集計する日付の 範囲 です。 from, to 必ず指定します。 同じにすれば対象が一日になります。

core:archive めんどくさい、全データを集計する

% cd piwik をインストールしたディレクトリ名
% ./console core:archive --force-all-websites --force-all-periods=315576000 --force-date-last-n=1000 
  • 全 idsite 、1000 days(period=day)、1000 months(period=month)、1000 years(period=year) で計算します。
  • ものすごい時間がかかります。
  • --force-all-periods=315576000 については調べてません。これで -all がない --force-periods=day,week,month,year の計算となるようです。

同じく参考 How do I reprocess all websites, all dates and all periods, after initial import of logs?