SigNozでサクッとメトリクスを取得＆可視化する

メトリクスを取得して可視化したい際には、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です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/d6d50a1c-e800-60cc-1bed-3f3aaf1a9672.png)
先に進むとメトリクスの確認画面になりますが、まだサンプルアプリを稼働させていないので、SigNoz自身のメトリクス情報しか表示されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/e7a856b2-48ae-3f1b-2e3c-af79e9e9c20b.png)
次に、動作確認をするためのサンプルアプリを準備していきます。

# サンプルアプリの準備
今回は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のおなじみに画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/c6a48a6d-2979-0048-47d4-043627ab4498.png)

次に、公式のサンプルアプリをダウンロード＆デプロイしてみます。

```
# 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`）にアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/2ec7776b-b08e-a814-c2bd-8f28c7bdade3.png)


問題なくサンプルアプリもデプロイできていますね。
これでサンプルアプリの準備も完了です。

# メトリクス取得の準備
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`には以下の定義を追加しておきます。

```bash
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`で設定した名称のメトリクスが増えていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/b613ae20-46ce-1a15-2276-1b647ab77364.png)

アプリケーション名をクリックすると、メトリクスのダッシュボード画面が表示されます。
アプリケーションのレイテンシ、時間別のリクエスト量、エラー率、呼び出されているエンドポイント数などを確認できます。
導入したサンプルアプリを操作すると、色々値が変わることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/6b035e27-5d09-effe-3e63-08d2f44f85dc.png)

その他にも、自身でレイアウトするダッシュボードやアラート、登録してあるアプリケーション間のサービスマップなども表示することもできます。
![servicemap.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/ec28e5c5-4013-db62-4dcd-2d4047152746.gif)


以上で終わりです。
かなり簡単に導入できるので、ちょっとしたアプリを作成した際に導入してみると良いと思います。