@posthog/core 1.50.0 → 1.50.2

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/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export * from './utils';
6
6
  export * as ErrorTracking from './error-tracking';
7
7
  export { buildOtlpLogRecord, buildOtlpLogsPayload, buildResourceAttributes, getOtlpSeverityNumber, getOtlpSeverityText, } from './logs/logs-utils';
8
8
  export { toOtlpAnyValue, toOtlpKeyValueList } from './utils/otlp-any-value';
9
+ export { osResourceAttributes } from './utils/otlp-resource';
9
10
  export { PostHogLogs } from './logs';
10
11
  export type { BeforeSendLogFn, BufferedLogEntry, CaptureLogger, LogSdkContext, PostHogLogsConfig, ResolvedPostHogLogsConfig, } from './logs/types';
11
12
  export type { CaptureLogOptions, LogAttributeValue, LogAttributes, LogSeverityLevel } from './logs/types';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,6CAA6C,EAC7C,iCAAiC,GAClC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,gCAAgC,EAChC,QAAQ,EACR,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,uCAAuC,EACvC,yBAAyB,GAC1B,MAAM,8BAA8B,CAAA;AACrC,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,8BAA8B,EAC9B,kBAAkB,EAClB,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,QAAQ,CAAA;AACf,cAAc,SAAS,CAAA;AACvB,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AACjD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,cAAc,CAAA;AAIrB,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGzG,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAGhE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,8BAA8B,EAC9B,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,WAAW,CAAA;AAElB,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,OAAO,EACP,aAAa,GACd,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,6CAA6C,EAC7C,iCAAiC,GAClC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,gCAAgC,EAChC,QAAQ,EACR,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,uCAAuC,EACvC,yBAAyB,GAC1B,MAAM,8BAA8B,CAAA;AACrC,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,8BAA8B,EAC9B,kBAAkB,EAClB,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,QAAQ,CAAA;AACf,cAAc,SAAS,CAAA;AACvB,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AACjD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,cAAc,CAAA;AAIrB,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGzG,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAGhE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,8BAA8B,EAC9B,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,WAAW,CAAA;AAElB,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,OAAO,EACP,aAAa,GACd,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/index.js CHANGED
@@ -45,6 +45,9 @@ var __webpack_modules__ = {
45
45
  "./utils/otlp-any-value": function(module) {
46
46
  module.exports = require("./utils/otlp-any-value.js");
47
47
  },
48
+ "./utils/otlp-resource": function(module) {
49
+ module.exports = require("./utils/otlp-resource.js");
50
+ },
48
51
  "./vendor/uuidv7": function(module) {
49
52
  module.exports = require("./vendor/uuidv7.js");
50
53
  }
@@ -93,16 +96,16 @@ var __webpack_exports__ = {};
93
96
  (()=>{
94
97
  __webpack_require__.r(__webpack_exports__);
95
98
  __webpack_require__.d(__webpack_exports__, {
96
- DEFAULT_HISTOGRAM_BOUNDS: ()=>_metrics__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_HISTOGRAM_BOUNDS,
99
+ DEFAULT_HISTOGRAM_BOUNDS: ()=>_metrics__WEBPACK_IMPORTED_MODULE_9__.DEFAULT_HISTOGRAM_BOUNDS,
97
100
  ErrorTracking: ()=>_error_tracking__WEBPACK_IMPORTED_MODULE_4__,
98
101
  InconclusiveMatchError: ()=>_featureFlagLocalEvaluation__WEBPACK_IMPORTED_MODULE_1__.InconclusiveMatchError,
99
102
  MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES: ()=>_featureFlagUtils__WEBPACK_IMPORTED_MODULE_0__.MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES,
100
- PostHogLogs: ()=>_logs__WEBPACK_IMPORTED_MODULE_7__.PostHogLogs,
101
- PostHogMetrics: ()=>_metrics__WEBPACK_IMPORTED_MODULE_8__.PostHogMetrics,
102
- buildMetricsResourceAttributes: ()=>_metrics__WEBPACK_IMPORTED_MODULE_8__.buildMetricsResourceAttributes,
103
+ PostHogLogs: ()=>_logs__WEBPACK_IMPORTED_MODULE_8__.PostHogLogs,
104
+ PostHogMetrics: ()=>_metrics__WEBPACK_IMPORTED_MODULE_9__.PostHogMetrics,
105
+ buildMetricsResourceAttributes: ()=>_metrics__WEBPACK_IMPORTED_MODULE_9__.buildMetricsResourceAttributes,
103
106
  buildOtlpLogRecord: ()=>_logs_logs_utils__WEBPACK_IMPORTED_MODULE_5__.buildOtlpLogRecord,
104
107
  buildOtlpLogsPayload: ()=>_logs_logs_utils__WEBPACK_IMPORTED_MODULE_5__.buildOtlpLogsPayload,
105
- buildOtlpMetricsPayload: ()=>_metrics__WEBPACK_IMPORTED_MODULE_8__.buildOtlpMetricsPayload,
108
+ buildOtlpMetricsPayload: ()=>_metrics__WEBPACK_IMPORTED_MODULE_9__.buildOtlpMetricsPayload,
106
109
  buildResourceAttributes: ()=>_logs_logs_utils__WEBPACK_IMPORTED_MODULE_5__.buildResourceAttributes,
107
110
  flagDetailsToResults: ()=>_featureFlagUtils__WEBPACK_IMPORTED_MODULE_0__.flagDetailsToResults,
108
111
  getEnabledFromValue: ()=>_featureFlagUtils__WEBPACK_IMPORTED_MODULE_0__.getEnabledFromValue,
@@ -110,11 +113,11 @@ var __webpack_exports__ = {};
110
113
  getFeatureFlagValue: ()=>_featureFlagUtils__WEBPACK_IMPORTED_MODULE_0__.getFeatureFlagValue,
111
114
  getFeatureFlagVariant: ()=>_featureFlagLocalEvaluation__WEBPACK_IMPORTED_MODULE_1__.getFeatureFlagVariant,
112
115
  getFeatureFlagVariantLookupTable: ()=>_featureFlagLocalEvaluation__WEBPACK_IMPORTED_MODULE_1__.getFeatureFlagVariantLookupTable,
113
- getLengthFromRules: ()=>_surveys_validation__WEBPACK_IMPORTED_MODULE_15__.getLengthFromRules,
116
+ getLengthFromRules: ()=>_surveys_validation__WEBPACK_IMPORTED_MODULE_16__.getLengthFromRules,
114
117
  getOtlpSeverityNumber: ()=>_logs_logs_utils__WEBPACK_IMPORTED_MODULE_5__.getOtlpSeverityNumber,
115
118
  getOtlpSeverityText: ()=>_logs_logs_utils__WEBPACK_IMPORTED_MODULE_5__.getOtlpSeverityText,
116
- getRequirementsHint: ()=>_surveys_validation__WEBPACK_IMPORTED_MODULE_15__.getRequirementsHint,
117
- getValidationError: ()=>_surveys_validation__WEBPACK_IMPORTED_MODULE_15__.getValidationError,
119
+ getRequirementsHint: ()=>_surveys_validation__WEBPACK_IMPORTED_MODULE_16__.getRequirementsHint,
120
+ getValidationError: ()=>_surveys_validation__WEBPACK_IMPORTED_MODULE_16__.getValidationError,
118
121
  getVariantFromValue: ()=>_featureFlagUtils__WEBPACK_IMPORTED_MODULE_0__.getVariantFromValue,
119
122
  gzipCompress: ()=>_gzip__WEBPACK_IMPORTED_MODULE_2__.gzipCompress,
120
123
  hashSHA1: ()=>_featureFlagLocalEvaluation__WEBPACK_IMPORTED_MODULE_1__.hashSHA1,
@@ -125,14 +128,15 @@ var __webpack_exports__ = {};
125
128
  isNativeAsyncGzipReadError: ()=>_gzip__WEBPACK_IMPORTED_MODULE_2__.isNativeAsyncGzipReadError,
126
129
  matchFeatureFlagProperty: ()=>_featureFlagLocalEvaluation__WEBPACK_IMPORTED_MODULE_1__.matchFeatureFlagProperty,
127
130
  minimizeFlagCalledEventProperties: ()=>_featureFlagUtils__WEBPACK_IMPORTED_MODULE_0__.minimizeFlagCalledEventProperties,
131
+ osResourceAttributes: ()=>_utils_otlp_resource__WEBPACK_IMPORTED_MODULE_7__.osResourceAttributes,
128
132
  parseFeatureFlagSemver: ()=>_featureFlagLocalEvaluation__WEBPACK_IMPORTED_MODULE_1__.parseFeatureFlagSemver,
129
133
  parsePayload: ()=>_featureFlagUtils__WEBPACK_IMPORTED_MODULE_0__.parsePayload,
130
134
  relativeDateParseForFeatureFlagMatching: ()=>_featureFlagLocalEvaluation__WEBPACK_IMPORTED_MODULE_1__.relativeDateParseForFeatureFlagMatching,
131
135
  resolveFeatureFlagPayload: ()=>_featureFlagLocalEvaluation__WEBPACK_IMPORTED_MODULE_1__.resolveFeatureFlagPayload,
132
- resolveMetricsConfig: ()=>_metrics__WEBPACK_IMPORTED_MODULE_8__.resolveMetricsConfig,
136
+ resolveMetricsConfig: ()=>_metrics__WEBPACK_IMPORTED_MODULE_9__.resolveMetricsConfig,
133
137
  toOtlpAnyValue: ()=>_utils_otlp_any_value__WEBPACK_IMPORTED_MODULE_6__.toOtlpAnyValue,
134
138
  toOtlpKeyValueList: ()=>_utils_otlp_any_value__WEBPACK_IMPORTED_MODULE_6__.toOtlpKeyValueList,
135
- uuidv7: ()=>_vendor_uuidv7__WEBPACK_IMPORTED_MODULE_9__.uuidv7
139
+ uuidv7: ()=>_vendor_uuidv7__WEBPACK_IMPORTED_MODULE_10__.uuidv7
136
140
  });
137
141
  var _featureFlagUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./featureFlagUtils");
138
142
  var _featureFlagLocalEvaluation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./featureFlagLocalEvaluation");
@@ -141,6 +145,7 @@ var __webpack_exports__ = {};
141
145
  var __WEBPACK_REEXPORT_OBJECT__ = {};
142
146
  for(var __WEBPACK_IMPORT_KEY__ in _utils__WEBPACK_IMPORTED_MODULE_3__)if ([
143
147
  "toOtlpKeyValueList",
148
+ "osResourceAttributes",
144
149
  "relativeDateParseForFeatureFlagMatching",
145
150
  "isNativeAsyncGzipError",
146
151
  "getOtlpSeverityText",
@@ -188,13 +193,15 @@ var __webpack_exports__ = {};
188
193
  var _error_tracking__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./error-tracking");
189
194
  var _logs_logs_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("./logs/logs-utils");
190
195
  var _utils_otlp_any_value__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("./utils/otlp-any-value");
191
- var _logs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./logs");
192
- var _metrics__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__("./metrics");
193
- var _vendor_uuidv7__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__("./vendor/uuidv7");
194
- var _cookie__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__("./cookie");
196
+ var _utils_otlp_resource__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./utils/otlp-resource");
197
+ var _logs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__("./logs");
198
+ var _metrics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__("./metrics");
199
+ var _vendor_uuidv7__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__("./vendor/uuidv7");
200
+ var _cookie__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__("./cookie");
195
201
  var __WEBPACK_REEXPORT_OBJECT__ = {};
196
- for(var __WEBPACK_IMPORT_KEY__ in _cookie__WEBPACK_IMPORTED_MODULE_10__)if ([
202
+ for(var __WEBPACK_IMPORT_KEY__ in _cookie__WEBPACK_IMPORTED_MODULE_11__)if ([
197
203
  "toOtlpKeyValueList",
204
+ "osResourceAttributes",
198
205
  "relativeDateParseForFeatureFlagMatching",
199
206
  "isNativeAsyncGzipError",
200
207
  "getOtlpSeverityText",
@@ -236,13 +243,14 @@ var __webpack_exports__ = {};
236
243
  "buildOtlpLogRecord",
237
244
  "getFeatureFlagVariant"
238
245
  ].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
239
- return _cookie__WEBPACK_IMPORTED_MODULE_10__[key];
246
+ return _cookie__WEBPACK_IMPORTED_MODULE_11__[key];
240
247
  }).bind(0, __WEBPACK_IMPORT_KEY__);
241
248
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
242
- var _posthog_core__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__("./posthog-core");
249
+ var _posthog_core__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__("./posthog-core");
243
250
  var __WEBPACK_REEXPORT_OBJECT__ = {};
244
- for(var __WEBPACK_IMPORT_KEY__ in _posthog_core__WEBPACK_IMPORTED_MODULE_11__)if ([
251
+ for(var __WEBPACK_IMPORT_KEY__ in _posthog_core__WEBPACK_IMPORTED_MODULE_12__)if ([
245
252
  "toOtlpKeyValueList",
253
+ "osResourceAttributes",
246
254
  "relativeDateParseForFeatureFlagMatching",
247
255
  "isNativeAsyncGzipError",
248
256
  "getOtlpSeverityText",
@@ -284,13 +292,14 @@ var __webpack_exports__ = {};
284
292
  "buildOtlpLogRecord",
285
293
  "getFeatureFlagVariant"
286
294
  ].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
287
- return _posthog_core__WEBPACK_IMPORTED_MODULE_11__[key];
295
+ return _posthog_core__WEBPACK_IMPORTED_MODULE_12__[key];
288
296
  }).bind(0, __WEBPACK_IMPORT_KEY__);
289
297
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
290
- var _posthog_core_stateless__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__("./posthog-core-stateless");
298
+ var _posthog_core_stateless__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__("./posthog-core-stateless");
291
299
  var __WEBPACK_REEXPORT_OBJECT__ = {};
292
- for(var __WEBPACK_IMPORT_KEY__ in _posthog_core_stateless__WEBPACK_IMPORTED_MODULE_12__)if ([
300
+ for(var __WEBPACK_IMPORT_KEY__ in _posthog_core_stateless__WEBPACK_IMPORTED_MODULE_13__)if ([
293
301
  "toOtlpKeyValueList",
302
+ "osResourceAttributes",
294
303
  "relativeDateParseForFeatureFlagMatching",
295
304
  "isNativeAsyncGzipError",
296
305
  "getOtlpSeverityText",
@@ -332,13 +341,14 @@ var __webpack_exports__ = {};
332
341
  "buildOtlpLogRecord",
333
342
  "getFeatureFlagVariant"
334
343
  ].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
335
- return _posthog_core_stateless__WEBPACK_IMPORTED_MODULE_12__[key];
344
+ return _posthog_core_stateless__WEBPACK_IMPORTED_MODULE_13__[key];
336
345
  }).bind(0, __WEBPACK_IMPORT_KEY__);
337
346
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
338
- var _tracing_headers__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__("./tracing-headers");
347
+ var _tracing_headers__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__("./tracing-headers");
339
348
  var __WEBPACK_REEXPORT_OBJECT__ = {};
340
- for(var __WEBPACK_IMPORT_KEY__ in _tracing_headers__WEBPACK_IMPORTED_MODULE_13__)if ([
349
+ for(var __WEBPACK_IMPORT_KEY__ in _tracing_headers__WEBPACK_IMPORTED_MODULE_14__)if ([
341
350
  "toOtlpKeyValueList",
351
+ "osResourceAttributes",
342
352
  "relativeDateParseForFeatureFlagMatching",
343
353
  "isNativeAsyncGzipError",
344
354
  "getOtlpSeverityText",
@@ -380,13 +390,14 @@ var __webpack_exports__ = {};
380
390
  "buildOtlpLogRecord",
381
391
  "getFeatureFlagVariant"
382
392
  ].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
383
- return _tracing_headers__WEBPACK_IMPORTED_MODULE_13__[key];
393
+ return _tracing_headers__WEBPACK_IMPORTED_MODULE_14__[key];
384
394
  }).bind(0, __WEBPACK_IMPORT_KEY__);
385
395
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
386
- var _types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__("./types");
396
+ var _types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__("./types");
387
397
  var __WEBPACK_REEXPORT_OBJECT__ = {};
388
- for(var __WEBPACK_IMPORT_KEY__ in _types__WEBPACK_IMPORTED_MODULE_14__)if ([
398
+ for(var __WEBPACK_IMPORT_KEY__ in _types__WEBPACK_IMPORTED_MODULE_15__)if ([
389
399
  "toOtlpKeyValueList",
400
+ "osResourceAttributes",
390
401
  "relativeDateParseForFeatureFlagMatching",
391
402
  "isNativeAsyncGzipError",
392
403
  "getOtlpSeverityText",
@@ -428,10 +439,10 @@ var __webpack_exports__ = {};
428
439
  "buildOtlpLogRecord",
429
440
  "getFeatureFlagVariant"
430
441
  ].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
431
- return _types__WEBPACK_IMPORTED_MODULE_14__[key];
442
+ return _types__WEBPACK_IMPORTED_MODULE_15__[key];
432
443
  }).bind(0, __WEBPACK_IMPORT_KEY__);
433
444
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
434
- var _surveys_validation__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__("./surveys/validation");
445
+ var _surveys_validation__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__("./surveys/validation");
435
446
  })();
436
447
  exports.DEFAULT_HISTOGRAM_BOUNDS = __webpack_exports__.DEFAULT_HISTOGRAM_BOUNDS;
437
448
  exports.ErrorTracking = __webpack_exports__.ErrorTracking;
@@ -465,6 +476,7 @@ exports.isNativeAsyncGzipError = __webpack_exports__.isNativeAsyncGzipError;
465
476
  exports.isNativeAsyncGzipReadError = __webpack_exports__.isNativeAsyncGzipReadError;
466
477
  exports.matchFeatureFlagProperty = __webpack_exports__.matchFeatureFlagProperty;
467
478
  exports.minimizeFlagCalledEventProperties = __webpack_exports__.minimizeFlagCalledEventProperties;
479
+ exports.osResourceAttributes = __webpack_exports__.osResourceAttributes;
468
480
  exports.parseFeatureFlagSemver = __webpack_exports__.parseFeatureFlagSemver;
469
481
  exports.parsePayload = __webpack_exports__.parsePayload;
470
482
  exports.relativeDateParseForFeatureFlagMatching = __webpack_exports__.relativeDateParseForFeatureFlagMatching;
@@ -506,6 +518,7 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
506
518
  "isNativeAsyncGzipReadError",
507
519
  "matchFeatureFlagProperty",
508
520
  "minimizeFlagCalledEventProperties",
521
+ "osResourceAttributes",
509
522
  "parseFeatureFlagSemver",
510
523
  "parsePayload",
511
524
  "relativeDateParseForFeatureFlagMatching",
package/dist/index.mjs CHANGED
@@ -3,6 +3,7 @@ import { InconclusiveMatchError, getFeatureFlagHash, getFeatureFlagVariant, getF
3
3
  import { gzipCompress, isGzipData, isGzipRequest, isGzipSupported, isNativeAsyncGzipError, isNativeAsyncGzipReadError } from "./gzip.mjs";
4
4
  import { buildOtlpLogRecord, buildOtlpLogsPayload, buildResourceAttributes, getOtlpSeverityNumber, getOtlpSeverityText } from "./logs/logs-utils.mjs";
5
5
  import { toOtlpAnyValue, toOtlpKeyValueList } from "./utils/otlp-any-value.mjs";
6
+ import { osResourceAttributes } from "./utils/otlp-resource.mjs";
6
7
  import { PostHogLogs } from "./logs/index.mjs";
7
8
  import { DEFAULT_HISTOGRAM_BOUNDS, PostHogMetrics, buildMetricsResourceAttributes, buildOtlpMetricsPayload, resolveMetricsConfig } from "./metrics/index.mjs";
8
9
  import { uuidv7 } from "./vendor/uuidv7.mjs";
@@ -14,4 +15,4 @@ export * from "./posthog-core-stateless.mjs";
14
15
  export * from "./tracing-headers.mjs";
15
16
  export * from "./types.mjs";
16
17
  import * as __WEBPACK_EXTERNAL_MODULE__error_tracking_index_mjs_b3406d6f__ from "./error-tracking/index.mjs";
17
- 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 +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,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;AAoBvE,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,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"}
@@ -33,6 +33,7 @@ __webpack_require__.d(__webpack_exports__, {
33
33
  const index_js_namespaceObject = require("../utils/index.js");
34
34
  const json_utils_js_namespaceObject = require("../utils/json-utils.js");
35
35
  const otlp_any_value_js_namespaceObject = require("../utils/otlp-any-value.js");
36
+ const otlp_resource_js_namespaceObject = require("../utils/otlp-resource.js");
36
37
  const OTLP_SEVERITY_MAP = {
37
38
  trace: {
38
39
  text: 'TRACE',
@@ -132,18 +133,7 @@ function buildOtlpLogRecord(options, sdkContext, logger, occurredAtMs) {
132
133
  return record;
133
134
  }
134
135
  function buildResourceAttributes(config, sdkName, sdkVersion) {
135
- return {
136
- ...config.resourceAttributes,
137
- 'service.name': config.serviceName || 'unknown_service',
138
- ...config.environment && {
139
- 'deployment.environment': config.environment
140
- },
141
- ...config.serviceVersion && {
142
- 'service.version': config.serviceVersion
143
- },
144
- 'telemetry.sdk.name': sdkName,
145
- 'telemetry.sdk.version': sdkVersion
146
- };
136
+ return (0, otlp_resource_js_namespaceObject.buildOtlpResourceAttributes)(config, sdkName, sdkVersion);
147
137
  }
148
138
  function buildOtlpLogsPayload(logRecords, resourceAttributes, scopeName, scopeVersion) {
149
139
  return {
@@ -1,6 +1,7 @@
1
1
  import { isNullish, isNumber, isUndefined } from "../utils/index.mjs";
2
2
  import { UNSERIALIZABLE_VALUE, sanitizeString } from "../utils/json-utils.mjs";
3
3
  import { toOtlpKeyValueList } from "../utils/otlp-any-value.mjs";
4
+ import { buildOtlpResourceAttributes } from "../utils/otlp-resource.mjs";
4
5
  const OTLP_SEVERITY_MAP = {
5
6
  trace: {
6
7
  text: 'TRACE',
@@ -100,18 +101,7 @@ function buildOtlpLogRecord(options, sdkContext, logger, occurredAtMs) {
100
101
  return record;
101
102
  }
102
103
  function buildResourceAttributes(config, sdkName, sdkVersion) {
103
- return {
104
- ...config.resourceAttributes,
105
- 'service.name': config.serviceName || 'unknown_service',
106
- ...config.environment && {
107
- 'deployment.environment': config.environment
108
- },
109
- ...config.serviceVersion && {
110
- 'service.version': config.serviceVersion
111
- },
112
- 'telemetry.sdk.name': sdkName,
113
- 'telemetry.sdk.version': sdkVersion
114
- };
104
+ return buildOtlpResourceAttributes(config, sdkName, sdkVersion);
115
105
  }
116
106
  function buildOtlpLogsPayload(logRecords, resourceAttributes, scopeName, scopeVersion) {
117
107
  return {
@@ -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"}
@@ -32,6 +32,7 @@ __webpack_require__.d(__webpack_exports__, {
32
32
  DEFAULT_HISTOGRAM_BOUNDS: ()=>DEFAULT_HISTOGRAM_BOUNDS
33
33
  });
34
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,18 +66,7 @@ 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 {
@@ -1,4 +1,5 @@
1
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 {
@@ -170,6 +170,10 @@ function encodeArrayValues(values, logger, state, depth) {
170
170
  function encodeKeyValueList(attrs, logger, state, depth) {
171
171
  const result = [];
172
172
  for(const key in attrs)if (propertyIsEnumerable.call(attrs, key)) {
173
+ if (!key) {
174
+ logger?.debug('Dropping an attribute with an empty key');
175
+ continue;
176
+ }
173
177
  if (result.length >= external_json_utils_js_namespaceObject.MAX_JSON_SAFE_VALUE_ITEMS || state.remainingNodes <= 0) {
174
178
  logger?.debug('Attributes truncated: the value exceeds the OTLP encoder budget');
175
179
  break;
@@ -141,6 +141,10 @@ function encodeArrayValues(values, logger, state, depth) {
141
141
  function encodeKeyValueList(attrs, logger, state, depth) {
142
142
  const result = [];
143
143
  for(const key in attrs)if (propertyIsEnumerable.call(attrs, key)) {
144
+ if (!key) {
145
+ logger?.debug('Dropping an attribute with an empty key');
146
+ continue;
147
+ }
144
148
  if (result.length >= MAX_JSON_SAFE_VALUE_ITEMS || state.remainingNodes <= 0) {
145
149
  logger?.debug('Attributes truncated: the value exceeds the OTLP encoder budget');
146
150
  break;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Shape the logs and metrics resolved configs share for resource
3
+ * attribution. Generic over the attribute value type so each signal keeps its
4
+ * own value union.
5
+ */
6
+ export interface OtlpResourceConfig<TAttributeValue> {
7
+ serviceName?: string;
8
+ serviceVersion?: string;
9
+ environment?: string;
10
+ resourceAttributes?: Record<string, TAttributeValue>;
11
+ }
12
+ /**
13
+ * OTLP resource attributes shared by the logs and metrics envelopes.
14
+ *
15
+ * User `resourceAttributes` are spread first, then SDK-controlled keys on top so
16
+ * a stray user key can't clobber the ingestion-attribution ones; the dedicated
17
+ * `serviceName` / `environment` / `serviceVersion` fields are how you override
18
+ * those three.
19
+ *
20
+ * @internal Shared within this SDK; not part of the stable public API.
21
+ */
22
+ export declare function buildOtlpResourceAttributes<TAttributeValue>(config: OtlpResourceConfig<TAttributeValue>, sdkName: string, sdkVersion: string): Record<string, TAttributeValue | string>;
23
+ /**
24
+ * Normalizes a natively-detected OS name against the table above.
25
+ * Unrecognized names pass through: a wrong-looking value beats dropping an OS
26
+ * we have not mapped yet.
27
+ *
28
+ * @internal Shared within this SDK; not part of the stable public API.
29
+ */
30
+ export declare function normalizeOsName(name: string | undefined): string | undefined;
31
+ /**
32
+ * The `os.name` / `os.version` resource attribute pair, with either key omitted
33
+ * rather than emitted empty when the host cannot determine it.
34
+ *
35
+ * @internal Exposed for cross-package use within this SDK; not part of the stable public API.
36
+ */
37
+ export declare function osResourceAttributes(name: string | undefined, version: string | undefined): Record<string, string>;
38
+ //# sourceMappingURL=otlp-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-resource.d.ts","sourceRoot":"","sources":["../../src/utils/otlp-resource.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,eAAe;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CACrD;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,eAAe,EACzD,MAAM,EAAE,kBAAkB,CAAC,eAAe,CAAC,EAC3C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,CAS1C;AA2BD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAK5E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMlH"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ buildOtlpResourceAttributes: ()=>buildOtlpResourceAttributes,
28
+ normalizeOsName: ()=>normalizeOsName,
29
+ osResourceAttributes: ()=>osResourceAttributes
30
+ });
31
+ function buildOtlpResourceAttributes(config, sdkName, sdkVersion) {
32
+ return {
33
+ ...config.resourceAttributes,
34
+ 'service.name': config.serviceName || 'unknown_service',
35
+ ...config.environment && {
36
+ 'deployment.environment': config.environment
37
+ },
38
+ ...config.serviceVersion && {
39
+ 'service.version': config.serviceVersion
40
+ },
41
+ 'telemetry.sdk.name': sdkName,
42
+ 'telemetry.sdk.version': sdkVersion
43
+ };
44
+ }
45
+ const OS_NAMES = {
46
+ darwin: 'macOS',
47
+ win32: 'Windows',
48
+ linux: 'Linux',
49
+ android: 'Android',
50
+ freebsd: 'FreeBSD',
51
+ openbsd: 'OpenBSD',
52
+ sunos: 'SunOS',
53
+ aix: 'AIX',
54
+ 'Mac OS X': 'macOS'
55
+ };
56
+ function normalizeOsName(name) {
57
+ if (!name) return;
58
+ return Object.prototype.hasOwnProperty.call(OS_NAMES, name) ? OS_NAMES[name] : name;
59
+ }
60
+ function osResourceAttributes(name, version) {
61
+ const osName = normalizeOsName(name);
62
+ return {
63
+ ...osName ? {
64
+ 'os.name': osName
65
+ } : {},
66
+ ...version ? {
67
+ 'os.version': version
68
+ } : {}
69
+ };
70
+ }
71
+ exports.buildOtlpResourceAttributes = __webpack_exports__.buildOtlpResourceAttributes;
72
+ exports.normalizeOsName = __webpack_exports__.normalizeOsName;
73
+ exports.osResourceAttributes = __webpack_exports__.osResourceAttributes;
74
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
75
+ "buildOtlpResourceAttributes",
76
+ "normalizeOsName",
77
+ "osResourceAttributes"
78
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
79
+ Object.defineProperty(exports, '__esModule', {
80
+ value: true
81
+ });
@@ -0,0 +1,41 @@
1
+ function buildOtlpResourceAttributes(config, sdkName, sdkVersion) {
2
+ return {
3
+ ...config.resourceAttributes,
4
+ 'service.name': config.serviceName || 'unknown_service',
5
+ ...config.environment && {
6
+ 'deployment.environment': config.environment
7
+ },
8
+ ...config.serviceVersion && {
9
+ 'service.version': config.serviceVersion
10
+ },
11
+ 'telemetry.sdk.name': sdkName,
12
+ 'telemetry.sdk.version': sdkVersion
13
+ };
14
+ }
15
+ const OS_NAMES = {
16
+ darwin: 'macOS',
17
+ win32: 'Windows',
18
+ linux: 'Linux',
19
+ android: 'Android',
20
+ freebsd: 'FreeBSD',
21
+ openbsd: 'OpenBSD',
22
+ sunos: 'SunOS',
23
+ aix: 'AIX',
24
+ 'Mac OS X': 'macOS'
25
+ };
26
+ function normalizeOsName(name) {
27
+ if (!name) return;
28
+ return Object.prototype.hasOwnProperty.call(OS_NAMES, name) ? OS_NAMES[name] : name;
29
+ }
30
+ function osResourceAttributes(name, version) {
31
+ const osName = normalizeOsName(name);
32
+ return {
33
+ ...osName ? {
34
+ 'os.name': osName
35
+ } : {},
36
+ ...version ? {
37
+ 'os.version': version
38
+ } : {}
39
+ };
40
+ }
41
+ export { buildOtlpResourceAttributes, normalizeOsName, osResourceAttributes };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/core",
3
- "version": "1.50.0",
3
+ "version": "1.50.2",
4
4
  "bugs": {
5
5
  "url": "https://github.com/PostHog/posthog-js/issues"
6
6
  },
package/src/index.ts CHANGED
@@ -44,6 +44,7 @@ export {
44
44
  getOtlpSeverityText,
45
45
  } from './logs/logs-utils'
46
46
  export { toOtlpAnyValue, toOtlpKeyValueList } from './utils/otlp-any-value'
47
+ export { osResourceAttributes } from './utils/otlp-resource'
47
48
  export { PostHogLogs } from './logs'
48
49
  export type {
49
50
  BeforeSendLogFn,
@@ -12,6 +12,7 @@ import type { LogSdkContext, ResolvedPostHogLogsConfig } from './types'
12
12
  import { isNullish, isNumber, isUndefined } from '../utils'
13
13
  import { sanitizeString, UNSERIALIZABLE_VALUE } from '../utils/json-utils'
14
14
  import { toOtlpKeyValueList } from '../utils/otlp-any-value'
15
+ import { buildOtlpResourceAttributes } from '../utils/otlp-resource'
15
16
 
16
17
  // ============================================================================
17
18
  // Severity mapping
@@ -185,14 +186,7 @@ export function buildResourceAttributes(
185
186
  sdkName: string,
186
187
  sdkVersion: string
187
188
  ): Record<string, LogAttributeValue> {
188
- return {
189
- ...config.resourceAttributes,
190
- 'service.name': config.serviceName || 'unknown_service',
191
- ...(config.environment && { 'deployment.environment': config.environment }),
192
- ...(config.serviceVersion && { 'service.version': config.serviceVersion }),
193
- 'telemetry.sdk.name': sdkName,
194
- 'telemetry.sdk.version': sdkVersion,
195
- }
189
+ return buildOtlpResourceAttributes(config, sdkName, sdkVersion)
196
190
  }
197
191
 
198
192
  /**
@@ -1,5 +1,6 @@
1
1
  import type { MetricAttributeValue, OtlpMetric, OtlpMetricsPayload } from '@posthog/types'
2
2
  import { toOtlpKeyValueList } from '../utils/otlp-any-value'
3
+ import { buildOtlpResourceAttributes } from '../utils/otlp-resource'
3
4
  import type { ResolvedPostHogMetricsConfig } from './types'
4
5
 
5
6
  /**
@@ -59,14 +60,7 @@ export function buildMetricsResourceAttributes(
59
60
  scopeName: string,
60
61
  scopeVersion: string
61
62
  ): Record<string, MetricAttributeValue> {
62
- return {
63
- ...config.resourceAttributes,
64
- 'service.name': config.serviceName || 'unknown_service',
65
- ...(config.environment && { 'deployment.environment': config.environment }),
66
- ...(config.serviceVersion && { 'service.version': config.serviceVersion }),
67
- 'telemetry.sdk.name': scopeName,
68
- 'telemetry.sdk.version': scopeVersion,
69
- }
63
+ return buildOtlpResourceAttributes(config, scopeName, scopeVersion)
70
64
  }
71
65
 
72
66
  /**
@@ -357,5 +357,20 @@ describe('otlp-any-value', () => {
357
357
  })
358
358
  ).toEqual([{ key: 'kept', value: { stringValue: 'yes' } }])
359
359
  })
360
+
361
+ it('skips an empty key, which OTLP does not allow', () => {
362
+ expect(toOtlpKeyValueList({ '': 'nameless', kept: 'yes' })).toEqual([
363
+ { key: 'kept', value: { stringValue: 'yes' } },
364
+ ])
365
+ })
366
+
367
+ it('skips an empty key nested inside a value', () => {
368
+ expect(toOtlpKeyValueList({ outer: { '': 'nameless', kept: 'yes' } })).toEqual([
369
+ {
370
+ key: 'outer',
371
+ value: { kvlistValue: { values: [{ key: 'kept', value: { stringValue: 'yes' } }] } },
372
+ },
373
+ ])
374
+ })
360
375
  })
361
376
  })
@@ -204,6 +204,12 @@ function encodeKeyValueList(
204
204
  if (!propertyIsEnumerable.call(attrs, key)) {
205
205
  continue
206
206
  }
207
+ if (!key) {
208
+ // OTLP requires a non-empty key. The server stores one verbatim, where it
209
+ // shows up as a nameless attribute nothing can filter on.
210
+ logger?.debug('Dropping an attribute with an empty key')
211
+ continue
212
+ }
207
213
  if (result.length >= MAX_JSON_SAFE_VALUE_ITEMS || state.remainingNodes <= 0) {
208
214
  // Reported rather than written into the attributes: a synthetic key would
209
215
  // land in the user's own namespace and could collide with a real one.
@@ -0,0 +1,125 @@
1
+ import { buildResourceAttributes } from '../logs/logs-utils'
2
+ import type { ResolvedPostHogLogsConfig } from '../logs/types'
3
+ import { buildMetricsResourceAttributes } from '../metrics/metrics-utils'
4
+ import type { ResolvedPostHogMetricsConfig } from '../metrics/types'
5
+ import { normalizeOsName, osResourceAttributes } from './otlp-resource'
6
+
7
+ const shared = {
8
+ serviceName: 'checkout',
9
+ serviceVersion: '2.1.0',
10
+ environment: 'production',
11
+ resourceAttributes: { 'host.name': 'web-01' },
12
+ }
13
+
14
+ const conflicting = {
15
+ serviceName: 'checkout',
16
+ serviceVersion: '2.1.0',
17
+ environment: 'production',
18
+ resourceAttributes: {
19
+ 'service.name': 'hijacked',
20
+ 'service.version': '0.0.0',
21
+ 'deployment.environment': 'hijacked-env',
22
+ 'telemetry.sdk.name': 'hijacked-sdk',
23
+ 'telemetry.sdk.version': '0.0.0',
24
+ 'host.name': 'web-01',
25
+ },
26
+ }
27
+
28
+ const bothSignals = (partial: object): Record<string, unknown>[] => [
29
+ buildResourceAttributes(partial as ResolvedPostHogLogsConfig, 'posthog-node', '1.0.0'),
30
+ buildMetricsResourceAttributes(partial as ResolvedPostHogMetricsConfig, 'posthog-node', '1.0.0'),
31
+ ]
32
+
33
+ describe('shared OTLP resource attributes', () => {
34
+ it.each([
35
+ ['a fully populated config', shared],
36
+ ['a config with conflicting user attributes', conflicting],
37
+ ['an empty config', {}],
38
+ ])('produces the same attributes for logs and metrics given %s', (_label, config) => {
39
+ const [logs, metrics] = bothSignals(config)
40
+ expect(metrics).toEqual(logs)
41
+ expect(Object.keys(metrics)).toEqual(Object.keys(logs))
42
+ })
43
+
44
+ it('layers the identity keys over user resource attributes', () => {
45
+ for (const attributes of bothSignals(conflicting)) {
46
+ expect(attributes).toEqual({
47
+ 'service.name': 'checkout',
48
+ 'service.version': '2.1.0',
49
+ 'deployment.environment': 'production',
50
+ 'telemetry.sdk.name': 'posthog-node',
51
+ 'telemetry.sdk.version': '1.0.0',
52
+ 'host.name': 'web-01',
53
+ })
54
+ }
55
+ })
56
+
57
+ it('keeps user resource attributes that do not collide', () => {
58
+ for (const attributes of bothSignals(shared)) {
59
+ expect(attributes).toEqual({
60
+ 'host.name': 'web-01',
61
+ 'service.name': 'checkout',
62
+ 'deployment.environment': 'production',
63
+ 'service.version': '2.1.0',
64
+ 'telemetry.sdk.name': 'posthog-node',
65
+ 'telemetry.sdk.version': '1.0.0',
66
+ })
67
+ }
68
+ })
69
+
70
+ it('falls back to unknown_service and omits unset optional keys', () => {
71
+ for (const attributes of bothSignals({})) {
72
+ expect(attributes).toEqual({
73
+ 'service.name': 'unknown_service',
74
+ 'telemetry.sdk.name': 'posthog-node',
75
+ 'telemetry.sdk.version': '1.0.0',
76
+ })
77
+ }
78
+ })
79
+ })
80
+
81
+ describe('osResourceAttributes', () => {
82
+ it.each([
83
+ // node:os platform() identifiers rather than os.name values
84
+ ['darwin', 'macOS'],
85
+ ['win32', 'Windows'],
86
+ ['linux', 'Linux'],
87
+ ['android', 'Android'],
88
+ ['freebsd', 'FreeBSD'],
89
+ // detectOS spellings
90
+ ['Mac OS X', 'macOS'],
91
+ ['iOS', 'iOS'],
92
+ ['Android', 'Android'],
93
+ ['Windows', 'Windows'],
94
+ ['Linux', 'Linux'],
95
+ ])('normalizes %s to %s', (raw, expected) => {
96
+ expect(normalizeOsName(raw)).toBe(expected)
97
+ })
98
+
99
+ it('passes an unmapped name through rather than dropping it', () => {
100
+ expect(normalizeOsName('Haiku')).toBe('Haiku')
101
+ expect(normalizeOsName('constructor')).toBe('constructor')
102
+ })
103
+
104
+ it.each([undefined, ''])('returns undefined for %p', (raw) => {
105
+ expect(normalizeOsName(raw)).toBeUndefined()
106
+ })
107
+
108
+ it('agrees with the names posthog-ios and posthog-android already send', () => {
109
+ // Both SDKs ship these values today; a divergence here splits one filter in two.
110
+ expect(normalizeOsName('darwin')).toBe('macOS')
111
+ expect(normalizeOsName('Mac OS X')).toBe('macOS')
112
+ expect(normalizeOsName('iOS')).toBe('iOS')
113
+ expect(normalizeOsName('Android')).toBe('Android')
114
+ })
115
+
116
+ it('omits either key rather than emitting it empty', () => {
117
+ expect(osResourceAttributes('darwin', undefined)).toEqual({ 'os.name': 'macOS' })
118
+ expect(osResourceAttributes(undefined, '14.0')).toEqual({ 'os.version': '14.0' })
119
+ expect(osResourceAttributes('', '')).toEqual({})
120
+ expect(osResourceAttributes('win32', '10.0.26100')).toEqual({
121
+ 'os.name': 'Windows',
122
+ 'os.version': '10.0.26100',
123
+ })
124
+ })
125
+ })
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Shape the logs and metrics resolved configs share for resource
3
+ * attribution. Generic over the attribute value type so each signal keeps its
4
+ * own value union.
5
+ */
6
+ export interface OtlpResourceConfig<TAttributeValue> {
7
+ serviceName?: string
8
+ serviceVersion?: string
9
+ environment?: string
10
+ resourceAttributes?: Record<string, TAttributeValue>
11
+ }
12
+
13
+ /**
14
+ * OTLP resource attributes shared by the logs and metrics envelopes.
15
+ *
16
+ * User `resourceAttributes` are spread first, then SDK-controlled keys on top so
17
+ * a stray user key can't clobber the ingestion-attribution ones; the dedicated
18
+ * `serviceName` / `environment` / `serviceVersion` fields are how you override
19
+ * those three.
20
+ *
21
+ * @internal Shared within this SDK; not part of the stable public API.
22
+ */
23
+ export function buildOtlpResourceAttributes<TAttributeValue>(
24
+ config: OtlpResourceConfig<TAttributeValue>,
25
+ sdkName: string,
26
+ sdkVersion: string
27
+ ): Record<string, TAttributeValue | string> {
28
+ return {
29
+ ...config.resourceAttributes,
30
+ 'service.name': config.serviceName || 'unknown_service',
31
+ ...(config.environment && { 'deployment.environment': config.environment }),
32
+ ...(config.serviceVersion && { 'service.version': config.serviceVersion }),
33
+ 'telemetry.sdk.name': sdkName,
34
+ 'telemetry.sdk.version': sdkVersion,
35
+ }
36
+ }
37
+
38
+ /**
39
+ * OTLP `os.name` values, keyed by the spellings the JS SDKs detect natively:
40
+ * `node:os` `platform()` identifiers and the names `detectOS` reads out of a
41
+ * user agent.
42
+ *
43
+ * OpenTelemetry defines `os.name` as the human-readable OS name; the lowercase
44
+ * identifiers (`darwin`, `win32`) are `node:os` `platform()` values, not
45
+ * `os.name` values.
46
+ * The values match what `posthog-ios` and `posthog-android` send for the
47
+ * platforms they cover.
48
+ */
49
+ const OS_NAMES: Record<string, string> = {
50
+ // node:os platform()
51
+ darwin: 'macOS',
52
+ win32: 'Windows',
53
+ linux: 'Linux',
54
+ android: 'Android',
55
+ freebsd: 'FreeBSD',
56
+ openbsd: 'OpenBSD',
57
+ sunos: 'SunOS',
58
+ aix: 'AIX',
59
+ // detectOS
60
+ 'Mac OS X': 'macOS',
61
+ }
62
+
63
+ /**
64
+ * Normalizes a natively-detected OS name against the table above.
65
+ * Unrecognized names pass through: a wrong-looking value beats dropping an OS
66
+ * we have not mapped yet.
67
+ *
68
+ * @internal Shared within this SDK; not part of the stable public API.
69
+ */
70
+ export function normalizeOsName(name: string | undefined): string | undefined {
71
+ if (!name) {
72
+ return undefined
73
+ }
74
+ return Object.prototype.hasOwnProperty.call(OS_NAMES, name) ? OS_NAMES[name] : name
75
+ }
76
+
77
+ /**
78
+ * The `os.name` / `os.version` resource attribute pair, with either key omitted
79
+ * rather than emitted empty when the host cannot determine it.
80
+ *
81
+ * @internal Exposed for cross-package use within this SDK; not part of the stable public API.
82
+ */
83
+ export function osResourceAttributes(name: string | undefined, version: string | undefined): Record<string, string> {
84
+ const osName = normalizeOsName(name)
85
+ return {
86
+ ...(osName ? { 'os.name': osName } : {}),
87
+ ...(version ? { 'os.version': version } : {}),
88
+ }
89
+ }