Skip to main content
MoleSignal is a single binary that serves every role; you choose which roles a process runs. That makes it equally comfortable as a one-command sandbox or a horizontally-scaled cluster.

Architecture

                          ┌──────────┐
   OTel / Vector / ...  ─►│  router  │─► consistent hash(org, stream) ─► ingester(s)
                          └──────────┘                                      │
                               │                                            ▼
                               ▼                                       WAL + Arrow buffer
                       /api/v1/{ingest,query,...}                           │
                               │                                  flush → Parquet + Tantivy
                               ▼                                  upload to object store
                       ┌──────────────┐                                     │
                       │ web shell    │                                     ▼
                       │ (⌘K + stack) │             ┌────────────────────────────┐
                       └──────┬───────┘             │ FileMeta in Postgres       │
                              │ /query              │ objects in S3/GCS/Azure/…   │
                              ▼                     └────────────────────────────┘
                       ┌──────────────┐                          ▲
                       │  querier(s)  │── Arrow Flight do_get ───┘
                       └──────────────┘    (distributed scan by hash shard)
The crucial point: logs, metrics, and traces land in the same Parquet files (different streams, same physical storage), so a SQL query joins across them natively — no cross-store federation.

Node roles

RoleWhat it runsState
standaloneHTTP API + all workers in one process
routerReverse proxy + rate limitingstateless
ingestergRPC ingest + WAL + buffer + flush to Parquetlocal WAL (≤ flush window)
querierArrow Flight server + DataFusion executionstateless
compactorPeriodic Parquet merge + retention cleanupstateless
alert_managerRule evaluation + escalation dispatchstateless
Roles are selected with the [node].roles config (or MS_NODE.ROLES). Only the ingester holds local state — a WAL within the flush window — so every other role scales freely.

Deployment options

The repo ships two profiles:
# Everything in one process — great for evaluation
docker compose -f deploy/docker/docker-compose.yaml --profile standalone up

# Separate roles — closer to production
docker compose -f deploy/docker/docker-compose.yaml --profile multirole up

Dependencies

  • Postgres — metadata (FileMeta, streams, alerts, identity).
  • Object storelocal, s3 (and S3-compatible: MinIO, R2, Aliyun OSS), azure, or gcs.

Operations

  • Single binary, same image for all roles.
  • Prometheus /metrics with rich cache / object_store / ingester / compactor metrics.
  • Health probes — readiness is gated by ingester WAL replay plus an object-store round-trip probe.
  • TLS + ACME — optional automatic certificates via [http.tls] (HTTP-01 challenge, Let’s Encrypt).
See Configuration for the full settings reference.