@cryptotaxi247 / kubo / commits / b252d0450

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. ```

Brian Tiger Chow committed Jan 14, 2015 at 14:47 UTC b252d0450d7568746085afc487bfb5d10c125a64
3 files changed +56
util/eventlog/example_test.go new
+16
@@ -0,0 +1,16 @@
1 +package eventlog
2 +
3 +import "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
4 +
5 +func ExampleEventLogger() {
6 + {
7 + log := EventLogger(nil)
8 + e := log.EventBegin(context.Background(), "dial")
9 + e.Done()
10 + }
11 + {
12 + log := EventLogger(nil)
13 + e := log.EventBegin(context.Background(), "dial")
14 + _ = e.Close() // implements io.Closer for convenience
15 + }
16 +}
util/eventlog/log.go
+34
@@ -1,6 +1,10 @@
1 package eventlog
2
3 import (
4 + "fmt"
5 + "io"
6 + "time"
7 +
8 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
9
10 prelog "github.com/jbenet/go-ipfs/util/prefixlog"
@@ -30,6 +34,15 @@ type EventLogger interface {
34 // Finally the timestamp and package name are added to the accumulator and
35 // the metadata is logged.
36 Event(ctx context.Context, event string, m ...Loggable)
37 +
38 + EventBegin(ctx context.Context, event string, m ...Loggable) DoneCloser
39 +}
40 +
41 +type DoneCloser interface {
42 + // Done ends the event
43 + Done()
44 + // io.Closer is a convenience-alias for Done
45 + io.Closer
46 }
47
48 // Logger retrieves an event logger by name
@@ -53,6 +66,16 @@ func (el *eventLogger) Prefix(fmt string, args ...interface{}) EventLogger {
66 return &eventLogger{system: el.system, PrefixLogger: l}
67 }
68
69 +func (el *eventLogger) EventBegin(ctx context.Context, event string, metadata ...Loggable) DoneCloser {
70 + start := time.Now()
71 + el.Event(ctx, fmt.Sprintln(event, "Begin"), metadata...)
72 + return doneCloserFunc(func() {
73 + el.Event(ctx, event, append(metadata, LoggableMap(map[string]interface{}{
74 + "duration": time.Now().Sub(start),
75 + }))...)
76 + })
77 +}
78 +
79 func (el *eventLogger) Event(ctx context.Context, event string, metadata ...Loggable) {
80
81 // Collect loggables for later logging
@@ -77,3 +100,14 @@ func (el *eventLogger) Event(ctx context.Context, event string, metadata ...Logg
100
101 e.Log() // TODO replace this when leveled-logs have been implemented
102 }
103 +
104 +type doneCloserFunc func()
105 +
106 +func (f doneCloserFunc) Done() {
107 + f()
108 +}
109 +
110 +func (f doneCloserFunc) Close() error {
111 + f.Done()
112 + return nil
113 +}
util/eventlog/loggable.go
+6
@@ -4,3 +4,9 @@ package eventlog
4 type Loggable interface {
5 Loggable() map[string]interface{}
6 }
7 +
8 +type LoggableMap map[string]interface{}
9 +
10 +func (l LoggableMap) Loggable() map[string]interface{} {
11 + return l
12 +}