メトリクスを取得して可視化したい際には、PrometeusとGrafanaを組み合わせたり、DataDogのようなAPMのサービスを導入することが多いと思います。
本記事では、上記以外の選択肢として、比較的簡単に導入でき、メトリクスの取得と可視化を行うことができるOSSであるSigNoz
を紹介します。
SigNozとは
https://signoz.io/
Open-sourceなAPMを標榜して開発されているOSSです。
GitHubリポジトリを見る限り、ちょうど一年くらい前(2021年1月)に生まれたOSSのようです。
SigNozのインストール
主に以下の手順を下敷きにしてインストールを進めます。
https://signoz.io/docs/deployment/docker/
SigNozには予めインストールスクリプトが用意されているのでGitHubから取得します。
# git clone https://github.com/SigNoz/signoz.git && cd signoz/deploy/
そのままカレントディレクトリでインストールスクリプトを実行します。
Dockerがインストールされてない場合、自動的にインストールされます。
# ./install.sh
# ./install.sh
👋 Thank you for trying out SigNoz!
Detecting your OS ...
++++++++++++++++++++++++
Setting up docker repos
Amazon Linux detected ...
Installing docker
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Cleaning repos: amzn2-core amzn2extra-docker
12 metadata files removed
4 sqlite files removed
0 metadata files removed
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
<中略>
++++++++++++++++++ SUCCESS ++++++++++++++++++++++
🟢 Your installation is complete!
🟢 Your frontend is running on http://localhost:3000
ℹ️ To bring down SigNoz and clean volumes : sudo docker-compose --env-file ./docker/clickhouse-setup/env/arm64.env -f docker/clickhouse-setup/docker-compose.yaml down -v
+++++++++++++++++++++++++++++++++++++++++++++++++
👉 Need help Getting Started?
Join us on Slack https://join.slack.com/t/signoz-community/shared_invite/zt-lrjknbbp-J_mI13rlw8pGF4EWBnorJA
📨 Please share your email to receive support & updates about SigNoz!
Email:
🙏 Thank you!
インストールが完了するとコンテナも起動されます。
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a269771a7dd5 signoz/frontend:0.5.2 "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp, 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp frontend
2029efe7bc1b signoz/otelcontribcol:0.4.2 "/otelcontribcol --c…" About a minute ago Up About a minute 0.0.0.0:1777->1777/tcp, :::1777->1777/tcp, 0.0.0.0:4317->4317/tcp, :::4317->4317/tcp, 0.0.0.0:8889->8889/tcp, :::8889->8889/tcp, 0.0.0.0:14268->14268/tcp, :::14268->14268/tcp, 0.0.0.0:55679-55681->55679-55681/tcp, :::55679-55681->55679-55681/tcp, 0.0.0.0:8887->8888/tcp, :::8887->8888/tcp, 0.0.0.0:49154->13133/tcp, :::49154->13133/tcp, 0.0.0.0:49153->55678/tcp, :::49153->55678/tcp clickhouse-setup_otel-collector_1
4477be9e6285 signoz/otelcontribcol:0.4.2 "/otelcontribcol --c…" About a minute ago Up About a minute 4317/tcp, 55679-55680/tcp clickhouse-setup_otel-collector-metrics_1
d7a3f5ac4a24 signoz/query-service:0.5.1 "./query-service -co…" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp query-service
eba12dfeaaa4 jaegertracing/example-hotrod:latest "/go/bin/hotrod-linu…" 2 minutes ago Up 2 minutes 8081-8083/tcp, 0.0.0.0:9000->8080/tcp, :::9000->8080/tcp hotrod
7be00406e27a signoz/alertmanager:0.5.0 "/bin/alertmanager -…" 2 minutes ago Up 2 minutes 0.0.0.0:9093->9093/tcp, :::9093->9093/tcp clickhouse-setup_alertmanager_1
eb25777f8221 yandex/clickhouse-server "/entrypoint.sh" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:8123->8123/tcp, :::8123->8123/tcp, 9009/tcp, 0.0.0.0:9001->9000/tcp, :::9001->9000/tcp clickhouse-setup_clickhouse_1
3a707b1d96be grubykarol/locust:1.2.3-python3.9-alpine3.12 "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 5557-5558/tcp, 0.0.0.0:8089->8089/tcp, :::8089->8089/tcp load-hotrod
早速、http://[ホスト]:3000
にアクセスすると、SigNozのアカウント作成画面が表示されます。
ログイン用のアカウントではないようなので、任意の内容でOKです。
先に進むとメトリクスの確認画面になりますが、まだサンプルアプリを稼働させていないので、SigNoz自身のメトリクス情報しか表示されていません。
次に、動作確認をするためのサンプルアプリを準備していきます。
サンプルアプリの準備
今回はTomcat上でアプリケーションを動作させ、そのメトリクスを取ってみたいと思います。
まずtomcatをインストールします。yumを利用せず直接ダウンロードします。Javaがインストールされていない場合は別途yum install java
でインストールしておいてください。
# wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.0.13/bin/apache-tomcat-10.0.13.tar.gz
解凍します。
# tar -xzvf apache-tomcat-10.0.13.tar.gz
tomcatはデフォルトでは8080ポートで動作しようとしますが、8080ポートは既にSigNozが利用しているため、tomcatで利用するポートを18080ポートに変更します。
# vi apache-tomcat-10.0.13/conf/server.xml
##Connector portを8080から18080に変更する##
<Connector port="18080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
ここまでで一旦tomcatを起動してみます。
# apache-tomcat-10.0.13/bin/startup.sh
Using CATALINA_BASE: /home/ec2-user/tomcat/apache-tomcat-10.0.13
Using CATALINA_HOME: /home/ec2-user/tomcat/apache-tomcat-10.0.13
Using CATALINA_TMPDIR: /home/ec2-user/tomcat/apache-tomcat-10.0.13/temp
Using JRE_HOME: /usr
Using CLASSPATH: /home/ec2-user/tomcat/apache-tomcat-10.0.13/bin/bootstrap.jar:/home/ec2-user/tomcat/apache-tomcat-10.0.13/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
無事起動しました。
http://[ホスト]:18080/
にアクセスすると、Tomcatのおなじみに画面が表示されます。
次に、公式のサンプルアプリをダウンロード&デプロイしてみます。
# wget https://tomcat.apache.org/tomcat-10.0-doc/appdev/sample/sample.war
webapps以下にダウンロードしたwarをmvします(ホットデプロイされます)。
# mv sample.war apache-tomcat-10.0.13/webapps/
catalinaログを見てみると、ホットデプロイされていることが分かります。
# tail apache-tomcat-10.0.13/logs/catalina.out
07-Dec-2021 08:24:52.054 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/home/ec2-user/tomcat/apache-tomcat-10.0.13/webapps/manager] has finished in [46] ms
07-Dec-2021 08:24:52.063 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-18080"]
07-Dec-2021 08:24:52.092 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [1307] milliseconds
07-Dec-2021 08:45:12.276 INFO [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/home/ec2-user/tomcat/apache-tomcat-10.0.13/webapps/sample.war]
07-Dec-2021 08:45:12.353 INFO [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/home/ec2-user/tomcat/apache-tomcat-10.0.13/webapps/sample.war] has finished in [76] ms
サンプルアプリのURL(http://[ホスト]:10080/sample
)にアクセスしてみます。
問題なくサンプルアプリもデプロイできていますね。
これでサンプルアプリの準備も完了です。
メトリクス取得の準備
SigNozではJavaアプリケーションはOpenTelemetry
を利用してメトリクスの取得を行うようです。
そのため、OpenTelemetry
のjarを取得しておきます。
# wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
次に、Tomcat起動時にこれらのjarを読み込むよう、Tomcatのbinフォルダにsetenv.sh
を新規作成しておきます。
# touch apache-tomcat-10.0.13/bin/setenv.sh
setenv.sh
には以下の定義を追加しておきます。
export CATALINA_OPTS="$CATALINA_OPTS -javaagent:/[jarをダウンロードしたパス]/opentelemetry-javaagent.jar"
export OTEL_METRICS_EXPORTER=none
export OTEL_EXPORTER_OTLP_ENDPOINT=http://[ホスト]:4317
export OTEL_RESOURCE_ATTRIBUTES=service.name=Tomcat-SigNoz
ここまでできたら準備完了です。
Tomcatを再起動します。
apache-tomcat-10.0.13/bin/shutdown.sh
apache-tomcat-10.0.13/bin/startup.sh
起動時のログを見ると、setenv.shが反映されていることが分かります。
# apache-tomcat-10.0.13/bin/startup.sh
Using CATALINA_BASE: /home/ec2-user/tomcat/apache-tomcat-10.0.13
Using CATALINA_HOME: /home/ec2-user/tomcat/apache-tomcat-10.0.13
Using CATALINA_TMPDIR: /home/ec2-user/tomcat/apache-tomcat-10.0.13/temp
Using JRE_HOME: /usr
Using CLASSPATH: /home/ec2-user/tomcat/apache-tomcat-10.0.13/bin/bootstrap.jar:/home/ec2-user/tomcat/apache-tomcat-10.0.13/bin/tomcat-juli.jar
Using CATALINA_OPTS: -javaagent:/home/ec2-user/tomcat/apache-tomcat-10.0.13/bin/opentelemetry-javaagent.jar
Tomcat started.
これでメトリクスを取得する準備が整いました。
最後にメトリクスを確認しましょう。
メトリクスの確認
もう一度、http://[ホスト]:3000/
にアクセスしてみます。
すると、setenv.sh
で設定した名称のメトリクスが増えていることが確認できます。
アプリケーション名をクリックすると、メトリクスのダッシュボード画面が表示されます。
アプリケーションのレイテンシ、時間別のリクエスト量、エラー率、呼び出されているエンドポイント数などを確認できます。
導入したサンプルアプリを操作すると、色々値が変わることを確認できます。
その他にも、自身でレイアウトするダッシュボードやアラート、登録してあるアプリケーション間のサービスマップなども表示することもできます。
以上で終わりです。
かなり簡単に導入できるので、ちょっとしたアプリを作成した際に導入してみると良いと思います。