From 3e93310022361cfa60762c467700d5695642f5b7 Mon Sep 17 00:00:00 2001
From: Alex Hong <9397363+hongalex@users.noreply.github.com>
Date: Thu, 13 Oct 2022 10:15:58 -0700
Subject: [PATCH 1/6] enable datastore tracing

---
 go.mod                            |  9 ++++++++-
 go.sum                            |  6 ++++++
 internal/app/server/open_saves.go | 14 ++++++++++++++
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/go.mod b/go.mod
index 422e335..84b591a 100644
--- a/go.mod
+++ b/go.mod
@@ -4,6 +4,7 @@ go 1.18
 
 require (
 	cloud.google.com/go/datastore v1.8.0
+	contrib.go.opencensus.io/exporter/stackdriver v0.13.10
 	github.com/alicebob/miniredis/v2 v2.22.0
 	github.com/go-redis/redis/v8 v8.11.5
 	github.com/golang/mock v1.6.0
@@ -15,6 +16,7 @@ require (
 	github.com/spf13/viper v1.12.0
 	github.com/stretchr/testify v1.8.0
 	github.com/vmihailenco/msgpack/v5 v5.3.5
+	go.opencensus.io v0.23.0
 	gocloud.dev v0.25.0
 	google.golang.org/api v0.90.0
 	google.golang.org/grpc v1.48.0
@@ -26,11 +28,15 @@ require (
 	cloud.google.com/go v0.103.0 // indirect
 	cloud.google.com/go/compute v1.7.0 // indirect
 	cloud.google.com/go/iam v0.3.0 // indirect
+	cloud.google.com/go/monitoring v1.4.0 // indirect
 	cloud.google.com/go/storage v1.24.0 // indirect
+	cloud.google.com/go/trace v1.2.0 // indirect
 	github.com/Masterminds/goutils v1.1.1 // indirect
 	github.com/Masterminds/semver v1.5.0 // indirect
 	github.com/Masterminds/sprig v2.22.0+incompatible // indirect
 	github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a // indirect
+	github.com/aws/aws-sdk-go v1.43.31 // indirect
+	github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect
 	github.com/cespare/xxhash/v2 v2.1.2 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
@@ -45,6 +51,7 @@ require (
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/huandu/xstrings v1.3.2 // indirect
 	github.com/imdario/mergo v0.3.13 // indirect
+	github.com/jmespath/go-jmespath v0.4.0 // indirect
 	github.com/magiconair/properties v1.8.6 // indirect
 	github.com/mitchellh/copystructure v1.2.0 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
@@ -60,11 +67,11 @@ require (
 	github.com/subosito/gotenv v1.4.0 // indirect
 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
 	github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 // indirect
-	go.opencensus.io v0.23.0 // indirect
 	golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
 	golang.org/x/mod v0.5.0 // indirect
 	golang.org/x/net v0.0.0-20220728211354-c7608f3a8462 // indirect
 	golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c // indirect
+	golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
 	golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect
 	golang.org/x/text v0.3.7 // indirect
 	golang.org/x/tools v0.1.5 // indirect
diff --git a/go.sum b/go.sum
index b2fc3b0..8a7b97c 100644
--- a/go.sum
+++ b/go.sum
@@ -61,6 +61,7 @@ cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp
 cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI=
 cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA=
 cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4=
+cloud.google.com/go/monitoring v1.4.0 h1:05+IuNMbh40hbxcqQ4SnynbwZbLG1Wc9dysIJxnfv7U=
 cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4=
 cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
 cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
@@ -80,8 +81,10 @@ cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeL
 cloud.google.com/go/storage v1.24.0 h1:a4N0gIkx83uoVFGz8B2eAV3OhN90QoWF5OZWLKl39ig=
 cloud.google.com/go/storage v1.24.0/go.mod h1:3xrJEFMXBsQLgxwThyjuD3aYlroL0TMRec1ypGUQ0KE=
 cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A=
+cloud.google.com/go/trace v1.2.0 h1:oIaB4KahkIUOpLSAAjEJ8y2desbjY/x/RfP4O3KAtTI=
 cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM=
 contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA=
+contrib.go.opencensus.io/exporter/stackdriver v0.13.10 h1:a9+GZPUe+ONKUwULjlEOucMMG0qfSCCenlji0Nhqbys=
 contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8=
 contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
@@ -176,6 +179,7 @@ github.com/aws/smithy-go v1.11.2 h1:eG/N+CcUMAvsdffgMvjMKwfyDzIkjM6pfxMJ8Mzc6mE=
 github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk=
 github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -416,6 +420,7 @@ github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv
 github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
 github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
 github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
 github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -719,6 +724,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8=
 golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
diff --git a/internal/app/server/open_saves.go b/internal/app/server/open_saves.go
index 14be1f3..68c34a6 100644
--- a/internal/app/server/open_saves.go
+++ b/internal/app/server/open_saves.go
@@ -20,7 +20,9 @@ import (
 	"fmt"
 	"io"
 
+	"contrib.go.opencensus.io/exporter/stackdriver"
 	"github.com/googleforgames/open-saves/internal/pkg/config"
+	"go.opencensus.io/trace"
 
 	"github.com/google/uuid"
 	pb "github.com/googleforgames/open-saves/api"
@@ -84,6 +86,18 @@ func newOpenSavesServer(ctx context.Context, cfg *config.ServiceConfig) (*openSa
 			cacheStore:    cache,
 			ServiceConfig: *cfg,
 		}
+		sd, err := stackdriver.NewExporter(stackdriver.Options{
+			ProjectID: cfg.Project,
+		})
+		if err != nil {
+			log.Fatalf("Failed to create the Stackdriver exporter: %v", err)
+		}
+		// It is imperative to invoke flush before your main function exits
+		defer sd.Flush()
+
+		// Register it as a trace exporter
+		trace.RegisterExporter(sd)
+		trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(0.2)})
 		return server, nil
 	default:
 		return nil, fmt.Errorf("cloud provider(%q) is not yet supported", cfg.ServerConfig.Cloud)

From f5bde6b076da0a04f94d5bed28ee85aa4d9060d9 Mon Sep 17 00:00:00 2001
From: Alex Hong <9397363+hongalex@users.noreply.github.com>
Date: Thu, 13 Oct 2022 10:31:24 -0700
Subject: [PATCH 2/6] add support for viper config for tracing

---
 configs/service.yaml              | 21 ++++++++++++---------
 internal/app/server/open_saves.go | 24 +++++++++++++-----------
 internal/pkg/config/loader.go     |  3 +++
 internal/pkg/config/model.go      |  5 +++++
 4 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/configs/service.yaml b/configs/service.yaml
index fcbe564..1fd29be 100644
--- a/configs/service.yaml
+++ b/configs/service.yaml
@@ -1,17 +1,20 @@
 open_saves_port: 6000
-open_saves_cloud: "gcp"
-open_saves_bucket: ""
-open_saves_project: ""
-log_level: "info"
-shutdown_grace_period: "5s"
-cache_default_ttl: "5m"
+open_saves_cloud: 'gcp'
+open_saves_bucket: ''
+open_saves_project: ''
+log_level: 'info'
+shutdown_grace_period: '5s'
+cache_default_ttl: '5m'
 
-redis_address: "localhost:6379"
+redis_address: 'localhost:6379'
 redis_max_idle: 500
 redis_pool_size: 10000
 redis_idle_timeout: 0
 redis_max_retries: 3
-redis_min_retry_backoff: "8ms"
-redis_max_retry_backoff: "512ms"
+redis_min_retry_backoff: '8ms'
+redis_max_retry_backoff: '512ms'
 
 blob_max_inline_size: 65536
+
+enable_trace: true
+trace_sample_rate: 0.2
diff --git a/internal/app/server/open_saves.go b/internal/app/server/open_saves.go
index 68c34a6..0c702b0 100644
--- a/internal/app/server/open_saves.go
+++ b/internal/app/server/open_saves.go
@@ -86,18 +86,20 @@ func newOpenSavesServer(ctx context.Context, cfg *config.ServiceConfig) (*openSa
 			cacheStore:    cache,
 			ServiceConfig: *cfg,
 		}
-		sd, err := stackdriver.NewExporter(stackdriver.Options{
-			ProjectID: cfg.Project,
-		})
-		if err != nil {
-			log.Fatalf("Failed to create the Stackdriver exporter: %v", err)
-		}
-		// It is imperative to invoke flush before your main function exits
-		defer sd.Flush()
+		if cfg.ServerConfig.EnableTrace {
+			sd, err := stackdriver.NewExporter(stackdriver.Options{
+				ProjectID: cfg.Project,
+			})
+			if err != nil {
+				log.Fatalf("Failed to create the Stackdriver exporter: %v", err)
+			}
+			// It is imperative to invoke flush before your main function exits
+			defer sd.Flush()
 
-		// Register it as a trace exporter
-		trace.RegisterExporter(sd)
-		trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(0.2)})
+			// Register it as a trace exporter
+			trace.RegisterExporter(sd)
+			trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(cfg.ServerConfig.TraceSampleRate)})
+		}
 		return server, nil
 	default:
 		return nil, fmt.Errorf("cloud provider(%q) is not yet supported", cfg.ServerConfig.Cloud)
diff --git a/internal/pkg/config/loader.go b/internal/pkg/config/loader.go
index a5ff21c..e8f4703 100644
--- a/internal/pkg/config/loader.go
+++ b/internal/pkg/config/loader.go
@@ -90,6 +90,7 @@ func Load(path string) (*ServiceConfig, error) {
 	if viper.GetString(RedisAddress) == "" {
 		log.Fatal("missing -cache argument for cache store")
 	}
+	log.Printf("trace: %b, rate: %d\n", viper.GetBool(EnableTrace), viper.GetFloat64(TraceSampleRate))
 
 	serverConfig := ServerConfig{
 		Address:             fmt.Sprintf(":%d", viper.GetUint(OpenSavesPort)),
@@ -97,6 +98,8 @@ func Load(path string) (*ServiceConfig, error) {
 		Bucket:              viper.GetString(OpenSavesBucket),
 		Project:             viper.GetString(OpenSavesProject),
 		ShutdownGracePeriod: viper.GetDuration(ShutdownGracePeriod),
+		EnableTrace:         viper.GetBool(EnableTrace),
+		TraceSampleRate:     viper.GetFloat64(TraceSampleRate),
 	}
 
 	// Cloud Run environment populates the PORT env var, so check for it here.
diff --git a/internal/pkg/config/model.go b/internal/pkg/config/model.go
index f4b3e5c..ca7433e 100644
--- a/internal/pkg/config/model.go
+++ b/internal/pkg/config/model.go
@@ -35,6 +35,9 @@ const (
 	RedisMaxRetryBackoff = "redis_max_retry_backoff"
 
 	BlobMaxInlineSize = "blob_max_inline_size"
+
+	EnableTrace     = "enable_trace"
+	TraceSampleRate = "trace_sample_rate"
 )
 
 type ServiceConfig struct {
@@ -51,6 +54,8 @@ type ServerConfig struct {
 	Bucket              string
 	Project             string
 	ShutdownGracePeriod time.Duration
+	EnableTrace         bool
+	TraceSampleRate     float64
 }
 
 // CacheConfig has configurations for caching control (not Redis specific).

From 12586e9ccb24e0a370b8d5d8d4288e45221a8254 Mon Sep 17 00:00:00 2001
From: Alex Hong <9397363+hongalex@users.noreply.github.com>
Date: Thu, 13 Oct 2022 12:57:27 -0700
Subject: [PATCH 3/6] fix verbs for trace log

---
 internal/pkg/config/loader.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/internal/pkg/config/loader.go b/internal/pkg/config/loader.go
index e8f4703..f549619 100644
--- a/internal/pkg/config/loader.go
+++ b/internal/pkg/config/loader.go
@@ -90,7 +90,7 @@ func Load(path string) (*ServiceConfig, error) {
 	if viper.GetString(RedisAddress) == "" {
 		log.Fatal("missing -cache argument for cache store")
 	}
-	log.Printf("trace: %b, rate: %d\n", viper.GetBool(EnableTrace), viper.GetFloat64(TraceSampleRate))
+	log.Printf("trace: %t, rate: %f\n", viper.GetBool(EnableTrace), viper.GetFloat64(TraceSampleRate))
 
 	serverConfig := ServerConfig{
 		Address:             fmt.Sprintf(":%d", viper.GetUint(OpenSavesPort)),

From 0af4a2fe5060b2ab3c8cf1e7707d37e09fc048bf Mon Sep 17 00:00:00 2001
From: Alex Hong <9397363+hongalex@users.noreply.github.com>
Date: Thu, 13 Oct 2022 23:52:48 -0700
Subject: [PATCH 4/6] dont sample by default

---
 configs/service.yaml                   | 7 +++++--
 internal/app/server/open_saves.go      | 4 +++-
 internal/app/server/open_saves_test.go | 1 +
 internal/pkg/config/loader.go          | 1 -
 internal/pkg/config/model.go           | 3 +++
 5 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/configs/service.yaml b/configs/service.yaml
index 1fd29be..a042a5f 100644
--- a/configs/service.yaml
+++ b/configs/service.yaml
@@ -16,5 +16,8 @@ redis_max_retry_backoff: '512ms'
 
 blob_max_inline_size: 65536
 
-enable_trace: true
-trace_sample_rate: 0.2
+# The following enables OpenCensus Tracing via Cloud Trace
+# for the Datastore client library.
+# It is EXPERIMENTAL and subject to change or removal without notice.
+enable_trace: false 
+trace_sample_rate: 0.00
diff --git a/internal/app/server/open_saves.go b/internal/app/server/open_saves.go
index 0c702b0..2077721 100644
--- a/internal/app/server/open_saves.go
+++ b/internal/app/server/open_saves.go
@@ -87,6 +87,8 @@ func newOpenSavesServer(ctx context.Context, cfg *config.ServiceConfig) (*openSa
 			ServiceConfig: *cfg,
 		}
 		if cfg.ServerConfig.EnableTrace {
+			rate := cfg.ServerConfig.TraceSampleRate
+			log.Printf("Enabling CloudTrace exporter with sample rate: %f\n", rate)
 			sd, err := stackdriver.NewExporter(stackdriver.Options{
 				ProjectID: cfg.Project,
 			})
@@ -98,7 +100,7 @@ func newOpenSavesServer(ctx context.Context, cfg *config.ServiceConfig) (*openSa
 
 			// Register it as a trace exporter
 			trace.RegisterExporter(sd)
-			trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(cfg.ServerConfig.TraceSampleRate)})
+			trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(rate)})
 		}
 		return server, nil
 	default:
diff --git a/internal/app/server/open_saves_test.go b/internal/app/server/open_saves_test.go
index 341e64a..a9ed77c 100644
--- a/internal/app/server/open_saves_test.go
+++ b/internal/app/server/open_saves_test.go
@@ -131,6 +131,7 @@ func TestOpenSaves_HealthCheck(t *testing.T) {
 }
 
 func TestOpenSaves_RunServer(t *testing.T) {
+	t.Skip()
 	serviceConfig, err := getServiceConfig()
 	if err != nil {
 		t.Fatalf("getServiceConfig err: %v", err)
diff --git a/internal/pkg/config/loader.go b/internal/pkg/config/loader.go
index f549619..cef5f21 100644
--- a/internal/pkg/config/loader.go
+++ b/internal/pkg/config/loader.go
@@ -90,7 +90,6 @@ func Load(path string) (*ServiceConfig, error) {
 	if viper.GetString(RedisAddress) == "" {
 		log.Fatal("missing -cache argument for cache store")
 	}
-	log.Printf("trace: %t, rate: %f\n", viper.GetBool(EnableTrace), viper.GetFloat64(TraceSampleRate))
 
 	serverConfig := ServerConfig{
 		Address:             fmt.Sprintf(":%d", viper.GetUint(OpenSavesPort)),
diff --git a/internal/pkg/config/model.go b/internal/pkg/config/model.go
index ca7433e..e85fe2f 100644
--- a/internal/pkg/config/model.go
+++ b/internal/pkg/config/model.go
@@ -36,6 +36,9 @@ const (
 
 	BlobMaxInlineSize = "blob_max_inline_size"
 
+	// The following enables OpenCensus Tracing via Cloud Trace
+	// for the Datastore client library.
+	// It is EXPERIMENTAL and subject to change or removal without notice.
 	EnableTrace     = "enable_trace"
 	TraceSampleRate = "trace_sample_rate"
 )

From 89734dff576c3bfdad4f997b0a8e6eaac7c49a2a Mon Sep 17 00:00:00 2001
From: Alex Hong <9397363+hongalex@users.noreply.github.com>
Date: Thu, 13 Oct 2022 23:56:41 -0700
Subject: [PATCH 5/6] remove formatting changes to service.yaml

---
 configs/service.yaml                   | 19 +++++++++----------
 internal/app/server/open_saves_test.go |  1 -
 2 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/configs/service.yaml b/configs/service.yaml
index a042a5f..3afdc63 100644
--- a/configs/service.yaml
+++ b/configs/service.yaml
@@ -1,18 +1,17 @@
-open_saves_port: 6000
-open_saves_cloud: 'gcp'
-open_saves_bucket: ''
-open_saves_project: ''
-log_level: 'info'
-shutdown_grace_period: '5s'
-cache_default_ttl: '5m'
+open_saves_cloud: "gcp"
+open_saves_bucket: ""
+open_saves_project: ""
+log_level: "info"
+shutdown_grace_period: "5s"
+cache_default_ttl: "5m"
 
-redis_address: 'localhost:6379'
+redis_address: "localhost:6379"
 redis_max_idle: 500
 redis_pool_size: 10000
 redis_idle_timeout: 0
 redis_max_retries: 3
-redis_min_retry_backoff: '8ms'
-redis_max_retry_backoff: '512ms'
+redis_min_retry_backoff: "8ms"
+redis_max_retry_backoff: "512ms"
 
 blob_max_inline_size: 65536
 
diff --git a/internal/app/server/open_saves_test.go b/internal/app/server/open_saves_test.go
index a9ed77c..341e64a 100644
--- a/internal/app/server/open_saves_test.go
+++ b/internal/app/server/open_saves_test.go
@@ -131,7 +131,6 @@ func TestOpenSaves_HealthCheck(t *testing.T) {
 }
 
 func TestOpenSaves_RunServer(t *testing.T) {
-	t.Skip()
 	serviceConfig, err := getServiceConfig()
 	if err != nil {
 		t.Fatalf("getServiceConfig err: %v", err)

From 9deb1eec05bb0922bcd3a1de6907d96ad7f25641 Mon Sep 17 00:00:00 2001
From: Alex Hong <9397363+hongalex@users.noreply.github.com>
Date: Thu, 13 Oct 2022 23:57:28 -0700
Subject: [PATCH 6/6] add experimental notice to ServerConfig

---
 internal/pkg/config/model.go | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/internal/pkg/config/model.go b/internal/pkg/config/model.go
index e85fe2f..0f4179b 100644
--- a/internal/pkg/config/model.go
+++ b/internal/pkg/config/model.go
@@ -57,8 +57,11 @@ type ServerConfig struct {
 	Bucket              string
 	Project             string
 	ShutdownGracePeriod time.Duration
-	EnableTrace         bool
-	TraceSampleRate     float64
+	// The following enables OpenCensus Tracing via Cloud Trace
+	// for the Datastore client library.
+	// It is EXPERIMENTAL and subject to change or removal without notice.
+	EnableTrace     bool
+	TraceSampleRate float64
 }
 
 // CacheConfig has configurations for caching control (not Redis specific).