JSPM

  • Created
  • Published
  • Downloads 2001
  • Score
    100M100P100Q131675F
  • License ISC

Diagnostics library for Node.js applications

Package Exports

  • @vtex/diagnostics-nodejs
  • @vtex/diagnostics-nodejs/dist/config/ExporterConfig.d.ts
  • @vtex/diagnostics-nodejs/dist/config/ExporterConfig.d.ts.map
  • @vtex/diagnostics-nodejs/dist/config/ExporterConfig.js
  • @vtex/diagnostics-nodejs/dist/config/ExporterConfig.js.map
  • @vtex/diagnostics-nodejs/dist/config/index.d.ts
  • @vtex/diagnostics-nodejs/dist/config/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/config/index.js
  • @vtex/diagnostics-nodejs/dist/config/index.js.map
  • @vtex/diagnostics-nodejs/dist/config/manager.d.ts
  • @vtex/diagnostics-nodejs/dist/config/manager.d.ts.map
  • @vtex/diagnostics-nodejs/dist/config/manager.js
  • @vtex/diagnostics-nodejs/dist/config/manager.js.map
  • @vtex/diagnostics-nodejs/dist/config/providers/file.d.ts
  • @vtex/diagnostics-nodejs/dist/config/providers/file.d.ts.map
  • @vtex/diagnostics-nodejs/dist/config/providers/file.js
  • @vtex/diagnostics-nodejs/dist/config/providers/file.js.map
  • @vtex/diagnostics-nodejs/dist/config/providers/s3.d.ts
  • @vtex/diagnostics-nodejs/dist/config/providers/s3.d.ts.map
  • @vtex/diagnostics-nodejs/dist/config/providers/s3.js
  • @vtex/diagnostics-nodejs/dist/config/providers/s3.js.map
  • @vtex/diagnostics-nodejs/dist/discovery/index.d.ts
  • @vtex/diagnostics-nodejs/dist/discovery/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/discovery/index.js
  • @vtex/diagnostics-nodejs/dist/discovery/index.js.map
  • @vtex/diagnostics-nodejs/dist/discovery/resource-discovery.d.ts
  • @vtex/diagnostics-nodejs/dist/discovery/resource-discovery.d.ts.map
  • @vtex/diagnostics-nodejs/dist/discovery/resource-discovery.js
  • @vtex/diagnostics-nodejs/dist/discovery/resource-discovery.js.map
  • @vtex/diagnostics-nodejs/dist/exporters/index.d.ts
  • @vtex/diagnostics-nodejs/dist/exporters/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/exporters/index.js
  • @vtex/diagnostics-nodejs/dist/exporters/index.js.map
  • @vtex/diagnostics-nodejs/dist/exporters/interface.d.ts
  • @vtex/diagnostics-nodejs/dist/exporters/interface.d.ts.map
  • @vtex/diagnostics-nodejs/dist/exporters/interface.js
  • @vtex/diagnostics-nodejs/dist/exporters/interface.js.map
  • @vtex/diagnostics-nodejs/dist/exporters/otlp.d.ts
  • @vtex/diagnostics-nodejs/dist/exporters/otlp.d.ts.map
  • @vtex/diagnostics-nodejs/dist/exporters/otlp.js
  • @vtex/diagnostics-nodejs/dist/exporters/otlp.js.map
  • @vtex/diagnostics-nodejs/dist/exporters/stdout.d.ts
  • @vtex/diagnostics-nodejs/dist/exporters/stdout.d.ts.map
  • @vtex/diagnostics-nodejs/dist/exporters/stdout.js
  • @vtex/diagnostics-nodejs/dist/exporters/stdout.js.map
  • @vtex/diagnostics-nodejs/dist/index.d.ts
  • @vtex/diagnostics-nodejs/dist/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/index.js
  • @vtex/diagnostics-nodejs/dist/index.js.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/index.d.ts
  • @vtex/diagnostics-nodejs/dist/instrumentation/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/index.js
  • @vtex/diagnostics-nodejs/dist/instrumentation/index.js.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/core.d.ts
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/core.d.ts.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/core.js
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/core.js.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/express.d.ts
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/express.d.ts.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/express.js
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/express.js.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/fastify.d.ts
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/fastify.d.ts.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/fastify.js
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/fastify.js.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/index.d.ts
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/index.js
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/index.js.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/koa.d.ts
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/koa.d.ts.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/koa.js
  • @vtex/diagnostics-nodejs/dist/instrumentation/middlewares/koa.js.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/propagation/index.d.ts
  • @vtex/diagnostics-nodejs/dist/instrumentation/propagation/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/instrumentation/propagation/index.js
  • @vtex/diagnostics-nodejs/dist/instrumentation/propagation/index.js.map
  • @vtex/diagnostics-nodejs/dist/logs/client.d.ts
  • @vtex/diagnostics-nodejs/dist/logs/client.d.ts.map
  • @vtex/diagnostics-nodejs/dist/logs/client.js
  • @vtex/diagnostics-nodejs/dist/logs/client.js.map
  • @vtex/diagnostics-nodejs/dist/logs/index.d.ts
  • @vtex/diagnostics-nodejs/dist/logs/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/logs/index.js
  • @vtex/diagnostics-nodejs/dist/logs/index.js.map
  • @vtex/diagnostics-nodejs/dist/metrics/client.d.ts
  • @vtex/diagnostics-nodejs/dist/metrics/client.d.ts.map
  • @vtex/diagnostics-nodejs/dist/metrics/client.js
  • @vtex/diagnostics-nodejs/dist/metrics/client.js.map
  • @vtex/diagnostics-nodejs/dist/metrics/counter.d.ts
  • @vtex/diagnostics-nodejs/dist/metrics/counter.d.ts.map
  • @vtex/diagnostics-nodejs/dist/metrics/counter.js
  • @vtex/diagnostics-nodejs/dist/metrics/counter.js.map
  • @vtex/diagnostics-nodejs/dist/metrics/gauge.d.ts
  • @vtex/diagnostics-nodejs/dist/metrics/gauge.d.ts.map
  • @vtex/diagnostics-nodejs/dist/metrics/gauge.js
  • @vtex/diagnostics-nodejs/dist/metrics/gauge.js.map
  • @vtex/diagnostics-nodejs/dist/metrics/histogram.d.ts
  • @vtex/diagnostics-nodejs/dist/metrics/histogram.d.ts.map
  • @vtex/diagnostics-nodejs/dist/metrics/histogram.js
  • @vtex/diagnostics-nodejs/dist/metrics/histogram.js.map
  • @vtex/diagnostics-nodejs/dist/metrics/index.d.ts
  • @vtex/diagnostics-nodejs/dist/metrics/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/metrics/index.js
  • @vtex/diagnostics-nodejs/dist/metrics/index.js.map
  • @vtex/diagnostics-nodejs/dist/metrics/options.d.ts
  • @vtex/diagnostics-nodejs/dist/metrics/options.d.ts.map
  • @vtex/diagnostics-nodejs/dist/metrics/options.js
  • @vtex/diagnostics-nodejs/dist/metrics/options.js.map
  • @vtex/diagnostics-nodejs/dist/metrics/readers.d.ts
  • @vtex/diagnostics-nodejs/dist/metrics/readers.d.ts.map
  • @vtex/diagnostics-nodejs/dist/metrics/readers.js
  • @vtex/diagnostics-nodejs/dist/metrics/readers.js.map
  • @vtex/diagnostics-nodejs/dist/metrics/views.d.ts
  • @vtex/diagnostics-nodejs/dist/metrics/views.d.ts.map
  • @vtex/diagnostics-nodejs/dist/metrics/views.js
  • @vtex/diagnostics-nodejs/dist/metrics/views.js.map
  • @vtex/diagnostics-nodejs/dist/processors/index.d.ts
  • @vtex/diagnostics-nodejs/dist/processors/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/processors/index.js
  • @vtex/diagnostics-nodejs/dist/processors/index.js.map
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/constants.d.ts
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/constants.d.ts.map
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/constants.js
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/constants.js.map
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/index.d.ts
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/index.js
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/index.js.map
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/log-processor.d.ts
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/log-processor.d.ts.map
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/log-processor.js
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/log-processor.js.map
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/span-processor.d.ts
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/span-processor.d.ts.map
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/span-processor.js
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/span-processor.js.map
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/utils.d.ts
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/utils.d.ts.map
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/utils.js
  • @vtex/diagnostics-nodejs/dist/processors/vtexattrs/utils.js.map
  • @vtex/diagnostics-nodejs/dist/providers/account/configurable.d.ts
  • @vtex/diagnostics-nodejs/dist/providers/account/configurable.d.ts.map
  • @vtex/diagnostics-nodejs/dist/providers/account/configurable.js
  • @vtex/diagnostics-nodejs/dist/providers/account/configurable.js.map
  • @vtex/diagnostics-nodejs/dist/providers/account/file-source.d.ts
  • @vtex/diagnostics-nodejs/dist/providers/account/file-source.d.ts.map
  • @vtex/diagnostics-nodejs/dist/providers/account/file-source.js
  • @vtex/diagnostics-nodejs/dist/providers/account/file-source.js.map
  • @vtex/diagnostics-nodejs/dist/providers/account/index.d.ts
  • @vtex/diagnostics-nodejs/dist/providers/account/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/providers/account/index.js
  • @vtex/diagnostics-nodejs/dist/providers/account/index.js.map
  • @vtex/diagnostics-nodejs/dist/providers/account/provider.d.ts
  • @vtex/diagnostics-nodejs/dist/providers/account/provider.d.ts.map
  • @vtex/diagnostics-nodejs/dist/providers/account/provider.js
  • @vtex/diagnostics-nodejs/dist/providers/account/provider.js.map
  • @vtex/diagnostics-nodejs/dist/providers/account/static.d.ts
  • @vtex/diagnostics-nodejs/dist/providers/account/static.d.ts.map
  • @vtex/diagnostics-nodejs/dist/providers/account/static.js
  • @vtex/diagnostics-nodejs/dist/providers/account/static.js.map
  • @vtex/diagnostics-nodejs/dist/providers/index.d.ts
  • @vtex/diagnostics-nodejs/dist/providers/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/providers/index.js
  • @vtex/diagnostics-nodejs/dist/providers/index.js.map
  • @vtex/diagnostics-nodejs/dist/samplers/index.d.ts
  • @vtex/diagnostics-nodejs/dist/samplers/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/samplers/index.js
  • @vtex/diagnostics-nodejs/dist/samplers/index.js.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/composed.d.ts
  • @vtex/diagnostics-nodejs/dist/samplers/traces/composed.d.ts.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/composed.js
  • @vtex/diagnostics-nodejs/dist/samplers/traces/composed.js.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/configurable.d.ts
  • @vtex/diagnostics-nodejs/dist/samplers/traces/configurable.d.ts.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/configurable.js
  • @vtex/diagnostics-nodejs/dist/samplers/traces/configurable.js.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/debug.d.ts
  • @vtex/diagnostics-nodejs/dist/samplers/traces/debug.d.ts.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/debug.js
  • @vtex/diagnostics-nodejs/dist/samplers/traces/debug.js.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/index.d.ts
  • @vtex/diagnostics-nodejs/dist/samplers/traces/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/index.js
  • @vtex/diagnostics-nodejs/dist/samplers/traces/index.js.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/metadata.d.ts
  • @vtex/diagnostics-nodejs/dist/samplers/traces/metadata.d.ts.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/metadata.js
  • @vtex/diagnostics-nodejs/dist/samplers/traces/metadata.js.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/vtex-account.d.ts
  • @vtex/diagnostics-nodejs/dist/samplers/traces/vtex-account.d.ts.map
  • @vtex/diagnostics-nodejs/dist/samplers/traces/vtex-account.js
  • @vtex/diagnostics-nodejs/dist/samplers/traces/vtex-account.js.map
  • @vtex/diagnostics-nodejs/dist/telemetry/client.d.ts
  • @vtex/diagnostics-nodejs/dist/telemetry/client.d.ts.map
  • @vtex/diagnostics-nodejs/dist/telemetry/client.js
  • @vtex/diagnostics-nodejs/dist/telemetry/client.js.map
  • @vtex/diagnostics-nodejs/dist/telemetry/index.d.ts
  • @vtex/diagnostics-nodejs/dist/telemetry/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/telemetry/index.js
  • @vtex/diagnostics-nodejs/dist/telemetry/index.js.map
  • @vtex/diagnostics-nodejs/dist/traces/baggage.d.ts
  • @vtex/diagnostics-nodejs/dist/traces/baggage.d.ts.map
  • @vtex/diagnostics-nodejs/dist/traces/baggage.js
  • @vtex/diagnostics-nodejs/dist/traces/baggage.js.map
  • @vtex/diagnostics-nodejs/dist/traces/client.d.ts
  • @vtex/diagnostics-nodejs/dist/traces/client.d.ts.map
  • @vtex/diagnostics-nodejs/dist/traces/client.js
  • @vtex/diagnostics-nodejs/dist/traces/client.js.map
  • @vtex/diagnostics-nodejs/dist/traces/config.d.ts
  • @vtex/diagnostics-nodejs/dist/traces/config.d.ts.map
  • @vtex/diagnostics-nodejs/dist/traces/config.js
  • @vtex/diagnostics-nodejs/dist/traces/config.js.map
  • @vtex/diagnostics-nodejs/dist/traces/index.d.ts
  • @vtex/diagnostics-nodejs/dist/traces/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/traces/index.js
  • @vtex/diagnostics-nodejs/dist/traces/index.js.map
  • @vtex/diagnostics-nodejs/dist/traces/span.d.ts
  • @vtex/diagnostics-nodejs/dist/traces/span.d.ts.map
  • @vtex/diagnostics-nodejs/dist/traces/span.js
  • @vtex/diagnostics-nodejs/dist/traces/span.js.map
  • @vtex/diagnostics-nodejs/dist/traces/tracer.d.ts
  • @vtex/diagnostics-nodejs/dist/traces/tracer.d.ts.map
  • @vtex/diagnostics-nodejs/dist/traces/tracer.js
  • @vtex/diagnostics-nodejs/dist/traces/tracer.js.map
  • @vtex/diagnostics-nodejs/dist/types/common.d.ts
  • @vtex/diagnostics-nodejs/dist/types/common.d.ts.map
  • @vtex/diagnostics-nodejs/dist/types/common.js
  • @vtex/diagnostics-nodejs/dist/types/common.js.map
  • @vtex/diagnostics-nodejs/dist/types/config.d.ts
  • @vtex/diagnostics-nodejs/dist/types/config.d.ts.map
  • @vtex/diagnostics-nodejs/dist/types/config.js
  • @vtex/diagnostics-nodejs/dist/types/config.js.map
  • @vtex/diagnostics-nodejs/dist/types/exporters.d.ts
  • @vtex/diagnostics-nodejs/dist/types/exporters.d.ts.map
  • @vtex/diagnostics-nodejs/dist/types/exporters.js
  • @vtex/diagnostics-nodejs/dist/types/exporters.js.map
  • @vtex/diagnostics-nodejs/dist/types/index.d.ts
  • @vtex/diagnostics-nodejs/dist/types/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/types/index.js
  • @vtex/diagnostics-nodejs/dist/types/index.js.map
  • @vtex/diagnostics-nodejs/dist/types/logs.d.ts
  • @vtex/diagnostics-nodejs/dist/types/logs.d.ts.map
  • @vtex/diagnostics-nodejs/dist/types/logs.js
  • @vtex/diagnostics-nodejs/dist/types/logs.js.map
  • @vtex/diagnostics-nodejs/dist/types/metrics.d.ts
  • @vtex/diagnostics-nodejs/dist/types/metrics.d.ts.map
  • @vtex/diagnostics-nodejs/dist/types/metrics.js
  • @vtex/diagnostics-nodejs/dist/types/metrics.js.map
  • @vtex/diagnostics-nodejs/dist/types/sampling.d.ts
  • @vtex/diagnostics-nodejs/dist/types/sampling.d.ts.map
  • @vtex/diagnostics-nodejs/dist/types/sampling.js
  • @vtex/diagnostics-nodejs/dist/types/sampling.js.map
  • @vtex/diagnostics-nodejs/dist/types/telemetry.d.ts
  • @vtex/diagnostics-nodejs/dist/types/telemetry.d.ts.map
  • @vtex/diagnostics-nodejs/dist/types/telemetry.js
  • @vtex/diagnostics-nodejs/dist/types/telemetry.js.map
  • @vtex/diagnostics-nodejs/dist/types/traces.d.ts
  • @vtex/diagnostics-nodejs/dist/types/traces.d.ts.map
  • @vtex/diagnostics-nodejs/dist/types/traces.js
  • @vtex/diagnostics-nodejs/dist/types/traces.js.map
  • @vtex/diagnostics-nodejs/dist/utils/index.d.ts
  • @vtex/diagnostics-nodejs/dist/utils/index.d.ts.map
  • @vtex/diagnostics-nodejs/dist/utils/index.js
  • @vtex/diagnostics-nodejs/dist/utils/index.js.map
  • @vtex/diagnostics-nodejs/dist/utils/utils.d.ts
  • @vtex/diagnostics-nodejs/dist/utils/utils.d.ts.map
  • @vtex/diagnostics-nodejs/dist/utils/utils.js
  • @vtex/diagnostics-nodejs/dist/utils/utils.js.map

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@vtex/diagnostics-nodejs) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

OpenTelemetry Diagnostics Library for Node.js

A comprehensive Node.js library that simplifies telemetry collection using OpenTelemetry, providing unified interfaces for metrics, logs, and traces with advanced sampling, hot-reload configuration, and easy-to-use instrumentation setups for popular frameworks.

Features

Unified Telemetry: Metrics, logs, and traces in one library
Auto-Instrumentation: Express, Fastify, Koa, NestJS support
Advanced Sampling: Rule-based, parent-based, debug override, hot-reload
Remote Configuration: File-based, S3, with live reload and polling
Configuration Override: Runtime config updates and hot-swapping
Resource Discovery: Automatic cloud and Kubernetes detection
Context Propagation: Baggage and trace context across services
Custom Processors: VTEX-specific attribute enrichment
Distributed Resampling: Override parent sampling decisions
gRPC Export: High-performance OTLP export

Installation

npm install @vtex/diagnostics-nodejs

Quick Start

import { NewTelemetryClient, Instrumentation } from '@vtex/diagnostics-nodejs';

async function main() {
  // 1. Define your instrumentations
  const instrumentations = Instrumentation.CommonInstrumentations.express();

  // 2. Initialize telemetry client BEFORE importing frameworks
  const telemetryClient = await NewTelemetryClient(
    'my-app-id',           // Application ID
    'my-client-instance',  // Client instance name  
    'my-service-name'      // Service name
  );

  // 3. Create telemetry clients
  const tracesClient = await telemetryClient.newTracesClient({
    setGlobalProvider: true,
  });
  const metricsClient = await telemetryClient.newMetricsClient();
  const logsClient = await telemetryClient.newLogsClient();

  // 4. Register the instrumentations. This activates them.
  telemetryClient.registerInstrumentations(instrumentations);
  
  // 5. NOW import your frameworks
  const express = require('express');
  const app = express();
  
  // Your app is automatically instrumented!
  app.get('/api/users', (req, res) => {
    logsClient.info('Users endpoint called', { userId: req.query.id });
    res.json({ users: [] });
  });

  app.listen(3000);
}

main().catch(console.error);

Remote Configuration Management

File-Based Configuration with Hot Reload

const telemetryClient = await NewTelemetryClient(
  'my-app-id',
  'my-client', 
  'my-service',
  {
    config: {
      configPath: './config/telemetry.json',
      enableHotReload: true,           // Enable live reload
      pollIntervalMs: 15000           // Check for changes every 15s
    }
  }
);

// Config changes are automatically applied without restart!
// Watch logs for: "🔄 Hot reloading sampling configuration..."

S3-Based Remote Configuration

const telemetryClient = await NewTelemetryClient(
  'my-app', 'my-client', 'my-service',
  {
    config: {
      s3Config: {
        bucket: 'my-telemetry-configs',
        key: 'environments/prod/my-service.json',
        region: 'us-east-1'
      },
      pollIntervalMs: 30000,          // Poll S3 every 30s
      enableHotReload: true
    }
  }
);

// Centralized config management:
// 1. Update config in S3
// 2. All instances pick up changes automatically
// 3. No service restarts required

Configuration Override at Runtime

// The ConfigManager is an internal component and not exposed via a public `getConfigManager()` method.
// Configuration updates are handled automatically via file/S3 polling when `enableHotReload` is true.
// The `onConfigChange` functionality would require implementing a custom configuration provider.

console.log('Configuration from file/S3 will be hot-reloaded automatically if enabled.');

Environment-Specific Configuration

// Base configuration
const telemetryClient = await NewTelemetryClient(
  'my-app', 'my-client', 'my-service',
  {
    config: {
      configPath: `./config/${process.env.NODE_ENV || 'development'}.json`,
      enableHotReload: process.env.NODE_ENV !== 'production'
    },
    
    // Override config based on environment
    environment: process.env.DEPLOYMENT_ENV,
    region: process.env.AWS_REGION,
    
    // Additional runtime attributes
    additionalAttrs: {
      'deployment.version': process.env.GIT_SHA,
      'deployment.timestamp': new Date().toISOString()
    }
  }
);

Using Configuration Files

const telemetryClient = await NewTelemetryClient(
  'my-app',
  'my-client', 
  'my-service',
  {
    config: {
      configPath: './config/telemetry.json',
      enableHotReload: true,
      pollIntervalMs: 15000
    }
  }
);

Configuration Override Examples

// Development: High sampling for debugging
// config/development.json
{
  "traces": {
    "sampling": {
      "defaultRate": 1.0,
      "rules": [
        {
          "name": "debug_everything",
          "sampleRate": 1.0,
          "conditions": []
        }
      ]
    }
  }
}
```json
// Production: Selective sampling
// config/production.json  
{
  "traces": {
    "sampling": {
      "defaultRate": 0.01,
      "rules": [
        {
          "name": "critical_endpoints",
          "sampleRate": 1.0,
          "conditions": [
            {
              "attribute": "http.target",
              "operator": "Regex",
              "value": "^/api/(checkout|payment|auth)"
            }
          ]
        },
        {
          "name": "error_traces",
          "sampleRate": 1.0,
          "conditions": [
            {
              "attribute": "http.status_code",
              "operator": "GreaterThanEqual", 
              "value": "400"
            }
          ]
        }
      ]
    }
  }
}

Live Configuration Updates

// Monitor configuration changes in real-time
const telemetryClient = await NewTelemetryClient('app', 'client', 'service', {
  config: { enableHotReload: true }
});

// Define instrumentations
const instrumentations = Instrumentation.CommonInstrumentations.autoDetect();

// Initialize clients
const tracesClient = await telemetryClient.newTracesClient();

// Register instrumentations
telemetryClient.registerInstrumentations(instrumentations);

// Example: Change sampling rules via file edit
// 1. Edit config/telemetry.json
// 2. Change defaultRate from 0.1 to 0.5  
// 3. Save file
// 4. Library automatically detects change
// 5. New sampling rules applied within seconds
// 6. See logs: "🔄 Hot reloading sampling configuration..."

console.log('Config will auto-reload from file changes...');

Conditional Configuration Loading

async function createTelemetryClient() {
  const isProd = process.env.NODE_ENV === 'production';
  const isK8s = !!process.env.KUBERNETES_SERVICE_HOST;
  
  const config = {
    config: {
      // Production: Use S3 remote config
      ...(isProd && {
        s3Config: {
          bucket: 'prod-telemetry-configs',
          key: `services/${process.env.SERVICE_NAME}/config.json`,
          region: process.env.AWS_REGION
        }
      }),
      
      // Development: Use local file
      ...(!isProd && {
        configPath: './config/dev.json'
      }),
      
      enableHotReload: true,
      pollIntervalMs: isProd ? 60000 : 15000  // Slower polling in prod
    },
    
    // Kubernetes-specific attributes
    ...(isK8s && {
      additionalAttrs: {
        'k8s.namespace': process.env.KUBERNETES_NAMESPACE,
        'k8s.pod': process.env.HOSTNAME,
        'k8s.node': process.env.NODE_NAME
      }
    }),
    
    disableCloudDetect: !isProd,
    debug: !isProd
  };
  
  return await NewTelemetryClient('app', 'client', 'service', config);
}

Global vs Service-Specific Configuration

// Hierarchical configuration override
const baseConfig = {
  "globalResourceAttributes": {
    "service.namespace": "ecommerce",
    "deployment.environment": "production"
  },
  "traces": {
    "exporters": {
      "mode": "otlp",
      "otlp": { "endpoint": "otel-collector:4317" }
    },
    "sampling": {
      "parentBased": true,
      "defaultRate": 0.05
    }
  }
};
```json
// Service-specific overrides
const serviceOverrides = {
  "user-service": {
    "traces": {
      "sampling": {
        "defaultRate": 0.1,
        "rules": [
          {
            "name": "auth_endpoints",
            "sampleRate": 1.0,
            "conditions": [
              { "attribute": "http.target", "operator": "StartsWith", "value": "/auth" }
            ]
          }
        ]
      }
    }
  },
  
  "payment-service": {
    "traces": {
      "sampling": {
        "defaultRate": 1.0,
        "parentBased": false
      }
    }
  },
  
  "inventory-service": {
    "traces": {
      "sampling": {
        "parentBased": false,
        "defaultRate": 0.01,
        "rules": [
          {
            "name": "resample_checkout_flow",
            "sampleRate": 1.0,
            "conditions": [
              { "attribute": "http.target", "operator": "Contains", "value": "checkout" }
            ]
          }
        ]
      }
    }
  }
};
```json
{
  "environment": "production",
  "globalResourceAttributes": {
    "service.namespace": "ecommerce",
    "deployment.environment": "prod"
  },
  "traces": {
    "exporters": {
      "mode": "otlp",
      "otlp": { "endpoint": "otel-collector:4317" }
    },
    "sampling": {
      "parentBased": true,
      "defaultRate": 0.1,
      "rules": [
        {
          "name": "sample_critical_endpoints",
          "sampleRate": 1.0,
          "conditions": [
            {
              "attribute": "http.target",
              "operator": "StartsWith",
              "value": "/api/checkout"
            }
          ]
        },
        {
          "name": "debug_override",
          "sampleRate": 1.0,
          "conditions": [
            {
              "attribute": "debug",
              "operator": "Equals", 
              "value": "true"
            }
          ]
        }
      ]
    }
  }
}

Advanced Sampling

Rule-Based Sampling

Control sampling with flexible rules that support hot-reload:

// Configuration supports multiple operators and conditions
{
  "sampling": {
    "parentBased": true,
    "defaultRate": 0.05,
    "rules": [
      {
        "name": "high_priority_routes",
        "sampleRate": 1.0,
        "conditions": [
          {
            "attribute": "http.method",
            "operator": "Equals",
            "value": "POST"
          },
          {
            "attribute": "http.target", 
            "operator": "Regex",
            "value": "^/api/(orders|payments)"
          }
        ]
      }
    ]
  }
}

Resampling in Distributed Traces

Override parent sampling decisions in specific services:

// Service A: parentBased: true (follows upstream decisions)
// Service B: parentBased: false (makes independent decisions)
{
  "sampling": {
    "parentBased": false,
    "rules": [
      {
        "name": "force_sample_inventory_operations",
        "sampleRate": 1.0,
        "conditions": [...]
      }
    ]
  }
}

Debug Sampling

Force sampling with debug flags:

# Always samples when debug is present
curl "http://api/users?debug=true"
curl -H "debug: true" http://api/users

Supported Sampling Operators

  • Equals, NotEquals
  • Contains, StartsWith, EndsWith
  • In, NotIn (arrays)
  • Regex
  • GreaterThan, LessThan, GreaterThanEqual, LessThanEqual

Instrumentation

Framework Support

// Choose your framework bundle
const instrumentations = {
  express: Instrumentation.CommonInstrumentations.express(),
  fastify: Instrumentation.CommonInstrumentations.fastify(), 
  koa: Instrumentation.CommonInstrumentations.koa(),
  nestjs: Instrumentation.CommonInstrumentations.nestjs(),
  minimal: Instrumentation.CommonInstrumentations.minimal(), // HTTP only
  autoDetect: Instrumentation.CommonInstrumentations.autoDetect()
};

Adding Database & External Service Tracing

import { MongoDBInstrumentation } from '@opentelemetry/instrumentation-mongodb';
import { RedisInstrumentation } from '@opentelemetry/instrumentation-redis';
import { NewTelemetryClient, Instrumentation } from '@vtex/diagnostics-nodejs';

async function setup() {
  // 1. Create a list of all desired instrumentations
  const myInstrumentations = [
    ...Instrumentation.CommonInstrumentations.express(),
    new MongoDBInstrumentation(),
    new RedisInstrumentation(),
    // Add any other OpenTelemetry community instrumentation
  ];

  // 2. Initialize the client
  const telemetryClient = await NewTelemetryClient('app-id', 'client-name', 'service-name');
  await telemetryClient.newTracesClient(); // and other clients

  // 3. Register all instrumentations
  telemetryClient.registerInstrumentations(myInstrumentations);
}

Context Propagation & Baggage

Adding Baggage

import { Traces } from '@vtex/diagnostics-nodejs';

app.get('/api/users', (req, res) => {
  // Add baggage items that propagate to downstream services
  Traces.addBaggage({
    'user.id': req.user.id,
    'request.priority': 'high',
    'trace.source': 'web-app'
  });
  
  // Single baggage item
  Traces.setBaggage('operation.type', 'user-lookup');
  
  // Retrieve baggage
  const baggage = Traces.getActiveBaggage();
  console.log('Current baggage:', baggage);
});

Middleware for Context Propagation

import { Instrumentation } from '@vtex/diagnostics-nodejs';

// Express
app.use(Instrumentation.Middlewares.ContextMiddlewares.Express.ContextPropagationMiddleware());

// Fastify
fastify.register(Instrumentation.Middlewares.ContextMiddlewares.Fastify.createContextPlugin());

// Koa  
app.use(Instrumentation.Middlewares.ContextMiddlewares.Koa.ContextPropagationMiddleware());

Manual Tracing

Creating Custom Spans

const span = tracesClient.startSpan('database-migration', {
  attributes: { 'migration.version': '1.2.0' },
  kind: SpanKind.INTERNAL
});

try {
  span.setAttributes({
    'migration.tables': ['users', 'orders'],
    'migration.duration_estimate': '5min'
  });
  
  span.addEvent('migration-started', { timestamp: Date.now() });
  
  // Your operation
  await runMigration();
  
  span.addEvent('migration-completed');
  
} catch (error) {
  span.recordException(error);
  span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
  throw error;
} finally {
  span.end();
}

Trace Context Injection/Extraction

// Inject trace context into HTTP headers
const headers = {};
tracesClient.inject(headers);
console.log(headers); // { traceparent: "00-...", tracestate: "..." }

// Extract trace context from incoming headers
const context = tracesClient.extract(req.headers);
context.execute(() => {
  // Code executed within the extracted trace context
  logsClient.info('Processing with extracted context');
});

Metrics

Counter Metrics

import { Metrics } from '@vtex/diagnostics-nodejs';

const httpRequestsCounter = metricsClient.createCounter(
  'http_requests_total',
  { 
    description: 'Total HTTP requests processed',
    unit: '1'
  }
);

// Increment counter
httpRequestsCounter.increment({ method: 'GET', status: '200' });
httpRequestsCounter.add(5, { method: 'POST', status: '201' });

Histogram Metrics

const responseTimeHistogram = metricsClient.createHistogram(
  'http_response_time_seconds',
  {
    description: 'HTTP response time distribution',
    unit: 's',
    boundaries: [0.01, 0.05, 0.1, 0.5, 1, 5, 10]
  }
);

responseTimeHistogram.record(0.145, { route: '/api/users', method: 'GET' });

Gauge Metrics

const activeConnectionsGauge = metricsClient.createGauge(
  'active_connections',
  { description: 'Current active database connections' }
);

activeConnectionsGauge.set(42);
activeConnectionsGauge.add(5);    // Increment by 5
activeConnectionsGauge.subtract(2); // Decrement by 2

Structured Logging

Log Levels & Attributes

// Structured logging with attributes
logsClient.info('User login successful', {
  'user.id': '12345',
  'login.method': 'oauth',
  'client.ip': req.ip,
  'vtex.search_index': 'user_events' // Custom attributes
});

logsClient.warn('Rate limit approaching', {
  'rate_limit.current': 95,
  'rate_limit.max': 100,
  'time_window': '1min'
});

logsClient.error('Database query failed', {
  'query.table': 'users',
  'query.duration_ms': 5000,
  'error.type': 'timeout'
});

Log Correlation with Traces

Logs automatically include trace context when created within an active span:

const span = tracesClient.startSpan('process-order');
// Logs will automatically include trace and span IDs
logsClient.info('Processing order', { orderId: '12345' });
span.end();

Resource Discovery

Automatic Attribute Detection

const telemetryClient = await NewTelemetryClient(
  'my-app', 'my-client', 'my-service',
  {
    // Environment variable mappings
    envMappings: [
      { envVar: 'REGION', attributeName: 'cloud.region' },
      { envVar: 'VERSION', attributeName: 'service.version' }
    ],
    
    // Additional static attributes
    additionalAttrs: {
      'service.team': 'platform',
      'service.tier': 'critical'
    },
    
    // Cloud detection
    disableCloudDetect: false,   // Auto-detect AWS/GCP/Azure
    disableK8sDetect: false,     // Auto-detect Kubernetes
    
    // Environment and region
    environment: 'production',
    region: 'us-east-1'
  }
);

Custom Attributes from Files

// Read attributes from JSON file
{
  "customAttributesFile": "./custom-attributes.json"
}
```json
// custom-attributes.json
{
  "environmentVariables": {
    "POD_NAME": "k8s.pod.name",
    "NODE_NAME": "k8s.node.name"
  },
  "attributes": {
    "service.owner": "platform-team",
    "cost.center": "engineering"
  }
}

Export Configuration

OTLP gRPC Export

// Local development (insecure)
const tracesClient = await telemetryClient.newTracesClient({
  exporter: CreateExporter(
    CreateTracesExporterConfig({ 
      endpoint: 'localhost:4317',
      compression: 'gzip',
      timeoutSeconds: 30
    }), 
    'otlp'
  )
});
```javascript
// Production (secure)
const tracesClient = await telemetryClient.newTracesClient({
  exporter: CreateExporter(
    CreateTracesExporterConfig({ 
      endpoint: 'otel-collector.company.com:443',
      compression: 'gzip',
      insecure: false
    }), 
    'otlp'
  )
});

Console Export (Development)

const tracesClient = await telemetryClient.newTracesClient({
  exporter: CreateExporter(
    CreateTracesExporterConfig({ endpoint: 'stdout' }), 
    'stdout'
  )
});

Advanced Configuration

Configuration Providers

// File Provider (local development)
import { ConfigManager, FileConfigProvider } from '@vtex/diagnostics-nodejs';

const configManager = new ConfigManager('my-app', 'my-service', {
  configPath: './config/telemetry.json',
  enableHotReload: true
});
```javascript
// S3 Provider (production)
import { S3ConfigProvider } from '@vtex/diagnostics-nodejs';

const s3Provider = new S3ConfigProvider(
  'telemetry-configs-bucket',
  'services/my-service/config.json', 
  'us-east-1',
  30000  // Poll interval
);
```javascript
// Custom provider implementation
class CustomConfigProvider {
  async load() {
    // Fetch from your custom source (API, database, etc.)
    return {
      traces: {
        sampling: {
          defaultRate: await this.getSamplingRateFromAPI()
        }
      }
    };
  }
  
  onChange(callback) {
    // Subscribe to config changes
    this.webhookSubscriber.on('config-changed', callback);
  }
}

Environment Variable Mappings

const telemetryClient = await NewTelemetryClient(
  'my-app', 'my-client', 'my-service',
  {
    // Map environment variables to resource attributes
    envMappings: [
      { envVar: 'REGION', attributeName: 'cloud.region' },
      { envVar: 'VERSION', attributeName: 'service.version' },
      { envVar: 'TEAM', attributeName: 'service.team' },
      { envVar: 'POD_NAME', attributeName: 'k8s.pod.name' },
      { envVar: 'NODE_NAME', attributeName: 'k8s.node.name' }
    ],
    
    // Prefix-based mapping (maps all TELEMETRY_ATTR_* vars)
    envPrefix: 'TELEMETRY_ATTR_',
    disableEnvPrefixDetection: false,
    
    // Custom attributes file
    customAttributesFile: './custom-attributes.json'
  }
);

// Environment variables automatically mapped:
// REGION=us-east-1 → cloud.region=us-east-1
// VERSION=1.2.3 → service.version=1.2.3
// TELEMETRY_ATTR_COST_CENTER=eng → cost.center=eng
const telemetryClient = await NewTelemetryClient(
  'my-app', 'my-client', 'my-service',
  {
    config: {
      s3Config: {
        bucket: 'my-telemetry-configs',
        key: 'services/my-service/config.json',
        region: 'us-east-1'
      },
      pollIntervalMs: 30000
    }
  }
);

Advanced Features

Configuration Validation & Error Handling

const telemetryClient = await NewTelemetryClient(
  'my-app', 'my-client', 'my-service',
  {
    config: {
      configPath: './config/telemetry.json',
      enableHotReload: true,
      
      // Validation options
      validateConfig: true,
      fallbackToDefaults: true,  // Use defaults if config is invalid
      
      // Error handling
      onConfigError: (error) => {
        console.error('Config error:', error);
        // Send alert, fallback to safe defaults, etc.
      },
      
      onConfigChange: (newConfig, oldConfig) => {
        console.log('Config changed:', {
          oldSamplingRate: oldConfig.traces?.sampling?.defaultRate,
          newSamplingRate: newConfig.traces?.sampling?.defaultRate
        });
      }
    }
  }
);

Feature Flags Integration

// Dynamic feature flags with configuration
{
  "features": {
    "enableAdvancedSampling": true,
    "enableCustomProcessors": true,
    "enableBaggagePropagation": true
  },
  "traces": {
    "sampling": {
      "defaultRate": "{{features.enableAdvancedSampling ? 0.1 : 0.01}}",
      "rules": [
        {
          "name": "feature_flag_sampling",
          "sampleRate": 1.0,
          "enabled": "{{features.enableAdvancedSampling}}",
          "conditions": [
            { "attribute": "feature.flag", "operator": "Equals", "value": "new_checkout" }
          ]
        }
      ]
    }
  }
}

Multi-Environment Configuration

// config/base.json (shared configuration)
{
  "globalResourceAttributes": {
    "service.namespace": "ecommerce"
  },
  "traces": {
    "exporters": {
      "mode": "otlp"
    }
  }
}
```json
// config/production.json (production overrides)
{
  "extends": "./base.json",
  "globalResourceAttributes": {
    "deployment.environment": "production"
  },
  "traces": {
    "exporters": {
      "otlp": { "endpoint": "prod-collector:4317" }
    },
    "sampling": {
      "defaultRate": 0.01
    }
  }
}
```json
// config/development.json (development overrides)
{
  "extends": "./base.json", 
  "globalResourceAttributes": {
    "deployment.environment": "development"
  },
  "traces": {
    "exporters": {
      "otlp": { "endpoint": "localhost:4317" }
    },
    "sampling": {
      "defaultRate": 1.0
    }
  }
}

Circuit Breaker Configuration

// Automatic fallback when OTLP collector is down
{
  "traces": {
    "exporters": {
      "mode": "otlp",
      "otlp": {
        "endpoint": "otel-collector:4317",
        "timeoutMs": 5000,
        "maxRetries": 3
      },
      "fallback": {
        "mode": "console",
        "enabled": true
      }
    },
    "circuitBreaker": {
      "enabled": true,
      "failureThreshold": 5,
      "recoveryTimeMs": 30000
    }
  }
}
import { Processors } from '@vtex/diagnostics-nodejs';

const telemetryClient = await NewTelemetryClient(...);
const tracesClient = await telemetryClient.newTracesClient({
  // VTEX-specific attribute processor (enabled by default)
  enableVtexProcessor: true,
  vtexProcessorConfig: {
    customAttributes: {
      'vtex.workspace': process.env.VTEX_WORKSPACE
    }
  },
  
  // Baggage processor (enabled by default)
  enableBaggageProcessor: true
});

Performance & Resource Management

// Fine-tune performance settings
{
  "traces": {
    "batchTimeoutMs": 5000,
    "maxBatchSize": 512,
    "maxQueueSize": 2048,
    "useSimpleProcessor": false
  },
  "metrics": {
    "exportIntervalMs": 30000,
    "maxMetricsPoints": 1000,
    "cardinalityLimit": 1000
  },
  "logs": {
    "batchTimeoutMs": 1000,
    "maxBatchSize": 100,
    "maxQueueSize": 500
  }
}

Configuration Security

// Secure configuration with encrypted values
{
  "traces": {
    "exporters": {
      "otlp": {
        "endpoint": "{{decrypt:aws-kms:endpoint}}",
        "headers": {
          "authorization": "{{env:OTEL_API_KEY}}"
        }
      }
    }
  },
  "encryption": {
    "provider": "aws-kms",
    "keyId": "arn:aws:kms:us-east-1:123456789:key/12345678"
  }
}
```javascript
// Runtime decryption
const telemetryClient = await NewTelemetryClient(
  'my-app', 'my-client', 'my-service',
  {
    config: {
      configPath: './config/encrypted.json',
      decryptionProvider: new AWSKMSDecryption(),
      enableConfigValidation: true
    }
  }
);

Custom Processors

import { Processors } from '@vtex/diagnostics-nodejs';

const telemetryClient = await NewTelemetryClient(...);
const tracesClient = await telemetryClient.newTracesClient({
  // Built-in VTEX processor (enabled by default)
  enableVtexProcessor: true,
  vtexProcessorConfig: {
    customAttributes: {
      'vtex.workspace': process.env.VTEX_WORKSPACE,
      'vtex.account': process.env.VTEX_ACCOUNT
    }
  },
  
  // Baggage processor (enabled by default)
  enableBaggageProcessor: true,
  
  // Custom span processor
  customProcessors: [
    new MyCustomSpanProcessor({
      addTimestamp: true,
      enrichWithBusinessContext: true
    })
  ]
});
// Before: Manual OpenTelemetry setup
const tracer = trace.getTracer('my-service');
const meter = metrics.getMeter('my-service');

// After: Diagnostics library
const telemetryClient = await NewTelemetryClient('app', 'client', 'service');

const instrumentations = Instrumentation.CommonInstrumentations.autoDetect();
const tracesClient = await telemetryClient.newTracesClient();
const metricsClient = await telemetryClient.newMetricsClient();

telemetryClient.registerInstrumentations(instrumentations);

Troubleshooting

Common Issues

  1. No traces generated: Ensure telemetry client is initialized and instrumentations are registered before importing frameworks.
  2. Sampling not working: Check http.target attribute in rules (not http.route).
  3. Config not reloading: Verify file permissions and polling interval.
  4. gRPC connection failed: Use correct port (4317 for insecure, 443 for TLS).
  5. S3 config not loading: Check AWS credentials and bucket permissions.
  6. High memory usage: Reduce batch sizes and queue limits in the configuration.
  7. Missing baggage: Ensure context propagation middleware is installed and used correctly.

Debug & Monitoring

// Enable comprehensive debugging
const telemetryClient = await NewTelemetryClient(
  'app', 'client', 'service',
  { 
    debug: true,  // OpenTelemetry debug logs
    config: {
      enableHotReload: true,
      onConfigError: (error) => console.error('Config error:', error),
      onConfigChange: (newConfig) => console.log('Config updated:', newConfig)
    }
  }
);

// The ConfigManager is internal and not exposed via a public `getConfigManager()` method.
// To monitor config, use the `onConfigChange` callback in the config options.

// Check sampling decisions by enabling debug logs or creating a custom span processor.

Performance Monitoring

// Monitor telemetry overhead
const telemetryMetrics = metricsClient.createHistogram('telemetry_overhead_ms');
const configReloadCounter = metricsClient.createCounter('config_reloads_total');

// The onConfigChange callback can be used to increment the counter.
// Example:
// onConfigChange: (newConfig) => {
//   configReloadCounter.increment();
// }

// Monitoring export success/failure would require custom exporters or processors.

Debug Logging

const telemetryClient = await NewTelemetryClient(
  'app', 'client', 'service',
  { debug: true }  // Enables OpenTelemetry debug logs
);

Examples & Use Cases

Microservices with Remote Configuration

# Centralized configuration management
my-microservices/
├── services/
│   ├── api-gateway/     # parentBased: true, high sampling
│   ├── user-service/    # parentBased: true, follows gateway  
│   ├── inventory/       # parentBased: false, resamples
│   └── payment/         # parentBased: true, 100% sampling
├── configs/
│   ├── s3-bucket: telemetry-configs
│   ├── api-gateway.json
│   ├── user-service.json  
│   ├── inventory.json
│   └── payment.json
└── shared/
    └── base-config.json

A/B Testing with Configuration

// Dynamic sampling based on feature flags
{
  "traces": {
    "sampling": {
      "rules": [
        {
          "name": "new_checkout_flow",
          "sampleRate": 1.0,
          "conditions": [
            { "attribute": "feature.checkout_v2", "operator": "Equals", "value": "true" }
          ]
        },
        {
          "name": "legacy_checkout_flow", 
          "sampleRate": 0.1,
          "conditions": [
            { "attribute": "feature.checkout_v2", "operator": "Equals", "value": "false" }
          ]
        }
      ]
    }
  }
}
```javascript
// Usage in code
app.post('/checkout', (req, res) => {
  const useNewCheckout = featureFlag.isEnabled('checkout_v2', req.user.id);
  
  Traces.addBaggage({
    'feature.checkout_v2': useNewCheckout.toString(),
    'user.segment': req.user.segment
  });
  
  // Automatically sampled based on feature flag
});

Disaster Recovery Configuration

// Multi-region failover
{
  "traces": {
    "exporters": {
      "primary": {
        "mode": "otlp",
        "otlp": { "endpoint": "us-east-1-collector:4317" }
      },
      "secondary": {
        "mode": "otlp", 
        "otlp": { "endpoint": "us-west-2-collector:4317" }
      },
      "fallback": {
        "mode": "console"
      }
    },
    "failover": {
      "enabled": true,
      "healthCheckIntervalMs": 10000,
      "failoverTimeoutMs": 5000
    }
  }
}

Cost Optimization

// Smart sampling for cost control
{
  "traces": {
    "sampling": {
      "defaultRate": 0.001,
      "rules": [
        {
          "name": "errors_always",
          "sampleRate": 1.0,
          "conditions": [
            { "attribute": "http.status_code", "operator": "GreaterThanEqual", "value": "400" }
          ]
        },
        {
          "name": "slow_requests",
          "sampleRate": 1.0,
          "conditions": [
            { "attribute": "http.response_time_ms", "operator": "GreaterThan", "value": "1000" }
          ]
        },
        {
          "name": "business_critical",
          "sampleRate": 0.1,
          "conditions": [
            { "attribute": "http.target", "operator": "Regex", "value": "^/api/(checkout|payment|auth)" }
          ]
        },
        {
          "name": "high_value_users",
          "sampleRate": 0.5,
          "conditions": [
            { "attribute": "user.tier", "operator": "Equals", "value": "premium" }
          ]
        }
      ]
    }
  }
}

Migration from Basic OpenTelemetry


VTEX Proprietary Software - This library is proprietary to VTEX and licensed for internal use only.