#chiroito ’s blog

Java を中心とした趣味の技術について

Oracle Management Cloud エージェントをインストールしてみる

はじめに

システムを運用するときは、ログやメトリックをモニタリングします。オンプレのシステムでは決まった台数を監視すれば良いことが多いです。また、ストレージが書き込める限り、あとからストレージからログやメトリックを収集できます。クラウドでは状況に合わせて台数がスケールします。問題が発覚した頃にはそのインスタンスがスケールインなどによってなくなっている可能性があるためログやメトリックを常にどこかへ転送しなければなりません。

Oracle Management Cloud Service ではエージェントをインストールするだけでオンプレやクラウドサービスを問わずOS、ミドルウェア、アプリケーションまでのログやメトリックを収集して見ることができるようになります。ミドルウェアはOracle製品に限らず、Dockerコンテナなどにも対応しています。

f:id:chiroito:20190126165424p:plain
Oracle Management Cloud

エージェントには、汎用的な情報を取り扱う Cloud Agent と、特定のミドルウェアに特化した情報を取り扱う APMエージェントの 2 種類があります。実際の分析の現場では、アプリケーションはミドルウェア上で動いているため、何か問題が発生したらAPMエージェントによって収集された情報を使ってミドルウェアレベルで問題を分析してから、Cloud Agent によって収集されたより低レベルな OS の問題を分析していきます。

エージェントのインストール

汎用的な情報を取るか、ミドルウェア特化の情報を取るかによってCloud Agent か APM Agent を組み合わせて使用します。その他にもシステムの構成によって以下のような構成を組めます。 ポイントは以下です。

  • Oracle Management Cloud までの間に Http プロキシがあるかどうか(あるなら設定で対応)
  • 各エージェントから直接 Oracle Management Cloud へデータを送るか(途中で取りまとめるなら Gateway をインストール)
  • Oracle Enterprise Manager に格納されてる情報を Oracle Management Cloud へ送るか (送るなら Data Collectorをインストール)

https://docs.oracle.com/cd/E83857_01/paas/management-cloud/emaig/img/emcad_dt_004_1.png 図:エージェントの配置例

今回は、もっともシンプルな構成とします。エージェントが収集した汎用的な情報だけをプロキシやGatewayを使わずに直接送る構成です。 以下の手順をしていきます。

  • キーの作成
  • Cloud Agent のインストール
  • Cloud Agent の確認

キーの作成

キーの作成は Oracle Management Cloud の管理コンソールで行います。名前登録制限設定し、新規キーの作成ボタンを押すだけで作成されます。 登録制限は接続可能なエージェントの数を指定します

f:id:chiroito:20190126171624p:plain
登録キーの新規作成

キーを作成すると以下のように表示されるようになります。以下はすでに 2 つのエージェントが登録した例です。Cloudエージェントのインストールでキー値を使うため控えておきます。

f:id:chiroito:20190126171739p:plain
作成済の登録キーの一覧

参考:Manage Registration Keys

Cloud Agentのインストール

キーの作成が終わったらエージェントをインストールします。

Cloudエージェントのダウンロード

Cloudエージェントはダウンロードタブでダウンロードします。 エージェントタイプは以下の 4 つから選択します。今回はログやOSの汎用的な情報を取得するクラウド・エージェントをダウンロードします。

  • ゲートウェイ
  • データ・コレクタ
  • クラウド・エージェント
  • APMエージェント

また、CloudエージェントのインストールでTENANT_NAMEOMC_URLを使うため控えておきます。

f:id:chiroito:20190126165613p:plain
Oracle Management Cloud エージェントのダウンロード

レスポンスファイルの設定

次にレスポンスファイルであるagent.rspファイルにある以下の 4 つのパラメータを設定します。

  • TENANT_NAME:ダウンロード画面で控えたTENANT_NAME
  • AGENT_REGISTRATION_KEY:登録キーの作成で控えたキー値
  • AGENT_BASE_DIRECTORY:エージェントをインストールしたいディレクトリ
  • OMC_URL:ダウンロード画面で控えたOMC_URL

Cloudエージェントでプロキシやゲートウェイを使う場合はこちらを参照してください
クラウド・エージェントをインストールするためのパラメータ

データコレクタをインストールする場合はこちら
データ・コレクタをインストールするためのパラメータ

ゲートウェイをインストールする場合はこちら
ゲートウェイをインストールするためのパラメータ

agent.rsp

####################################################################################################
# Refer Agent Installation Guide for details                                                       #
#  http://www.oracle.com/pls/topic/lookup?ctx=en/cloud/paas/management-cloud&id=deploy_agent       #
# Refer this link for mandatory and non-mandatory parameter details                                #
#  http://www.oracle.com/pls/topic/lookup?ctx=en/cloud/paas/management-cloud&id=deploy_gateway     #
####################################################################################################

###################################### Registration Parameters #####################################

TENANT_NAME=4fXXXXXXXXXXXXXXXXXXXXXXXXXXXX5d

AGENT_REGISTRATION_KEY=RcXXXXXXXXXXXXX-XXXXXXXXeS

AGENT_BASE_DIRECTORY=C:\Oracle\cloudagent

##################################### Communication Parameters #####################################

OMC_URL=https://4fXXXXXXXXXXXXXXXXXXXXXXXXXXXX5d.uscom-east-1.oraclecloud.com/

設定値の検証

レスポンスファイルに設定した内容でOracle Management Cloud へ通信できるか、エージェントをインストールできるかなど設定値を検証します。

検証にはこのあとインストールで使うAgentInstall.batEXECUTE_PREREQ=trueを付けて実行します。なお、Linux版の場合はAgentInstall.shになります。

> AgentInstall.bat EXECUTE_PREREQ=true
Unzipping agent software, this may take some time...
Installing Cloud Agent...
Executing Pre-requisite checks only for Cloud Agent...
Cloud Agent parameter validation started...
Cloud Agent pre-requisite checks started...
Pre-requisite checks successfully completed for [Cloud Agent].

Cloudエージェントのインストール

検証が成功したら実際にインストールしてみます。

Windowsの場合

Windowsではサービスとして実行されます。

> AgentInstall.bat
Unzipping agent software, this may take some time...
Installing Cloud Agent...
Cloud Agent parameter validation started...
Cloud Agent pre-requisite checks started...
Cloud Agent base directory creation started...
Security artifacts download started...
Cloud Agent setup started...
Registering Cloud Agent...
Starting Cloud Agent...
Cloud Agent started.
Cloud Agent installation completed.
Cloud Agent post installation checks started.
Cloud Agent is up and running.
Cloud Agent is communicating to Oracle Management Cloud.
Cloud Agent is monitored in Oracle Management Cloud.
Cloud Agent post installation checks completed.
Linuxの場合

Linux の場合は、デーモンとして実行されます。検証のログは変りませんが、インストールのログは以下のようになります。

[chito@localhost cloudagent]$ ./AgentInstall.sh
Unzipping agent software, this may take some time...
Installing Cloud Agent...
Cloud Agent parameter validation started...
Cloud Agent pre-requisite checks started...
Cloud Agent base directory creation started...

Security artifacts download started...
Cloud Agent setup started...
Registering Cloud Agent...
Starting Cloud Agent...
Cloud Agent started.
Cloud Agent installation completed.
Cloud Agent post installation checks started.
Cloud Agent is up and running.
Cloud Agent is communicating to Oracle Management Cloud.
Cloud Agent is monitored in Oracle Management Cloud.
Cloud Agent post installation checks completed.
To start Cloud Agent upon Operating System restart include '/home/chito/cloudagent/agent_inst/bin/omcli start agent' in the start-up scripts.
For further details please refer http://www.oracle.com/pls/topic/lookup?ctx=en/cloud/paas/management-cloud&id=deploy_agent.

インストール完了後はagent_inst/bin/omcli start agentを実行してCloudエージェントを実行します。

Cloud エージェントの削除

インストール先を変えるなどでもし削除したくなったら <AGENT_BASE_DIRECTORY>\core\<AGENT_VERSION>\perl\bin\perl <AGENT_BASE_DIRECTORY>\core\<AGENT_VERSION>\sysman\install\AgentInstall.pl -deinstallを実行して削除します

Cloudエージェントの状況を確認する。

レスポンスファイルで指定したディレクトリからagent_inst/binへ進むとエージェントとのやりとりを行うomcliがあり、これを使います。 Cloudエージェントの状況はomcli status agentで確認します。

> set PATH=%PATH%;%AGENT_BASE_DIRECTORY%\agent_inst\bin
> omcli status agent
Oracle Management Cloud Agent
Copyright (c) 1996, 2018 Oracle Corporation.  All rights reserved.
---------------------------------------------------------------
Version                : 1.37.0
State Home             : C:/Oracle/cloudagent/agent_inst
Log Directory          : C:/Oracle/cloudagent/agent_inst\sysman\log
Binaries Location      : C:\Oracle\cloudagent\core\1.37.0
Process ID             : 23208
Parent Process ID      : 27560
URL                    : https://CHIXXXXXXXXXXX.oracle.com:4459/emd/main/
Started at             : 2019-01-19 13:50:12
Started by user        : CHITO-JP$
Operating System       : Windows version 10.0 (amd64)
Data Collector enabled : false
Sender Status          : FUNCTIONAL
Gateway Upload Status  : FUNCTIONAL
Last successful upload : 2019-01-19 14:25:31
Last attempted upload  : 2019-01-19 14:25:30
Pending Files (MB)     : 0
Pending Files          : 5
Backoff Expiration     : (none)

---------------------------------------------------------------
Agent is Running and Ready

定期的に情報をOracle Management Cloud へ送信するため、Last successful uploadが更新されていけば情報が送れています。

また、Oracle Management Cloudのコンソールのクラウド・エージェントからも接続できているかを確認できます。

f:id:chiroito:20190126165722p:plain
Cloud エージェントの確認

ここまでできればインストールは成功です。

OSが起動したままマウントしてる XFS のサイズを増やしてみた

/ の領域が足りなくなってきてしまったけど、仮想マシンからデタッチして、他の仮想マシンにアタッチ・マウントしてからサイズ増やして、また戻してからマウントするの面倒臭いなと2ヶ月ぐらい思っていたら、growpartというツールでマウントしたままパーティション情報変えられるようだったので試してみた。

今のサイズはこんな感じ

# df
ファイルシス   1K-ブロック      使用    使用可 使用% マウント位置
(略)
/dev/sda3          9753600   8619504   1134096   89% /
(略)

growpartを使うにはcloud-utils-growpart というパッケージを入れるだけです。

# yum install cloud-utils-growpart
読み込んだプラグイン:langpacks, ulninfo
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ cloud-utils-growpart.noarch 0:0.29-2.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================
 Package                   アーキテクチャー
                                       バージョン         リポジトリー     容量
================================================================================
インストール中:
 cloud-utils-growpart      noarch      0.29-2.el7         ol7_latest       26 k

トランザクションの要約
================================================================================
インストール  1 パッケージ

総ダウンロード容量: 26 k
インストール容量: 61 k
Is this ok [y/d/N]: y
Downloading packages:
cloud-utils-growpart-0.29-2.el7.noarch.rpm                 |  26 kB   00:03     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : cloud-utils-growpart-0.29-2.el7.noarch          1/1 
  検証中                  : cloud-utils-growpart-0.29-2.el7.noarch          1/1 

インストール:
  cloud-utils-growpart.noarch 0:0.29-2.el7                                      

完了しました!

インストールが終わったらパーティションサイズを増やして、XFS ファイルシステムのサイズも拡張します。 パーティションサイズを増やすにはgrowpart <デバイス> <パーティション番号>を実行します。今回は/dev/sda3のパーティションが対象なのでデバイスは/dev/sda、パーティション番号は3を指定します。

# growpart /dev/sda 3
CHANGED: partition=3 start=1443840 old: size=19527680 end=20971520 new: size=40499167,end=41943007

# xfs_growfs /
meta-data=/dev/sda3              isize=256    agcount=6, agsize=478976 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2440960, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2440960 to 5062395

これだけで完了です。dfしてみると容量が増えてるのが確認できます。

[root@localhost ~]# df
ファイルシス   1K-ブロック      使用    使用可 使用% マウント位置
(略)
/dev/sda3         20239340   8820276  11419064   44% /
(略)

Terraform を使って Cloud上に OpenJDK の開発環境を整えてみた

OpenJDK のビルドやテストは時間が非常に掛かるので、クラウド上で大量の CPU リソースを使って短時間化できないかを試してみました。

今回作った環境に自分で書いたパッチを置いて Terraform を実行すると、あとはクラウド上で大量のリソースを使ってビルドとテストが終わるようになりました。試しに 48 vCPU の環境を作ったところ、ビルドは4~5分、fastdebug での Tier1 のテストは40分程度で完了しました。

ソースコードはこちら(sandbox/Terraform/developOpenJDK at master · chiroito/sandbox · GitHub

クラウドを使うと言えど毎回この全行程を実行するのは時間(=料金)がかかるので、できる限り再利用したいと思います。 今回は、再利用できる部分と毎回処理する部分に分けて環境を構築してみました。再利用できる部分は環境構築時に作成して Block Storage として保管しておきます。Block Storage は 2 つ作ってあり、1つはOSや作業スクリプトなど一回作ったらしばらく変らない部分を Boot イメージとして作成し、もう1つは、OpenJDK のソースコードなどわりと頻繁に変る部分を作業用のボリュームとして作成しました。

今回は Terraform を使って Oracle Cloud 上に環境を構築していきます。OpenJDK 関連の作業はシェル化してあるので他のクラウドサービス上でも環境構築できると思います。

f:id:chiroito:20190106155351p:plain

OpenJDK の環境を整えてテストを流すために必要な作業は以下のようになります。

  1. ビルドやテストに必要なパッケージのインストール
  2. OpenJDK ソースコードのダウンロード
  3. テストツールであるJTREG ソースコードのダウンロード
  4. 自分で書いたパッチを適用
  5. OpenJDK と JTREG のビルド
  6. JTREG を使って OpenJDK のテストを実行

今回は、再利用できる部分として1~3 を済ませた Block Storage を作成し、テスト実行時に 4 以降の作業をするようにします。1~3の部分はダウンロード時間がほとんどを占めるため、CPU の量が少ないインスタンスを使えます。

OpenJDK のスクリプト

  1. ビルドやテストに必要なパッケージのインストール
  2. OpenJDK ソースコードのダウンロード
  3. テストツールであるJTREG ソースコードのダウンロード
SRC_BASE_PATH=${1}
sudo yum groupinstall -y "Development Tools"
sudo yum install -y freetype-devel cups-devel libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel alsa-lib-devel libffi-devel autoconf java-1.8.0-openjdk-devel fontconfig-devel java-11-openjdk-devel mercurial
mkdir -p ${SRC_BASE_PATH}
cd ${SRC_BASE_PATH}
hg clone http://hg.openjdk.java.net/jdk/jdk
hg clone http://hg.openjdk.java.net/code-tools/jtreg

4 . 自分で書いたパッチを適用

5 . OpenJDK と JTREG のビルド

SRC_BASE_PATH=${1}
cd ${SRC_BASE_PATH}/jtreg
hg pull -u
bash make/build-all.sh /usr/lib/jvm/java-1.8.0

cd ${SRC_BASE_PATH}/jdk
hg pull -u
patch -p1 < /home/opc/myPatch
bash configure --enable-debug --with-native-debug-symbols=internal --with-boot-jdk=/usr/lib/jvm/java-11 --with-jtreg=${SRC_BASE_PATH}/jtreg/build/images/jtreg
time make images

6 . JTREG を使って OpenJDK のテストを実行

SRC_BASE_PATH=${1}
cd ${SRC_BASE_PATH}/jdk
time make test-tier1

Terraform のスクリプト

環境構築時に実行されて、以後再利用される処理

resource "null_resource" "preparing_task" {
  depends_on = ["oci_core_instance.prepare_instance", "oci_core_volume_attachment.prepare_volume_attach"]
  connection {
    agent       = false
    timeout     = "300m"
    host        = "${oci_core_instance.prepare_instance.public_ip}"
    user        = "opc"
    private_key = "${file("${var.ssh_private_key}")}"
  }
  provisioner "file" {
    source = "script"
    destination = "/home/opc/"
  }
  provisioner "remote-exec" {
    inline = [ <<EOS
sh /home/opc/script/prepareForOpenJDK.sh /src
EOS
    ]
  }
}

ビルドとテストのたびに実行される処理

resource "null_resource" "build_and_test_task" {
  depends_on = ["oci_core_instance.worker_instance", "oci_core_volume_attachment.worker_volume_attach"]
  connection {
    agent       = false
    timeout     = "120m"
    host        = "${oci_core_instance.worker_instance.public_ip}"
    user        = "opc"
    private_key = "${file("${var.ssh_private_key}")}"
  }
  provisioner "file" {
    source = "script"
    destination = "/home/opc/"
  }
  provisioner "file" {
    source = "userdata/myPatch"
    destination = "/home/opc/"
  }
  provisioner "remote-exec" {
    inline = [ <<EOS
sh /home/opc/script/buildOpenJDK.sh /src
sh /home/opc/script/testOpenJDK.sh /src
EOS
    ]
  }
}

全体のソースコードはこちら(sandbox/Terraform/developOpenJDK at master · chiroito/sandbox · GitHub