「システム障害が発生しても、原因の特定に何時間もかかってしまう」「複数のサービスが連携していて、どこで問題が起きているのかわからない」――分散システムの監視に課題を感じていませんか?
本記事では、システム監視の新しい標準であるOpenTelemetryの基本的な仕組みから、実際の設定手順、トラブルシューティングまで、中小企業のIT担当者が実践できる内容をわかりやすく解説します。
OpenTelemetryとは?システム監視の新しい標準
システム障害が発生した時、「どこで問題が起きているのか分からない」という経験はありませんか?複数のサービスが連携する現代のWebシステムでは、問題の発見と解決がますます困難になっています。
OpenTelemetryは、こうした課題を解決する標準化された監視フレームワークです。クラウドネイティブコンピューティング財団(CNCF)が支援するオープンソースプロジェクトで、Microsoft、Google、Amazon、Datadogなど主要企業が積極的にサポートしています。
最大の特徴はベンダーニュートラルな設計です。従来は監視ツールごとに専用のライブラリを組み込む必要があり、ツール変更時にはコードの大幅な書き換えが必要でした。OpenTelemetryなら一度実装するだけで、送信先のバックエンドは設定ファイルで自由に変更できます。
中小企業にとっても導入メリットは大きく、オープンソースのためライセンス費用が不要で、段階的な導入が可能です。小規模なWebアプリケーションなら、数時間から1日程度で基本的な監視設定を完了できます。
3つの監視項目で実現する包括的な可視化
OpenTelemetryは「オブザーバビリティの3本柱」と呼ばれる要素を統合的に扱います。
トレース(Traces)は、リクエストがシステム内をどう流れたかを追跡します。ユーザーが商品を購入する際、フロントエンド→APIサーバー→データベース→決済サービスという流れを可視化し、各処理時間を測定してボトルネックを特定できます。
メトリクス(Metrics)は、CPU使用率、メモリ使用量、リクエスト数などを継続的に記録します。時系列でパフォーマンスを監視し、異常な傾向を早期発見できます。
ログ(Logs)は、システムで発生したイベントを記録します。トレースIDと関連付けることで、より詳細な分析が可能になります。
これら3つを組み合わせることで、「何が起きたか」「どこで起きたか」「どのくらい影響があるか」を総合的に把握できます。
OpenTelemetry監視設定の全体像
OpenTelemetryのアーキテクチャは3つの層で構成されています。
- 計測層(SDK): アプリケーション内でデータを収集
- 収集・処理層(Collector): データを集約・変換・フィルタリング
- 保存・可視化層(Backend): データを保存し、ダッシュボードで表示
この構造を理解することで、どこで何を設定すべきかが明確になります。
システム規模に応じた3つの構成パターン
パターン1: シンプル構成(小規模向け)
アプリケーション(SDK)から直接バックエンドに送信します。単一アプリケーション、月間1万PV以下に適しており、設定が簡単で管理も容易です。
パターン2: Collector経由構成(中規模向け)
アプリケーション(SDK)→Collector→バックエンドの流れでデータを処理します。複数アプリケーション、月間1万〜10万PVに適しており、データの集約・加工が可能でバックエンド変更も容易です。
パターン3: 分散Collector構成(大規模向け)
エージェントCollectorとゲートウェイCollectorを組み合わせます。マイクロサービス、月間10万PV以上に適していますが、構成が複雑になります。
まずはパターン1で始め、システムの成長に応じて段階的に移行することをお勧めします。
設定前の準備チェックリスト
スムーズな設定には事前準備が重要です。
環境情報:
- 使用するプログラミング言語とバージョン
- フレームワーク名とバージョン
- ホスティング環境(Azure App Service、AWS EC2など)
バックエンド情報:
- 使用する監視サービスの決定
- エンドポイントURLと認証情報(APIキー、接続文字列)
開発ツール:
- パッケージマネージャー(npm、pip、NuGetなど)
- バージョン管理システム(Git推奨)
よくある失敗パターンと対策
いきなり本番環境で設定:必ず開発環境で動作確認してから本番適用しましょう。
すべてのデータを送信:データ量が膨大になりコストが増大します。サンプリング率を適切に設定(開発環境100%、本番環境10-20%程度)してください。
エラーハンドリングの不足:監視システムの障害がアプリケーション全体に影響しないよう、送信エラーはログに記録するだけにします。
設定の属人化:設定内容をドキュメント化し、チームで共有しましょう。
【実践】OpenTelemetry SDKの基本設定
主要な環境での具体的な実装例を示します。
.NET環境での設定(Application Insights連携)
1. 必要なパッケージのインストール
dotnet add package OpenTelemetry.Extensions.Hosting
dotnet add package OpenTelemetry.Instrumentation.AspNetCore
dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore
2. Program.csでの設定
using Azure.Monitor.OpenTelemetry.AspNetCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry()
.UseAzureMonitor(options =>
{
options.ConnectionString = builder.Configuration["ApplicationInsights:ConnectionString"];
});
var app = builder.Build();
app.Run();
この設定だけで、HTTPリクエスト/レスポンスのトレース、依存関係、例外、パフォーマンスメトリクスが自動収集されます。
手動でスパンを追加する場合:
using System.Diagnostics;
public class OrderService
{
private static readonly ActivitySource ActivitySource = new("MyApp.OrderService");
public async Task<Order> ProcessOrder(int orderId)
{
using var activity = ActivitySource.StartActivity("ProcessOrder");
activity?.SetTag("order.id", orderId);
var order = await _repository.GetOrder(orderId);
return order;
}
}
Node.js・Python環境での設定
Node.js(Express)の場合:
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({
url: 'https://your-endpoint/v1/traces',
headers: { 'x-api-key': process.env.OTEL_API_KEY }
}),
instrumentations: [getNodeAutoInstrumentations()],
serviceName: 'my-node-service',
});
sdk.start();
Python(Flask)の場合:
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.flask import FlaskInstrumentor
trace.set_tracer_provider(TracerProvider())
otlp_exporter = OTLPSpanExporter(
endpoint="https://your-endpoint/v1/traces",
headers={"x-api-key": os.environ.get("OTEL_API_KEY")}
)
trace.get_tracer_provider().add_span_processor(
BatchSpanProcessor(otlp_exporter)
)
app = Flask(__name__)
FlaskInstrumentor().instrument_app(app)
接続文字列の安全な管理
接続文字列は環境変数で管理し、ソースコードにハードコーディングしないことが重要です。
環境変数での設定:
# Linux/Mac
export APPLICATIONINSIGHTS_CONNECTION_STRING="InstrumentationKey=..."
# Windows(PowerShell)
$env:APPLICATIONINSIGHTS_CONNECTION_STRING="InstrumentationKey=..."
セキュリティのベストプラクティス:
- 接続文字列を.gitignoreに追加してGitにコミットしない
- Azure Key VaultやAWS Secrets Managerなどのシークレット管理サービスを活用
- 環境ごとに異なるリソースを使用
サンプリング設定の実装
サンプリング率の目安:
| 環境 | 推奨サンプリング率 |
|---|---|
| 開発環境 | 100% |
| 本番環境(低トラフィック) | 50-100% |
| 本番環境(中トラフィック) | 10-30% |
| 本番環境(高トラフィック) | 1-10% |
.NETでの実装:
builder.Services.AddOpenTelemetry()
.WithTracing(tracerProviderBuilder =>
{
tracerProviderBuilder
.SetSampler(new TraceIdRatioBasedSampler(0.1)) // 10%サンプリング
.AddAspNetCoreInstrumentation();
});
Node.jsでの実装:
const { TraceIdRatioBasedSampler } = require('@opentelemetry/sdk-trace-base');
const sdk = new NodeSDK({
sampler: new TraceIdRatioBasedSampler(0.1), // 10%サンプリング
});
OpenTelemetry Collectorの設定
Collectorは必須ではありませんが、複数アプリケーションの統合管理やデータの複数バックエンド送信が必要な場合に有用です。
基本的な設定ファイル
Collectorの設定はYAMLファイルで行います。
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 10s
send_batch_size: 1024
exporters:
otlp:
endpoint: "your-backend-endpoint:4317"
headers:
api-key: "${API_KEY}"
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp]
Dockerで起動:
docker run -v $(pwd)/config.yaml:/etc/otel/config.yaml \
-p 4317:4317 -p 4318:4318 \
otel/opentelemetry-collector:latest \
--config=/etc/otel/config.yaml
監視データの活用と運用
トレースデータからの問題発見
トレースデータを活用することで、パフォーマンスのボトルネックやエラーの発生箇所を素早く特定できます。Application InsightsやJaegerなどのバックエンドで、リクエストの流れを可視化し、処理時間が長いスパンを特定しましょう。
アラート設定の基本
重要なメトリクスに対してアラートを設定します。エラー率が5%を超えた場合や、応答時間が3秒を超えた場合など、ビジネス影響の大きい指標を優先的に監視しましょう。
チーム内での情報共有
監視データはチーム全体で共有することが重要です。ダッシュボードのURLを共有し、定期的にパフォーマンスレビューを実施することで、継続的な改善につながります。
トラブルシューティング
データが送信されない時の確認ポイント
- 接続文字列の確認:環境変数が正しく設定されているか確認
- ネットワーク接続:ファイアウォールやプロキシ設定を確認
- ログの確認:アプリケーションログでエラーメッセージを確認
- バックエンドの状態:監視サービス側の障害がないか確認
パフォーマンスへの影響を最小化
OpenTelemetryのオーバーヘッドは通常1-5%程度ですが、以下の対策でさらに最小化できます。
- サンプリング率を適切に設定
- バッチ処理を有効化(デフォルトで有効)
- 不要な自動計測を無効化
- 非同期送信を使用(デフォルト)
OpenTelemetry監視を成功させるために
小さく始めて段階的に拡大
最初から完璧を目指さず、まずは1つのアプリケーションで基本的なトレース収集から始めましょう。動作確認ができたら、メトリクス、ログと段階的に拡大します。
限られたリソースでの運用体制
中小企業では専任の運用担当者を置くのは難しいため、以下のアプローチが有効です。
- クラウドサービスのマネージド監視機能を活用
- 重要なアラートのみに絞り込む
- ドキュメント化して属人化を防ぐ
- 定期的な見直しサイクルを設定(月1回程度)
外部パートナーへの相談タイミング
以下のような場合は、専門家への相談を検討しましょう。
- 複雑なマイクロサービス環境の監視設計
- 大量データの効率的な処理方法
- カスタム計測の実装
- パフォーマンスチューニング
OpenTelemetryは、標準化された監視フレームワークとして、システムの可視化と問題解決を強力にサポートします。この記事で紹介した手順に沿って、あなたの環境に最適な監視設定を実現してください。