Skip to content
tayohyaPublic

About

Production-grade Solana observability, diagnostics, and developer tooling

Resources

Code of conduct

Contributing

Security policy

Stars

73 stars

Watchers

0 watching

Forks

Latest commit

Β 

History

271 Commits

Folders and files

Repository files navigation

πŸ”Ž SolProbe

Production-grade Solana observability, diagnostics, and developer tooling β€” from your terminal to a real-time dashboard.

License: MIT Python Rust Go TypeScript Node.js Solana Docker CI PRs Welcome


πŸ“š Table of Contents


Overview

Solana moves fast β€” 400ms slots, thousands of transactions per second, and a sprawling network of RPC providers, programs, and wallets. When something breaks or slows down, developers need answers now, not after refreshing a block explorer for the fifth time.

SolProbe is an open-source observability and diagnostic platform built specifically for Solana. It combines a fast terminal CLI for instant diagnostics with a real-time backend stack for continuous monitoring, alerting, and analytics.

The project is deliberately polyglot β€” each component is written in the language best suited to its job:

Concern Language Why
Developer CLI & diagnostics Python Rapid iteration, rich terminal libraries (Rich, Textual), broad ecosystem
High-throughput event ingestion Rust Zero-cost abstractions, predictable latency under load, native Solana SDK
Public API / auth / rate limiting Go Simple concurrency model, fast cold starts, easy to operate at scale
Real-time dashboard TypeScript / Next.js Best-in-class ecosystem for reactive, real-time UI
Historical analysis & anomaly detection Python Pandas, NumPy, scikit-learn ecosystem for time-series intelligence
Alerting & webhook fan-out Node.js Lightweight, huge integration ecosystem (Discord.js, Telegraf)

🎯 Why SolProbe

  • Terminal-first, not terminal-only. The CLI gives you instant answers (solprobe status, solprobe rpc benchmark), while the full stack provides continuous observability.
  • No polling, ever. The collector subscribes to live WebSocket feeds; nothing loops on REST endpoints.
  • Composable services, not a monolith β€” run only the pieces you need.
  • Typed contracts between services via Protobuf, so the Rust collector, Go API, and TypeScript dashboard all agree on event shapes.
  • Built to run in production β€” includes health checks, structured logging, metrics export, horizontal scaling guidance, and operational runbooks.

πŸ— Architecture

                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                              β”‚    Solana RPC Network    β”‚
                              β”‚                         β”‚
                              β”‚  Mainnet / Devnet / Test β”‚
                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚
                          HTTP RPC + WebSocket subscriptions
                                           β”‚
                                           β–Ό
                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                              β”‚   COLLECTOR (Rust)       β”‚
                              β”‚                          β”‚
                              β”‚  slots / logs / blocks   β”‚
                              β”‚  accounts / events       β”‚
                              β”‚  backpressure-aware queueβ”‚
                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚
                                gRPC / Protobuf events
                                           β”‚
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚                            β”‚                            β”‚
              β–Ό                            β–Ό                            β–Ό
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
     β”‚ API (Go)         β”‚       β”‚ Analyzer (Python)β”‚       β”‚ Alerts (Node.js) β”‚
     β”‚ REST / WebSocket β”‚       β”‚ Trends / scoring β”‚       β”‚ Rules / webhooks β”‚
     β”‚ Auth / limits    β”‚       β”‚ Anomalies        β”‚       β”‚ Telegram/Discord β”‚
     β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              β”‚                          β”‚
              β–Ό                          β–Ό
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
     β”‚ Dashboard        β”‚       β”‚ PostgreSQL       β”‚
     β”‚ Next.js / TS     β”‚       β”‚ Redis / metrics  β”‚
     β”‚ Live monitoring  β”‚       β”‚ Historical data  β”‚
     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚ CLI (Python + Rich/Textual) β”‚
                    β”‚ Direct diagnostics + TUI    β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“ Repository Structure

solprobe/
β”œβ”€β”€ apps/
β”‚   β”œβ”€β”€ cli/                         # Python CLI + TUI
β”‚   β”‚   β”œβ”€β”€ solprobe/
β”‚   β”‚   β”‚   β”œβ”€β”€ commands/
β”‚   β”‚   β”‚   β”œβ”€β”€ clients/
β”‚   β”‚   β”‚   β”œβ”€β”€ diagnostics/
β”‚   β”‚   β”‚   β”œβ”€β”€ formatters/
β”‚   β”‚   β”‚   β”œβ”€β”€ config/
β”‚   β”‚   β”‚   └── tui/
β”‚   β”‚   β”œβ”€β”€ tests/
β”‚   β”‚   β”œβ”€β”€ pyproject.toml
β”‚   β”‚   β”œβ”€β”€ README.md
β”‚   β”‚   └── CHANGELOG.md
β”‚   β”‚
β”‚   └── dashboard/                   # Next.js real-time dashboard
β”‚       β”œβ”€β”€ app/
β”‚       β”œβ”€β”€ components/
β”‚       β”œβ”€β”€ hooks/
β”‚       β”œβ”€β”€ lib/
β”‚       β”œβ”€β”€ stores/
β”‚       β”œβ”€β”€ types/
β”‚       β”œβ”€β”€ tests/
β”‚       β”œβ”€β”€ package.json
β”‚       └── Dockerfile
β”‚
β”œβ”€β”€ services/
β”‚   β”œβ”€β”€ collector/                   # Rust event ingestion
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ rpc/
β”‚   β”‚   β”‚   β”œβ”€β”€ websocket/
β”‚   β”‚   β”‚   β”œβ”€β”€ subscriptions/
β”‚   β”‚   β”‚   β”œβ”€β”€ decoders/
β”‚   β”‚   β”‚   β”œβ”€β”€ metrics/
β”‚   β”‚   β”‚   └── health/
β”‚   β”‚   β”œβ”€β”€ tests/
β”‚   β”‚   β”œβ”€β”€ benches/
β”‚   β”‚   β”œβ”€β”€ Cargo.toml
β”‚   β”‚   └── Dockerfile
β”‚   β”‚
β”‚   β”œβ”€β”€ api/                         # Go API gateway
β”‚   β”‚   β”œβ”€β”€ cmd/server/
β”‚   β”‚   β”œβ”€β”€ internal/
β”‚   β”‚   β”‚   β”œβ”€β”€ handlers/
β”‚   β”‚   β”‚   β”œβ”€β”€ middleware/
β”‚   β”‚   β”‚   β”œβ”€β”€ auth/
β”‚   β”‚   β”‚   β”œβ”€β”€ ratelimit/
β”‚   β”‚   β”‚   β”œβ”€β”€ services/
β”‚   β”‚   β”‚   └── repositories/
β”‚   β”‚   β”œβ”€β”€ migrations/
β”‚   β”‚   β”œβ”€β”€ go.mod
β”‚   β”‚   └── Dockerfile
β”‚   β”‚
β”‚   β”œβ”€β”€ analyzer/                    # Python analytics
β”‚   β”‚   β”œβ”€β”€ solprobe_analyzer/
β”‚   β”‚   β”‚   β”œβ”€β”€ network/
β”‚   β”‚   β”‚   β”œβ”€β”€ transactions/
β”‚   β”‚   β”‚   β”œβ”€β”€ anomalies/
β”‚   β”‚   β”‚   β”œβ”€β”€ scoring/
β”‚   β”‚   β”‚   └── reports/
β”‚   β”‚   β”œβ”€β”€ tests/
β”‚   β”‚   β”œβ”€β”€ pyproject.toml
β”‚   β”‚   └── Dockerfile
β”‚   β”‚
β”‚   β”œβ”€β”€ alerts/                      # Node.js notification workers
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ rules/
β”‚   β”‚   β”‚   β”œβ”€β”€ channels/
β”‚   β”‚   β”‚   └── workers/
β”‚   β”‚   β”œβ”€β”€ package.json
β”‚   β”‚   └── Dockerfile
β”‚   β”‚
β”‚   └── scheduler/                   # Background jobs
β”‚       β”œβ”€β”€ jobs/
β”‚       β”œβ”€β”€ queues/
β”‚       └── workers/
β”‚
β”œβ”€β”€ packages/
β”‚   β”œβ”€β”€ sdk-python/
β”‚   β”œβ”€β”€ sdk-typescript/
β”‚   β”œβ”€β”€ sdk-go/
β”‚   β”œβ”€β”€ config/
β”‚   └── shared-types/
β”‚
β”œβ”€β”€ proto/
β”‚   β”œβ”€β”€ events.proto
β”‚   β”œβ”€β”€ metrics.proto
β”‚   β”œβ”€β”€ health.proto
β”‚   └── rpc.proto
β”‚
β”œβ”€β”€ contracts/
β”‚   └── programs/
β”‚       └── solprobe_registry/       # Optional Anchor program
β”‚
β”œβ”€β”€ infra/
β”‚   β”œβ”€β”€ docker/
β”‚   β”œβ”€β”€ kubernetes/
β”‚   β”œβ”€β”€ terraform/
β”‚   β”œβ”€β”€ helm/
β”‚   β”œβ”€β”€ monitoring/
β”‚   β”‚   β”œβ”€β”€ prometheus/
β”‚   β”‚   └── grafana/
β”‚   └── docker-compose.yml
β”‚
β”œβ”€β”€ docs/
β”‚   β”œβ”€β”€ architecture/
β”‚   β”‚   β”œβ”€β”€ overview.md
β”‚   β”‚   β”œβ”€β”€ data-flow.md
β”‚   β”‚   └── adr/
β”‚   β”‚       β”œβ”€β”€ 0001-event-driven-architecture.md
β”‚   β”‚       β”œβ”€β”€ 0002-rpc-provider-abstraction.md
β”‚   β”‚       └── 0003-polyglot-services.md
β”‚   β”œβ”€β”€ guides/
β”‚   β”œβ”€β”€ api/
β”‚   β”œβ”€β”€ cli/
β”‚   β”œβ”€β”€ deployment/
β”‚   └── runbooks/
β”‚
β”œβ”€β”€ examples/
β”‚   β”œβ”€β”€ basic-cli/
β”‚   β”œβ”€β”€ python-sdk/
β”‚   β”œβ”€β”€ typescript-sdk/
β”‚   β”œβ”€β”€ wallet-monitoring/
β”‚   β”œβ”€β”€ custom-alerts/
β”‚   └── docker-deployment/
β”‚
β”œβ”€β”€ tests/
β”‚   β”œβ”€β”€ integration/
β”‚   β”œβ”€β”€ e2e/
β”‚   β”œβ”€β”€ fixtures/
β”‚   └── load/
β”‚
β”œβ”€β”€ benchmarks/
β”‚   β”œβ”€β”€ rpc/
β”‚   β”œβ”€β”€ websocket/
β”‚   └── transaction/
β”‚
β”œβ”€β”€ scripts/
β”‚   β”œβ”€β”€ bootstrap.sh                 # one-shot local env setup
β”‚   β”œβ”€β”€ dev.sh
β”‚   β”œβ”€β”€ test-all.sh
β”‚   β”œβ”€β”€ lint-all.sh
β”‚   β”œβ”€β”€ release.sh                   # cross-service version bump + tag
β”‚   β”œβ”€β”€ generate-proto.sh
β”‚   └── seed-dev-data.sh
β”‚
β”œβ”€β”€ .github/
β”‚   β”œβ”€β”€ workflows/                   # CI/CD pipelines (per-service + release)
β”‚   β”‚   β”œβ”€β”€ cli-ci.yml
β”‚   β”‚   β”œβ”€β”€ collector-ci.yml
β”‚   β”‚   β”œβ”€β”€ api-ci.yml
β”‚   β”‚   β”œβ”€β”€ dashboard-ci.yml
β”‚   β”‚   β”œβ”€β”€ analyzer-ci.yml
β”‚   β”‚   β”œβ”€β”€ security.yml
β”‚   β”‚   β”œβ”€β”€ release.yml
β”‚   β”‚   └── docker.yml
β”‚   β”œβ”€β”€ ISSUE_TEMPLATE/
β”‚   β”‚   β”œβ”€β”€ bug_report.md
β”‚   β”‚   └── feature_request.md
β”‚   β”œβ”€β”€ CODEOWNERS
β”‚   β”œβ”€β”€ PULL_REQUEST_TEMPLATE.md
β”‚   └── dependabot.yml
β”‚
β”œβ”€β”€ .env.example
β”œβ”€β”€ .editorconfig
β”œβ”€β”€ .gitignore
β”œβ”€β”€ .dockerignore
β”œβ”€β”€ .pre-commit-config.yaml
β”œβ”€β”€ Makefile                         # make dev / make test-all / make release
β”œβ”€β”€ CHANGELOG.md                     # root-level, aggregates per-service releases
β”œβ”€β”€ CODE_OF_CONDUCT.md
β”œβ”€β”€ CONTRIBUTING.md
β”œβ”€β”€ SECURITY.md
β”œβ”€β”€ LICENSE
β”œβ”€β”€ VERSION
└── README.md

Root-level files at a glance

File Purpose
CODEOWNERS Auto-assigns reviewers per directory (e.g. /services/collector/ β†’ Rust maintainers)
dependabot.yml Automated dependency update PRs across all five package ecosystems
.pre-commit-config.yaml Runs formatters/linters (black, rustfmt, gofmt, eslint) before every commit
CHANGELOG.md Root-level changelog aggregating notable changes across all services, Keep a Changelog format
SECURITY.md Vulnerability disclosure policy and supported version table
CODE_OF_CONDUCT.md Contributor Covenant v2.1
VERSION Current release version, read by scripts/release.sh for tagging
Makefile Single entrypoint for common tasks across all services (make test-all, make lint-all, make dev)
docs/architecture/adr/ Architecture Decision Records β€” the why behind major structural choices
docs/runbooks/ Step-by-step operational guides for on-call (e.g. "collector stopped receiving slot updates")

🧩 Services

1. apps/cli β€” Python

The primary developer interface. Built around a fast command architecture with rich terminal output and an optional full-screen terminal UI.

  • CLI framework: typer
  • Terminal rendering: rich
  • TUI framework: textual
  • HTTP client: httpx
  • Validation: pydantic

Commands:

solprobe status
solprobe network health
solprobe rpc benchmark
solprobe rpc compare
solprobe slots latest
solprobe slots watch
solprobe fees
solprobe wallet inspect <ADDRESS>
solprobe wallet watch <ADDRESS>
solprobe program inspect <PROGRAM_ID>
solprobe program logs <PROGRAM_ID>
solprobe tx inspect <SIGNATURE>
solprobe tx simulate <FILE>
solprobe tui

2. services/collector β€” Rust

The high-throughput ingestion layer. Maintains persistent RPC and WebSocket connections, manages subscriptions, normalizes incoming Solana events, and publishes typed events to downstream services.

  • Async runtime: tokio
  • WebSocket client: tokio-tungstenite
  • Solana SDK: solana-client, solana-sdk
  • Backpressure-aware bounded channel to prevent memory blowup under bursty load
  • Automatic reconnect with exponential backoff on RPC disconnects

Responsibilities:

  • Slot subscriptions
  • Block subscriptions
  • Account subscriptions
  • Program subscriptions
  • Log subscriptions
  • Reconnection and backoff
  • Subscription health checks
  • Event normalization
  • Metrics emission

3. services/api β€” Go

The public API gateway. Exposes REST and WebSocket endpoints over data produced by collector, handles authentication, and enforces per-client rate limits.

  • HTTP framework: chi
  • GraphQL: gqlgen (planned)
  • Auth: JWT + API key middleware
  • Structured logging: zap

Example endpoints:

Method Endpoint Description
GET /v1/health Overall platform health
GET /v1/network Network metrics (TPS, slot time, skip rate)
GET /v1/slots/latest Latest processed slot and finality status
GET /v1/slots/stream WebSocket relay of live slot events
GET /v1/rpc/benchmark RPC benchmark results
GET /v1/wallets/{address} Wallet inspection (balances, activity)
GET /v1/programs/{id} Program metadata and details
GET /v1/programs/{id}/logs Recent program logs
GET /v1/transactions/{signature} Transaction diagnostics
POST /v1/alerts Create alert rule
GET /v1/stream WebSocket stream of live events

Full OpenAPI spec: docs/api/openapi.yaml (generated from services/api/).


4. apps/dashboard β€” TypeScript / Next.js

The live UI. Connects to api's WebSocket relay and renders real-time feeds, charts, and alerts.

  • Framework: Next.js 14 (App Router)
  • State/data: React Query + lightweight WebSocket hook
  • Charts: recharts
  • Styling: Tailwind CSS

5. services/analyzer β€” Python

The intelligence layer. Processes collected metrics and historical data to identify RPC degradation, slot lag, transaction failure spikes, abnormal compute consumption, and network anomalies.

  • Data: pandas, numpy
  • Modeling: scikit-learn
  • Scheduling: celery + Redis for periodic jobs
  • Notebooks in services/analyzer/notebooks/ for exploratory work

6. services/alerts β€” Node.js

The notification layer. Subscribes to rule-matched events and fans them out to Discord, Telegram, or arbitrary webhooks.

  • discord.js for Discord integration
  • telegraf for Telegram bots
  • Rule engine: simple declarative YAML rules matched against incoming event streams

Example rule:

name: rpc-degradation
when:
  metric: rpc_latency_ms
  operator: ">"
  value: 500
  for: 60s

notify:
  - discord
  - webhook

πŸš€ Quick Start (Docker Compose)

The fastest way to run the full stack locally:

git clone https://github.com/<your-username>/solprobe.git
cd solprobe
cp .env.example .env   # fill in your RPC endpoint and secrets
docker compose -f infra/docker-compose.yml up --build

This brings up:

Service Port
dashboard 3000
api (REST/GraphQL) 8080
collector (gRPC) 50051
PostgreSQL 5432
Redis 6379
Prometheus 9090
Grafana 3001

Open http://localhost:3000 once containers are healthy.


πŸ›  Local Development (per service)

CLI (Python)
cd apps/cli
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
solprobe --help

Requires Python >= 3.11.

Collector (Rust)
cd services/collector
cargo build
cargo run

Requires Rust >= 1.75 (rustup update stable).

API (Go)
cd services/api
go mod download
go run ./cmd/server

Requires Go >= 1.22.

Dashboard (TypeScript / Next.js)
cd apps/dashboard
npm install
npm run dev

Requires Node.js >= 18.

Analyzer (Python)
cd services/analyzer
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest

Requires Python >= 3.11.

Alerts (Node.js)
cd services/alerts
npm install
npm run dev

Requires Node.js >= 18.


βš™οΈ Configuration

Root-level .env (referenced by docker-compose.yml):

# Solana
SOLPROBE_CLUSTER=mainnet-beta
SOLANA_RPC_ENDPOINT=https://your-rpc-provider.com
SOLANA_WS_ENDPOINT=wss://your-rpc-provider.com/ws

# Watch targets (optional, comma-separated)
WATCH_ADDRESSES=
WATCH_PROGRAM_IDS=

# Storage
DATABASE_URL=postgres://solprobe:solprobe@postgres:5432/solprobe
REDIS_URL=redis://redis:6379

# API
API_HOST=0.0.0.0
API_PORT=8080
JWT_SECRET=
API_RATE_LIMIT_PER_MINUTE=120

# Collector
COLLECTOR_MAX_SUBSCRIPTIONS=500
COLLECTOR_RECONNECT_MAX_SECONDS=60

# Alerts
DISCORD_WEBHOOK_URL=
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=

# Observability
LOG_LEVEL=info
METRICS_ENABLED=true

Each service also supports a local .env inside its own directory for service-specific overrides during development.

Never commit real secrets or production credentials.


πŸ’» CLI Usage

Check network health:

solprobe network health

Benchmark an RPC:

solprobe rpc benchmark   --endpoint https://api.mainnet-beta.solana.com

Compare endpoints:

solprobe rpc compare   --endpoint https://rpc-1.example.com   --endpoint https://rpc-2.example.com

Watch slots:

solprobe slots watch

Inspect a wallet:

solprobe wallet inspect <SOLANA_ADDRESS>

Launch the terminal UI:

solprobe tui

πŸ“‘ API Reference

Base URL (local): http://localhost:8080

Method Endpoint Description
GET /v1/health Overall platform health
GET /v1/network Network metrics (TPS, slot time, skip rate)
GET /v1/slots/latest Latest processed slot and finality status
GET /v1/slots/stream WebSocket relay of live slot events
GET /v1/rpc/benchmark RPC benchmark results
GET /v1/wallets/{address} Wallet inspection (balances, activity)
GET /v1/programs/{id} Program metadata and details
GET /v1/programs/{id}/logs Recent program logs
GET /v1/transactions/{signature} Transaction diagnostics
POST /v1/alerts Create alert rule
GET /v1/stream WebSocket stream of live events

Full OpenAPI spec: docs/api/openapi.yaml.


πŸ”„ Data Flow

  1. collector opens WebSocket subscriptions to the configured Solana RPC (slotSubscribe, accountSubscribe, logsSubscribe, programSubscribe).
  2. Raw events are decoded into typed Protobuf messages (schema in proto/).
  3. Events are published over gRPC to api, alerts, and analyzer simultaneously.
  4. api relays live events to dashboard over WebSocket and serves historical queries from PostgreSQL.
  5. analyzer runs scheduled jobs (via Celery) to compute rolling baselines and flag anomalies, writing results back to Postgres for api to serve.
  6. alerts matches events against declarative YAML rules and dispatches to Discord, Telegram, or webhooks.
  7. cli can work standalone (direct RPC calls) or connect to api for enriched data and historical context.

βœ… Testing

Service Command Framework
CLI pytest Pytest
Collector cargo test Rust built-in test harness
API go test ./... Go built-in testing
Dashboard npm run test Vitest + React Testing Library
Analyzer pytest Pytest
Alerts npm test Jest

Run everything at once from the repo root:

make test-all

Lint everything:

make lint-all

🚒 Deployment

  • Docker: each service ships its own Dockerfile; infra/docker-compose.yml covers local/staging use.
  • Kubernetes: manifests in infra/kubernetes/ (Deployments, Services, HPA for collector and api).
  • Terraform: infra/terraform/ provisions managed Postgres, Redis, and container hosting on your cloud provider of choice.
  • Helm: infra/helm/ supports repeatable cluster deployment.
# Example: deploy to an existing k8s cluster
kubectl apply -f infra/kubernetes/

πŸ“Š Observability

SolProbe monitors itself.

Metrics

  • Event ingestion rate
  • RPC latency
  • WebSocket reconnects
  • Subscription counts
  • Queue depth
  • API request latency
  • Database latency
  • Alert delivery success rate

Monitoring stack

  • Prometheus β€” metrics collection
  • Grafana β€” dashboards and visualizations
  • Structured logs β€” JSON logging across all services
  • Health endpoints β€” per-service liveness/readiness probes

Health check:

curl http://localhost:8080/v1/health

Example response:

{
  "status": "healthy",
  "score": 98,
  "services": {
    "collector": "healthy",
    "api": "healthy",
    "database": "healthy",
    "redis": "healthy"
  }
}

πŸ” Security

SolProbe is designed to be safe for read-only infrastructure monitoring.

  • No private key is required for normal monitoring β€” collector only subscribes to public chain data.
  • Secrets are loaded from environment variables only; nothing is committed to the repo. See .env.example.
  • API authentication is optional for local development and configurable for production.
  • Rate limiting protects public endpoints.
  • Input validation is applied at API and CLI boundaries.
  • Dependencies are checked through automated security workflows.
  • Report vulnerabilities privately per SECURITY.md rather than opening a public issue.

Important

Never place these values in Git:

PRIVATE_KEY
SEED_PHRASE
JWT_SECRET
DATABASE_PASSWORD
TELEGRAM_BOT_TOKEN
PROVIDER_API_KEY

πŸ” CI/CD

GitHub Actions workflows in .github/workflows/:

  • cli-ci.yml β€” black, ruff, pytest
  • collector-ci.yml β€” cargo fmt --check, clippy, cargo test
  • api-ci.yml β€” go vet, golangci-lint, go test
  • dashboard-ci.yml β€” eslint, tsc --noEmit, vitest
  • analyzer-ci.yml β€” black, ruff, pytest
  • alerts-ci.yml β€” eslint, jest
  • security.yml β€” dependency vulnerability scanning
  • docker.yml β€” builds and pushes images on tagged releases
  • release.yml β€” cross-service version bump + tag automation

⚑ Performance

SolProbe is designed around several principles:

  • Prefer persistent connections for live data.
  • Use bounded queues to prevent memory growth.
  • Apply backpressure instead of silently dropping critical events.
  • Keep hot ingestion paths lightweight.
  • Separate collection from analysis.
  • Avoid unnecessary polling.
  • Batch historical writes.
  • Cache expensive repeated reads.

Performance benchmarks belong in:

benchmarks/

Benchmark categories include:

  • RPC latency
  • WebSocket reconnect behavior
  • Event throughput
  • Transaction inspection
  • API throughput

Actual benchmark results should be generated from reproducible test runs rather than hard-coded marketing numbers.


πŸ—Ί Roadmap

v0.1 β€” Foundation

  • Python CLI with status, rpc benchmark, slots watch
  • Rich terminal output and configuration system
  • Direct RPC diagnostics (no backend required)

v0.2 β€” Diagnostics

  • Wallet inspection
  • Transaction inspection and simulation
  • Program inspection and log streaming
  • Compute diagnostics and priority fee analysis
  • Interactive TUI (solprobe tui)

v0.3 β€” Full Platform

  • Rust collector with live WebSocket ingestion
  • Go API with REST and WebSocket relay
  • PostgreSQL + Redis storage layer
  • Next.js real-time dashboard
  • Python SDK and TypeScript SDK

v0.4 β€” Intelligence

  • Historical analytics and trend detection
  • Network anomaly detection
  • Health scoring algorithm
  • RPC provider comparison reports
  • Automated incident reports

v1.0 β€” Production

  • Stable public API
  • Complete Helm charts and Terraform modules
  • Prometheus/Grafana observability stack
  • Production deployment guides
  • Community plugin ecosystem

🀝 Contributing

Contributions are welcome across any of the six services. Please open an issue to discuss significant changes before submitting a PR.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feat/your-feature)
  3. Make your changes in the relevant service directory
  4. Run that service's test suite (see Testing)
  5. Commit using Conventional Commits (feat:, fix:, docs:, refactor:, test:, chore:, ci:, perf:)
  6. Open a Pull Request

See CONTRIBUTING.md for full guidelines, including per-language style conventions.


πŸ“„ License

Distributed under the MIT License. See LICENSE for details.


πŸ™ Acknowledgments

  • Solana Labs for the core protocol
  • Anchor for on-chain program tooling
  • Helius / QuickNode for RPC infrastructure
  • The maintainers of tokio, chi, typer, rich, textual, pandas, and recharts β€” the backbone of this project's polyglot stack

πŸ”Ž SolProbe

Observe. Diagnose. Understand Solana.

About

Production-grade Solana observability, diagnostics, and developer tooling

Resources

Code of conduct

Contributing

Security policy

Stars

73 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages