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
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.6k
Modular Monolith Go Server with GraphQL Federation + gRPC
110y
1
1.1k
Modular Monolith + Go @ newmo
110y
1
1.2k
Go + GraphQL @ newmo
110y
3
980
Architect / Platform Team at KAUCHE
110y
1
690
Cloud Run + Observability / Reliability @ KAUCHE
110y
0
670
Cloud Run CI/CD + QA @ KAUCHE
110y
1
670
Microservices on Cloud Run @ KAUCHE
110y
0
310
KAUCHE Loves Go
110y
0
530
Other Decks in Technology
See All in Technology
"何を作るか"を任される エンジニアは、どう育つのか
yutaokafuji
1
580
Agent Skills設計で柔軟性と硬さのバランスが難しい話
nassy20
0
110
AIの性能が向上しても未解決な組織の重大問題は何か?/An Unsolved Organizational Problem in the Age of AI
moriyuya
3
600
2026 TECHFRESH 畢業分享會 - 開發日常大解密!從領域驅動到企業級上線
line_developers_tw
PRO
0
680
Djangoユーザが知っ得なPostgreSQL機能 - 設計の選択肢を増やす / Djang-use-PostgreSQL
soudai
PRO
1
220
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
230
FDE という解 ― 暗黙知と明示知をつなぐ、伴走型エンジニアリング ―
otanet
0
130
2026TECHFRESH畢業分享會 - Lightning Talk - 打造精準高效的 MCP 設計模式與測試實務
line_developers_tw
PRO
0
680
RSA暗号を手計算したくなること、ありますよね?? (20260615_orestudy6_rsa)
thousanda
0
170
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
8
4.5k
データサイエンスを価値につなげるプロジェクト設計 〜 DS一年目が現場で得た気づき 〜
ysd113
1
120
2026.06.13_AI時代に事業会社が「SIer出身エンジニア」を求める理由 / Why Businesses Seek Engineers with a System Integrator Background in the AI Era
jumtech
0
1k
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
Evolving SEO for Evolving Search Engines
ryanjones
0
210
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
420
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
The SEO identity crisis: Don't let AI make you average
varn
0
490
Code Reviewing Like a Champion
maltzj
528
40k
Context Engineering - Making Every Token Count
addyosmani
9
960
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
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: