Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
My Favorite Talks at GopherCon 2019
Yuki Ito
August 20, 2019
Technology
3
1.6k
My Favorite Talks at GopherCon 2019
Yuki Ito
August 20, 2019
Tweet
Share
More Decks by Yuki Ito
See All by Yuki Ito
Microservices on Cloud Run @ KAUCHE
110y
0
67
KAUCHE Loves Go
110y
0
190
Evolution of Architecture @ Kauche
110y
3
240
Envoy as an API Gateway
110y
0
110
Microservices on Cloud Run + VPC Network
110y
0
230
How We Use Cloud Run and its Friends
110y
0
210
Custom Kubernetes Controllers at Mercari
110y
1
450
What Is the Go Workspace Mode
110y
4
1.1k
What Are We Doing as Merpay Architect
110y
0
1.2k
Other Decks in Technology
See All in Technology
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
11
3.3k
ラズパイとGASで加湿器の消し忘れをLINEでリマインド&操作
minako__ph
0
110
チケットNFTの仕組み
sbtechnight
0
330
JAWS-UG朝会_41_NakagawaAkihiro.pptx.pdf
anakagawa
2
620
OCI DevOps 概要 / OCI DevOps overview
oracle4engineer
PRO
0
470
USB PD で迎える AC アダプター大統一時代
puhitaku
0
410
ついに来る!TypeScript5.0の新機能
uhyo
16
8.7k
OVN-Kubernetes-Introduction-ja-2023-01-27.pdf
orimanabu
1
150
Oktaの管理者権限を適切に移譲してみた
shimosyan
2
230
PHPのimmutable arrayとは
hnw
1
130
CEXやDEXに依存しないブロックチェーン取引について考える
sbtechnight
0
310
plotlyで動くグラフを作る
kosshi
0
690
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
87
12k
The Invisible Side of Design
smashingmag
292
48k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
152
13k
Put a Button on it: Removing Barriers to Going Fast.
kastner
56
2.5k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
217
21k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
6
830
Web Components: a chance to create the future
zenorocha
304
40k
Atom: Resistance is Futile
akmur
256
24k
KATA
mclloyd
12
9.7k
Building an army of robots
kneath
302
40k
Happy Clients
brianwarren
90
5.8k
Designing with Data
zakiwarfel
91
4.2k
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: