C言語アプリに OpenTelemetry C++ SDK を統合して Instana でトレースを可視化

## **🎯 はじめに**  
OpenTelemetry C++ SDKを**C言語ベースのアプリケーション** に統合し、利用して、分散トレース、メトリクス、ログを収集して、**Instana SaaS Backend** や **OpenTelemetry Backend** に送信する方法を紹介します。  

- **対象読者**
  - OpenTelemetry を **C/C++ プロジェクト** に統合したい人
  - Instana でC言語で作成したアプリのトレースやメトリクスを管理したい人
  - C 言語で Web API を開発しつつ、観測可能性（Observability）を向上させたい人**

- **この記事でわかること**
  - C 言語で **[OpenTelemetry C++ SDK](https://github.com/open-telemetry/opentelemetry-cpp/) を利用** し、トレース・メトリクス・ログを送信する方法
  - **OTLP (gRPC/HTTP) を使い、Instana にデータを送信する方法**
  - **C 言語の Web サーバーに OpenTelemetry を統合するサンプル**

## **📌 プロジェクト概要**
今回紹介するプロジェクトは、C 言語ベースの **MicroHTTPD Web サンプルサービス** です。  
このWeb Serviceに **OpenTelemetry SDK を統合** し、以下の機能を実装します。

| 機能                  | 説明 |
|-----------------------|-----------------------------|
| **📌 トレース（Tracing）** | API のリクエスト・レスポンスを可視化 |
| **📊 メトリクス（Metrics）** | アクセス数などのパフォーマンス測定 |
| **📜 ロギング（Logging）** | OpenTelemetry 構造化ログを活用 |

**📌 GitHub:**  
👉 [GSSJacky/opentelemetry-c-integration](https://github.com/GSSJacky/opentelemetry-c-integration)
ps:
現時点でトレースのみ完全動作確認しました。今後Metricsとログのテストを行う予定です。

## **🛠 環境構築**
macOS 上で OpenTelemetry を有効にするために、必要なツールをインストールします。
ps:
今回のサンプルはmacOS(apple M1)で検証しました。今後ubuntu22に追加テストを行う予定です。

### **1️⃣ 必要パッケージのインストール**
```bash
brew install cmake curl vcpkg microhttpd
```

### **2️⃣ vcpkg のセットアップ**
```bash
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
export VCPKG_ROOT=$(pwd)
export CMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake
```

### **3️⃣ 必要ライブラリのインストール**
```bash
$VCPKG_ROOT/vcpkg install "opentelemetry-cpp[core,otlp-grpc]" microhttpd protobuf grpc
```

---

## **📌 プロジェクトのビルド**
### **クローン & ビルド**
```bash
git clone https://github.com/GSSJacky/opentelemetry-c-integration.git
cd opentelemetry-c-integration
mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_FILE
make -j$(sysctl -n hw.logicalcpu)
```

## **📊 Instana で可視化**
### **Instana エージェントのインストール**
Instanaドキュメントに沿ってインストールいただければと思います。

### **Instana の OpenTelemetry 設定**
`configuration.yaml` に以下を追加：
```yaml
com.instana.plugin.opentelemetry:
  enabled: true
```
エージェントを再起動：
```bash
sudo systemctl restart instana-agent.service
netstat -ano | grep 4317
```
✅ **`0.0.0.0:4317` が表示されれば成功！**


### ** OpenTelemetry 環境変数を設定**
下記の二つをどちら一つの環境変数を設定いただければと思います。
1.Instana Agent経由で送信する場合に
```bash
export OTEL_SERVICE_NAME="ClangOTELServiceJacky"
export OTEL_EXPORTER_OTLP_INSECURE=true
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="http://localhost:4317"
```

2.直接Instana SaaS BackendのOTLP Acceptorに送信する場合に
```bash
export OTEL_SERVICE_NAME="ClangOTELServiceJacky"
export OTEL_EXPORTER_OTLP_INSECURE=false
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="https://otlp-[RegionName]-saas.instana.io:4317"
export OTEL_EXPORTER_OTLP_HEADERS="x-instana-key=[AgentkeyXXXXX]"
```


### **C言語のWeb Serviceの起動**
以上CMakeでコンパイルしたBuildフォルダにあるweb_serverを起動する
```bash
./web_server
```

## **📡 API の実行 (curl テスト)**
### **1️⃣ カタログを挿入**
```bash
curl -X POST http://localhost:8080/insertCatalog -d "id=8&catalogname=Product8D"
```

### **2️⃣ ID でカタログ取得**
```bash
curl "http://localhost:8080/getCatalog?id=2"
curl "http://localhost:8080/getCatalog?id=8"
```

### **3️⃣ Web 検索**
```bash
curl "http://localhost:8080/searchfromURL?q=openai"
```


### **3️⃣ Instana UI での確認**
1. **Instana にログイン**
2. **「アプリケーション」 > 「サービス」 > `ClangOTELServiceJacky` を選択**
3. **「呼び出しの分析」でトレースの詳細を確認**
図１
![Screenshot 2025-03-01 at 23.04.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629252/623cb9e8-e441-4749-afce-4bc5bc882ebf.png)
図２
![Screenshot 2025-03-01 at 23.06.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629252/38bcf9ed-9e5b-4e44-ace6-7bdacdac3a6a.png)
図３
![Screenshot 2025-03-01 at 23.07.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629252/c4ce352d-ce3e-4364-a92e-a3eb765a55cb.png)


## **🔍 Cmakeでコンパイルする際に依存ライブラリの確認ポイント**
プロジェクトに必要なライブラリがインストールされているか確認するには、以下のコマンドを実行してください。

### **1️⃣ OpenTelemetry の確認**
```bash
ls ~/vcpkg/installed/arm64-osx/lib | grep opentelemetry
```
✅ **期待される出力:**
```
libopentelemetry_trace.a
libopentelemetry_metrics.a
libopentelemetry_logs.a
```

### **2️⃣ gRPC の確認**
```bash
find ~/vcpkg/installed/arm64-osx -name '*grpc*.a'
```
✅ **期待される出力:**
```
~/vcpkg/installed/arm64-osx/lib/libgrpc.a
~/vcpkg/installed/arm64-osx/lib/libgrpc++_reflection.a
~/vcpkg/installed/arm64-osx/lib/libgrpc++.a
```

### **3️⃣ インストール済みパッケージの確認**
```bash
$VCPKG_ROOT/vcpkg list | grep -E 'opentelemetry|grpc|protobuf|microhttpd'
```
✅ **期待される出力:**
```
opentelemetry-cpp:x64-osx        1.10.0       OpenTelemetry C++ SDK
grpc:x64-osx                      1.58.0       Open-source RPC framework
protobuf:x64-osx                   3.21.0      Protocol Buffers (protobuf)
microhttpd:x64-osx                 0.9.76      Small HTTP server library
```



## **参考** 
[OpenTelemetry C++ client SDK packageドキュメント](https://www.ibm.com/docs/en/instana-observability/current?topic=sdks-c)
[OpenTelemetry C++ Github Project](https://github.com/open-telemetry/opentelemetry-cpp/)
[GSSJacky/opentelemetry-c-integration](https://github.com/GSSJacky/opentelemetry-c-integration)