OCI LoggingとOCI Logging Analyticsを利用したIstioのログ分析

- OCI LoggingによるIstioのアプリケーションログの集約
- サービス・コネクタを利用したOCI Logging Analyticsとの連携
- OCI Application Performance Monitoringと連携した障害解析

# はじめに
Oracle Cloud Infrastructure Logging (OCI Logging) は、様々なログを収集し、保管・検索を実行可能なログの一元管理を実現するマネージド・サービスです。Oracle Container Engine for Kubernetes (OKE) ワーカー・ノードで稼働するアプリケーション・コンテナのログを、カスタム・ログとしてOCI Loggingに集約することができます。また、OCIではクラスタ分析など機械学習を活用した高度なログ分析サービスであるOCI Logging Analyticsも提供されています。

本記事では、IstioのアクセスログをOCI Loggingで収集し、サービス・コネクタで連携したOCI Logging Analyticsで分析出来る環境を構築しました。また、IstioのFault Injectionを行い、前回の記事で構築したOCI APMのエラー検知やOCI Logging Analyticsを利用したログのクラスタ分析を試してみたいと思います。

# 検証環境 
- Kubernetes: 1.22.5
- Istio: 1.13.3

OKEへのIstioのインストールは[前々回の記事](https://qiita.com/orakurara/items/e0ccdcc3a8048e5f3c76)を参照してください。OCI APMの設定は[前回の記事](https://qiita.com/orakurara/items/e3d0954eb83a21fe1d7b)を参照してください。
なお、本記事の検証は管理者ユーザー (Administrators Groupに属したユーザー) で実施しています。Administrators Groupに属したユーザーで実施する場合は、下記のドキュメントに従って必要なポリシーを設定する必要があります。

[Logging　ログおよびログ・グループの作業に必要な権限](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Reference/apmpolicyreference.htm)

[Oracle Logging Analytics　ログ・アナリティクスとそのリソースへのアクセスの有効化](https://docs.oracle.com/ja-jp/iaas/logging-analytics/doc/enable-access-logging-analytics-and-its-resources.html#GUID-378A927B-4559-4863-AF21-BDB7C4278516)

# Envoyアクセスログの有効化
IstioのEnvoyアクセスログを有効化する設定を行います。下記のコマンドを実行します。
なお、この後の操作は全てistio-1.13.3ディレクイトリ下で実施しています。

```shell
$ istioctl install \
> --set meshConfig.accessLogFile=/dev/stdout \
> --set meshConfig.accessLogEncoding=TEXT
This will install the Istio 1.13.3 default profile with ["Istio core" "Istiod" "Ingress gateways"] components into the cluster. Proceed? (y/N) y
✔ Istio core installed                                                                                                                                                                                                    
✔ Istiod installed                                                                                                                                                                                                        
✔ Ingress gateways installed                                                                                                                                                                                              
✔ Installation complete                                                                                                                                                                                                   
Making this installation the default for injection and validation.

Thank you for installing Istio 1.13.  Please take a few minutes to tell us about your install/upgrade experience!  https://forms.gle/pzWZpAvMVBecaQ9h9
```

bookinfoアプリにアクセスした後に、下記のコマンドを実行することで生成されたアクセスログを確認することが出来ます。

```shell
$ kubectl logs -l app=productpage -c istio-proxy 

[2022-04-27T03:22:27.547Z] "GET /reviews/0 HTTP/1.1" 200 - via_upstream - "-" 0 295 4 4 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36" "1a37ab7a-9e7d-43f7-a30a-0914d743191c" "reviews:9080" "10.244.0.11:9080" outbound|9080||reviews.default.svc.cluster.local 10.244.0.12:49226 10.96.188.147:9080 10.244.0.12:38134 - default
[2022-04-27T03:22:27.538Z] "GET /productpage HTTP/1.1" 200 - via_upstream - "-" 0 4123 15 14 "10.244.0.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36" "1a37ab7a-9e7d-43f7-a30a-0914d743191c" "132.226.11.70" "10.244.0.12:9080" inbound|9080|| 127.0.0.6:56503 10.244.0.12:9080 10.244.0.1:0 outbound_.9080_._.productpage.default.svc.cluster.local default
[2022-04-27T03:22:27.786Z] "GET /details/0 HTTP/1.1" 200 - via_upstream - "-" 0 178 1 1 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36" "6c1d1d28-8d7a-468f-90d0-dfea459bc75d" "details:9080" "10.244.0.8:9080" outbound|9080||details.default.svc.cluster.local 10.244.0.12:39002 10.96.28.253:9080 10.244.0.12:51258 - default

```

# OCI LoggingとOCI Logging Analyticsの設定

### 動的グループとポリシーの設定
OCIサービスコンソールの左上のメニュー**アイデンティティとセキュリティ**より、アイデンティティの**コンパートメント**を選択し、OCI Loggingでログ収集の対象となるリソースが存在するコンパートメントのOCIDを確認し、メモしておきます。

![Fig50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/1ec741e4-1295-8fdf-77f0-83f26a0a9c57.png)
![Fig51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/b680db80-bbcf-ad71-b5ad-3523311dfc27.png)


OCIサービスコンソールの左上のメニュー**アイデンティティとセキュリティ**より、アイデンティティの**動的グループ**を選択し、動的グループを作成します。

![Fig52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/3cde2872-79d7-a879-788f-d91a960f0251.png)
![Fig53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/1ab1998a-bfd0-3088-84ab-6319e1c91686.png)


下記の様に各項目を入力し **作成**ボタンを押します。

---
* 名前: 任意の名前　logging-dynamic-group
* 説明: 任意　logging-dynamic-group
* 一致ルール: instance.compartment.id = 'ログ収集の対象となるリソースが存在するコンパートメントのOCID'

---

![Fig54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/384d474b-5658-8d73-4702-6bebc9110787.png)


次に作成した動的グループに対してポリシーを作成します。OCIサービスコンソールの左上のメニュー**アイデンティティとセキュリティ**より、アイデンティティの**ポリシー**を選択し、ポリシーを作成します。

![Fig55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/c1b1ff5c-3d17-26ae-7c0d-334329c63c60.png)


下記の様に各項目を入力し **作成**ボタンを押します。

---
* 名前: 任意の名前　logging
* 説明: 任意　logging
* コンパートメントの選択: 任意のコンパートメント名　 dev
* ポリシー・ビルダー（手動エディタで入力）: allow dynamic-group logging-dynamic-group to use log-content in compartment dev

---

![Fig56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/60382f46-3fa5-1dc3-6bc7-8a350f4b88f4.png)



### OCI Loggingを利用したEnvoyアクセスログの収集
OKE上で稼働するbookinfoアプリケーションのEnvoyアクセスログを収集するようにOCI Loggingの設定を行っていきます。
OCIサービスコンソールの左上のメニュー**監視および管理**より、ロギングの**ログ・グループ**を選択し、収集されたログの保存先となるログ・グループを作成します。OCI Loggingのログ・グループ管理画面でコンパートメントを選択し、**ログ・グループの作成**ボタンを押します。

![Fig57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/8fddf277-93d2-38bf-dc15-a0dbee1e9975.png)
![Fig58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/76601b8e-4a45-71ec-bdfd-c425e53ab818.png)



下記の様に各項目を入力し**作成**ボタンを押します。

---
* 名前: 任意の名前　Istio_OKE
* 説明: 任意　Istio_OKE

---

![Fig59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/9b93a983-8d8f-6b85-0eda-fc14e0d8548b.png)


作成したログ・グループ左下のメニューより**ログ**を選択し、**カスタム・ログの作成**ボタンを押し収集するカスタム・ログの設定を行います。
下記の様に入力し、**カスタム・ログの作成**ボタンを押します。

---
* 名前: 任意の名前　OKE_Logs
* コンパートメント: 任意のコンパートメント名　 dev
* ロググループ: 先に作成しておいたログ・グループ名 Istio_OKE

---

![Fig60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/46558ac8-8857-7d69-ffe8-b478e932ae27.png)
![Fig61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/4bab421a-5600-bdd2-3104-651459d055d9.png)


続いてエージェント構成の作成ウィザードに遷移するので、**新規構成の作成**を選択し、下記の様に各項目を入力します。
全て入力したら**カスタム・ログの作成**ボタンを押します。

---
* 名前: 任意の名前　worker_node
* 説明: 任意の説明 worker_node
* コンパートメント: 任意のコンパートメント名　 dev
* ホスト・グループ グループタイプ: 動的グループ
* ホスト・グループ グループ：: 先に作成しておいた動的グループ名 logging_dynamic-group
* エージェント構成 入力タイプ: ログ・パス
* エージェント構成 名前の入力: 任意の名前 Istio_OKE
* ファイル・パス: /var/log/containers/*

---

![Fig62.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/58782d6e-3d3f-6b7e-864e-2654aa5fc569.png)


カスタム・ログが追加され、アクティブになってから暫く時間がたつと**ログ・グループの探索**の画面よりログが収集されてくる様子を観察することが出来るようになります。


![Fig63.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/642b240e-de7a-4e34-f626-7fdfd4e96c87.png)
![Fig64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/845d197f-be38-4389-c8bd-bb152d1fac69.png)


また、OCI Loggingの検索画面よりログの検索やログの詳細について確認することが出来ます。

![Fig65.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/7bd08242-7464-24db-d81e-fe579709921b.png)


### サービス・コネクタを利用したOCI LoggingとOCI Logging Analyticsの連携
OCI Loggingが収集してきたログをOCI Logging Analyticsに連携して分析できるようにサービス・コネクタの設定を行います。
はじめに連携先となるOCI Logging Analyticsのログ・グループを作成します。OCIサービスコンソールの左上のメニュー**監視および管理**より、ログ・アナリティックスの**管理**を選択し、管理画面よりログ・グループを作成するコンパートメントを選択し、**ログ・グループの作成**を選択します。

![Fig67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/f0c28fae-f446-b4c6-5ef0-b018d4ff7ff9.png)
![Fig68.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/d2f475dd-251c-259c-c038-aa3935d7c317.png)


下記の様に各項目を入力し、**作成**ボタンを押します。

---
* 名前: 任意の名前　Istio_OKE_Logs

---

![Fig69.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/7efed517-08bb-ba1c-b9e0-c9e2cb7cc085.png)


OCI Logging Analyticsのログ・グループが作成されました。

![Fig70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/1760583e-638b-bc0d-cd94-622c970c67e7.png)


続いて、OCI Loggingのサービス・コネクタを作成します。
OCIサービスコンソールの左上のメニュー**監視および管理**より、ロギングの**サービス・コネクタ**を選択し、管理画面よりサービス・コネクタを作成するコンパートメントを選択し、**サービス・コネクタの作成**を選択します。

![Fig71.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/5f72d3c1-d64c-e2b4-ebf5-26ec00350ce4.png)
![Fig72.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/103e5a39-40d4-408e-26f6-df27161ac954.png)


サービス・コネクタの作成ウィザードに遷移するので、下記の様に各項目を入力します。

---
* コネクタ名: 任意の名前　Istio_OKE_Connector
* 説明: 任意の説明 Istio_OKE_Connector
* リソース・コンパートメント: 任意のコンパートメント名　 dev
* サービス・コネクタの構成 ソース: ロギング
* サービス・コネクタの構成 ターゲット: ログ・アナリティクス
* ソースの構成 コンパートメント名: OCI Loggingのログ・グループのコンパートメント dev
* ソースの構成 ログ・グループ: 事前に構成済のOCI Loggingのログ・グループ名 Istio_OKE
* ソースの構成 ログ: 事前に構成済のOCI Loggingのカスタム・ログ名  OKE_Logs
* ソースの構成 コンパートメント名: OCI Log Analyticsのログ・グループのコンパートメント dev
* ソースの構成 ログ・グループ: 事前に構成済のOCI Log Analyticsのログ・グループ名 Istio_OKE_Logs

---

![Fig73.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a04f816f-ac5e-0f7a-b2e0-ad7b89593363.png)
![Fig74.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/485efda8-274c-9ff5-f1cb-cfa5cd87a134.png)
![Fig75.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/398ccbfe-1fe2-23f9-600f-a34c660470bc.png)


ウィザード画面下部にポリシー作成のメッセージが表示されるので**作成**を押します。最後にウィザード左下の**作成**を押してサービス・コネクタの構成は完了です。

![Fig76.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a7d2ffe6-78b3-a371-c0a7-ff8c9262e929.png)

![Fig77.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/85cca786-964a-9e1b-9e05-192e95befeec.png)


OCI Log Analyticsのログ・グループにログが転送されているか確認してみたいと思います。OCIサービスコンソールの左上のメニュー**監視および管理**より、ログ・アナリティックスの**ログ・エクスプローラー**を選択します。

![Fig78.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/4fd46f9d-1948-c2f6-8129-37de14dede55.png)
![Fig79.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/bade6474-ace6-b4fe-d0c7-5cad46ee2711.png)


606レコードのログがOCI Log Analyticsから確認できます。ログを時系列で確認したりより見やすくするには**ビジュアライゼーション**から表示形式を変更できます。例えば、下記を選択すると時系列のヒストグラムとログの詳細を確認することが出来ます。

![Fig80.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/8189ac1f-f02b-faff-08f8-b035798263af.png)
![Fig81.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/08948bf7-3cc5-4fb0-36fd-d0a6cbdf706d.png)


他にも分析の**クラスタ**を選択すると、クラスタリングされて大量のログデータを類似するグループに自動的に分割することができます。こうすることで大量のログに埋もれてしまったメッセージを確認することが容易になります。

![Fig82.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/4016e4c3-b3de-a305-5453-aa19e61c1168.png)
![Fig83.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/8e0b9a66-e8e1-4fdc-a63c-bbb4b4188794.png)



# IstioのFault Injection
Istioでは、リクエストタイムアウト、Fault Injection、サーキット・ブレーカを構成することができ、アプリケーションのコードを変更することなく様々な障害をシミュレートしたテストを実施することが出来ます。本記事ではサンプルとして用意されているユーザーjasonからのトラフィックを遅延させFault Injectionルールを適用して、障害の様子をOCI APMやOCI Logging Analyticsで確認したいと思います。適用するFault Injectionは下記で、ユーザーjasonのratingサービスの間のトラフィックに7秒の遅延を発生させます。

``` virtual-service-ratings-test-delay.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    fault:
      delay:
        percentage:
          value: 100.0
        fixedDelay: 7s
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1

```

istio-1.13.3ディレクイトリ下で下記のコマンドを実行することでFault Injectionが適用されます。

```shell
$ kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml

virtualservice.networking.istio.io/ratings created

```

bookinfoアプリケーションにアクセスするとRating機能が使えなくなっています。

![Fig86.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/e9eeaf6f-d99c-abe0-fe01-08bc8e17df47.png)


OCI APMのトレースでエラーの発生箇所が、スパンの詳細で503エラーが発生していることが確認できます。

![Fig87.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/465efae5-439d-f56f-35ab-43cd6e58d882.png)
![Fig88.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/65e77c04-f64d-5afb-8ae0-36b726626ebe.png)


さらに、OCI Log Analyticsのクラスタ分析機能を活用して障害に該当するコンテナのエラーログを特定することが出来ました。

![Fig90.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/d6a847ce-2bdf-3bae-9c7c-0c392ea342fa.png)
![Fig91.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/4b4797bc-9cae-eb46-763b-77c5cdacf91a.png)


# 最後に
IstioのEnvoyアクセスログを取得し、OCI Loggingで収集、OCI Logging Analyticsで分析することが出来ました。特にOCI Logging Analyticsは大量のログを自動分類してくれるクラスタ分析機能と、グループ分けされたログを時系列のヒストグラムで表示させることが容易にできることがとても便利でした。今回試すことが出来ませんでしたが他のログを集約して一度に分析することで問題箇所の切分けに活用できそうです。

# 参考情報
[Oracle Cloud Infrastructureドキュメント　例: OKEへのIstioサービス メッシュのインストール](https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengistio-intro-topic.htm#managing_traffic)

[Oracle Cloud Infrastructureドキュメント Logging](https://docs.oracle.com/ja-jp/iaas/Content/Logging/home.htm)

[Oracle Cloud Infrastructureドキュメント Oracle Cloud Logging Analytics](https://docs.oracle.com/ja-jp/iaas/Content/Logging/home.htm)

[OCIチュートリアル Oracle Container Engine for Kubernetes(OKE)でサンプルマイクロサービスアプリケーションをデプロイしてオブザバビリティツールを利用してみよう](https://oracle-japan.github.io/ocitutorials/cloud-native/oke-for-advances/)

[Cloud Native Developers JP - ハンズオンチュートリアル　Kubernetesにおけるログの収集](https://cndjp.github.io/tutorials/documents/kubernetes-basics/logging/)