view paper/text/experiment.tex @ 7:173cf6494869

add Issue
author kiyama <e185758@ie.u-ryukyu.ac.jp>
date Sun, 30 Jan 2022 20:23:01 +0900
parents 271532d37fe5
children 694f3a6e2219
line wrap: on
line source

\chapter{監視環境}
本章では,システム障害の早期発見のための監視システムの構築方法とその様子を示す.

\section{検証環境}
本実験では全ての監視システムをコンテナ上に構築しており,docker-compose.ymlファイルからpodmanでコンテナを作成する形を取っている.
作成したdocker-compose.ymlファイル\ref{src:docker-compose}を載せる.

\lstinputlisting[label=src:docker-compose, caption=監視環境のdocker-compose.yml]{src/docker-compose.yml}

サービスの死活監視はprometheus,ログ収集はloki,それらのデータ可視化はgrafana,アラート送信はalertmanagerを用いて構築している.
システム監視の構成図を\ref{fig:monitoring-system}に示す.
exporter,alertmanagerはprometheusのコンポーネントとなっており,exporterで各サービスのメトリック情報をprometheusに対して送信している.
また,prometheusの独自のクエリ言語であるpromQLで設定した条件を満たした際にalertmanagerに対してアラートを送信する.\\
使用するクエリ言語がlogQLに変更しているがlokiもpromethrus同様にログを収集し,アラートを送信している.


\begin{figure}[htbp]
  \begin{center}
   \includegraphics[width=110mm]{figs/monitoring-system.png}
   \caption[monitoring-system]{構成図.}
   \label{fig:monitoring-system}
   \end{center}
\end{figure}

\section{システム監視}
各サービスのリソース・死活監視はpromethrusを用いて行っている.\\
prometheusは収集したデータをブラウザで表示する機能を持っている.
図\ref{fig:prometheus-expr}に各expoterサーバーからprometheusに集めた情報をブラウザを通じて表示する様子を示す.

\newpage

\begin{figure}[htbp]
  \begin{center}
   \includegraphics[width=110mm]{figs/prometheus-expr.png}
   \caption[monitoring-system]{promethrusでのグラフを用いたデータの可視化.}
   \label{fig:prometheus-expr}
   \end{center}
\end{figure}

しかし,prometheusのグラフでは表示のカスタマイズや可視化したダッシュボードの登録,ログイン認証をサポートしていない.
そこでデータの可視化はgrafanaを用いた.
図\ref{fig:grafana-login}にgrafanaでのログイン画面を示す.\\
図\ref{fig:grafana-prometheus}に示すようにgrafanaを用いてダッシュボードの作成ができる.
また,これらのダッシュボードは自身でカスタムしたりgrafanaに登録されてあるダッシュボードをインポートすることで,よく使用する情報を登録することが可能である.
図\ref{fig:grafana-prometheus}ではnginxの状態を監視しており,一番上の文字で表示されているのが死活状況,左下が単位時間ごと受け入れられた通信率と処理された通信率,右下が接続に成功,読み込み中,待機中,応答をレスポンスしている状態のグラフである.

\begin{figure}[htbp]
  \begin{center}
   \includegraphics[width=110mm]{figs/grafana-login.png}
   \caption[grafana-login]{grafanaでのlogin画面.}
   \label{fig:grafana-login}
   \end{center}
\end{figure}

\newpage

\begin{figure}[htbp]
  \begin{center}
   \includegraphics[width=110mm]{figs/grafana-prometheus.png}
   \caption[grafana-prometheus]{grafanaでカスタムされたダッシュボード.}
   \label{fig:grafana-prometheus}
   \end{center}
\end{figure}

\section{ログ収集}
障害が発生したサーバーがアクセス可能であればログを確認することはできるが,何らかの原因でアクセス出来ない場合はログを確認する手段がない.\\
そこで各サーバーのログを収集する事でサーバーの死活状態に関わらず原因調査が可能である.また,grafanaではlogQLを用いて絞り込みが出来る為特定までにかかるコストが低くなると考える.\\
提案システムでは,ログ収集にはlokiを用いている.
loki自体に収集したログを表示する機能は無く,grafnaと連携してログの可視化を行う.
図\ref{fig:loki-grafana}がlokiとgrafanaが連携してlogを可視化している様子である.\\


\begin{figure}[htbp]
  \begin{center}
   \includegraphics[width=110mm]{figs/loki-grafana.png}
   \caption[loki-grafana]{lokiで収集したデータをgrafanaで可視化.}
   \label{fig:loki-grafana}
   \end{center}
\end{figure}

\newpage

上記は閲覧者がlogQLを用いることでログの絞り込みが可能だが検索結果が保存されない.
その為一般的には,図\ref{fig:loki-dashboard}のようにprometheus同様カスタムダッシュボードを使用して可視化を行う.
図\ref{fig:loki-dashboard}ではlokiに収集されたログの単位時間あたりの総数とerrorの文字列が含まれるログの総数,単位時間あたりのログの総数をグラフで表したものになっている.

\begin{figure}[htbp]
  \begin{center}
   \includegraphics[width=130mm]{figs/loki-dashboard.png}
   \caption[loki-dashboard]{grafanaのダッシュボードでlogを表示.}
   \label{fig:loki-dashboard}
   \end{center}
\end{figure}

\section{アラート送信}
システムのリソース状態や死活状態,ログ情報は安定してシステムを運用する上で把握しておくべき情報である.
しかし,人間が24時間365日稼働しているシステムを監視し続けるのは現実的ではない.
その為指定したログが出力されたりサービスが停止した際に管理者に通知する仕組みが必要でありそれがアラート機能である.\\
また,prometheus,loki共に設定ファイルにalertmanagerのurlを記入することで連携が可能である.
またアラートルールのファイル形式についてgrafanaの公式サイトは「Loki alerting rules are exactly the same, except they use LogQL for their expressions. 」\cite{grafana}
と明言しており,使用するQLを除いてアラートルールの記述方法は変わらない事からここではlokiのアラートルールのみを紹介する.\\
ソースコード\ref{src:loki-alert}がlokiのアラートルールファイルである.このコードの7行目がアラートを制御する部分であり5分周期でログの有無を確認しログが生成されていたらalertmanagerにクエリを送信するようなコードになっている.

\lstinputlisting[label=src:loki-alert, caption=lokiのアラートルールファイル]{src/loki-alert.yml}

また,アラートはmattermostに通知されるようになっており図\ref{fig:mattermost-alert}が実際に送信されたアラートである.

\begin{figure}[htbp]
  \begin{center}
   \includegraphics[width=110mm]{figs/mattermost-alert.png}
   \caption[mattermostにalertが送信される様子]{mattermostにalertが送信される様子.}
   \label{fig:mattermost-alert}
   \end{center}
\end{figure}