Skip to content

chore: revert "feat(logger): refresh sample rate calculation per invocation" #3652

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

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 4 additions & 3 deletions docs/core/logger.md
Original file line number Diff line number Diff line change
Expand Up @@ -634,7 +634,7 @@ Once a child logger is created, the logger and its parent will act as separate i

### Sampling debug logs

Use sampling when you want to dynamically change your log level to **DEBUG** based on a **percentage of your invocations**.
Use sampling when you want to dynamically change your log level to **DEBUG** based on a **percentage of your concurrent/cold start invocations**.

You can use values ranging from `0` to `1` (100%) when setting the `sampleRateValue` constructor option or `POWERTOOLS_LOGGER_SAMPLE_RATE` env var.

Expand All @@ -643,9 +643,10 @@ You can use values ranging from `0` to `1` (100%) when setting the `sampleRateVa

This feature takes into account transient issues where additional debugging information can be useful.

Sampling decision happens at the Logger initialization. When using the `injectLambdaContext` method either as a decorator or middleware, the sampling decision is refreshed at the beginning of each Lambda invocation for you.
Sampling decision happens at the Logger initialization. This means sampling may happen significantly more or less than depending on your traffic patterns, for example a steady low number of invocations and thus few cold starts.

If you're not using either of these, you'll need to manually call the `refreshSamplingRate()` function at the start of your handler to refresh the sampling decision for each invocation.
!!! note
Open a [feature request](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new?assignees=&labels=type%2Ffeature-request%2Ctriage&projects=aws-powertools%2F7&template=feature_request.yml&title=Feature+request%3A+TITLE) if you want Logger to calculate sampling for every invocation

=== "handler.ts"

Expand Down
2 changes: 0 additions & 2 deletions examples/snippets/logger/logSampling.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ export const handler = async (
_event: unknown,
_context: unknown
): Promise<void> => {
// Refresh sample rate calculation on runtime, only when not using injectLambdaContext
logger.refreshSampleRateCalculation();
// This log item (equal to log level 'ERROR') will be printed to standard output
// in all Lambda invocations
logger.error('This is an ERROR log');
Expand Down
1 change: 0 additions & 1 deletion packages/logger/src/Logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,6 @@ class Logger extends Utility implements LoggerInterface {
context,
callback
) {
loggerRef.refreshSampleRateCalculation();
Logger.injectLambdaContextBefore(loggerRef, event, context, options);

let result: unknown;
Expand Down
3 changes: 0 additions & 3 deletions packages/logger/src/middleware/middy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,6 @@ const injectLambdaContext = (
if (isResetStateEnabled) {
setCleanupFunction(request);
}

logger.refreshSampleRateCalculation();

Logger.injectLambdaContextBefore(
logger,
request.event,
Expand Down
36 changes: 0 additions & 36 deletions packages/logger/tests/unit/injectLambdaContext.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,40 +184,4 @@ describe('Inject Lambda Context', () => {
})
);
});

it('refreshes sample rate calculation before each invocation using decorator', async () => {
// Prepare
const logger = new Logger({ sampleRateValue: 0.5 });
const refreshSpy = vi.spyOn(logger, 'refreshSampleRateCalculation');

class Lambda {
@logger.injectLambdaContext()
public async handler(_event: unknown, _context: Context): Promise<void> {
logger.info('test');
}
}
const lambda = new Lambda();

// Act
await lambda.handler({}, {} as Context);

// Assess
expect(refreshSpy).toHaveBeenCalledTimes(1);
});

it('refreshes sample rate calculation before each invocation using middleware', async () => {
// Prepare
const logger = new Logger({ sampleRateValue: 0.5 });
const refreshSpy = vi.spyOn(logger, 'refreshSampleRateCalculation');

const handler = middy(async () => {
logger.info('Hello, world!');
}).use(injectLambdaContext(logger));

// Act
await handler(event, context);

// Assess
expect(refreshSpy).toHaveBeenCalledTimes(1);
});
});
Loading