GridDB クラウド Version 1.2 の紹介

今回は、以前のブログに続いて新しい GridDB クラウドサービスについて紹介します。クラウドサービスの基本については、以前のブログ [GridDB Cloudの紹介][1] をご覧ください。今回は、クラウドサービスのバージョン1.2の新機能について説明します。

GridDBの新バージョンのリリースに伴い、GridDB クラウドに組み込まれた [GridDB Web API][2]が利用可能になりました。WebAPIの基本的な使い方は、[こちら][3]で紹介しています。WebAPIの主な利点は、HTTPリクエストを使ってコンテナを作成し、データを直接データベースにプッシュできることです。これにより、[Telegraf][4]のような他のサービスを使用して、メトリクスや他のデータをGridDBデータベースに記録することが可能になります。

このブログでは、まず`curl`を使った簡単なWeb APIコマンドを紹介します。その後、Telegrafをクラウドサービスにインストールして使用する方法についても紹介します。

## クラウドでGridDB Web APIを使う

Web APIの使い方は非常に簡単です。GridDB クラウドサービスに申し込むと、ダッシュボードへの固有のURLと、HTTP Requestを作成するためのベースとして使用する特定のWeb API Endpointへの別のURLが付与されます。

### GridDB ユーザーを作成する

まず始めに、`GridDB ユーザー`を新規に作成します。このユーザーとパスワードは、HTTP Web API リクエストを行う際に使用されます。今回の例では、ユーザー名はtest 、パスワードはtest を使用します。

[<img src="https://griddb.net/en/wp-content/uploads/2021/12/Screenshot_25-1.png" alt="" width="1255" height="485" class="aligncenter size-full wp-image-27936" />][5]

[<img src="https://griddb.net/en/wp-content/uploads/2021/12/Screenshot_24-1.png" alt="" width="1262" height="822" class="aligncenter size-full wp-image-27935" />][6]

### コンテナを作成する

それでは、最初のリクエストを作成しましょう。まず始めに、`point01`というコンテナを作成します。

リクエストには、コンテンツタイプを `application/json; charset=UTF-8` に設定し、ユーザー名とパスワードをbase64にエンコードしたBasic Authorizationヘッダーを設定する必要があります。例えば、curlを使ったリクエストは次のようになります。

```bash
curl --location --request POST 'https://cloud1.griddb.com/trial002/griddb/v2/gs_clustertrial002/dbs/public/containers' \
--header 'Authorization: Basic dGVzdDp0ZXN0Cg==' \
--header 'Content-Type: application/json; charset=UTF-8' \
--data '{
    "container_name": "point01",
    "container_type": "TIME_SERIES",
    "rowkey": true,
    "columns": [
        {
            "name": "timestamp",
            "type": "TIMESTAMP"
        },
        {
            "name": "active",
            "type": "BOOL"
        },
        {
            "name": "voltage",
            "type": "DOUBLE"
        }
    ]
}'
```

そこでまず、指定された GridDB クラウドWeb API の URL をエンドポイントとして使用します。この"式"でエンドポイントを構築します。 <base URL>/<clustername>/dbs/public/containers

Authorizationの行は、ユーザ名とパスワードをbase64でエンコードして1つのエンティティとして、次のように記述します。`test:test`

データカラムは、作成したいコンテナのスキーマを `json` で指定します。今回の例では、3 つのカラムを持つ point01 という名前の TIME_SERIES コンテナを作成します。送信すると、HTTP レスポンスコードとして 201 (Created) が返ってくるはずです。

### 行を登録する

行を登録するために、再び簡単な式を使用してエンドポイントを構築します。<baseurl>/dbs/public/containers/<containername>/rows 新しく作成したコンテナにデータを送信してみましょう。HTTPリクエストでは`POST`ではなく`PUT`を使用していることに注意してください。</containername></baseurl>

```bash
curl --location --request PUT 'https://cloud1.griddb.com/trial002/griddb/v2/gs_clustertrial002/dbs/public/containers/point03/rows' --header 'Authorization: Basic dGVzdDp0ZXN0Cg==' --header 'Content-Type: application/json;charset=UTF-8' -d '[["2021-06-28T10:30:00.000Z", false, "100"]]''
```

GridDB クラウド の `point03` コンテナに一般的な値を追加します。

### 行を取得する

行を取得するには、行の登録と同じエンドポイントを使用します。ただし、PUTの代わりにPOSTを使用します。また、リクエストのボディも別のものにします。

また、curl やコマンドラインを使うのが面倒な場合は、`VS Code` [REST Client extension][7] を使って簡単に変更することができます。VS Codeを使用してデータ行を取得するためのリクエストは以下のようになります。

```bash
POST https://cloud1.griddb.com/trial002/griddb/v2/gs_clustertrial002/dbs/public/containers/point03/rows HTTP/1.1
Host: cloud1.griddb.com
Authorization: Basic dGVzdDp0ZXN0Cg==
Content-Type: application/json
Content-Length: 93
 
{
  "limit"  : 100,
  "condition" : "timestamp >= TIMESTAMP('2021-06-28T04:30:00.000Z')"
}
```

より簡単にHTTP Requestをしたい場合は、[Postman][8]を利用することも可能です。

以上が、GridDB CloudでWeb APIを利用するための基本的な方法です。次に、InfluxDBとTelegrafを使ってみましょう。

## Telegraf

Telegrafはスタック、センサー、システムからメトリクスを収集するのに役立つオープンソースのサーバーエージェントです。簡単に言うと、新しくリリースされたTelegraf用のGridDB OutputプラグインとGridDB Web APIを併用して、HTTPでGridDB クラウドにデータを送信します。

まず、必要な要件をすべてインストールしましょう。

### インストール

インストールに必要な条件とは以下の通りです。

*   CentOS 7 以上
*   Go version 1.15.13 以上
*   GridDB Telegraf output プラグイン

#### Go

Goをインストールするには、同社の[ウェブサイト][9]から直接ダウンロードすることができます。インストール方法は、[こちら][10]を参照してください。インストールが完了したら、`$ go version`を実行してインストールできたことを確認します。

#### TelegrafとGridDB Outletプラグイン

まず、GridDB クラウドのダッシュボード サポートから、Telegraf用GridDB Outletプラグインのソースコードをダウンロードします。

次に、`go get`コマンドを使用してTelegraf本体をインストールします。

`$ go get -d "github.com/influxdata/telegraf"`

注意：もしこの手順通りにいかない場合、Goのホームディレクトリで作業していることを確認してください。また、`GO111MODULE`環境設定が`on`に設定されていることを確認してください。

`$ export GO111MODULE=on`

ダウンロードしたら、すべてをgoホームディレクトリ(`~/go/src/github.com/influxdata/telegraf`)に配置します。

ここで、ダウンロードしたソースコードからプラグインを `influxdata` ディレクトリにコピーしておきます。ダウンロードしたディレクトリからtelegrafディレクトリに移動してください。

`$ cp -R ./plugins ./griddb.conf  ~/go/src/github.com/influxdata/telegraf`

次に、GridDBプラグインをファイル自体に追加します。以下のディレクトリにある `all.go` ファイルを探します。 `~/go/src/github.com/influxdata/telegraf/plugins/outputs/all/` そして import セクションに次の行を追加してください。

`_ "github.com/influxdata/telegraf/plugins/outputs/griddb"`

そして、これでtelegrafをビルドして実行する準備が整いました。telegraf ディレクトリのルートに戻ってください。

`$ cd ~/go/src/github.com/influxdata/telegraf`

次に、 `make`

`$ make telegraf`

ここまでの手順通りに進めば、ディレクトリの中にtelegrafという実行可能な実行ファイルがあるはずです。

## 使用方法

まず最初に、`griddb.conf` ファイルを適切に設定しましょう。このファイルのコピーは、telegrafのルートディレクトリに既にあるはずです。次に、Telegraf のインスタンスが GridDB クラウドに出力されるように、いくつかの変更を加えてみましょう。

始める前に、Telegraf 自体がどのように動くのか、基本的な理解をしておくと良いでしょう。Telegraf は入力を受け取り、すべてのデータを出力に送ります。今回の例では、入力はメトリクスを取得するためにシステムをスクレイピングする influxdb サーバーで、出力は GridDBクラウドインスタンス です。

### 入力

入力には様々な種類がありますが、このブログの内容に沿って進めば、実用的なシステムを構築することができます。この簡単な例からさらに発展させたい場合は、入力について詳しく説明した[こちら][11]を読んでみてください。

今回の例では、シンプルに `cpu` 入力プラグインを使って、ホストマシンの CPU に関する情報を収集し、GridDB に送信します。構成は以下のようになります。

```bash
#[[inputs.cpu]]
  ## Whether to report per-cpu stats or not
  percpu = true
  ## Whether to report total system cpu stats or not
  totalcpu = true
  ## If true, collect raw CPU time metrics
  collect_cpu_time = false
  ## If true, compute and report the sum of all non-idle CPU states
#  report_active = false
    ## The column to extract the name of the metric from
    # csv_measurement_column = "name"

    ## The column to extract time information for the metric
    ## `csv_timestamp_format` must be specified if this is used
    # csv_timestamp_column = "time"
```

さらに、GridDBのJMSサービスを利用してトピックを提供するactivemqインプットを含めることもできます。

```bash
[[inputs.activemq]]
  ## ActiveMQ WebConsole URL
  url = "http://127.0.0.1:8161"

  ## Required ActiveMQ Endpoint
  ##   deprecated in 1.11; use the url option
  # server = "192.168.50.10"
  # port = 8161

  ## Credentials for basic HTTP authentication
   username = "admin"
   password = "admin"

  ## Required ActiveMQ webadmin root path
  webadmin = "admin"

  ## Maximum time to receive response.
  # response_timeout = "5s"

  ## Optional TLS Config
  # tls_ca = "/etc/telegraf/ca.pem"
  # tls_cert = "/etc/telegraf/cert.pem"
  # tls_key = "/etc/telegraf/key.pem"
  ## Use TLS but skip chain & host verification
  # insecure_skip_verify = false
```

### 出力

このブログでは、出力先はGridDB Cloudの1つだけなので、出力セクションは少しシンプルになります。ただし、デバッグが必要な場合は、debugフラグをtrueに設定し、2つ目の出力を設定すると便利です。

```bash
[[outputs.file]]
  files = [ "stdout" ]
  flush_interval = "1s"
  flush_jitter = "1s"
  metric_batch_size = 10
```

しかし、主な出力先はGridDB クラウドになります。デフォルトの `griddb.conf` ファイルには、すでにそのレイアウトを持っているはずで、そのほとんどは非常にわかりやすいものです。このファイルの内容は以下の通りです。

```bash
[[outputs.griddb]]
    ## The GridDB WebAPI URL.
    ## # (Required)
    api_url = "{your GridDB Web API URL}"

    ## The database name.
    ## # (Optional) Default: public
    database = "public"

    ## The cluster name.
    ## # (Required)
    cluster_name = "{clusterName}"

    ## GridDB administrator username.
    ## # (Required)
    username = "test"

    ## GridDB administrator password.
    ## # (Required)
    password = "test"

    ## Delete existing container if exist.
    ## # (Optional) ; Default: append
    ## # Accepted Value: replace, append
    ##     - replace: Override the existing container.
    ##     - append:  Append new rows into existing container.
    update_mode = "replace"

    ## The list of container that will be transfer to GridDB
    ## # Example: ["cpu", "ram", "product"]
    ## # Empty list [] means ALL containers
    ## # (Optional) ; Default: []
    containers = []

    ## Name the timestamp column. If timestampColumn is empty, it wont add timestamp column to the first column of the container
    ## # (Optional)
    timestamp_column = "timestamp"
```

もう一つ、エージェントセクションのインターバルの値をデフォルトのファイルから変更することをお勧めします。

```bash
[agent]
    ## Data collection interval for all inputs
    ## Because of migrating from InfluxDB to GridDB, the interval will be set to a enough large number
    ## After all data was migrated, we can terminal the telegraf process
    interval = "10s"
```

このようにする理由は、Telegrafがデータを送信してからインターバルの実行を待つのではなく、最初にインターバルの時間枠が一回実行されるまで、データを送信しないと考えられているからです。

### 実行する

これでようやくすべてを一度に実行できる準備が整いました。

1つのターミナルで influxdb がまだ動作していることを確認し、2つ目のターミナルを開いて telegraf を実行します。

`$ ./telegraf --config griddb.conf`

すべてがうまくいけば、GridDB Cloudにデータが送られ、Telegrafコンソールがデータを出力しているのが見えるはずです。

`2021-12-04T00:12:30Z I! [outputs.griddb] Transaction succeed: 1 containers was updated. 0 containers was error`

下の画像は、ホストマシンから送られてくるCPUのデータをグラフ化したものです。このデータは、単純な7zのCPUベンチマークを実行して得られたものです。もちろん、これは非常に単純な例ですが、他の開発者のみなさんはどのような形のメトリクスを得られるのでしょうか。

線グラフ:

[<img src="https://griddb.net/en/wp-content/uploads/2021/12/CPU_Line.png" alt="" width="1313" height="371" class="aligncenter size-full wp-image-27956" />][12]

棒グラフ:

[<img src="https://griddb.net/en/wp-content/uploads/2021/12/CPU_Bar.png" alt="" width="1313" height="371" class="aligncenter size-full wp-image-27955" />][13]

## まとめ

このように、GridDB クラウドのWeb APIが公開されたことで、より簡単にサービスを利用できるようになりました。また、TelegrafのようなHTTPで通信するサービスも利用できるようになりました。

GridDB クラウドのトライアルをご希望の方は、こちらよりお申し込みください。
<https://www.global.toshiba/jp/products-solutions/ai-iot/griddb/product/griddb-cloud.html>

 [1]: https://griddb.net/ja/blog/an-introduction-to-griddb-cloud/
 [2]: https://github.com/griddb/webapi
 [3]: https://griddb.net/ja/blog/griddb-webapi/
 [4]: https://www.influxdata.com/time-series-platform/telegraf/
 [5]: https://griddb.net/en/wp-content/uploads/2021/12/Screenshot_25-1.png
 [6]: https://griddb.net/en/wp-content/uploads/2021/12/Screenshot_24-1.png
 [7]: https://marketplace.visualstudio.com/items?itemName=humao.rest-client
 [8]: https://www.postman.com/
 [9]: https://go.dev/dl/
 [10]: https://go.dev/doc/install
 [11]: https://docs.influxdata.com/telegraf/v1.19/plugins/
 [12]: https://griddb.net/en/wp-content/uploads/2021/12/CPU_Line.png
 [13]: https://griddb.net/en/wp-content/uploads/2021/12/CPU_Bar.png