APM Javaエージェントのデプロイ

APM Javaエージェントが正常にプロビジョニングされたら、APM Javaエージェントをデプロイできます。

任意のJavaアプリケーションにAPM Javaエージェントをデプロイするには、JVM起動スクリプトに-javaagentパラメータを追加する必要があります。Java環境、アプリケーション・サーバーまたはマイクロサービスに応じて、ユーザーはシェルまたはバット起動スクリプト、またはJavaコマンドラインを実行する別の方法を使用できます。

APM Javaエージェントを次のJavaアプリケーションにデプロイする方法は、次の例を参照してください。

Oracle WebLogic Server

ここでは、APM JavaエージェントをOracle WebLogic Serverにデプロイする方法について説明します。

  1. アプリケーション・サーバーの宛先ディレクトリを指すように変数を設定します。これは、APM Javaエージェントがプロビジョニングされるディレクトリです。

    Oracle WebLogic Serverドメイン・ディレクトリを指すように$DOMAIN_HOME変数を設定し、APM Javaエージェントが同じ宛先ディレクトリにプロビジョニングされたことを確認してから、次のステップを実行します。

    アプリケーション・サーバー 宛先ディレクトリ変数情報
    Oracle WebLogic Server Oracle WebLogic Serverドメインを指すように$DOMAIN_HOME変数を設定します。
    export DOMAIN_HOME=<Oracle WebLogic Server Domain>
  2. startWebLogic.shファイルのバックアップ・コピーを作成します:
    cd $DOMAIN_HOME/bin
    cp startWebLogic.sh startWebLogic.sh.orig
  3. テキスト・エディタを使用して元のstartWebLogic.shスクリプトを編集し、-javaagentオプションを追加します。
    1. APM JavaエージェントをOracle WebLogic Administration Serverと管理対象サーバーにデプロイする場合は、setDomainEnv.shコールの後に、次の-javaagentオプションをJAVA_OPTIONSのセットに追加します:
      JAVA_OPTIONS="${JAVA_OPTIONS} -javaagent:$DOMAIN_HOME/oracle-apm-agent/bootstrap/ApmAgent.jar"
    2. APM Javaエージェントを管理対象サーバーのみにデプロイする場合は、setDomainEnv.shコールの後に、JAVA_OPTIONSのセットのif文の中に次の-javaagentオプションを追加します:
      if [ "$SERVER_NAME" != "AdminServer" ] ; then
              set JAVA_OPTIONS="${JAVA_OPTIONS} -javaagent:$DOMAIN_HOME/oracle-apm-agent/bootstrap/ApmAgent.jar"
      fi
  4. Oracle WebLogic Serverを停止してから再起動します:
    cd $DOMAIN_HOME/bin
    ./stopWebLogic.sh
    cd ..
    nohup ./startWebLogic.sh >& startup.log &

    管理対象サーバーがある場合は、それらも同様に停止してから再起動します:

    cd $DOMAIN_HOME/bin
            ./stopManagedWebLogic.sh {SERVER_NAME} {ADMIN_URL} {USER_NAME} {PASSWORD}
            nohup ./startManagedWebLogic.sh {SERVER_NAME} {ADMIN_URL} >& {SERVER_NAME}.log &
    ノート

    $DOMAIN_HOME/binバージョンを編集した場合でも、$DOMAIN_HOMEバージョンのstartWebLogic.shが使用されることに注意してください。1レベル上位から($DOMAIN_HOMEから)コマンドを呼び出すと、下位レベルから($DOMAIN_HOME/binから)コマンドが呼び出されます。ただし、stopWebLogic.shコマンドは$DOMAIN_HOME/binディレクトリからコールされます。

APM Javaエージェントが正常にデプロイされると、サーバー起動ログにOracle APM Agent: Initialized AgentInstanceというメッセージが表示されます。

Apache Tomcatサーバー

ここでは、APM JavaエージェントをApache Tomcatサーバーにデプロイする方法について説明します。

  1. アプリケーション・サーバーの宛先ディレクトリを指すように変数を設定します。これは、APM Javaエージェントがプロビジョニングされるディレクトリです。

    Apache Tomcatサーバーの宛先ディレクトリを指すように$CATALINA_HOME変数を設定し、APM Javaエージェントが同じ宛先ディレクトリにプロビジョニングされたことを確認してから、次のステップを実行します。

    アプリケーション・サーバー 宛先ディレクトリ変数情報
    Apache Tomcatサーバー Apache Tomcatサーバーの宛先ディレクトリを指すように$CATALINA_HOME変数を設定します。
    • Bashシェルを使用している場合:
      export CATALINA_HOME=<Apache Tomcat Server destination directory>
    • Cシェルを使用している場合:
      setenv CATALINA_HOME "<Apache Tomcat Server destination directory>"
  2. catalina.shファイルのバックアップ・コピーを作成します。
    $ cd $CATALINA_HOME/bin
    $ cp catalina.sh catalina.sh.orig
  3. テキスト・エディタを使用して元のcatalina.shファイルを編集し、CATALINA_OPTSに次の-javaagentオプションを追加します。変更は、サーバーの起動時に実行されない可能性のあるif文またはコード・ブロックの外部で行います。これにより、-javaagentフラグが常にサーバー起動オプションに追加されます。
    CATALINA_OPTS="${CATALINA_OPTS} -javaagent:$CATALINA_HOME/oracle-apm-agent/bootstrap/ApmAgent.jar"
  4. Apache Tomcatサーバーを停止してから再起動します:
    $ cd $CATALINA_HOME/bin                      
    $ ./shutdown.sh
    $ ./startup.sh

APM Javaエージェントが正常にデプロイされると、サーバー起動ログにOracle APM Agent: Initialized AgentInstanceというメッセージが表示されます。

詳細は、Tomcatアプリケーション・サーバーへのAPM Javaエージェントのインストールに関するチュートリアルを参照してください。

Jettyサーバー

ここでは、APM JavaエージェントをJettyサーバーにデプロイする方法について説明します。

  1. アプリケーション・サーバーの宛先ディレクトリを指すように変数を設定します。これは、APM Javaエージェントがプロビジョニングされるディレクトリです。

    Jetty Serverの宛先ディレクトリを指すようにJETTY_HOME変数を設定し、APM Javaエージェントが同じ宛先ディレクトリにプロビジョニングされたことを確認してから、次のステップを実行します。

  2. Jettyサーバーを起動します。
    java -javaagent:/<Destination_Directory>/oracle-apm-agent/bootstrap/ApmAgent.jar -jar $JETTY_HOME/start.jar

APM Javaエージェントが正常にデプロイされると、サーバー起動ログにOracle APM Agent: Initialized AgentInstanceというメッセージが表示されます。

Spring Boot

ここでは、埋込みApache Tomcatを実行しているSpring BootマイクロサービスにAPM Javaエージェントをデプロイする方法について説明します。

前提条件のタスクを完了し、APM Javaエージェントをプロビジョニングしたことを想定しています。また、Spring Bootアプリケーションのapplication.propertiesファイルに次のプロパティを追加して、Apache Tomcat Mbeansを有効にしたことを確認する必要もあります:
spring.jmx.enabled=true
server.tomcat.mbeanregistry.enabled=true

または、前述のプロパティspring.jmx.enabledおよびserver.tomcat.mbeanregistry.enabledをコマンドラインでシステム・プロパティとして追加します。

APM Javaエージェントをデプロイするには、次の-javaagentオプションをマイクロサービスの起動スクリプトに追加します。<Destination Directory>は、エージェントをプロビジョニングしたディレクトリを示します。
java -javaagent:<Destination Directory>/oracle-apm-agent/bootstrap/ApmAgent.jar -jar target/<microservice.jar>

APM Javaエージェントが正常にデプロイされると、マイクロサービス起動ログにOracle APM Agent: Initialized AgentInstanceというメッセージが表示されます。

JBossサーバー

ここでは、APM JavaエージェントをJBossサーバーにデプロイする方法について説明します。

次の手順は、JBoss EAPおよびWildflyに適用できます。

  1. アプリケーション・サーバーの宛先ディレクトリを指すように変数を設定します。これは、APM Javaエージェントがプロビジョニングされるディレクトリです。

    次のステップを実行する前に、JBossサーバーの宛先ディレクトリを指すように$JBOSS_HOME変数を設定し、APM Javaエージェントが同じ宛先ディレクトリにプロビジョニングされていることを確認します。

    アプリケーション・サーバー 宛先ディレクトリ変数情報
    JBossサーバー

    JBossサーバーの宛先ディレクトリを示すように$JBOSS_HOME変数を設定します。

    • Bashシェルを使用している場合:
      export JBOSS_HOME=<JBoss Server destination directory>
    • Cシェルを使用している場合:
      setenv JBOSS_HOME "<JBoss Server destination directory>"
  2. standalone.confファイルのバックアップ・コピーを作成します。
    cd $JBOSS_HOME/bin
    cp standalone.conf standalone.conf.orig
  3. テキスト・エディタを使用して元のstandalone.confファイルを編集し、次のJavaオプションをJAVA_OPTSに追加します。変更は、サーバーの起動時に実行されない可能性のあるif文またはコード・ブロックの外部で行います。
    • -javaagentオプションをJAVA_OPTSに追加します。
      JAVA_OPTS="$JAVA_OPTS -javaagent:$JBOSS_HOME/oracle-apm-agent/bootstrap/ApmAgent.jar"
    • Javaプロパティjboss.modules.system.pkgsを編集して、"com.oracle.apm"を含めます。

      例:

      JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman,org.jboss.logmanager,com.oracle.apm"
      ノート

      各環境は異なります。Jbossサーバーのプロパティには、前述の例とは異なるパッケージが含まれている場合があります。
  4. JBoss Serverを停止してから再起動します。
    cd $JBOSS_HOME/bin                      
    ./jboss-cli.sh -c :shutdown                        
    nohup ./standalone.sh -b 0.0.0.0&> startup.log &

APM Javaエージェントが正常にデプロイされると、サーバー起動ログにOracle APM Agent: Initialized AgentInstanceというメッセージが表示されます。

DockerおよびKubernetes

ここでは、APM JavaエージェントをDockerコンテナおよびOracle Container Engine for Kubernetes (OKE)にデプロイする方法について説明します。

APM Java AgentをDockerおよびKubernetes環境にデプロイするために使用できる様々なオプションがあります。次を確認し、ビジネス・ニーズを満たすシナリオを選択します。
  1. Dockerコンテナ・イメージへのAPM Javaエージェントのデプロイ
  2. OpenTelemetry演算子を使用したAPM Javaエージェントのデプロイ
  3. マウントされたボリュームへのAPM Javaエージェントのデプロイ

Dockerコンテナ・イメージへのAPM Javaエージェントのデプロイ

ここでは、APM JavaエージェントをDockerコンテナ・イメージおよびOracle Container Engine for Kubernetes (OKE)にデプロイする方法について説明します。

図3-1 Dockerコンテナ・イメージへのAPM Javaエージェントのデプロイ

Dockerコンテナ・イメージへのAPM Javaエージェントのデプロイ

推奨:

このオプションは、Dockerコンテナ・イメージを変更できる場合に使用します。

たとえば、APMエージェント構成を変更する必要がある場合、Dockerイメージを変更できます。

APM Javaエージェントをデプロイするには、次のステップを実行します。

  1. 続行する前に、前提条件を完了し、APM Javaエージェントをプロビジョニングしたことを確認します。
    ノート

    APM Javaエージェントをプロビジョニングする場合は、それをローカル・マシンの任意の場所にプロビジョニングしてから、Dockerイメージにコピーすることをお薦めします。
  2. Dockerfileを変更して、APM JavaエージェントをDockerイメージにコピーします:
    COPY <DESTINATION_DIRECTORY>/oracle-apm-agent <Docker_Image_Directory>/oracle-apm-agent/

    <DESTINATION_DIRECTORY>は、APM Javaエージェントをプロビジョニングしたローカル・マシン上の場所を示し、<Docker_Image_Directory>は、APM Javaエージェントのコピー先のDockerイメージ内のディレクトリを示します。Oracle WebLogic Serverを使用している場合は、<Docker_Image_Directory>をDockerのアプリケーション・サーバー宛先ディレクトリ(たとえば、$DOMAIN_HOME)にすることもできます。

  3. 次の-javaagentオプションをアプリケーション・サーバーの起動スクリプトに追加します:
    java -javaagent:<Docker_Image_Directory>/oracle-apm-agent/bootstrap/ApmAgent.jar -jar target/<appserver.jar>
  4. 組込みのAPM Javaエージェントおよび変更済の起動スクリプトを使用して新しいDockerイメージをビルドし、そのイメージをレジストリにプッシュします。

Kubernetesを使用してDockerコンテナを管理する場合は、新しいDockerイメージを使用するようにKubernetes構成を更新してから、Kubernetesポッドを再起動します。

また、Kubernetesポッドのデプロイメント仕様(yamlファイル)で次の環境およびボリューム設定をコピーすることで、Downward APIを使用してKubernetesポッドからレポートされる追加のディメンションを設定できます。Downward APIの詳細は、KubernetesドキュメントのDownward APIを参照してください。

環境設定

spec:
  containers:
  - name: <container-name>
    image: image: <your-registry>/<your-docker-image>:latest
    env:
      - name: APM_ATTRIBUTES_K8S_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: APM_ATTRIBUTES_K8S_NAMESPACE_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
      - name: APM_ATTRIBUTES_K8S_NODE_NAME
        valueFrom:
          fieldRef:
            fieldPath: spec.nodeName

ボリューム設定

spec:
  containers:
  - name: <container-name>
    image: image: <your-registry>/<your-docker-image>:latest
    volumeMounts:
      - name: apm-attributes-k8s
        mountPath: /etc/apm-attributes-k8s
    volumes:
      - name: apm-attributes-k8s
        downwardAPI:
         items:
           - path: "labels"
             fieldRef:
               fieldPath: metadata.labels
           - path: "annotations"
             fieldRef:
               fieldPath: metadata.annotations
ノート

Kubernetesデプロイメントにラベル、注釈またはその両方がない場合、同じDownward APIではアプリケーションのデプロイ時にエラーが発生します。この場合、metadata.labelsmetadata.annotationsまたはその両方に対応するDownward APIエントリを削除する必要があります。

OpenTelemetry演算子を使用したAPM Javaエージェントのデプロイ

ここでは、OpenTelemetry演算子を使用してAPM Javaエージェントをデプロイし、Kubernetes (K8s)クラスタで実行されているJavaアプリケーション・ポッドにAPM Javaエージェントを自動的に注入および構成する方法について説明します。

図3-2 OpenTelemetry演算子を使用したAPM Javaエージェントのデプロイ

OpenTelemetry演算子を使用したAPM Javaエージェントのデプロイ

推奨:

このオプションは、Dockerコンテナ・イメージを更新できず、起動時にAPMエージェントをJVMに自動的に注入するために、Kubernetesカスタム・リソース(CR)を使用してAPM Javaエージェント構成を変更する場合に使用します。

DockerおよびKubernetesの考慮事項:
  • Dockerイメージ・バージョニングの場合、本番環境でコンテナをデプロイするときにタグ:latestを使用することは避けてください。これは、実行中のイメージのバージョンを追跡するのが難しく、適切にロールバックするのが難しくなるためです。かわりに、v1.12.1.3などの意味のあるタグを指定します。
  • Kubernetesの場合は、Kubernetesカスタム・リソース(CR)および構成マップのバックアップを取得します。

前提条件: OpenTelemetry OperatorをKubernetesクラスタにインストールします。

Operator release manifestOperator helm chart、または Operator Hubの3つの異なるオプションを使用できます。

ほとんどの場合、cert-managerをインストールする必要があります。ヘルムチャートオプションを使用する場合は、代わりに自己署名証明書を生成するオプションがあります。

クイック・スタートでは、証明書マネージャをインストールする必要がある場合は、次のコマンドを実行します。
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.2/cert-manager.yaml

OpenTelemetry演算子をインストールするには、次を実行します:

kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml

APM Javaエージェントのデプロイ

APM Javaエージェントをデプロイするには、次のステップを実行します。

  1. Kubernetesカスタム・リソース(CR)を作成します。

    自動インストゥルメンテーションを管理するには、OpenTelemetry演算子に、カスタム・リソース定義(CRD)を使用して実行されるAPM Javaエージェントとその構成に関する情報を指定する必要があります。

    オペレータがこのカスタム・リソースを使用して、エージェントをポッドにコピーし、必要な構成を追加します。

    CRを作成するには、次を実行します。
    kubectl apply -f - <<EOF
    apiVersion: opentelemetry.io/v1alpha1
    kind: Instrumentation
    metadata:
      name: inst-apm-java
      namespace: opentelemetry-operator-system
    spec:
      java:
        image: container-registry.oracle.com/oci_observability_management/oci-apm-java-agent:1.15.0.516
        env:
          - name: OTEL_com_oracle_apm_agent_data_upload_endpoint
            value: <data-upload-endpoint>
          - name: OTEL_com_oracle_apm_agent_private_data_key
            value: <private-data-key>
    EOF
    説明:
    作成されたCRは、次のコマンドを実行して問い合せることができます。
    kubectl get otelinst -n opentelemetry-operator-system
    自動インストゥルメンテーションが正しく機能するには、すべてのエンドポイントおよび環境変数が正しい必要があります。
  2. Kubernetesアノテーションを追加します。

    OpenTelemetry演算子は、Kubernetes注釈を使用して、APM Javaエージェントで自動インジェクトするポッドを決定します。

    注釈はネームスペースに追加できます。その場合、そのネームスペース内のすべてのポッドが注入されます。注釈は、デプロイメント、ステートフルセットおよびその他のリソースの一部として使用可能な個々のPodSpecオブジェクトに追加することもできます。

    注釈:
    instrumentation.opentelemetry.io/inject-java: "opentelemetry-operator-system/inst-apm-java"
    ネームスペースの編集を開始するには、次を実行します:
    • 次のコマンドを実行します:
      kubectl edit namespace <your-namespace-name>
    • エディタを開いたらネームスペースを編集します。たとえば、viエディタなどを使用します。
    • 注釈をネームスペースに追加します。インデントは、有効なYAMLファイルとして作成することが非常に重要です。
    例:
    apiVersion: v1
    kind: Namespace
    metadata:
      labels:
        kubernetes.io/metadata.name: mynamespace
      annotations:
        instrumentation.opentelemetry.io/inject-java: "opentelemetry-operator-system/inst-apm-java"
      name: mynamespace
    spec:
  3. Kubernetesポッドを再起動します。

    APM Javaエージェントを自動インジェクトするポッドを再起動するには、次を実行します:

    kubectl delete pod <your-pod-name> -n <your-namespace-name>
  4. Kubernetesポッドを確認します。
    再起動後にAPM Javaエージェントでポッドが自動インジェクトされたことを確認するには、次を実行します:
    kubectl get pod <your-pod-name> -n <your-namespace-name> -o yaml

次のステップ(APM Javaエージェント・デプロイメントの検証)に移動できるようになりました。

ノート

OpenTelemetry Operatorを使用してAPM Javaエージェントをデプロイする方法の詳細は、ブログ(OpenTelemetry Operatorを使用してKubernetes環境にAPM Javaエージェントを自動的にデプロイ)を参照してください

マウントされたボリュームへのAPM Javaエージェントのデプロイ

マウントされたボリュームを使用してAPM JavaエージェントをOracle Container Engine for Kubernetes (OKE)にデプロイする方法について説明します。

図3-3マウントされたボリュームへのAPM Javaエージェントのデプロイ

マウントされたボリュームへのAPM Javaエージェントのデプロイ
推奨:
  • このオプションは、Dockerコンテナ・イメージを変更できず、APM Javaエージェントへの変更が必要なときに共有マウント・ボリュームを使用する場合に使用します。

    • 例1: APMエージェントに頻繁な構成変更を行う必要がある場合、コンテナ・イメージは更新する必要がありますが、実行できません。
    • 例2: APMエージェントをデプロイしているユーザーに、コンテナ・イメージを再構築するために必要なアクセス権または権限がない場合。
  • dockerイメージ・バージョニングの場合は、バイナリ・ファイルと構成ファイルをバックアップします。

マウントされたボリュームにAPM Javaエージェントをデプロイするには、次のステップを実行します。

  1. APM Javaエージェントの前提条件タスクを完了したことを確認します。

    APMドメインの作成時に、データ・アップロード・エンドポイントおよびデータ・キーをノートにとります。

  2. ポッドをマウントする新しいファイルシステムを作成します。

    ファイル・システムを作成する際には、Kubernetesで使用されているものと同じVirtual Cloud Network (VCN)コンパートメントを選択することが重要です。同じことをサブネット・コンパートメントに対して行います。

  3. ファイル・システムをポッドにマウントします。

    このステップでは、対応するyamlファイルを編集する必要があります。

    次のyamlファイルを使用して、KubernetesにPersistentVolumeおよび関連エンティティを作成します。環境用に編集する必要があるフィールドmntTargetIdserverおよびpathに注意してください。

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: oci-fss
    provisioner: oracle.com/oci-fss
    parameters:
      mntTargetId: ocid1.mounttarget.oc1.iad.xxxxxxxxxxxxxxxxxxxxxx
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
     name: oke-fsspv
    spec:
     storageClassName: oci-fss
     capacity:
      storage: 10Gi
     accessModes:
      - ReadWriteMany
     mountOptions:
      - nosuid
     nfs:
    # Replace this with the IP of your FSS file system in OCI
      server: 10.0.10.39
    # Replace this with the Path of your FSS file system in OCI
      path: "/fss-for-kub"
      readOnly: false
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
     name: oke-fsspvc
    spec:
     storageClassName: oci-fss
     accessModes:
     - ReadWriteMany
     resources:
      requests:
     # Although storage is provided here it is not used for FSS file systems
        storage: 10Gi
     volumeName: oke-fsspv

    変更を適用するには、kubectl apply -f <filename.yaml>を実行します

    次に、ポッドを管理するyamlファイルを更新し、ボリュームとボリュームのマウントを追加します。

    有効にするには、ポッドを再作成します。

  4. APM Javaエージェント・ファイルをダウンロードします。

    ファイルをダウンロードし、マウントされたボリュームにコピーします。

    ダウンロード手順については、「APM Java Agentソフトウェアのダウンロード」を参照してください。

    ダウンロード後、マウントされたボリュームにコピーします。

  5. APM Javaエージェントのプロビジョニング

    いずれかのコンテナにログインしてAPM Javaエージェントをプロビジョニングし、APM-java-agent-installer jarファイルを見つけて、次を実行します:

    java -jar ./apm-java-agent-installer-<version>.jar provision-agent -service-name=<Name of the Service> -destination=<Destination_Directory> -private-data-key=<Agent installation key generated during APM domain creation> -data-upload-endpoint=<dataUploadEndpoint URL generated during APM domain creation>

    プロビジョニング手順は、APM Javaエージェントのプロビジョニングを参照してください。

  6. APM Javaエージェントのデプロイ

    yamlファイルのマイクロサービスにoracle-apm-agentの場所を指定して、APM Javaエージェントをデプロイします。

    -javaagent引数とAPMエージェントのjarファイルの場所を各マイクロサービスのjavaコマンドに追加します。

    java -javaagent:<Mounted Volume>/oracle-apm-agent/bootstrap/ApmAgent.jar
  7. Kubernetesを再起動します。

    kubectl apply -f <filename.yaml>を実行して、ポッドを再作成します。

    次のステップ(APM Javaエージェント・デプロイメントの検証)に移動できるようになりました。

ノート

マウントされたボリュームにAPM Javaエージェントをデプロイする方法の詳細は、ビデオ(分散トレース用のKubernetes Spring Boot Instrumentation)を参照するか、ブログ(Application Performance Monitoring: Instrument Java on Kubernetes for Monitoring and Diagnostics)を確認してください。