From 1aad832bdec3a0637ae50d61f1351f776919ee8e Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 14 Jan 2015 14:47:19 -0800 Subject: [PATCH] feat(eventlog): e := EventBegin; e.Done() ```Go e := log.EventBegin(ctx, "provide") e.Done() e := log.EventBegin(ctx, "provide") e.Close() // implements io.Closer in case you want to register with some lifecycle management system. ``` --- util/eventlog/example_test.go | 16 ++++++++++++++++ util/eventlog/log.go | 34 ++++++++++++++++++++++++++++++++++ util/eventlog/loggable.go | 6 ++++++ 3 files changed, 56 insertions(+) create mode 100644 util/eventlog/example_test.go diff --git a/util/eventlog/example_test.go b/util/eventlog/example_test.go new file mode 100644 index 000000000000..04984045b0e3 --- /dev/null +++ b/util/eventlog/example_test.go @@ -0,0 +1,16 @@ +package eventlog + +import "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + +func ExampleEventLogger() { + { + log := EventLogger(nil) + e := log.EventBegin(context.Background(), "dial") + e.Done() + } + { + log := EventLogger(nil) + e := log.EventBegin(context.Background(), "dial") + _ = e.Close() // implements io.Closer for convenience + } +} diff --git a/util/eventlog/log.go b/util/eventlog/log.go index c0a4a8fe3d69..682fc5633eaa 100644 --- a/util/eventlog/log.go +++ b/util/eventlog/log.go @@ -1,6 +1,10 @@ package eventlog import ( + "fmt" + "io" + "time" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" prelog "github.com/jbenet/go-ipfs/util/prefixlog" @@ -30,6 +34,15 @@ type EventLogger interface { // Finally the timestamp and package name are added to the accumulator and // the metadata is logged. Event(ctx context.Context, event string, m ...Loggable) + + EventBegin(ctx context.Context, event string, m ...Loggable) DoneCloser +} + +type DoneCloser interface { + // Done ends the event + Done() + // io.Closer is a convenience-alias for Done + io.Closer } // Logger retrieves an event logger by name @@ -53,6 +66,16 @@ func (el *eventLogger) Prefix(fmt string, args ...interface{}) EventLogger { return &eventLogger{system: el.system, PrefixLogger: l} } +func (el *eventLogger) EventBegin(ctx context.Context, event string, metadata ...Loggable) DoneCloser { + start := time.Now() + el.Event(ctx, fmt.Sprintln(event, "Begin"), metadata...) + return doneCloserFunc(func() { + el.Event(ctx, event, append(metadata, LoggableMap(map[string]interface{}{ + "duration": time.Now().Sub(start), + }))...) + }) +} + func (el *eventLogger) Event(ctx context.Context, event string, metadata ...Loggable) { // Collect loggables for later logging @@ -77,3 +100,14 @@ func (el *eventLogger) Event(ctx context.Context, event string, metadata ...Logg e.Log() // TODO replace this when leveled-logs have been implemented } + +type doneCloserFunc func() + +func (f doneCloserFunc) Done() { + f() +} + +func (f doneCloserFunc) Close() error { + f.Done() + return nil +} diff --git a/util/eventlog/loggable.go b/util/eventlog/loggable.go index f2c50e460cfc..e3e794516629 100644 --- a/util/eventlog/loggable.go +++ b/util/eventlog/loggable.go @@ -4,3 +4,9 @@ package eventlog type Loggable interface { Loggable() map[string]interface{} } + +type LoggableMap map[string]interface{} + +func (l LoggableMap) Loggable() map[string]interface{} { + return l +}