@@ -2,15 +2,21 @@ package metering
2
2
3
3
import (
4
4
"encoding/json"
5
+ "fmt"
6
+ "strconv"
5
7
8
+ "github.com/SigNoz/signoz-otel-collector/pkg/schema/traces"
9
+ "github.com/SigNoz/signoz-otel-collector/utils"
10
+ "github.com/SigNoz/signoz-otel-collector/utils/flatten"
11
+ "go.opentelemetry.io/collector/pdata/pcommon"
6
12
"go.uber.org/zap"
7
13
)
8
14
9
15
type jsonSizer struct {
10
16
Logger * zap.Logger
11
17
}
12
18
13
- func NewJSONSizer (logger * zap.Logger ) * jsonSizer {
19
+ func NewJSONSizer (logger * zap.Logger ) Sizer {
14
20
return & jsonSizer {
15
21
Logger : logger ,
16
22
}
@@ -19,7 +25,137 @@ func NewJSONSizer(logger *zap.Logger) *jsonSizer {
19
25
func (sizer * jsonSizer ) SizeOfMapStringAny (input map [string ]any ) int {
20
26
bytes , err := json .Marshal (input )
21
27
if err != nil {
22
- sizer .Logger .Error ("cannot marshal object, setting size to 0" , zap .Any ("obj" , input ))
28
+ sizer .Logger .Error ("cannot marshal object, setting size to 0" , zap .Error (err ), zap .Any ("obj" , input ))
29
+ return 0
30
+ }
31
+
32
+ return len (bytes )
33
+ }
34
+
35
+ func (sizer * jsonSizer ) SizeOfFlatPcommonMapInMapStringString (input pcommon.Map ) int {
36
+ output := map [string ]string {}
37
+
38
+ input .Range (func (k string , v pcommon.Value ) bool {
39
+ switch v .Type () {
40
+ case pcommon .ValueTypeMap :
41
+ flattened := flatten .FlattenJSON (v .Map ().AsRaw (), k )
42
+ for kf , vf := range flattened {
43
+ output [kf ] = fmt .Sprintf ("%v" , vf )
44
+ }
45
+ default :
46
+ output [k ] = v .AsString ()
47
+ }
48
+ return true
49
+ })
50
+
51
+ bytes , err := json .Marshal (output )
52
+ if err != nil {
53
+ sizer .Logger .Error ("cannot marshal object, setting size to 0" , zap .Error (err ), zap .Any ("obj" , input ))
54
+ return 0
55
+ }
56
+
57
+ return len (bytes )
58
+ }
59
+
60
+ func (sizer * jsonSizer ) SizeOfFlatPcommonMapInNumberStringBool (input pcommon.Map ) (int , int , int ) {
61
+ n := map [string ]float64 {}
62
+ s := map [string ]string {}
63
+ b := map [string ]bool {}
64
+
65
+ input .Range (func (k string , v pcommon.Value ) bool {
66
+ switch v .Type () {
67
+ case pcommon .ValueTypeDouble :
68
+ if utils .IsValidFloat (v .Double ()) {
69
+ n [k ] = v .Double ()
70
+ }
71
+ case pcommon .ValueTypeInt :
72
+ n [k ] = float64 (v .Int ())
73
+ case pcommon .ValueTypeBool :
74
+ b [k ] = v .Bool ()
75
+ case pcommon .ValueTypeMap :
76
+ flattened := flatten .FlattenJSON (v .Map ().AsRaw (), k )
77
+ for kf , vf := range flattened {
78
+ switch tvf := vf .(type ) {
79
+ case string :
80
+ s [kf ] = tvf
81
+ case float64 :
82
+ n [kf ] = tvf
83
+ case bool :
84
+ b [kf ] = tvf
85
+ }
86
+ }
87
+ default :
88
+ s [k ] = v .AsString ()
89
+ }
90
+
91
+ return true
92
+ })
93
+
94
+ nbytes , err := json .Marshal (n )
95
+ if err != nil {
96
+ sizer .Logger .Error ("cannot marshal object, setting size to 0" , zap .Error (err ), zap .Any ("obj" , input ))
97
+ nbytes = []byte (nil )
98
+ }
99
+
100
+ sbytes , err := json .Marshal (s )
101
+ if err != nil {
102
+ sizer .Logger .Error ("cannot marshal object, setting size to 0" , zap .Error (err ), zap .Any ("obj" , input ))
103
+ sbytes = []byte (nil )
104
+ }
105
+
106
+ bbytes , err := json .Marshal (b )
107
+ if err != nil {
108
+ sizer .Logger .Error ("cannot marshal object, setting size to 0" , zap .Error (err ), zap .Any ("obj" , input ))
109
+ bbytes = []byte (nil )
110
+ }
111
+
112
+ return len (nbytes ), len (sbytes ), len (bbytes )
113
+ }
114
+
115
+ func (sizer * jsonSizer ) SizeOfInt (input int ) int {
116
+ return len (strconv .Itoa (input ))
117
+ }
118
+
119
+ func (sizer * jsonSizer ) SizeOfFloat64 (input float64 ) int {
120
+ return len (strconv .FormatFloat (input , 'f' , - 1 , 64 ))
121
+ }
122
+
123
+ func (sizer * jsonSizer ) SizeOfTraceID (input pcommon.TraceID ) int {
124
+ if input .IsEmpty () {
125
+ return 0
126
+ }
127
+
128
+ // Since we encode to hex, the original 16 bytes are stored in 32 bytes
129
+ return 32
130
+ }
131
+
132
+ func (sizer * jsonSizer ) SizeOfSpanID (input pcommon.SpanID ) int {
133
+ if input .IsEmpty () {
134
+ return 0
135
+ }
136
+
137
+ // Since we encode to hex, the original 8 bytes are stored in 16 bytes
138
+ return 16
139
+ }
140
+
141
+ func (sizer * jsonSizer ) SizeOfStringSlice (input []string ) int {
142
+ bytes , err := json .Marshal (input )
143
+ if err != nil {
144
+ sizer .Logger .Error ("cannot marshal object, setting size to 0" , zap .Error (err ), zap .Any ("obj" , input ))
145
+ return 0
146
+ }
147
+
148
+ return len (bytes )
149
+ }
150
+
151
+ func (sizer * jsonSizer ) SizeOfOtelSpanRefs (input []traces.OtelSpanRef ) int {
152
+ if input == nil {
153
+ return 0
154
+ }
155
+
156
+ bytes , err := json .Marshal (input )
157
+ if err != nil {
158
+ sizer .Logger .Error ("cannot marshal object, setting size to 0" , zap .Error (err ), zap .Any ("obj" , input ))
23
159
return 0
24
160
}
25
161
0 commit comments