internal/worker: only init observer if possible

s.observer is now only initialized if both ProjectID and ServiceID are
set.

This makes it possible run the worker server and view the index page,
without connecting to GCP.

Change-Id: I553034683c00eee7c4f962e59c726eda82c7ea04
Reviewed-on: https://go-review.googlesource.com/c/pkgsite-metrics/+/465220
Reviewed-by: Julie Qiu <julieqiu@google.com>
Auto-Submit: Julie Qiu <julieqiu@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Julie Qiu <julieqiu@google.com>
diff --git a/internal/observe/observe.go b/internal/observe/observe.go
index dc062d5..0cc2c27 100644
--- a/internal/observe/observe.go
+++ b/internal/observe/observe.go
@@ -77,6 +77,10 @@
 // Observe adds metrics and tracing to an http.Handler.
 func (o *Observer) Observe(h http.Handler) http.Handler {
 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		if o == nil {
+			h.ServeHTTP(w, r.WithContext(r.Context()))
+			return
+		}
 		var otherHandler event.Handler
 		if o.LogHandlerFunc != nil {
 			otherHandler = o.LogHandlerFunc(r)
diff --git a/internal/worker/server.go b/internal/worker/server.go
index 0fa8bf4..06e9ad2 100644
--- a/internal/worker/server.go
+++ b/internal/worker/server.go
@@ -101,18 +101,20 @@
 		return nil, err
 	}
 
-	s.observer, err = observe.NewObserver(ctx, cfg.ProjectID, cfg.ServiceID)
-	if err != nil {
-		return nil, err
-	}
-	// This function will be called for each request.
-	// It lets us install a log handler that knows about the request's
-	// trace ID.
-	s.observer.LogHandlerFunc = func(r *http.Request) event.Handler {
-		traceID := r.Header.Get("X-Cloud-Trace-Context")
-		return log.NewGCPJSONHandler(os.Stderr, traceID)
-	}
+	if cfg.ProjectID != "" && cfg.ServiceID != "" {
+		s.observer, err = observe.NewObserver(ctx, cfg.ProjectID, cfg.ServiceID)
+		if err != nil {
+			return nil, err
 
+		}
+		// This function will be called for each request.
+		// It lets us install a log handler that knows about the request's
+		// trace ID.
+		s.observer.LogHandlerFunc = func(r *http.Request) event.Handler {
+			traceID := r.Header.Get("X-Cloud-Trace-Context")
+			return log.NewGCPJSONHandler(os.Stderr, traceID)
+		}
+	}
 	if cfg.UseErrorReporting {
 		reportingClient, err := errorreporting.NewClient(ctx, cfg.ProjectID, errorreporting.Config{
 			ServiceName: cfg.ServiceID,
@@ -144,7 +146,7 @@
 	return s, nil
 }
 
-const metricNamespace = "metrics/worker"
+const metricNamespace = "ecosystem/worker"
 
 type handlerFunc func(w http.ResponseWriter, r *http.Request) error