Skip to content

Commit

Permalink
Merge pull request #10617 from getsentry/fn/backport-to-v7
Browse files Browse the repository at this point in the history
Backport changes to v7
  • Loading branch information
mydea authored Feb 13, 2024
2 parents 613a1aa + 42cf5e7 commit 551e401
Show file tree
Hide file tree
Showing 37 changed files with 862 additions and 40 deletions.
2 changes: 1 addition & 1 deletion .size-limit.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ module.exports = [
path: 'packages/browser/build/bundles/bundle.tracing.min.js',
gzip: false,
brotli: false,
limit: '105 KB',
limit: '112 KB',
},
{
name: '@sentry/browser - ES6 CDN Bundle (minified & uncompressed)',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
const { loggingTransport } = require('@sentry-internal/node-integration-tests');
const Sentry = require('@sentry/node');

Sentry.init({
dsn: 'https://[email protected]/1337',
release: '1.0',
tracesSampleRate: 1.0,
transport: loggingTransport,
_experiments: {
metricsAggregator: true,
},
});

// Stop the process from exiting before the transaction is sent
setInterval(() => {}, 1000);

Sentry.startSpan(
{
name: 'Test Transaction',
op: 'transaction',
},
() => {
Sentry.metrics.increment('root-counter', 1, {
tags: {
email: '[email protected]',
},
});
Sentry.metrics.increment('root-counter', 1, {
tags: {
email: '[email protected]',
},
});

Sentry.startSpan(
{
name: 'Some other span',
op: 'transaction',
},
() => {
Sentry.metrics.increment('root-counter');
Sentry.metrics.increment('root-counter');
Sentry.metrics.increment('root-counter', 2);

Sentry.metrics.set('root-set', 'some-value');
Sentry.metrics.set('root-set', 'another-value');
Sentry.metrics.set('root-set', 'another-value');

Sentry.metrics.gauge('root-gauge', 42);
Sentry.metrics.gauge('root-gauge', 20);

Sentry.metrics.distribution('root-distribution', 42);
Sentry.metrics.distribution('root-distribution', 20);
},
);
},
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { createRunner } from '../../../utils/runner';

const EXPECTED_TRANSACTION = {
transaction: 'Test Transaction',
_metrics_summary: {
'c:root-counter@none': [
{
min: 1,
max: 1,
count: 1,
sum: 1,
tags: {
release: '1.0',
transaction: 'Test Transaction',
email: '[email protected]',
},
},
{
min: 1,
max: 1,
count: 1,
sum: 1,
tags: {
release: '1.0',
transaction: 'Test Transaction',
email: '[email protected]',
},
},
],
},
spans: expect.arrayContaining([
expect.objectContaining({
description: 'Some other span',
op: 'transaction',
_metrics_summary: {
'c:root-counter@none': [
{
min: 1,
max: 2,
count: 3,
sum: 4,
tags: {
release: '1.0',
transaction: 'Test Transaction',
},
},
],
's:root-set@none': [
{
min: 0,
max: 1,
count: 3,
sum: 2,
tags: {
release: '1.0',
transaction: 'Test Transaction',
},
},
],
'g:root-gauge@none': [
{
min: 20,
max: 42,
count: 2,
sum: 62,
tags: {
release: '1.0',
transaction: 'Test Transaction',
},
},
],
'd:root-distribution@none': [
{
min: 20,
max: 42,
count: 2,
sum: 62,
tags: {
release: '1.0',
transaction: 'Test Transaction',
},
},
],
},
}),
]),
};

test('Should add metric summaries to spans', done => {
createRunner(__dirname, 'scenario.js').expect({ transaction: EXPECTED_TRANSACTION }).start(done);
});
13 changes: 13 additions & 0 deletions packages/angular-ivy/scripts/prepack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ type PackageJson = {
type?: string;
nx?: string;
volta?: any;
exports?: Record<string, string | Record<string, string>>;
};

const buildDir = path.join(process.cwd(), 'build');
Expand All @@ -18,6 +19,18 @@ const pkgJson: PackageJson = JSON.parse(fs.readFileSync(pkjJsonPath).toString())
delete pkgJson.main;
pkgJson.type = 'module';

pkgJson.exports = {
'.': {
es2015: './fesm2015/sentry-angular-ivy.js',
esm2015: './esm2015/sentry-angular-ivy.js',
fesm2015: './fesm2015/sentry-angular-ivy.js',
import: './fesm2015/sentry-angular-ivy.js',
require: './bundles/sentry-angular-ivy.umd.js',
types: './sentry-angular-ivy.d.ts',
},
'./*': './*',
};

// no need to keep around other properties that are only relevant for our reop:
delete pkgJson.nx;
delete pkgJson.volta;
Expand Down
1 change: 0 additions & 1 deletion packages/angular/src/tracing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,6 @@ export class TraceService implements OnDestroy {
if (!getActiveSpan()) {
startBrowserTracingNavigationSpan(client, {
name: strippedUrl,
op: 'navigation',
origin: 'auto.navigation.angular',
attributes: {
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',
Expand Down
4 changes: 4 additions & 0 deletions packages/astro/src/index.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ export {
continueTrace,
cron,
parameterize,
SEMANTIC_ATTRIBUTE_SENTRY_OP,
SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,
SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,
SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,
} from '@sentry/node';

// We can still leave this for the carrier init and type exports
Expand Down
7 changes: 7 additions & 0 deletions packages/browser/src/exports.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,13 @@ export {
parameterize,
} from '@sentry/core';

export {
SEMANTIC_ATTRIBUTE_SENTRY_OP,
SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,
SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,
SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,
} from '@sentry/core';

export { WINDOW } from './helpers';
export { BrowserClient } from './client';
export { makeFetchTransport, makeXHRTransport } from './transports';
Expand Down
1 change: 1 addition & 0 deletions packages/browser/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export {
// eslint-disable-next-line deprecation/deprecation
Replay,
replayIntegration,
getReplay,
} from '@sentry/replay';
export type {
ReplayEventType,
Expand Down
4 changes: 4 additions & 0 deletions packages/bun/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ export {
onUncaughtExceptionIntegration,
onUnhandledRejectionIntegration,
spotlightIntegration,
SEMANTIC_ATTRIBUTE_SENTRY_OP,
SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,
SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,
SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,
} from '@sentry/node';

export { BunClient } from './client';
Expand Down
11 changes: 10 additions & 1 deletion packages/core/src/metrics/aggregator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ import type {
Primitive,
} from '@sentry/types';
import { timestampInSeconds } from '@sentry/utils';
import { DEFAULT_FLUSH_INTERVAL, MAX_WEIGHT, NAME_AND_TAG_KEY_NORMALIZATION_REGEX } from './constants';
import { DEFAULT_FLUSH_INTERVAL, MAX_WEIGHT, NAME_AND_TAG_KEY_NORMALIZATION_REGEX, SET_METRIC_TYPE } from './constants';
import { METRIC_MAP } from './instance';
import { updateMetricSummaryOnActiveSpan } from './metric-summary';
import type { MetricBucket, MetricType } from './types';
import { getBucketKey, sanitizeTags } from './utils';

Expand Down Expand Up @@ -62,7 +63,11 @@ export class MetricsAggregator implements MetricsAggregatorBase {
const tags = sanitizeTags(unsanitizedTags);

const bucketKey = getBucketKey(metricType, name, unit, tags);

let bucketItem = this._buckets.get(bucketKey);
// If this is a set metric, we need to calculate the delta from the previous weight.
const previousWeight = bucketItem && metricType === SET_METRIC_TYPE ? bucketItem.metric.weight : 0;

if (bucketItem) {
bucketItem.metric.add(value);
// TODO(abhi): Do we need this check?
Expand All @@ -82,6 +87,10 @@ export class MetricsAggregator implements MetricsAggregatorBase {
this._buckets.set(bucketKey, bucketItem);
}

// If value is a string, it's a set metric so calculate the delta from the previous weight.
const val = typeof value === 'string' ? bucketItem.metric.weight - previousWeight : value;
updateMetricSummaryOnActiveSpan(metricType, name, val, unit, unsanitizedTags, bucketKey);

// We need to keep track of the total weight of the buckets so that we can
// flush them when we exceed the max weight.
this._bucketsTotalWeight += bucketItem.metric.weight;
Expand Down
27 changes: 15 additions & 12 deletions packages/core/src/metrics/browser-aggregator.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
import type {
Client,
ClientOptions,
MeasurementUnit,
MetricBucketItem,
MetricsAggregator,
Primitive,
} from '@sentry/types';
import type { Client, ClientOptions, MeasurementUnit, MetricsAggregator, Primitive } from '@sentry/types';
import { timestampInSeconds } from '@sentry/utils';
import { DEFAULT_BROWSER_FLUSH_INTERVAL, NAME_AND_TAG_KEY_NORMALIZATION_REGEX } from './constants';
import { DEFAULT_BROWSER_FLUSH_INTERVAL, NAME_AND_TAG_KEY_NORMALIZATION_REGEX, SET_METRIC_TYPE } from './constants';
import { METRIC_MAP } from './instance';
import { updateMetricSummaryOnActiveSpan } from './metric-summary';
import type { MetricBucket, MetricType } from './types';
import { getBucketKey, sanitizeTags } from './utils';

Expand Down Expand Up @@ -46,24 +40,33 @@ export class BrowserMetricsAggregator implements MetricsAggregator {
const tags = sanitizeTags(unsanitizedTags);

const bucketKey = getBucketKey(metricType, name, unit, tags);
const bucketItem: MetricBucketItem | undefined = this._buckets.get(bucketKey);

let bucketItem = this._buckets.get(bucketKey);
// If this is a set metric, we need to calculate the delta from the previous weight.
const previousWeight = bucketItem && metricType === SET_METRIC_TYPE ? bucketItem.metric.weight : 0;

if (bucketItem) {
bucketItem.metric.add(value);
// TODO(abhi): Do we need this check?
if (bucketItem.timestamp < timestamp) {
bucketItem.timestamp = timestamp;
}
} else {
this._buckets.set(bucketKey, {
bucketItem = {
// @ts-expect-error we don't need to narrow down the type of value here, saves bundle size.
metric: new METRIC_MAP[metricType](value),
timestamp,
metricType,
name,
unit,
tags,
});
};
this._buckets.set(bucketKey, bucketItem);
}

// If value is a string, it's a set metric so calculate the delta from the previous weight.
const val = typeof value === 'string' ? bucketItem.metric.weight - previousWeight : value;
updateMetricSummaryOnActiveSpan(metricType, name, val, unit, unsanitizedTags, bucketKey);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/metrics/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export const NAME_AND_TAG_KEY_NORMALIZATION_REGEX = /[^a-zA-Z0-9_/.-]+/g;
*
* See: https://develop.sentry.dev/sdk/metrics/#normalization
*/
export const TAG_VALUE_NORMALIZATION_REGEX = /[^\w\d_:/@.{}[\]$-]+/g;
export const TAG_VALUE_NORMALIZATION_REGEX = /[^\w\d\s_:/@.{}[\]$-]+/g;

/**
* This does not match spec in https://develop.sentry.dev/sdk/metrics
Expand Down
Loading

0 comments on commit 551e401

Please sign in to comment.