2013年12月29日日曜日

【Android】java.io.FileNotFoundException: [file_path] open failed: ENOENT (No such file or directory)

Android内でプロパティファイルを読み込む際にFileNotFoundExceptionとなった
原因は以下だった

is = new FileInputStream(new File(path));
↓
is = this.getClass().getClassLoader().getResourceAsStream(path);
としプロパティファイルを「src」直下に配置する

Androidでnew Fileから読み込むと自動的に先頭に「/」が付いてしまっているようでうまくプロパティファイルが読み込めていなかった

2013年12月28日土曜日

ニフティクラウドmobile backendでAndroid(Nexus7)にプッシュ通知を送ってみた

今回作成したソースコードは以下で公開しています

https://github.com/kakakikikeke/android-ncmb-sample

以下にポイントを紹介します

●事前にeclipseとADT(Android Developers Tool)をインストールします

●gcm.jarは以下からダウンロードできます
gcm.jarはすでに開発が停止しているGCM用のクライアントライブラリです
ニフティクラウドmobile backendではgcm.jarが必要なようです
https://code.google.com/p/gcm/source/browse/gcm-client/dist/gcm.jar?name=gcm-1.0.2
ダウンロードしzipファイルを解凍し、./gcm-client/dist/gcm.jarをlib配下にコピーしビルドパスを追加します

●ProjectNumber(SenderId)を取得します
https://cloud.google.com/console#/project/[project_number]
ソースコード内でSenderIdとして利用します

●GoogleAPIKeyの取得
https://cloud.google.com/console#/project/[project_number]/apiui/credential
にてAPIKeyを取得します
ニフティクラウドmobile backendのダッシュボードのアプリ設定 -> プッシュ通知で取得したAPIキーを記載します

●ニフティIDの取得
ニフティクラウドモバイルmobile backendの申し込みにはニフティが提供するIDが必要です
無料で取得できるのでニフティのポータルサイトから取得します
http://www.nifty.com/

●エミュレータでは起動しません
エミュレータには「deviceToken」という端末個別のIDが存在しないためエラーとなります
at com.google.android.gcm.GCMRegistrar.checkDevice(GCMRegistrar.java:98)
実機にアプリを直接インストールして確かめる必要があります

いろいろと方法はありますが、自分はgmailに添付してインストールしました
eclipse -> プロジェクトを右クリック -> Export -> Export Android Application -> デスクトップに保存 -> apkファイルをGmailに添付して送信 -> Android端末で送信したGmailを受信 -> apkファイルをクリック -> アプリをインストール

●USBデバッグモードをONにします
以下を参考にUSBのデバッグモードをONにします
http://kakakikikeke.blogspot.jp/2013/12/nexus7usb.html

●Nexus7用のUSBドライバをインストールします
以下を参考にUSBドライバをインストールします
http://kakakikikeke.blogspot.com/2013/12/windowsnexus7usb.html

●プッシュ開封通知を送信する場合の注意
onCreateメソッド内で NCMBAnalytics.trackAppOpened(getIntent()); を実行しますが左記が呼ばれる条件として
  1. プッシュ通知開封時にバックグラウンドでアプリが起動していないこと
  2. プッシュ通知開封時にバックグラウンドでアプリは起動しているがプッシュ開封時に起動するActivityと同一のActivityが起動していないこと
のどちらかを満たしている必要があります
プッシュ通知を開封した際にActivityを指定できるので開封専用のActivityを用意しておくと確実に送信できるかと思います

■参考サイト

2013年12月27日金曜日

【Windows】Nexus7のUSBドライバをインストールする方法

■環境
WindowsXP 64bit
Nexus7(2012年発売モデル)
ADT 20131030

■事前準備
事前にADT(Android Developer Tools)をインストール必要があります
以下を参考にADTをインストールしてください
http://kakakikikeke.blogspot.jp/2012/10/windows7eclipseandroid.html
今回紹介する記事ではADTのインストールディレクトリを「C:\myinstallprogram\adt-bundle-windows-x86_64-20131030」とします

■ドライバのインストール
1. SDK Managerを起動
SDK Manager.exe をダブルクリックして起動します


2. Google USB Driverをインストール
Google USB Driver のチェックボックスをONにして「Install packages...」をクリックします


次に同意画面が表示されますので「Accept License」をONにして「Install」をクリックします
あとはインストールされるのを待ちます
※スクリーンショットはインストール後になります

3. USBデバッグをONにする
Nexus7はデフォルトではUSBデバッグがONになっていません
以下を参考にUSBデバッグをONにしてください
http://kakakikikeke.blogspot.jp/2013/12/nexus7usb.html

4. Nexus7をUSBでPCに接続
ドライバがないと言われるのでパスを指定してPC上にあるファイルからドライバをインストールします
一覧または特定の場所からインストールするを選択します


次の場所を含めるにドライバのパスを入力します

C:\myinstallprogram\adt-bundle-windows-x86_64-20131030\sdk\extras\google\usb_driver
先ほどGoogle USB Driverをインストールしたの以下のパスが存在しています(インストールしていない状態だとパスが存在しません)
入力後に「次へ」とするとドライバのインストール開始されます

エラーなくインストールされればドライバインストール完了です

■動作確認
eclipseでアプリを実行するときに実機が選択できるかどうか確認します
実行するアプリの「Run Configurations」を開きTargetタブで「Always prompt to pick device」にチェックを入れApplyします


その後Runでアプリを実行すると接続されている実機デバイスの一覧を選択する画面が表示されればWindows上で実機が認識されています


あとは実機を選択してOKをクリックすれば実機上でアプリが動作します、アプリは自動でインストールされインストール後に自動で立ち上がります
もちろんlogcatにも操作している間ログが流れるようになります

■Tips
MTPドライバのインストール
http://emobile.jp/products/gl07s/driver.html

2013年12月26日木曜日

Nexus7でUSBデバッグモードを有効にする方法

設定 -> タブレット情報 -> ビルド番号 -> 7回タップ

すると開発者「開発者 向けオプション」が新たに設定メニュー内に表示されるので「USBデバッグ」という項目のチェックボックスをONにしてください

設定 -> ストレージ -> 右上のメニュー -> USBでパソコンに接続 -> 「メディアデバイス(MTP)」のチェックをはずし「カメラ(PTP)」のチェックをONにする

USBデバッグとMTPモードを共存させることはできません
なのでMTPをOFFにしてPTPをONにします

これでUSBで接続時にデバッグモードとして接続されるようになります

2013年12月20日金曜日

【Java,mongo】java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer

mongo側のデータが明示的にintで宣言されていないために発生しています
updateする際にNumberIntを使って明示的にintで値を登録します
db.hogeCollection.update({"_id":"abcdefg"},{$set:{"number":NumberInt(1000000000)}}, false, true);

2013年12月19日木曜日

ニフティクラウドRDBにZabbixのデータベースを移行してみた

■事前作業
Zabbixのインストール
バージョンは何でも大丈夫だと思いますが今回自分が試したバージョンは1.8.3です

■RDBの作成
  1. https://console.cloud.nifty.com/web/rdb を開きます
  2. 左メニューのDBサーバーを選択し「DBサーバー新規作成」をクリックします
  3. DBエンジン選択…お好きなバージョンを選択します(2013/12/18現在ではMySQLの「5.5.32」,「5.6.12」が選択可能です、今回は 5.5.32 を選択しました)
  4. 基本設定…DBサーバー名のみを入力します、今回他の機能(HAやディスク変更)は実施しないでいきます
  5. DB設定…DBの名前、DB用のユーザ名とパスワード、LISTENするポートを入力します
  6. オプション設定…自動バックは実施しないので何も変更しません
  7. 確認…内容を確認し作成するをクイックします

だいたい30分から40分くらいでDBサーバーの作成が完了します

■DBファイアウォールの編集
作成したDBサーバーに対して既存のニフクラ上のサーバーが通信できる必要があります
作成したDBサーバーにはデフォルトFWが設定されておりそのFWに対してルールを追加する必要があります
デフォルトではルールは存在していないためどこからもアクセスできない状態となっております
  1. 左メニューのDBファイアウォールを選択します
  2. default.[zone名]というファイアウォールができていると思いますのでチェックボックスをクリックしプルダウンから「DBファイアウォールグループ編集」を選択します
  3. ルールを追加できるダイアログが表示されますので先ほど作成したDBサーバーがLISTENするポートに対して既存のサーバのからのアクセスを許可します
  4. 許可の設定はIPアドレスを直接設定するか、既存のFWグループを選択します

これでファイアウォールの設定は完了です

■RDBへの接続テスト
作成したDBサーバーへのアクセスが完了していると思いますので確認してみます
mysql -u [username] -p [dbname] -h [rdb_ip_address]
[username], [dbname], [rdb_ip_address] の部分にはDBサーバー作成時に設定したユーザ名、DBの名前、DBサーバーのIPアドレスを入力します
DBサーバーのIPアドレスはコントロールパネルのDBサーバー一覧で確認することができます
グローバル、プライベート両方が表示されているのでアクセスどちらかを入力します
(DBサーバーへのアクセスなので基本はプライベートになるかと思います)
パスワードの入力を求められますので、これもDBサーバー作成時に設定したパスワードを入力します

これで接続できるはずです、「show database」等でDBサーバー作成時に設定したDB名が存在していることを確認します
テーブルは1つも作成させれていません
ここで接続できない場合はFWの設定が怪しいのでFWやiptablesの設定を確かめてみてください

■ZabbixDBのエキスポートとインポート
1. 既存サーバーからのエキスポート
cd /var/tmp
mysqldump -u root -p zabbix > zabbix.dmp

2. RDBで作成したDBサーバーへのインポート
mysql -u [username] -p -h [rdb_ip_address]
  mysql > create database zabbix;
cd /var/tmp
mysql -u [username] -p zabbix -h [rdb_ip_address] < zabbix.dmp

DBサーバーに接続して「zabbix」という名前のデータベースにデータが存在することを確認します

■ZabbixServerの設定変更
vim /etc/zabbix/zabbix_server.conf
DBUser=[username]
DBHost=[rdb_ip_address]
DBPassword=DBサーバー作成時に設定したパスワード

vim /etc/zabbix/zabbix.conf.php
$DB["USER"] = '[username]';
$DB["SERVER"] = '[rdb_ip_address]';
$DB["PASSWORD"] = 'DBサーバー作成時に設定したパスワード';

/etc/init.d/zabbix-server restart
エラーなく再起動できればOKです

■動作確認
ZabbixのWebUIから確認します
テンプレートを一つ追加してzabbix.hostsテーブルにに指定した名前のテンプレートのレコードが追加されていることを確認します
ex) select * from hosts where host='test-template';

以上でニフティクラウドRDBへのZabbixDBの以降は完了です

●トラブルシューティング
ERROR 1129 (00000): Host 'xxx.xxx.xxx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
mysqladminコマンドが上記のせいでそもそも実行できないので自分は再起動するしかなったです。。。
何か別の方法があるのだろうか

Cannot connect to the database. Exiting...
ZabbixServerのログに出力されていました、これはzabbixの設定ファイルがうまく設定できていなかったために発生していました

2013年12月17日火曜日

fluentd+elasticsearch+kibana3をやってみた

■環境
CentOS 5.9

elasticsearch 0.90.5
kibana3
fluentd 0.10.39
のインストールは事前済ませておいてください
今回は/var/log/messagesを解析してみたいと思います

■/etc/fluent/fluent.confの設定
1. ログ送信側(クライアント側)設定
vim /etc/fluent/fluent_elasticsearch_client.conf
<source>
  type tail
  format syslog
  path /var/log/messages
  tag log.messages
</source>

<match log.messages>
  type forward
  flush_interval 5s
  <server>
    name server_host_name
    host server_host_name
    port 24224
    weight 60
  </server>
</match>

2. ログ受信側(サーバ側)設定
vim /etc/fluent/fluent.conf
<source>
  type forward
  port 24224
</source>

<match log.messages>
  index_name messages
  logstash_format true
  type elasticsearch
  host server_host_name
  port 9200
  include_tag_key true
  tag_key _key
  flush_interval 10s
</match>
include_tag_key を true にするとelasticsearchにログを突っ込む際にmatchに合致したタグ情報を自動で付与してくれます

■fluent-plugin-elasticsearchのインストール
fluent-gem install fluent-plugin-elasticsearch

■各種デーモンの起動
1. elasticsearch起動
elasticsearch -f
2. kibana3起動(apache起動)
service httpd start
3. サーバ側fluentd起動
fluentd
4. クライアント側fluentd起動
fluentd --conf /etc/fluent/fluent_elasticsearch_client.conf

各種起動が完了しエラーが表示されていないければkibana3を開きデータが入っていることを確認します
kibana3 サンプル画像


■Tips
syslogをelasticsearchに送る場合は素直に「format syslog」を使って下さい
format /^(?<timestamp>\w{3} \d{2} \d{2}:\d{2}:\d{2}) (?<host>[^ ]*) (?<body>.*)$/
こんな感じで自分でパースしてelasticsearchに渡すとうまくtimestampをパースしてくれません
以下にあるようにmappingを手動で設定してもダメでした
なので「format syslog」を使うのが定石になるのですが、ポイントとしてはサーバ側のfluent.confに「logstash_format true」を必ず入れて下さい
これを入れることでdynamic mappingもちゃんと働くので自分でmappingを登録する必要がなくなります

●elasticsearchにindexの登録とmappingの設定(今回は実施しなくて大丈夫です)
1. indexの登録
curl -X POST 'http://server_host_name:9200/messages'
サーバ側のfluent.confに記載してあるindex_nameと同じindexを作成してください

2. mapping登録
curl -X PUT http://server_host_name:9200/messages/fluentd/_mapping -d '{
  "app_log" : {
    "properties" : {
      "host" : {"type" : "string"},
      "body" : {"type" : "string"},
      "timestamp": {"format" : "MMM dd HH:mm:ss","type" : "date", "locale" : "ja_JP"}
    }
  }
}'

2013年12月12日木曜日

【AWS】SimpleQueueServiceクイックスタート for PHP(composer編)

■環境
CentOS 5.9 64bit
PHP 5.3.3

■クイックスタート
1. AWS SDK for php for composer をダウンロードする
以下の記事を参考に事前にcomposerをインストールしてください
http://kakakikikeke.blogspot.jp/2013/12/phpcomposer.html

touch composer.json
vim composer.json
{
    "require": {
        "aws/aws-sdk-php": "2.*"
    }
}

composer install
以下のようになれば完了です(デバッグログにデフォルトで色付けされているのがいいです)
WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-update pear.php.net" to update
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing symfony/event-dispatcher (v2.4.0)
    Downloading: 100%

  - Installing guzzle/guzzle (v3.7.4)
    Downloading: 100%

  - Installing aws/aws-sdk-php (2.4.11)
    Downloading: 100%

symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file

2. アクセスキーとシークレットキーの取得
https://portal.aws.amazon.com/gp/aws/securityCredentials
アクセスしawsのアカウントでログインします
取得したアクセスキー、シークレットキーは後で使いますので大切に補完しておいてください

3. サンプル実行ファイルを作成する
touch sample_sqs.php
vim sample_sqs.php
以下を貼り付けてください
<?php
require 'vendor/autoload.php';
use Aws\Sqs\SqsClient;

$client = SqsClient::factory(array(
  'key'    => 'your access key',
  'secret' => 'your secret access key',
  'region' => 'us-west-2'
));

echo 'ListQueues' . "\r\n";
$result0 = $client->listQueues(array(
  'QueueNamePrefix' => 'string',
));
$result0->get('QueueUrls');
var_dump($result0);

$result1 = $client->createQueue(array(
  'QueueName' => 'kaka_queue002',
  'Attributes' => array(
    'VisibilityTimeout' => '300',
  ),
));
$queueUrl = $result1->get('QueueUrl');
echo $queueUrl . "\r\n";

$result2 = $client->sendMessage(array(
  'QueueUrl' => $queueUrl,
  'MessageBody' => 'test message !',
  'DelaySeconds' => 0,
));

echo 'ReceiveMessage' . "\r\n";
$result3 = $client->receiveMessage(array(
  'QueueUrl' => $queueUrl,
  'MaxNumberOfMessages' => 10,
  'WaitTimeSeconds' => 20,
));
$body = $result3['Messages'];
echo $body[0]['Body']. "\r\n";
#var_dump($result3);

echo 'OK';
?>

リージョンはus-west-2(Oregon)にしていますので適宜変更して問題ございません
key と secret を取得したアクセスキーとシークレットキーで設定してください
基本的に結果は連想配列で返ってくるようなので、中身をvar_dumpメソッドで確認しながら目的のデータを取得する感じになるかと思います

php sample_sqs.php
とするとkaka_queue002に「test message !」というメッセージが送信され受信もされます

■参考

2013年12月11日水曜日

【PHP】composerのインストール方法

■環境
CentOS 5.9 64bit
PHP 5.3.3
composer 2013-12-06

■インストール
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/
cd /usr/local/bin
ln -s composer.phar composer

■バージョン確認
composer -V
Composer version 80499bb02418711b34bba59c1a6d8032429e5702 2013-12-06 12:32:19

あとはcomposer.jsonを作成し
composer install
とすればvendor配下にライブラリが追加されていきます
実行するphpのソースコード内では「vendor/autoload.php」をrequireするだけで自動でインストールしたライブラリが使えるようになります

2013年12月9日月曜日

puppetのインストールとサンプルの実行

■環境
CentOS 5.9
puppet 2.6.18 ( puppetd, puppetmasterd ともに同じバージョンです )

■インストール
yum -y install puppet
yum -y install puppet-server
※epelのリポジトリの登録が必要です

■puppetmasterdサーバ起動
vim /etc/puppet/puppet.conf
main 部分に以下を記載
※servernameにはpuppetmasterdが動作するサーバのホスト名またはIPアドレスを入力してください
server = servername
puppetmasterd --no-daemonize --d
  • --no-daemonizeを指定することでフォアグランドで動作します
  • -dはデバッグログを出力するためのオプションです
  • Ctrl + c で停止できます
  • バックグラウンドで実行した場合に停止する際はkillで停止してください

■マニュフェストファイルの作成
上記puppetmasterdは起動したまま以下の作業を続けます
今回はhostsファイルの権限を変更するサンプルを実行してみます
touch /etc/puppet/manifests/site.pp
emacs /etc/puppet/manifests/site.pp
file { '/etc/hosts':
    owner => 'root',
    group => 'root',
    mode  => 644,
}
※.ppファイルの名前が「site」でないとうまく動作しない可能性があります

■puppetdクライアント実行
実行する前にhostsファイルの権限を777とかに変更しておいてください
実行後にhostsファイルを確認すると権限が644になっているかと思います
puppetd --server [servername] --no-daemonize -d
※[servername]にはpuppetmasterdを起動しているサーバのIPもしくはホスト名を入力してください

■参考

●いろんなresourceを使ったサンプルマニュフェスト
1. ファイルを作成する
file { 'test.txt':
  path => '/var/tmp/test.txt',
  ensure => present,
  mode => 644,
  content => "これはテスト用のファイルです",
}
pathはフルパスでファイル名まで記載します
mode, contentは記載しなくてもOKです、ない場合は空のファイルを作成するだけです
contentに記載の内容はファイルに書き込まれます、日本語も使えます

2. コメントアウト
先頭に「#」をつけることで1行のコメントアウト、「/* ... */」で囲うことで複数行のコメントアウトができます

3. chkconfigをON/OFFにする
service { 'tomcat':
  enable => false,
}
/etc/init.dで管理されている必要があります

4. puppetをpuppetmasterdなしに単独で実行する方法
puppet apply localhost.pp -d
とするとpuppetmasterdが起動していなくてもクライアント単独でpuppetを実行させることが可能です
「-d」を付けることでデバッグログを出力することができます
chefでいうところにchef-soloにあたるのかなと思います

5. serviceの起動と停止をする方法
service { 'tomcat':
  #ensure => 'running',
  ensure => 'stopped',
}

6. マニュフェスト内で変数を使用する方法
$process_name = 'tomcat'
$file_name = 'test2'

service { $process_name:
  #enable => false,
  enable => true,
  ensure => 'running',
  #ensure => 'stopped',
}

file { "/var/tmp/$file_name":
  ensure => 'directory',
}
変数を文字列と結合して参照する場合はダブルクオートで囲うことで変数が展開されます


2013年12月7日土曜日

【Mac】ターミナルの色をきれいに表示するSolarizedをインストール、設定する方法

■環境
OS X 10.8.5

■インストール
1. ターミナルから実施
ターミナルを開きます
cd /var/tmp
git clone https://github.com/tomislav/osx-terminal.app-colors-solarized solarized
git clone https://github.com/altercation/vim-colors-solarized.git
mkdir -p ~/.vim/colors
mv vim-colors-solarized/colors/solarized.vim ~/.vim/colors
touch ~/.vimrc
syntax enable
set background=dark
colorscheme solarized
let g:solarized_termcolors=256

sudo port -v selfupdate
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
※上記のbrewをインストールするためには事前にJavaとruby、XcodeCommandLineが必要です
brew install coreutils
※全然関係ないですが、インストール時にビールのアイコンがターミナル上に表示されます
git clone https://github.com/seebi/dircolors-solarized.git dircolors-solarized
vim ~/.bash_profile
alias ls='gls --color=auto'
eval $(gdircolors /var/tmp/dircolors-solarized/dircolors.ansi-universal) 
source ~/.bash_profile

2. ターミナルの設定
ターミナル -> 環境設定 -> プロファイル一覧の一番した歯車マークから「読み込む」を選択
先ほどターミナルからの操作でダウンロードした/var/tmp/solarized/Solarized Dark.terminal と Solarized Light.terminalを読み込みます
起動 -> 起動時に開く -> Solarized Darkを選択
ターミナルを再起動するとSolarizedのカラーテーマのターミナルが立ち上がり「ls」および「vim」でカラー付けがされているかと思います

以上で設定は完了です

2013年12月5日木曜日

Zabbixでmongoの監視やってみた

■環境
CentOS 6.2
Zabbix 2.0.3
mongoDB 2.4.5
php 5.3.3
※事前作業としてZabbixサーバのインストールとmongoDBのインストールは完了しているものとします
※今回の対応自体ではzabbix_agentd自体は使用しません、また作業はほぼ全てZabbixサーバ上で実施します、zabbix_agentdはインストールしてあっても問題はないです

■モジュール追加(Zabbixサーバ上で実施上で実施)
yum -y install php-devel php-pear gcc make
pecl install mongo
vim /etc/php.ini
以下を追記
extension=mongo.so

vim test.php
以下を追記
<?php
new MongoClient("mongodb://dbserver:27017");
?>

php test.php
でエラーとならなければOK
エラーとなる場合はmongoのプロセスが上がっているかやACLの設定(FWやiptables)を見なおして下さい

■スクリプト追加(Zabbixサーバ上で実施)
mkdir -p /opt/zabbix/share/zabbix/externalscripts/
cd /opt/zabbix/share/zabbix/externalscripts/
wget http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/mikoomi-mongodb-plugin.php
wget http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/mikoomi-mongodb-plugin.sh
chmod 755 mikoomi-mongodb-plugin.*
chown zabbix:zabbix mikoomi-mongodb-plugin.*
※どうやらchefインストールした環境だと上記のパスに置く必要があるようです(すいません、先に書いておくべきでしたが今回Zabbiサーバのインストールはchefで実施しています

■スクリプト修正(Zabbixサーバ上で実施)
以下は実施しないでもいいかもしれません、自分の環境では実施しないと動作しなかったので備忘録がてら記載しておきます
  1. mikoomi-mongodb-plugin.sh内で「shift」コマンドを実行している行を削除(shiftすることで引数がうまくphpに渡せませんでした)
  2. mikoomi-mongodb-plugin.php内541行目あたりでzabbix_senderを呼んでいるパスをフルパスに変更(フルパスで呼んでいないのでPATHを通していない場合はzabbix_senderをフルパスで呼ぶように変更してください)

■Zabbixサーバへのテンプレート登録(Zabbixサーバ上で実施)
http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/MongoDB_Plugin_template_export.xml
をダウンロードしてZabbixのWebUIからテンプレートを登録します
インポートできたテンプレートに対して監視対象のホストを追加します
テンプレートの設定からマクロタブを選択して
{$HOSTNAME}、{$PORT}、{$SERVER}
を追加します
{$HOSTNAME}と{$SERVER}に監視するmongoDB側のIP(またはホスト名)を入力し
{$PORT}にLISTENしているmongoのポートを入力します(test.phpでテストしたときのポート番号を入力します)

■ACL設定(ZabbixサーバとDBサーバ)
Zabbixサーバ -> tcp/27071 -> mongoDB
上記を満たすFWやiptablesの設定をしてください
replicaSet構成の場合は各ポートも通信できるようにしたほうがいいかもしれません
※公式だとmongosのプロセスを監視すれば良いと書いてあるようでしたが私はreplicaSetのPRIMARYポートを監視するようにしました(なのでfail overした場合は監視するポート変更する必要があります。。。)

■参考

以上で設定自体は完了です
あとは自分が設定した際のトラブルシューティングを記載しているので参考にしてみてください

●全体的な動きの流れ
全体的な動きとしては
シェル実行 -> php実行 -> mongoからデータ取得 -> zabbix_sender で 127.0.0.1にデータ登録
という流れとなっています
なのでzabbix_agentを使えないで監視ができるわけです
zabbix_senderは /tmp/mikoomi-mongodb-plugin.php_dbserver.data のデータを送っています
ちなみにphp内で送信しているzabbix_senderのコマンドは以下でした
/opt/zabbix/bin/zabbix_sender -vv -z 127.0.0.1 -i /tmp/mikoomi-mongodb-plugin.php_dbserver.data
上記を実行してエラーとならないことを確認する必要もあります
zabbix_sender自体のログも/tmp配下にあります

●トラブルシューティング
うまく取得できない場合はホストのアイテムの設定からMiscellaneous: Data Collectorのステータスを有効にしてください
その後zabbix_server.logを見るとシェルを実行した結果のログがでるのでそれを元に修正します

配置したシェルを直接叩いて動作を確認することもできます、以下は実行サンプルです
sh /opt/zabbix/share/zabbix/externalscripts/mikoomi-mongodb-plugin.sh -h dbserver -p 27071 -z dbserver
phpは以下のように実行します
php /opt/zabbix/share/zabbix/externalscripts/mikoomi-mongodb-plugin.php -h dbserver -p 27071 -z dbserver
シェルやphpをrootで実行した場合は/tmp配下のログの権限に気をつけてください
ログの所有者がrootになってしまいzabbixから実行した場合はzabbixユーザで実行することになりログへの権限がなくなりスクリプトがうまく動かなくなりますのでrootで直接スクリプトを実行した場合は権限の書き換えかファイルの削除をしてください

「timeout while executing a shell script」が出力される場合はzabbix_server.confのTimeoutの値を30に変更しzabbix_serverを再起動してください

「No Data Received in 5 minutes」でアラートが常にあがってしまう場合はトリガーの設定でnodateの引数を800くらいあげてください
どうやらZabbixトラッパーでのデータの取得が10分おきになっているのでデフォルトの300秒(5分)だと常にアラートがあがってしまうようです

最終的にzabbix_server.logに
8967:20131204:171621.274 item [db_server:mikoomi-mongodb-plugin.sh[-h {$SERVER} -p {$PORT} -z {$HOSTNAME}]] became supported
的なログが出力されれば完了です

2013年12月3日火曜日

apacheでリアルタイムに秒間リクエスト数を取得する方法

apachetopというコマンドを使用することでリアルタイムの値を取得することが可能です
apachetopはデフォルトではインストールされていませんので
yum -y install apachetop
でインストールしてください(CentOS 6.3の場合)
インストールしたらapacheのログを引数として以下のように実行します

apachetop -T 1 -d 1 -f /var/log/httpd/http+access.log

apachetopはアクセスログを元に現在のリクエスト数を取得することができます
「-T」はログ監視する間隔でこれを1秒にすることで1秒間の間に流れたログを元にアクセス数を算出してくれます

サーバ上のリソース状況を監視するtopコマンド同様で標準出力に出続けます
なのでリダイレクトなどを使ってファイルに出力したり、awkやgrepと組み合わせてコマンドを実行するたびに値を取得するのはちょっと難しいかもしれないです
監視データを永続的に持っておきたい場合にはzabbixを使ったapacheの監視方法を別記事で紹介してますのでそちらを参照してください
http://kakakikikeke.blogspot.jp/2013/06/chefzabbixapache.html