Advanced Configuration
This guide covers advanced configuration options for OpenTelemetry in Clean Stack.
Custom Sampling
Clean Stack supports custom sampling strategies for traces:
const sampler = new ParentBasedSampler({
  root: new TraceIdRatioBased(0.1), // Sample 10% of traces
});
sdk.setGlobalTracerProvider(
  new NodeTracerProvider({
    sampler,
    resource: createResource(),
  })
);
Batch Processor Configuration
Customize the batch processor settings for better performance:
const spanProcessor = new BatchSpanProcessor(exporter, {
  maxQueueSize: 2048,
  scheduledDelayMillis: 5000,
  maxExportBatchSize: 512,
});
Custom Attributes
Add custom attributes to all spans and metrics:
const resource = Resource.default().merge(
  new Resource({
    'service.name': 'my-service',
    'deployment.environment': process.env.NODE_ENV,
    'custom.attribute': 'value',
  })
);
Manual Instrumentation
For custom business logic:
const tracer = trace.getTracer('my-custom-tracer');
tracer.startActiveSpan('operation-name', span => {
  span.setAttribute('custom.attribute', 'value');
  try {
    // Your code here
  } finally {
    span.end();
  }
});
Context Propagation
Configure custom context propagation:
const propagator = new CompositePropagator({
  propagators: [
    new W3CTraceContextPropagator(),
    new B3Propagator(),
    new JaegerPropagator(),
  ],
});
propagation.setGlobalPropagator(propagator);
Custom Metrics
Define and record custom metrics:
const meter = metrics.getMeter('my-custom-metrics');
const requestCounter = meter.createCounter('requests', {
  description: 'Count of requests',
});
const requestDuration = meter.createHistogram('request_duration', {
  description: 'Duration of requests',
  unit: 'ms',
});
Error Handling
Configure error handling for exporters:
exporter.on('error', (error) => {
  console.error('Exporter error:', error);
  // Custom error handling logic
});
For more information about exporters, see the Exporters guide.