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
Akari
June 06, 2024
Programming
460
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
410
EC2 からの脱出劇:多用途なサーバの全役割をサーバレス・コンテナ環境へ
akarin
2
1.7k
RAILS_ENVを統合する取り組み: 開発用デプロイ環境をよりシンプルに
akarin
3
1.8k
モノレポを採用しているマイクロサービスのCI/CDの現状と課題
akarin
2
400
Other Decks in Programming
See All in Programming
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
200
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
300
Building a Meta Ray-Ban display app
akkeylab
0
160
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
240
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
390
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
340
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
300
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
510
VibeCodingからAgenticWorkflowへ
starfish719
0
630
実装をデザインガイドラインに追従させるための取り組み / 260731-dip-mosh-design-system
dachi023
0
4.4k
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.7k
Built Our Own Background Agent at LayerX
layerx
PRO
10
5.7k
Featured
See All Featured
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
Become a Pro
speakerdeck
PRO
31
6.2k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.4k
Designing for Timeless Needs
cassininazir
1
450
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
800
Accessibility Awareness
sabderemane
1
180
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Utilizing Notion as your number one productivity tool
mfonobong
4
550
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
210
The Mindset for Success: Future Career Progression
greggifford
PRO
0
450
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🙏