@effect/opentelemetry 0.59.3 → 0.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/OtlpSerialization/package.json +6 -0
- package/dist/cjs/Otlp.js +19 -1
- package/dist/cjs/Otlp.js.map +1 -1
- package/dist/cjs/OtlpLogger.js +13 -8
- package/dist/cjs/OtlpLogger.js.map +1 -1
- package/dist/cjs/OtlpMetrics.js +4 -1
- package/dist/cjs/OtlpMetrics.js.map +1 -1
- package/dist/cjs/OtlpSerialization.js +55 -0
- package/dist/cjs/OtlpSerialization.js.map +1 -0
- package/dist/cjs/OtlpTracer.js +3 -1
- package/dist/cjs/OtlpTracer.js.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/internal/otlpExporter.js +3 -1
- package/dist/cjs/internal/otlpExporter.js.map +1 -1
- package/dist/cjs/internal/otlpProtobuf.js +430 -0
- package/dist/cjs/internal/otlpProtobuf.js.map +1 -0
- package/dist/cjs/internal/protobuf.js +183 -0
- package/dist/cjs/internal/protobuf.js.map +1 -0
- package/dist/cjs/internal/tracer.js +9 -2
- package/dist/cjs/internal/tracer.js.map +1 -1
- package/dist/dts/Otlp.d.ts +49 -0
- package/dist/dts/Otlp.d.ts.map +1 -1
- package/dist/dts/OtlpLogger.d.ts +3 -2
- package/dist/dts/OtlpLogger.d.ts.map +1 -1
- package/dist/dts/OtlpMetrics.d.ts +3 -2
- package/dist/dts/OtlpMetrics.d.ts.map +1 -1
- package/dist/dts/OtlpSerialization.d.ts +53 -0
- package/dist/dts/OtlpSerialization.d.ts.map +1 -0
- package/dist/dts/OtlpTracer.d.ts +3 -2
- package/dist/dts/OtlpTracer.d.ts.map +1 -1
- package/dist/dts/index.d.ts +9 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/otlpProtobuf.d.ts +501 -0
- package/dist/dts/internal/otlpProtobuf.d.ts.map +1 -0
- package/dist/dts/internal/protobuf.d.ts +100 -0
- package/dist/dts/internal/protobuf.d.ts.map +1 -0
- package/dist/esm/Otlp.js +18 -0
- package/dist/esm/Otlp.js.map +1 -1
- package/dist/esm/OtlpLogger.js +13 -8
- package/dist/esm/OtlpLogger.js.map +1 -1
- package/dist/esm/OtlpMetrics.js +4 -1
- package/dist/esm/OtlpMetrics.js.map +1 -1
- package/dist/esm/OtlpSerialization.js +46 -0
- package/dist/esm/OtlpSerialization.js.map +1 -0
- package/dist/esm/OtlpTracer.js +3 -1
- package/dist/esm/OtlpTracer.js.map +1 -1
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/otlpExporter.js +3 -1
- package/dist/esm/internal/otlpExporter.js.map +1 -1
- package/dist/esm/internal/otlpProtobuf.js +396 -0
- package/dist/esm/internal/otlpProtobuf.js.map +1 -0
- package/dist/esm/internal/protobuf.js +155 -0
- package/dist/esm/internal/protobuf.js.map +1 -0
- package/dist/esm/internal/tracer.js +9 -2
- package/dist/esm/internal/tracer.js.map +1 -1
- package/package.json +11 -26
- package/src/Otlp.ts +53 -1
- package/src/OtlpLogger.ts +15 -10
- package/src/OtlpMetrics.ts +8 -4
- package/src/OtlpSerialization.ts +64 -0
- package/src/OtlpTracer.ts +6 -3
- package/src/index.ts +10 -0
- package/src/internal/otlpExporter.ts +6 -4
- package/src/internal/otlpProtobuf.ts +729 -0
- package/src/internal/protobuf.ts +219 -0
- package/src/internal/tracer.ts +13 -2
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Low-level protobuf wire format encoding utilities.
|
|
3
|
+
*
|
|
4
|
+
* Protobuf wire types:
|
|
5
|
+
* - 0: Varint (int32, int64, uint32, uint64, sint32, sint64, bool, enum)
|
|
6
|
+
* - 1: 64-bit (fixed64, sfixed64, double)
|
|
7
|
+
* - 2: Length-delimited (string, bytes, embedded messages, packed repeated fields)
|
|
8
|
+
* - 5: 32-bit (fixed32, sfixed32, float)
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const enum WireType {
|
|
14
|
+
Varint = 0,
|
|
15
|
+
Fixed64 = 1,
|
|
16
|
+
LengthDelimited = 2,
|
|
17
|
+
Fixed32 = 5
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Encodes a field tag (field number + wire type)
|
|
22
|
+
*/
|
|
23
|
+
const encodeTag = (fieldNumber: number, wireType: WireType): number => (fieldNumber << 3) | wireType
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Encodes a varint (variable-length integer)
|
|
27
|
+
*/
|
|
28
|
+
export const encodeVarint = (value: number | bigint): Uint8Array => {
|
|
29
|
+
const bytes: Array<number> = []
|
|
30
|
+
let n = typeof value === "bigint" ? value : BigInt(value)
|
|
31
|
+
while (n > 0x7fn) {
|
|
32
|
+
bytes.push(Number(n & 0x7fn) | 0x80)
|
|
33
|
+
n >>= 7n
|
|
34
|
+
}
|
|
35
|
+
bytes.push(Number(n))
|
|
36
|
+
return new Uint8Array(bytes)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Encodes a signed varint using ZigZag encoding
|
|
41
|
+
*/
|
|
42
|
+
export const encodeSint = (value: number | bigint): Uint8Array => {
|
|
43
|
+
const n = typeof value === "bigint" ? value : BigInt(value)
|
|
44
|
+
const zigzag = (n << 1n) ^ (n >> 63n)
|
|
45
|
+
return encodeVarint(zigzag)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Encodes a 64-bit fixed value (little-endian)
|
|
50
|
+
*/
|
|
51
|
+
export const encodeFixed64 = (value: bigint): Uint8Array => {
|
|
52
|
+
const bytes = new Uint8Array(8)
|
|
53
|
+
const view = new DataView(bytes.buffer)
|
|
54
|
+
view.setBigUint64(0, value, true)
|
|
55
|
+
return bytes
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Encodes a 32-bit fixed value (little-endian)
|
|
60
|
+
*/
|
|
61
|
+
export const encodeFixed32 = (value: number): Uint8Array => {
|
|
62
|
+
const bytes = new Uint8Array(4)
|
|
63
|
+
const view = new DataView(bytes.buffer)
|
|
64
|
+
view.setUint32(0, value, true)
|
|
65
|
+
return bytes
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Encodes a double (64-bit float, little-endian)
|
|
70
|
+
*/
|
|
71
|
+
export const encodeDouble = (value: number): Uint8Array => {
|
|
72
|
+
const bytes = new Uint8Array(8)
|
|
73
|
+
const view = new DataView(bytes.buffer)
|
|
74
|
+
view.setFloat64(0, value, true)
|
|
75
|
+
return bytes
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Encodes a string to UTF-8 bytes
|
|
80
|
+
*/
|
|
81
|
+
export const encodeString = (value: string): Uint8Array => new TextEncoder().encode(value)
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Encodes bytes as a hex string to Uint8Array
|
|
85
|
+
*/
|
|
86
|
+
export const encodeHexBytes = (hex: string): Uint8Array => {
|
|
87
|
+
const bytes = new Uint8Array(hex.length / 2)
|
|
88
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
89
|
+
bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16)
|
|
90
|
+
}
|
|
91
|
+
return bytes
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Concatenates multiple Uint8Arrays
|
|
96
|
+
*/
|
|
97
|
+
export const concat = (...arrays: Array<Uint8Array>): Uint8Array => {
|
|
98
|
+
const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0)
|
|
99
|
+
const result = new Uint8Array(totalLength)
|
|
100
|
+
let offset = 0
|
|
101
|
+
for (const arr of arrays) {
|
|
102
|
+
result.set(arr, offset)
|
|
103
|
+
offset += arr.length
|
|
104
|
+
}
|
|
105
|
+
return result
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Field encoders
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Encodes a varint field
|
|
112
|
+
*/
|
|
113
|
+
export const varintField = (fieldNumber: number, value: number | bigint): Uint8Array =>
|
|
114
|
+
concat(
|
|
115
|
+
encodeVarint(encodeTag(fieldNumber, WireType.Varint)),
|
|
116
|
+
encodeVarint(value)
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Encodes a sint field (ZigZag encoded)
|
|
121
|
+
*/
|
|
122
|
+
export const sintField = (fieldNumber: number, value: number | bigint): Uint8Array =>
|
|
123
|
+
concat(
|
|
124
|
+
encodeVarint(encodeTag(fieldNumber, WireType.Varint)),
|
|
125
|
+
encodeSint(value)
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Encodes a bool field
|
|
130
|
+
*/
|
|
131
|
+
export const boolField = (fieldNumber: number, value: boolean): Uint8Array => varintField(fieldNumber, value ? 1 : 0)
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Encodes a fixed64 field
|
|
135
|
+
*/
|
|
136
|
+
export const fixed64Field = (fieldNumber: number, value: bigint): Uint8Array =>
|
|
137
|
+
concat(
|
|
138
|
+
encodeVarint(encodeTag(fieldNumber, WireType.Fixed64)),
|
|
139
|
+
encodeFixed64(value)
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Encodes a fixed32 field
|
|
144
|
+
*/
|
|
145
|
+
export const fixed32Field = (fieldNumber: number, value: number): Uint8Array =>
|
|
146
|
+
concat(
|
|
147
|
+
encodeVarint(encodeTag(fieldNumber, WireType.Fixed32)),
|
|
148
|
+
encodeFixed32(value)
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Encodes a double field
|
|
153
|
+
*/
|
|
154
|
+
export const doubleField = (fieldNumber: number, value: number): Uint8Array =>
|
|
155
|
+
concat(
|
|
156
|
+
encodeVarint(encodeTag(fieldNumber, WireType.Fixed64)),
|
|
157
|
+
encodeDouble(value)
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Encodes a length-delimited field (bytes, string, embedded message)
|
|
162
|
+
*/
|
|
163
|
+
export const lengthDelimitedField = (fieldNumber: number, value: Uint8Array): Uint8Array =>
|
|
164
|
+
concat(
|
|
165
|
+
encodeVarint(encodeTag(fieldNumber, WireType.LengthDelimited)),
|
|
166
|
+
encodeVarint(value.length),
|
|
167
|
+
value
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Encodes a string field
|
|
172
|
+
*/
|
|
173
|
+
export const stringField = (fieldNumber: number, value: string): Uint8Array =>
|
|
174
|
+
lengthDelimitedField(fieldNumber, encodeString(value))
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Encodes a bytes field from hex string
|
|
178
|
+
*/
|
|
179
|
+
export const bytesFieldFromHex = (fieldNumber: number, hex: string): Uint8Array =>
|
|
180
|
+
lengthDelimitedField(fieldNumber, encodeHexBytes(hex))
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Encodes an embedded message field
|
|
184
|
+
*/
|
|
185
|
+
export const messageField = (fieldNumber: number, message: Uint8Array): Uint8Array =>
|
|
186
|
+
lengthDelimitedField(fieldNumber, message)
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Encodes repeated fields
|
|
190
|
+
*/
|
|
191
|
+
export const repeatedField = <T>(
|
|
192
|
+
fieldNumber: number,
|
|
193
|
+
values: ReadonlyArray<T>,
|
|
194
|
+
encode: (value: T) => Uint8Array
|
|
195
|
+
): Uint8Array => concat(...values.map((v) => messageField(fieldNumber, encode(v))))
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Encodes repeated varint fields (not packed)
|
|
199
|
+
*/
|
|
200
|
+
export const repeatedVarintField = (
|
|
201
|
+
fieldNumber: number,
|
|
202
|
+
values: ReadonlyArray<number | bigint>
|
|
203
|
+
): Uint8Array => concat(...values.map((v) => varintField(fieldNumber, v)))
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Helper to conditionally encode an optional field
|
|
207
|
+
*/
|
|
208
|
+
export const optionalField = <T>(
|
|
209
|
+
value: T | undefined,
|
|
210
|
+
encode: (v: T) => Uint8Array
|
|
211
|
+
): Uint8Array => value !== undefined ? encode(value) : new Uint8Array(0)
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Helper to conditionally encode a string field if non-empty
|
|
215
|
+
*/
|
|
216
|
+
export const optionalStringField = (
|
|
217
|
+
fieldNumber: number,
|
|
218
|
+
value: string | undefined
|
|
219
|
+
): Uint8Array => value !== undefined && value !== "" ? stringField(fieldNumber, value) : new Uint8Array(0)
|
package/src/internal/tracer.ts
CHANGED
|
@@ -266,8 +266,13 @@ const makeOtelSpan = (span: EffectTracer.Span, clock: Clock.Clock): OtelApi.Span
|
|
|
266
266
|
if (arguments.length === 3) {
|
|
267
267
|
attributes = arguments[1]
|
|
268
268
|
startTime = arguments[2]
|
|
269
|
-
} else {
|
|
270
|
-
|
|
269
|
+
} else if (arguments.length === 2) {
|
|
270
|
+
const arg1 = arguments[1]
|
|
271
|
+
if (isTimeInput(arg1)) {
|
|
272
|
+
startTime = arg1
|
|
273
|
+
} else {
|
|
274
|
+
attributes = arg1
|
|
275
|
+
}
|
|
271
276
|
}
|
|
272
277
|
span.event(name, convertOtelTimeInput(startTime, clock), attributes)
|
|
273
278
|
return self
|
|
@@ -318,6 +323,12 @@ const makeOtelSpan = (span: EffectTracer.Span, clock: Clock.Clock): OtelApi.Span
|
|
|
318
323
|
const bigint1e6 = BigInt(1_000_000)
|
|
319
324
|
const bigint1e9 = BigInt(1_000_000_000)
|
|
320
325
|
|
|
326
|
+
/** Distinguishes TimeInput (number | Date | [number, number]) from Attributes (plain object) */
|
|
327
|
+
const isTimeInput = (u: unknown): u is OtelApi.TimeInput =>
|
|
328
|
+
typeof u === "number" ||
|
|
329
|
+
u instanceof Date ||
|
|
330
|
+
(Array.isArray(u) && u.length === 2 && typeof u[0] === "number" && typeof u[1] === "number")
|
|
331
|
+
|
|
321
332
|
const convertOtelTimeInput = (input: OtelApi.TimeInput | undefined, clock: Clock.Clock): bigint => {
|
|
322
333
|
if (input === undefined) {
|
|
323
334
|
return clock.unsafeCurrentTimeNanos()
|