はじめに
5月4日、ゴールデンウィーク真っ只中! 皆様いかがお過ごしでしょうか。リフレッシュされていますか?
前回はDaprとAzure Monitor/Application Insightsを連携させるところまで行いました。
今回のアプリケーションはJava / Spring Bootを使っていますし、せっかくですのでこちらにもJava Agentを導入してみようと思います。
Java Agent導入
Javaを利用している場合、Java Agentを導入するだけで、コードを変更する必要なく簡単にApplication Insightsと連携することができます。
Java Agentの有効化方法はMicrosoft Docsで紹介されています
こちらに紹介されている内容を参考に有効にするだけです。 今回はアプリケーションへの変更なく、またアプリケーションのコンテナイメージも変更することなく、Java Agentを有効にする方法をご紹介します。
java agent用コンテナイメージの用意
まずJava AgentのJarファイルを含むコンテナイメージを作成します。
Dockerfile
FROM alpine:latest COPY applicationinsights-agent.jar .
コンテナ作成手順
export AGENT_VER=3.2.10 curl -L https://github.com/microsoft/ApplicationInsights-Java/releases/download/$(AGENT_VER)/applicationinsights-agent-$(AGENT_VER).jar -o applicationinsights-agent.jar docker build -t applicationinsights-agent . docker tag applicationinsights-agent:latest applicationinsights-agent:${AGENT_VER} docker tag applicationinsights-agent:latest ${ACR_NAME}.azurecr.io/applicationinsights-agent:latest docker tag applicationinsights-agent:latest ${ACR_NAME}.azurecr.io/applicationinsights-agent:${AGENT_VER} docker push ${ACR_NAME}.azurecr.io/applicationinsights-agent:latest docker push ${ACR_NAME}.azurecr.io/applicationinsights-agent:${AGENT_VER}
コマンドを分割してわかりにくいかもしれませんが、単にコンテナイメージを作成してACRにPushしているだけです。
準備はこれで終わり。
Deploymentで指定
作成したコンテナイメージからinitConatinerで呼び出して利用します。aggregatorの場合はこのように指定します(timefeedアプリケーションでも同様に指定を行います)。
aggregator.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: aggregator namespace: web labels: app: aggregator spec: selector: matchLabels: app: aggregator template: metadata: labels: app: aggregator annotations: dapr.io/enabled: "true" dapr.io/app-id: "aggregator" dapr.io/app-port: "8080" dapr.io/config: "appconfig" dapr.io/log-as-json: "true" prometheus.io/scrape: "true" prometheus.io/port: "9090" prometheus.io/path: "/" spec: containers: - name: aggregator image: ${ACR_NAME}.azurecr.io/dapr-sample/aggregator:0.0.1-SNAPSHOT imagePullPolicy: Always ports: - containerPort: 8080 # Java Agentを含むボリュームをマウント volumeMounts: - mountPath: /shared/java-agent name: java-agent readOnly: true # Java Agentを含むボリュームをマウント(ここまで) env: - name: TIMEFEED_HOST value: http://localhost:3500 - name: TIMEFEED_BASE value: /v1.0/invoke/timefeed/method/ - name: SPRING_MAIN_BANNER-MODE value: "off" # Java Agent実行指定 - name: JAVA_TOOL_OPTIONS value: "-javaagent:/shared/java-agent/applicationinsights-agent.jar -Dreactor.netty.http.server.accessLogEnabled=true" - name: APPLICATIONINSIGHTS_ROLE_NAME value: aggregator-web - name: APPLICATIONINSIGHTS_CONNECTION_STRING valueFrom: secretKeyRef: name: instrumentation-string key: instrumentationString # Java Agent実行指定(ここまで) initContainers: # Java Agentをボリュームにコピー - name: init-agent image: ${ACR_NAME}.azurecr.io/applicationinsights-agent:${APPINSIGHTS_JAVA_AGENT_VER} command: ["cp", "applicationinsights-agent.jar", "/shared/java-agent/applicationinsights-agent.jar"] volumeMounts: - mountPath: /shared/java-agent name: java-agent # Java Agentをボリュームにコピー(ここまで) # Java Agentをコピーするボリューム volumes: - name: java-agent # Java Agentをコピーするボリューム emptyDir: {}
jarファイルを実行環境に置き、--javaagent指定でjarファイルを指定して、必要な環境変数を設定すれば有効になります。
今回のようにjarファイルを別のコンテナで配布することで、複数のアプリケーションのDeploymentでバージョン指定を 書き換えるだけで新バージョンを利用することができるようになります。
なお、収集された結果を参照すると次のようなものとなります。Dapr Sidecarの部分も含めて呼び出し履歴を確認できます。
Application Insightsを使った分散トレーシングについては以前にもご紹介させて頂いております。そちらもご覧ください。
今回はトラップもなく、簡単に実現できました。 あとはnginx controllerでもTrackingが有効にできればいいのですが、そちらはまた別の機会に。
さいごに
今回はゴールデンウィーク中もあり、軽めの内容で簡単に終わりにしたいと思います。
ここまでのコードは以下で公開しています。
実は今回の投稿は5月4日の今日、この最後の一言を言いたかったがために投稿したようなものでした・・・ということで。
May the force(4th) be with you