@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.
Files changed (67) hide show
  1. package/OtlpSerialization/package.json +6 -0
  2. package/dist/cjs/Otlp.js +19 -1
  3. package/dist/cjs/Otlp.js.map +1 -1
  4. package/dist/cjs/OtlpLogger.js +13 -8
  5. package/dist/cjs/OtlpLogger.js.map +1 -1
  6. package/dist/cjs/OtlpMetrics.js +4 -1
  7. package/dist/cjs/OtlpMetrics.js.map +1 -1
  8. package/dist/cjs/OtlpSerialization.js +55 -0
  9. package/dist/cjs/OtlpSerialization.js.map +1 -0
  10. package/dist/cjs/OtlpTracer.js +3 -1
  11. package/dist/cjs/OtlpTracer.js.map +1 -1
  12. package/dist/cjs/index.js +3 -1
  13. package/dist/cjs/internal/otlpExporter.js +3 -1
  14. package/dist/cjs/internal/otlpExporter.js.map +1 -1
  15. package/dist/cjs/internal/otlpProtobuf.js +430 -0
  16. package/dist/cjs/internal/otlpProtobuf.js.map +1 -0
  17. package/dist/cjs/internal/protobuf.js +183 -0
  18. package/dist/cjs/internal/protobuf.js.map +1 -0
  19. package/dist/cjs/internal/tracer.js +9 -2
  20. package/dist/cjs/internal/tracer.js.map +1 -1
  21. package/dist/dts/Otlp.d.ts +49 -0
  22. package/dist/dts/Otlp.d.ts.map +1 -1
  23. package/dist/dts/OtlpLogger.d.ts +3 -2
  24. package/dist/dts/OtlpLogger.d.ts.map +1 -1
  25. package/dist/dts/OtlpMetrics.d.ts +3 -2
  26. package/dist/dts/OtlpMetrics.d.ts.map +1 -1
  27. package/dist/dts/OtlpSerialization.d.ts +53 -0
  28. package/dist/dts/OtlpSerialization.d.ts.map +1 -0
  29. package/dist/dts/OtlpTracer.d.ts +3 -2
  30. package/dist/dts/OtlpTracer.d.ts.map +1 -1
  31. package/dist/dts/index.d.ts +9 -0
  32. package/dist/dts/index.d.ts.map +1 -1
  33. package/dist/dts/internal/otlpProtobuf.d.ts +501 -0
  34. package/dist/dts/internal/otlpProtobuf.d.ts.map +1 -0
  35. package/dist/dts/internal/protobuf.d.ts +100 -0
  36. package/dist/dts/internal/protobuf.d.ts.map +1 -0
  37. package/dist/esm/Otlp.js +18 -0
  38. package/dist/esm/Otlp.js.map +1 -1
  39. package/dist/esm/OtlpLogger.js +13 -8
  40. package/dist/esm/OtlpLogger.js.map +1 -1
  41. package/dist/esm/OtlpMetrics.js +4 -1
  42. package/dist/esm/OtlpMetrics.js.map +1 -1
  43. package/dist/esm/OtlpSerialization.js +46 -0
  44. package/dist/esm/OtlpSerialization.js.map +1 -0
  45. package/dist/esm/OtlpTracer.js +3 -1
  46. package/dist/esm/OtlpTracer.js.map +1 -1
  47. package/dist/esm/index.js +9 -0
  48. package/dist/esm/index.js.map +1 -1
  49. package/dist/esm/internal/otlpExporter.js +3 -1
  50. package/dist/esm/internal/otlpExporter.js.map +1 -1
  51. package/dist/esm/internal/otlpProtobuf.js +396 -0
  52. package/dist/esm/internal/otlpProtobuf.js.map +1 -0
  53. package/dist/esm/internal/protobuf.js +155 -0
  54. package/dist/esm/internal/protobuf.js.map +1 -0
  55. package/dist/esm/internal/tracer.js +9 -2
  56. package/dist/esm/internal/tracer.js.map +1 -1
  57. package/package.json +11 -26
  58. package/src/Otlp.ts +53 -1
  59. package/src/OtlpLogger.ts +15 -10
  60. package/src/OtlpMetrics.ts +8 -4
  61. package/src/OtlpSerialization.ts +64 -0
  62. package/src/OtlpTracer.ts +6 -3
  63. package/src/index.ts +10 -0
  64. package/src/internal/otlpExporter.ts +6 -4
  65. package/src/internal/otlpProtobuf.ts +729 -0
  66. package/src/internal/protobuf.ts +219 -0
  67. 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)
@@ -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
- startTime = arguments[1]
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()