ref: Implement trace control in javascript.

This CL includes logic to properly control setting the trace flags
in javascript.  You can also control tracing by setting a regular
expression to match span names and annotations.  I still need
to add some tests.

Change-Id: I3a1d3a6a4652462d9fc93e2c88e170881005bea8
MultiPart: 2/3
diff --git a/profiles/internal/ipc/client.go b/profiles/internal/ipc/client.go
index 8363bd4..85cd4f7 100644
--- a/profiles/internal/ipc/client.go
+++ b/profiles/internal/ipc/client.go
@@ -28,7 +28,6 @@
 	"v.io/x/ref/profiles/internal/ipc/stream/vc"
 	"v.io/x/ref/profiles/internal/ipc/version"
 	inaming "v.io/x/ref/profiles/internal/naming"
-	ivtrace "v.io/x/ref/profiles/internal/vtrace"
 )
 
 const pkgPath = "v.io/x/ref/profiles/internal/ipc"
@@ -722,7 +721,7 @@
 		GrantedBlessings: fc.grantedBlessings,
 		Blessings:        blessingsRequest,
 		Discharges:       fc.discharges,
-		TraceRequest:     ivtrace.Request(fc.ctx),
+		TraceRequest:     vtrace.GetRequest(fc.ctx),
 	}
 	if err := fc.enc.Encode(req); err != nil {
 		berr := verror.New(verror.ErrBadProtocol, fc.ctx, verror.New(errRequestEncoding, fc.ctx, fmt.Sprintf("%#v", req), err))
@@ -885,7 +884,7 @@
 		clientAckBlessings(fc.flow.VCDataCache(), fc.blessings)
 	}
 	// Incorporate any VTrace info that was returned.
-	ivtrace.Merge(fc.ctx, fc.response.TraceResponse)
+	vtrace.GetStore(fc.ctx).Merge(fc.response.TraceResponse)
 	if fc.response.Error != nil {
 		// TODO(cnicolaou): remove verror.ErrNoAccess with verror version
 		// when ipc.Server is converted.
diff --git a/profiles/internal/ipc/server.go b/profiles/internal/ipc/server.go
index 29f133a..81daa28 100644
--- a/profiles/internal/ipc/server.go
+++ b/profiles/internal/ipc/server.go
@@ -30,7 +30,6 @@
 	"v.io/x/ref/lib/stats"
 	"v.io/x/ref/profiles/internal/ipc/stream/vc"
 	inaming "v.io/x/ref/profiles/internal/naming"
-	ivtrace "v.io/x/ref/profiles/internal/vtrace"
 
 	// TODO(cnicolaou): finish verror2 -> verror transition, in particular
 	// for communicating from server to client.
@@ -957,7 +956,7 @@
 
 	var traceResponse vtrace.Response
 	if fs.allowDebug {
-		traceResponse = ivtrace.Response(fs.T)
+		traceResponse = vtrace.GetResponse(fs.T)
 	}
 
 	// Respond to the client with the response header and positional results.
diff --git a/profiles/internal/vtrace/store.go b/profiles/internal/vtrace/store.go
index c733ed0..1ac8d3c 100644
--- a/profiles/internal/vtrace/store.go
+++ b/profiles/internal/vtrace/store.go
@@ -6,7 +6,6 @@
 	"sync"
 	"time"
 
-	"v.io/v23/context"
 	"v.io/v23/uniqueid"
 	"v.io/v23/vtrace"
 
@@ -79,7 +78,7 @@
 }
 
 // Merge merges a vtrace.Response into the current store.
-func (s *Store) merge(t vtrace.Response) {
+func (s *Store) Merge(t vtrace.Response) {
 	s.mu.Lock()
 	defer s.mu.Unlock()
 
@@ -273,8 +272,3 @@
 	out.ID = ts.id
 	out.Spans = spans
 }
-
-// Merge merges a vtrace.Response into the current store.
-func Merge(ctx *context.T, t vtrace.Response) {
-	getStore(ctx).merge(t)
-}
diff --git a/profiles/internal/vtrace/vtrace.go b/profiles/internal/vtrace/vtrace.go
index 9aca9d7..c35411b 100644
--- a/profiles/internal/vtrace/vtrace.go
+++ b/profiles/internal/vtrace/vtrace.go
@@ -59,29 +59,6 @@
 	return s.store.flags(s.trace)
 }
 
-// Request generates a vtrace.Request from the active Span.
-func Request(ctx *context.T) vtrace.Request {
-	if span := getSpan(ctx); span != nil {
-		return vtrace.Request{
-			SpanID:  span.id,
-			TraceID: span.trace,
-			Flags:   span.flags(),
-		}
-	}
-	return vtrace.Request{}
-}
-
-// Response captures the vtrace.Response for the active Span.
-func Response(ctx *context.T) vtrace.Response {
-	if span := getSpan(ctx); span != nil {
-		return vtrace.Response{
-			Flags: span.flags(),
-			Trace: *span.store.TraceRecord(span.trace),
-		}
-	}
-	return vtrace.Response{}
-}
-
 type contextKey int
 
 const (
@@ -143,6 +120,29 @@
 	return nil
 }
 
+// Request generates a vtrace.Request from the active Span.
+func (m manager) GetRequest(ctx *context.T) vtrace.Request {
+	if span := getSpan(ctx); span != nil {
+		return vtrace.Request{
+			SpanID:  span.id,
+			TraceID: span.trace,
+			Flags:   span.flags(),
+		}
+	}
+	return vtrace.Request{}
+}
+
+// Response captures the vtrace.Response for the active Span.
+func (m manager) GetResponse(ctx *context.T) vtrace.Response {
+	if span := getSpan(ctx); span != nil {
+		return vtrace.Response{
+			Flags: span.flags(),
+			Trace: *span.store.TraceRecord(span.trace),
+		}
+	}
+	return vtrace.Response{}
+}
+
 // Store returns the current vtrace.Store.
 func (m manager) GetStore(ctx *context.T) vtrace.Store {
 	if store := getStore(ctx); store != nil {
diff --git a/services/wsprd/app/app.go b/services/wsprd/app/app.go
index 323303d..089e11a 100644
--- a/services/wsprd/app/app.go
+++ b/services/wsprd/app/app.go
@@ -192,13 +192,9 @@
 
 func (c *Controller) sendRPCResponse(ctx *context.T, w lib.ClientWriter, span vtrace.Span, results []*vdl.Value) {
 	span.Finish()
-	traceRecord := vtrace.GetStore(ctx).TraceRecord(span.Trace())
-
 	response := VeyronRPCResponse{
-		OutArgs: results,
-		TraceResponse: vtrace.Response{
-			Trace: *traceRecord,
-		},
+		OutArgs:       results,
+		TraceResponse: vtrace.GetResponse(ctx),
 	}
 	encoded, err := lib.VomEncode(response)
 	if err != nil {