Oracle Management Cloud の Log Analytics とやらを使ってみる

Oracle Management Cloud (OMC) というサービスがある。サーバのログを収集・分析して、問題が発生した場合はアラートを上げたりできる。

今回はこの OMC の中の Log Analytics 機能を中心に、使い始めてみる。

目次

OMC の特徴

OMC の特徴は以下のとおり。

お膳立てされているところが多く、サーバ側にクラウド・エージェントを仕込んでおきさえすれば、後から色々と調整したりできる。

前提とするサーバ環境

今回はこのようなサーバのログ収集ができるようにしてみる。

OMC インスタンスの作成

Oracle Cloud My Services のメニュー → サービス → Management Cloud と移動し、OMC インスタンスを作成する。

インスタンスを作成したら、右側のメニューアイコンより「OMC URL」を押下すると、OMC 管理コンソールのトップページに遷移する。

Cloud Agent Installer をダウンロードする

前述の「クラウド・エージェント」ソフトウェアを Docker コンテナに同梱するため、まずはそのインストーラファイルをダウンロードする。

OMC 管理コンソールの左メニュー → 「管理」 → 「エージェント」と進み、画面右上のハンバーガーメニュー風アイコン → 「Download Agents」と進む。

次の画面で、

を選択し、Docker コンテナの OS に応じたエージェントの Zip ファイルをダウンロードする。今回は Cloud Agent - Linux (64-bit) を使用する。現時点では v1.38 というバージョンで、cloudagent_linux.x64_1.38.0.zip というファイルがダウンロードできた。

また、この画面で、TENANCY_NAMEOMC_URL パラメータ値をメモしておく。さらに、ページ中の「登録キー」リンクを押下して、次画面の「キー値」欄に表示されている値をメモしておく。この値は、後述する AGENT_REGISTRATION_KEY 項目の設定値となる。

ログ・ソース「Node.js Log4js Logs」の設定を変更する

今回は Log4js が追記するログファイルを監視したいのだが、Log4js が出力するログファイルをよしなに解析してくれるログソースが用意されている。

ログソースとは、「ログパーサ」を、どんなマシンの、どんなファイルに適用するか、といった設定を担う概念。こんな文言が含まれるログには「要注意」ラベルを付ける、とかいう設定もできたりする。

OMC 管理コンソール左メニュー → 管理 → ログ管理 → ログ・ソース と進み、「ログ・ソースの検索」検索窓より絞り込んで Node.js Log4js Logs というログソースを見つける。

このログソースの詳細画面に飛んだら、以下のように設定しておく。

クラウドエージェント・インストーラを同梱した Docker イメージを作る

管理画面側での初期設定は以上。以降、ログを実際にどうパースするか、どんなログを抽出・集計するか、といった設定は、実際に「クラウド・エージェント」にログを送信させるよう設定してから変更しても問題ない。

続いては、ログを送信させる Web サーバ側の設定。先程ダウンロードしたクラウドエージェントの Zip ファイルと、いくつかの設定ファイルを用意して、サーバ起動時に初期設定してやる必要がある。今回は Web サーバを Docker コンテナとして稼動させる例として記述する。

まずはプロジェクトディレクトリ直下に次のような構成でファイルを格納する。

Zip ファイルは先程のモノとして、それ以外のファイルの内容は以下のとおり。

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

# 最初は「TENANT_NAME=」という行になっていると思うので、「__TENANT_NAME__」とダミーの値を設定しておく
TENANT_NAME=__TENANT_NAME__

# 以下も同様…
AGENT_REGISTRATION_KEY=__AGENT_REGISTRATION_KEY__

AGENT_BASE_DIRECTORY=__AGENT_BASE_DIRECTORY__

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

# この4項目だけ
OMC_URL=__OMC_URL__
{
  "entities": [
    {
      "name": "__HOSTNAME__",
      "type": "omc_host_linux",
      "properties":{
        "capability": {
          "displayName": "capability",
          "value": "monitoring"
        }
      }
    }
  ]
}
{
  "entities": [
    {
      "name": "__HOSTNAME__",
      "type": "omc_nodejs",
      "properties": {
        "host_name": {
          "displayName": "__HOSTNAME__",
          "value": "__HOSTNAME__"
        },
        "port_list": {
          "displayName": "8080",
          "value": "8080"
        },
        "full_module_name": {
          "displayName": "/my-app/index.js",
          "value": "/my-app/index.js"
        },
        "log_directory": {
          "displayName": "/my-app/logs",
          "value": "/my-app/logs"
        },
        "log_filename_pattern": {
          "displayName": "error-*.log",
          "value": "error-*.log"
        }
      }
    }
  ]
}

ファイルの準備はコレで OK。あとは Dockerfile と、Docker コンテナ起動時に実行するシェルスクリプトをちょっと書いてやる。

# Oracle Cloud Agent を正常にインストールできる OS として CentOS 7 を選んだ
FROM centos:7

# 起動スクリプトをコピーする
COPY ./start.sh /
# Cloud Agent Installer をコピーする
COPY ./cloud-agent-installer/ /cloud-agent-installer/
# 必要に応じてアプリの資材もコピーする…

# Cloud Agent Installer のインストールに bc と unzip コマンドを使うのでインストールしておく
RUN set -x && \
    : 'Install bc and unzip command (for Cloud Agent Installer)' && \
    yum install -y bc unzip
# 必要に応じてアプリの実行環境も設定しておく…

# 必要に応じてコンテナが公開するポートを指定しておいたり…
EXPOSE 8080

# コンテナ起動時に /start.sh を実行する
CMD ["sh", "/start.sh"]

start.sh の内容は以下の要領で。

#!/bin/bash

# ================================================================================
# 起動スクリプト : Cloud Agent のインストールと初期設定を行い Web サーバを起動する
# ================================================================================

# 実行コマンドを出力する
set -x

# 変数定義
# --------------------------------------------------------------------------------

# 設定情報を定義する : 別途環境変数で渡しても OK

# クラウド・エージェントのダウンロード画面で確認した TENANT_NAME
TENANT_NAME='xxxxxxxxxxxxxxxxx'

# 「登録キー値」画面で確認した値
AGENT_REGISTRATION_KEY='yyyyyyyyyyyyyyy'

# クラウド・エージェントのインストール先ディレクトリ : 適当に指定する・インストーラがあるディレクトリとは別の場所にディレクトリごと新規生成させないとエラーになる
AGENT_BASE_DIRECTORY='/cloud-agent/'

# クラウド・エージェントのダウンロード画面で確認した OMC_URL
OMC_URL='https://xxxxxxxxxxxxxxxxx.uscom-xxxx-1.oraclecloud.com/'

# 以下全般的な変数

# 設定ファイルが格納されているベースディレクトリ
base_path='/cloud-agent-installer'

# インストーラの解凍先ディレクトリ
installer_path="${base_path}/installer"

# インストールした資材の格納先ディレクトリ (AGENT_BASE_DIRECTORY 変数と同じ値だが末尾にスラッシュなしで使用するローカル変数)
dest_path='/cloud-agent'

# omcli コマンドのフルパス
omcli="${dest_path}/agent_inst/bin/omcli"

# インストーラの解凍とエージェント定義の準備
# --------------------------------------------------------------------------------

# ベースディレクトリ配下の ./installer/ ディレクトリ配下にインストーラを解凍する (ココで unzip コマンドが必要になる)
unzip -d "${installer_path}" "${base_path}/cloudagent_linux.x64_*.zip"

# agent.rsp の内容を環境変数で置換する
agent_rsp='agent.rsp'
base_agent_rsp="${base_path}/${agent_rsp}"

# 置換する文字列にスラッシュ `/` が含まれているため sed コマンドの区切り文字にアットマーク `@` を使用する
sed -i s@__TENANT_NAME__@"${TENANT_NAME}"@ "${base_agent_rsp}"
sed -i s@__AGENT_REGISTRATION_KEY__@"${AGENT_REGISTRATION_KEY}"@ "${base_agent_rsp}"
sed -i s@__AGENT_BASE_DIRECTORY__@"${AGENT_BASE_DIRECTORY}"@ "${base_agent_rsp}"
sed -i s@__OMC_URL__@"${OMC_URL}"@ "${base_agent_rsp}"

# agent.rsp を上書き移動する
cat "${base_agent_rsp}"
mv -f "${base_path}/${agent_rsp}" "${installer_path}/${agent_rsp}"

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

# インストール前に動作検証する (このスクリプト内で bc コマンドが使用される)
sh "${installer_path}/AgentInstall.sh" EXECUTE_PREREQ=true
# インストールを開始する : agent.rsp に定義したディレクトリに資材が置かれる
sh "${installer_path}/AgentInstall.sh"

# エージェントを起動する (インストール時にも起動するようだが念のため)
"${omcli}" start agent
# 事前のエンティティの状況を確認する
"${omcli}" status_entity agent

# Linux エージェントの設定更新
# --------------------------------------------------------------------------------

# Host Linux エージェントの設定ファイルにホスト名を設定する
linux_entity_agent="${base_path}/linux-entity-agent.json"
sed -i s/__HOSTNAME__/`hostname -f`/ "${linux_entity_agent}"

# Host Linux エージェントを更新する
cat "${linux_entity_agent}"
"${omcli}" update_entity agent "${linux_entity_agent}"

# Node.js エージェントの設定追加
# --------------------------------------------------------------------------------

# Node.js エージェントの設定ファイルにホスト名を設定する
nodejs_entity_agent="${base_path}/nodejs-entity-agent.json"
sed -i s/__HOSTNAME__/`hostname -f`/ "${nodejs_entity_agent}"

# Node.js エージェントを追加する
cat "${nodejs_entity_agent}"
"${omcli}" add_entity agent "${nodejs_entity_agent}"

# 設定後確認
# --------------------------------------------------------------------------------

# 操作後のエンティティの状況を確認する
"${omcli}" status_entity agent

# サーバ起動
# --------------------------------------------------------------------------------

# サーバを起動する (ココでは Node.js アプリのテイ)
cd /my-app/
npm start

こんな感じで設定完了。

実際に起動してみる

クラウド・エージェントはローカル端末で起動してもログを収集してくれるので、試してみたければ Docker コンテナをローカルで起動してみれば良い。

起動後、start.sh に記載した初期設定に3・4分かかるのが難点。実際に Web サーバが起動するまで最初に5分近くかかる。

サーバが起動したら、何か Log4js でログが追記されるような操作をしてみよう。OMC 管理画面の「ログ・エクスプローラ」を開き、ログが転送され、表示されるか確認してみる。実際に触ってみた感じだと、ログ・エクスプローラでログが見られるようになるのは、ログ出力されてから2・3分経ってから、という感じ。また、ログに日本語文字列が含まれると時たま文字化けする。UTF-8 なのに ISO-8859-1 と解釈した時の化け方をするので、なんかこう、「米国企業」って感じ。w

Docker コンテナが死んでも、管理画面上はエンティティが一覧に残り続けて鬱陶しいので、「管理」→「エンティティ構成」→「エンティティの削除」と進み、不要になったエンティティを定期的に消してあげると良いだろう。

以上

最初に一度設定してしまえば後は管理画面でいかようにも設定できるのは良いところだが、その「最初に設定する」ところが物凄く面倒臭い…。