Linux環境への Instanaエージェントの導入方法３通りを試してみた

お客様環境に導入するにあたり、Linux環境への Instanaエージェントの導入方法３通りを試してみましたので、それぞれの特徴を整理しておきたいと思います。
1. 自動インストール (一行インストール)
1. パッケージ (rpm deb)
1. アーカイブ (tar.gz)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/d4b88212-6c9f-4571-943e-fbe0e1f5899b.png)

# 1. １行インストール
オンラインでインターネットに接続できる環境でれば、この形態を利用することが一番多いのではないでしょうか。

![img232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/37d4add2-d13d-b077-1f9e-5121f08ffb22.png)

### 1-1. 導入の実行
一行コマンドを Copy & Paste実行するのみで、エージェントが導入され、Linuxにサービスとして登録され、製品が起動します。導入前提とのなるJVMも指定したイメージが導入可能です。
```
[root@demonode tmp]# curl -o setup_agent.sh https://setup.instana.io/agent && chmod 700 ./setup_agent.sh && sudo ./setup_agent.sh -a qxxxxxxxxxxxxxxxxxxxw -d qxxxxxxxxxxxxxxxxxxxw -t dynamic -e 128.168.111.126:1444 -j  -s
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24158  100 24158    0     0   3835      0  0:00:06  0:00:06 --:--:--  5438
Setting up the dynamic-j9 Instana agent for Linux
Are you sure? [y/N] y
Setting up Instana RPM repository
Updating YUM metadata
Installing Instana agent
GPG 鍵 0x31933E68 をインポート中:
 Userid     : "stan@instana.com <stan@instana.com>"
 Fingerprint: 386F 852E 8B64 01EB 34FD 86E8 6AA7 718D 3193 3E68
 From       : https://packages.instana.io/Instana.gpg
Instana agent service is active and agent is reinstalled. Service will be restarted
```
### 1-2. 導入されたイメージの削除
この方法で入れたエージェントを削除するコマンドは特にありません。
導入した /opt/instana/ 以下のディレクトリ を削除する形です。
エージェントの更新のために、入替える場合などは、各自必要なファイルをバックアップしておく必要がありますね。


# 2. rpm &deb パッケージ
Linux の標準的なパッケージを利用して導入する仕組みです。
インターネット環境に自由に接続できない 金融機関の環境などでは、このような事前ダウンロードする形式を選ぶことになるかと思います。

### 2-1. パッケージの確認
常に日々最新のビルドが作られダウンロード可能です。動的エージェントも静的エージェントも、JDKの種類(Azul Zule JDK v8, Eclipse OpenJ9 v11)、プロセッサーのアーキテクチャ(x86, ppc64, s390)、それぞれの組み合わせのものが用意されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/2a52a2c7-2275-68e7-8903-4737cf02b607.png)

パッケージ・サイズは、x86環境の静的エージェント、OpenJ9 VMで470MB程度でした
```
[root@demonode tmp]# ls -l instana-agent-static-j9-20231219-0931.x86_64.rpm
-rw-r--r--. 1 itzuser itzuser 472640331 12月 19 22:51 instana-agent-static-j9-20231219-0931.x86_64.rpm
```
### 2-2. パッケージの導入
RPMのパッケージですので、rpmコマンドで JVM含めサクッと導入可能です。事前にダウンロードも終わっているので、一行インストールよりも早く導入が完了します。さらに、サービスまで登録してくれて、自動で起動してきます。
```
[root@demonode01 tmp]# rpm -Uvh instana-agent-static-j9-20231219-0931.x86_64.rpm
警告: instana-agent-static-j9-20231219-0931.x86_64.rpm: ヘッダー V4 RSA/SHA256 Signature、鍵 ID 31933e68: NOKEY
Verifying...                          ################################# [100%]
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:instana-agent-static-j9-20231219-################################# [100%]
Configured tmpfiles.d via '/usr/lib/tmpfiles.d/instana-agent.conf' file
Synchronizing state of instana-agent.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable instana-agent
Created symlink /etc/systemd/system/multi-user.target.wants/instana-agent.service → /usr/lib/systemd/system/instana-agent.service.
```
### 2-3. 導入されたイメージの確認
導入された環境を確認します。指定した OpenJ9VM v11が導入されています。
```
[root@demonode01 tmp]# cd /opt/instana/agent/
[root@demonode01 agent]# ls
LICENSE  README  THIRD_PARTY.csv  THIRD_PARTY_LICENSES  VERSION  agent.pid  bin  data  etc  jvm  lib  licenses  lock  system
[root@demonode01 agent]# ./jvm/bin/java -version
openjdk version "11.0.20.1" 2023-08-24
IBM Semeru Runtime Open Edition 11.0.20.1 (build 11.0.20.1+1)
Eclipse OpenJ9 VM 11.0.20.1 (build openj9-0.40.0, JRE 11 Linux amd64-64-Bit Compressed References 20230824_836 (JIT enabled, AOT enabled)
OpenJ9   - d12d10c9e
OMR      - e80bff83b
JCL      - 0880e8df04 based on jdk-11.0.20.1+1)
```
一行インストールの際は、接続先やライセンスキーが、設定されて導入されますが、RPMでは環境変数から読込むかたちになっています。また、変更は再起動なく読み込まれる（Changes will be hot-reloaded)とあります。
検証でも導入された直後で起動していますが、あとから Instana バックエンドの hostとport、keyを登録することで、自動的に接続され、問題なく稼働しています。
通常であれば INSTANA_HOSTなどの環境変数を、Instana稼働ユーザーであるrootが読み込んでいるようにしておけば、編集もいらず問題ないですね。
```
[root@demonode01 agent]# cat ./etc/instana/com.instana.agent.main.sender.Backend.cfg
# Configures connection to the Instana SaaS. Changes will be hot-reloaded.

# Host and Port usually do not need to be changed, but can be modified to
# tunnel connections.
host=${env:INSTANA_HOST}
port=${env:INSTANA_PORT}
protocol=HTTP/2
　　(中略）
# Access Key for your SaaS installation. Is pre-filled during agent download.
key=${env:INSTANA_KEY}
```
### 2.4 エージェントの削除
一番便利だなと思ったのは、rpm -e できれいにパッケージを削除することです。細かいことを気にしなくても、前提となるJVM含めてきれいに削除してくれるのは、環境を汚さずにすむので助かります。
```
[root@demonode01 tmp]# rpm -e instana-agent-static-j9-20231219-0931
Instana Agent stopped.
Synchronizing state of instana-agent.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install disable instana-agent
Removed /etc/systemd/system/multi-user.target.wants/instana-agent.service.
Disable Instana Agent unit
Delete custom tmpfiles.d configuration /usr/lib/tmpfiles.d/instana-agent.conf
```
しかも、ユーザーが運用で変更する可能性のある 定義ファイルは残して削除されます。
このため、rpmであらためて導入する場合、rpm -Uvhでバージョンアップする場合も、以前の定義ファイルを利用してバージョンアップ可能ですので、非常に楽ちんですね。
```
[root@demonode01 opt]# ls -lR instana/
instana/:
合計 4
drwxr-xr-x. 3 root root 4096 12月 19 19:42 agent

instana/agent:
合計 4
drwxr-xr-x. 3 root root 4096 12月 19 19:42 etc

instana/agent/etc:
合計 16
drwxr-xr-x. 2 root root 4096 12月 19 19:42 instana
-rw-r-----. 1 root root 2232 12月 19 19:32 mvn-settings.xml
-rw-r-----. 1 root root 5827 12月 19 19:41 org.ops4j.pax.url.mvn.cfg

instana/agent/etc/instana:
合計 96
-rw-r-----. 1 root root   526 12月 19 19:41 com.instana.agent.bootstrap.AgentBootstrap.cfg
-rw-r-----. 1 root root   375 12月 19 19:41 com.instana.agent.main.config.UpdateManager.cfg
-rw-r-----. 1 root root  1056 12月 19 19:41 com.instana.agent.main.sender.Backend.cfg
-rw-r-----. 1 root root 84192 12月 19 19:32 configuration.yaml
```

# 3. tar.gz での導入
最後は 一般的なアーカイブ方式を解凍して導入する方法です。Linuxと違って、AIXなどはrpmパッケージがないのでこの選択肢を選ぶことになります。
ここでは、インターネットにアクセスできないことを前提に、静的パッケージをベースに検証しました。
エージェント導入画面にも記載がありますが、この形式では稼働前提となるJVMは含まれていないので、RHELやUbuntuなどのOSが提供するJVMを利用する必要があります。

### 3-1. アーカイブ・ファイルの解凍
```
[root@demonode01 tmp]# ls -l instana-agent-linux-64bit.tar.gz
-rw-r--r--. 1 itzuser itzuser 288870544 12月 19 19:30 instana-agent-linux-64bit.tar.gz

[root@demonode01 tmp]# tar -xvf instana-agent-linux-64bit.tar -C /opt/
instana-agent/
instana-agent/licenses/
instana-agent/THIRD_PARTY.csv
instana-agent/THIRD_PARTY_LICENSES
instana-agent/licenses/org.apache.maven.resolver_maven-resolver-api.license
instana-agent/licenses/org.apache.karaf.features_org.apache.karaf.features.core.0.notice
instana-agent/licenses/io.grpc_grpc-protobuf.license
instana-agent/licenses/org.ops4j.base_ops4j-base-lang.license
(後略）
```
### 3-2. 展開された環境の確認
なぜか 導入パスは /opt/instana-agent/ です。
圧縮方式の場合は、すでに Instanaの接続先は登録されているようです。
```
[root@demonode01 tmp]# cd /opt/instana-agent/
[root@demonode01 instana-agent]# cat etc/instana/com.instana.agent.main.sender.Backend.cfg
# Configures connection to the Instana SaaS. Changes will be hot-reloaded.

# Host and Port usually do not need to be changed, but can be modified to
# tunnel connections.
host=128.168.111.126
port=1444
protocol=HTTP/2
 (中略）
# Access Key for your SaaS installation. Is pre-filled during agent download.
key=qxxxxxxxxxxxxxxxxxxnw
[root@demonode01 instana-agent]#
```
### 3-3. Instanaエージェントの起動
アーカイブには、稼働前提となるJVMが入っていないので、明示的にJAVA_HIOMEでJavaのパスを伝えてあげる必要があります。
また、サービスには自動的には登録されないので、マニュアルでサービスの登録をする必要があります。
```
root@demonode01 instana-agent] # cd bin
[root@demonode01 bin]
export JAVA_HOME=/etc/alternatives/jre_1.8.0
[root@demonode01 bin]# ./start
The amount of memory to be used by the agent is 9223372036854771712 bytes (from: /sys/fs/cgroup/memory/memory.limit_in_bytes).
The amount of memory to be used by the agent seems too large (9007199254740989 KB, which is bigger or equal to the 3996060 KB total system memory), so the agent may actually not be restricted to a fixed amount of memory. To avoid consuming too much memory, the agent will use up to 528m.
If you want to make available more or less memory to the agent, set the 'MemoryMax' property accordingly in the 'instana-agent.service' SystemD unit.
```

### 3-4. Instanaエージェントの削除、更新
アーカイブ・ファイルを展開するかたちなので、エージェントを置き換える場合は、一旦現在の環境を削除またはtarに退避して、新しいイメージを展開する必要があります。
構成定義ファイルも誤って削除しないように事前い退避が必要ですね。

# まとめ
ざっと確認したところ、以下のような違いがあるようです。お客様の求めている姿に応じて、導入方法を検討してみてください。

||一行インストール|rpmパッケージ|tar.gzアーカイブ|
|:--:|:--:|:--:|:--:|
|インターネット接続要否|○|x|x|
|JVM同時導入|○|○|x|
|バックエンド接続先情報|○|環境変数|○|
|サービス登録|○|○|x|
|運用容易性（削除/更新)|△|○|△|