#chiroito ’s blog

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

エンタープライズ向けのシステムを自動構築するツール

エンタープライズで使われるミドルウェアを使うためには、環境が使えるようになるまで構築に膨大な時間がかかるほか、開発用途などでちょっと使うだけで莫大なライセンス料がかかります。

クラウドが当たり前になって、ライセンス料が非常に安価になって触りやすくなったものの、エンタープライズなシステムではInfrastructure as a Codeや自動化などといったレガシーと比べて新しい仕組みを導入するのはハードルが高く、クラウドらしさを得ているエンタープライズなシステムは多くありません。 そのため、クラウド移行というとオンプレと同じ構成・リソースをクラウドにリフトするだけのシステムが多く、開発環境においても常にうごかしっぱなしのため、インフラコストは下がるどころか高くなります。また、インフラ担当者が温かみのある手作業で環境を構築・運用するため構築や運用のコストもこれまでどおりです。その結果、システム全体のコストはクラウド移行前と比べて高くなります。

ミッションクリティカルなシステムで使われるレベルのシステムを1から構築するのは骨が折れるものです。複数環境を手作業でとなると尚更です。

なので、エンタープライズなシステムを自動化するためのベースとなるツールを作成しました。基本的な構成はツールの設定変更だけでできることを目標とし、設定変更では対応できないケースではカスタマイズするベースとなることを目的としています。ツールといってもただのTerraformのファイル群です。

GitHub - chiroito/rapid-build-tool

このツールを使うと以下のような構成のシステムを設定だけで作れるようになります。実行してしばらく待つだけで環境が構築でき不要になったらすぐに環境が削除できる上、システム全体で100~200円程度からさわり始めることができます。

f:id:chiroito:20190219014813p:plain
LB経由でアプリケーションと管理ツールへアクセスし、システムのバックアップをオブジェクトストレージに取得する

f:id:chiroito:20190219014828p:plain
アプリケーションと管理ツールへのアクセスはアプリケーションサーバが直接受け付け、システムのバックアップは取らない

システムの開発時には必要な時だけ立ち上げて、不要なときだけ停止することでかなりのコスト削減に繋がります。また、同時に複数面を構築できるので、環境の構築待ちや開放待ちなども無くなり、開発の生産性向上にも繋がります。アプリケーションの単体試験や、Java EE のコンテナとの結合試験、外部システムをモック化した結合試験などの自動テストなどは既にある場合には、このツールと組み合わせることで開発者がソースをコミットしたら環境が自動で立ち上がり、これらのテストを実施し、テストが終わったらレポートを送信して環境は無くなるという使い方がエンタープライズなシステムでも可能となります。

エンタープライズなシステムでもよりクラウドらしさが得られることを願っています。

OpenJDK を開発する流れ

自分が使うコマンドをうっかり忘れるときがあるのでその備忘録のために、開発の流れとそこで使ってる内容をメモ。

公式のガイドはこちらを参考にしてください。The OpenJDK Developers' Guide

OpenJDK の開発は以下のような流れで行います。

バグを上げる

おかしい動きだなぁとか新しい機能を追加するときは Java Bug System に Issue をあげます。 System Dashboard - Java Bug System

開発の準備

開発を始めるには OpenJDK のソースコードやテストツール、レビューツールを使います。これらは OpenJDK のリポジトリからダウンロードできます。 ダウンロード先は/srcディレクトリとしますが、任意のディレクトリで大丈夫です。

OpenJDKのソースをダウンロード

cd /src
hg clone http://hg.openjdk.java.net/jdk/jdk

参考:The OpenJDK Developers' Guide: Repositories

jtregをダウンロード

次に、テストツールである jtreg をダウンロードします。

cd /src
hg clone http://hg.openjdk.java.net/code-tools/jtreg

webrevをダウンロード

最後に、レビューツールである webrev をダウンロードします。

$ cd /src/jdk
$ wget http://hg.openjdk.java.net/code-tools/webrev/raw-file/tip/webrev.ksh

パッチを書く

お好きな方法でパッチを書いてください。私は Java の API やテストコードは IntelliJ IDEA で書いて、Hotspot JVM は Eclipse で書いてます。世の中には Vim や Emacs で開発してる人もいます。

IDE を使う方法はこちらで紹介されてます。

ビルド

jtreg のビルド

まずはテストツールからビルドします。これはとりあえず一回だけで良いです。

cd /src/jtreg
bash make/build-all.sh /usr/lib/jvm/java-1.8.0

OpenJDKのビルド

次に OpenJDK をビルドします。以下はデバッグするためのオプションを付けてます。 ビルドをするまでの設定はとてつもなく長いのでこちらを参照して下さい。

Building the JDK

cd /src/jdk
bash configure --enable-debug --with-native-debug-symbols=internal --with-boot-jdk=/usr/lib/jvm/java-11 --with-jtreg=/src/jtreg/build/images/jtreg

make images

configure が再度必要になったらmake reconfigureで前の引数などを引き継いで実行してくれます。

テスト

コードを書いて、ビルドして、テストしてということを繰り返すことになりますが、OpenJDK には大量のテストが含まれているため最初から全てのテストを実行すると途方も無い時間が掛かります。なので、開発中は自分が書いている部分のテストだけを実行して、デバッグしてます。

参考:Testing the JDK

自分が書いたテストを実行

特定のテストの実行はmake test TEST="自分が書いたテストのファイル"で実行します。以下のように実行します。

cd /src/jdk
make test TEST="test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java"

出力

Building target 'test' in configuration 'linux-x86_64-server-fastdebug'
Skip building of Graal unit tests because 3rd party libraries directory is not specified
Skip building of Graal unit tests because 3rd party libraries directory is not specified
Test selection 'test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java', will run:
* jtreg:test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java

Running test 'jtreg:test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java'
Passed: jdk/jfr/jcmd/TestJcmdConfigure.java
Test results: passed: 1
Report written to /src/jdk/build/linux-x86_64-server-fastdebug/test-results/jtreg_test_jdk_jdk_jfr_jcmd_TestJcmdConfigure_java/html/report.html
Results written to /src/jdk/build/linux-x86_64-server-fastdebug/test-support/jtreg_test_jdk_jdk_jfr_jcmd_TestJcmdConfigure_java
Finished running test 'jtreg:test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java'
Test report is stored in build/linux-x86_64-server-fastdebug/test-results/jtreg_test_jdk_jdk_jfr_jcmd_TestJcmdConfigure_java

==============================
Test summary
==============================
   TEST                                              TOTAL  PASS  FAIL ERROR   
   jtreg:test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java
                                                         1     1     0     0   
==============================
TEST SUCCESS

Finished building target 'test' in configuration 'linux-x86_64-server-fastdebug'

レグレッションテスト

自分で書いたテストが通るようになったら、レグレッションテストのためにtier1と言われるテストを全部実行します。

cd /src/jdk
make test-tier1

レビューの作成

webrevを使ってwebレビューを作成します。-cオプションで指定するのはIssueの番号です。JDK-の部分は不要で番号だけで大丈夫です。

cd /src/jdk
ksh ./webrev.ksh -m -N -c XXXXXX

出力

   SCM detected: mercurial

 No outgoing, perhaps you haven't committed.
      Workspace: /src/jdk
      Output to: /src/jdk/webrev
   Output Files:
    (略)
     index.html: grep: /home/chito/.hgrc: No such file or directory
Done.
Output to: /src/jdk/webrev

webレビューのアップロード

> scp -i <秘密鍵> -r JDK-8216565/webrev xxx@cr.openjdk.java.net:~xxx/JDK-8216565/

レビュー依頼

Request for review の略語であるRFR:とissueの番号とタイトルを付けてメールします。

コミット・プッシュ

ユーザ情報を追加

コミットするには hg にユーザの登録が必要です。/src/jdk/.hg/hgrc に自分のユーザを設定します。(Author以上?)[ui]usernameを設定しましょう。

[paths]
default = http://hg.openjdk.java.net/jdk/jdk

[ui]
username = xxx

参考:The OpenJDK Developers' Guide: Repositories

コミット

コミットメッセージを作成します。必須なのは、issue番号とタイトル、レビューしてくれた人のusernameです。

参考:The OpenJDK Developers' Guide: Producing a Changeset

message.txt

8216565: Specifying the same path creates a new directory in JFR.configure
Reviewed-by: ysuenaga, egahlin

コミットしましょう。

hg commit -l message.txt

コミッタになればここで push します。

チェンジセット作成とアップロード

Author 以下の場合は push を誰かに頼みます。 頼むためのチェンジセットを作成します。

hg export -g > changeset

チェンジセットをアップロードします。

> scp -i <秘密鍵> -r changeset xxx@cr.openjdk.java.net:~xxx/JDK-XXXXX/

連絡

チェンジセットの URL を添えて「push してと」メールを送ります。

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 エージェントの確認

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