Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Exploring the OpenTelemetry Client Library for Go
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Akari
June 06, 2024
Programming
470
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Exploring the OpenTelemetry Client Library for Go
Akari
June 06, 2024
More Decks by Akari
See All by Akari
Exploring the Implementation of “t.Run”, “t.Parallel”, and “t.Cleanup”
akarin
2
420
EC2 からの脱出劇:多用途なサーバの全役割をサーバレス・コンテナ環境へ
akarin
2
1.7k
RAILS_ENVを統合する取り組み: 開発用デプロイ環境をよりシンプルに
akarin
3
1.8k
モノレポを採用しているマイクロサービスのCI/CDの現状と課題
akarin
2
400
Other Decks in Programming
See All in Programming
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
190
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
550
「人を評価する AI」の設計と実装
ryoyanara
0
270
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
260
Press start. Python's next generation.
willingc
PRO
3
290
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
460
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
4.1k
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
560
typoなんかねぇよ
raspython3
0
630
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
100
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
240
Featured
See All Featured
From π to Pie charts
rasagy
0
340
Practical Orchestrator
shlominoach
191
12k
YesSQL, Process and Tooling at Scale
rocio
174
15k
First, design no harm
axbom
PRO
2
1.3k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
310
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
ラッコキーワード サービス紹介資料
rakko
1
4.6M
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
How STYLIGHT went responsive
nonsquared
100
6.3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Transcript
Exploring the OpenTelemetry Client Library for Go (Unofficial)Go Conference 2024
Pre Party 7 June, 2024 Keisuke Akari @k-akari @akarin0519
1. Reference Please refer the following blog post if you’d
like to know this topic in more detail. - Exploring the OpenTelemetry Client Library for Go
2. What is the OpenTelemetry? There are two key points:
1. Vendor- and Tool-agnostic 2. Focused on the generation, collection, management, and export of telemetry
3. Looking More Specifically Image Source: https://opentelemetry.io/docs/specs/otel/library-guidelines/
4. Where Should We Delve into? - One Signal (I’m
going to single out Tracing here) - Context Propagation Image Source: https://opentelemetry.io/docs/specs/otel/overview/#opentelemetry-client-architecture
5. Structure of the Client Library ./opentelemetry-go ├── internal #
Unexported Detailed Implementation │ └── global │ ├── trace.go │ └── state.go ├── sdk # Core Functionalities │ ├── trace │ │ ├── span.go │ │ └── tracer.go │ ├── go.mod │ └── go.sum ├── trace # Trace API │ ├── config.go │ ├── context.go │ ├── trace.go │ ├── go.sum │ └── go.mod ├── trace.go # API ├── go.mod └── go.sum
6. How Apps Use the Client Library for Tracing package
main import ( "go.opentelemetry.io/otel" sdktrace "go.opentelemetry.io/otel/sdk/trace" ) func main() { // tp := sdktrace.NewTracerProvider( sdktrace.WithSampler(sdktrace.AlwaysSample()), ) otel.SetTracerProvider(tp) ctx, span := otel.Tracer("example").Start(ctx, "span name") defer span.End() // }
7. What is the Context Propagation?
8. Diving into Context Propagation package main import ( "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
"go.opentelemetry.io/otel" "go.opentelemetry.io/otel/propagation" "google.golang.org/grpc" ) func main() { // s := grpc.NewServer(grpc.StatsHandler(otelgrpc.NewServerHandler( otelgrpc.WithPropagators(otel.GetTextMapPropagator()), ))) conn, err := grpc.NewClient("endpoint", grpc.WithStatsHandler(otelgrpc.NewClientHandler( otelgrpc.WithPropagators(otel.GetTextMapPropagator()), ))) // }
NewServerHandler returns stats.Handler. 9. otelgrpc.NewServerHandler package otelgrpc import "google.golang.org/grpc/stats" type
serverHandler struct { *config } func NewServerHandler(opts ...Option) stats.Handler { h := &serverHandler{ config: newConfig(opts, "server"), } return h } package stats type Handler interface { TagRPC(context.Context, *RPCTagInfo) context.Context HandleRPC(context.Context, RPCStats) TagConn(context.Context, *ConnTagInfo) context.Context HandleConn(context.Context, ConnStats) }
In TagRPC method, propagator extracts context from metadata and embed
it to context.Context. 10. Extracting Context func (h *serverHandler) TagRPC( ctx context.Context, info *stats.RPCTagInfo, ) context.Context { ctx = extract(ctx, h.config.Propagators) // omitted ctx, _ = h.tracer.Start( trace.ContextWithRemoteSpanContext( ctx, trace.SpanContextFromContext(ctx), ), // omitted ) // omitted return context.WithValue(ctx, gRPCContextKey{}, &gctx) } import ( "google.golang.org/grpc/metadata" "go.opentelemetry.io/otel/propagation" ) func extract( ctx context.Context, propagators propagation.TextMapPropagator, ) context.Context { md, ok := metadata.FromIncomingContext(ctx) if !ok { md = metadata.MD{} } return propagators.Extract(ctx, &metadataSupplier{ metadata: &md, }) }
NewClientHandler returns stats.Handler. 11. otelgrpc.NewClientHandler package otelgrpc import "google.golang.org/grpc/stats" type
clientHandler struct { *config } func NewClientHandler(opts ...Option) stats.Handler { h := &clientHandler{ config: newConfig(opts, "client"), } return h } package stats type Handler interface { TagRPC(context.Context, *RPCTagInfo) context.Context HandleRPC(context.Context, RPCStats) TagConn(context.Context, *ConnTagInfo) context.Context HandleConn(context.Context, ConnStats) }
In TagRPC method, propagator retrieves context from context.Context and inject
it to metadata. 12. Injecting Context func (h *clientHandler) TagRPC( ctx context.Context, info *stats.RPCTagInfo, ) context.Context { // omitted ctx, _ = h.tracer.Start( ctx, // omitted ) // omitted return inject( context.WithValue(ctx, gRPCContextKey{}, &gctx), h.config.Propagators, ) } import ( "google.golang.org/grpc/metadata" "go.opentelemetry.io/otel/propagation"re ) func inject(ctx context.Context, propagators propagation.TextMapPropagator, ) context.Context { md, ok := metadata.FromOutgoingContext(ctx) if !ok { md = metadata.MD{} } propagators.Inject(ctx, &metadataSupplier{ metadata: &md, }) return metadata.NewOutgoingContext(ctx, md) }
Thank you for your attention🙏