APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

AKSでDaprを使ってみる (3) App InsightsでTracing

はじめに

5月4日、ゴールデンウィーク真っ只中! 皆様いかがお過ごしでしょうか。リフレッシュされていますか?

前回はDaprとAzure Monitor/Application Insightsを連携させるところまで行いました。

techblog.ap-com.co.jp

今回のアプリケーションはJava / Spring Bootを使っていますし、せっかくですのでこちらにもJava Agentを導入してみようと思います。

Java Agent導入

Javaを利用している場合、Java Agentを導入するだけで、コードを変更する必要なく簡単にApplication Insightsと連携することができます。

Java Agentの有効化方法はMicrosoft Docsで紹介されています

docs.microsoft.com

こちらに紹介されている内容を参考に有効にするだけです。 今回はアプリケーションへの変更なく、またアプリケーションのコンテナイメージも変更することなく、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を使った分散トレーシングについては以前にもご紹介させて頂いております。そちらもご覧ください。

techblog.ap-com.co.jp

今回はトラップもなく、簡単に実現できました。 あとはnginx controllerでもTrackingが有効にできればいいのですが、そちらはまた別の機会に。

さいごに

今回はゴールデンウィーク中もあり、軽めの内容で簡単に終わりにしたいと思います。

ここまでのコードは以下で公開しています。

github.com

実は今回の投稿は5月4日の今日、この最後の一言を言いたかったがために投稿したようなものでした・・・ということで。

May the force(4th) be with you