/
instrumented.go
122 lines (97 loc) · 3.27 KB
/
instrumented.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Copyright © 2018 One Concern
package storage
import (
"context"
"io"
"strings"
opentracing "github.com/opentracing/opentracing-go"
"go.uber.org/zap"
)
func Instrument(tr opentracing.Tracer, logs zap.Logger, store Store) Store {
return &instrumentedStore{
tr: tr,
store: store,
logs: logs,
}
}
type instrumentedStore struct {
store Store
tr opentracing.Tracer
logs zap.Logger
}
func (i *instrumentedStore) KeysPrefix(ctx context.Context, token, prefix, delimiter string, count int) ([]string, string, error) {
span := i.spanFromContext(ctx, i.opName("KeysPrefix"))
defer span.Finish()
i.logs.Info("storage keys with Prefix")
return i.store.KeysPrefix(ctx, token, prefix, delimiter, count)
}
func (i *instrumentedStore) opName(name string) string {
return strings.Join([]string{"storage", i.String(), name}, ".")
}
func (i *instrumentedStore) spanFromContext(ctx context.Context, name string) opentracing.Span {
parent := opentracing.SpanFromContext(ctx)
var span opentracing.Span
if parent != nil {
span = i.tr.StartSpan(name, opentracing.ChildOf(parent.Context()))
} else {
span = i.tr.StartSpan(name)
}
return span
}
func (i *instrumentedStore) Has(ctx context.Context, key string) (bool, error) {
span := i.spanFromContext(ctx, i.opName("Has"))
defer span.Finish()
i.logs.Info("storage has", zap.String("key", key))
return i.store.Has(ctx, key)
}
func (i *instrumentedStore) Get(ctx context.Context, key string) (io.ReadCloser, error) {
span := i.spanFromContext(ctx, i.opName("Get"))
defer span.Finish()
i.logs.Info("storage get", zap.String("key", key))
return i.store.Get(ctx, key)
}
func (i *instrumentedStore) Put(ctx context.Context, key string, rdr io.Reader, c NewKey) error {
span := i.spanFromContext(ctx, i.opName("Put"))
defer span.Finish()
i.logs.Info("storage put", zap.String("key", key))
return i.store.Put(ctx, key, rdr, c)
}
func (i *instrumentedStore) Delete(ctx context.Context, key string) error {
span := i.spanFromContext(ctx, i.opName("Delete"))
defer span.Finish()
i.logs.Info("storage delete", zap.String("key", key))
return i.store.Delete(ctx, key)
}
func (i *instrumentedStore) Keys(ctx context.Context) ([]string, error) {
span := i.spanFromContext(ctx, i.opName("Keys"))
defer span.Finish()
i.logs.Info("storage keys")
return i.store.Keys(ctx)
}
func (i *instrumentedStore) Clear(ctx context.Context) error {
span := i.spanFromContext(ctx, i.opName("Clear"))
defer span.Finish()
i.logs.Info("storage clear")
return i.store.Clear(ctx)
}
func (i *instrumentedStore) String() string {
return i.store.String()
}
func (i *instrumentedStore) GetAt(ctx context.Context, objectName string) (io.ReaderAt, error) {
span := i.spanFromContext(ctx, i.opName("GetAt"))
defer span.Finish()
i.logs.Info("get a offset reader")
return i.store.GetAt(ctx, objectName)
}
func (i *instrumentedStore) GetAttr(ctx context.Context, object string) (Attributes, error) {
span := i.spanFromContext(ctx, i.opName("GetAttr"))
defer span.Finish()
i.logs.Info("get attributes for an object")
return i.store.GetAttr(ctx, object)
}
func (i *instrumentedStore) Touch(ctx context.Context, object string) error {
span := i.spanFromContext(ctx, i.opName("Touch"))
defer span.Finish()
i.logs.Info("touch an object")
return i.store.Touch(ctx, object)
}