📌

AKS と Application Insights でログの出力の違いを確認する

に公開

ごきげんよう!mihohoi です。

コンテナーのログ(stdout/stderr)を AKS (Azure Kubernetes Service) や Azure Container Apps で出力する場合、Container Insights などを利用して Log Analytics から確認します。

では、全てのエラーログを Log Analytics で確認しようと思うと、できないことはありませんが、相当な苦労が必要です。
特にアプリケーションのエラーログを出す場合、stdout/stderr から確認するのは大変を通り越して、もう泣きたくなることもあると思います。

それでは、どこでログの確認を行うのがスマートなのか、いくつかの方法と表示例を出しながら確認してみたいと思います。

今回使用するサンプルアプリ

今回は、Java の Spring Boot でよく使われている「petclinic」を利用します。

https://github.com/spring-projects/spring-petclinic

このサンプルアプリケーションは「k8s」フォルダに yaml ファイルが設定されていたりと、何かと便利なサンプルアプリケーションですが、アプリの Dockerfile が存在していないのと、Application Insights も導入したいため、GitHub Copilot の力を借りて、新たに Dockerfile を作成しました。
今回は、ログの表示を確認したいだけのため、Dockerfile の内容は割愛します。

ローカルでの動作確認

ローカルで動作確認を行います。いつもの可愛いワンちゃんと猫ちゃんがが出てきました。
ローカルでの動作確認

「ERROR」タブをクリックすると、エラーが発生するようになっています。押下して、エラーがコンテナー側から出力されることを確認します。
エラー発生
そうそう、このエラーがほしい。

それでは、Application Insights からエラーが表示されているか確認します。
Application Insights でのエラー確認

Application Insights の稼働確認とともに、エラーが出力されていることも確認できました。

Azure Container Apps での確認

それでは、作成した Docker イメージを使って、Azure Container Apps にデプロイしてみましょう。

こちらが Azure Container Apps に petclinic をデプロイして出力したエラー画面です。
Azure Container Apps でのエラー確認

標準出力からだと、スタックのログが大変見えづらくなっていることがわかります。1つのエラーが数十行にわたって表示されてしまっています。
目が痛い....

では Application Insights 側からこのエラーを見るとどうなるか、確認してみます。
Azure Container Apps での Application Insights でのエラー確認

上記は、Application Insights 「障害」から確認した画面です。右下の「コール スタック」がスタックトレースのログになります。ここから見ると、1つの塊としてエラーを見ることができます。
この「コールスタック」に表示されているログ、Log Analytics からも確認できるので見てみます。
Azure Container Apps での Log Analytics でのエラー確認

「details」列にログがまとまっていることがわかります。これならば見やすいですね。

AKS での確認

では、AKS で同じように確認してみましょう。
とは言っても、Azure Container Apps と出力内容は同じです。stdout/stderr は同じように Log Analytics に1行ずつ出力されます。

ただし、AKS では「複数行ログ」(と呼んでいいのか)を設定することで、コンテナーからの例外スタックトレースを合成することができます。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/containers/container-insights-logs-schema#multi-line-logging

「複数行ログ」は、以下の制限事項があるため注意が必要です。

  • 対象言語は、Java、Python、.NET、Go のみ
  • カスタム例外や任意のログ メッセージなど、その他の複数行ログ エントリは結合されない

AKS に対して ContainerLogV2 スキーマを有効するには、「クラスターのデータ収集規則(DCR)」または ConfigMap を作成する必要があります。
今回は、ConfigMap を利用します。

参考となる設定は下記の URL の yaml にあります。

https://raw.githubusercontent.com/microsoft/Docker-Provider/ci_prod/kubernetes/container-azm-ms-agentconfig.yaml

設定した ConfigMap は以下となります。

apiVersion: v1
kind: ConfigMap
metadata:
  name: container-azm-ms-agentconfig
  namespace: kube-system
data:
  schema-version: v1
  config-version: v1
  log-data-collection-settings: |-
    [log_collection_settings.schema]
    containerlog_schema_version = "v2"

    [log_collection_settings.enable_multiline_logs]
    enabled = true
    stacktrace_languages = ["java"]

    [log_collection_settings.metadata_collection]
    enabled = true
    # 収集フィールドを限定する場合のみ設定(未指定なら全フィールド収集)
    # include_fields = ["podLabels","podAnnotations","podUid","image","imageID","imageRepo","imageTag"]

適用後、AKS のコンテナーからエラーを出力してみます。

AKS での複数行ログ確認

ConfigMap 適用後、複数行にまとまっていたログが 1行に合成されていることがわかります。適用前のログに影響を与えないため、設定前のログは1行のままとなっています。

まとめ

複数行ログの設定を出力前後であらためて確認したかったため、実際にどのような変化があるかを検証しました。
アプリケーションのログは、Application Insights から確認するのが個人的には一番みやすいと感じます。
ですが、何か止まれぬ事象があり、Container Insights から確認したい場合は、複数行ログの設定をしておくと便利だなと思います。

では、良いコンテナー ライフを!!

GitHubで編集を提案
Microsoft (有志)

Discussion