LoginSignup
4
1

More than 1 year has passed since last update.

OCI APMでOKE上のコンテナアプリケーションをトレーシングしてみよう

Last updated at Posted at 2021-10-25

はじめに

Oracle Cloud Infrastructure(以下、OCI)には、分散トレーシングを提供するOCI APMというマネージドサービスがあります。
本記事では、OKEにサンプルアプリケーションをデプロイしてOCI APMからトレーシングをしてみたいと思います。

分散トレーシングとは

Cloud Nativeな文脈では、Observabilityの一つの要素になり、各アプリケーション間のトランザクションや通信の状況を把握するための営みになります。
例えば、大量のサービスが連携しているマイクロサービス下でパフォーマンスの低下などが発生した場合にどのアプリケーション部分が原因になっているかを特定することができます。
スクリーンショット 2021-10-14 16.12.02.png

OCI APMとは

OCI APMOracle Cloud Observability and Management Platfotmの中のサービスの一つです。
その中でもOCI APMは、分散トレーシングや合成モニタリングなどを提供するサービスになります。

今回は、このOCI APMを利用して、OKE上のコンテナアプリケーションをトレーシングしてみたいと思います。

事前準備

まずは、事前準備をしていきます。

事前準備は以下の4つです。

  • ポリシーの作成
  • APMドメインの作成
  • OCIRレポジトリ作成
  • OKEクラスタの準備
  • サンプルアプリケーションの準備

ポリシーの作成

OCIでは各サービスを利用するためにポリシーを作成する必要がある場合があります。
OCI APMを利用する場合にもポリシーが必要なので、作成していきます。
トライアル環境や管理者権限をお持ちの環境で実施する場合は本手順は不要ですので、無視してください。

OCIコンソールのハンバーガーメニューを開き、「アイデンティティとセキュリティ」から「ポリシー」を選択します。

6-001.png

「ポリシーの作成」をクリックします。

5-005.png

以下の情報を入力します。
また、「手動エディタの表示」にチェックを入れます。

key value
名前 apm_policy
説明 apm_policy
コンパートメント ご自身のコンパートメント名
ポリシー Allow group APM-Admins to manage apm-domains in compartment id <ご自身のコンパートメントOCID>

6-002.png

画像はイメージですので、コンパートメントOCIDはご自身の環境に合わせて読み替えてください。

「作成」をクリックします。

これで、ポリシーの設定は完了です。

APMドメインの作成

ここでは、APMドメインの作成を行います。

OCIコンソールのハンバーガーメニューを開き、「監視および管理」から「アプリケーション・パフォーマンス・モニタリング」カテゴリの「管理」を選択します。

6-003.png

「APMドメインの作成」をクリックします。

6-004.png

以下の情報を入力します。

key value
名前 oke-handson-apm
説明 oke-handson-apm

「作成」をクリックします。

6-005.png

ドメインが「作成中」のステータスになるので、「アクティブ」になるまで待機します。

6-006.png

ドメインが「アクティブ」になったら、ドメイン名の箇所をクリックします。

「APMドメイン情報」の「データ・アップロード・エンドポイント」と「データ・キー」の「プライベート」キーの値をコピーし、エディタなどに記録しておきます。
この値は、アプリケーション側からトレーシング情報をAPMにアップロードする際のエンドポイントとその際に利用するキーになり、後ほど利用します。

6-007.png

6-008.png

これで、APMドメインの作成は完了です。

OCIRレポジトリの作成

後続手順で、サンプルアプリケーションをビルドして、コンテナイメージを作成します。
そのコンテナイメージを格納するコンテナイメージレジストリのセットアップを行います。

左上のハンバーガーメニューをクリックして、「開発者サービス」-「コンテナ・レジストリ」を選択します。

1-3-001.png

「リポジトリの作成」ボタンをクリックします。

1-3-002.png

「リポジトリ名」に「frontend-app-apm」と入力、「アクセス」で「パブリック」を選択して、「リポジトリの作成」ボタンをクリックします。

1-3-003.png

次に、OCIRにコンテナイメージをプッシュする際に必要となる、「Username」と「Password」を取得します。

「Username」は、<オブジェクト・ストレージ・ネームスペース>/<ユーザ名> となります。

<ユーザ名>を確認します。ユーザ名は右上にある「プロファイル」アイコンをクリックして、プロファイル名を選択します。

1-3-004.png

「ユーザーの詳細画面」の赤枠箇所をコピーして、テキストエディタにペーストしておきます。

1-3-005.png

次に、<オブジェクト・ストレージ・ネームスペース>を確認します。

右上にある「プロファイル」アイコンをクリックして、「テナンシ」を選択します。

1-3-006.png

「テナンシ詳細」の「オブジェクト・ストレージ・ネームスペース」の赤枠箇所をコピーして、テキストエディタにペーストしておきます。

1-3-007.png

次に、「Password」となる認証トークンを設定します。

右上にある「プロファイル」アイコンをクリックして、プロファイル名を選択します。

1-3-008.png

左メニュー「認証トークン」を選択します。

1-3-009.png

「トークンの作成」をボタンをクリックします。

1-3-010.png

「説明」に「oke-handson-apm」と入力して、「トークンの生成」ボタンをクリックします。

1-3-011.png

「コピー」をクリックして、「閉じる」ボタンをクリックします。 コピーした認証トークンは、後の手順で必要となるので、テキストエディタなどにペーストしておきます。

1-3-012.png

以上で、認証トークンの作成は完了です。

以下、テキストエディタにペーストした内容に当てはめて利用します。

key value
Username <オブジェクト・ストレージ・ネームスペース>/<ユーザ名>
Password 認証トークン

以上でOCIRのセットアップは完了です。

OKEクラスタの準備

OKEクラスタはこちらの手順を参考に構築してください。

サンプルアプリケーションの準備

APMの動作確認用に簡単なアプリケーションを用意しました。
東京2020オリンピック・パラリンピック大会のメダル獲得者の一覧を表示するアプリケーションです。

2-1-001.png

以下のレポジトリを利用します。

git clone https://github.com/oracle-japan/code-at-customer-handson

今回のアプリケーションはHelidonを利用した構成になっています。
Helidonについてはこちらの記事で取り上げていますが、マイクロサービスに適したJavaアプリケーションフレームワークです。

Helidonでは、OCI APM用の専用エージェントが用意されており、依存関係(ライブラリ)と環境変数を設定するだけで利用できます。
詳細はこちらをご確認ください。

先ほどプロビジョニングしたOCI APMを利用するための設定をしていきます。

APMにはAPM Browser AgentとAPM Server Agentが存在するので、その両方を設定していきます。

サンプルアプリケーション(ブラウザ側)のAPM設定

まずは、APM Browser Agentから設定します。

フロントエンドアプリケーションのHTMLファイルを開きます。

vim code-at-customer-handson/olympic_frontend_apm/src/main/resources/web/index.html
~~~
    <script>
      window.apmrum = (window.apmrum || {}); 
      window.apmrum.serviceName='oke-helidon-demo-frontend-UI';
      window.apmrum.webApplication='OracleJetApp';
      window.apmrum.ociDataUploadEndpoint='https://xxxxxxxxxxxxxxx.apm-agt.us-ashburn-1.oci.oraclecloud.com'; #変更箇所1
      window.apmrum.OracleAPMPublicDataKey='<your-public-data-key>'; #変更箇所2
      window.apmrum.traceSupportingEndpoints =  [
        { headers: [ 'APM' ], hostPattern: '.*' },
      ]; 
    </script>
    <script async crossorigin="anonymous" src="https://xxxxxxxxxxxxxxx.apm-agt.us-ashburn-1.oci.oraclecloud.com/static/jslib/apmrum.min.js"></script> #変更箇所3
~~~
変更箇所 設定内容 備考
変更箇所1 APMドメインの作成で記録した「データ・アップロード・エンドポイント」
変更箇所2 APMドメインの作成で記録したデータ・キーの「パブリック」キー プライベートキーではなく、パブリックキーとなるので注意してください。
変更箇所3 staticより前の部分https~.comまでをAPMドメインの作成で記録した「データ・アップロード・エンドポイント」を設定します。

ソースコードを変更したので、コンテナイメージをビルドし、OCIR上にプッシュします。

cd code-at-customer-handson/olympic_frontend_apm
docker image build -t iad.ocir.io/<your-object-storage-namespace>/frontend-app-apm .

OCIRにログインします。「iad.ocir.io」エンドポイントについては、ビルド時と同様、環境に合わせてください。

Ashburn(us-ashburn-1)リージョンではない皆様
リージョンが、アッシュバーン(us-ashburn-1)ではない場合、環境に合わせて「iad.ocir.io」の部分も変更してください。
各リージョンのOCIRエンドポイントはこちらで確認できます。
ここでは、以降も「iad.ocir.io」で進めます。

「Username」と「Password」は、事前に確認した以下を入力します。

入力項目 入力内容
Username <オブジェクト・ストレージ・ネームスペース>/<ユーザ名>
Password 認証トークン
docker login iad.ocir.io
docker image push iad.ocir.io/<your-object-storage-namespace>/frontend-app-apm

これでOCIRへのプッシュは完了です。

サンプルアプリケーション(サーバサイド側)のAPM設定

Manifestのあるディレクトリに移動します。

cd ~
cd code-at-customer-handson/k8s/app/for-oci-apm

フロントエンドアプリケーションのManifestをvimで開きます。

vim olympic_frontend.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-app
  labels:
    app: frontend-app
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend-app
      version: v1
  template:
    metadata:
      labels:
        app: frontend-app
        version: v1
    spec:
      containers:
      - name: frontend-app
        image: iad.ocir.io/orasejapan/frontend-app-apm
        ports:
        - containerPort: 8082
        env:
        - name: tracing.data-upload-endpoint
          valueFrom:
            secretKeyRef:
              name: apm-secret
              key: endpoint
        - name: tracing.private-data-key
          valueFrom:
            secretKeyRef:
              name: apm-secret
              key: private-key
(省略)

25行目~35行目のenvフィールドにSecretから環境変数としてtracing.data-upload-endpointtracing.private-data-keyを読み込んでいます。
これと同じ設定をバックエンドアプリケーションとデータソースアプリケーションにも入れています。

ここで利用するSecretリソースを作成します。

項目 設定内容 備考
APMエンドポイント APMドメインの作成で記録した「データ・アップロード・エンドポイント」
「データ・キー」の「プライベート」キー APMドメインの作成で記録したデータ・キーの「プライベート」キー パブリックキーではなく、プライベートキーとなるので注意してください。
kubectl create secret generic apm-secret --from-literal=endpoint=<APMエンドポイント> --from-literal=private-key=<「データ・キー」の「プライベート」キー>

これでサンプルアプリケーションのManifest設定の変更は完了です。

OCI APMでのトレーシング

いよいよ、OCI APMを利用したトレーシングを実施します。

OCI APMでの分散トレーシング

サンプルアプリケーションをデプロイします。

cd ~
cd code-at-customer-handson/k8s/app/for-oci-apm
kubectl apply -f . 

コマンド結果

deployment.apps/backend-app-v1 created
deployment.apps/backend-app-v2 created
deployment.apps/backend-app-v3 created
service/backend-app created
deployment.apps/datasource-app created
service/datasource-app created
deployment.apps/frontend-app created
service/frontend-app created

アプリケーションにアクセスします。

kubectl get svc frontend-app

コマンド結果

NAME           TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
frontend-app   LoadBalancer   10.96.110.178   146.56.xxx.xxx   80:31031/TCP   58s

上記の場合は、EXTERNAL-IPである146.56.xxx.xxxがエンドポイントになります。

この場合は、以下のURLにアクセスします。
http://146.56.xxx.xxx

何度かアクセスしたのちに、トレース情報をOCI APMから確認します。

OCIコンソールのハンバーガーメニューを開き、「監視および管理」から「アプリケーション・パフォーマンス・モニタリング」カテゴリの「トレース・エクスプローラー」を選択します。

6-009.png

画面上部にある「APMドメイン」から、APMドメインの作成で作成したAPMドメインを選択します。

6-010.png

右側にある検索条件を「過去15分間」に選択し、「実行」ボタンをクリックします。

6-011.png

複数のトレース情報が表示されますので、Spansが26になっている情報をクリックします。

スクリーンショット 2022-02-22 17.11.31.png

以下のようなトレース情報が表示されます。
この情報で、どのコンポーネントがどれくらいの時間を要しているのかをクリアに確認できます。

スクリーンショット 2022-02-22 17.12.39.png

これで、OCI APMを利用したトレーシングは完了です。

OCI APMでのアプリケーションサーバのメトリクス監視

最後に、OCI APMではアプリケーションサーバのメトリクスも監視できるので、やってみたいと思います。

画面左上のプルダウンから「ダッシュボード」をクリックします。

6-015.png

ダッシュボードから「アプリケーション・サーバー」をクリックします。

6-016.png

左上に「アプリケーションサーバを選択します」というプルダウンがあるので、任意のアプリケーションサーバ(実体はHelidonのPod)を選択します。

6-017.png

アプリケーションサーバ(今回はHelidon)のメトリクス情報が表示されます。

6-018.png

ここで取得したメトリクスをもとに、OCI MonitoringやOCI Notificationsと連携すると、一定の閾値を超過した際にアラーム通知を行うこともできます。

このように、OCI APMを利用すると詳細なトレーシングの取得と確認およびアプリケーションサーバのメトリクス監視を行うことができます。

まとめ

このように、OCI APMを利用すると分散トレーシングやアプリケーションサーバのメトリクス監視を一貫して行うことができます。

ぜひ、皆さんも触ってみてください!!

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1