Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
ff06c8a
Add loggerConfigurator and tests.
JacksonWeber Oct 6, 2025
cfd6b7f
Update README.md
JacksonWeber Oct 7, 2025
5ac7921
Update CHANGELOG.md
JacksonWeber Oct 7, 2025
c407f31
Fix lint & add @experimental tags.
JacksonWeber Oct 7, 2025
bf5dc25
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 7, 2025
8e25840
Update README.md
JacksonWeber Oct 7, 2025
0dddc5d
Merge branch 'jacksonweber/logger-sampling' of https://github.com/Jac…
JacksonWeber Oct 7, 2025
9bf4209
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 8, 2025
0975102
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 8, 2025
9a70d03
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 9, 2025
c221452
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 9, 2025
afc2b6b
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 10, 2025
f8e40d6
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 13, 2025
2bc4ff6
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 15, 2025
79ceb8e
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 16, 2025
75ade7f
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 17, 2025
19896a3
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 21, 2025
b7431cc
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 21, 2025
262a8a3
Remove loggerConfigurator and move to a logRecordProcessor.
JacksonWeber Oct 22, 2025
3e2eb42
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 22, 2025
4947cc3
Roll back logger configurator changes.
JacksonWeber Oct 23, 2025
9648c0a
Merge branch 'jacksonweber/logger-sampling' of https://github.com/Jac…
JacksonWeber Oct 23, 2025
1d85b23
Update changelog.
JacksonWeber Oct 23, 2025
ca3c518
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 23, 2025
c55deae
Fix lint.
JacksonWeber Oct 23, 2025
72efbe0
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Oct 31, 2025
aa60d69
Update CHANGELOG.md
JacksonWeber Oct 31, 2025
ec14540
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Nov 3, 2025
574960e
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Nov 6, 2025
1fa6929
Fix lint.
JacksonWeber Nov 7, 2025
e110731
Merge branch 'main' into jacksonweber/logger-sampling
JacksonWeber Nov 8, 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
1 change: 1 addition & 0 deletions experimental/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2
* feat(opentelemetry-configuration): parse meter provider from config file [#6000](https://github.com/open-telemetry/opentelemetry-js/pull/6000) @maryliag
* feat(opentelemetry-configuration): add backup options for certificates and endpoints [#6038](https://github.com/open-telemetry/opentelemetry-js/pull/6038) @maryliag
* feat(opentelemetry-configuration): add backups for compression, timeout, headers [#6058](https://github.com/open-telemetry/opentelemetry-js/pull/6058) @JamieDanielson
* feat(sdk-logs): add the `FilteringLogRecordProcessor` including the ability to filter by minimum severity and trace [#5991](https://github.com/open-telemetry/opentelemetry-js/pull/5991) @JacksonWeber

### :bug: Bug Fixes

Expand Down
62 changes: 62 additions & 0 deletions experimental/packages/sdk-logs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,68 @@ logger.emit({
Logs configuration is a merge of both the user supplied configuration and the default
configuration as specified in [config.ts](./src/config.ts)

## Filtering Log Records

Use the `FilteringLogRecordProcessor` to drop log records by severity or trace sampling before they reach exporters. Wrap your existing processor so only logs that pass the filter are forwarded.

### Minimum Severity Filtering

```js
const {
LoggerProvider,
SimpleLogRecordProcessor,
FilteringLogRecordProcessor,
} = require('@opentelemetry/sdk-logs');
const { SeverityNumber } = require('@opentelemetry/api-logs');

const loggerProvider = new LoggerProvider({
processors: [
new FilteringLogRecordProcessor(
new SimpleLogRecordProcessor(exporter),
{ minimumSeverity: SeverityNumber.WARN }
),
],
});
```

- Logs with `severityNumber >= minimumSeverity` are exported.
- Logs with `severityNumber = UNSPECIFIED` (0) or undefined always bypass the filter.
- Default minimum severity is `UNSPECIFIED` (no filtering).

### Trace-Based Filtering

```js
const loggerProvider = new LoggerProvider({
processors: [
new FilteringLogRecordProcessor(
new SimpleLogRecordProcessor(exporter),
{ traceBased: true }
),
],
});
```

- Logs associated with **sampled traces** (`TraceFlags.SAMPLED` set) are exported.
- Logs associated with **unsampled traces** are dropped.
- Logs **without trace context** bypass the filter and are exported.
- Default is `false` (no trace-based filtering).

### Combined Filtering

```js
const loggerProvider = new LoggerProvider({
processors: [
new FilteringLogRecordProcessor(
new SimpleLogRecordProcessor(exporter),
{
minimumSeverity: SeverityNumber.WARN,
traceBased: true,
}
),
],
});
```

## Example

See [examples/logs](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/examples/logs)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* Copyright The OpenTelemetry Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import {
Context,
TraceFlags,
isSpanContextValid,
trace,
} from '@opentelemetry/api';
import { SeverityNumber } from '@opentelemetry/api-logs';

import { LogRecordProcessor } from '../LogRecordProcessor';
import type { SdkLogRecord } from './SdkLogRecord';

export interface FilteringLogRecordProcessorConfig {
minimumSeverity?: SeverityNumber;
traceBased?: boolean;
}

/**
* LogRecordProcessor that applies severity- and trace-based filtering before
* delegating to another processor.
*/
export class FilteringLogRecordProcessor implements LogRecordProcessor {
private readonly _minimumSeverity: SeverityNumber;
private readonly _traceBased: boolean;

constructor(
private readonly _delegate: LogRecordProcessor,
config: FilteringLogRecordProcessorConfig = {}
) {
this._minimumSeverity =
config.minimumSeverity ?? SeverityNumber.UNSPECIFIED;
this._traceBased = config.traceBased ?? false;
}

forceFlush(): Promise<void> {
return this._delegate.forceFlush();
}

shutdown(): Promise<void> {
return this._delegate.shutdown();
}

onEmit(logRecord: SdkLogRecord, context?: Context): void {
const severity = logRecord.severityNumber ?? SeverityNumber.UNSPECIFIED;
if (
severity !== SeverityNumber.UNSPECIFIED &&
severity < this._minimumSeverity
) {
return;
}

if (this._traceBased) {
const spanContext =
logRecord.spanContext ??
(context ? trace.getSpanContext(context) : undefined);

if (spanContext && isSpanContextValid(spanContext)) {
const isSampled =
(spanContext.traceFlags & TraceFlags.SAMPLED) === TraceFlags.SAMPLED;
if (!isSampled) {
return;
}
}
}

this._delegate.onEmit(logRecord, context);
}
}
4 changes: 4 additions & 0 deletions experimental/packages/sdk-logs/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,7 @@ export type { LogRecordExporter } from './export/LogRecordExporter';
export { SimpleLogRecordProcessor } from './export/SimpleLogRecordProcessor';
export { InMemoryLogRecordExporter } from './export/InMemoryLogRecordExporter';
export { BatchLogRecordProcessor } from './platform';
export {
FilteringLogRecordProcessor,
type FilteringLogRecordProcessorConfig,
} from './export/FilteringLogRecordProcessor';
Loading