Skip to content

Fan-out to Multiple Backends ​

Ship logs to both FlareLog and any OTLP-compatible backend simultaneously.

Why Fan-out? ​

Fan-out allows you to:

  • Migrate gradually — Ship to both old and new backends during transition
  • Redundancy — Have multiple copies of your observability data
  • Different tools for different teams — FlareLog for developers, Grafana for ops
  • Cost optimization — Use different backends for different data types

Configuration ​

Use the transports array to configure multiple backends:

typescript
import { flarelog } from "@flarelog/sdk";

const logger = flarelog({
  transports: [
    { type: "console" },
    { type: "flarelog", apiKey: process.env.FLARELOG_API_KEY },
    {
      type: "otlp",
      endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
    },
  ],
});

Environment Variables ​

You can also use environment variables for fan-out:

bash
# .env
FLARELOG_API_KEY=fl_your_api_key
OTEL_EXPORTER_OTLP_ENDPOINT=https://otlp-gateway-prod-eu-west-0.grafana.net
OTEL_EXPORTER_OTLP_HEADERS=Authorization=Basic\ base64token
typescript
const logger = flarelog({});
// Auto-detects both FLARELOG_API_KEY and OTEL_EXPORTER_OTLP_ENDPOINT
// Ships to both backends + console

Common Backends ​

Grafana Cloud ​

typescript
const logger = flarelog({
  transports: [
    { type: "flarelog", apiKey: process.env.FLARELOG_API_KEY },
    {
      type: "otlp",
      endpoint: "https://otlp-gateway-prod-eu-west-0.grafana.net",
      headers: {
        Authorization: "Basic " + btoa(`${GRAFANA_INSTANCE_ID}:${GRAFANA_API_KEY}`),
      },
    },
  ],
});

Honeycomb ​

typescript
const logger = flarelog({
  transports: [
    { type: "flarelog", apiKey: process.env.FLARELOG_API_KEY },
    {
      type: "otlp",
      endpoint: "https://api.honeycomb.io/v1/traces",
      headers: {
        "x-honeycomb-team": process.env.HONEYCOMB_API_KEY,
      },
    },
  ],
});

Datadog ​

typescript
const logger = flarelog({
  transports: [
    { type: "flarelog", apiKey: process.env.FLARELOG_API_KEY },
    {
      type: "otlp",
      endpoint: "https://trace.agent.datadoghq.com/api/v0.2/traces",
      headers: {
        "DD-API-KEY": process.env.DD_API_KEY,
      },
    },
  ],
});

Selective Fan-out ​

Use beforeSend to route different logs to different backends:

typescript
const logger = flarelog({
  transports: [
    { type: "flarelog", apiKey: process.env.FLARELOG_API_KEY },
    {
      type: "otlp",
      endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
    },
  ],
  beforeSend: (log) => {
    // Add backend routing hint
    if (log.level === "ERROR" || log.level === "FATAL") {
      log.metadata = { ...log.metadata, _route: "all" };
    }
    return log;
  },
});

Performance Considerations ​

  • Each transport adds network overhead
  • Consider using sampleRate to reduce volume for high-traffic apps
  • Use workerMode: true in serverless environments to flush immediately

Troubleshooting ​

Logs not appearing in one backend ​

  1. Check that the backend endpoint is correct
  2. Verify API keys and headers
  3. Enable debug: true to see transport diagnostics
  4. Check network connectivity from your environment

Released under the MIT License.