hirapi's blog

ちゃんとしたふりをする

PHPでTreasure Dataにpost2()

会社でTreasure Dataを使ってログの蓄積・集計をしていて、PHPからTreasure Dataにレコードを送ることがある。
そういうときはこのライブラリを使う↓↓

github.com

今まではこのREADMEにあるUsageのとおりこんな感じで送ってた↓↓

<?php

require_once __DIR__.'/vendor/autoload.php';

use Fluent\Logger\FluentLogger;
$logger = new FluentLogger("localhost","24224");
$logger->post("debug.test",array("hello"=>"world"));

ただこの間ちょっとレコード多くなるかもだから集計時間短くなるようにしたいなということがあって、こちらのブログを参考にtimeカラムに ID × 3600 みたいな任意の値を入れたくなった。

yebisupress.dac.co.jp

やってみて気づいたんだけど、こういう配列を前述の例のように post() に渡してもtimeカラムにはunixtimeが入ってしまう。

<?php

require_once __DIR__.'/vendor/autoload.php';

use Fluent\Logger\FluentLogger;
$logger = new FluentLogger("localhost","24224");
$logger->post("debug.test",array("time"=>7200)); // => timeカラムには普通に呼び出し時のunixtimeが入る

GitHubpost() のところを追ってみたところ、timeカラムの値は別途自動で入れられるらしい。

じゃあこのライブラリではtimeカラムに好きな値を入れられないかというと、そういうわけではない。

ここで post2()の出番。
冗談みたいな名前してるけどpublicなメソッド。

post() にはタグと配列を渡すけど、 post2() にはEntityクラスインスタンスを渡す。
post() も中身を見たら同じことをやっている。
Entityクラスのコンストラクタを見ると、第三引数にtimeっぽい値を渡せるとのこと。
post() の中身ではここに何も渡してないからデフォルトでnullになって、結果Entityオブジェクトのtimeプロパティにそのときの時刻が入る、というだけらしい。

というわけで自分でEntityクラスのインスタンスを作って post2() に渡してあげるとtimeカラムにちゃんとその値が入る。

<?php

require_once __DIR__.'/vendor/autoload.php';

use Fluent\Logger\FluentLogger;
use Fluent\Logger\Entity;
$logger = new FluentLogger("localhost","24224");
$entity = new Entity("debug.test",array("hello"=>"world"), 7200); // 第三引数にtimeカラムの値
$logger->post2($entity); // => timeカラムに7200が入る

レビューで先輩に教えてもらったとき何だその名前、と思ったけど合ってる。
どういう名前をつけるのがいいのかなあとちょっとだけ考えてみたけど、そもそもなんで送信用のメソッドを2つ作ったのかにもよるのかもしれない?

名前にちょっとだけウケたから投稿してみた。