Alibaba Cloud とDatadog の監視ログ連携


DatadogはSaaS型監視のクラウドサービスで、モニタリング機能だけでなく、タグ分析、Slack等の外部連携、ログ管理機能等、豊富な機能が利用できます。ここでは、Alibaba Cloud の監視運用のため、Datadog との連携方法についてご紹介します。

## なぜSaaS型監視サービスを使うか

Alibaba Cloud には、CloudMonitor やLog service 等、監視やログ管理の機能が標準であります。
これらは強力なツールですが、すでにAWS等の既存クラウドの監視でDatadog を利用している現場では、Alibaba Cloud の監視も一元化したいというニーズがあると思います。
このようなハイブリッド環境の監視では、Datadog に限らずSaaS型監視サービスの利用は効果的です。


## やりたいこと

- Alibaba Cloud ECS仮想サーバのリソースモニタリングをDatadog で確認したい
- Alibaba Cloud の各種ログを`Datadog logs Management`で確認したい
- Alibaba Cloud のクラウドサービスのリソースモニタリングをDatadog で確認したい



## Datadogと連携する基本構成

Datadog と連携するにあたっての基本構成です。
ECSに導入したDatadog Agent内のフォワーダー機能がDatadogとのデータ連携を担当するため、Datadogのグラフ機能は簡単に使えます。

![基本構成.png](https://qiita-image-store.s3.amazonaws.com/0/257099/5daf544f-49fd-99e7-b6cf-63305fb73ef9.png)

### 設定とグラフ表示の例（ECS仮想サーバのリソースモニタリング）

Datadogにログイン後、自身のアカウントのAPIキーを確認する：
>Datadogサイドメニューの`Integrations` > `APIs` 参照

Datadog Agent を導入する（Linuxの場合）：
>`DD_API_KEY=[確認したAPIキー] bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/datadog-agent/master/cmd/agent/install_script.sh)"`

導入エージェントのバージョンやステータスを確認する：

>`datadog-agent version`
>>コマンド結果例：　※Agentのバージョンは6以上を推奨
>>`Agent 6.2.1 - Commit: b644e5c - Serialization version: 4.7`

>`datadog-agent status`
>>エージェントに含まれる機能の詳細が表示される（後述のエージェントに設定する値も表示可能）

Datadog Dashboard でECS仮想サーバのリソースグラフを確認する（グラフ表示まで数分かかる）：
>![Datadogグラフ例.png](https://qiita-image-store.s3.amazonaws.com/0/257099/5bcf9ac2-1b05-0ca0-c31a-7d7c7a881b9a.png)



## Alibaba Cloud の標準機能とすみ分けたログ管理構成

### Datadog log Management 概要（2018年6月時点）

次はAlibaba Cloud 上の各種ログを`Datadog log Management` でモニタリングします。
Datadogの本機能は、2018年3月にGAとなった新機能で、6月時点で下記ログソースを管理することが可能です。

![log_サーバ連携.png](https://qiita-image-store.s3.amazonaws.com/0/257099/833b2508-e26d-57ce-01c4-d00d6cad03d0.png)

また、サーバ以外にもコンテナ、クラウド等のログソースを管理できます。

![log_その他連携.png](https://qiita-image-store.s3.amazonaws.com/0/257099/f53dc476-186d-073b-0693-136bc7630535.png)


ご参考ですが、クラウドはAWSしか対応していません。（Azure,GCPの拡張を予定しているようですが、Alibaba Cloud はまだ含まれていませんでした）
また、Datadog のマニュアル上、AWSとのログソース連携は、サーバレスの`Lambda function` による実装が記載されています。
当然ながらクラウド基盤にDatadog Agent は導入できないため、この実装方式は他のクラウドにおいても同様になることが予想されます。Alibaba Cloud だとサーバレス実装は`Function Compute` ですが、残念ながら国内向けではまだ使えないようです。

### ログ管理連携の構成

Datadog Agent のログ管理パラメータを有効化することで、基本構成でDatadog へのログ転送が可能になりますが、Alibaba Cloud の標準機能とのすみ分けが必要です。

具体的には、Alibaba Cloud の`Log service` の運用を考慮する必要があります。
`Log service` には、`Loghub` というログコレクション機能があり、ここにログを収集することで、他のL`og service`機能（`Log shipper`、`Log Search`等のデータストア転送・分析）が利用できます。

また、収集可能なログも今後拡張し、Alibaba Cloud製品のログも対応してくようです。[公式ドキュメント](https://jp.alibabacloud.com/help/doc-detail/28981.htm?spm=a21mg.p38356.b99.26.39597adfQAxYdi)では下記ログの収集に対応するとのことです。

>Alibabaクラウド製品
>>ECSログ：Logtailによって収集
>>Alibabaクラウドコンテナサービス
>>メッセージと通知サービス（MNS）ログ
>>近日公開予定：OSS、CDN、API Gateway

上記の通り、Alibaba Cloud 内のログは`Log service` に収集することができるため、Datadog への転送・モニタリングは下記構成が考えられます。（リアルタイム性は落ちますが）

- ログの収集、ログ保管の一元管理は`Log Service` が担当
- ECS仮想サーバを中継用に1台たて`OSS` からDatadogと連携したいログを抽出
- ECS仮想サーバのDatadog AgentがDatadog に転送

![log_中継サーバ.png](https://qiita-image-store.s3.amazonaws.com/0/257099/07f5ceb8-fd29-c891-dbfe-738624d9d8e4.png)

もちろん前述の基本構成で、各サーバのログを直接Datadog に送信する方が、リアルタイム・モニタリング目的には合致しますし、中継サーバもサーバレス化が望ましいのですが、ログの長期保管はDatadog の管理外であることも踏まえ、OSSからのデータ取得を想定した中継サーバ構成を検証してみます。

### 設定とグラフ表示の例（各種ログをDatadog log Managementで確認）

ここでは例として、ECS仮想サーバのNGINXログ（access_log）をLog Serviceに転送し、OSSに保管されたログを中継サーバで取得します。取得したログはDatadog AgentでDatadogに転送します。

NGINXログをLog service経由でOSSに保管する：
>転送対象ログ `/var/log/nginx/access.log`
>転送先OSS `oss://dev01-nginx/xxx`
>※Log service の設定およびOSSへの転送保管は、[こちらの記事](https://qiita.com/deadcheat/items/c3b474590501d9aeb978)を参考にさせて頂きました。
>　LogShipperの転送機能は、サーバ生ログがそのまま転送するのではないため、各種ログは、圧縮要否・JSON方式（CSV等もあり）・ファイルリネーム等の設定の影響をうけます。（ここでは圧縮なし・JSON方式を選択しています）

ECS中継サーバからOSSに保管されたNGINXログを取得する１（aliyunclコマンドの失敗）：

>`aliyuncli oss GetAllBuckets`　※OSSとの疎通確認用
>>出力結果例

>>```
OSS operation in aliyuncli is not supported.
Please use 'ossutil' command line tool for Alibaba Cloud OSS operation.
You can find information about 'ossutil' here: https://github.com/aliyun/ossutil.
```

>※aliyuncliのOSSコマンドを利用してみたのですが、上記メッセージが出力されたのでossutilを設定することにしました。

ECS中継サーバからOSSに保管されたNGINXログを取得する２（ossutilの設定）：
>ossutil はgit および go が必要なため事前に導入が必要です。

>`ossutil ls`　※OSSとの疎通確認用
>>出力結果例

>>```
CreationTime                                 Region    StorageClass    BucketName
2018-05-13 16:43:31 +0800 CST    oss-ap-northeast-1        Standard    oss://dev01-nginx
Bucket Number is: 1
0.012950(s) el

>`ossutil cp oss://dev01-nginx/* /datadog_log/nginx/`
>>準備ができたので中継サーバにOSSのログを取得します。
>>ここでは、ログ取得後、`/datadog_log/nginx/access.log` に移動・ファイルリネームをしています。

　[参考：ossutilコマンド](https://jp.alibabacloud.com/help/doc-detail/50452.htm)

ECS中継サーバのDatadog AgentのConfigを設定する：

>`vim /etc/datadog-agent/datadog.yaml`　※datadog log management 有効化
>>設定値（false⇒trueに変更）
>>`logs_enabled: true`

> `vim /etc/datadog-agent/conf.d/python.d/conf.yaml`　※python.dディレクトリ作成およびconf.yamlファイルを作成します。
>※ここでは、ログはLog serviceを経由したことによりJSON方式になっているため、Datadogカスタムログ形式で転送します。
>>設定値

>>```
logs:
  - type: file
    path: /datadog_log/nginx/access.log
    service: myapp1
    source: python
```


>`systemctl restart datadog-agent`　※エージェント再起動
>`datadog-agent status`
>>出力結果例（一部）：

>>```
==========
Logs Agent
==========
  python
  　Type: file
  　Path: /datadog_log/nginx/access.log
  　Status: OK
  　Inputs: /datadog_log/nginx/access.log
```

Datadog log Explorerの表示を確認する（表示まで数分かかる）：
>![log_datadog_json.png](https://qiita-image-store.s3.amazonaws.com/0/257099/0b5ccd32-6a48-4cfa-c6aa-8733b63aedb2.png)




## Alibaba Cloud クラウドサービスのメトリック情報連携構成

最後にクラウドサービスのメトリック情報（性能情報等）の連携を検討してみましたが、現状では独自プログラミングが必要になり、シンプルにはいけませんでした。特にDatadogは`Integration` というAPIに対するクローラ機能があり、いずれPULL型のこちらがDatadog から提供される可能性もあります。

ただ、`CloudMonitor` のアラームサービスを使って、閾値超過した時点でDatadogに[メールによるイベント情報の送信
](https://docs.datadoghq.com/ja/guides/eventsemail/)することが可能です。


現状では独自プログラミングを避け、Datadog イベントでの検知/通知、内容は`CloudMonitor` 画面で確認することがシンプルかと思いますので、上記を踏まえ、Datadog Integration やAlibaba Cloud の`Functional Compute` が整備されるまでは下記のような構成案を検討します。（本項では図中の`DogStasD` を用いる独自プログラミングについては割愛しています）

### メトリック情報の送信構成

![metric_連携.png](https://qiita-image-store.s3.amazonaws.com/0/257099/2ff3716e-e312-36a0-e9a0-d201ae5b6c92.png)

### 設定とDatadog での表示例

ここでは例として、`ApsarraDB for RDS` のディスク使用率が閾値超過した場合、Datadog のEvents にアラーム通知メールの内容を表示させてみます。

Datadog のアラームメール受信用Emailを作成する：
>- Datadogサイドメニュー の `Integrations` > `APIs` の`Events API Emails` 画面を表示する
>- `Format: Plain text` を選択し、`Create API Email` ボタンをクリックする
>- 作成されたEmailアドレスをメモする

`CloudMonitor` のアラーム送信先を設定する：
>- `CloudMonitor` 管理コンソールサイドメニューの`アラームサービス` > `アラーム送信先`をクリックする
>- `アラーム送信先`タブの`送信先を作成` ボタンをクリックし、先ほどのDatadog Emailアドレスを記載する
>- `認証コードの送信` ボタンをクリックすると、受信側DatadogのEvents に「`Your check code is xxxxxxx`」を含むイベントが表示されるので、この情報を`CloudMonitor` の`認証コード入力欄` に記載し保存する
>- `アラーム送信先グループ` タブの任意のグループ（`デフォルトグループ`等）に既存の送信先ボックスに表示されているDatadogのアラーム送信先を追加する

`ApsaraDB for RDS` の監視設定を行う：
>- `CloudMonitor` 管理コンソールサイドメニューの`クラウドサービスモニタリング` > `ApsaraDB for RDS` をクリックする
>- 監視対象のRDSをクリックし、検証用にディスク使用率の`アラームルール`を、「`閾値0%・アラーム再試行回数：1`」に変更する
>- `アラーム送信先`欄の`メール件名`と`備考`（本文に相当）に閾値超過を示す任意の文字を入力する。

Datadog Eventsに通知されたメール情報を確認する（監視間隔は5分のため5分後）：

>`CloudMonitor` がHTMLメールで、TEXT/JSON表示のメールのみ対応している`Datadog API Email` ではわかりにくいため、現状ではタイトルを工夫する必要があります。

>![ddevents_cloudmonitor.png](https://qiita-image-store.s3.amazonaws.com/0/257099/02f018cc-9966-ea03-fa05-154280d8d585.png)
>

## おわりに

ここまでお読みいただきありがとうございました。

Alibaba Cloud とDatadog と連携について、基本構成、ログ管理構成、クラウドサービスメトリック監視の3つの観点で検証してみました。

Datadogハイブリッド監視の現場で、Alibaba Cloud を加える運用において、ご参考になれば幸いです。