今日は、FuelPHPとMongoDBとTraceKitを使って、JavaScriptのエラー情報を監視、収集する方法を紹介します。
TraceKitはJavaScriptのエラーを簡単に監視できる、MITライセンスなJavaScriptライブラリです。
https://github.com/occ/TraceKit
また、FuelPHPではMongoDBを簡単に扱えるので、それらを組み合わせることで、JavaScriptのエラーを容易に収集できるのでは。と思いつき、試してみました。
記事内のソースは、WTFPLライセンスとします。 http://www.wtfpl.net/txt/copying/
以下、手順です。
1. 下準備
MongoDBとPECLモジュールのインストールを済ませておいて下さい。
MongoDB
http://www.mongodb.org/
PECL :: Package :: mongo
http://pecl.php.net/package/mongo
PHPからMongoDBが使用可能かは、phpinfo()で確認できます。
FuelPHPのインストールも済ませておいて下さい。トップページが見れる状態です。尚、当記事ではv1.7.1で確認しています。
2. TraceKitのインストール
https://github.com/occ/TraceKit のtracekit.jsをダウンロードして、public/assets/jsに置きます。
3. FuelPHPの設定
config/db.php にMongoDB用の設定を追加します。以下、例です。
'mongo' => array( 'tracekit' => array( 'hostname' => 'localhost', 'port' => '27017', 'database' => 'tracekit', 'username' => 'YOUR_USERNAME', 'password' => 'YOUR_PASSWORD', ), ),
4. コントローラの作成
app/classes/controller/tracekit.php を作成します。
<?php
/**
* TraceKitが送信するエラー情報をMongoDBにInsertするコントローラ
*
* @author Mamoru Otsuka http://madroom-project.blogspot.jp/
* @copyright 2013 Mamoru Otsuka
* @license WTFPL License http://www.wtfpl.net/txt/copying/
*/
class Controller_Tracekit extends Controller
{
/**
* AjaxでPOSTされたエラー情報をMongoDBにInsertする
*/
public function post_errors()
{
if (Input::is_ajax() and Security::check_token())
{
$input = Input::post();
unset($input[Config::get('security.csrf_token_key')]);
$mongodb = Mongo_Db::instance('tracekit');
$mongodb->insert('errors', $input);
}
}
}
5. viewの修正
app/views/welcome/index.php を修正します。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>FuelPHPとMongoDBとTraceKitでJavaScriptのエラー情報を収集してみる</title>
<!-- エラー情報の送信にjQueryを使います -->
<?php echo Asset::js('http://code.jquery.com/jquery-1.10.2.min.js'); ?>
<!-- tracekit.jsです -->
<?php echo Asset::js('tracekit.js'); ?>
<!-- jQueryでPOSTする際のトークン生成に使います -->
<?php echo Security::js_fetch_token(); ?>
<script>
// TraceKitでエラーを購読します
TraceKit.report.subscribe(function myLogger(errorReport) {
// トークンをセットします
errorReport.<?php echo Config::get('security.csrf_token_key'); ?> = fuel_csrf_token();
// エラー情報をPOSTします
$.post('<?php echo Uri::create('tracekit/errors') ?>', errorReport);
});
// 意図的にエラーを発生させてみます
throw new Error('oops');
</script>
</head>
<body>
<h1>FuelPHPとMongoDBとTraceKitでJavaScriptのエラー情報を収集してみる</h1>
</body>
</html>
6. 動作の確認
プラウザからトップページにアクセスして、MongoDBを確認します。MongoDBに以下のようなエラーデータが入っていれば正しく動いています。
{
"_id": ObjectId("52aef1afece0b97316058000"),
"mode": "onerror",
"message": "Uncaught Error: oops",
"url": "http://192.168.33.10/fuel/",
"stack": [
{
"url": "http://192.168.33.10/fuel/",
"line": "41",
"func": "myLogger",
"context": [
"\t\t\terrorReport.fuel_csrf_token = fuel_csrf_token();",
"\t\t\t// エラー情報をPOSTします",
"\t\t\t$.post('http://192.168.33.10/fuel/tracekit/errors', errorReport);",
"\t\t});",
"\t\t// 意図的にエラーを発生させてみます",
"\t\tthrow new Error('oops');",
"\t</script>",
"</head>",
"<body>",
"\t<h1>FuelPHPとMongoDBとTraceKitでJavaScriptのエラー情報を収集してみる</h1>",
"</body>"
]
}
],
"useragent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"
}
どんな情報が含まれているか、簡単に確認してみましょう。
- message ... エラーメッセージです。普段、コンソールに出るヤツです。
- url ... エラーが発生したURLです。
- stack.line ... エラーが発生した行。のように見えますが、ズレています。。。
- stack.func ... JavaScript側の送信関数名です。
- stack.context ... 発生した行と、前後5行ずつのソースです。
- useragent ... ユーザエージェントです。
注意: stack.contextにminifyされたJavaScriptが含まれると、相当な量になってしまいます。
7. まとめ
FuelPHPとMongoDBとTraceKitを組み合わせると、JavaScriptのエラーを簡単に保存できました。ブラウザで発生するエラーも、こういった方法で把握して、改善していきたいものです。19日目は @omoon さんの「FuelPHP 5 分で API を実装するチュートリアル(スクリーンキャストあり)」です。

No comments:
Post a Comment