{"version":3,"file":"gcCollector.js","sourceRoot":"","sources":["../../../src/metrics/gcCollector.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,8CAA8C;AAI9C,4CAA0D;AAC1D,mDAAgD;AAChD,wCAAwE;AAExE,MAAM,2BAA2B,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAEvD,MAAM,KAAK,GAAa,EAAE,CAAC;AAC3B,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC;AAChE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC;AAChE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,+BAA+B,CAAC,GAAG,aAAa,CAAC;AAC5E,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,0BAA0B,CAAC,GAAG,QAAQ,CAAC;AAElE,MAAa,WAAY,SAAQ,6BAAa;IACpC,0BAA0B,CAAa;IACvC,SAAS,CAAsB;IAEvC,YAAY,SAA2C,EAAE;QACvD,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE;YACzD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,OAAO;YAElC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,4BAA4B;YAC5B,oCAAoC;YACpC,6HAA6H;YAC7H,8DAA8D;YAC9D,aAAa;YACb,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzE,IAAI,CAAC,0BAA0B,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,EAAE;gBAC7D,CAAC,2BAAiB,CAAC,EAAE,IAAI;aAC1B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB,CAAC,KAAY;QAClC,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC,eAAe,CACrD,iCAAuB,EACvB;YACE,WAAW,EACT,kFAAkF;YACpF,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,eAAS,CAAC,MAAM;YAC3B,MAAM,EAAE;gBACN,wBAAwB,EAAE,2BAA2B;aACtD;SACF,CACF,CAAC;IACJ,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,eAAe;QACb,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;IAC9B,CAAC;CACF;AA5CD,kCA4CC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as perf_hooks from 'node:perf_hooks';\nimport { PerformanceObserver } from 'node:perf_hooks';\nimport { Meter } from '@opentelemetry/api';\nimport { RuntimeNodeInstrumentationConfig } from '../types';\nimport { Histogram, ValueType } from '@opentelemetry/api';\nimport { BaseCollector } from './baseCollector';\nimport { ATTR_V8JS_GC_TYPE, METRIC_V8JS_GC_DURATION } from '../semconv';\n\nconst DEFAULT_GC_DURATION_BUCKETS = [0.01, 0.1, 1, 10];\n\nconst kinds: string[] = [];\nkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR] = 'major';\nkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR] = 'minor';\nkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL] = 'incremental';\nkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB] = 'weakcb';\n\nexport class GCCollector extends BaseCollector {\n  private _gcDurationByKindHistogram?: Histogram;\n  private _observer: PerformanceObserver;\n\n  constructor(config: RuntimeNodeInstrumentationConfig = {}) {\n    super(config);\n    this._observer = new perf_hooks.PerformanceObserver(list => {\n      if (!this._config.enabled) return;\n\n      const entry = list.getEntries()[0];\n      // Node < 16 uses entry.kind\n      // Node >= 16 uses entry.detail.kind\n      // See: https://nodejs.org/docs/latest-v16.x/api/deprecations.html#deprecations_dep0152_extension_performanceentry_properties\n      // eslint-disable-next-line  @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const kind = entry.detail ? kinds[entry.detail.kind] : kinds[entry.kind];\n      this._gcDurationByKindHistogram?.record(entry.duration / 1000, {\n        [ATTR_V8JS_GC_TYPE]: kind,\n      });\n    });\n  }\n\n  updateMetricInstruments(meter: Meter): void {\n    this._gcDurationByKindHistogram = meter.createHistogram(\n      METRIC_V8JS_GC_DURATION,\n      {\n        description:\n          'Garbage collection duration by kind, one of major, minor, incremental or weakcb.',\n        unit: 's',\n        valueType: ValueType.DOUBLE,\n        advice: {\n          explicitBucketBoundaries: DEFAULT_GC_DURATION_BUCKETS,\n        },\n      }\n    );\n  }\n\n  internalEnable(): void {\n    this._observer.observe({ entryTypes: ['gc'] });\n  }\n\n  internalDisable(): void {\n    this._observer.disconnect();\n  }\n}\n"]}