Skip to content

Metrics

Quick start: See Tutorial 9 (Production) for wiring Prometheus metrics in a production server.

MetricsCollector

Accumulates internal counters: connections, messages in/out, bytes in/out, RPC calls/errors, state patches, uptime. Access via ds.metrics on the server.

typescript
const snapshot = ds.metrics.snapshot();
// {
//   connections: 42,
//   messagesIn: 1234,
//   messagesOut: 5678,
//   bytesIn: 102400,
//   bytesOut: 409600,
//   rpcCalls: 890,
//   rpcErrors: 3,
//   statePatches: 456,
//   uptime: 3600000,
// }

Exporters

PrometheusExporter

Outputs Prometheus text exposition format. Expose as an HTTP endpoint in your app (datasole does not register routes):

typescript
import express from 'express';
import { DatasoleServer, PrometheusExporter } from 'datasole/server';

const ds = new DatasoleServer<AppContract>();
const exporter = new PrometheusExporter('datasole');

const app = express();
app.get('/metrics', async (_req, res) => {
  const text = await exporter.export(ds.metrics.snapshot());
  res.type('text/plain').send(text);
});

Output:

datasole_connections 42
datasole_messagesIn 1234
datasole_messagesOut 5678
datasole_bytesIn 102400
datasole_bytesOut 409600
datasole_rpcCalls 890
datasole_rpcErrors 3
datasole_statePatches 456
datasole_uptime 3600000

OpenTelemetryExporter

Bridges to the OpenTelemetry Metrics SDK. Requires @opentelemetry/api peer dependency. You must call initialize() on the exporter before the first export to load the OpenTelemetry API dynamically.

typescript
import { OpenTelemetryExporter } from 'datasole/server';

const exporter = new OpenTelemetryExporter();
await exporter.initialize();

const text = await exporter.export(ds.metrics.snapshot());

Custom Exporters

Implement the MetricsExporter interface:

typescript
interface MetricsExporter {
  export(snapshot: MetricsSnapshot): Promise<string>;
}

class DatadogExporter implements MetricsExporter {
  async export(snapshot: MetricsSnapshot): Promise<string> {
    // Format for Datadog, StatsD, etc.
    return '';
  }
}