InfluxDBきほんのき

最近Grafanaを弄っている流れでInfluxDBも触っています。
結構くせがあったのでInfluxDBについてまとめることにしました。


## インストール

`rpm`や`dpkg`、macだったら`brew`でサクッと入れられます。

[InfluxDB | Installation](http://influxdb.com/docs/v0.7/introduction/installation.html)

* REHL系の例

```bash
rpm -ivh http://s3.amazonaws.com/influxdb/influxdb-latest-1.x86_64.rpm
```

## GUI

InfluxDBにはWebの管理GUIが同梱されています。
デフォルトでは
http://localhost:8083
でアクセスできます。

![InfluxDB1.png](https://qiita-image-store.s3.amazonaws.com/0/31408/39063308-0619-a53d-0ee9-fddb2a6065b5.png)

初期のユーザとパスワードは公式ドキュメントに記載があるように`root/root`です。
ホスト名にはブラウザで開いたホストと同じもの、ポートには`8086`を指定して`connect`します。

## データベースの作成

InfluxDBのデータベースはRDBのスキーマの概念に近いです。

### GUI経由でのデータベースの作成

`connect`するとデータベース一覧と登録フォームが表示されます。

![influxdb2.png](https://qiita-image-store.s3.amazonaws.com/0/31408/eb827fe5-5a35-4096-fdae-b454f856758e.png)

ここでデータベース名を入力し、`Create Database`を行うとデータベースを作成することができます。

### REST API経由でのデータベースの作成

curlを使った例です。JSONを`-d`で`POST`します。

```bash
curl -X POST 'http://localhost:8086/db?u=root&p=root' -d '{"name": "test"}'
```

## ユーザの作成

### GUI経由でのユーザの作成

データベース・ユーザを作成します。
データベースを選択するとユーザ一覧と登録フォームが表示されます。

![influxdb3.png](https://qiita-image-store.s3.amazonaws.com/0/31408/190365ce-107e-5cef-b3e9-c46dc59408ec.png)

ここでユーザ名とパスワードを入力し、`Create`を行うとデータベース・ユーザを作成することができます。
`Admin`にチェックすると`Admin`ユーザとなります。
`Admin`ユーザはデータベースやユーザを作成／削除したり、パーミッションを変更したりすることができます。

### REST API経由でのユーザの作成

パスが`/db/データベース名/users`になります。

```bash
curl -X POST 'http://localhost:8086/db/test/users?u=root&p=root' -d '{"name": "test", "password": "パスワード"}'
```

## データの登録・WRITE

InfkuxDBでは`series`ごとにデータを登録します。
`series`とはRDBのテーブルに近い概念です。
`time`カラムを指定して登録すれば指定した時刻のデータを登録することができます。

### GUI経由でのデータ登録

データベース一覧から`Explore Data »`をタップします。
`Time Series Name`に`series名`を入力し、
`Write Point`にJSONを入力してボタンをタップします。
JSONの形式は`{"カラム名": 値, ・・・}`です。

![influxdb4.png](https://qiita-image-store.s3.amazonaws.com/0/31408/3a30d56e-7784-c559-1a21-716b9a01ad82.png)


### REST API経由でのデータ登録

パスが`/db/データベース名/series`になります。
JSONを`POST`するのですがGUIのJSONと形式が異なります。

```json
[
  {
    "name": "series名",
    "columns": [カラム名を配列で、、],
    "points": [
      [カラム１の値、カラム２の値・・・],
      :
    ]
  }
]
```

```bash
curl -X POST 'http://localhost:8086/db/test/series?u=root&p=root' -d \
'{"name": "nikkei_average", "columns": ["time", "price"], "points": [[1418083200000, 17450.77]]}'
```

データの上書きを行うときは`time`, `sequence_number`を指定して`WRITE`します。

```bash
curl -X POST 'http://localhost:8086/db/test/series?u=root&p=root' -d \
'{"name": "nikkei_average", "columns": ["time", "sequence_number", "price"], "points": [[1418083200000, 69260001, 17450.77]]}'
```

## クエリ・SELECT

### GUI経由でのクエリ

データ登録と同様、データベース一覧から`Explore Data »`をタップします。
`Read Pounts`にクエリを入力し、`Execute Query`をタップします。

![influxdb5.png](https://qiita-image-store.s3.amazonaws.com/0/31408/2081d37a-5fef-e807-1e45-70d966502c76.png)

時系列グラフと結果が一覧で表示されます。

### REST API経由でのクエリ

パスはデータ登録と同じく`/db/データベース名/series`になります。
HTTPメソッドが`GET`になり、QueryString:`q=`でクエリを渡します。

```bash
curl -G 'http://localhost:8086/db/test/series?u=root&p=root' -d --data-urlencode "select * from nikkei_average"
```

結果がJSONで表示されます。

```json
[{"name":"nikkei_average","columns":["time","sequence_number","price"],"points":[[1419778800000,69270001,17729.84],[1419519600000,69280001,17818.96],[1418083200000,69260001,17450.77]]}]
```

見づらいので`pretty=true`をQueryStringに追加するとインデント表示されます。

```bash
curl -G 'http://localhost:8086/db/test/series?u=root&p=root&pretty=true' -d --data-urlencode "select * from nikkei_average"
```

```json
[
    {
        "name": "nikkei_average",
        "columns": [
            "time",
            "sequence_number",
            "price"
        ],
        "points": [
            [
                1419778800000,
                69270001,
                17729.84
            ],
            [
                1419519600000,
                69280001,
                17818.96
            ],
            [
                1418083200000,
                69260001,
                17450.77
            ]
        ]
    }
```

## ユーザの削除

### GUI経由でのユーザの削除

データベース・ユーザを削除します。
ユーザ一覧からXをタップするだけです。

![influxdb6.png](https://qiita-image-store.s3.amazonaws.com/0/31408/b3d92a09-d096-ac50-da32-fcef1e0d0a18.png)

### REST API経由でのユーザの削除

パスが`/db/データベース名/users/ユーザ名`になります。
HTTPメソッドは`DELETE`を使います。

```bash
curl -X DELETE 'http://localhost:8086/db/test/users/dbuser?u=root&p=root'
```


## データベースの削除

### GUI経由でのデータベースの削除

データベースを削除します。
ユーザの削除と同じくデータベース一覧からXをタップするだけです。

![influxdb7.png](https://qiita-image-store.s3.amazonaws.com/0/31408/fa6c9092-1da9-2f1f-ccf2-83c0c679f111.png)

### REST API経由でのデータベースの削除

パスが`/db/データベース名`になります。
HTTPメソッドは`DELETE`を使います。

```bash
curl -X DELETE 'http://localhost:8086/db/test?u=root&p=root'
```