OTEL CollectorでMac上のInstana AgentのログをInstanaバックエンドへの取り込み

## はじめに
本記事では、Macマシン（M1チップ搭載）上でInstana Agentのログを収集し、OpenTelemetry Collectorを活用してInstanaバックエンドに送信する手順を解説します。

## アーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629252/2a6abc11-ec40-fac5-64fc-61f738bc128d.png)


## 実現ステップ

### 1. Instana Agentのダウンロードと展開
1. Instana UIからMacOS用のAir-gapped(Archive)版Instana Agentをダウンロードします。
![Screenshot 2024-12-20 at 13.35.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629252/4d2b6142-9461-cd62-9306-1f433765c34a.png)

2. ダウンロードしたアーカイブを展開します。

### 2. Agent側にInstana Backend関連情報の設定
以下のファイルを編集し、Instanaバックエンドのホスト、ポート、プロトコル、エージェントキーを設定します。

ファイル: `/Users/userXXX/Downloads/installations/instana-agent_static/etc/instana/com.instana.agent.main.sender.Backend.cfg`

```plaintext
host=ingress-XXXXX-saas.instana.io
port=443
protocol=HTTP/2
key=XXXXXXXXXXXXXXX
```

### 3. OpenTelemetry Collection Pluginの有効化
以下の設定を追加し、OpenTelemetry Collection Pluginを有効化します。

ファイル: `/Users/userXXX/Downloads/installations/instana-agent_static/etc/instana/configuration.yaml`

```yaml
# OpenTelemetry Collector
com.instana.plugin.opentelemetry:
  enabled: true
```

### 4. OpenTelemetry Collector Contribのダウンロード
以下のコマンドを使用して、[Opentelemetryの公式サイト](https://github.com/open-telemetry/opentelemetry-collector-releases/releases/)からMac M1に対応したOpenTelemetry Collector Contribをダウンロードします。

```bash
curl -L https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.116.1/otelcol-contrib_0.116.1_darwin_arm64.tar.gz -o otelcol-contrib.tar.gz
```
補足情報：
OpenTelemetry Collectorには、Core（otelcol）とContrib（otelcol-contrib）の2つのバージョンがあります。Coreは最小限の基本機能を提供し、パフォーマンスに優れていますが、Contribは拡張機能が豊富で、ファイルログやシスログなど追加のReceiversやProcessorsをサポートしています。今回の場合に、Contribを利用することになります。

### 5. OpenTelemetry Collectorの設定
ダウンロードしたアーカイブを展開し、`otelcol-contrib`バイナリと同じディレクトリに以下の内容で`mac_config.yaml`を作成します。
#### mac_config.yamlの例
```yaml
receivers:
  filelog:
    include: [ "/Users/userXXX/Downloads/installations/instana-agent_static/data/log/agent.log" ]
    include_file_path: true
    include_file_name: true
    preserve_leading_whitespaces: true
    operators:
      - type: recombine
        combine_field: body
        is_first_entry: body matches "^[^\\s]"
        source_identifier: attributes["log.file.path"]

processors:
  transform/severity_parse:
    log_statements:
    - context: log
      statements:
      - set(severity_text, "Fatal") where IsMatch(body.string, ".*FATAL.*")
      - set(severity_text, "Error") where IsMatch(body.string, ".*ERROR.*")
      - set(severity_text, "Warn") where IsMatch(body.string, ".*WARN.*")
      - set(severity_text, "Info") where IsMatch(body.string, ".*INFO.*")
  batch: {}

exporters:
  otlp/instanaAgent:
    endpoint: "localhost:4317"
    tls:
      insecure: true

service:
  pipelines:
    logs:
      receivers: [filelog]
      processors: [transform/severity_parse, batch]
      exporters: [otlp/instanaAgent]
```

### 6. OpenTelemetry Collectorの起動
以下のコマンドを使用してOTEL Collectorを起動します。

```bash
./otelcol-contrib --config=./mac_config.yaml
```

### 7. Instana Agentの起動
Instana Agentのインストールディレクトリに移動し、以下のコマンドでAgentを起動します。

```bash
./start
```

ステータスを確認します。

```bash
./status
```

### 8. ポートの確認
以下のコマンドを使用してポート`4317`と`4318`がリッスンされているかを確認します。

```bash
% netstat -a | grep 4317
% netstat -a | grep 4318
```

### 9. Instana UIでエージェントの確認
Instana UIにアクセスし、Macのエージェントが検知されているか確認します。
![Screenshot 2024-12-20 at 13.55.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629252/956929f1-2140-edf3-e50b-97b31efbb2a4.png)


### 10. ログ収集の確認
Instana UIの「分析」→「ログ」画面で、エージェントログが収集されているか確認します。
![Screenshot 2024-12-20 at 13.57.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629252/57c7e858-1dc2-94be-04f8-2668bc92b376.png)


## 参考資料
- [Collecting Linux System Logs](https://www.ibm.com/docs/en/instana-observability/current?topic=opentelemetry-collecting-linux-system-logs)
- [OpenTelemetry Signal Logs](https://www.ibm.com/docs/en/instana-observability/current?topic=signals-logs)
- [Opentelemetry-collector-contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib)