togatttiのエンジニアメモ

過度な期待はしないでください。旧麹町で働くエンジニアのメモ帳です。

日時範囲を指定して、Elasticsearchのデータを取得する。

curlで日時範囲を指定して、Elasticsearchのデータを取得する方法を示す。

取得対象のデータには、

(snip)
 "@timestamp" : "2017-08-16T16:51:06+09:00"
(snip)

のような感じで、タイムスタンプが設定されていることを前提とする。

curlで、タイムスタンプを日時の範囲を指定して、データを取得したい場合は、

$ curl -XGET 'localhost:9200/elsdata-2017.08.16/elsdata/_search' -d '{
    "query": {
        "range" : {
            "@timestamp" : {
                "gte" : "2017-08-16T16:18:00+09:00", "lte": "now", "format" : "date_time_no_millis"
            }
        }
    }
}'

という感じで、JSONを渡してあげると取得できる。

gteとlteを指定することで、2017-08-16T16:18:00+09:00から現在までのデータを取得することできる。

タイムスタンプの形式によっては、formatを設定する必要があるので、ここから条件を満たすものを選び設定する。

また、10000件以上のデータを一度に取得したい場合は、scrollとsizeを指定して、リクエストすると取得できる。

以下の例は、30000万件のデータを取得する場合

$ curl -XGET 'localhost:9200/elsdata-2017.08.16/elsdata/_search?scroll=1m&size=30000&pretty' -d '{
    "query": {
        "range" : {
            "@timestamp" : {
                "gte" : "2017-08-16T16:18:00+09:00", "lte": "now", "format" : "date_time_no_millis"
            }
        }
    }
}'

embulk-parser-regexのエラー対応

Embulkプラグインのembulk-parser-regexで、regexのキーに、_(アンダースコア)を含めるとエラーになる。

regexを使う時は、キーに_を使わないようにしよう。

エラーメッセージ

Error: java.util.regex.PatternSyntaxException: named capturing group is missing trailing '>' near index 125
^(?<from>[^%]+)%(?<uid>[^%]+)%(?<did>[^%]+)%(?<mid>[^%]+)%(?<type>[^%]+)%(?<to>[^%]+)%(?<status>[^%]+)%(?<ts>[^%]+)%(?<status_desc>[^%]+)%(?<host>[^%]+)%(?<uuid>[^%]+)$
                                                                                                                             ^

confg.ymlのサンプル

parser:
    type: regex
    # エラーが出る。
    # regex: ^(?<from>[^%]+)%(?<uid>[^%]+)%(?<did>[^%]+)%(?<mid>[^%]+)%(?<type>[^%]+)%(?<to>[^%]+)%(?<status>[^%]+)%(?<ts>[^%]+)%(?<status_desc>[^%]+)%(?<host>[^%]+)%(?<uuid>[^%]+)$
    # アンダースコアを消すとうまくいく。
    regex: ^(?<from>[^%]+)%(?<uid>[^%]+)%(?<did>[^%]+)%(?<mid>[^%]+)%(?<type>[^%]+)%(?<to>[^%]+)%(?<status>[^%]+)%(?<ts>[^%]+)%(?<statusdesc>[^%]+)%(?<host>[^%]+)%(?<uuid>[^%]+)$

    columns:
(snip)
    # regex_nameもアンダースコアを修正
    # - {name: status_desc, type: string, regex_name: status_desc}
    - {name: status_desc, type: string, regex_name: statusdesc}
(snip)    

Raspberry Pi 3でPhantomJSを使う

github.com

これをcloneすれば、すぐ使える。

parallel-slurpで、ファイルを並列で取得する

複数のホストから、ファイルをダウンロードする必要があったので、方法を調べた。

parallel-slurp(pslurp)という便利なものがあったので、使うことにした。

インストール

OSは、Ubuntuなので、APTでインストールする。

# apt install pssh

manを読むと、やりたことが書かれてる。

        PARALLEL-SLURP(1)                                                                                            PARALLEL-SLURP(1)

NAME
       parallel-slurp - copy files from listed hosts

SYNOPSIS
       parallel-slurp [OPTIONS] -h hosts.txt -L destdir remote local

DESCRIPTION
       pssh provides a number of commands for executing against a group of computers, using SSH. It´s most useful for
       operating on clusters of homogenously-configured hosts.

       parallel-slurp gathers specified files from hosts you listed.
(snip)

使い方

対象ホストのリストを用意する。

$ cd /home/admin/
$ cat file_list
a.example.com
b.example.com
c.example.com

ダウンロードしたファイル用のディレクトリを作成する。

$ mkdir downloads

parallel-slurpを実行する。

$ parallel-slurp -ladmin -h file_list -p 3 -L /home/admin/downloads /var/log/http_access.log http_access.log

引数の説明を簡単にする。

  • -lは、作業ユーザ
  • -hは、対象ホストのリスト
  • -pは、並列処理数
  • -Lは、ダウンロードしたファイルを置くディレクト

そのあとの引数は

  • ダウンロードするファイルの絶対パス
  • ダウンロードした際のファイルの名前

実行するとディレクトリは次のようになる。

$ tree downloads/
downloads/
├── a.example.com
│   └── http_access.log
├── b.example.com
│   └── http_access.log
└── c.example.com
    └── http_access.log

3 directories, 3 files

browsertimeで、Webページの描画過程を録画する

browsertimeを使い、Webページのロード時間を計測しながら、描画過程を録画する。

うまくいくとこんな感じで、録画できる。

browsertimeで生成されたmp4ファイル、HTMLの記述例などは、GitHubに置いた。

https://github.com/kentatogashi/example-browsertime

browsertimeの実行方法

OSは、Ubuntu16.04を使う。

Dockerを入れる。

# apt update 
# apt install -y docker.io

browsertimeを実行する

# docker run --privileged --shm-size=1g --rm -v "$(pwd)":/browsertime-results sitespeedio/browsertime -n 1 -c cable --video --speedIndex 'https://www.yahoo.com'

実行すると、ディレクトリが生成され、動画や画像が格納される。

$ tree www.yahoo.com
www.yahoo.com
└── 2017-02-14T043457+0000
    ├── browsertime.har
    ├── browsertime.json
    └── video
        ├── 0.mp4
        └── images
            └── 0
                ├── ms_000000.jpg
                  (snip)
                 └── ms_007950.jpg

4 directories, 78 files

HTTP/1.1とHTTP/2の比較計測をする際に、はかどりそう。

あと、日本語サイトに対して、実行すると文字化けするので、ちょっと残念なところはある。

参考 - GitHub - sitespeedio/browsertime: Your browser, your page, your scripts!