Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
My Favorite Talks at GopherCon 2019
Search
Yuki Ito
August 20, 2019
Technology
2.1k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
My Favorite Talks at GopherCon 2019
Yuki Ito
August 20, 2019
More Decks by Yuki Ito
See All by Yuki Ito
newmo の創業を支える Software Architecture と Platform Engineering
110y
5
3.7k
Modular Monolith Go Server with GraphQL Federation + gRPC
110y
1
1.2k
Modular Monolith + Go @ newmo
110y
1
1.3k
Go + GraphQL @ newmo
110y
3
1k
Architect / Platform Team at KAUCHE
110y
1
730
Cloud Run + Observability / Reliability @ KAUCHE
110y
0
690
Cloud Run CI/CD + QA @ KAUCHE
110y
1
690
Microservices on Cloud Run @ KAUCHE
110y
0
330
KAUCHE Loves Go
110y
0
550
Other Decks in Technology
See All in Technology
AIに任せた品質は、誰が見立てるのか - AI時代のテストマネジメント
nakanao
3
2.5k
Claude Codeを「使うほど育つ」AI秘書にするノウハウ
minorun365
PRO
32
29k
おい、エージェントを使って終わらせろ
nwiizo
2
760
2026_devsumi_ozono.pdf
o3
3
530
Azure Serverless 2026:Production-ready な AI エージェント基盤 / Azure Serverless 2026: Production-Ready AI Agent Platform
miyake
2
370
Oracle Cloud Network Path Analyzerを試してみた/I Tried Out Oracle Cloud Network Path Analyzer
masakiokuda
1
100
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
5
1.8k
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
25
16k
作って終わりじゃないサーバーレス 〜9年運用する大規模EC物流API基盤の設計・運用のリアル〜
zozotech
PRO
0
300
積み重なった技術負債への挑戦 〜初手としての全社ゴト化〜
techtekt
PRO
0
1.4k
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
1
2.4k
GoのInterface内部構造から学ぶ!最高パフォーマンスを出すコード設計
yappli_developers
0
200
Featured
See All Featured
Test your architecture with Archunit
thirion
2
2.4k
Code Review Best Practice
trishagee
74
20k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The untapped power of vector embeddings
frankvandijk
2
1.9k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
470
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
600
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
500
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Optimising Largest Contentful Paint
csswizardry
37
4k
Transcript
1 My Favorite Talks at GopherCon 2019 Yuki ITO
Table of Contents !2 Observability in Go Socket to Me:
Where do Sockets Live in Go? Day 0 (Pre-Conference Workshop): Day 2:
Table of Contents !3 Observability in Go Socket to Me:
Where do Sockets Live in Go? Day 0 (Pre-Conference Workshop): Day 2:
Observability in Go !4 https://github.com/freeformz/go-observability-workshop/ Repository
Observability in Go !5 Log Trace Metric 3 Pillars for
Observability
Observability in Go !6 Log Trace Metric 3 Pillars for
Observability
Logs !7 log package func handler(w http.ResponseWriter, r *http.Request) {
status := http.StatusOK // net/http returns 200 by default defer func(t time.Time) { log.Printf( "%s %q => %d (%2.3fs)\n", r.Method, r.URL.String(), status, time.Since(t).Seconds(), ) }(time.Now()) // … }
Logs !8 log package func main() { log.SetFlags(log.Flags() | log.Lshortfile)
log.Println("Listening at: http://localhost:" + port) http.ListenAndServe(":"+port, nil) // ... } 2019/08/20 19:00:00 server.go:54: Listening at: http://localhost:8080
Logs !9 Structured Logs github.com/sirupsen/logrus 2019/08/20 19:00:00 server.go:54: Listening at:
http://localhost:8080 { “level”:"info", "msg":"Listening at: http://localhost:8080”, “time":"2019-07-17T21:26:08-07:00" }
!10 Log Trace Metric How should we log? If the
only observability tool we have is logs, then we should log everything.
!11 Log Trace Metric How should we log? If we
have metrics and traces, then reduce logging to important events meant largely for human consumption.
Observability in Go !12 Log Trace Metric 3 Pillars for
Observability
Metrics !13 expvar package import ( "expvar" // ... )
func main() { // ... // Expose the port value ep := expvar.NewString("Port") ep.Set(port) http.ListenAndServe(":"+port, nil) //... }
Metrics !14 expvar package package expvar // ... func init()
{ http.HandleFunc("/debug/vars", expvarHandler) Publish("cmdline", Func(cmdline)) Publish("memstats", Func(memstats)) }
Metrics !15 expvar package $ curl -s http://localhost:8080/debug/vars | jq
.Port "8080"
Metrics !16 expvar makes us be able to expose metrics
We can recognize only `current status` of system. Hoever…
Metrics !17 Prometheus Time Series Database
Metrics !18 import ( // ... "github.com/prometheus/client_golang/prometheus/promhttp" ) func main()
{ // ... http.Handle("/metrics", promhttp.Handler()) // … http.ListenAndServe(":"+port, nil) // ... }
Metrics !19 Pull Model Prometheus Scrape `/metrics` Application server
Metrics !20
Observability in Go !21 Log Trace Metric 3 Pillars for
Observability
Traces !22 Microservices ServiceB ServiceA
Traces !23 Distributed Tracing Jaeger
Traces !24 import ( // ... "contrib.go.opencensus.io/exporter/jaeger" "go.opencensus.io/trace" ) func
main() { je, err := jaeger.NewExporter(jaeger.Options{ CollectorEndpoint: "http://localhost:14268/api/traces", Process: jaeger.Process{ ServiceName: "servicea", Tags: []jaeger.Tag{ jaeger.StringTag("server", "1"), jaeger.StringTag("port", port), jaeger.BoolTag("demo", true), }, }, }) trace.RegisterExporter(je) }
Traces !25 func queryServiceBHandler(c *http.Client, url string) http.HandlerFunc { return
func(w http.ResponseWriter, r *http.Request) { ctx, span := trace.StartSpan( r.Context(), "queryServiceBHandler", ) defer span.End() // ... } }
Traces !26
Traces !27
Observability in Go !28 Log Trace Metric 3 Pillars for
Observability
Table of Contents !29 Observability in Go Socket to Me:
Where do Sockets Live in Go? Day 0 (Pre-Conference Workshop): Day 2:
!30 System calls under net.Listen & Accept https://about.sourcegraph.com/go/gophercon-2019-socket-to-me-where-do-sockets-live-in-go
!31 System calls under net.Listen & Accept https://about.sourcegraph.com/go/gophercon-2019-socket-to-me-where-do-sockets-live-in-go
!32 func (srv *Server) Serve(l net.Listener) error { // ...
for { rw, e := l.Accept() // ... c := srv.newConn(rw) go c.serve(ctx) } } Socket to me net/http/server.go
!33 System calls under net.Listen & Accept https://about.sourcegraph.com/go/gophercon-2019-socket-to-me-where-do-sockets-live-in-go
Socket Options in Go !34 ListenConfig.Listen() ListenConfig.Control RawConn.Control() Callback to
set socket options
Socket Options in Go !35 https://github.com/110y/sockoptgo/ Example Implementation
Socket Options in Go !36 ListenConfig.Listen() ListenConfig.Control RawConn.Control() Callback to
set socket options
!37 func Listen(network, address string) (Listener, error) { var lc
ListenConfig return lc.Listen(context.Background(), network, address) } net.Listen() Socket Options in Go
!38 Socket Options in Go lc := net.ListenConfig{ Control: listenControler,
} lis, err := lc.Listen(ctx, "tcp4", addr)
Socket Options in Go !39 ListenConfig.Listen() ListenConfig.Control RawConn.Control() Callback to
set socket options
!40 func listenControler(network, address string, c syscall.RawConn) error { return
c.Control(func(fd uintptr) { syscall.SetsockoptInt( int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1, ) }) } Socket Options in Go
!41 func listenControler(network, address string, c syscall.RawConn) error { return
c.Control(func(fd uintptr) { syscall.SetsockoptInt( int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1, ) }) } Socket Options in Go
Table of Contents !42 Observability in Go Socket to Me:
Where do Sockets Live in Go? Day 0 (Pre-Conference Workshop): Day 2: