Telegrafを使ってSumo LogicでTomcatのパフォーマンスを計測する

2024.02.07

早速ですが、Telegrafをご存知でしょうか。

Telegrafは、InfluxDataによって開発されたオープンソースのサーバーエージェントで、システムのメトリクスやイベント情報を収集し、InfluxDBなどのデータベースやシステムパフォーマンス可視化ツールに送信することができます。

特徴としては、プラグインベースのアーキテクチャでウェブシステム・データベースシステム・ネットワーク・コンテナやクラウドなど多種多様なメトリクスを収集することができます。
Telegrafのプラグインは300以上のインテグレーションが可能となっています。

また、サーバーエージェントは軽量な設計になっていて、稼働しているシステムへのパフォーマンス影響を与えることなく実行することができます。
Telegrafによって収集されるイベントやメトリクスは、システムやアプリケーションのパフォーマンスモニタリング、統計情報による長期的な傾向分析やシステムのキャパシティプランニング、システムの異常を検知しアラートのトリガーとするなど、ITサービスの安定稼働とユーザー体験の向上に活用することができます。

さらに、Telegrafは多くのシステムパフォーマンス可視化サービスへのデータ送信をサポートしているため、拡張性と柔軟性に優れた設計となっています。

今回は、データソースとしてApache Tomcatを、データのアウトプット先としてログデータやメトリクスなど様々なテレメトリデータの可視化ツールとして利用できるSumo Logicに連携してみました。

テスト環境

AWS環境に以下のインスタンスを構築して設定を行っていきます。

今回利用しているBitnamiは、WordpressやRedmineなどのウェブアプリケーションとPHPやDBなどのミドルウェアをすぐに使えるような状態でパッケージ化して、配布してくれるソリューションになります。
アプリケーションはLiferayというポータルを提供するウェブアプリケーションです。

主な構成は以下になります。

  • Liferay App
  • Apache Tomcat
  • Apache
  • MariaDB

1. AWSでLiferayのインスタンスを構築する

Sumo Logicのアカウントはあらかじめ作成している前提です。

2. インスタンスのタイムゾーンの設定

システムの時間設定がUTCタイムになっているので、タイムゾーンの設定を行います。

sudo timedatectl set-timezone Asia/Tokyo

設定が反映されたことを確認します。

timedatectl show
Timezone=Asia/Tokyo
LocalRTC=no
CanNTP=yes
NTP=yes
NTPSynchronized=yes
TimeUSec=Wed 2024-02-07 17:16:52 JST
RTCTimeUSec=Wed 2024-02-07 17:16:52 JST

Tomcatが出力するログは、独自のタイムゾーンを参照しにいくようなので、Tomcatログに関する設定を行います。

sudo vi /opt/bitnami/tomcat/bin/setenv.sh

「-Duser.timezone=」の値を「Asia/Tokyo」に置き換えます。

export JAVA_OPTS="${JAVA_OPTS} -Xms2560m -Xmx2560m -XX:MaxMetaspaceSize=512m -Djava.net.preferIPv4Stack=true -Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false -Dfile.encoding=UTF8 -Duser.timezone=Asia/Tokyo"

一度システムを再起動しておきます。

sudo shutdown -r now

2. Sumo Logicでメトリクス用のソース設定をする

Sumo Logicの管理コンソールにアクセスして、ソースの設定を行います。

Manage Data の Collection でHosted Collectorのソースを追加します。

HTTPS Logs & Metrics のソースを選択します。

名前とソースカテゴリの設定し、保存します。

設定後に、URLが表示されるのでコピーしておきます。

3. jolokia (JVMエージェント)をインストールする

Javaアプリケーションのリソース状況を監視するためにJMX (Jave Management Extentions) がフレームワークとして利用されます。
jolokiaはHTTP経由でJMXの情報を収集し、REST APIとして応答を返すJVMエージェントとして動作します。

ですので、jolokiaをインストールします。

jolokiaは3つのパターンでエージェントがありますが、今回warファイルでインストールします。
執筆時点で最新版は2.0.1なのですが、バージョン依存でうまく動作しなかったので、1.7.1のバージョンでインストールしています。

sudo wget https://repo1.maven.org/maven2/org/jolokia/jolokia-war-unsecured/1.7.1/jolokia-war-unsecured-1.7.1.war -O /opt/bitnami/tomcat/webapps/jolokia.war

Tomcatサービスを再起動します。

sudo /opt/bitnami/ctlscript.sh restart tomcat

curlコマンドで下記のようにアクセスしてみて、データおよびステータス200が返ってくることを確認します。

curl -i http://localhost:8080/jolokia/version
HTTP/1.1 200
Cache-Control: no-cache
Pragma: no-cache
Date: Wed, 07 Feb 2024 07:28:38 GMT
Expires: Wed, 07 Feb 2024 06:28:38 GMT
Content-Type: text/plain;charset=utf-8
Transfer-Encoding: chunked

{"request":{"type":"version"},"value":{"agent":"1.7.1","protocol":"7.2","config":{"listenForHttpService":"true","maxCollectionSize":"0","authIgnoreCerts":"false","agentId":"172.31.38.112-2646-26f96b85-servlet","agentType":"servlet","policyLocation":"classpath:\/jolokia-access.xml","agentContext":"\/jolokia","mimeType":"text\/plain","discoveryEnabled":"false","streaming":"true","historyMaxEntries":"10","allowDnsReverseLookup":"true","maxObjects":"0","debug":"false","serializeException":"false","detectorOptions":"{}","dispatcherClasses":"org.jolokia.http.Jsr160ProxyNotEnabledByDefaultAnymoreDispatcher","multicastGroup":"239.192.48.84","maxDepth":"15","authMode":"basic","authMatch":"any","canonicalNaming":"true","allowErrorDetails":"true","realm":"jolokia","includeStackTrace":"true","multicastPort":"24884","useRestrictorService":"false","debugMaxEntries":"100"},"info":{"product":"tomcat","vendor":"Apache","version":"9.0.85"}},"timestamp":1707290918,"status":200}

4. TomcatのWebアプリケーションマネージャを設定する

TomcatのWebアプリケーションマネージャから各種メトリクスを取得することができますのでこちらも設定していきます。

Webアプリケーションマネージャへアクセスできるようにロールおよびユーザー・パスワードを定義します。

sudo vi /opt/bitnami/tomcat/conf/tomcat-users.xml

下記の設定を追加します。

<role rolename="manager-gui" />
<role rolename="admin-gui" />
<user username="<username>" password="<password>" roles="manager-gui,admin-gui"/>

bitnamiでは、Webアプリケーションマネージャのアプリケーションページがデフォルトの場所になく、「/opt/bitnami/tomcat/webapps_default/」配下にあるので、コンテンツをコピーします。

sudo cp -R /opt/bitnami/tomcat/webapps_default/manager /opt/bitnami/tomcat/webapps/
sudo cp -R /opt/bitnami/tomcat/webapps_default/host-manager /opt/bitnami/tomcat/webapps/

Tomcatサービスを再起動します。

sudo /opt/bitnami/ctlscript.sh restart tomcat

curlコマンドで下記のようにアクセスしてみて、データおよびステータス200が返ってくることを確認します。

curl -u <username>:<passwrod> -i http://127.0.0.1:8080/manager/status/all?XML=true
HTTP/1.1 200
Cache-Control: private
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Content-Type: text/xml;charset=utf-8
Content-Length: 3237
Date: Wed, 07 Feb 2024 07:53:36 GMT

<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="/manager/xform.xsl" ?>
<status><jvm><memory free='1556683264' total='2684354560' max='2684354560'/><memorypool name='G1 Eden Space' type='Heap memory' usageInit='141557760' usageCommitted='1684013056' usageMax='-1' usageUsed='730857472'/><memorypool name='G1 Old Gen' type='Heap memory' usageInit='2542796800' usageCommitted='993001472' usageMax='2684354560' usageUsed='388425216'/><memorypool name='G1 Survivor Space' type='Heap memory' usageInit='0' usageCommitted='7340032' usageMax='-1' usageUsed='7340032'/><memorypool name='CodeHeap &apos;non-nmethods&apos;' type='Non-heap memory' usageInit='2555904' usageCommitted='3407872' usageMax='5828608' usageUsed='3330816'/><memorypool name='CodeHeap &apos;non-profiled nmethods&apos;' type='Non-heap memory' usageInit='2555904' usageCommitted='13565952' usageMax='122916864' usageUsed='13533184'/><memorypool name='CodeHeap &apos;profiled nmethods&apos;' type='Non-heap memory' usageInit='2555904' usageCommitted='51576832' usageMax='122912768' usageUsed='50009984'/><memorypool name='Compressed Class Space' type='Non-heap memory' usageInit='0' usageCommitted='37687296' usageMax='528482304' usageUsed='29553728'/><memorypool name='Metaspace' type='Non-heap memory' usageInit='0' usageCommitted='317837312' usageMax='536870912' usageUsed='287369232'/></jvm><connector name='"http-nio-8080"'><threadInfo  maxThreads="200" currentThreadCount="10" currentThreadsBusy="1" /><requestInfo  maxTime="340" processingTime="34775" requestCount="5335" errorCount="1" bytesReceived="3724272" bytesSent="43445608" /><workers><worker  stage="R" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="&#63;" virtualHost="&#63;" method="&#63;" currentUri="&#63;" currentQueryString="&#63;" protocol="&#63;" /><worker  stage="S" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="127.0.0.1" virtualHost="127.0.0.1" method="GET" currentUri="&#47;manager&#47;status&#47;all" currentQueryString="XML=true" protocol="HTTP&#47;1.1" /><worker  stage="R" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="&#63;" virtualHost="&#63;" method="&#63;" currentUri="&#63;" currentQueryString="&#63;" protocol="&#63;" /><worker  stage="R" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="&#63;" virtualHost="&#63;" method="&#63;" currentUri="&#63;" currentQueryString="&#63;" protocol="&#63;" /><worker  stage="R" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="&#63;" virtualHost="&#63;" method="&#63;" currentUri="&#63;" currentQueryString="&#63;" protocol="&#63;" /><worker  stage="R" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="&#63;" virtualHost="&#63;" method="&#63;" currentUri="&#63;" currentQueryString="&#63;" protocol="&#63;" /></workers></connector><connector name='"ajp-nio-127.0.0.1-8009"'><threadInfo  maxThreads="200" currentThreadCount="10" currentThreadsBusy="0" /><requestInfo  maxTime="0" processingTime="0" requestCount="0" errorCount="0" bytesReceived="0" bytesSent="0" /><workers></workers></connector></status>

5. Telegraf をインストールする

Telegrafのリポジトリを追加して、Telegrafをインストールします。

sudo apt-get install gnupg
wget -q https://repos.influxdata.com/influxdata-archive_compat.key
echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list
sudo apt-get update && sudo apt-get install telegraf

Telegrafの出力先にSumo LogicのHTTPエンドポイントを設定します。

sudo vi /etc/telegraf/telegraf.conf

下記の設定を追加します。には、前の手順で作成したSumo LogicのHTTP Logs & MetricsソースのURLを指定します。

[[outputs.sumologic]]
url = "<HTTP Endpoint>"
data_format = "prometheus"

Telegrafサービスを起動させます。

sudo systemctl start telegraf

6. Tomcat用のTelegrafプラグイン設定

再び、Telegrafの設定コンフィグを開き、Tomcat用のTelegrafプラグイン設定を追加します。

sudo vi /etc/telegraf/telegraf.conf

下記の設定を追加します。は前の手順で設定したWebアプリケーションマネージャのユーザーとパスワードです。
には、一般的に「prod、dev、stg」などを入れます。には、Webシステムを構成しているアプリケーション名などを入力します。

[[inputs.tomcat]]
url = "http://127.0.0.1:8080/manager/status/all?XML=true"

username = "<username>"
password = "<password>"
  [inputs.tomcat.tags]
    environment="<environment name>"
    component="webserver"
    webserver_system="tomcat"
    webserver_farm="<webserver farm>"

さらにjolokiaで取得するメトリクスの設定を追加します。

[[inputs.jolokia2_agent]]
urls = ["http://localhost:8080/jolokia"]

  [inputs.jolokia2_agent.tags]
    environment="<environment name>"
    component="webserver"
         webserver_system="tomcat"
         webserver_farm="<webserver farm>"

  [[inputs.jolokia2_agent.metric]]
    name  = "OperatingSystem"
    mbean = "java.lang:type=OperatingSystem"
    paths = ["ProcessCpuLoad","SystemLoadAverage","SystemCpuLoad","TotalPhysicalMemorySize","FreeSwapSpaceSize","TotalSwapSpaceSize","FreePhysicalMemorySize","AvailableProcessors"]
  [[inputs.jolokia2_agent.metric]]
    name  = "jvm_runtime"
    mbean = "java.lang:type=Runtime"
    paths = ["Uptime"]
  [[inputs.jolokia2_agent.metric]]
    name  = "jvm_memory"
    mbean = "java.lang:type=Memory"
    paths = ["HeapMemoryUsage", "NonHeapMemoryUsage", "ObjectPendingFinalizationCount"]
  [[inputs.jolokia2_agent.metric]]
    name     = "jvm_garbage_collector"
    mbean    = "java.lang:name=*,type=GarbageCollector"
    paths    = ["CollectionTime", "CollectionCount"]
    tag_keys = ["name"]
  [[inputs.jolokia2_agent.metric]]
    name       = "jvm_memory_pool"
    mbean      = "java.lang:name=*,type=MemoryPool"
    paths      = ["Usage", "PeakUsage", "CollectionUsage"]
    tag_keys   = ["name"]
    tag_prefix = "pool_"
  [[inputs.jolokia2_agent.metric]]
    name     = "GlobalRequestProcessor"
    mbean    = "Catalina:name=*,type=GlobalRequestProcessor"
    paths    = ["requestCount","bytesReceived","bytesSent","processingTime","errorCount"]
    tag_keys = ["name"]
  [[inputs.jolokia2_agent.metric]]
    name     = "JspMonitor"
    mbean    = "Catalina:J2EEApplication=*,J2EEServer=*,WebModule=*,name=jsp,type=JspMonitor"
    paths    = ["jspReloadCount","jspCount","jspUnloadCount"]
    tag_keys = ["J2EEApplication","J2EEServer","WebModule"]
  [[inputs.jolokia2_agent.metric]]
    name     = "ThreadPool"
    mbean    = "Catalina:name=*,type=ThreadPool"
    paths    = ["maxThreads","currentThreadCount","currentThreadsBusy"]
    tag_keys = ["name"]
  [[inputs.jolokia2_agent.metric]]
    name     = "Servlet"
    mbean    = "Catalina:J2EEApplication=*,J2EEServer=*,WebModule=*,j2eeType=Servlet,name=*"
    paths    = ["processingTime","errorCount","requestCount"]
    tag_keys = ["name","J2EEApplication","J2EEServer","WebModule"]
  [[inputs.jolokia2_agent.metric]]
    name     = "Cache"
    mbean    = "Catalina:context=*,host=*,name=Cache,type=WebResourceRoot"
    paths    = ["hitCount","lookupCount"]
    tag_keys = ["context","host"]

Telegrafサービスを再起動します。

sudo systemctl restart telegraf

ここまででメトリクスがSumo Logicが入ってきて可視化することができますが、ログの収集設定もやっていきます。

Sumo Logicのコレクターエージェントをインストールする

エージェントをダウンロードします。

wget "https://collectors.sumologic.com/rest/download/linux/64" -O SumoCollector.sh && chmod +x SumoCollector.sh

インストールトークンをSumo Logicで発行して、トークンを指定してエージェントをインストールします。

※インストールトークンはこちらの手順で発行、確認ができます。

sudo ./SumoCollector.sh -q -Vsumo.token_and_url=<install token>

エージェントが正しく起動していることを確認します。

sudo systemctl status collector
● collector.service - SumoLogic Collector
     Loaded: loaded (/etc/systemd/system/collector.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-02-07 09:20:39 JST; 9h ago
    Process: 570 ExecStart=/opt/SumoCollector/collector start sysd (code=exited, status=0/SUCCESS)
   Main PID: 694 (wrapper)
      Tasks: 42 (limit: 9431)
     Memory: 446.9M
        CPU: 3min 27.097s
     CGroup: /system.slice/collector.service
             ├─694 /opt/SumoCollector/./wrapper /opt/SumoCollector/./config/wrapper.conf wrapper.syslog.ident=collector wrapper.pidfile=/opt/Sum>
             └─745 /opt/SumoCollector/jre/bin/java -XX:+UseParallelGC -server -Djava.security.egd=file:/dev/./urandom -Xms64m -Xmx128m -Djava.li>

Feb 07 09:20:33 ip-172-31-38-112 systemd[1]: Starting SumoLogic Collector...
Feb 07 09:20:33 ip-172-31-38-112 collector[570]: Starting SumoLogic Collector...
Feb 07 09:20:39 ip-172-31-38-112 collector[570]: Waiting for SumoLogic Collector........
Feb 07 09:20:39 ip-172-31-38-112 collector[570]: running: PID:694
Feb 07 09:20:39 ip-172-31-38-112 systemd[1]: Started SumoLogic Collector.

Sumo Logicの管理コンソール側でもコレクターが登録され、起動していることを確認します。

Sumo Logicでログ収集のソースを設定する

Installed CollectorのAdd Sourceでソースを追加します。

Local Fileを選択します。

名前、ファイルパス、ソースカテゴリを入力します。
「+Add Fields」を選択して、前の手順のTelegrafの設定で入力していたTagと同じようにフィールド設定していきます。

タイムゾーンの設定を行い、後はデフォルト設定で保存します。

これで、ログが収集されだします。

TomcatのAppをインストール

Sumo LogicでTomcatのAppをインストールします。

App CatalogのTomcatで検索して「Apache Tomcat」を選択します。

ソースカテゴリーを設定します。

しばらくして、データが可視化されるのを確認します。

メトリクス、ログともに可視化できていることが分かります。

まとめ

Telegrafを使って、Tomcatのメトリクス情報を取得し、Sumo Logicへデータ連携と可視化を行ってみました。
Telegrafを使うと非常に多岐に渡ったシステムパフォーマンスを計測することができそうです。
今回具体的に何が可視化できたのかご紹介できなかったので、またの機会にご紹介したいと思います。

Tomcatのパフォーマンス可視化を実現する際に本エントリをぜひご参考にしていただければと思います。