event: normalize the keys used by all the logging adapters

Change-Id: I1f843784fa5c7871fcf0b66f90da6ce18e8130c6
Reviewed-on: https://go-review.googlesource.com/c/exp/+/325574
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/common.go b/event/common.go
index 2d58a94..e9c9704 100644
--- a/event/common.go
+++ b/event/common.go
@@ -10,11 +10,13 @@
 const End = tagKey("end")
 const MetricKey = valueKey("metric")
 const MetricVal = valueKey("metricValue")
+const Error = errorKey("error")
 
 type stringKey string
 type traceKey string
 type tagKey string
 type valueKey string
+type errorKey string
 
 // Of creates a new message Label.
 func (k stringKey) Of(msg string) Label {
@@ -84,3 +86,22 @@
 	}
 	return Value{}, false
 }
+
+// Of creates a new error Label.
+func (k errorKey) Of(err error) Label {
+	return Label{Name: string(k), Value: ValueOf(err)}
+}
+
+func (k errorKey) Matches(ev *Event) bool {
+	_, found := k.Find(ev)
+	return found
+}
+
+func (k errorKey) Find(ev *Event) (error, bool) {
+	for i := len(ev.Labels) - 1; i >= 0; i-- {
+		if ev.Labels[i].Name == string(k) {
+			return ev.Labels[i].Value.Interface().(error), true
+		}
+	}
+	return nil, false
+}
diff --git a/event/logging/elogr/logr.go b/event/logging/elogr/logr.go
index ba3b405..5f45216 100644
--- a/event/logging/elogr/logr.go
+++ b/event/logging/elogr/logr.go
@@ -11,7 +11,7 @@
 	"github.com/go-logr/logr"
 	"golang.org/x/exp/event"
 	"golang.org/x/exp/event/keys"
-	"golang.org/x/exp/event/logging/internal"
+	"golang.org/x/exp/event/severity"
 )
 
 type logger struct {
@@ -89,12 +89,12 @@
 // while the err field should be used to attach the actual error that
 // triggered this log line, if present.
 func (l *logger) Error(err error, msg string, keysAndValues ...interface{}) {
-	l.log(msg, l.builder.Clone().With(internal.ErrorKey.Of(err)), keysAndValues)
+	l.log(msg, l.builder.Clone().With(event.Error.Of(err)), keysAndValues)
 }
 
 func (l *logger) log(msg string, b event.Builder, keysAndValues []interface{}) {
-	b.With(internal.LevelKey.Of(l.verbosity)) // TODO: Convert verbosity to level.
-	b.With(internal.NameKey.Of(l.name))
+	b.With(convertVerbosity(l.verbosity))
+	b.With(event.Name.Of(l.name))
 	addLabels(b, keysAndValues)
 	b.Log(msg)
 }
@@ -111,3 +111,7 @@
 func newLabel(key, value interface{}) event.Label {
 	return keys.Value(key.(string)).Of(value)
 }
+
+func convertVerbosity(v int) event.Label {
+	return severity.Of(severity.Level(v))
+}
diff --git a/event/logging/elogr/logr_test.go b/event/logging/elogr/logr_test.go
index 8b1faf2..f4b00d2 100644
--- a/event/logging/elogr/logr_test.go
+++ b/event/logging/elogr/logr_test.go
@@ -14,19 +14,19 @@
 	"golang.org/x/exp/event/adapter/eventtest"
 	"golang.org/x/exp/event/keys"
 	"golang.org/x/exp/event/logging/elogr"
-	"golang.org/x/exp/event/logging/internal"
+	"golang.org/x/exp/event/severity"
 )
 
 func TestInfo(t *testing.T) {
 	ctx, th := eventtest.NewCapture()
-	log := elogr.NewLogger(ctx, "/").WithName("n").V(3)
+	log := elogr.NewLogger(ctx, "/").WithName("n").V(int(severity.DebugLevel))
 	log = log.WithName("m")
 	log.Info("mess", "traceID", 17, "resource", "R")
 	want := []event.Event{{
 		At: eventtest.InitialTime,
 		Labels: []event.Label{
-			internal.LevelKey.Of(3),
-			internal.NameKey.Of("n/m"),
+			severity.Debug,
+			event.Name.Of("n/m"),
 			keys.Value("traceID").Of(17),
 			keys.Value("resource").Of("R"),
 			event.Message.Of("mess"),
diff --git a/event/logging/elogrus/logrus.go b/event/logging/elogrus/logrus.go
index 1f563e9..0fc9567 100644
--- a/event/logging/elogrus/logrus.go
+++ b/event/logging/elogrus/logrus.go
@@ -22,7 +22,7 @@
 	"github.com/sirupsen/logrus"
 	"golang.org/x/exp/event"
 	"golang.org/x/exp/event/keys"
-	"golang.org/x/exp/event/logging/internal"
+	"golang.org/x/exp/event/severity"
 )
 
 type formatter struct{}
@@ -47,10 +47,31 @@
 		ctx = context.Background()
 	}
 	b := event.To(ctx).At(e.Time)
-	b.With(internal.LevelKey.Of(int(e.Level))) // TODO: convert level
+	b.With(convertLevel(e.Level))
 	for k, v := range e.Data {
 		b.With(keys.Value(k).Of(v))
 	}
 	b.Log(e.Message)
 	return nil, nil
 }
+
+func convertLevel(level logrus.Level) event.Label {
+	switch level {
+	case logrus.PanicLevel:
+		return severity.Of(severity.FatalLevel + 1)
+	case logrus.FatalLevel:
+		return severity.Fatal
+	case logrus.ErrorLevel:
+		return severity.Error
+	case logrus.WarnLevel:
+		return severity.Warning
+	case logrus.InfoLevel:
+		return severity.Info
+	case logrus.DebugLevel:
+		return severity.Debug
+	case logrus.TraceLevel:
+		return severity.Trace
+	default:
+		return severity.Trace
+	}
+}
diff --git a/event/logging/elogrus/logrus_test.go b/event/logging/elogrus/logrus_test.go
index ccee07c..b0044d3 100644
--- a/event/logging/elogrus/logrus_test.go
+++ b/event/logging/elogrus/logrus_test.go
@@ -17,7 +17,7 @@
 	"golang.org/x/exp/event/adapter/eventtest"
 	"golang.org/x/exp/event/keys"
 	"golang.org/x/exp/event/logging/elogrus"
-	"golang.org/x/exp/event/logging/internal"
+	"golang.org/x/exp/event/severity"
 )
 
 func Test(t *testing.T) {
@@ -30,7 +30,7 @@
 
 	want := []event.Event{{
 		Labels: []event.Label{
-			internal.LevelKey.Of(4),
+			severity.Info,
 			keys.Value("traceID").Of(17),
 			keys.Value("resource").Of("R"),
 			event.Message.Of("mess"),
diff --git a/event/logging/ezap/zap.go b/event/logging/ezap/zap.go
index a19f8c5..1e8774b 100644
--- a/event/logging/ezap/zap.go
+++ b/event/logging/ezap/zap.go
@@ -23,7 +23,7 @@
 	"go.uber.org/zap/zapcore"
 	"golang.org/x/exp/event"
 	"golang.org/x/exp/event/keys"
-	"golang.org/x/exp/event/logging/internal"
+	"golang.org/x/exp/event/severity"
 )
 
 type core struct {
@@ -52,8 +52,8 @@
 func (c *core) Write(e zapcore.Entry, fs []zapcore.Field) error {
 	b := c.builder.Clone().
 		At(e.Time).
-		With(internal.LevelKey.Of(int(e.Level))). // TODO: convert zap level to general level
-		With(internal.NameKey.Of(e.LoggerName))
+		With(convertLevel(e.Level)).
+		With(event.Name.Of(e.LoggerName))
 	// TODO: add these additional labels more efficiently.
 	if e.Stack != "" {
 		b.With(keys.String("stack").Of(e.Stack))
@@ -148,3 +148,24 @@
 
 	return stringer.(fmt.Stringer).String()
 }
+
+func convertLevel(level zapcore.Level) event.Label {
+	switch level {
+	case zapcore.DebugLevel:
+		return severity.Debug
+	case zapcore.InfoLevel:
+		return severity.Info
+	case zapcore.WarnLevel:
+		return severity.Warning
+	case zapcore.ErrorLevel:
+		return severity.Error
+	case zapcore.DPanicLevel:
+		return severity.Of(severity.FatalLevel - 1)
+	case zapcore.PanicLevel:
+		return severity.Of(severity.FatalLevel + 1)
+	case zapcore.FatalLevel:
+		return severity.Fatal
+	default:
+		return severity.Trace
+	}
+}
diff --git a/event/logging/ezap/zap_test.go b/event/logging/ezap/zap_test.go
index a760cdd..0696e59 100644
--- a/event/logging/ezap/zap_test.go
+++ b/event/logging/ezap/zap_test.go
@@ -16,7 +16,7 @@
 	"golang.org/x/exp/event/adapter/eventtest"
 	"golang.org/x/exp/event/keys"
 	"golang.org/x/exp/event/logging/ezap"
-	"golang.org/x/exp/event/logging/internal"
+	"golang.org/x/exp/event/severity"
 )
 
 func Test(t *testing.T) {
@@ -28,8 +28,8 @@
 		Labels: []event.Label{
 			keys.Int64("traceID").Of(17),
 			keys.String("resource").Of("R"),
-			internal.LevelKey.Of(0),
-			internal.NameKey.Of("n/m"),
+			severity.Info,
+			event.Name.Of("n/m"),
 			keys.Float64("pi").Of(3.14),
 			event.Message.Of("mess"),
 		},
diff --git a/event/logging/internal/internal.go b/event/logging/internal/internal.go
deleted file mode 100644
index c02a207..0000000
--- a/event/logging/internal/internal.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package internal
-
-import (
-	"golang.org/x/exp/event/keys"
-)
-
-var (
-	// TODO: these should be in event/keys.
-	LevelKey = keys.Int("level")
-	NameKey  = keys.String("name")
-	ErrorKey = keys.Value("error")
-)