IBM Log Analysis with LogDNAで、IBM Cloud Kubernetes Service(IKS)のログを監視・アラート通知する

# はじめに

IBM Cloudでは、IBM Cloud上の各種サービス・アプリケーションのログを収集・保管し、任意の条件で参照したり、特定キーワードが出力された場合にアラート通知するといったロギングサービス「IBM Log Analysis with LogDNA」（以降、LogDNA）を提供しています。

LogDNAは、シリコンバレーのテック企業である[LogDNA社](https://logdna.com/)が提供しているロギングのSaaSで、それをIBM Cloudに組み込んだサービスが「IBM Log Analysis with LogDNA」になります。

そのため、LogDNAはIBM Cloud固有というわけではなく、IBM Cloudと無関係に、LogDNA社と契約すれば利用できることになります。サービスの種別としては、AWSのCloud Watch Logsと同種のものになりますが、クラウドサービス独自のサービスではないという点が異なります。

ログの収集・参照の仕組みをコンテナ・Kubernetesの領域で構築する場合、Elasticsearch、Fluentd、KibanaからなるEFKスタックがよく見られる構成ですが、十分な可用性を持った構成を取る場合、それなりのHWリソースが要求されます。

一方、LogDNAのようなSaaSの場合、追加で必要となるHWリソースはログ送信エージェント分のみであり、サーバの面倒を見る必要もありません。

そのため、ロギングそのものが要件であり、高い可用性を要求されるというものでなければ、SaaSを利用するのもよいかと思います。

当記事では、IKS上のアプリケーションコンテナが出力したログをLogDNAで収集し、特定のキーワードが検出された場合にSlackに通知するという構成を実現してみたいと思います。


# ロギング・インスタンスの作成

まずはロギング・インスタンスを作成します。

IBM Cloudの[ロギングのページ](https://cloud.ibm.com/observe/logging)にアクセスします。
「ロギング・インスタンスの作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/05f5a467-92e0-0d9d-6c45-5b02ce1302e5.png)

次にプランを選択します。
「ライト」プランは無料ではありますが、アラート通知などの機能がないため今回の目的には使えません。
有料の「7日間のログ検索」プランを選択し、「作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/bf0fda69-b08a-a83b-55db-7c0c9e10d958.png)


しばらくすると、以下のようにロギング・インスタンスが作成されます。
次にIKSにLogDNAのエージェントを設定していきます。
以下の画面の「ログ・ソースの編集」リンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/27354985-5ae6-cca5-2e16-93a3631fb768.png)


IKSにエージェントを追加するためのコマンドが2つ表示されています。
これらを順に実行します。
LogDNAのエージェントで使用するSecretと、エージェントのDaemonSet、Podが導入されます。
コマンド実行後、「終了」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/0b0209f1-4068-7932-5b7a-eb67a88fbfcd.png)


LogDNAのダッシュボードを見てみましょう。
「LogDNAの表示」リンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/27354985-5ae6-cca5-2e16-93a3631fb768.png)

ダッシュボードを開くと以下のような画面が表示されます。
エージェントを追加して数分程度しか経っていませんでしたが、既に14,000行近いログが出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/fc5041ed-c2eb-a0dd-7482-3482aa8c4ea0.png)


# アラート通知の設定

ではここから、アラート通知の設定を実施していきます。

アラート通知を仕込む対象は、別記事「[QuarkusアプリをIBM Cloud Kubernetes Service(IKS)で動かしてみる](https://qiita.com/hisato_imanishi/items/94a1a0ddd744423906a8)」で作成したQuarkusアプリにします。

この記事でIKSに載せたアプリを少し改修し、0〜4のランダムな数字を取得し、標準出力にメッセージを出力、および、REST APIのレスポンスに含めるようにします。

```java
@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        Random random = new Random();
        int r = random.nextInt(5);
        System.out.println("random number : " + r);
        return "hello : " + r;
    }
}
```

Quarkusコンテナのログ出力は以下のようになります。
画面上部の赤枠で囲った部分で、参照対象のコンテナを選択することで、そのコンテナが出力したログに絞り込むことができます。
CLIで実行する場合、Podのログを``kubectl logs``でPod単位に参照するか、より便利にするために [stern](https://github.com/wercker/stern) を使うかということになりますが、LogDNAを使うことでGUIで簡単に検索・絞り込みができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/6cae3884-65a0-2be7-46ea-33b6334c8988.png)

今回は、ランダムな数字のうち「4」が出力された場合にSlack通知するようにしてみます。
具体的には、Quarkusのコンテナで、「random number : 4」という文字列が出力された場合にSlack通知します。


Slackアラートの設定を行います。
LogDNAの画面の左側の歯車アイコンをクリックし、「ALERTS」をクリックします。
「Add Preset」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/695b38a1-c09c-caba-f0a0-4ee7d58d90f1.png)


「Slack」をクリックします。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/146dc959-ae93-1c6d-e79c-3624c1b41ea0.png">

ダイアログの上部にアラートの名前を入力します。ここでは Slack Alert とします。
「Send an alert」のチェックボックスで、「At the end of 1 minute」のチェックを外し、「Immediately after 1 line」にチェックを入れます。
これで対象のログが1行出力されれば、即座にアラートが発行されます。
「Webhook URL」に、通知対象のSlackチャンネルのWebhookを設定し、「Save Alert」ボタンをクリックします。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/6a6f67b9-f626-d04d-63d0-25f5ef8234c8.png">


次に、アラートのトリガーの設定をします。
ログ参照のビューで、画面上部で対象のアプリ（コンテナ）を絞り込み、画面下部の検索フィールドでトリガー対象の文字列を設定します。
目的のログに絞り込めていることが確認できたら、画面上部の「Unsaved View」をクリックし、「Save as New View/Alert」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/555230c3-5cf3-a5bb-177f-a77b67be127c.png)

以下の画面が表示されるので、「Name」にビューの名前を、「Alert」に先ほど作成したSlackのアラートを設定し、「Save View」ボタンをクリックします。(スクショの中で、Slack通知の設定が「within 15 minutes」となっており、先ほど設定したものと異なりますが、スクショ取得のタイミングによるもので、先ほど設定した内容が正しいのでこのスクショの「15 minutes」は気にしないでください）
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/d2a1058d-e9ae-15f3-7cac-c161b1fa47d2.png">

ここまででアラート通知の設定が完了しました。

対象のログが出力される処理を実行します。
赤枠で囲った部分の通り、Aug 18 01:09:54 に「random number : 4」を含むログが出力されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/9b741b99-ca4b-b371-3fc6-657ed8e166da.png)

一方Slack側では、同じ内容のログがSlackに対して通知されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/4cf6bcc7-1b6a-774a-fcdd-8d6d1b8c529b.png)


以上のように、アプリケーションで出力されるログを監視し、特定のキーワードが出力されたことをトリガーにして通知を行うという仕組みを非常に簡単に構築することができました。

オンプレミスの環境でここまで構築する場合、HW、SWの導入・設定で一苦労ですが、クラウドのサービスを活用することで数十分あれば整備することができます。これがクラウドのよいところですね。