event: simplify event

There is no real reason any more to have so many special fields in event.
Make them labels instead.
Also prune all the uses of the keys package, there is no real reason to use it
any more.

Change-Id: I70d4f1c4e71487d7e2d36964652930a581187b2f
Reviewed-on: https://go-review.googlesource.com/c/exp/+/329631
Trust: Ian Cottrell <iancottrell@google.com>
Run-TryBot: Ian Cottrell <iancottrell@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/event/adapter/gokit/gokit.go b/event/adapter/gokit/gokit.go
index c442ed6..e532266 100644
--- a/event/adapter/gokit/gokit.go
+++ b/event/adapter/gokit/gokit.go
@@ -11,7 +11,6 @@
 
 	"github.com/go-kit/kit/log"
 	"golang.org/x/exp/event"
-	"golang.org/x/exp/event/keys"
 )
 
 type logger struct {
@@ -45,10 +44,10 @@
 		if key == "msg" || key == "message" {
 			msg = fmt.Sprint(value)
 		} else {
-			ev.Labels = append(ev.Labels, keys.Value(key).Of(value))
+			ev.Labels = append(ev.Labels, event.Value(key, value))
 		}
 	}
-	ev.Message = msg
+	ev.Labels = append(ev.Labels, event.String("msg", msg))
 	ev.Deliver()
 	return nil
 }
diff --git a/event/adapter/gokit/gokit_test.go b/event/adapter/gokit/gokit_test.go
index 9c84590..dedf75b 100644
--- a/event/adapter/gokit/gokit_test.go
+++ b/event/adapter/gokit/gokit_test.go
@@ -13,7 +13,6 @@
 	"golang.org/x/exp/event"
 	"golang.org/x/exp/event/adapter/gokit"
 	"golang.org/x/exp/event/eventtest"
-	"golang.org/x/exp/event/keys"
 )
 
 func Test(t *testing.T) {
@@ -21,14 +20,14 @@
 	ctx, h := eventtest.NewCapture()
 	log.Log(ctx, "msg", "mess", "level", 1, "name", "n/m", "traceID", 17, "resource", "R")
 	want := []event.Event{{
-		At:      eventtest.InitialTime,
-		Kind:    event.LogKind,
-		Message: "mess",
+		At:   eventtest.InitialTime,
+		Kind: event.LogKind,
 		Labels: []event.Label{
-			keys.Value("level").Of(1),
-			keys.Value("name").Of("n/m"),
-			keys.Value("traceID").Of(17),
-			keys.Value("resource").Of("R"),
+			event.Value("level", 1),
+			event.Value("name", "n/m"),
+			event.Value("traceID", 17),
+			event.Value("resource", "R"),
+			event.String("msg", "mess"),
 		},
 	}}
 	if diff := cmp.Diff(want, h.Got, eventtest.CmpOption()); diff != "" {
diff --git a/event/adapter/logfmt/logfmt.go b/event/adapter/logfmt/logfmt.go
index 451d2de..2ca6e38 100644
--- a/event/adapter/logfmt/logfmt.go
+++ b/event/adapter/logfmt/logfmt.go
@@ -69,22 +69,10 @@
 		p.Label(w, event.Uint64("trace", ev.TraceID))
 	}
 
-	if ev.Message != "" {
-		p.Label(w, event.String("msg", ev.Message))
-	}
-
-	if ev.Name != "" {
-		p.Label(w, event.String("name", ev.Name))
-	}
-
 	if ev.Kind == event.EndKind {
 		p.Label(w, event.Value("end", nil))
 	}
 
-	if ev.Error != nil {
-		p.Label(w, event.Value("err", ev.Error))
-	}
-
 	io.WriteString(w, "\n")
 }
 
diff --git a/event/adapter/logfmt/logfmt_test.go b/event/adapter/logfmt/logfmt_test.go
index 1be397d..45379ce 100644
--- a/event/adapter/logfmt/logfmt_test.go
+++ b/event/adapter/logfmt/logfmt_test.go
@@ -5,7 +5,6 @@
 package logfmt_test
 
 import (
-	"errors"
 	"strings"
 	"testing"
 	"time"
@@ -40,22 +39,14 @@
 		event:  event.Event{Namespace: "golang.org/x/exp/event"},
 		expect: `in="golang.org/x/exp/event"`,
 	}, {
-		name:   "name",
-		event:  event.Event{Name: "named"},
-		expect: `name=named`,
-	}, {
 		name:   "at",
 		event:  event.Event{At: at},
 		expect: `time="2020/03/05 14:27:48"`,
 	}, {
 		name:   "message",
-		event:  event.Event{Message: "a message"},
+		event:  event.Event{Labels: []event.Label{event.String("msg", "a message")}},
 		expect: `msg="a message"`,
 	}, {
-		name:   "error",
-		event:  event.Event{Error: errors.New("an error")},
-		expect: `err="an error"`,
-	}, {
 		name:   "end",
 		event:  event.Event{Kind: event.EndKind},
 		expect: `end`,
@@ -123,15 +114,15 @@
 		expect: `"name with space"=text`,
 	}, {
 		name:   "quoting quote",
-		event:  event.Event{Message: `with"middle`},
+		event:  event.Event{Labels: []event.Label{event.String("msg", `with"middle`)}},
 		expect: `msg="with\"middle"`,
 	}, {
 		name:   "quoting newline",
-		event:  event.Event{Message: "with\nmiddle"},
+		event:  event.Event{Labels: []event.Label{event.String("msg", "with\nmiddle")}},
 		expect: `msg="with\nmiddle"`,
 	}, {
 		name:   "quoting slash",
-		event:  event.Event{Message: `with\middle`},
+		event:  event.Event{Labels: []event.Label{event.String("msg", `with\middle`)}},
 		expect: `msg="with\\middle"`,
 	}, {
 		name: "quoting bytes",
@@ -184,7 +175,7 @@
 		printer: logfmt.Printer{SuppressNamespace: true},
 		event: event.Event{
 			Namespace: "golang.org/x/exp/event",
-			Message:   "some text",
+			Labels:    []event.Label{event.String("msg", "some text")},
 		},
 		before: `in="golang.org/x/exp/event" msg="some text"`,
 		after:  `msg="some text"`,
diff --git a/event/adapter/logr/logr.go b/event/adapter/logr/logr.go
index 23bf172..6877591 100644
--- a/event/adapter/logr/logr.go
+++ b/event/adapter/logr/logr.go
@@ -10,7 +10,6 @@
 
 	"github.com/go-logr/logr"
 	"golang.org/x/exp/event"
-	"golang.org/x/exp/event/keys"
 	"golang.org/x/exp/event/severity"
 )
 
@@ -87,7 +86,7 @@
 func (l *logger) Error(err error, msg string, keysAndValues ...interface{}) {
 	ev := event.New(l.ctx, event.LogKind)
 	if ev != nil {
-		ev.Labels = append(ev.Labels, keys.Value("error").Of(err))
+		ev.Labels = append(ev.Labels, event.Value("error", err))
 		l.log(ev, msg, keysAndValues)
 	}
 }
@@ -98,8 +97,10 @@
 	for i := 0; i < len(keysAndValues); i += 2 {
 		ev.Labels = append(ev.Labels, newLabel(keysAndValues[i], keysAndValues[i+1]))
 	}
-	ev.Name = l.name
-	ev.Message = msg
+	ev.Labels = append(ev.Labels,
+		event.String("name", l.name),
+		event.String("msg", msg),
+	)
 	ev.Deliver()
 }
 
@@ -118,7 +119,7 @@
 }
 
 func newLabel(key, value interface{}) event.Label {
-	return keys.Value(key.(string)).Of(value)
+	return event.Value(key.(string), value)
 }
 
 func convertVerbosity(v int) severity.Level {
diff --git a/event/adapter/logr/logr_test.go b/event/adapter/logr/logr_test.go
index 6417755..0582ba3 100644
--- a/event/adapter/logr/logr_test.go
+++ b/event/adapter/logr/logr_test.go
@@ -13,7 +13,6 @@
 	"golang.org/x/exp/event"
 	elogr "golang.org/x/exp/event/adapter/logr"
 	"golang.org/x/exp/event/eventtest"
-	"golang.org/x/exp/event/keys"
 	"golang.org/x/exp/event/severity"
 )
 
@@ -23,14 +22,14 @@
 	log = log.WithName("m")
 	log.Info("mess", "traceID", 17, "resource", "R")
 	want := []event.Event{{
-		At:      eventtest.InitialTime,
-		Kind:    event.LogKind,
-		Message: "mess",
-		Name:    "n/m",
+		At:   eventtest.InitialTime,
+		Kind: event.LogKind,
 		Labels: []event.Label{
 			severity.Debug.Label(),
-			keys.Value("traceID").Of(17),
-			keys.Value("resource").Of("R"),
+			event.Value("traceID", 17),
+			event.Value("resource", "R"),
+			event.String("name", "n/m"),
+			event.String("msg", "mess"),
 		},
 	}}
 	if diff := cmp.Diff(want, th.Got, eventtest.CmpOption()); diff != "" {
diff --git a/event/adapter/logrus/logrus.go b/event/adapter/logrus/logrus.go
index af41ce4..beef9d4 100644
--- a/event/adapter/logrus/logrus.go
+++ b/event/adapter/logrus/logrus.go
@@ -21,7 +21,6 @@
 
 	"github.com/sirupsen/logrus"
 	"golang.org/x/exp/event"
-	"golang.org/x/exp/event/keys"
 	"golang.org/x/exp/event/severity"
 )
 
@@ -53,9 +52,9 @@
 	ev.At = e.Time
 	ev.Labels = append(ev.Labels, convertLevel(e.Level).Label())
 	for k, v := range e.Data {
-		ev.Labels = append(ev.Labels, keys.Value(k).Of(v))
+		ev.Labels = append(ev.Labels, event.Value(k, v))
 	}
-	ev.Message = e.Message
+	ev.Labels = append(ev.Labels, event.String("msg", e.Message))
 	ev.Deliver()
 	return nil, nil
 }
diff --git a/event/adapter/logrus/logrus_test.go b/event/adapter/logrus/logrus_test.go
index 8b1f98a..4915361 100644
--- a/event/adapter/logrus/logrus_test.go
+++ b/event/adapter/logrus/logrus_test.go
@@ -16,7 +16,6 @@
 	"golang.org/x/exp/event"
 	elogrus "golang.org/x/exp/event/adapter/logrus"
 	"golang.org/x/exp/event/eventtest"
-	"golang.org/x/exp/event/keys"
 	"golang.org/x/exp/event/severity"
 )
 
@@ -29,12 +28,12 @@
 	log.WithContext(ctx).WithField("traceID", 17).WithField("resource", "R").Info("mess")
 
 	want := []event.Event{{
-		Kind:    event.LogKind,
-		Message: "mess",
+		Kind: event.LogKind,
 		Labels: []event.Label{
 			severity.Info.Label(),
-			keys.Value("traceID").Of(17),
-			keys.Value("resource").Of("R"),
+			event.Value("traceID", 17),
+			event.Value("resource", "R"),
+			event.String("msg", "mess"),
 		},
 	}}
 	// logrus fields are stored in a map, so we have to sort to overcome map
diff --git a/event/adapter/zap/zap.go b/event/adapter/zap/zap.go
index e73e45d..013a987 100644
--- a/event/adapter/zap/zap.go
+++ b/event/adapter/zap/zap.go
@@ -22,7 +22,6 @@
 	"go.uber.org/zap"
 	"go.uber.org/zap/zapcore"
 	"golang.org/x/exp/event"
-	"golang.org/x/exp/event/keys"
 	"golang.org/x/exp/event/severity"
 )
 
@@ -61,18 +60,18 @@
 	ev.At = e.Time
 	ev.Labels = append(ev.Labels, c.labels...)
 	ev.Labels = append(ev.Labels, convertLevel(e.Level).Label())
-	ev.Name = e.LoggerName
+	ev.Labels = append(ev.Labels, event.String("name", e.LoggerName))
 	// TODO: add these additional labels more efficiently.
 	if e.Stack != "" {
-		ev.Labels = append(ev.Labels, keys.String("stack").Of(e.Stack))
+		ev.Labels = append(ev.Labels, event.String("stack", e.Stack))
 	}
 	if e.Caller.Defined {
-		ev.Labels = append(ev.Labels, keys.String("caller").Of(e.Caller.String()))
+		ev.Labels = append(ev.Labels, event.String("caller", e.Caller.String()))
 	}
 	for _, f := range fs {
 		ev.Labels = append(ev.Labels, newLabel(f))
 	}
-	ev.Message = e.Message
+	ev.Labels = append(ev.Labels, event.String("msg", e.Message))
 	ev.Deliver()
 	return nil
 }
@@ -88,39 +87,38 @@
 	case zapcore.ArrayMarshalerType, zapcore.ObjectMarshalerType, zapcore.BinaryType, zapcore.ByteStringType,
 		zapcore.Complex128Type, zapcore.Complex64Type, zapcore.TimeFullType, zapcore.ReflectType,
 		zapcore.ErrorType:
-		return keys.Value(f.Key).Of(f.Interface)
+		return event.Value(f.Key, f.Interface)
 	case zapcore.DurationType:
 		// TODO: avoid this allocation?
-		return keys.Value(f.Key).Of(time.Duration(f.Integer))
+		return event.Value(f.Key, time.Duration(f.Integer))
 	case zapcore.Float64Type:
-		return keys.Float64(f.Key).Of(math.Float64frombits(uint64(f.Integer)))
+		return event.Float64(f.Key, math.Float64frombits(uint64(f.Integer)))
 	case zapcore.Float32Type:
-		return keys.Float32(f.Key).Of(math.Float32frombits(uint32(f.Integer)))
+		return event.Float64(f.Key, float64(math.Float32frombits(uint32(f.Integer))))
 	case zapcore.BoolType:
 		b := false
 		if f.Integer != 0 {
 			b = true
 		}
-		return keys.Bool(f.Key).Of(b)
+		return event.Bool(f.Key, b)
 	case zapcore.Int64Type:
-		return keys.Int64(f.Key).Of(f.Integer)
+		return event.Int64(f.Key, f.Integer)
 	case zapcore.Int32Type:
-		return keys.Int32(f.Key).Of(int32(f.Integer))
+		return event.Int64(f.Key, f.Integer)
 
 		//, zapcore.Int16Type, zapcore.Int8Type,
 		// 		zapcore.Uint64Type, zapcore.Uint32Type, zapcore.Uint16Type, zapcore.Uint8Type, zapcore.UintptrType:
-		//		return (f.Key).Of(uint64(f.Integer))
+		//		return (f.Key,uint64(f.Integer))
 	case zapcore.StringType:
-		return keys.String(f.Key).Of(f.String)
+		return event.String(f.Key, f.String)
 	case zapcore.TimeType:
-		key := keys.Value(f.Key)
 		t := time.Unix(0, f.Integer)
 		if f.Interface != nil {
 			t = t.In(f.Interface.(*time.Location))
 		}
-		return key.Of(t)
+		return event.Value(f.Key, t)
 	case zapcore.StringerType:
-		return keys.String(f.Key).Of(stringerToString(f.Interface))
+		return event.String(f.Key, stringerToString(f.Interface))
 	case zapcore.NamespaceType:
 		// TODO: ???
 		return event.Label{}
diff --git a/event/adapter/zap/zap_test.go b/event/adapter/zap/zap_test.go
index 870fc56..a928bfb 100644
--- a/event/adapter/zap/zap_test.go
+++ b/event/adapter/zap/zap_test.go
@@ -14,7 +14,6 @@
 	"golang.org/x/exp/event"
 	ezap "golang.org/x/exp/event/adapter/zap"
 	"golang.org/x/exp/event/eventtest"
-	"golang.org/x/exp/event/keys"
 	"golang.org/x/exp/event/severity"
 )
 
@@ -24,14 +23,14 @@
 	log = log.Named("n/m")
 	log.Info("mess", zap.Float64("pi", 3.14))
 	want := []event.Event{{
-		Kind:    event.LogKind,
-		Message: "mess",
-		Name:    "n/m",
+		Kind: event.LogKind,
 		Labels: []event.Label{
-			keys.Int64("traceID").Of(17),
-			keys.String("resource").Of("R"),
+			event.Int64("traceID", 17),
+			event.String("resource", "R"),
 			severity.Info.Label(),
-			keys.Float64("pi").Of(3.14),
+			event.String("name", "n/m"),
+			event.Float64("pi", 3.14),
+			event.String("msg", "mess"),
 		},
 	}}
 	if diff := cmp.Diff(want, h.Got, eventtest.CmpOption()); diff != "" {
diff --git a/event/bench_test.go b/event/bench_test.go
index 8cc1206..b3bd0ea 100644
--- a/event/bench_test.go
+++ b/event/bench_test.go
@@ -12,26 +12,18 @@
 	"golang.org/x/exp/event"
 	"golang.org/x/exp/event/adapter/logfmt"
 	"golang.org/x/exp/event/eventtest"
-	"golang.org/x/exp/event/keys"
 	"golang.org/x/exp/event/severity"
 )
 
 var (
-	aValue  = keys.Int(eventtest.A.Name)
-	bValue  = keys.String(eventtest.B.Name)
-	aCount  = keys.Int64("aCount")
-	aStat   = keys.Int("aValue")
-	bCount  = keys.Int64("B")
-	bLength = keys.Int("BLen")
-
 	eventLog = eventtest.Hooks{
 		AStart: func(ctx context.Context, a int) context.Context {
-			severity.Info.Log(ctx, eventtest.A.Msg, aValue.Of(a))
+			severity.Info.Log(ctx, eventtest.A.Msg, event.Int64(eventtest.A.Name, int64(a)))
 			return ctx
 		},
 		AEnd: func(ctx context.Context) {},
 		BStart: func(ctx context.Context, b string) context.Context {
-			severity.Info.Log(ctx, eventtest.B.Msg, bValue.Of(b))
+			severity.Info.Log(ctx, eventtest.B.Msg, event.String(eventtest.B.Name, b))
 			return ctx
 		},
 		BEnd: func(ctx context.Context) {},
@@ -52,14 +44,14 @@
 
 	eventTrace = eventtest.Hooks{
 		AStart: func(ctx context.Context, a int) context.Context {
-			ctx = event.Start(ctx, eventtest.A.Msg, aValue.Of(a))
+			ctx = event.Start(ctx, eventtest.A.Msg, event.Int64(eventtest.A.Name, int64(a)))
 			return ctx
 		},
 		AEnd: func(ctx context.Context) {
 			event.End(ctx)
 		},
 		BStart: func(ctx context.Context, b string) context.Context {
-			ctx = event.Start(ctx, eventtest.B.Msg, bValue.Of(b))
+			ctx = event.Start(ctx, eventtest.B.Msg, event.String(eventtest.B.Name, b))
 			return ctx
 		},
 		BEnd: func(ctx context.Context) {
@@ -69,14 +61,14 @@
 
 	eventMetric = eventtest.Hooks{
 		AStart: func(ctx context.Context, a int) context.Context {
-			gauge.Record(ctx, 1, aStat.Of(a))
-			gauge.Record(ctx, 1, aCount.Of(1))
+			gauge.Record(ctx, 1, event.Int64("aValue", int64(a)))
+			gauge.Record(ctx, 1, event.Int64("aCount", 1))
 			return ctx
 		},
 		AEnd: func(ctx context.Context) {},
 		BStart: func(ctx context.Context, b string) context.Context {
-			gauge.Record(ctx, 1, bLength.Of(len(b)))
-			gauge.Record(ctx, 1, bCount.Of(1))
+			gauge.Record(ctx, 1, event.Int64("BLen", int64(len(b))))
+			gauge.Record(ctx, 1, event.Int64("B", 1))
 			return ctx
 		},
 		BEnd: func(ctx context.Context) {},
diff --git a/event/common.go b/event/common.go
index 34bfc8c..529a79e 100644
--- a/event/common.go
+++ b/event/common.go
@@ -36,7 +36,7 @@
 	ev := New(ctx, LogKind)
 	if ev != nil {
 		ev.Labels = append(ev.Labels, labels...)
-		ev.Message = msg
+		ev.Labels = append(ev.Labels, String("msg", msg))
 		ev.Deliver()
 	}
 }
@@ -44,7 +44,7 @@
 func Logf(ctx context.Context, msg string, args ...interface{}) {
 	ev := New(ctx, LogKind)
 	if ev != nil {
-		ev.Message = fmt.Sprintf(msg, args...)
+		ev.Labels = append(ev.Labels, String("msg", fmt.Sprintf(msg, args...)))
 		ev.Deliver()
 	}
 }
@@ -60,8 +60,8 @@
 func Start(ctx context.Context, name string, labels ...Label) context.Context {
 	ev := New(ctx, StartKind)
 	if ev != nil {
+		ev.Labels = append(ev.Labels, String("name", name))
 		ev.Labels = append(ev.Labels, labels...)
-		ev.Name = name
 		ev.TraceID = atomic.AddUint64(&ev.target.exporter.lastEvent, 1)
 		ev.target.exporter.prepare(ev)
 		ev.ctx = newContext(ev.ctx, ev.target.exporter, ev.TraceID, ev.At)
diff --git a/event/common_test.go b/event/common_test.go
index 852da43..b5383bc 100644
--- a/event/common_test.go
+++ b/event/common_test.go
@@ -11,7 +11,6 @@
 
 	"golang.org/x/exp/event"
 	"golang.org/x/exp/event/eventtest"
-	"golang.org/x/exp/event/keys"
 )
 
 func TestCommon(t *testing.T) {
@@ -36,7 +35,7 @@
 	checkName(t, h, "Metric", "")
 	h.Reset()
 
-	event.Annotate(ctx, keys.String("").Of(""))
+	event.Annotate(ctx, event.String("", ""))
 	checkMessage(t, h, "Annotate", "")
 	checkName(t, h, "Annotate", "")
 	h.Reset()
@@ -60,8 +59,16 @@
 		t.Errorf("Got %d events, expected 1", len(h.Got))
 		return
 	}
-	if h.Got[0].Message != text {
-		t.Errorf("Expected event with Message %q from %s got %q", text, method, h.Got[0].Message)
+	for _, l := range h.Got[0].Labels {
+		if l.Name == "msg" {
+			if l.String() != text {
+				t.Errorf("Expected event with Message %q from %s got %q", text, method, l.String())
+			}
+			return
+		}
+	}
+	if text != "" {
+		t.Errorf("Expected event with Message %q from %s got %q", text, method, "")
 	}
 }
 
@@ -70,7 +77,15 @@
 		t.Errorf("Got %d events, expected 1", len(h.Got))
 		return
 	}
-	if h.Got[0].Name != text {
-		t.Errorf("Expected event with Name %q from %s got %q", text, method, h.Got[0].Name)
+	for _, l := range h.Got[0].Labels {
+		if l.Name == "name" {
+			if l.String() != text {
+				t.Errorf("Expected event with Name %q from %s got %q", text, method, l.String())
+			}
+			return
+		}
+	}
+	if text != "" {
+		t.Errorf("Expected event with Name %q from %s got %q", text, method, "")
 	}
 }
diff --git a/event/event.go b/event/event.go
index b0718ee..7c3aed6 100644
--- a/event/event.go
+++ b/event/event.go
@@ -18,9 +18,6 @@
 	Namespace string    // namespace of event; if empty, set by exporter to import path
 	At        time.Time // time at which the event is delivered to the exporter.
 	Kind      Kind
-	Message   string
-	Name      string
-	Error     error
 	Labels    []Label
 
 	ctx    context.Context
diff --git a/event/event_test.go b/event/event_test.go
index 8c8ba35..8bedc21 100644
--- a/event/event_test.go
+++ b/event/event_test.go
@@ -17,13 +17,12 @@
 	"golang.org/x/exp/event"
 	"golang.org/x/exp/event/adapter/logfmt"
 	"golang.org/x/exp/event/eventtest"
-	"golang.org/x/exp/event/keys"
 )
 
 var (
-	l1      = keys.Int("l1").Of(1)
-	l2      = keys.Int("l2").Of(2)
-	l3      = keys.Int("l3").Of(3)
+	l1      = event.Int64("l1", 1)
+	l2      = event.Int64("l2", 2)
+	l3      = event.Int64("l3", 3)
 	counter = event.NewCounter("hits", "cache hits")
 	gauge   = event.NewFloatGauge("temperature", "CPU board temperature in Celsius")
 	latency = event.NewDuration("latency", "how long it took")
@@ -58,7 +57,7 @@
 			event.End(ctx)
 		},
 		expect: `
-time="2020/03/05 14:27:48" trace=1 name=span
+time="2020/03/05 14:27:48" name=span trace=1
 time="2020/03/05 14:27:49" parent=1 end
 `}, {
 		name: "span nested",
@@ -70,8 +69,8 @@
 			event.Log(child, "message")
 		},
 		expect: `
-time="2020/03/05 14:27:48" trace=1 name=parent
-time="2020/03/05 14:27:49" parent=1 trace=2 name=child
+time="2020/03/05 14:27:48" name=parent trace=1
+time="2020/03/05 14:27:49" parent=1 name=child trace=2
 time="2020/03/05 14:27:50" parent=2 msg=message
 time="2020/03/05 14:27:51" parent=2 end
 time="2020/03/05 14:27:52" parent=1 end
@@ -106,8 +105,8 @@
 			t.With(p).Int("myInt", 6).Message("my event").Send()
 			t.With(p).String("myString", "some string value").Message("string event").Send()
 			*/
-			event.Log(ctx, "my event", keys.Int("myInt").Of(6))
-			event.Log(ctx, "string event", keys.String("myString").Of("some string value"))
+			event.Log(ctx, "my event", event.Int64("myInt", 6))
+			event.Log(ctx, "string event", event.String("myString", "some string value"))
 		},
 		expect: `
 time="2020/03/05 14:27:48" myInt=6 msg="my event"
@@ -126,8 +125,8 @@
 
 func ExampleLog() {
 	ctx := event.WithExporter(context.Background(), event.NewExporter(logfmt.NewHandler(os.Stdout), eventtest.ExporterOptions()))
-	event.Log(ctx, "my event", keys.Int("myInt").Of(6))
-	event.Log(ctx, "error event", keys.String("myString").Of("some string value"))
+	event.Log(ctx, "my event", event.Int64("myInt", 6))
+	event.Log(ctx, "error event", event.String("myString", "some string value"))
 	// Output:
 	// time="2020/03/05 14:27:48" myInt=6 msg="my event"
 	// time="2020/03/05 14:27:49" myString="some string value" msg="error event"
diff --git a/event/otel/trace.go b/event/otel/trace.go
index 06883e6..66a670e 100644
--- a/event/otel/trace.go
+++ b/event/otel/trace.go
@@ -24,8 +24,8 @@
 func (t *TraceHandler) Event(ctx context.Context, ev *event.Event) context.Context {
 	switch ev.Kind {
 	case event.StartKind:
-		opts := labelsToSpanOptions(ev.Labels)
-		octx, span := t.tracer.Start(ctx, ev.Name, opts...)
+		name, opts := labelsToSpanOptions(ev.Labels)
+		octx, span := t.tracer.Start(ctx, name, opts...)
 		return context.WithValue(octx, spanKey{}, span)
 	case event.EndKind:
 		span, ok := ctx.Value(spanKey{}).(trace.Span)
@@ -39,8 +39,9 @@
 	}
 }
 
-func labelsToSpanOptions(ls []event.Label) []trace.SpanOption {
+func labelsToSpanOptions(ls []event.Label) (string, []trace.SpanOption) {
 	var opts []trace.SpanOption
+	var name string
 	for _, l := range ls {
 		switch l.Name {
 		case "link":
@@ -49,7 +50,9 @@
 			opts = append(opts, trace.WithNewRoot())
 		case "spanKind":
 			opts = append(opts, trace.WithSpanKind(l.Interface().(trace.SpanKind)))
+		case "name":
+			name = l.String()
 		}
 	}
-	return opts
+	return name, opts
 }
diff --git a/event/severity/severity.go b/event/severity/severity.go
index 7d30cab..aeae88d 100644
--- a/event/severity/severity.go
+++ b/event/severity/severity.go
@@ -55,7 +55,7 @@
 	if ev != nil {
 		ev.Labels = append(ev.Labels, l.Label())
 		ev.Labels = append(ev.Labels, labels...)
-		ev.Message = msg
+		ev.Labels = append(ev.Labels, event.String("msg", msg))
 		ev.Deliver()
 	}
 }
@@ -64,7 +64,7 @@
 	ev := event.New(ctx, event.LogKind)
 	if ev != nil {
 		ev.Labels = append(ev.Labels, l.Label())
-		ev.Message = fmt.Sprintf(msg, args...)
+		ev.Labels = append(ev.Labels, event.String("msg", fmt.Sprintf(msg, args...)))
 		ev.Deliver()
 	}
 }
diff --git a/jsonrpc2/conn.go b/jsonrpc2/conn.go
index 1b26d3a..f7ddaa1 100644
--- a/jsonrpc2/conn.go
+++ b/jsonrpc2/conn.go
@@ -12,7 +12,6 @@
 	"sync/atomic"
 
 	"golang.org/x/exp/event"
-	"golang.org/x/exp/event/keys"
 	errors "golang.org/x/xerrors"
 )
 
@@ -124,11 +123,11 @@
 	if err != nil {
 		return errors.Errorf("marshaling notify parameters: %v", err)
 	}
-	ctx = event.Start(ctx, method, RPCDirection.Of(Outbound))
-	Started.Record(ctx, 1, Method.Of(method))
+	ctx = event.Start(ctx, method, RPCDirection(Outbound))
+	Started.Record(ctx, 1, Method(method))
 	var errLabel event.Label
 	if err = c.write(ctx, notify); err != nil {
-		errLabel = keys.Value("error").Of(err)
+		errLabel = event.Value("error", err)
 	}
 	Finished.Record(ctx, 1, errLabel)
 	event.End(ctx)
@@ -154,8 +153,8 @@
 	}
 	//TODO: rewrite this using the new target/prototype stuff
 	ctx = event.Start(ctx, method,
-		Method.Of(method), RPCDirection.Of(Outbound), RPCID.Of(fmt.Sprintf("%q", result.id)))
-	Started.Record(ctx, 1, Method.Of(method))
+		Method(method), RPCDirection(Outbound), RPCID(fmt.Sprintf("%q", result.id)))
+	Started.Record(ctx, 1, Method(method))
 	result.ctx = ctx
 	// We have to add ourselves to the pending map before we send, otherwise we
 	// are racing the response.
@@ -194,7 +193,7 @@
 // The response will be unmarshaled from JSON into the result.
 func (a *AsyncCall) Await(ctx context.Context, result interface{}) error {
 	status := "NONE"
-	defer event.End(a.ctx, StatusCode.Of(status))
+	defer event.End(a.ctx, StatusCode(status))
 	var r asyncResult
 	select {
 	case response := <-a.response:
@@ -297,12 +296,12 @@
 			// add a span to the context for this request
 			var idLabel event.Label
 			if msg.IsCall() {
-				idLabel = RPCID.Of(fmt.Sprintf("%q", msg.ID))
+				idLabel = RPCID(fmt.Sprintf("%q", msg.ID))
 			}
 			entry.baseCtx = event.Start(ctx, msg.Method,
-				Method.Of(msg.Method), RPCDirection.Of(Inbound), idLabel)
-			Started.Record(entry.baseCtx, 1, Method.Of(msg.Method))
-			ReceivedBytes.Record(entry.baseCtx, n, Method.Of(msg.Method))
+				Method(msg.Method), RPCDirection(Inbound), idLabel)
+			Started.Record(entry.baseCtx, 1, Method(msg.Method))
+			ReceivedBytes.Record(entry.baseCtx, n, Method(msg.Method))
 			// in theory notifications cannot be cancelled, but we build them a cancel context anyway
 			entry.handleCtx, entry.cancel = context.WithCancel(entry.baseCtx)
 			// if the request is a call, add it to the incoming map so it can be
@@ -415,7 +414,7 @@
 	if err := c.respond(entry, result, rerr); err != nil {
 		// no way to propagate this error
 		//TODO: should we do more than just log it?
-		event.Log(entry.baseCtx, "jsonrpc2 message delivery failed", keys.Value("error").Of(err))
+		event.Log(entry.baseCtx, "jsonrpc2 message delivery failed", event.Value("error", err))
 	}
 }
 
@@ -461,7 +460,7 @@
 		entry.cancel = nil
 	}
 	// mark the entire request processing as done
-	event.End(entry.baseCtx, StatusCode.Of(status))
+	event.End(entry.baseCtx, StatusCode(status))
 	return err
 }
 
diff --git a/jsonrpc2/defs.go b/jsonrpc2/defs.go
index 802a205..80b25c1 100644
--- a/jsonrpc2/defs.go
+++ b/jsonrpc2/defs.go
@@ -6,15 +6,12 @@
 
 import (
 	"golang.org/x/exp/event"
-	"golang.org/x/exp/event/keys"
 )
 
-var (
-	Method       = keys.String("method")
-	RPCID        = keys.String("id")
-	RPCDirection = keys.String("direction")
-	StatusCode   = keys.String("status.code")
-)
+func Method(v string) event.Label       { return event.String("method", v) }
+func RPCID(v string) event.Label        { return event.String("id", v) }
+func RPCDirection(v string) event.Label { return event.String("direction", v) }
+func StatusCode(v string) event.Label   { return event.String("status.code", v) }
 
 var (
 	Started       = event.NewCounter("started", "Count of started RPCs.")