event: add support for custom event kinds Change-Id: Ifb79607cac9378a1de8416f9fe958f34f4585d4c Reviewed-on: https://go-review.googlesource.com/c/exp/+/333072 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 4d6dbf8..2bd82a4 100644 --- a/event/common.go +++ b/event/common.go
@@ -7,6 +7,7 @@ import ( "context" "fmt" + "sync" ) const ( @@ -24,6 +25,8 @@ MetricKind StartKind EndKind + + dynamicKindStart ) type ( @@ -31,6 +34,49 @@ interfaceKey string ) +var ( + dynamicKindMu sync.Mutex + nextDynamicKind = dynamicKindStart + dynamicKindNames map[Kind]string +) + +func NewKind(name string) Kind { + dynamicKindMu.Lock() + defer dynamicKindMu.Unlock() + for _, n := range dynamicKindNames { + if n == name { + panic(fmt.Errorf("kind %s is already registered", name)) + } + } + k := nextDynamicKind + nextDynamicKind++ + dynamicKindNames[k] = name + return k +} + +func (k Kind) String() string { + switch k { + case unknownKind: + return "unknown" + case LogKind: + return "log" + case MetricKind: + return "metric" + case StartKind: + return "start" + case EndKind: + return "end" + default: + dynamicKindMu.Lock() + defer dynamicKindMu.Unlock() + name, ok := dynamicKindNames[k] + if !ok { + return fmt.Sprintf("?unknownKind:%d?", k) + } + return name + } +} + func Log(ctx context.Context, msg string, labels ...Label) { ev := New(ctx, LogKind) if ev != nil {