@posthog/core 1.49.2 → 1.50.1

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 (41) hide show
  1. package/dist/featureFlagLocalEvaluation.d.ts +1 -1
  2. package/dist/featureFlagLocalEvaluation.d.ts.map +1 -1
  3. package/dist/featureFlagLocalEvaluation.js +149 -10
  4. package/dist/featureFlagLocalEvaluation.mjs +149 -10
  5. package/dist/index.d.ts +3 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +48 -31
  8. package/dist/index.mjs +4 -2
  9. package/dist/logs/logs-utils.d.ts +1 -3
  10. package/dist/logs/logs-utils.d.ts.map +1 -1
  11. package/dist/logs/logs-utils.js +7 -170
  12. package/dist/logs/logs-utils.mjs +6 -163
  13. package/dist/metrics/index.js +2 -2
  14. package/dist/metrics/index.mjs +1 -1
  15. package/dist/metrics/metrics-utils.d.ts.map +1 -1
  16. package/dist/metrics/metrics-utils.js +4 -14
  17. package/dist/metrics/metrics-utils.mjs +3 -13
  18. package/dist/utils/otlp-any-value.d.ts +5 -0
  19. package/dist/utils/otlp-any-value.d.ts.map +1 -0
  20. package/dist/utils/otlp-any-value.js +203 -0
  21. package/dist/utils/otlp-any-value.mjs +166 -0
  22. package/dist/utils/otlp-resource.d.ts +38 -0
  23. package/dist/utils/otlp-resource.d.ts.map +1 -0
  24. package/dist/utils/otlp-resource.js +81 -0
  25. package/dist/utils/otlp-resource.mjs +41 -0
  26. package/dist/utils/user-agent-utils.d.ts +4 -4
  27. package/dist/utils/user-agent-utils.d.ts.map +1 -1
  28. package/dist/utils/user-agent-utils.js +16 -0
  29. package/dist/utils/user-agent-utils.mjs +16 -0
  30. package/package.json +1 -1
  31. package/src/featureFlagLocalEvaluation.ts +199 -12
  32. package/src/index.ts +2 -2
  33. package/src/logs/logs-utils.spec.ts +2 -350
  34. package/src/logs/logs-utils.ts +5 -215
  35. package/src/metrics/index.ts +1 -1
  36. package/src/metrics/metrics-utils.ts +3 -9
  37. package/src/utils/otlp-any-value.spec.ts +361 -0
  38. package/src/utils/otlp-any-value.ts +225 -0
  39. package/src/utils/otlp-resource.spec.ts +125 -0
  40. package/src/utils/otlp-resource.ts +89 -0
  41. package/src/utils/user-agent-utils.ts +22 -6
package/dist/index.mjs CHANGED
@@ -1,7 +1,9 @@
1
1
  import { MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES, flagDetailsToResults, getEnabledFromValue, getFeatureFlagValue, getVariantFromValue, minimizeFlagCalledEventProperties, parsePayload } from "./featureFlagUtils.mjs";
2
2
  import { InconclusiveMatchError, getFeatureFlagHash, getFeatureFlagVariant, getFeatureFlagVariantLookupTable, hashSHA1, matchFeatureFlagProperty, parseFeatureFlagSemver, relativeDateParseForFeatureFlagMatching, resolveFeatureFlagPayload } from "./featureFlagLocalEvaluation.mjs";
3
3
  import { gzipCompress, isGzipData, isGzipRequest, isGzipSupported, isNativeAsyncGzipError, isNativeAsyncGzipReadError } from "./gzip.mjs";
4
- import { buildOtlpLogRecord, buildOtlpLogsPayload, buildResourceAttributes, getOtlpSeverityNumber, getOtlpSeverityText, toOtlpAnyValue, toOtlpKeyValueList } from "./logs/logs-utils.mjs";
4
+ import { buildOtlpLogRecord, buildOtlpLogsPayload, buildResourceAttributes, getOtlpSeverityNumber, getOtlpSeverityText } from "./logs/logs-utils.mjs";
5
+ import { toOtlpAnyValue, toOtlpKeyValueList } from "./utils/otlp-any-value.mjs";
6
+ import { osResourceAttributes } from "./utils/otlp-resource.mjs";
5
7
  import { PostHogLogs } from "./logs/index.mjs";
6
8
  import { DEFAULT_HISTOGRAM_BOUNDS, PostHogMetrics, buildMetricsResourceAttributes, buildOtlpMetricsPayload, resolveMetricsConfig } from "./metrics/index.mjs";
7
9
  import { uuidv7 } from "./vendor/uuidv7.mjs";
@@ -13,4 +15,4 @@ export * from "./posthog-core-stateless.mjs";
13
15
  export * from "./tracing-headers.mjs";
14
16
  export * from "./types.mjs";
15
17
  import * as __WEBPACK_EXTERNAL_MODULE__error_tracking_index_mjs_b3406d6f__ from "./error-tracking/index.mjs";
16
- export { DEFAULT_HISTOGRAM_BOUNDS, __WEBPACK_EXTERNAL_MODULE__error_tracking_index_mjs_b3406d6f__ as ErrorTracking, InconclusiveMatchError, MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES, PostHogLogs, PostHogMetrics, buildMetricsResourceAttributes, buildOtlpLogRecord, buildOtlpLogsPayload, buildOtlpMetricsPayload, buildResourceAttributes, flagDetailsToResults, getEnabledFromValue, getFeatureFlagHash, getFeatureFlagValue, getFeatureFlagVariant, getFeatureFlagVariantLookupTable, getLengthFromRules, getOtlpSeverityNumber, getOtlpSeverityText, getRequirementsHint, getValidationError, getVariantFromValue, gzipCompress, hashSHA1, isGzipData, isGzipRequest, isGzipSupported, isNativeAsyncGzipError, isNativeAsyncGzipReadError, matchFeatureFlagProperty, minimizeFlagCalledEventProperties, parseFeatureFlagSemver, parsePayload, relativeDateParseForFeatureFlagMatching, resolveFeatureFlagPayload, resolveMetricsConfig, toOtlpAnyValue, toOtlpKeyValueList, uuidv7 };
18
+ export { DEFAULT_HISTOGRAM_BOUNDS, __WEBPACK_EXTERNAL_MODULE__error_tracking_index_mjs_b3406d6f__ as ErrorTracking, InconclusiveMatchError, MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES, PostHogLogs, PostHogMetrics, buildMetricsResourceAttributes, buildOtlpLogRecord, buildOtlpLogsPayload, buildOtlpMetricsPayload, buildResourceAttributes, flagDetailsToResults, getEnabledFromValue, getFeatureFlagHash, getFeatureFlagValue, getFeatureFlagVariant, getFeatureFlagVariantLookupTable, getLengthFromRules, getOtlpSeverityNumber, getOtlpSeverityText, getRequirementsHint, getValidationError, getVariantFromValue, gzipCompress, hashSHA1, isGzipData, isGzipRequest, isGzipSupported, isNativeAsyncGzipError, isNativeAsyncGzipReadError, matchFeatureFlagProperty, minimizeFlagCalledEventProperties, osResourceAttributes, parseFeatureFlagSemver, parsePayload, relativeDateParseForFeatureFlagMatching, resolveFeatureFlagPayload, resolveMetricsConfig, toOtlpAnyValue, toOtlpKeyValueList, uuidv7 };
@@ -1,10 +1,8 @@
1
- import type { CaptureLogOptions, LogAttributeValue, LogSeverityLevel, OtlpAnyValue, OtlpKeyValue, OtlpLogRecord, OtlpLogsPayload, OtlpSeverityText } from '@posthog/types';
1
+ import type { CaptureLogOptions, LogAttributeValue, LogSeverityLevel, OtlpLogRecord, OtlpLogsPayload, OtlpSeverityText } from '@posthog/types';
2
2
  import type { Logger } from '../types';
3
3
  import type { LogSdkContext, ResolvedPostHogLogsConfig } from './types';
4
4
  export declare function getOtlpSeverityText(level: LogSeverityLevel): OtlpSeverityText;
5
5
  export declare function getOtlpSeverityNumber(level: LogSeverityLevel): number;
6
- export declare function toOtlpAnyValue(value: LogAttributeValue, logger?: Logger): OtlpAnyValue;
7
- export declare function toOtlpKeyValueList(attrs: Record<string, LogAttributeValue>, logger?: Logger): OtlpKeyValue[];
8
6
  export declare function buildOtlpLogRecord(options: CaptureLogOptions, sdkContext: LogSdkContext, logger?: Logger, occurredAtMs?: number): OtlpLogRecord;
9
7
  /**
10
8
  * OTLP resource attributes for every batch, shared by the core flush path and
@@ -1 +1 @@
1
- {"version":3,"file":"logs-utils.d.ts","sourceRoot":"","sources":["../../src/logs/logs-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,eAAe,EAEf,gBAAgB,EACjB,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AA4BvE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAE7E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAErE;AAqBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAQtF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAM5G;AAuMD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,aAAa,EACzB,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,aAAa,CA+Ef;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CASnC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,aAAa,EAAE,EAC3B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACrD,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,eAAe,CAcjB"}
1
+ {"version":3,"file":"logs-utils.d.ts","sourceRoot":"","sources":["../../src/logs/logs-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,eAAe,EAEf,gBAAgB,EACjB,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAqBvE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAE7E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAErE;AA0CD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,aAAa,EACzB,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,aAAa,CA+Ef;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAEnC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,aAAa,EAAE,EAC3B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACrD,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,eAAe,CAcjB"}
@@ -24,16 +24,16 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- toOtlpKeyValueList: ()=>toOtlpKeyValueList,
28
27
  getOtlpSeverityNumber: ()=>getOtlpSeverityNumber,
29
28
  buildResourceAttributes: ()=>buildResourceAttributes,
30
29
  getOtlpSeverityText: ()=>getOtlpSeverityText,
31
30
  buildOtlpLogsPayload: ()=>buildOtlpLogsPayload,
32
- buildOtlpLogRecord: ()=>buildOtlpLogRecord,
33
- toOtlpAnyValue: ()=>toOtlpAnyValue
31
+ buildOtlpLogRecord: ()=>buildOtlpLogRecord
34
32
  });
35
33
  const index_js_namespaceObject = require("../utils/index.js");
36
34
  const json_utils_js_namespaceObject = require("../utils/json-utils.js");
35
+ const otlp_any_value_js_namespaceObject = require("../utils/otlp-any-value.js");
36
+ const otlp_resource_js_namespaceObject = require("../utils/otlp-resource.js");
37
37
  const OTLP_SEVERITY_MAP = {
38
38
  trace: {
39
39
  text: 'TRACE',
@@ -67,154 +67,6 @@ function getOtlpSeverityText(level) {
67
67
  function getOtlpSeverityNumber(level) {
68
68
  return (OTLP_SEVERITY_MAP[level] || DEFAULT_OTLP_SEVERITY).number;
69
69
  }
70
- const INT64_RANGE_LIMIT = 9223372036854775808;
71
- const propertyIsEnumerable = Object.prototype.propertyIsEnumerable;
72
- function newState() {
73
- return {
74
- ancestors: new WeakSet(),
75
- remainingNodes: json_utils_js_namespaceObject.MAX_JSON_SAFE_VALUE_NODES
76
- };
77
- }
78
- function toOtlpAnyValue(value, logger) {
79
- try {
80
- return encodeAnyValue(value, logger, newState(), 0);
81
- } catch {
82
- return {
83
- stringValue: json_utils_js_namespaceObject.UNSERIALIZABLE_VALUE
84
- };
85
- }
86
- }
87
- function toOtlpKeyValueList(attrs, logger) {
88
- try {
89
- return encodeKeyValueList(attrs, logger, newState(), 0);
90
- } catch {
91
- return [];
92
- }
93
- }
94
- function encodeAnyValue(value, logger, state, depth) {
95
- if (state.remainingNodes <= 0) return {
96
- stringValue: json_utils_js_namespaceObject.TRUNCATED_VALUE
97
- };
98
- state.remainingNodes--;
99
- if ((0, index_js_namespaceObject.isBoolean)(value)) return {
100
- boolValue: value
101
- };
102
- if ('number' == typeof value) {
103
- if (!Number.isFinite(value)) return {
104
- stringValue: String(value)
105
- };
106
- if (Number.isInteger(value)) {
107
- if (Number.isSafeInteger(value)) return {
108
- intValue: String(value)
109
- };
110
- if ('undefined' == typeof BigInt) return {
111
- stringValue: String(value)
112
- };
113
- const decimal = BigInt(value).toString();
114
- if (value >= INT64_RANGE_LIMIT || value < -INT64_RANGE_LIMIT) {
115
- logger?.debug(`Attribute ${decimal} is outside the int64 range; encoding it as a string`);
116
- return {
117
- stringValue: decimal
118
- };
119
- }
120
- return {
121
- intValue: decimal
122
- };
123
- }
124
- return {
125
- doubleValue: value
126
- };
127
- }
128
- if ('string' == typeof value) return {
129
- stringValue: (0, json_utils_js_namespaceObject.sanitizeString)(value)
130
- };
131
- if ('function' == typeof value) return {
132
- stringValue: json_utils_js_namespaceObject.FUNCTION_VALUE
133
- };
134
- if ('symbol' == typeof value) return {
135
- stringValue: String(value)
136
- };
137
- if ('object' == typeof value && null !== value) {
138
- if (state.ancestors.has(value)) return {
139
- stringValue: json_utils_js_namespaceObject.CIRCULAR_VALUE
140
- };
141
- if (depth >= json_utils_js_namespaceObject.MAX_JSON_SAFE_VALUE_DEPTH) return {
142
- stringValue: json_utils_js_namespaceObject.TRUNCATED_VALUE
143
- };
144
- if (value instanceof Date) {
145
- const time = value.getTime();
146
- const iso = Number.isFinite(time) ? value.toISOString() : String(value);
147
- return {
148
- stringValue: 'string' == typeof iso ? (0, json_utils_js_namespaceObject.sanitizeString)(iso) : String(iso)
149
- };
150
- }
151
- state.ancestors.add(value);
152
- try {
153
- try {
154
- const toJSON = value.toJSON;
155
- if ('function' == typeof toJSON) return encodeAnyValue(toJSON.call(value), logger, state, depth + 1);
156
- } catch {}
157
- if ((0, index_js_namespaceObject.isArray)(value)) return {
158
- arrayValue: {
159
- values: encodeArrayValues(value, logger, state, depth + 1)
160
- }
161
- };
162
- return {
163
- kvlistValue: {
164
- values: encodeKeyValueList(value, logger, state, depth + 1)
165
- }
166
- };
167
- } finally{
168
- state.ancestors.delete(value);
169
- }
170
- }
171
- return {
172
- stringValue: (0, json_utils_js_namespaceObject.sanitizeString)(String(value))
173
- };
174
- }
175
- function encodeArrayValues(values, logger, state, depth) {
176
- const result = [];
177
- const itemCount = Math.min(values.length, json_utils_js_namespaceObject.MAX_JSON_SAFE_VALUE_ITEMS);
178
- let index = 0;
179
- for(; index < itemCount && state.remainingNodes > 0; index++)try {
180
- const element = index in values ? values[index] : void 0;
181
- if ((0, index_js_namespaceObject.isNullish)(element)) continue;
182
- result.push(encodeAnyValue(element, logger, state, depth));
183
- } catch {
184
- result.push({
185
- stringValue: json_utils_js_namespaceObject.UNSERIALIZABLE_VALUE
186
- });
187
- }
188
- if (values.length > index) result.push({
189
- stringValue: json_utils_js_namespaceObject.TRUNCATED_VALUE
190
- });
191
- return result;
192
- }
193
- function encodeKeyValueList(attrs, logger, state, depth) {
194
- const result = [];
195
- for(const key in attrs)if (propertyIsEnumerable.call(attrs, key)) {
196
- if (result.length >= json_utils_js_namespaceObject.MAX_JSON_SAFE_VALUE_ITEMS || state.remainingNodes <= 0) {
197
- logger?.debug('Attributes truncated: the value exceeds the OTLP encoder budget');
198
- break;
199
- }
200
- try {
201
- const value = attrs[key];
202
- if ((0, index_js_namespaceObject.isNull)(value) || (0, index_js_namespaceObject.isUndefined)(value)) continue;
203
- result.push({
204
- key: (0, json_utils_js_namespaceObject.sanitizeString)(key),
205
- value: encodeAnyValue(value, logger, state, depth)
206
- });
207
- } catch {
208
- result.push({
209
- key: (0, json_utils_js_namespaceObject.sanitizeString)(key),
210
- value: {
211
- stringValue: json_utils_js_namespaceObject.UNSERIALIZABLE_VALUE
212
- }
213
- });
214
- }
215
- }
216
- return result;
217
- }
218
70
  function timestampToUnixNano(timestampMs = Date.now()) {
219
71
  return String(timestampMs) + '000000';
220
72
  }
@@ -273,7 +125,7 @@ function buildOtlpLogRecord(options, sdkContext, logger, occurredAtMs) {
273
125
  body: {
274
126
  stringValue: encodeBody(options.body)
275
127
  },
276
- attributes: toOtlpKeyValueList(mergedAttributes, logger)
128
+ attributes: (0, otlp_any_value_js_namespaceObject.toOtlpKeyValueList)(mergedAttributes, logger)
277
129
  };
278
130
  if (options.trace_id) record.traceId = options.trace_id;
279
131
  if (options.span_id) record.spanId = options.span_id;
@@ -281,25 +133,14 @@ function buildOtlpLogRecord(options, sdkContext, logger, occurredAtMs) {
281
133
  return record;
282
134
  }
283
135
  function buildResourceAttributes(config, sdkName, sdkVersion) {
284
- return {
285
- ...config.resourceAttributes,
286
- 'service.name': config.serviceName || 'unknown_service',
287
- ...config.environment && {
288
- 'deployment.environment': config.environment
289
- },
290
- ...config.serviceVersion && {
291
- 'service.version': config.serviceVersion
292
- },
293
- 'telemetry.sdk.name': sdkName,
294
- 'telemetry.sdk.version': sdkVersion
295
- };
136
+ return (0, otlp_resource_js_namespaceObject.buildOtlpResourceAttributes)(config, sdkName, sdkVersion);
296
137
  }
297
138
  function buildOtlpLogsPayload(logRecords, resourceAttributes, scopeName, scopeVersion) {
298
139
  return {
299
140
  resourceLogs: [
300
141
  {
301
142
  resource: {
302
- attributes: toOtlpKeyValueList(resourceAttributes)
143
+ attributes: (0, otlp_any_value_js_namespaceObject.toOtlpKeyValueList)(resourceAttributes)
303
144
  },
304
145
  scopeLogs: [
305
146
  {
@@ -319,16 +160,12 @@ exports.buildOtlpLogsPayload = __webpack_exports__.buildOtlpLogsPayload;
319
160
  exports.buildResourceAttributes = __webpack_exports__.buildResourceAttributes;
320
161
  exports.getOtlpSeverityNumber = __webpack_exports__.getOtlpSeverityNumber;
321
162
  exports.getOtlpSeverityText = __webpack_exports__.getOtlpSeverityText;
322
- exports.toOtlpAnyValue = __webpack_exports__.toOtlpAnyValue;
323
- exports.toOtlpKeyValueList = __webpack_exports__.toOtlpKeyValueList;
324
163
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
325
164
  "buildOtlpLogRecord",
326
165
  "buildOtlpLogsPayload",
327
166
  "buildResourceAttributes",
328
167
  "getOtlpSeverityNumber",
329
- "getOtlpSeverityText",
330
- "toOtlpAnyValue",
331
- "toOtlpKeyValueList"
168
+ "getOtlpSeverityText"
332
169
  ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
333
170
  Object.defineProperty(exports, '__esModule', {
334
171
  value: true
@@ -1,5 +1,7 @@
1
- import { isArray, isBoolean, isNull, isNullish, isNumber, isUndefined } from "../utils/index.mjs";
2
- import { CIRCULAR_VALUE, FUNCTION_VALUE, MAX_JSON_SAFE_VALUE_DEPTH, MAX_JSON_SAFE_VALUE_ITEMS, MAX_JSON_SAFE_VALUE_NODES, TRUNCATED_VALUE, UNSERIALIZABLE_VALUE, sanitizeString } from "../utils/json-utils.mjs";
1
+ import { isNullish, isNumber, isUndefined } from "../utils/index.mjs";
2
+ import { UNSERIALIZABLE_VALUE, sanitizeString } from "../utils/json-utils.mjs";
3
+ import { toOtlpKeyValueList } from "../utils/otlp-any-value.mjs";
4
+ import { buildOtlpResourceAttributes } from "../utils/otlp-resource.mjs";
3
5
  const OTLP_SEVERITY_MAP = {
4
6
  trace: {
5
7
  text: 'TRACE',
@@ -33,154 +35,6 @@ function getOtlpSeverityText(level) {
33
35
  function getOtlpSeverityNumber(level) {
34
36
  return (OTLP_SEVERITY_MAP[level] || DEFAULT_OTLP_SEVERITY).number;
35
37
  }
36
- const INT64_RANGE_LIMIT = 9223372036854775808;
37
- const propertyIsEnumerable = Object.prototype.propertyIsEnumerable;
38
- function newState() {
39
- return {
40
- ancestors: new WeakSet(),
41
- remainingNodes: MAX_JSON_SAFE_VALUE_NODES
42
- };
43
- }
44
- function toOtlpAnyValue(value, logger) {
45
- try {
46
- return encodeAnyValue(value, logger, newState(), 0);
47
- } catch {
48
- return {
49
- stringValue: UNSERIALIZABLE_VALUE
50
- };
51
- }
52
- }
53
- function toOtlpKeyValueList(attrs, logger) {
54
- try {
55
- return encodeKeyValueList(attrs, logger, newState(), 0);
56
- } catch {
57
- return [];
58
- }
59
- }
60
- function encodeAnyValue(value, logger, state, depth) {
61
- if (state.remainingNodes <= 0) return {
62
- stringValue: TRUNCATED_VALUE
63
- };
64
- state.remainingNodes--;
65
- if (isBoolean(value)) return {
66
- boolValue: value
67
- };
68
- if ('number' == typeof value) {
69
- if (!Number.isFinite(value)) return {
70
- stringValue: String(value)
71
- };
72
- if (Number.isInteger(value)) {
73
- if (Number.isSafeInteger(value)) return {
74
- intValue: String(value)
75
- };
76
- if ('undefined' == typeof BigInt) return {
77
- stringValue: String(value)
78
- };
79
- const decimal = BigInt(value).toString();
80
- if (value >= INT64_RANGE_LIMIT || value < -INT64_RANGE_LIMIT) {
81
- logger?.debug(`Attribute ${decimal} is outside the int64 range; encoding it as a string`);
82
- return {
83
- stringValue: decimal
84
- };
85
- }
86
- return {
87
- intValue: decimal
88
- };
89
- }
90
- return {
91
- doubleValue: value
92
- };
93
- }
94
- if ('string' == typeof value) return {
95
- stringValue: sanitizeString(value)
96
- };
97
- if ('function' == typeof value) return {
98
- stringValue: FUNCTION_VALUE
99
- };
100
- if ('symbol' == typeof value) return {
101
- stringValue: String(value)
102
- };
103
- if ('object' == typeof value && null !== value) {
104
- if (state.ancestors.has(value)) return {
105
- stringValue: CIRCULAR_VALUE
106
- };
107
- if (depth >= MAX_JSON_SAFE_VALUE_DEPTH) return {
108
- stringValue: TRUNCATED_VALUE
109
- };
110
- if (value instanceof Date) {
111
- const time = value.getTime();
112
- const iso = Number.isFinite(time) ? value.toISOString() : String(value);
113
- return {
114
- stringValue: 'string' == typeof iso ? sanitizeString(iso) : String(iso)
115
- };
116
- }
117
- state.ancestors.add(value);
118
- try {
119
- try {
120
- const toJSON = value.toJSON;
121
- if ('function' == typeof toJSON) return encodeAnyValue(toJSON.call(value), logger, state, depth + 1);
122
- } catch {}
123
- if (isArray(value)) return {
124
- arrayValue: {
125
- values: encodeArrayValues(value, logger, state, depth + 1)
126
- }
127
- };
128
- return {
129
- kvlistValue: {
130
- values: encodeKeyValueList(value, logger, state, depth + 1)
131
- }
132
- };
133
- } finally{
134
- state.ancestors.delete(value);
135
- }
136
- }
137
- return {
138
- stringValue: sanitizeString(String(value))
139
- };
140
- }
141
- function encodeArrayValues(values, logger, state, depth) {
142
- const result = [];
143
- const itemCount = Math.min(values.length, MAX_JSON_SAFE_VALUE_ITEMS);
144
- let index = 0;
145
- for(; index < itemCount && state.remainingNodes > 0; index++)try {
146
- const element = index in values ? values[index] : void 0;
147
- if (isNullish(element)) continue;
148
- result.push(encodeAnyValue(element, logger, state, depth));
149
- } catch {
150
- result.push({
151
- stringValue: UNSERIALIZABLE_VALUE
152
- });
153
- }
154
- if (values.length > index) result.push({
155
- stringValue: TRUNCATED_VALUE
156
- });
157
- return result;
158
- }
159
- function encodeKeyValueList(attrs, logger, state, depth) {
160
- const result = [];
161
- for(const key in attrs)if (propertyIsEnumerable.call(attrs, key)) {
162
- if (result.length >= MAX_JSON_SAFE_VALUE_ITEMS || state.remainingNodes <= 0) {
163
- logger?.debug('Attributes truncated: the value exceeds the OTLP encoder budget');
164
- break;
165
- }
166
- try {
167
- const value = attrs[key];
168
- if (isNull(value) || isUndefined(value)) continue;
169
- result.push({
170
- key: sanitizeString(key),
171
- value: encodeAnyValue(value, logger, state, depth)
172
- });
173
- } catch {
174
- result.push({
175
- key: sanitizeString(key),
176
- value: {
177
- stringValue: UNSERIALIZABLE_VALUE
178
- }
179
- });
180
- }
181
- }
182
- return result;
183
- }
184
38
  function timestampToUnixNano(timestampMs = Date.now()) {
185
39
  return String(timestampMs) + '000000';
186
40
  }
@@ -247,18 +101,7 @@ function buildOtlpLogRecord(options, sdkContext, logger, occurredAtMs) {
247
101
  return record;
248
102
  }
249
103
  function buildResourceAttributes(config, sdkName, sdkVersion) {
250
- return {
251
- ...config.resourceAttributes,
252
- 'service.name': config.serviceName || 'unknown_service',
253
- ...config.environment && {
254
- 'deployment.environment': config.environment
255
- },
256
- ...config.serviceVersion && {
257
- 'service.version': config.serviceVersion
258
- },
259
- 'telemetry.sdk.name': sdkName,
260
- 'telemetry.sdk.version': sdkVersion
261
- };
104
+ return buildOtlpResourceAttributes(config, sdkName, sdkVersion);
262
105
  }
263
106
  function buildOtlpLogsPayload(logRecords, resourceAttributes, scopeName, scopeVersion) {
264
107
  return {
@@ -280,4 +123,4 @@ function buildOtlpLogsPayload(logRecords, resourceAttributes, scopeName, scopeVe
280
123
  ]
281
124
  };
282
125
  }
283
- export { buildOtlpLogRecord, buildOtlpLogsPayload, buildResourceAttributes, getOtlpSeverityNumber, getOtlpSeverityText, toOtlpAnyValue, toOtlpKeyValueList };
126
+ export { buildOtlpLogRecord, buildOtlpLogsPayload, buildResourceAttributes, getOtlpSeverityNumber, getOtlpSeverityText };
@@ -31,7 +31,7 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  DEFAULT_HISTOGRAM_BOUNDS: ()=>external_metrics_utils_js_namespaceObject.DEFAULT_HISTOGRAM_BOUNDS
32
32
  });
33
33
  const index_js_namespaceObject = require("../utils/index.js");
34
- const logs_utils_js_namespaceObject = require("../logs/logs-utils.js");
34
+ const otlp_any_value_js_namespaceObject = require("../utils/otlp-any-value.js");
35
35
  const external_metrics_utils_js_namespaceObject = require("./metrics-utils.js");
36
36
  const external_config_js_namespaceObject = require("./config.js");
37
37
  const OTLP_TEMPORALITY_DELTA = 1;
@@ -268,7 +268,7 @@ class PostHogMetrics {
268
268
  };
269
269
  byMetric.set(metricKey, metric);
270
270
  }
271
- const attributes = (0, logs_utils_js_namespaceObject.toOtlpKeyValueList)(state.attributes ?? {}, this._logger);
271
+ const attributes = (0, otlp_any_value_js_namespaceObject.toOtlpKeyValueList)(state.attributes ?? {}, this._logger);
272
272
  const startNano = (0, external_metrics_utils_js_namespaceObject.msToUnixNano)(state.windowStartMs);
273
273
  if ('count' === state.type) {
274
274
  const dp = {
@@ -1,5 +1,5 @@
1
1
  import { isArray, safeSetTimeout } from "../utils/index.mjs";
2
- import { toOtlpKeyValueList } from "../logs/logs-utils.mjs";
2
+ import { toOtlpKeyValueList } from "../utils/otlp-any-value.mjs";
3
3
  import { DEFAULT_HISTOGRAM_BOUNDS, bucketIndexFor, buildMetricsResourceAttributes, buildOtlpMetricsPayload, msToUnixNano, seriesKey } from "./metrics-utils.mjs";
4
4
  import { resolveMetricsConfig } from "./config.mjs";
5
5
  const OTLP_TEMPORALITY_DELTA = 1;
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-utils.d.ts","sourceRoot":"","sources":["../../src/metrics/metrics-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAE1F,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAA;AAE3D;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,UAA4E,CAAA;AAEjH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,SAAS,GAC3D,MAAM,CAOR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAOtE;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,4BAA4B,EACpC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAStC;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,UAAU,EAAE,EACrB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACxD,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,kBAAkB,CAcpB"}
1
+ {"version":3,"file":"metrics-utils.d.ts","sourceRoot":"","sources":["../../src/metrics/metrics-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAG1F,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAA;AAE3D;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,UAA4E,CAAA;AAEjH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,SAAS,GAC3D,MAAM,CAOR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAOtE;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,4BAA4B,EACpC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAEtC;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,UAAU,EAAE,EACrB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACxD,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,kBAAkB,CAcpB"}
@@ -31,7 +31,8 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  seriesKey: ()=>seriesKey,
32
32
  DEFAULT_HISTOGRAM_BOUNDS: ()=>DEFAULT_HISTOGRAM_BOUNDS
33
33
  });
34
- const logs_utils_js_namespaceObject = require("../logs/logs-utils.js");
34
+ const otlp_any_value_js_namespaceObject = require("../utils/otlp-any-value.js");
35
+ const otlp_resource_js_namespaceObject = require("../utils/otlp-resource.js");
35
36
  const DEFAULT_HISTOGRAM_BOUNDS = [
36
37
  0,
37
38
  5,
@@ -65,25 +66,14 @@ function bucketIndexFor(value, bounds) {
65
66
  return bounds.length;
66
67
  }
67
68
  function buildMetricsResourceAttributes(config, scopeName, scopeVersion) {
68
- return {
69
- ...config.resourceAttributes,
70
- 'service.name': config.serviceName || 'unknown_service',
71
- ...config.environment && {
72
- 'deployment.environment': config.environment
73
- },
74
- ...config.serviceVersion && {
75
- 'service.version': config.serviceVersion
76
- },
77
- 'telemetry.sdk.name': scopeName,
78
- 'telemetry.sdk.version': scopeVersion
79
- };
69
+ return (0, otlp_resource_js_namespaceObject.buildOtlpResourceAttributes)(config, scopeName, scopeVersion);
80
70
  }
81
71
  function buildOtlpMetricsPayload(metrics, resourceAttributes, scopeName, scopeVersion) {
82
72
  return {
83
73
  resourceMetrics: [
84
74
  {
85
75
  resource: {
86
- attributes: (0, logs_utils_js_namespaceObject.toOtlpKeyValueList)(resourceAttributes)
76
+ attributes: (0, otlp_any_value_js_namespaceObject.toOtlpKeyValueList)(resourceAttributes)
87
77
  },
88
78
  scopeMetrics: [
89
79
  {
@@ -1,4 +1,5 @@
1
- import { toOtlpKeyValueList } from "../logs/logs-utils.mjs";
1
+ import { toOtlpKeyValueList } from "../utils/otlp-any-value.mjs";
2
+ import { buildOtlpResourceAttributes } from "../utils/otlp-resource.mjs";
2
3
  const DEFAULT_HISTOGRAM_BOUNDS = [
3
4
  0,
4
5
  5,
@@ -32,18 +33,7 @@ function bucketIndexFor(value, bounds) {
32
33
  return bounds.length;
33
34
  }
34
35
  function buildMetricsResourceAttributes(config, scopeName, scopeVersion) {
35
- return {
36
- ...config.resourceAttributes,
37
- 'service.name': config.serviceName || 'unknown_service',
38
- ...config.environment && {
39
- 'deployment.environment': config.environment
40
- },
41
- ...config.serviceVersion && {
42
- 'service.version': config.serviceVersion
43
- },
44
- 'telemetry.sdk.name': scopeName,
45
- 'telemetry.sdk.version': scopeVersion
46
- };
36
+ return buildOtlpResourceAttributes(config, scopeName, scopeVersion);
47
37
  }
48
38
  function buildOtlpMetricsPayload(metrics, resourceAttributes, scopeName, scopeVersion) {
49
39
  return {
@@ -0,0 +1,5 @@
1
+ import type { OtlpAnyValue, OtlpKeyValue } from '@posthog/types';
2
+ import type { Logger } from '../types';
3
+ export declare function toOtlpAnyValue(value: unknown, logger?: Logger): OtlpAnyValue;
4
+ export declare function toOtlpKeyValueList(attrs: Record<string, unknown>, logger?: Logger): OtlpKeyValue[];
5
+ //# sourceMappingURL=otlp-any-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-any-value.d.ts","sourceRoot":"","sources":["../../src/utils/otlp-any-value.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAiCtC,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAQ5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAMlG"}