import { NodeSDK } from '@opentelemetry/sdk-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
import { trace } from '@opentelemetry/api';
import { Step, flow } from '@siglo/core';
import { instrumentWorkflow, createTelemetryStorageAdapter, getTraceHeaders } from '@siglo/opentelemetry';
// 1. Initialize OpenTelemetry SDK
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({ url: 'http://localhost:4317' }),
serviceName: 'order-service',
});
sdk.start();
const tracer = trace.getTracer('order-service', '1.0.0');
// 2. Configure Storage Adapter with PII Sanitization
const telemetryStorage = createTelemetryStorageAdapter({
allowContextFields: ['orderId', 'orderStatus', 'cardLast4', 'totalAmount'],
redactHook: (key, val) => {
if (key === 'cardLast4') {
return `****${String(val).slice(-4)}`;
}
return val;
},
});
Step.useStorage(telemetryStorage);
// 3. Define Workflow Steps with Retry
const validateOrder = Step.create('validateOrder', async (input: any) => {
return { orderId: input.orderId, validated: true };
});
const chargePayment = Step.create('chargePayment', async (param: any) => {
// Simulate transient failure on first attempt
if (param.$attempt && param.$attempt() === 0) {
throw new Error('Temporary payment gateway blip');
}
return { paymentStatus: 'CHARGED', cardLast4: '4242' };
}).onFail({ maxRetries: 2, delay: 100 });
const orderWorkflow = flow(validateOrder, chargePayment);
// 4. Instrument Workflow
const monitoredWorkflow = instrumentWorkflow(orderWorkflow, {
tracer,
workflowName: 'CustomerOrderProcessing',
workflowVersion: '2.4.0',
allowNamespace: true,
});
// 5. Run Monitored Workflow
const result = await monitoredWorkflow.run({ orderId: 'ORD-7718', totalAmount: 89.5 }, { namespace: 'tenant-emea' });
console.log('Workflow finished with Stack ID:', result.$stackId());
console.log('Outgoing W3C Headers for downstreams:', getTraceHeaders());