Skip to content
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

chore: env vars for span limit as per specification #1653

Merged
Merged
Show file tree
Hide file tree
Changes from 2 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
20 changes: 18 additions & 2 deletions packages/opentelemetry-core/src/utils/environment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,16 @@ export interface ENVIRONMENT {
OTEL_LOG_LEVEL?: LogLevel;
OTEL_NO_PATCH_MODULES?: string;
OTEL_SAMPLING_PROBABILITY?: number;
OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT?: number;
OTEL_SPAN_EVENT_COUNT_LIMIT?: number;
OTEL_SPAN_LINK_COUNT_LIMIT?: number;
}

const ENVIRONMENT_NUMBERS: Partial<keyof ENVIRONMENT>[] = [
'OTEL_SAMPLING_PROBABILITY',
'OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT',
'OTEL_SPAN_EVENT_COUNT_LIMIT',
'OTEL_SPAN_LINK_COUNT_LIMIT',
];

/**
Expand All @@ -38,6 +44,9 @@ export const DEFAULT_ENVIRONMENT: Required<ENVIRONMENT> = {
OTEL_NO_PATCH_MODULES: '',
OTEL_LOG_LEVEL: LogLevel.INFO,
OTEL_SAMPLING_PROBABILITY: 1,
OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT: 1000,
OTEL_SPAN_EVENT_COUNT_LIMIT: 1000,
OTEL_SPAN_LINK_COUNT_LIMIT: 1000,
};

/**
Expand All @@ -57,8 +66,15 @@ function parseNumber(
) {
if (typeof values[name] !== 'undefined') {
const value = Number(values[name] as string);
if (!isNaN(value) && value >= min && value <= max) {
environment[name] = value;

if (!isNaN(value)) {
if (value < min) {
environment[name] = min;
} else if (value > max) {
environment[name] = max;
} else {
environment[name] = value;
}
}
}
}
Expand Down
20 changes: 20 additions & 0 deletions packages/opentelemetry-core/test/utils/environment.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,31 @@ describe('environment', () => {
OTEL_NO_PATCH_MODULES: 'a,b,c',
OTEL_LOG_LEVEL: 'ERROR',
OTEL_SAMPLING_PROBABILITY: '0.5',
OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT: 10,
OTEL_SPAN_EVENT_COUNT_LIMIT: 20,
OTEL_SPAN_LINK_COUNT_LIMIT: 30,
});
const env = getEnv();
assert.strictEqual(env.OTEL_NO_PATCH_MODULES, 'a,b,c');
assert.strictEqual(env.OTEL_LOG_LEVEL, LogLevel.ERROR);
assert.strictEqual(env.OTEL_SAMPLING_PROBABILITY, 0.5);
assert.strictEqual(env.OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT, 10);
assert.strictEqual(env.OTEL_SPAN_EVENT_COUNT_LIMIT, 20);
assert.strictEqual(env.OTEL_SPAN_LINK_COUNT_LIMIT, 30);
});

it('should match invalid values to closest valid equivalent', () => {
mockEnvironment({
OTEL_SAMPLING_PROBABILITY: '-0.1',
});
const minEnv = getEnv();
assert.strictEqual(minEnv.OTEL_SAMPLING_PROBABILITY, 0);

mockEnvironment({
OTEL_SAMPLING_PROBABILITY: '1.1',
});
const maxEnv = getEnv();
assert.strictEqual(maxEnv.OTEL_SAMPLING_PROBABILITY, 1);
});

it('should parse OTEL_LOG_LEVEL despite casing', () => {
Expand Down
13 changes: 3 additions & 10 deletions packages/opentelemetry-tracing/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,6 @@

import { AlwaysOnSampler, getEnv } from '@opentelemetry/core';

/** Default limit for Message events per span */
export const DEFAULT_MAX_EVENTS_PER_SPAN = 128;
/** Default limit for Attributes per span */
export const DEFAULT_MAX_ATTRIBUTES_PER_SPAN = 32;
/** Default limit for Links per span */
export const DEFAULT_MAX_LINKS_PER_SPAN = 32;

/**
* Default configuration. For fields with primitive values, any user-provided
* value will override the corresponding default value. For fields with
Expand All @@ -33,9 +26,9 @@ export const DEFAULT_CONFIG = {
logLevel: getEnv().OTEL_LOG_LEVEL,
sampler: new AlwaysOnSampler(),
traceParams: {
numberOfAttributesPerSpan: DEFAULT_MAX_ATTRIBUTES_PER_SPAN,
numberOfLinksPerSpan: DEFAULT_MAX_LINKS_PER_SPAN,
numberOfEventsPerSpan: DEFAULT_MAX_EVENTS_PER_SPAN,
numberOfAttributesPerSpan: getEnv().OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT,
numberOfLinksPerSpan: getEnv().OTEL_SPAN_LINK_COUNT_LIMIT,
numberOfEventsPerSpan: getEnv().OTEL_SPAN_EVENT_COUNT_LIMIT,
},
gracefulShutdown: true,
};
24 changes: 8 additions & 16 deletions packages/opentelemetry-tracing/src/utility.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,7 @@
* limitations under the License.
*/

import {
DEFAULT_CONFIG,
DEFAULT_MAX_ATTRIBUTES_PER_SPAN,
DEFAULT_MAX_EVENTS_PER_SPAN,
DEFAULT_MAX_LINKS_PER_SPAN,
} from './config';
import { DEFAULT_CONFIG } from './config';
import { TracerConfig } from './types';
import {
ParentBasedSampler,
Expand All @@ -32,10 +27,10 @@ import {
* user provided configurations.
*/
export function mergeConfig(userConfig: TracerConfig) {
const traceParams = userConfig.traceParams;
const otelSamplingProbability = getEnv().OTEL_SAMPLING_PROBABILITY;

const target = Object.assign(
{},
DEFAULT_CONFIG,
// use default AlwaysOnSampler if otelSamplingProbability is 1
otelSamplingProbability !== undefined && otelSamplingProbability < 1
Expand All @@ -48,14 +43,11 @@ export function mergeConfig(userConfig: TracerConfig) {
userConfig
);

// the user-provided value will be used to extend the default value.
if (traceParams) {
target.traceParams.numberOfAttributesPerSpan =
traceParams.numberOfAttributesPerSpan || DEFAULT_MAX_ATTRIBUTES_PER_SPAN;
target.traceParams.numberOfEventsPerSpan =
traceParams.numberOfEventsPerSpan || DEFAULT_MAX_EVENTS_PER_SPAN;
target.traceParams.numberOfLinksPerSpan =
traceParams.numberOfLinksPerSpan || DEFAULT_MAX_LINKS_PER_SPAN;
}
target.traceParams = Object.assign(
{},
DEFAULT_CONFIG.traceParams,
userConfig.traceParams || {}
);

return target;
}
18 changes: 9 additions & 9 deletions packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,9 @@ describe('BasicTracerProvider', () => {
it('should construct an instance with default trace params', () => {
const tracer = new BasicTracerProvider({}).getTracer('default');
assert.deepStrictEqual(tracer.getActiveTraceParams(), {
numberOfAttributesPerSpan: 32,
numberOfEventsPerSpan: 128,
numberOfLinksPerSpan: 32,
numberOfAttributesPerSpan: 1000,
numberOfEventsPerSpan: 1000,
numberOfLinksPerSpan: 1000,
});
});

Expand All @@ -89,8 +89,8 @@ describe('BasicTracerProvider', () => {
}).getTracer('default');
assert.deepStrictEqual(tracer.getActiveTraceParams(), {
numberOfAttributesPerSpan: 100,
numberOfEventsPerSpan: 128,
numberOfLinksPerSpan: 32,
numberOfEventsPerSpan: 1000,
numberOfLinksPerSpan: 1000,
});
});

Expand All @@ -101,9 +101,9 @@ describe('BasicTracerProvider', () => {
},
}).getTracer('default');
assert.deepStrictEqual(tracer.getActiveTraceParams(), {
numberOfAttributesPerSpan: 32,
numberOfAttributesPerSpan: 1000,
numberOfEventsPerSpan: 300,
numberOfLinksPerSpan: 32,
numberOfLinksPerSpan: 1000,
});
});

Expand All @@ -114,8 +114,8 @@ describe('BasicTracerProvider', () => {
},
}).getTracer('default');
assert.deepStrictEqual(tracer.getActiveTraceParams(), {
numberOfAttributesPerSpan: 32,
numberOfEventsPerSpan: 128,
numberOfAttributesPerSpan: 1000,
numberOfEventsPerSpan: 1000,
numberOfLinksPerSpan: 10,
});
});
Expand Down
10 changes: 7 additions & 3 deletions packages/opentelemetry-tracing/test/Span.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ const performanceTimeOrigin = hrTime();
describe('Span', () => {
const tracer = new BasicTracerProvider({
logger: new NoopLogger(),
traceParams: {
numberOfAttributesPerSpan: 100,
numberOfEventsPerSpan: 100,
},
}).getTracer('default');
const name = 'span1';
const spanContext: SpanContext = {
Expand Down Expand Up @@ -327,7 +331,7 @@ describe('Span', () => {
span.end();
});

it('should drop extra links, attributes and events', () => {
it('should drop extra attributes and events', () => {
const span = new Span(
tracer,
ROOT_CONTEXT,
Expand All @@ -341,8 +345,8 @@ describe('Span', () => {
}
span.end();

assert.strictEqual(span.events.length, 128);
assert.strictEqual(Object.keys(span.attributes).length, 32);
assert.strictEqual(span.events.length, 100);
assert.strictEqual(Object.keys(span.attributes).length, 100);
assert.strictEqual(span.events[span.events.length - 1].name, 'sent149');
assert.strictEqual(span.attributes['foo0'], undefined);
assert.strictEqual(span.attributes['foo149'], 'bar149');
Expand Down