66
Building a Debuggable Server in Go Keeley Erhardt [email protected] @KeeleyErhardt SREcon EMEA 2018, Dusseldorf

Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt [email protected] @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

  • Upload
    others

  • View
    32

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Building a Debuggable Server in Go

Keeley [email protected] @KeeleyErhardt

SREcon EMEA 2018, Dusseldorf

Page 2: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

What should I get out of this talk?

● Building production services is hard

● Existing solutions

● Intro to radicle

○ Overview

○ Demo

○ Benefits

● Key takeaways

Talk overview

@KeeleyErhardt

Page 3: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

What should I get out of this talk?

● Building production services is hard

● Existing solutions

● Intro to radicle

○ Overview

○ Demo

○ Benefits

● Key takeaways

Talk overview

@KeeleyErhardt

Page 4: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

github.com/keelerh/demo-radicle

@KeeleyErhardt

Page 5: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Service

● A collection of actions the server can perform at the client’s request

@KeeleyErhardt

service Greeter {

rpc SayHello (HelloRequest) returns (HelloResponse) {}

}

message HelloRequest {

string name = 1;

}

message HelloResponse {

string message = 1;

}

github.com/keelerh/demo-radicle

Page 6: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Service

● A collection of actions the server can perform at the client’s request

@KeeleyErhardt

service Greeter {

rpc SayHello (HelloRequest) returns (HelloResponse) {}

}

message HelloRequest {

string name = 1;

}

message HelloResponse {

string message = 1;

}

github.com/keelerh/demo-radicle

Page 7: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Service

● A collection of actions the server can perform at the client’s request

@KeeleyErhardt

service Greeter {

rpc SayHello (HelloRequest) returns (HelloResponse) {}

}

message HelloRequest {

string name = 1;

}

message HelloResponse {

string message = 1;

}

github.com/keelerh/demo-radicle

Page 8: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Service

● A collection of actions the server can perform at the client’s request

@KeeleyErhardt

type GreeterService struct {}

func (s *GreeterService) SayHello(

ctx context.Context, req *pb.HelloRequest)

(*pb.HelloResponse, error) {

return &pb.HelloResponse{

Message: fmt.Sprintf("Hello %s", req.Name),

}, nil

}

github.com/keelerh/demo-radicle

Page 9: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Service

● A collection of actions the server can perform at the client’s request

@KeeleyErhardt

type GreeterService struct {}

func (s *GreeterService) SayHello(

ctx context.Context, req *pb.HelloRequest)

(*pb.HelloResponse, error) {

return &pb.HelloResponse{

Message: fmt.Sprintf("Hello %s", req.Name),

}, nil

}

github.com/keelerh/demo-radicle

Page 10: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Service

● A collection of actions the server can perform at the client’s request

@KeeleyErhardt

type GreeterService struct {}

func (s *GreeterService) SayHello(

ctx context.Context, req *pb.HelloRequest)

(*pb.HelloResponse, error) {

return &pb.HelloResponse{

Message: fmt.Sprintf("Hello %s", req.Name),

}, nil

}

github.com/keelerh/demo-radicle

Page 11: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Service

● A collection of actions the server can perform at the client’s request

@KeeleyErhardt

type GreeterService struct {}

func (s *GreeterService) SayHello(

ctx context.Context, req *pb.HelloRequest)

(*pb.HelloResponse, error) {

return &pb.HelloResponse{

Message: fmt.Sprintf("Hello %s", req.Name),

}, nil

}

github.com/keelerh/demo-radicle

Page 12: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Service

● A collection of actions the server can perform at the client’s request

@KeeleyErhardt

type GreeterService struct {}

func (s *GreeterService) SayHello(

ctx context.Context, req *pb.HelloRequest)

(*pb.HelloResponse, error) {

return &pb.HelloResponse{

Message: fmt.Sprintf("Hello %s", req.Name),

}, nil

}

github.com/keelerh/demo-radicle

Page 13: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

gRPC + Protobufs

● gRPC: a high performance, open-source remote procedure call (RPC) framework

● Protobufs: the Interface Definition Language (IDL) and underlying message interchange format for gRPC

@KeeleyErhardt

Image Source: http://www.grpc.io

Page 14: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Server

● A computer program or device that processes requests and delivers data over the network

@KeeleyErhardt

func main() {

lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 8081))

if err != nil {

log.Fatalf("failed to listen: %v", err)

}

grpcServer := grpc.NewServer()

svc := helloworld.GreeterService{}

pb.RegisterGreeterServer(grpcServer, &svc)

if err := grpcServer.Serve(lis); err != nil {

log.Fatalf("failed to serve: %s", err)

}

}

github.com/keelerh/demo-radicle

Page 15: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Server

● A computer program or device that processes requests and delivers data over the network

@KeeleyErhardt

func main() {

lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 8081))

if err != nil {

log.Fatalf("failed to listen: %v", err)

}

grpcServer := grpc.NewServer()

svc := helloworld.GreeterService{}

pb.RegisterGreeterServer(grpcServer, &svc)

if err := grpcServer.Serve(lis); err != nil {

log.Fatalf("failed to serve: %s", err)

}

}

github.com/keelerh/demo-radicle

Page 16: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Server

● A computer program or device that processes requests and delivers data over the network

@KeeleyErhardt

func main() {

lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 8081))

if err != nil {

log.Fatalf("failed to listen: %v", err)

}

grpcServer := grpc.NewServer()

svc := helloworld.GreeterService{}

pb.RegisterGreeterServer(grpcServer, &svc)

if err := grpcServer.Serve(lis); err != nil {

log.Fatalf("failed to serve: %s", err)

}

}

github.com/keelerh/demo-radicle

Page 17: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Server

● A computer program or device that processes requests and delivers data over the network

@KeeleyErhardt

func main() {

lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 8081))

if err != nil {

log.Fatalf("failed to listen: %v", err)

}

grpcServer := grpc.NewServer()

svc := helloworld.GreeterService{}

pb.RegisterGreeterServer(grpcServer, &svc)

if err := grpcServer.Serve(lis); err != nil {

log.Fatalf("failed to serve: %s", err)

}

}

github.com/keelerh/demo-radicle

Page 18: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Server

● A computer program or device that processes requests and delivers data over the network

@KeeleyErhardt

func main() {

lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 8081))

if err != nil {

log.Fatalf("failed to listen: %v", err)

}

grpcServer := grpc.NewServer()

svc := helloworld.GreeterService{}

pb.RegisterGreeterServer(grpcServer, &svc)

if err := grpcServer.Serve(lis); err != nil {

log.Fatalf("failed to serve: %s", err)

}

}

github.com/keelerh/demo-radicle

Page 19: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Server

● A computer program or device that processes requests and delivers data over the network

@KeeleyErhardt

func main() {

lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 8081))

if err != nil {

log.Fatalf("failed to listen: %v", err)

}

grpcServer := grpc.NewServer()

svc := helloworld.GreeterService{}

pb.RegisterGreeterServer(grpcServer, &svc)

if err := grpcServer.Serve(lis); err != nil {

log.Fatalf("failed to serve: %s", err)

}

}

github.com/keelerh/demo-radicle

Page 20: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Greeter service

Naive implementation

Production ready

@KeeleyErhardt

Service

Server

Page 21: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Production service

● Metrics Metrics

Service

Page 22: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

type Service struct {}

func (s *Service) SayHello(

ctx context.Context, req *pb.HelloRequest)

(*pb.HelloResponse, error) {

helloCount.WithLabelValues(req.Name).Add(1)

return &pb.HelloResponse{

Message: fmt.Sprintf("Hello %s", req.Name)

}, nil

}

github.com/keelerh/demo-radicle

Production service

● Metrics

Page 23: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Production service

● Metrics● Logging

Metrics

Logging

Service

Page 24: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

type GreeterService struct{}

func (s *GreeterService) SayHello(

ctx context.Context, req *pb.HelloRequest)

(*pb.HelloResponse, error) {

helloCount.WithLabelValues(req.Name).Add(1)

log.Printf("grpc: SayHello: %s", req.Name)

return &pb.HelloResponse{

Message: fmt.Sprintf("Hello %s", req.Name),

}, nil

}

github.com/keelerh/demo-radicle

Production service

● Metrics● Logging

Page 25: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Production service

● Metrics● Logging● Tracing

Metrics

Logging

Tracing

Service

Page 26: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Production service

● Metrics● Logging● Tracing● Rate limiting

Metrics

Logging

Tracing

Rate limiting

Service

Page 27: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Metrics

Logging

Production service

● Metrics● Logging● Tracing● Rate limiting● ...

Tracing

Rate limiting

...

Service

Page 28: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Building production services is hard.

@KeeleyErhardt

Page 29: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

What should I get out of this talk?

● Building production services is hard

● Existing solutions

● Intro to radicle

○ Overview

○ Demo

○ Benefits

● Key takeaways

Talk overview

@KeeleyErhardt

Page 30: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Image Source: https://gokit.io

Service metrics

Business logic

Application logging

Business analytics

Balancing and limiting

Operational metricsTransport

Existing solutions

● Go Kit

Page 31: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Image Source: https://gokit.io

Service metrics

Business logic

Application logging

Business analytics

Balancing and limiting

Operational metricsTransport

Existing solutions

● Go Kit Service

Page 32: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Image Source: https://gokit.io

Service metrics

Business logic

Application logging

Business analytics

Balancing and limiting

Operational metricsTransport

Existing solutions

● Go Kit

Endpoint

Service

Page 33: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Image Source: https://gokit.io

Service metrics

Business logic

Application logging

Business analytics

Balancing and limiting

Operational metricsTransport

Existing solutions

● Go Kit

Transport

Endpoint

Service

Page 34: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Image Source: https://micro.mu

@KeeleyErhardt

Existing solutions

● Go Kit● Go Micro

Page 35: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

What should I get out of this talk?

● Building production services is hard

● Existing solutions

● Intro to radicle

○ Overview

○ Demo

○ Benefits

● Key takeaways

Talk overview

@KeeleyErhardt

Page 36: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Our solution

● radicle

Photo by Samuel Zeller on Unsplash

@KeeleyErhardt

Page 37: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Our solution

● radicle○ No new concepts

Photo by Samuel Zeller on Unsplash

@KeeleyErhardt

Page 38: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Our solution

● radicle○ No new concepts○ Flexible

Photo by Samuel Zeller on Unsplash

@KeeleyErhardt

Page 39: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Our solution

● radicle○ No new concepts○ Flexible○ Tested

Photo by Samuel Zeller on Unsplash

@KeeleyErhardt

Page 40: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

Metrics

Logging

Tracing

Rate limiting

...

Service

Page 41: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

MetricsLoggingTracing

Rate limiting...

Service

MetricsLoggingTracing

Rate limiting...

Service

MetricsLoggingTracing

Rate limiting...

Service

MetricsLoggingTracing

Rate limiting...

Service

MetricsLoggingTracing

Rate limiting...

Service

MetricsLoggingTracing

Rate limiting...

Service

MetricsLoggingTracing

Rate limiting...

Service

MetricsLoggingTracing

Rate limiting...

Service

MetricsLoggingTracing

Rate limiting...

Service

MetricsLoggingTracing

Rate limiting...

Service

Page 42: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

Page 43: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

MetricsLoggingTracing

Rate limiting

Service

Page 44: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

MetricsLoggingTracing

Rate limiting

Service

MetricsLoggingTracing

Rate limiting

Service

Authentication

Page 45: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

MetricsLoggingTracing

Rate limiting

Service

MetricsLoggingTracing

Rate limiting

Service

MetricsLogging

Authentication

Service

Authentication

Page 46: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Common functionality is duplicated across multiple services.

@KeeleyErhardt

Page 47: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Common functionality is duplicated across multiple services.

@KeeleyErhardt

Page 48: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

Server

MetricsLoggingTracing

Rate limiting

Service

MetricsLoggingTracing

Rate limiting

Service

MetricsLogging

Authentication

Service

Authentication

Page 49: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

Service Service Service

Server

Metrics

Logging

Tracing

Rate limiting

Authentication

Page 50: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

Service Service Service

Server

Page 51: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

Service Service Service

Server

Service Service Service

Server

Service Service Service

Server

Page 52: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

Service Service Service

Server

Service Service Service

Server

Service Service Service

Server

Base server

Page 53: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

Server

Service Service Service

Server

Service Service Service

Server

Service Service Service

MetricsLogging Tracing Rate limiting Authentication

Base server

...

Page 54: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Production services

@KeeleyErhardt

Service Service ServiceService Service Service Service Service Service

radicle

ServerServer Server

Page 55: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Demo

@KeeleyErhardt

github.com/keelerh/demo-radicle

Page 56: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Photo by Kent Pilcher on Unsplash

@KeeleyErhardt

Benefits of centralized and unified common functionality:

● Guarantees basic operability

Page 57: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

Page 58: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Photo by Kent Pilcher on Unsplash

@KeeleyErhardt

Benefits of centralized and unified common functionality:

● Guarantees basic operability● Standardizes services

Page 59: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Photo by Kent Pilcher on Unsplash

@KeeleyErhardt

Benefits of centralized and unified common functionality:

● Guarantees basic operability● Standardizes services● Promotes reusable service

infrastructure

Page 60: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

Photo by Kent Pilcher on Unsplash

@KeeleyErhardt

Benefits of centralized and unified common functionality:

● Guarantees basic operability● Standardizes services● Promotes reusable service

infrastructure● Reduces development time

Page 61: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

What should I get out of this talk?

● Building production services is hard

● Existing solutions

● Intro to radicle

○ Overview

○ Demo

○ Benefits

● Key takeaways

Talk overview

@KeeleyErhardt

Page 62: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

1. Production services require a great deal of functionality outside

of the service-level logic

@KeeleyErhardt

Page 63: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

2. Don’t duplicate common functionality across multiple

services

@KeeleyErhardt

Page 64: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

@KeeleyErhardt

3. radicle is one option for simplifying the development of

debuggable servers in Go

@KeeleyErhardt

Page 65: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

What should I get out of this talk?

● Building production services is hard

● Existing solutions

● Intro to radicle

○ Overview

○ Demo

○ Benefits

● Key takeaways

Talk overview

@KeeleyErhardt

Page 66: Server in Go Building a Debuggable - USENIX · Building a Debuggable Server in Go Keeley Erhardt keeley@improbable.io @KeeleyErhardt SREcon EMEA 2018, Dusseldorf. What should I get

github.com/improbable-eng

@KeeleyErhardt

Liked what you heard?

say hi on improbable-eng.slack.com

...or come join us!improbable.io/careers improbable.hk/careers