-
Notifications
You must be signed in to change notification settings - Fork 663
/
twins.go
130 lines (98 loc) · 3.82 KB
/
twins.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
123
124
125
126
127
128
129
130
// Copyright (c) Abstract Machines
// SPDX-License-Identifier: Apache-2.0
package tracing
import (
"context"
"github.com/absmach/magistrala/twins"
"go.opentelemetry.io/otel/trace"
)
const (
saveTwinOp = "save_twin"
saveTwinsOp = "save_twins"
updateTwinOp = "update_twin"
retrieveTwinByIDOp = "retrieve_twin_by_id"
retrieveAllTwinsOp = "retrieve_all_twins"
retrieveTwinsByAttributeOp = "retrieve_twins_by_attribute"
removeTwinOp = "remove_twin"
)
var _ twins.TwinRepository = (*twinRepositoryMiddleware)(nil)
type twinRepositoryMiddleware struct {
tracer trace.Tracer
repo twins.TwinRepository
}
// TwinRepositoryMiddleware tracks request and their latency, and adds spans to context.
func TwinRepositoryMiddleware(tracer trace.Tracer, repo twins.TwinRepository) twins.TwinRepository {
return twinRepositoryMiddleware{
tracer: tracer,
repo: repo,
}
}
func (trm twinRepositoryMiddleware) Save(ctx context.Context, tw twins.Twin) (string, error) {
ctx, span := createSpan(ctx, trm.tracer, saveTwinOp)
defer span.End()
return trm.repo.Save(ctx, tw)
}
func (trm twinRepositoryMiddleware) Update(ctx context.Context, tw twins.Twin) error {
ctx, span := createSpan(ctx, trm.tracer, updateTwinOp)
defer span.End()
return trm.repo.Update(ctx, tw)
}
func (trm twinRepositoryMiddleware) RetrieveByID(ctx context.Context, twinID string) (twins.Twin, error) {
ctx, span := createSpan(ctx, trm.tracer, retrieveTwinByIDOp)
defer span.End()
return trm.repo.RetrieveByID(ctx, twinID)
}
func (trm twinRepositoryMiddleware) RetrieveAll(ctx context.Context, owner string, offset, limit uint64, name string, metadata twins.Metadata) (twins.Page, error) {
ctx, span := createSpan(ctx, trm.tracer, retrieveAllTwinsOp)
defer span.End()
return trm.repo.RetrieveAll(ctx, owner, offset, limit, name, metadata)
}
func (trm twinRepositoryMiddleware) RetrieveByAttribute(ctx context.Context, channel, subtopic string) ([]string, error) {
ctx, span := createSpan(ctx, trm.tracer, retrieveAllTwinsOp)
defer span.End()
return trm.repo.RetrieveByAttribute(ctx, channel, subtopic)
}
func (trm twinRepositoryMiddleware) Remove(ctx context.Context, twinID string) error {
ctx, span := createSpan(ctx, trm.tracer, removeTwinOp)
defer span.End()
return trm.repo.Remove(ctx, twinID)
}
type twinCacheMiddleware struct {
tracer trace.Tracer
cache twins.TwinCache
}
// TwinCacheMiddleware tracks request and their latency, and adds spans to context.
func TwinCacheMiddleware(tracer trace.Tracer, cache twins.TwinCache) twins.TwinCache {
return twinCacheMiddleware{
tracer: tracer,
cache: cache,
}
}
func (tcm twinCacheMiddleware) Save(ctx context.Context, twin twins.Twin) error {
ctx, span := createSpan(ctx, tcm.tracer, saveTwinOp)
defer span.End()
return tcm.cache.Save(ctx, twin)
}
func (tcm twinCacheMiddleware) SaveIDs(ctx context.Context, channel, subtopic string, ids []string) error {
ctx, span := createSpan(ctx, tcm.tracer, saveTwinsOp)
defer span.End()
return tcm.cache.SaveIDs(ctx, channel, subtopic, ids)
}
func (tcm twinCacheMiddleware) Update(ctx context.Context, twin twins.Twin) error {
ctx, span := createSpan(ctx, tcm.tracer, updateTwinOp)
defer span.End()
return tcm.cache.Update(ctx, twin)
}
func (tcm twinCacheMiddleware) IDs(ctx context.Context, channel, subtopic string) ([]string, error) {
ctx, span := createSpan(ctx, tcm.tracer, retrieveTwinsByAttributeOp)
defer span.End()
return tcm.cache.IDs(ctx, channel, subtopic)
}
func (tcm twinCacheMiddleware) Remove(ctx context.Context, twinID string) error {
ctx, span := createSpan(ctx, tcm.tracer, removeTwinOp)
defer span.End()
return tcm.cache.Remove(ctx, twinID)
}
func createSpan(ctx context.Context, tracer trace.Tracer, opName string) (context.Context, trace.Span) {
return tracer.Start(ctx, opName)
}