MongoDBユーザがよく使っているであろう
便利ツールのmtoolsに使い方を紹介します。

mtoolsとは

MongoDBのログ解析や可視化, テスト環境の構築, テストデータの生成等の
便利な機能がスクリプトで提供されている。
Githubリポジトリ

提供されているコマンドは以下の通り。

  • mlogfilter
  • mloginfo
  • mplotqueries
  • mlogvis
  • mlaunch
  • mgenerate

mlogfilter

ログファイルをマージしたら,時間別のスロークエリやテーブルスキャン等の検出,ログをフィルタリングしてJSON変換することができる。

mloginfo

ログファイルを読み込ませると, 開始時間, 終了時間, バージョン, 再起動, 接続情報を集計することができる。

mplotqueries

matplotlibを使ってログファイルを可視化する。

mlogvis

ログファイルを可視化したHTMLファイルを作成する。

mlaunch

ローカルテスト環境を簡単に構築する。ReplicationやSharded clusterも構築可能。(pymongoが必要)

mgenerate

テンプレートに基づいてテスト用データを作成する。

インストール

pythonの実行環境が必要。 また機能によってpymongo, matplotlibも必要なのでインストールする。

# 必要ツールのinstall
$ pip install pymongo, matplotlib

# mtools install
$ pip install mtools

使い方

共通パラメータ

  • --help prints help
  • --version prints version

mlogfilter

General パラメータ

  • --verbose increases verbosity
  • --shorten shortens lines
  • --human increases readability
  • --exclude inverts filters
  • --json outputs JSON format
  • --timestamp-format changes timestamp format

Merge パラメータ

  • --markers markers for merged files
  • --timezone shifts timezone of logfile(s)

Filter パラメータ

  • --namespace filters by namespace
  • --operation filters by operation
  • --thread filters by thread
  • --pattern filters by pattern
  • --slow/--fast filters by duration
  • --scan finds collection scans
  • --word filters by keywords (OR)
  • --from/--to slices log file by time

examples

# ログファイルを指定して実行
$ mlogfilter mongod.log [parameters]

# pipeで実行も可能
$ cat mongod.log | mlogfilter [parameters]

# ログファイルをマージする場合は複数ファイル指定する
$ mlogfilter mongod-01.log mongod-02.log  [parameters]

# 1000ms以上のスロークエリを抽出する
$ mlogfilter mongod.log --slow 1000 --json

mloginfo

パラメータ

  • --queries query aggregation
  • --restarts restart time and version
  • --distinct distinct list of log lines
  • --connections connections statistics
  • --rsstate replicaset state changes

Examples

# ログファイルの集計
$ mloginfo mongod.log

     source: mongod.log
       host: enter.local:27019
      start: 2014 Apr 09 23:16:20.437
        end: 2014 Apr 09 23:28:38.076
date format: iso8601-local
     length: 653
     binary: mongod
    version: 3.2.1

# クエリ一覧
$ mloginfo mongod.log --queries

# 再起動情報
$ mloginfo mongod.log --restarts

# 接続情報
$ mloginfo mongod.log --connections

CONNECTIONS
     total opened: 156765
     total closed: 155183
    no unique IPs: 4
socket exceptions: 915

192.168.0.15      opened: 39758      closed: 39356
192.168.0.17      opened: 39606      closed: 39207
192.168.0.21      opened: 39176      closed: 38779
192.168.0.24      opened: 38225      closed: 37841

mplotqueries

General パラメータ

  • --logscale enables log scale
  • --title change title
  • --optime-start plot ops when they started
  • --output-file writes plot to file instead

Groupings

  • --group choose grouping
  • --group-limit limit number of groups

Plot Types

  • --type scatter Scatter Plot
    Scatter Plot
  • --type nscanned/n Scan Ratio Plot

  • --type durline Duration Line Plot
    Duration Line Plot
  • --type histogram Histogram Plot
    Histogram Plot
  • --type connchurn Connection Churn Plot
    Connection Churn Plot
  • --type range Range Plot
    Range Plot
  • --type event Event Plot
    Event Plot
  • --type rsstate Replica Set State Plot
    Replica Set State Plot

グラフ画像出典: mtools/GitHub Wiki

Overlays

  • --overlay add
  • --overlay list
  • --overlay reset

Examples

# 必要ツールのinstall
pip install pymongo, matplotlib

# mtools install
pip install mtools

mlogvis

# HTMLファイルの生成
mlogvis mongod.log

# pipe 処理
mlogfilter logfile [parameters] | mlogvis

mlaunch

General パラメータ

  • --verbose increases verbosity
  • --dir specify directory for dbpath(s)

init Command

Required パラメータ (どちらか)

  • --single creates stand-alone node
  • --replicaset creates replica set

Replica Set パラメータ

  • --nodes number of nodes
  • --arbiter add arbiter
  • --name change replica set name

Sharding パラメータ

  • --sharded create shards
  • --config number of config servers
  • --mongos number of mongos nodes

Authentication パラメータ

  • --auth enable auth
  • --username change default user
  • --password change default password
  • --auth-db change default database for user
  • --auth-roles change default roles for user

Optional パラメータ

  • --port start port for setup
  • --binarypath specify path for binaries
# 一台環境構築
$ mlaunch --single

# 一台環境構築 ジャーナルなし
$ mlaunch --single --nojournal

# 3台でのReplication環境構築
$ mlaunch --replicaset --nodes 5

# 3シャード レプリケーション無し
$ mlaunch --single --sharded 3

# 3シャード 3台レプリケーション config 3台, mongos 2台
$ mlaunch --replicaset --nodes 3 --sharded 3 --config 3 --mongos 2

# 停止コマンド
$ mlaunch stop

mgenerate

General パラメータ

  • --number 件数
  • --stdout 標準出力オプション

Database 接続パラメータ

  • --host HOST
  • --port PORT
  • --database D データベース
  • --collection C コレクション
  • --drop 削除してから投入する
  • --write-concern W 書き込みオプション

Operators

  • $objectid random ObjectId
  • $number random integer
  • $datetime random date/time
  • $missing field is missing
  • $choose picks one from selection
  • $array array of elements
  • $string random string
  • $geo random geo location
  • $point random geo point
  • $float random float
  • $concat
  • $age
  • $normal
  • $zipf

Examples

# 10000件のデータをlocalhost:27017へ投入
$ mgenerate test-data.json --num 10000 --host localhost --port 27017 --database test --collection hoge_collection

JSON File Example

{
    "user": {
        "name": {
            // $choose で配列内からランダムに作成
            "first": {"$choose": ["Liam", "Noah", "Ethan", "Mason"] },
            "last": {"$choose": ["Moore", "King", "Watson", "Anderson"] }
        },
        "gender": {"$choose": ["female", "male"]},
        // 年齢は数値データ
        "age": "$number",
        "address": {
            // 10文字の文字列生成
            "street": {"$string": {"length": 10}},
            "house_no": "$number",
            // 10000から99999までの範囲の数値データ作成
            "zip_code": {"$number": [10000, 99999]},
            "city": {"$choose": ["Manhattan", "Brooklyn", "New Jersey", "Queens", "Bronx"]}
        },
        // 30%の割合でfieldが存在しない, 存在する場合は1000000000から9999999999の範囲の数値データ
        "phone_no": {
            "$missing" : {
                "percent" : 30, "ifnot" : {"$number": [1000000000, 9999999999]} } },
        // 2010-01-01から2014-07-24までの期間内の日時データ作成
        "created_at": {"$date": ["2010-01-01", "2014-07-24"] },
        "is_active": {"$choose": [true, false]}
    },
    "tags": {"$array": {"of": {"label": "$string", "id": "$oid", "subtags":
        {"$missing": {"percent": 80, "ifnot": {
        "$array": ["$string", {"$number": [2, 5]}]}}}}, "number": {"$number": [0, 10] }}}
}

まとめ

mtoolsはMongoDBを使った開発やテストをする際に
非常に有用なツールなので使いこなせて損はないです。

Related Posts