Gitrend
🚀

Goアプリの可観測性、異次元へ!OTel Goがヤバい!🚀

Go 2026/2/7
Summary
みんな、マイクロサービスの闇に飲まれてない!? デバッグ地獄から救ってくれるのがOpenTelemetry Goだ! マジでこれ導入しない手はないよ!

概要:なにこれ凄い?

うおおおお、みんな聞いてくれ!最近僕が興奮しまくってるのが、このopen-telemetry/opentelemetry-goなんだよ!Go言語で開発してるみんななら、一度は『分散トレーシングってどうすりゃいいんだ!?』とか『マイクロサービス間の挙動、全然追えないんだけど!?』って壁にぶつかったことあるでしょ?僕もそうだったんだよね。 でも、このOpenTelemetry Goがあれば、そんな悩みは一発解決!これ、単なるライブラリじゃないんだ。可観測性(Observability)の未来を切り開く、まじでゲームチェンジャーなプロジェクトなんだよ!Goアプリケーションに統一されたAPIでトレーシング、メトリクス、ログを導入できるって、本当に夢みたいだと思わない!?

ここが推し!

サクッと試そう(使用例)

package main

import (
	"context"
	"fmt"
	"net/http"
	"time"

	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
	"go.opentelemetry.io/otel/sdk/resource"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
	semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
	"go.opentelemetry.io/otel/trace"
)

func initTracer() *sdktrace.TracerProvider {
	// コンソールに出力するだけのシンプルなExporter
	exporter, err := stdouttrace.New(stdouttrace.WithPrettyPrint())
	if err != nil {
		panic(err)
	}

	// TracerProviderを初期化
	tp := sdktrace.NewTracerProvider(
		sdktrace.WithBatchProcessor(sdktrace.NewSimpleSpanProcessor(exporter)),
		sdktrace.WithResource(resource.NewWithAttributes(
			semconv.SchemaURL,
			semconv.ServiceName("akira-otel-app"), // サービス名を指定!
		)),
	)
	otel.SetTracerProvider(tp) // グローバルなTracerProviderとして設定
	return tp
}

func main() {
	// TracerProviderを初期化して、deferでShutdownを呼ぶのを忘れずに!
	tp := initTracer()
	defer func() {
		if err := tp.Shutdown(context.Background()); err != nil {
			fmt.Printf("Error shutting down tracer provider: %v\n", err)
		}
	}()

	// Tracerのインスタンスを取得!
	tracer := otel.Tracer("akira.blog/sample")

	// HTTPハンドラ内でトレースを開始する例だね!
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		// リクエストのコンテキストから新しいSpanを開始!
		ctx, span := tracer.Start(r.Context(), "root-handler", trace.WithSpanKind(trace.SpanKindServer))
		defer span.End() // 忘れずにSpanを終了させるのがコツ!

		// 何か処理するフリ
		time.Sleep(100 * time.Millisecond)

		// 子Spanも作ってみよう!
		_, childSpan := tracer.Start(ctx, "sub-processing")
		defer childSpan.End()
		time.Sleep(50 * time.Millisecond)

		fmt.Fprintln(w, "Hello, OpenTelemetry Go World! Check your console for traces!")
	})

	fmt.Println("サーバー起動中! http://localhost:8080 にアクセスしてみてね!")
	http.ListenAndServe(":8080", nil)
}

使い方:

  1. go mod init <your-module-name>でGoモジュールを初期化。
  2. go get go.opentelemetry.io/otel go.opentelemetry.io/otel/exporters/stdout/stdouttrace go.opentelemetry.io/otel/sdkで必要なパッケージをインストール。
  3. 上記コードをmain.goにコピペして、go run main.goで実行!
  4. http://localhost:8080にアクセスすると、ターミナルにトレース情報が出力されるはず!うおおお、感動するぞ!

ぶっちゃけ誰向け?

まとめ

もうね、OpenTelemetry GoはGo言語を使った開発において、もはや必須ツールになりつつあるって断言しちゃうぞ!導入は確かに最初だけちょっと学習コストがあるかもしれないけど、そのリターンは計り知れないからね。マイクロサービスって便利だけど、運用が複雑になるのが難点。でも、OpenTelemetryがあれば、その複雑さを「見える化」できるんだ。これからのGoアプリケーション開発は、可観測性を前提とした設計がスタンダードになるはず!みんなも乗り遅れないように、今すぐOpenTelemetry Goを試してみてくれよな!僕ももっと深掘りして、色々なexporterとかreceiverとか試しまくるぞー!未来は明るいぜ!