From 4eeeff5218f13c94a40a878cfad6a97d5af00a17 Mon Sep 17 00:00:00 2001 From: Marwan Sulaiman Date: Sat, 9 Feb 2019 13:53:46 -0500 Subject: [PATCH 1/7] Extract GCP Monitoring --- gcputils/gcputils.go | 99 +++++++++++++++++++++++++++++++++++++++ server/kit/kitserver.go | 15 ++++-- server/kit/log.go | 3 +- server/kit/sd_log.go | 15 +----- server/kit/stackdriver.go | 66 -------------------------- 5 files changed, 113 insertions(+), 85 deletions(-) create mode 100644 gcputils/gcputils.go delete mode 100644 server/kit/stackdriver.go diff --git a/gcputils/gcputils.go b/gcputils/gcputils.go new file mode 100644 index 000000000..bb45602fd --- /dev/null +++ b/gcputils/gcputils.go @@ -0,0 +1,99 @@ +package gcputils + +import ( + "os" + + "contrib.go.opencensus.io/exporter/stackdriver" + "contrib.go.opencensus.io/exporter/stackdriver/monitoredresource" + "go.opencensus.io/stats/view" + "go.opencensus.io/trace" +) + +// RegisterOpenCensus will register +// the tracing and metrics through +// the stack driver exporter, if exists in the underlying platform. +func RegisterOpenCensus(projectID string, onErr func(error)) error { + svcName, svcVersion := "", "" + if IsGAE() { + _, svcName, svcVersion = GetGAEInfo() + } else if n, v := os.Getenv("SERVICE_NAME"), os.Getenv("SERVICE_VERSION"); n != "" { + svcName, svcVersion = n, v + } + opts := SDExporterOptions(projectID, svcName, svcVersion, onErr) + if opts == nil { + return nil + } + return InitSDExporter(*opts) +} + +// GoogleProjectID returns the GCP Project ID +// that can be used to instantiate various +// GCP clients such as Stack Driver. +func GoogleProjectID() string { + return os.Getenv("GOOGLE_CLOUD_PROJECT") +} + +// IsGAE tells you whether your program is running +// within the App Engine platform. +func IsGAE() bool { + return os.Getenv("GAE_DEPLOYMENT_ID") != "" +} + +// GetGAEInfo returns the GCP Project ID, +// the service, and the version of the application. +func GetGAEInfo() (projectID, service, version string) { + return GoogleProjectID(), + os.Getenv("GAE_SERVICE"), + os.Getenv("GAE_VERSION") +} + +// SDExporterOptions returns Stack Driver Options that you can pass directly +// to the OpenCensus exporter or other libraries. +func SDExporterOptions(projectID, service, version string, onErr func(err error)) *stackdriver.Options { + var mr monitoredresource.Interface + if m := monitoredresource.Autodetect(); m != nil { + mr = m + } else if IsGAE() { + mr = gaeInterface{ + typ: "gae_app", + labels: map[string]string{ + "project_id": projectID, + }, + } + } + if mr == nil { + return nil + } + + return &stackdriver.Options{ + ProjectID: projectID, + MonitoredResource: mr, + OnError: onErr, + DefaultMonitoringLabels: &stackdriver.Labels{}, + DefaultTraceAttributes: map[string]interface{}{ + "service": service, + "version": version, + }, + } +} + +// InitSDExporter will initialize the OpenCensus tracing/metrics exporter +func InitSDExporter(opts stackdriver.Options) error { + exporter, err := stackdriver.NewExporter(opts) + if err != nil { + return err + } + trace.RegisterExporter(exporter) + view.RegisterExporter(exporter) + return nil +} + +// implements contrib.go.opencensus.io/exporter/stackdriver/monitoredresource.Interface +type gaeInterface struct { + typ string + labels map[string]string +} + +func (g gaeInterface) MonitoredResource() (string, map[string]string) { + return g.typ, g.labels +} diff --git a/server/kit/kitserver.go b/server/kit/kitserver.go index cc40da300..8649c2369 100644 --- a/server/kit/kitserver.go +++ b/server/kit/kitserver.go @@ -13,6 +13,7 @@ import ( "cloud.google.com/go/errorreporting" sdpropagation "contrib.go.opencensus.io/exporter/stackdriver/propagation" + "github.com/NYTimes/gizmo/gcputils" "github.com/go-kit/kit/log" httptransport "github.com/go-kit/kit/transport/http" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" @@ -89,16 +90,20 @@ func NewServer(svc Service) *Server { propr propagation.HTTPFormat ) - projectID := googleProjectID() + projectID := gcputils.GoogleProjectID() var svcName, svcVersion string - if isGAE() { - _, svcName, svcVersion = getGAEInfo() + if gcputils.IsGAE() { + _, svcName, svcVersion = gcputils.GetGAEInfo() } else if n, v := os.Getenv("SERVICE_NAME"), os.Getenv("SERVICE_VERSION"); n != "" { svcName, svcVersion = n, v } - if opt := sdExporterOptions(projectID, svcName, svcVersion, lg); opt != nil { - err = initSDExporter(*opt) + onErr := func(err error) { + lg.Log("error", err, "message", "tracing client encountered an error") + } + + if opt := gcputils.SDExporterOptions(projectID, svcName, svcVersion, onErr); opt != nil { + err = gcputils.InitSDExporter(*opt) if err != nil { lg.Log("error", err, "message", "unable to initiate error tracing exporter") diff --git a/server/kit/log.go b/server/kit/log.go index da9fd2642..8d883b085 100644 --- a/server/kit/log.go +++ b/server/kit/log.go @@ -4,6 +4,7 @@ import ( "context" "os" + "github.com/NYTimes/gizmo/gcputils" "github.com/go-kit/kit/log" "github.com/go-kit/kit/transport/http" "google.golang.org/grpc/metadata" @@ -23,7 +24,7 @@ import ( // If an empty string is provided, "gae_log" will be used in App Engine and "stdout" elsewhere. // For more information about to use of logID see the documentation here: https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#FIELDS.log_name func NewLogger(ctx context.Context, logID string) (log.Logger, func() error, error) { - projectID, serviceID, svcVersion := getGAEInfo() + projectID, serviceID, svcVersion := gcputils.GetGAEInfo() lg, cl, err := newStackdriverLogger(ctx, logID, projectID, serviceID, svcVersion) // if Stackdriver logger was not able to find information about monitored resource it returns nil. if err != nil { diff --git a/server/kit/sd_log.go b/server/kit/sd_log.go index 4c15870e3..a3654f0cd 100644 --- a/server/kit/sd_log.go +++ b/server/kit/sd_log.go @@ -5,29 +5,18 @@ import ( "encoding" "encoding/json" "fmt" - "os" "reflect" "strings" "cloud.google.com/go/logging" "contrib.go.opencensus.io/exporter/stackdriver/monitoredresource" + "github.com/NYTimes/gizmo/gcputils" "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" "github.com/pkg/errors" "google.golang.org/genproto/googleapis/api/monitoredres" ) -// project, service, version -func getGAEInfo() (string, string, string) { - return googleProjectID(), - os.Getenv("GAE_SERVICE"), - os.Getenv("GAE_VERSION") -} - -func isGAE() bool { - return os.Getenv("GAE_DEPLOYMENT_ID") != "" -} - type sdLogger struct { project string monRes *monitoredres.MonitoredResource @@ -43,7 +32,7 @@ func newStackdriverLogger(ctx context.Context, logID, projectID, service, versio "version_id": version, }, } - if isGAE() { + if gcputils.IsGAE() { resource.Type = "gae_app" if logID == "" { logID = "app_logs" diff --git a/server/kit/stackdriver.go b/server/kit/stackdriver.go deleted file mode 100644 index 88161657b..000000000 --- a/server/kit/stackdriver.go +++ /dev/null @@ -1,66 +0,0 @@ -package kit - -import ( - "os" - - "contrib.go.opencensus.io/exporter/stackdriver" - "contrib.go.opencensus.io/exporter/stackdriver/monitoredresource" - "github.com/go-kit/kit/log" - "go.opencensus.io/stats/view" - "go.opencensus.io/trace" -) - -func sdExporterOptions(projectID, service, version string, lg log.Logger) *stackdriver.Options { - var mr monitoredresource.Interface - if m := monitoredresource.Autodetect(); m != nil { - mr = m - } else if isGAE() { - mr = gaeInterface{ - typ: "gae_app", - labels: map[string]string{ - "project_id": projectID, - }, - } - } - if mr == nil { - return nil - } - - return &stackdriver.Options{ - ProjectID: projectID, - MonitoredResource: mr, - OnError: func(err error) { - lg.Log("error", err, - "message", "tracing client encountered an error") - }, - DefaultMonitoringLabels: &stackdriver.Labels{}, - DefaultTraceAttributes: map[string]interface{}{ - "service": service, - "version": version, - }, - } -} - -func googleProjectID() string { - return os.Getenv("GOOGLE_CLOUD_PROJECT") -} - -func initSDExporter(opt stackdriver.Options) error { - exporter, err := stackdriver.NewExporter(opt) - if err != nil { - return err - } - trace.RegisterExporter(exporter) - view.RegisterExporter(exporter) - return nil -} - -// implements contrib.go.opencensus.io/exporter/stackdriver/monitoredresource.Interface -type gaeInterface struct { - typ string - labels map[string]string -} - -func (g gaeInterface) MonitoredResource() (string, map[string]string) { - return g.typ, g.labels -} From d49ac47fea2548be5f54ad6dbd3d2dc23df58c86 Mon Sep 17 00:00:00 2001 From: Marwan Sulaiman Date: Sat, 9 Feb 2019 14:07:43 -0500 Subject: [PATCH 2/7] remove s --- gcputils/gcputils.go => gcputil/gcputil.go | 2 +- server/kit/kitserver.go | 12 ++++++------ server/kit/log.go | 4 ++-- server/kit/sd_log.go | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) rename gcputils/gcputils.go => gcputil/gcputil.go (99%) diff --git a/gcputils/gcputils.go b/gcputil/gcputil.go similarity index 99% rename from gcputils/gcputils.go rename to gcputil/gcputil.go index bb45602fd..f939070a5 100644 --- a/gcputils/gcputils.go +++ b/gcputil/gcputil.go @@ -1,4 +1,4 @@ -package gcputils +package gcputil import ( "os" diff --git a/server/kit/kitserver.go b/server/kit/kitserver.go index 8649c2369..d3e20b21c 100644 --- a/server/kit/kitserver.go +++ b/server/kit/kitserver.go @@ -13,7 +13,7 @@ import ( "cloud.google.com/go/errorreporting" sdpropagation "contrib.go.opencensus.io/exporter/stackdriver/propagation" - "github.com/NYTimes/gizmo/gcputils" + "github.com/NYTimes/gizmo/gcputil" "github.com/go-kit/kit/log" httptransport "github.com/go-kit/kit/transport/http" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" @@ -90,10 +90,10 @@ func NewServer(svc Service) *Server { propr propagation.HTTPFormat ) - projectID := gcputils.GoogleProjectID() + projectID := gcputil.GoogleProjectID() var svcName, svcVersion string - if gcputils.IsGAE() { - _, svcName, svcVersion = gcputils.GetGAEInfo() + if gcputil.IsGAE() { + _, svcName, svcVersion = gcputil.GetGAEInfo() } else if n, v := os.Getenv("SERVICE_NAME"), os.Getenv("SERVICE_VERSION"); n != "" { svcName, svcVersion = n, v } @@ -102,8 +102,8 @@ func NewServer(svc Service) *Server { lg.Log("error", err, "message", "tracing client encountered an error") } - if opt := gcputils.SDExporterOptions(projectID, svcName, svcVersion, onErr); opt != nil { - err = gcputils.InitSDExporter(*opt) + if opt := gcputil.SDExporterOptions(projectID, svcName, svcVersion, onErr); opt != nil { + err = gcputil.InitSDExporter(*opt) if err != nil { lg.Log("error", err, "message", "unable to initiate error tracing exporter") diff --git a/server/kit/log.go b/server/kit/log.go index 8d883b085..ceef14a74 100644 --- a/server/kit/log.go +++ b/server/kit/log.go @@ -4,7 +4,7 @@ import ( "context" "os" - "github.com/NYTimes/gizmo/gcputils" + "github.com/NYTimes/gizmo/gcputil" "github.com/go-kit/kit/log" "github.com/go-kit/kit/transport/http" "google.golang.org/grpc/metadata" @@ -24,7 +24,7 @@ import ( // If an empty string is provided, "gae_log" will be used in App Engine and "stdout" elsewhere. // For more information about to use of logID see the documentation here: https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#FIELDS.log_name func NewLogger(ctx context.Context, logID string) (log.Logger, func() error, error) { - projectID, serviceID, svcVersion := gcputils.GetGAEInfo() + projectID, serviceID, svcVersion := gcputil.GetGAEInfo() lg, cl, err := newStackdriverLogger(ctx, logID, projectID, serviceID, svcVersion) // if Stackdriver logger was not able to find information about monitored resource it returns nil. if err != nil { diff --git a/server/kit/sd_log.go b/server/kit/sd_log.go index a3654f0cd..a48b91ad2 100644 --- a/server/kit/sd_log.go +++ b/server/kit/sd_log.go @@ -10,7 +10,7 @@ import ( "cloud.google.com/go/logging" "contrib.go.opencensus.io/exporter/stackdriver/monitoredresource" - "github.com/NYTimes/gizmo/gcputils" + "github.com/NYTimes/gizmo/gcputil" "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" "github.com/pkg/errors" @@ -32,7 +32,7 @@ func newStackdriverLogger(ctx context.Context, logID, projectID, service, versio "version_id": version, }, } - if gcputils.IsGAE() { + if gcputil.IsGAE() { resource.Type = "gae_app" if logID == "" { logID = "app_logs" From 0615a5e487759d1b9200dbf5a2c2918bd9718b50 Mon Sep 17 00:00:00 2001 From: Marwan Sulaiman Date: Sat, 9 Feb 2019 14:10:33 -0500 Subject: [PATCH 3/7] add pkg doc --- gcputil/gcputil.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gcputil/gcputil.go b/gcputil/gcputil.go index f939070a5..5133a4f16 100644 --- a/gcputil/gcputil.go +++ b/gcputil/gcputil.go @@ -1,3 +1,7 @@ +// Package gcputil provides functions +// that interact with various GCP platforms +// such as getting GAE metadata and registering +// stack driver monitoring package gcputil import ( From fff7ddeb3e87ea278edbd9596627596005922296 Mon Sep 17 00:00:00 2001 From: Marwan Sulaiman Date: Sat, 9 Feb 2019 14:50:39 -0500 Subject: [PATCH 4/7] return exporter --- gcputil/gcputil.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/gcputil/gcputil.go b/gcputil/gcputil.go index 5133a4f16..827dfad9a 100644 --- a/gcputil/gcputil.go +++ b/gcputil/gcputil.go @@ -16,7 +16,9 @@ import ( // RegisterOpenCensus will register // the tracing and metrics through // the stack driver exporter, if exists in the underlying platform. -func RegisterOpenCensus(projectID string, onErr func(error)) error { +// If exporter is registered, it returns the exporter so you can call Flush +// when the server terminates to ensure all metrics are uploaded. +func RegisterOpenCensus(projectID string, onErr func(error)) (*stackdriver.Exporter, error) { svcName, svcVersion := "", "" if IsGAE() { _, svcName, svcVersion = GetGAEInfo() @@ -25,9 +27,9 @@ func RegisterOpenCensus(projectID string, onErr func(error)) error { } opts := SDExporterOptions(projectID, svcName, svcVersion, onErr) if opts == nil { - return nil + return nil, nil } - return InitSDExporter(*opts) + return initSDExporterV2(*opts) } // GoogleProjectID returns the GCP Project ID @@ -92,6 +94,18 @@ func InitSDExporter(opts stackdriver.Options) error { return nil } +// TODO(marwan): this is so that I don't break server/kit +// see https://github.com/NYTimes/gizmo/issues/193 +func initSDExporterV2(opts stackdriver.Options) (*stackdriver.Exporter, error) { + exporter, err := stackdriver.NewExporter(opts) + if err != nil { + return nil, err + } + trace.RegisterExporter(exporter) + view.RegisterExporter(exporter) + return exporter, nil +} + // implements contrib.go.opencensus.io/exporter/stackdriver/monitoredresource.Interface type gaeInterface struct { typ string From af57a1b68733dcf8de0e27b43b0add025a711a99 Mon Sep 17 00:00:00 2001 From: Marwan Sulaiman Date: Sun, 10 Feb 2019 17:03:07 -0500 Subject: [PATCH 5/7] return flush func --- gcputil/gcputil.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/gcputil/gcputil.go b/gcputil/gcputil.go index 827dfad9a..70268f87e 100644 --- a/gcputil/gcputil.go +++ b/gcputil/gcputil.go @@ -13,12 +13,11 @@ import ( "go.opencensus.io/trace" ) -// RegisterOpenCensus will register -// the tracing and metrics through +// RegisterOpenCensus will register the tracing and metrics through // the stack driver exporter, if exists in the underlying platform. -// If exporter is registered, it returns the exporter so you can call Flush -// when the server terminates to ensure all metrics are uploaded. -func RegisterOpenCensus(projectID string, onErr func(error)) (*stackdriver.Exporter, error) { +// If exporter is registered, it returns the exporter's flush function so you can +// ensure all metrics are uploaded. The flush function is safe to call. +func RegisterOpenCensus(projectID string, onErr func(error)) (flush func(), err error) { svcName, svcVersion := "", "" if IsGAE() { _, svcName, svcVersion = GetGAEInfo() @@ -27,9 +26,13 @@ func RegisterOpenCensus(projectID string, onErr func(error)) (*stackdriver.Expor } opts := SDExporterOptions(projectID, svcName, svcVersion, onErr) if opts == nil { - return nil, nil + return func() {}, nil } - return initSDExporterV2(*opts) + exp, err := initSDExporterV2(*opts) + if err != nil { + return func() {}, nil + } + return exp.Flush, nil } // GoogleProjectID returns the GCP Project ID From ecee882ec20467eb6671bede7e906b52f61dfddc Mon Sep 17 00:00:00 2001 From: Marwan Sulaiman Date: Mon, 11 Feb 2019 14:25:40 -0500 Subject: [PATCH 6/7] try another approach --- gcputil/gcputil.go | 28 +++------- ocexporters/ocexporters.go | 111 +++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 20 deletions(-) create mode 100644 ocexporters/ocexporters.go diff --git a/gcputil/gcputil.go b/gcputil/gcputil.go index 70268f87e..4f3dfb217 100644 --- a/gcputil/gcputil.go +++ b/gcputil/gcputil.go @@ -13,11 +13,11 @@ import ( "go.opencensus.io/trace" ) -// RegisterOpenCensus will register the tracing and metrics through +// NewOpenCensusExporter will return the tracing and metrics through // the stack driver exporter, if exists in the underlying platform. -// If exporter is registered, it returns the exporter's flush function so you can -// ensure all metrics are uploaded. The flush function is safe to call. -func RegisterOpenCensus(projectID string, onErr func(error)) (flush func(), err error) { +// If exporter is registered, it returns the exporter so you can register +// it and ensure to call Flush on termination. +func NewOpenCensusExporter(projectID string, onErr func(error)) (*stackdriver.Exporter, error) { svcName, svcVersion := "", "" if IsGAE() { _, svcName, svcVersion = GetGAEInfo() @@ -26,13 +26,13 @@ func RegisterOpenCensus(projectID string, onErr func(error)) (flush func(), err } opts := SDExporterOptions(projectID, svcName, svcVersion, onErr) if opts == nil { - return func() {}, nil + return nil, nil } - exp, err := initSDExporterV2(*opts) + exp, err := stackdriver.NewExporter(*opts) if err != nil { - return func() {}, nil + return nil, err } - return exp.Flush, nil + return exp, nil } // GoogleProjectID returns the GCP Project ID @@ -97,18 +97,6 @@ func InitSDExporter(opts stackdriver.Options) error { return nil } -// TODO(marwan): this is so that I don't break server/kit -// see https://github.com/NYTimes/gizmo/issues/193 -func initSDExporterV2(opts stackdriver.Options) (*stackdriver.Exporter, error) { - exporter, err := stackdriver.NewExporter(opts) - if err != nil { - return nil, err - } - trace.RegisterExporter(exporter) - view.RegisterExporter(exporter) - return exporter, nil -} - // implements contrib.go.opencensus.io/exporter/stackdriver/monitoredresource.Interface type gaeInterface struct { typ string diff --git a/ocexporters/ocexporters.go b/ocexporters/ocexporters.go new file mode 100644 index 000000000..77d62d621 --- /dev/null +++ b/ocexporters/ocexporters.go @@ -0,0 +1,111 @@ +package ocexporters + +import ( + "fmt" + "os" + + "contrib.go.opencensus.io/exporter/stackdriver" + "contrib.go.opencensus.io/exporter/stackdriver/monitoredresource" + "go.opencensus.io/exporter/prometheus" + "go.opencensus.io/stats/view" + "go.opencensus.io/trace" +) + +// NewOCExporters returns trace/client exporters +// based on the given environment. ProjectID +// is the GCP projectID for stackdriver (or the prometheus namespace) and backend +// specifies whether the backend is StackDriver or Prometheus +func NewOCExporters(projectID, backend string, onErr func(err error)) (trace.Exporter, view.Exporter, error) { + switch backend { + case "stackdriver": + return getSDExporter(projectID, onErr) + case "prometheus": + return getPrometheusExporter(projectID, onErr) + } + + return nil, nil, fmt.Errorf("unrecognized backend: %v", backend) +} + +func getPrometheusExporter(namespace string, onErr func(error)) (trace.Exporter, view.Exporter, error) { + pe, err := prometheus.NewExporter(prometheus.Options{ + Namespace: namespace, + OnError: onErr, + }) + return nil, pe, err +} + +func getSDExporter(projectID string, onErr func(error)) (trace.Exporter, view.Exporter, error) { + svcName, svcVersion := "", "" + if IsGAE() { + _, svcName, svcVersion = GetGAEInfo() + } else if n, v := os.Getenv("SERVICE_NAME"), os.Getenv("SERVICE_VERSION"); n != "" { + svcName, svcVersion = n, v + } + opts := getSDExporterOptions(projectID, svcName, svcVersion, onErr) + if opts == nil { + return nil, nil, nil + } + exp, err := stackdriver.NewExporter(*opts) + return exp, exp, err +} + +// getSDExporterOptions returns Stack Driver Options that you can pass directly +// to the OpenCensus exporter or other libraries. +func getSDExporterOptions(projectID, service, version string, onErr func(err error)) *stackdriver.Options { + var mr monitoredresource.Interface + if m := monitoredresource.Autodetect(); m != nil { + mr = m + } else if IsGAE() { + mr = gaeInterface{ + typ: "gae_app", + labels: map[string]string{ + "project_id": projectID, + }, + } + } + if mr == nil { + return nil + } + + return &stackdriver.Options{ + ProjectID: projectID, + MonitoredResource: mr, + OnError: onErr, + DefaultMonitoringLabels: &stackdriver.Labels{}, + DefaultTraceAttributes: map[string]interface{}{ + "service": service, + "version": version, + }, + } +} + +// implements contrib.go.opencensus.io/exporter/stackdriver/monitoredresource.Interface +type gaeInterface struct { + typ string + labels map[string]string +} + +func (g gaeInterface) MonitoredResource() (string, map[string]string) { + return g.typ, g.labels +} + +// GoogleProjectID returns the GCP Project ID +// that can be used to instantiate various +// GCP clients such as Stack Driver. +func GoogleProjectID() string { + return os.Getenv("GOOGLE_CLOUD_PROJECT") +} + +// IsGAE tells you whether your program is running +// within the App Engine platform. +func IsGAE() bool { + return os.Getenv("GAE_DEPLOYMENT_ID") != "" +} + +// GetGAEInfo returns the GCP Project ID, +// the service, and the version of the application. +func GetGAEInfo() (projectID, service, version string) { + return GoogleProjectID(), + os.Getenv("GAE_SERVICE"), + os.Getenv("GAE_VERSION") +} From e2aa9e665c9047b42aed0d40edf8cdee1e3b08c8 Mon Sep 17 00:00:00 2001 From: Marwan Sulaiman Date: Mon, 11 Feb 2019 16:37:19 -0500 Subject: [PATCH 7/7] bypass if check --- gcputil/gcputil.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/gcputil/gcputil.go b/gcputil/gcputil.go index 4f3dfb217..c2b4f80c7 100644 --- a/gcputil/gcputil.go +++ b/gcputil/gcputil.go @@ -28,11 +28,7 @@ func NewOpenCensusExporter(projectID string, onErr func(error)) (*stackdriver.Ex if opts == nil { return nil, nil } - exp, err := stackdriver.NewExporter(*opts) - if err != nil { - return nil, err - } - return exp, nil + return stackdriver.NewExporter(*opts) } // GoogleProjectID returns the GCP Project ID