OpenTelemetryについて
目次
概要
OpenTelemetryは分散トレーシングとメトリクスの観測性データを収集し、分析・監視・トラブルシューティングを行うためのオープンソースのツールキットです。分散システムのコンテキストをキャプチャし、リクエストの経路やパフォーマンスの問題を追跡するための一貫した手法を提供します。
機能/詳細
OpenTelemetryには以下の主な機能があります:
トレーシング
分散トレーシングを使用して、リクエストの経路やリクエスト間のタイミング情報を収集します。これにより、アプリケーションのコンポーネント間の相互作用の可視化とトラブルシューティングが容易になります。
メトリクス
アプリケーションのパフォーマンスやリソース利用率を測定し、カスタムメトリクスを作成することができます。これにより、アプリケーションのパフォーマンス改善や容量計画などが可能となります。
コンテキストプロパゲーション
分散トレーシングとメトリクスデータ収集のために、リクエストやトランザクションのコンテキスト情報を自動的にキャプチャし、伝播します。この機能により、複数のコンポーネントやマイクロサービスが密接に連携する場合でもトレーサビリティを維持することができます。
インストルメンテーション
OpenTelemetryは、Java、Go、C#などの主要なプログラミング言語に対応しています。さまざまなフレームワークやライブラリをインストルメンテーションし、トレースデータやメトリクスデータを収集するためのAPIを提供します。
なぜ必要か
分散システムのコンポーネントが増えるにつれ、それらの相互作用やパフォーマンスのトラッキングは難しくなります。OpenTelemetryを使用することで、トレーシングやメトリクスデータの収集と分析が容易になります。これにより、システムのパフォーマンスの問題を特定し、ボトルネックを解消することができます。
サンプルコード
Java
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
public class OpenTelemetryExample {
public static void main(String[] args) {
// OpenTelemetryの初期化
OtlpGrpcSpanExporter spanExporter = OtlpGrpcSpanExporter.builder()
.setEndpoint("your-exporter-endpoint")
.build();
SimpleSpanProcessor spanProcessor = SimpleSpanProcessor.builder(spanExporter).build();
OpenTelemetrySdk.builder().setTracerProvider(DefaultTracerProvider.builder().addSpanProcessor(spanProcessor).build()).build();
// トレースの作成と処理
Tracer tracer = OpenTelemetry.getGlobalTracer("example-tracer");
Span span = tracer.spanBuilder("example-operation").startSpan();
span.addEvent("example-event");
span.end();
}
}
Go
package main
import (
"log"
"net/http"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.opentelemetry.io/otel"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
func main() {
// OpenTelemetryの初期化
provider := sdktrace.NewTracerProvider()
otel.SetTracerProvider(provider)
// HTTPサーバーの作成
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
_, span := otel.Tracer("example-tracer").Start(req.Context(), "example-operation")
defer span.End()
span.AddEvent("example-event")
w.Write([]byte("Hello, World!"))
})
// OpenTelemetryでHTTPサーバーをラップ
handler := otelhttp.NewHandler(mux, "/")
log.Fatal(http.ListenAndServe(":8080", handler))
}
C#
using System;
using OpenTelemetry;
using OpenTelemetry.Trace;
using OpenTelemetry.Resources;
public class OpenTelemetryExample
{
public static void Main()
{
// OpenTelemetryの初期化
var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("example-service"))
.AddOtlpExporter()
.Build();
// トレースの作成と処理
using var tracer = tracerProvider.GetTracer("example-tracer");
using (var span = tracer.StartActiveSpan("example-operation"))
{
span?.AddEvent("example-event");
Console.WriteLine("Hello, World!");
}
}
}
まとめ
OpenTelemetryは分散トレーシングとメトリクスデータの収集・観測性のためのオープンソースのツールキットです。トレーシングやメトリクスの収集、コンテキストプロパゲーション、インストルメンテーションなど、さまざまな機能を提供しています。Java、Go、C#などの言語で使用することができます。分散システムの可視化やトラブルシューティングに役立つツールとして活用されます。