td-agent まとめ

やること

  1. 概要
  2. td-agentのインストール
  3. 設定ファイル
  4. td-agentの起動

概要

概要図

f:id:jigsaw_coltd:20140106221248p:plain

ハマったところ
  • Sourceディレクティブから直でTreasure Data(以下TD)にデータを送るものと勘違いしていた。
  • Sourceディレクティブで受けて、Matchディレクティブで(Matchディレクティブで一致するものがあれば。詳しくは設定ファイルの段落で)TDへデータを送信する。

td-agentのインストール

以下のシェルスクリプトを設置サーバで実行すると、.repoへのレポジトリ追加と、インストールを自動で行ってくれる
http://toolbelt.treasuredata.com/sh/install-redhat.sh

設定ファイル

設定ファイルの場所
/etc/td-agent/td-agent.conf
設定ファイルの書き方 - Sourceディレクティブ(httpの場合)
<source>
  type http #Sourceのタイプを指定
  port 8888 #リッスンポートを指定
  bind 0.0.0.0 #IP制限。0.0.0.0で何処からでも受け付ける設定に
  tag: td.hoge.hage #Matchディレクティブのマッチ条件に使用する
  record: {"name":"TreasureData","gender":"data"} #JSONのスキーマを指定する
</source>

上記のSourceディレクティブへのデータプッシュは、以下のとおり

$ curl -X POST -d 'json={"name":"Jigsaw","gender":"unknow"}' http://localhost:8888/td.hoge.hage

もしくは、ブラウザ等から、

http://localhost:8888:td.hoge.hage?json={"name":"Jigsaw","gender":"unknow"}
設定ファイルの書き方 - Matchディレクティブ(TDへデータ送信)
<match td.hoge.hage> #Sourceディレクティブの"tag"で指定した文字列をここで指定する
  type tdlog #タイプを指定する。TDへ送信。
  apikey xxxxxxxxxx #ターミナルから"$ td apikey:show"で確認したAPI KEYを指定する
  flush_interval 30s #送信するタイミング
  buffer_type file #bufferの持ち方の指定
  buffer_path /var/log/td-agent/buffer/td #bufferファイルの保存先で、TDへデータが送信されると消える
</match>

Matchディレクティブでマッチングをワイルドカード指定することもできる。
以下の設定では、存在しないテーブルを指定すると自動でテーブルを生成(スキーマも自動)を行うようにした。
データベース名まで指定しておき、最後のテーブル名をワイルドカードにすることで、日付別テーブル生成なども可能。

<match td.hoge.*> #.*とすることで、ワイルドカードでマッチングする
  type tdlog #タイプを指定する。TDへ送信。
  apikey xxxxxxxxxx #ターミナルから"$ td apikey:show"で確認したAPI KEYを指定する
  flush_interval 30s #送信するタイミング
  auto_create_table #tagで指定されたテーブルが存在しない場合、自動でテーブルを作成する
  buffer_type file #bufferの持ち方の指定
  buffer_path /var/log/td-agent/buffer/td #bufferファイルの保存先で、TDへデータがプッシュされると消える
</match>

td-agentの起動

/etc/init.d/start

新卒で入った会社を11ヶ月でやめた。

転職しました。

新卒で入社した会社を11ヶ月で退社し、転職しました。

転職したと言うと、「まだ東京のいるの?」と言われることが多いです。
一般的には、新卒で入って会社を1年も経たずして辞めるということは地元へ帰るということを意味しているのかもしれません。
(転職したことで年収UP&勤務時間短縮したとはとても言えない)

今回の転職により、勤務時間が約30%ほど減りました。
ですが、本当の意味での勤務時間は、24時間365日になりました。
新しい職場は、1人1人がプロフェッショナル(職人)としてみなされ、常に成長することが求められるため、休みの日は勉強、平日は業務終了後に勉強会へ参加。
また、定例で社内LT会や、単発での勉強会もアリ。

この環境で生き残るためには、常に勉強し続ける必要があり、24時間365日休む暇はありません。
人によっては、この環境は酷かもしれませんが、僕は非常に満足しています。

Mechanizeでファイルの中身が途切れる

agent.getで返ってくるオブジェクトがHTML(Mechanize::Page)ではなく、File(Mechanize::File)の場合。

gzip圧縮を切りましょう。

agent = Mechanize.new
agent.gzip_enabled = false
agent.get("http://www.yahoo.co.jp/javascript/fp_base_bd_ga_5.3.2.js")

gzip_enabled=(true_or_false)
http://w.livedoor.jp/ruby_mechanize/d/Mechanize#gzip_enabled=

Mac OS X Mavericks - SMB(SMB2?)で接続できない

smb://yourservername

cifs://yourservername

に変える

Did Mavericks kill your SMB network drive access? Here's a fix
http://www.tuaw.com/2013/10/27/did-mavericks-kill-your-network-drive-access-heres-a-fix/


CIFSはSMBの拡張版で、SMBは旧いのか。。。?

第20回 ファイル共有プロトコルSMB/CIFS(その1) (1/3)
http://www.atmarkit.co.jp/ait/articles/0410/29/news103.html

Seleniumを安定稼働させる

約300のテストクラス、実行しているテストケースで言えば約1,100ケース。
これを毎日定時に2回回してるけれども、まず失敗しない。しても、10回に1ケース。
なぜ、これほど安定するのか。
それは、魔法を使っているから!ではなく、ページを読み込む箇所に、以下のメソッドを挿入しているから。

/**
 * footerが出るまで待機する
 */
public static void FootrArrivalWait() {
	TargetArrivalWait(By.xpath("/html/body/footer"));
}

 * ターゲット要素が出現するまで待機する
 * 
 * @param by
 *            ターゲット要素
 */
public static void TargetArrivalWait(By by) {
	try {
		Wait<WebDriver> wait = new WebDriverWait(driver, 10);
		wait.until(visibilityOfElementLocated(by));
	} catch (TimeoutException e) {
		fail("要素出現タイムアウト:" + by);
	}
}

この2つのメソッドをページ読み込みを行う箇所に挿入しただけで、全く失敗しなくなった。
実は、Seleniumがエラーを吐く原因の9割が、Seleniumの動作が速すぎて、レタリングとかが追いつかないから。
だったら、待てばいいじゃん。
でも、毎回毎回ユニークな要素を指定するのは非効率的なので、フッター読み込み待機メソッドを作った。
このフッター読み込み待機メソッド(TargetArrivalWait(By by))をページオブジェクトに仕込めばOK。

WebDriver Firefox23以上でJavascriptExecutorが働かない模様

WebDriver Firefox23以上でJavascriptExecutorが働かない模様。。。

Firefox22(Mac)までは動くんだけど、23以上にアップデートすると動かなくなる、、、
selenium-javaのバージョンも関係あるかと思ったが、あまり関係なさそう。



Firefoxの旧いバージョンは以下からどうぞ。

それでもダウングレードを望みます。以前のバージョンはどこにありますか?
https://support.mozilla.org/ja/kb/install-older-version-of-firefox