Skip to content

feat(logs): Add experimental user-callable logging methods #15442

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 36 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
bdcb9e1
initial work on .log
colin-sentry Feb 14, 2025
4281cbe
improve a bit
colin-sentry Feb 14, 2025
1869d6f
linting, etc
colin-sentry Feb 18, 2025
4b89486
fix: Rename ourlog -> log
AbhiPrasad Feb 20, 2025
2fe0e1b
ref: Namespace logging methods in experiment obj
AbhiPrasad Feb 20, 2025
21b16e8
ref: Improve log creation logic and update option name
AbhiPrasad Feb 20, 2025
9ac58b1
allow for multiple logs to be flushed in the same envelope
AbhiPrasad Feb 20, 2025
8fc4ae2
feat: Add release and environment to logs
AbhiPrasad Feb 20, 2025
f3adcde
ref: Change log buffer max length from 100 -> 25
AbhiPrasad Feb 20, 2025
bbc170d
feat: Send severityNumber
AbhiPrasad Feb 20, 2025
bab4c6e
ref: re-org functions and exports
AbhiPrasad Feb 20, 2025
f750d08
feat: Add log function
AbhiPrasad Feb 20, 2025
7218377
fix: use correct severity number for log
AbhiPrasad Feb 20, 2025
3e936c9
chore: Bump size-limit
AbhiPrasad Feb 24, 2025
b702cf0
chore: size limit entries that were missed
AbhiPrasad Feb 24, 2025
301a1ca
Update packages/core/src/log.ts
k-fish Mar 4, 2025
6f3560c
Use '.' for param so it renders more nicely in the log attribute tree…
k-fish Mar 4, 2025
6215ad9
json the parameters
colin-sentry Mar 4, 2025
9048164
align attributes with what was agreed
AbhiPrasad Mar 4, 2025
4e0d9bd
Merge branch 'develop' into colin/log-api
AbhiPrasad Mar 4, 2025
a8673b7
fix: Duplicate export identifier
AbhiPrasad Mar 4, 2025
e9fa3bc
ref: introduce format function and restructure exports
AbhiPrasad Mar 4, 2025
2c3db7d
Merge branch 'develop' into colin/log-api
AbhiPrasad Mar 5, 2025
3ffc54b
Merge branch 'develop' into colin/log-api
AbhiPrasad Mar 5, 2025
cdf8bc5
chore: bump size-limit
AbhiPrasad Mar 5, 2025
0e77407
fix: ParamaterizeString typing to allow more than string values
AbhiPrasad Mar 6, 2025
4d0678a
feat: Add parent_span_id to outgoing logs
AbhiPrasad Mar 6, 2025
7b83155
feat: Export logging methods for node/server-side SDKs
AbhiPrasad Mar 6, 2025
6994781
fix: Set parent_span_id properly
AbhiPrasad Mar 6, 2025
8602f81
fix: Remove unneeded import
AbhiPrasad Mar 6, 2025
7d22aa2
chore: bump size-limit
AbhiPrasad Mar 6, 2025
d7e3479
Merge branch 'develop' into colin/log-api
AbhiPrasad Mar 6, 2025
bbb1698
Merge branch 'develop' into colin/log-api
colin-sentry Mar 11, 2025
c4b6d2d
feat(buffer): Add beforeSendLogs for sampling decisions
colin-sentry Mar 13, 2025
1da9a7f
clean up
colin-sentry Mar 13, 2025
5b66ccf
remove old comment
colin-sentry Mar 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions .size-limit.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ module.exports = [
path: 'packages/browser/build/npm/esm/index.js',
import: createImport('init'),
gzip: true,
limit: '24 KB',
limit: '25 KB',
},
{
name: '@sentry/browser - with treeshaking flags',
path: 'packages/browser/build/npm/esm/index.js',
import: createImport('init'),
gzip: true,
limit: '24.1 KB',
limit: '24.5 KB',
modifyWebpackConfig: function (config) {
const webpack = require('webpack');
const TerserPlugin = require('terser-webpack-plugin');
Expand All @@ -40,14 +40,14 @@ module.exports = [
path: 'packages/browser/build/npm/esm/index.js',
import: createImport('init', 'browserTracingIntegration'),
gzip: true,
limit: '37.5 KB',
limit: '38 KB',
},
{
name: '@sentry/browser (incl. Tracing, Replay)',
path: 'packages/browser/build/npm/esm/index.js',
import: createImport('init', 'browserTracingIntegration', 'replayIntegration'),
gzip: true,
limit: '75.2 KB',
limit: '77 KB',
},
{
name: '@sentry/browser (incl. Tracing, Replay) - with treeshaking flags',
Expand Down Expand Up @@ -79,7 +79,7 @@ module.exports = [
path: 'packages/browser/build/npm/esm/index.js',
import: createImport('init', 'browserTracingIntegration', 'replayIntegration', 'replayCanvasIntegration'),
gzip: true,
limit: '80 KB',
limit: '82 KB',
},
{
name: '@sentry/browser (incl. Tracing, Replay, Feedback)',
Expand All @@ -100,14 +100,14 @@ module.exports = [
path: 'packages/browser/build/npm/esm/index.js',
import: createImport('init', 'sendFeedback'),
gzip: true,
limit: '29 KB',
limit: '30 KB',
},
{
name: '@sentry/browser (incl. FeedbackAsync)',
path: 'packages/browser/build/npm/esm/index.js',
import: createImport('init', 'feedbackAsyncIntegration'),
gzip: true,
limit: '34 KB',
limit: '34.5 KB',
},
// React SDK (ESM)
{
Expand Down Expand Up @@ -210,7 +210,7 @@ module.exports = [
import: createImport('init'),
ignore: ['next/router', 'next/constants'],
gzip: true,
limit: '41 KB',
limit: '43 KB',
},
// SvelteKit SDK (ESM)
{
Expand All @@ -219,7 +219,7 @@ module.exports = [
import: createImport('init'),
ignore: ['$app/stores'],
gzip: true,
limit: '38 KB',
limit: '39 KB',
},
// Node SDK (ESM)
{
Expand Down
1 change: 1 addition & 0 deletions packages/astro/src/index.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ export {
withScope,
zodErrorsIntegration,
profiler,
_experiment_log,
} from '@sentry/node';

export { init } from './server/sdk';
Expand Down
1 change: 1 addition & 0 deletions packages/aws-serverless/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ export {
profiler,
amqplibIntegration,
vercelAIIntegration,
_experiment_log,
} from '@sentry/node';

export {
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 @@ -10,6 +10,7 @@ export {
extraErrorDataIntegration,
rewriteFramesIntegration,
captureFeedback,
_experiment_log,
} from '@sentry/core';

export { replayIntegration, getReplay } from '@sentry-internal/replay';
Expand Down
1 change: 1 addition & 0 deletions packages/bun/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ export {
profiler,
amqplibIntegration,
vercelAIIntegration,
_experiment_log,
} from '@sentry/node';

export {
Expand Down
1 change: 1 addition & 0 deletions packages/cloudflare/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ export {
spanToTraceHeader,
spanToBaggageHeader,
updateSpanName,
_experiment_log,
} from '@sentry/core';

export { withSentry } from './handler';
Expand Down
116 changes: 116 additions & 0 deletions packages/core/src/exports.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { getClient, getCurrentScope, getIsolationScope, withIsolationScope } from './currentScopes';
import { DEBUG_BUILD } from './debug-build';
import { captureLog, sendLog } from './log';
import type { CaptureContext } from './scope';
import { closeSession, makeSession, updateSession } from './session';
import type {
Expand All @@ -22,6 +23,7 @@ import { logger } from './utils-hoist/logger';
import { uuid4 } from './utils-hoist/misc';
import { timestampInSeconds } from './utils-hoist/time';
import { GLOBAL_OBJ } from './utils-hoist/worldwide';
import { parameterizeStringTemplate } from './utils/parameterize';
import type { ExclusiveEventHintOrCaptureContext } from './utils/prepareEvent';
import { parseEventHintOrCaptureContext } from './utils/prepareEvent';

Expand Down Expand Up @@ -334,3 +336,117 @@ export function captureSession(end: boolean = false): void {
// only send the update
_sendSessionUpdate();
}

/**
* A namespace for experimental logging functions.
*
* @experimental Will be removed in future versions. Use with caution.
*/
export const _experiment_log = {
/**
* A utility to record a log with level 'TRACE' and send it to sentry.
*
* Logs represent a message and some parameters which provide context for a trace or error.
*
* @example
* ```js
* const { trace, fmt } = Sentry._experiment_log;
* trace(fmt`user ${username} just bought ${item}!`);
* ```
*/
trace: sendLog('trace'),
/**
* A utility to record a log with level 'DEBUG' and send it to sentry.
*
* Logs represent a message and some parameters which provide context for a trace or error.
*
* @example
* ```js
* const { debug, fmt } = Sentry._experiment_log;
* debug(fmt`user ${username} just bought ${item}!`);
* ```
*/
debug: sendLog('debug'),
/**
* A utility to record a log with level 'INFO' and send it to sentry.
*
* Logs represent a message and some parameters which provide context for a trace or error.
*
* @example
* ```js
* const { info, fmt } = Sentry._experiment_log;
* info(fmt`user ${username} just bought ${item}!`);
* ```
*/
info: sendLog('info'),
/**
* A utility to record a log with level 'INFO' and send it to sentry.
*
* Logs represent a message and some parameters which provide context for a trace or error.
*
* @example
* ```js
* const { log, fmt } = Sentry._experiment_log;
* log(fmt`user ${username} just bought ${item}!`);
* ```
*/
log: sendLog('info', 10),
/**
* A utility to record a log with level 'ERROR' and send it to sentry.
*
* Logs represent a message and some parameters which provide context for a trace or error.
*
* @example
* ```js
* const { error, fmt } = Sentry._experiment_log;
* error(fmt`user ${username} just bought ${item}!`);
* ```
*/
error: sendLog('error'),
/**
* A utility to record a log with level 'WARN' and send it to sentry.
*
* Logs represent a message and some parameters which provide context for a trace or error.
*
* @example
* ```js
* const { warn, fmt } = Sentry._experiment_log;
* warn(fmt`user ${username} just bought ${item}!`);
* ```
*/
warn: sendLog('warn'),
/**
* A utility to record a log with level 'FATAL' and send it to sentry.
*
* Logs represent a message and some parameters which provide context for a trace or error.
*
* @example
* ```js
* const { fatal, fmt } = Sentry._experiment_log;
* fatal(fmt`user ${username} just bought ${item}!`);
* ```
*/
fatal: sendLog('fatal'),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the side-effect y'all are probably looking for.


/**
* Tagged template function which returns parameterized representation of the message
*
* @example
* ```js
* Sentry._experiment_log.fmt`This is a log statement with ${x} and ${y} params`
* ```
*/
fmt: parameterizeStringTemplate,

/**
* A flexible utility to record a log with a custom level and send it to sentry.
*
* You can optionally pass in custom attributes and a custom severity number to be attached to the log.
*
* @example
* ```js
* Sentry._experiment_log.emit({ level: 'info', message: Sentry._experiment_log.fmt`user ${username }just bought ${item}`, attributes: { extra: 123 } })
* ```
*/
emit: captureLog,
};
1 change: 1 addition & 0 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export {
endSession,
captureSession,
addEventProcessor,
_experiment_log,
} from './exports';
export {
getCurrentScope,
Expand Down
Loading
Loading