{"version":3,"file":"exports.js","sources":["../../../src/metrics/exports.ts"],"sourcesContent":["import type { Client, DurationUnit, MetricData, MetricsAggregator as MetricsAggregatorInterface } from '@sentry/types';\nimport { getGlobalSingleton, logger, timestampInSeconds } from '@sentry/utils';\nimport { getClient } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { startSpanManual } from '../tracing';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors';\nimport { getActiveSpan, getRootSpan, spanToJSON } from '../utils/spanUtils';\nimport { COUNTER_METRIC_TYPE, DISTRIBUTION_METRIC_TYPE, GAUGE_METRIC_TYPE, SET_METRIC_TYPE } from './constants';\nimport type { MetricType } from './types';\n\ntype MetricsAggregatorConstructor = {\n new (client: Client): MetricsAggregatorInterface;\n};\n\n/**\n * Gets the metrics aggregator for a given client.\n * @param client The client for which to get the metrics aggregator.\n * @param Aggregator Optional metrics aggregator class to use to create an aggregator if one does not exist.\n */\nfunction getMetricsAggregatorForClient(\n client: Client,\n Aggregator: MetricsAggregatorConstructor,\n): MetricsAggregatorInterface {\n const globalMetricsAggregators = getGlobalSingleton>(\n 'globalMetricsAggregators',\n () => new WeakMap(),\n );\n\n const aggregator = globalMetricsAggregators.get(client);\n if (aggregator) {\n return aggregator;\n }\n\n const newAggregator = new Aggregator(client);\n client.on('flush', () => newAggregator.flush());\n client.on('close', () => newAggregator.close());\n globalMetricsAggregators.set(client, newAggregator);\n\n return newAggregator;\n}\n\nfunction addToMetricsAggregator(\n Aggregator: MetricsAggregatorConstructor,\n metricType: MetricType,\n name: string,\n value: number | string,\n data: MetricData | undefined = {},\n): void {\n const client = data.client || getClient();\n\n if (!client) {\n return;\n }\n\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n const transactionName = rootSpan && spanToJSON(rootSpan).description;\n\n const { unit, tags, timestamp } = data;\n const { release, environment } = client.getOptions();\n const metricTags: Record = {};\n if (release) {\n metricTags.release = release;\n }\n if (environment) {\n metricTags.environment = environment;\n }\n if (transactionName) {\n metricTags.transaction = transactionName;\n }\n\n DEBUG_BUILD && logger.log(`Adding value of ${value} to ${metricType} metric ${name}`);\n\n const aggregator = getMetricsAggregatorForClient(client, Aggregator);\n aggregator.add(metricType, name, value, unit, { ...metricTags, ...tags }, timestamp);\n}\n\n/**\n * Adds a value to a counter metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction increment(aggregator: MetricsAggregatorConstructor, name: string, value: number = 1, data?: MetricData): void {\n addToMetricsAggregator(aggregator, COUNTER_METRIC_TYPE, name, ensureNumber(value), data);\n}\n\n/**\n * Adds a value to a distribution metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction distribution(aggregator: MetricsAggregatorConstructor, name: string, value: number, data?: MetricData): void {\n addToMetricsAggregator(aggregator, DISTRIBUTION_METRIC_TYPE, name, ensureNumber(value), data);\n}\n\n/**\n * Adds a timing metric.\n * The metric is added as a distribution metric.\n *\n * You can either directly capture a numeric `value`, or wrap a callback function in `timing`.\n * In the latter case, the duration of the callback execution will be captured as a span & a metric.\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction timing(\n aggregator: MetricsAggregatorConstructor,\n name: string,\n value: number | (() => T),\n unit: DurationUnit = 'second',\n data?: Omit,\n): T | void {\n // callback form\n if (typeof value === 'function') {\n const startTime = timestampInSeconds();\n\n return startSpanManual(\n {\n op: 'metrics.timing',\n name,\n startTime,\n onlyIfParent: true,\n },\n span => {\n return handleCallbackErrors(\n () => value(),\n () => {\n // no special error handling necessary\n },\n () => {\n const endTime = timestampInSeconds();\n const timeDiff = endTime - startTime;\n // eslint-disable-next-line deprecation/deprecation\n distribution(aggregator, name, timeDiff, { ...data, unit: 'second' });\n span.end(endTime);\n },\n );\n },\n );\n }\n\n // value form\n // eslint-disable-next-line deprecation/deprecation\n distribution(aggregator, name, value, { ...data, unit });\n}\n\n/**\n * Adds a value to a set metric. Value must be a string or integer.\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction set(aggregator: MetricsAggregatorConstructor, name: string, value: number | string, data?: MetricData): void {\n addToMetricsAggregator(aggregator, SET_METRIC_TYPE, name, value, data);\n}\n\n/**\n * Adds a value to a gauge metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction gauge(aggregator: MetricsAggregatorConstructor, name: string, value: number, data?: MetricData): void {\n addToMetricsAggregator(aggregator, GAUGE_METRIC_TYPE, name, ensureNumber(value), data);\n}\n\n/**\n * The metrics API is used to capture custom metrics in Sentry.\n *\n * @deprecated The Sentry metrics beta has ended. This export will be removed in a future release.\n */\nexport const metrics = {\n increment,\n distribution,\n set,\n gauge,\n timing,\n /**\n * @ignore This is for internal use only.\n */\n getMetricsAggregatorForClient,\n};\n\n// Although this is typed to be a number, we try to handle strings as well here\nfunction ensureNumber(number: number | string): number {\n return typeof number === 'string' ? parseInt(number) : number;\n}\n"],"names":[],"mappings":"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"}