# Root Cause Analysis In Microservice Using Neural Granger Causal Discovery > [!abstract] 概要 > 近年、マイクロサービスは、拡張性、保守性、柔軟性を備えることからIT運用で広く採用されている。しかし、システムに不具合が発生したとき、マイクロサービス間の複雑な関係のため、サイト信頼性エンジニア(SRE)が根本原因を特定することは難しい。従来研究では、構造学習手法(例えばPCアルゴリズム)を使って因果関係を構築し、因果グラフから根本原因を導出していた。それらは時系列データの時間順序を無視し、時間関係に含まれる豊富な情報を利用できていない。例えば、CPU使用率の急上昇が他のマイクロサービスのレイテンシ増加を引き起こす場合、CPU使用率の異常はレイテンシ増加と同時ではなく、その前に起こる。そのためPCアルゴリズムは、このような特徴を捉えられない。これらの課題に対処するため、対照学習を用いたニューラル・グレンジャー因果発見による根本原因分析手法RUNを提案する。RUNは、時系列から文脈情報を統合してバックボーンエンコーダを強化し、時系列予測モデルを使ってニューラル・グレンジャー因果発見を行う。さらに、パーソナライズベクトルを伴うPageRankを組み込み、上位k個の根本原因を効率的に推薦する。合成データセットと実世界のマイクロサービスベースデータセットを使った大規模な実験により、RUNが最先端の根本原因分析手法を明確に上回ることを示す。加えて、マイクロサービスベースアプリケーションにおけるRUNの実用性と有効性を示すため、sock-shopの分析シナリオを提供する。コードは`https://github.com/zmlin1998/RUN`で公開されている。 ## 論文情報 - タイトル: Root Cause Analysis In Microservice Using Neural Granger Causal Discovery - 著者: Cheng-Ming Lin, Ching Chang, Wei-Yao Wang, Kuang-Da Wang, Wen-Chih Peng - 所属: National Yang Ming Chiao Tung University - 媒体: The Thirty-Eighth AAAI Conference on Artificial Intelligence(AAAI-24) - 発表年: 2024 - arXiv: [2402.01140](https://arxiv.org/abs/2402.01140) - コード: [RUN](https://github.com/zmlin1998/RUN) ## 概要 RUNは、異常なKPIを「トリガーポイント」とし、複数KPIの多変量時系列から時間的な先行関係を含む因果グラフを学習して、トリガーの根本原因を順位付けする。時系列の異なる文脈を取り込む負例なし対照学習、ターゲット系列ごとのニューラル予測器、学習された因果注意行列、パーソナライズPageRankを一つのパイプラインに組み合わせる。 従来のPCアルゴリズムや相関ベースの手法は、同時相関と時間的な先行関係を十分に区別できない。RUNは、ある系列を予測入力から外したときの予測性能低下を利用するニューラル・グレンジャー因果発見により、`X_i`の過去が`X_j`の未来の予測に寄与するかを学習する。sock-shopではCPU hogとmemory leakを含む根本原因シナリオで評価し、合成データでは原因ノード数を変えて比較する。 ## 問題設定 ### 背景と研究課題 マイクロサービスはサービスごとの独立スケール、保守・テスト・デプロイの容易さを提供する一方、1つの異常がサービス間依存を通じてドミノ状に伝播し、最終的にシステム障害になる。監視システムが記録するのは各KPIの運用値であり、KPI間の関係そのものではない。異常KPIを検知した後、SREはKPI間の構造を推定して原因を探す必要がある。 論文の中心的な問いは、次の3点に分けられる。 - KPI間の因果構造を学習するとき、従来の構造学習より時系列の時間順序を有効に使えるか。 - 多周期性を持つ現実の時系列で、誤った負例を使わずに文脈情報を学習することで根本原因箇所特定を改善できるか。 - 学習した因果グラフから、トリガーポイントに影響する根本原因を効率よく上位k件へ絞れるか。 例えばCPU使用率の急上昇がレイテンシ増加に先行する場合、両者は同時点ではなく時間差を持つ。PCアルゴリズムの条件付き独立性検定だけでは、この先行関係を十分に表せない。RUNは、観測対象をKPIの多変量時系列とし、異常検知器が発したトリガーポイントを説明する原因KPIを出力する。 ![因果構造発見に基づくRCAの例(原本 Figure 1)](wiki/sources/_attachments/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery/fig-image-001-001.png) 原本の図表IDは`Figure 1`である。 ### 前提と用語 多変量時系列を`X=[X_1,X_2,...,X_N]`とする。`X_i=[x^1_i,x^2_i,...,x^T_i]`は特徴量またはKPI`i`の長さ`T`の系列であり、`X∈R^{N×T}`である。推定因果グラフを`Ĝ={V,E}`とし、ノード集合`V`は各系列、エッジ`X_i→X_j`は`X_i`がグレンジャーの意味で`X_j`を予測する情報を持つことを表す。目的は、トリガーポイントへ至る根本原因系列`X_culprit`を特定することである。 ここでいうグレンジャー因果性は、予測可能性の増分に基づく時間的関係であり、介入による因果効果を直接測定するものではない。RUNは、監視データから得られる時系列の予測関係を根本原因候補の順位付けに利用する。 ## 提案手法 ### 全体構成 RUNは、(1)事前学習、(2)ニューラル・グレンジャー因果発見、(3)診断の3段階で構成される。事前学習では、同じタイムスタンプを共有しつつ異なる文脈を持つ時系列部分の表現を近づけ、予測器のバックボーンを強化する。因果発見では、各ターゲット系列を予測する独立ニューラルネットワークの学習可能な注意行列からグラフを作り、閾値処理と循環除去でDAGにする。診断では、トリガーポイントを起点とするパーソナライズPageRankで候補をランキングする。 ![RUNの3段階パイプライン(原本 Figure 4)](wiki/sources/_attachments/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery/fig-image-003-001.png) 原本の図表IDは`Figure 4`である。 ### 事前学習:文脈を使う負例なし対照学習 #### 多周期性による負例の問題 現実の時系列には日周期、週周期、季節周期など複数の周期性がある。例えば、気温は毎日正午に上がり、都市の人流は週末に増え、電力消費は毎年夏に増加する。異なるタイムスタンプを無条件に負例とすると、実際には同じ周期的位置にあり意味が似ている点を引き離してしまう。図3は、周期的な時系列でこの誤った負例選択が起きる例を示す。 ![異なる文脈を持つ同一タイムスタンプ(原本 Figure 2)](wiki/sources/_attachments/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery/fig-image-002-001.png) ![周期性により誤った負例が選ばれる例(原本 Figure 3)](wiki/sources/_attachments/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery/fig-image-002-002.png) 原本の図表IDは`Figure 2`と`Figure 3`である。 RUNは、異なるタイムスタンプを負例として明示的に使わず、同じタイムスタンプに対応する異なる文脈だけを正例とする。これにより、誤った負例から周期的に類似した表現を分離する情報が学習へ入ることを防ぐ。 #### ランダムクロップと損失 長さ`T`の時系列から、重なりを持つ2つの時間区間をランダムに切り出す。 `y_1=[a_1,b_1]`, `y_2=[a_2,b_2]`, `0<a_1≤a_2≤b_1≤b_2≤T` 2つのビューをバックボーンエンコーダ`f`と射影器`g`へ入力し、`z_1=g(f(y_1))`、`p_2=f(y_2)`などの表現を作る。SimSiamの考え方に従い、停止勾配`stopgrad`を片側に適用しながら、同一タイムスタンプの2文脈の表現を一致させる。対照損失は次式である。 `L_con = -1/2 [cos(z_1, stopgrad(p_2)) + cos(stopgrad(p_1), z_2)]` この設計では、通常の対照学習のように大量の明示的負例を必要としない。事前学習済みバックボーンは、局所的な値だけでなく、その値が現れる時間的文脈を含む表現を生成する。 ### ニューラル・グレンジャー因果発見 #### 因果注意行列と予測器 RUNは、`N×N`の因果注意行列`G={α_ij | 0≤α_ij≤1}`を学習する。`α_ij`は、系列`X_i`からターゲット系列`X_j`への入力寄与を表す学習可能パラメータである。ターゲット系列ごとに独立したニューラルネットワーク`f_{θ_j}`を用意し、過去`w`時点の全系列を、それぞれの注意重みでスケールして次時点を予測する。 ![各時系列を独立ネットワークで予測する構成(原本 Figure 5)](wiki/sources/_attachments/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery/fig-image-004-001.png) 原本の図表IDは`Figure 5`である。 ターゲット`X_j`の時刻`t`における予測は概念的に次のように表される。 `x̂^j_t = f_{θ_j}(x^1_{t-w:t-1}⊙α_{1j}, ..., x^N_{t-w:t-1}⊙α_{Nj})` 各`f_{θ_j}`は同じ構造を持つが、予測対象が異なるためパラメータは独立である。入力系列`X_i`の過去を使わなくても`X_j`を予測できるなら、対応する`α_ij`は小さくなる。逆に、`X_i`を使うと予測誤差が下がる関係は大きな注意重みとして残り、`X_i→X_j`のグレンジャー因果候補となる。 予測器は平均二乗誤差を最小化する。論文では、ウィンドウ以降の時点と全ターゲット系列にわたる予測誤差を正規化した損失として定義している。 `L_MSE ∝ Σ_{t=w+1}^T Σ_{j=1}^N (x^j_t-x̂^j_t)^2` #### グラフ化と循環除去 注意重みを閾値`H`で二値化する。 `g̃_ij = 1 if α_ij>H, otherwise 0` `g̃_ij=1`なら系列`X_i`から`X_j`へエッジを張る。ただし、因果グラフは循環を含まないDAGである必要があるため、閾値処理直後のグラフに循環があれば剪定する。RUNは、接続されたノード間のPearson相関を各エッジの類似度として計算し、類似度が最も低いエッジを反復的に削除して、最終DAG`Ĝ`を得る。 この処理は、学習された注意重みをそのまま因果関係とみなすのではなく、グラフ構造上許されない循環を除き、解釈可能な有向非巡回グラフへ変換する段階である。 ### 診断:パーソナライズPageRank 因果グラフから根本原因を取り出すため、RUNはGrootRankに倣って、ノード重みを持つPageRankを使う。観察として、出次数を持たないdangling nodeは、他ノードへ影響を与える末端原因になりやすい。そこで、dangling nodeのパーソナライズ値を`P_d=1`、それ以外のノードを`P_n=0.5`として、PageRankのパーソナライズベクトルを構成する。 トリガーポイントへ向かう影響を根本原因側へ伝播させるため、ケーススタディでは因果グラフの各エッジを反転してPageRankを実行する。得られたPageRank値の高いノードを、上位k個の根本原因候補として出力する。 PageRankが同点になった場合は、トリガーポイントから候補変数までのaccess distance(AD)で解決する。RUNでは、トリガーから候補までの距離`D`が到達可能なら`AD=D`、到達不能なら`AD=0`とする。GrootRankが到達不能ノードを無限大として短い距離を優先するのに対し、RUNは、dangling nodeが根本原因になりやすいという観察と整合させるため、到達不能ノードを0とし、より大きい到達可能距離を優先する。 ## 新規性 RUNは、マイクロサービスの根本原因分析における3つの不足をまとめて扱う。第一に、PCアルゴリズムのような構造学習をそのまま時系列へ適用するのではなく、過去系列による未来予測の改善を使って時間的な先行関係を学習する。第二に、多周期性の時系列に対して、異なるタイムスタンプを誤った負例にしない正例のみの対照学習を提案する。第三に、学習したグラフ全体の中心性ではなく、dangling nodeを重視するパーソナライズPageRankでトリガーに関係する候補を絞る。 従来のϵ-Diagnosisは正常期と異常期の系列類似度、AutoMAPは適応PCアルゴリズムとランダムウォーク、RCD/Ψ-PCは介入と局所階層学習、CausalRCAは勾配ベースの構造学習を使う。RUNは、これらと異なり、文脈強化された時系列予測器から注意行列を得て、時間依存を含む因果グラフを構築する。 ## 実験設定 ### データセット 実世界の根本原因分析データは、機密性のため一般公開されていない。そのため、合成データと実際のマイクロサービスアプリケーションを使う。 #### 合成データ RCDに従い、ランダムなDAGと条件付き確率表(CPT)を生成して正常期間データを作る。次にノードを1つランダムに根本原因として選び、そのノードのCPTを再生成して異常期間データを作る。正常・異常期間を1つのケースへ結合し、異常検知システムでトリガーポイントを決める。時系列数は10、20、30、40、50、各データは2,000タイムスタンプである。 #### sock-shop sock-shopは、異なる技術で実装された13マイクロサービスからなるデモアプリケーションである。各サービスは仮想マシンまたはコンテナへ配置され、HTTPベースのAPIで通信する。CPU、メモリ利用率など多数の統計メトリクスを提供する。評価用データは38時系列、600タイムスタンプで、根本原因カテゴリは10種類、各カテゴリに5インスタンスがある。 | データセット | 時系列数 | タイムスタンプ数 | | --- | ---: | ---: | | 合成データ | 10, 20, 30, 40, 50 | 2,000 | | sock-shop | 38 | 600 | 原本の表記は`Table 1`である。 ### 比較手法と実装 比較対象は以下の5手法である。 - **ϵ-Diagnosis**: 正常期と異常期のKPI時系列の類似度を異常指標にする。 - **AutoMAP**: 適応PCアルゴリズムで重み付き因果グラフを作り、ランダムウォークと相関で原因を特定する。 - **RCD**: 故障を根本原因ノードへの介入として扱い、局所階層学習と分割統治で原因を推定する。 - **Ψ-PC**: RCDの一実装で、全因果グラフを獲得した後に根本原因を探すため、局所学習より余分な時間を要しうる。 - **CausalRCA**: 勾配ベースの因果構造学習で重み付き因果グラフを作り、根本原因メトリクスを推定する。 Ψ-PCとRCDについては、原論文の数値ではなく公式コードを再実行した結果を使うため、原論文と異なる結果になりうる。RUNはAMD EPYC 7302 16-Core CPUとNVIDIA RTX A5000 GPUを備えるマシンで実装する。予測窓`w=32`、Adamの学習率0.001、バッチサイズ128、因果エッジ閾値`H=0.5`、事前学習と微調整のエポック数50とする。PageRankのパーソナライズ値は`P_d=1`、`P_n=0.5`、評価する`k`は1、3、5である。 ### 評価指標 HR@kは、上位k件の出力に正解根本原因が含まれる確率である。問題集合を`A`、問題`i`の正解を`r_i`、上位kリストを`Rank_i^k`とすると、次式で表される。 `HR@k = (1/|A|) Σ_{i=1}^{|A|} 1(r_i∈Rank_i^k)` MRRは、正解根本原因の順位の逆数を平均した値である。出力に正解がない場合の順位は無限大とし、その問題の寄与は0とする。 `MRR = (1/|A|) Σ_{i=1}^{|A|} 1/Index_i` ## 実験結果 ### sock-shopのHR@k 表2では、CPU hogとmemory leakについて、ϵ-Diagnosis、AutoMAP、Ψ-PC、RCD、CausalRCA、RUNを比較する。平均値でRUNは、CPU hogのHR@1、HR@3、HR@5がそれぞれ0.40、0.48、0.52、memory leakが0.12、0.32、0.36となる。 CPU hogでは、HR@3の最良ベースラインはϵ-Diagnosisの0.32であり、RUNは0.48である。memory leakでは、HR@3の最良ベースラインはϵ-Diagnosisの0.20であり、RUNは0.32である。論文は、最良ベースラインに対してCPU hogで少なくとも63%、memory leakで80%の改善と報告する。 | シナリオ | 手法 | HR@1 | HR@3 | HR@5 | | --- | --- | ---: | ---: | ---: | | CPU hog | ϵ-Diagnosis | 0.28 | 0.32 | 0.32 | | CPU hog | AutoMAP | 0.13 | 0.28 | 0.32 | | CPU hog | Ψ-PC* | 0.04 | 0.05 | 0.06 | | CPU hog | RCD* | 0.07 | 0.16 | 0.21 | | CPU hog | CausalRCA | 0.04 | 0.08 | 0.20 | | CPU hog | RUN | 0.40 | 0.48 | 0.52 | | memory leak | ϵ-Diagnosis | 0.20 | 0.20 | 0.20 | | memory leak | AutoMAP | 0.10 | 0.14 | 0.18 | | memory leak | Ψ-PC* | 0.07 | 0.06 | 0.08 | | memory leak | RCD* | 0.06 | 0.15 | 0.12 | | memory leak | CausalRCA | 0.00 | 0.04 | 0.12 | | memory leak | RUN | 0.12 | 0.32 | 0.36 | ϵ-Diagnosisはsock-shopで正常期と異常期の特徴的な違いを利用できるため、他のベースラインより良い。しかし、AutoMAPはPCアルゴリズムが時間依存を無視するため一部ケースで低く、CausalRCAも時系列の時間情報を扱わないため低い。Ψ-PCとRCDは設定を原研究に合わせても実行ごとに異なる原因を出力し、sock-shopでは低い結果となった。 ### sock-shopのMRR Ψ-PCとRCDは根本原因の順位を出力できないため、MRR比較から除外される。表3の平均MRRは、CPU hogでϵ-Diagnosis 0.304、RUN 0.484、memory leakでϵ-Diagnosis 0.227、RUN 0.248である。memory leakのHR@1ではRUNが最良でないケースもあるが、正解が出力リストに含まれる場合の順位は比較的高く保たれる。CPU hogではRUNがϵ-Diagnosisを明確に上回る。 | シナリオ | サービス | ϵ-Diagnosis | RUN | | --- | --- | ---: | ---: | | CPU hog | Carts | 0.273 | 0.299 | | CPU hog | Catalogue | 0.203 | 0.537 | | CPU hog | Orders | 0.212 | 0.825 | | CPU hog | Payment | 0.613 | 0.494 | | CPU hog | User | 0.221 | 0.264 | | CPU hog | 平均 | 0.304 | 0.484 | | memory leak | Carts | 0.036 | 0.158 | | memory leak | Catalogue | 0.412 | 0.207 | | memory leak | Orders | 0.017 | 0.267 | | memory leak | Payment | 0.437 | 0.164 | | memory leak | User | 0.231 | 0.443 | | memory leak | 平均 | 0.227 | 0.248 | 原本の表記は`Table 3`である。表2のHR@kの全結果は上記の平均値と、原本の`Table 2`に示されたサービス別結果で構成される。 ### 合成データ 図6は、合成データにおけるHR@1、HR@3、HR@5を示す。ϵ-Diagnosisは、異常発生時にマイクロサービスデータが示す正常期・異常期の特徴的挙動を、合成データが持たないため低い。合成データはPyAgrumの`generateCPT`に基づくため、実時系列の特徴を十分に再現しない可能性がある。 一方、Ψ-PCとRCDはPCアルゴリズムで合成DAGを学習するため、sock-shopより合成データで良い結果を示す。RUNは豊富な時系列を持つマイクロサービス向けに設計されており、合成データには必ずしも適さないが、Ψ-PCとRCDに対して競争力のある結果を示す。 ![合成データのHR@1(原本 Figure 6(a))](wiki/sources/_attachments/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery/fig-image-007-001.png) ![合成データのHR@3(原本 Figure 6(b))](wiki/sources/_attachments/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery/fig-image-007-002.png) ![合成データのHR@5(原本 Figure 6(c))](wiki/sources/_attachments/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery/fig-image-007-003.png) 原本の図表IDは`Figure 6`である。 ### アブレーション 図7はsock-shop上で、(a)事前学習段階を除く、(b)対照学習へ負例を加える、という2つの変更を評価する。事前学習を除くとRUNの性能は大きく低下するため、同一タイムスタンプの異なる文脈を近づける学習がニューラル・グレンジャー因果発見に有効であることが示される。 負例を加えない設計を除いて通常の負例を使っても、性能は大きく低下しない。著者は、sock-shopの時系列長が限られており、多周期性を十分に識別できなかった可能性を理由として挙げる。したがって、このアブレーションは負例なし設計が常に優れることを証明するものではなく、十分な周期性を含むデータで誤った負例を避ける動機を補強する結果である。 ![事前学習と負例のアブレーション(原本 Figure 7)](wiki/sources/_attachments/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery/fig-image-007-004.png) 原本の図表IDは`Figure 7`である。 ### 因果グラフのケーススタディ 図8では、各ノードから根本原因へ経路がある因果グラフをサンプリングする。黄色ノードはトリガーポイント、赤ノードは根本原因を表す。グレンジャー因果性に基づくエッジは時間順序を含み、診断時には各エッジを反転してPageRankへ入力する。根本原因はdangling nodeとして表れ、RUNのパーソナライズPageRankによって特定される。 ![ニューラル・グレンジャー因果発見から因果グラフを構築する例(原本 Figure 8)](wiki/sources/_attachments/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery/fig-image-007-005.png) 原本の図表IDは`Figure 8`である。 ## 考察 RUNの主な効果は、根本原因を単なる同時相関ではなく、予測における時間的な寄与として評価できる点にある。CPU使用率が先に変化し、その後に他サービスのレイテンシが増えるような関係では、原因系列の過去を予測器へ含めたときの性能改善が注意行列に現れる。対照学習は、この予測器へ入力される表現に、同じ時刻の異なる時間文脈を持たせる役割を担う。 パーソナライズPageRankは、学習グラフ全体で中心的なノードを選ぶのではなく、トリガーに影響する経路とdangling nodeの性質を反映する。特に、原因候補がトリガーから遠い場合でも、通常のランダムウォークで近接ノードへスコアが偏る問題を、パーソナライズとaccess distanceで補おうとしている。 ただし、ニューラル・グレンジャー因果性は予測上の時間関係であり、介入に基づく因果性や物理的根本原因と同一ではない。注意重み、閾値`H`、循環除去時のPearson類似度、PageRankのパーソナライズ値はいずれも結果へ影響する。したがって、RUNのランキングは、修復前の原因仮説を効率よく絞るための情報として使い、独立した運用知識や介入検証と組み合わせる必要がある。 ## 強み / 弱点・課題 ### 強み - PCアルゴリズムが捉えにくい、メトリクス間の時間的先行関係をニューラル・グレンジャー因果発見で扱う。 - 同じタイムスタンプの異なる文脈だけを正例とし、多周期性による誤った負例を避ける。 - 事前学習、予測ベースの因果発見、DAG化、パーソナライズPageRankを一つの診断パイプラインに統合する。 - sock-shopでCPU hogの平均HR@3 0.48、memory leakの平均HR@3 0.32を得て、比較手法を上回る。 - コードを公開し、合成データ、sock-shop、アブレーション、グラフケーススタディを通じて設計要素を検証する。 ### 弱点・課題 - 実世界の公開RCAデータがないため、実マイクロサービス評価はsock-shopという小規模デモアプリケーションに依存する。大規模・長期間・多障害の環境への一般化は未確認である。 - 合成データはPyAgrumのCPTから生成されるため、実際のマイクロサービス時系列にある多周期性や複雑なノイズを十分に再現しない可能性がある。 - 事前学習・予測器の学習量、ウィンドウ長`w=32`、因果閾値`H=0.5`、PageRank重み`P_d=1`・`P_n=0.5`の選択根拠は限定的であり、環境ごとの調整が必要になる。 - グレンジャー因果性と相関に基づくため、未観測交絡、共通原因、フィードバック関係、分布変化があると因果グラフの解釈を誤る可能性がある。 - 閾値処理後に最低類似度のエッジを反復削除してDAGにするため、循環に関する判断はヒューリスティックであり、削除されたエッジが実際の依存を表していた可能性がある。 - sock-shopの時系列が短いため、負例を使う対照学習との差が明確に現れなかった。多周期性を持つ大規模データでの比較が必要である。 - 著者は将来課題として、サイズの異なるデータセットへ拡張し、sock-shopより大規模で代表的な実世界データで評価することを挙げている。 ## 出典 - [[.raw/papers/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery.pdf]] - [[.raw/papers/Root-Cause-Analysis-in-Microservice-Using-Neural-Granger-Causal-Discovery.txt]]