ollyScale is based on the excellent TinyOlly project by Infrastructure Architects, LLC.
TinyOlly pioneered the concept of "desktop observability" - bringing enterprise-grade observability tools to local development environments. ollyScale continues this vision while adding enhancements and maintaining compatibility with the OpenTelemetry ecosystem.
Key Attribution:
- Original concept and core architecture: TinyOlly (BSD-3-Clause)
- ollyScale enhancements and modifications: AGPL-3.0
- See NOTICE for complete licensing information
See the Quick Start Guide to get up and running in minutes.
Docs are here: https://ryanfaircloth.github.io/ollyscale/
Why send telemetry to a cloud observability platform while coding? Why not have one on your desktop?
ollyScale is a lightweight OpenTelemetry-native observability platform for local development, evolved from TinyOlly.
Visualize and correlate logs, metrics, and traces without sending data to the cloud.
Key Features:
- Full OpenTelemetry Protocol (OTLP) support with gRPC and HTTP ingestion
- REST API with OpenAPI documentation
- Service catalog, dependency maps, and distributed tracing
- Works with any OTel Collector distro
- Built with Python (FastAPI), Redis, and JavaScript
- Pre-built Docker images available on Docker Hub
Platform Support: Tested on Docker Desktop and KIND Kubernetes (Apple Silicon Mac) Architectures: linux/amd64, linux/arm64 (Apple Silicon)
All examples are launched from the repo- clone it first:
git clone https://github.com/ryanfaircloth/ollyscaleStart the observability backend:
task up # Create kind cluster and deploy ollyScaleDeployment time: ~30 seconds (pulls images from Docker Hub)
Services:
- OTLP Receiver: Cluster IP (gRPC)
- OpAMP Server: WebSocket + HTTP REST API endpoints
- UI:
http://ollyscale.test - Redis: Internal service
- OTel Collector: Internal service
Stop: task down
task deploy # Build and deploy demo applicationsTwo Flask microservices with automatic traffic generation. Wait 30 seconds for telemetry to appear.
Stop: task down
Deploy a demo showing OpenTelemetry eBPF Instrumentation (OBI) - traces captured at the kernel level with zero code changes:
task deploy # Build and deploy with eBPF agent enabledDeployment time: ~30 seconds (pulls pre-built images from Docker Hub)
This demonstrates:
- eBPF Agent captures HTTP traces automatically at kernel level
- No tracing SDK in application code - traces come from eBPF
- Logs & Metrics still use OTel SDK (shows hybrid approach)
See eBPF Demo Documentation for details on how traces differ from SDK-instrumented apps.
Stop: task down
Deploy an AI agent demo with zero-code OpenTelemetry auto-instrumentation:
task deploy # Build and deploy AI demo with OllamaThis starts:
- Ollama with TinyLlama model for local LLM inference
- AI Agent with automatic GenAI span instrumentation via
opentelemetry-instrumentation-ollama
View AI traces in the AI Agents tab - see prompts, responses, token usage (in/out), and latency for each LLM call.
Stop: task down
Clone and configure the OpenTelemetry Demo to route telemetry to ollyScale. Edit src/otel-collector/otelcol-config-extras.yml to add ollyScale as an exporter, then deploy with built-in observability tools disabled.
Point your OpenTelemetry exporter to:
- gRPC:
http://otel-collector:4317 - HTTP:
http://otel-collector:4318
task deploy # Deploy ollyScale without bundled collectorDeploys ollyScale without the bundled OTel Collector. Includes:
- OTLP Receiver: Cluster IP (gRPC)
- OpAMP Server: WebSocket + HTTP REST API
- UI:
http://ollyscale.test - Redis: Internal service
Point your external collector to the ollyScale OTLP receiver service for telemetry ingestion.
The OpenTelemetry Collector + OpAMP Config page in the ollyScale UI allows you to view and manage collector configurations remotely. To enable this feature, add the OpAMP extension to your collector config:
extensions:
opamp:
server:
ws:
endpoint: ws://opamp-server.ollyscale.svc.cluster.local/v1/opamp
service:
extensions: [opamp]The default configuration template (located at config/otelcol/config.yaml) shows a complete example with OTLP receivers, OpAMP extension, batch processing, and spanmetrics connector. Your collector will connect to the OpAMP server and receive configuration updates through the ollyScale UI.
Stop: task down
cd charts
task deploy # Build, push, and deploy to KubernetesAccess UI:
# UI exposed via Envoy Gateway on localhostUI available at: http://ollyscale.test
Enable eBPF agent for zero-code instrumentation:
helm install ollyscale ./charts/ollyscale \
--namespace ollyscale \
--create-namespace \
--set ebpfAgent.enabled=true \
--set ebpfAgent.config.openPorts="5000,8080,3000"The eBPF agent runs as a DaemonSet and automatically captures HTTP/gRPC traces from applications on specified ports without any code changes. See the Helm Chart README for full configuration options.
Cleanup:
helm uninstall ollyscale -n ollyscale
kubectl delete namespace ollyscaleDemo applications are automatically deployed with the main ollyScale deployment. To redeploy or update:
task deploy # Build and deploy all componentsCleanup: task down
For building and publishing Docker images, see build/README.md.
- Auto-refresh every 5 seconds (pausable)
- Export JSON with one click
- Service catalog with RED metrics
- Interactive service dependency map
- Distributed trace waterfall with correlated logs
- Metric cardinality protection with visual warnings
- OpAMP-based OpenTelemetry Collector configuration management
- AI Agents tab for GenAI observability
- View LLM calls with prompts, responses, and token usage
- Zero-code auto-instrumentation via OpenTelemetry GenAI semantic conventions
- Token tracking (input/output) with visual indicators
- Latency monitoring per LLM call
- Click-to-expand JSON span details
- Supports any OpenTelemetry-instrumented LLM (Ollama, OpenAI, etc.)
- Dense, aligned table layout with "Chart" buttons
- Inline "Cardinality" column showing label dimensions and series count
- Cardinality Explorer:
- Deep-dive into metric attributes
- Label Analysis: View high-cardinality labels and their top values (expandable)
- Raw Series: Scrollable view of all active series in PromQL-like syntax
- Export: Copy PromQL or Download JSON for offline analysis
- RED metrics (Rate, Errors, Duration) with P50/P95 latencies
- Inline metric visualization
- Sortable columns with persistent filters
- Color-coded error rates
- Auto-detected node types (Client, Server, Database, Messaging)
- Interactive graph with zoom/pan
- Call counts between services
- Real-time topology updates
- Hard limit of 1000 unique metric names (configurable via
MAX_METRIC_CARDINALITY) - Visual warnings at 70% and 90%
- Drops metrics exceeding limit with tracking
- View and manage OpenTelemetry Collector configuration via the OpAMP protocol
- Real-time validation of collector configurations before applying
- Configuration templates for common use cases (default, prometheus-remote-write, etc.)
- View OpAMP server status and connected collector agents
- Apply configuration changes with diff preview
- Requires collector to be connected to the OpAMP server (configured in collector config)
Full REST API with OpenAPI 3.0 documentation:
- Swagger UI:
http://localhost:5005/docs - ReDoc:
http://localhost:5005/redoc - OpenAPI Spec:
http://localhost:5005/openapi.json
Generate clients in any language:
curl http://localhost:5005/openapi.json > openapi.json
openapi-generator-cli generate -i openapi.json -g python -o ./ollyscale-clientAll responses return OpenTelemetry-native JSON with full trace/span context.
- Backend: FastAPI (async), Redis with ZSTD compression + msgpack
- Frontend: Vanilla JavaScript, HTML, CSS
- Ingestion: OTLP/gRPC and OTLP/HTTP
- Storage: 30-minute TTL, sorted sets indexed by timestamp
- Correlation: Native trace/span/log linking
- Full OpenTelemetry Protocol compliance
- ResourceSpans, ResourceLogs, ResourceMetrics
- Spanmetrics integration for RED metrics
- OpAMP protocol support for remote collector configuration management
- No vendor lock-in
ollyScale uses pre-commit to maintain code quality:
# Setup (first time)
make precommit-setup
# Run checks manually
make lint
# Run with auto-fix
make lint-fixChecks include:
- Python: ruff (lint + format)
- YAML/JSON: validation + formatting
- Shell: shellcheck
- Docker: hadolint
- Helm: helm lint
- Go: golangci-lint
- Markdown: markdownlint
See docs/precommit.md for details.
ollyScale uses release-please for automated releases:
- Conventional Commits for version bumping
- Separate releases for each component
- Automatic Docker image builds and publishing
- Helm chart packaging and OCI registry publishing
- Cross-component dependency management via
bumpDependents
See docs/release-system.md for complete documentation.
GET /admin/stats- Redis memory, cardinality, uptimeGET/POST/DELETE /admin/alerts- Alert managementGET /health- Connectivity status
Dual Licensing:
- Original TinyOlly Code: BSD-3-Clause (see LICENSE-BSD3-ORIGINAL)
- ollyScale Modifications/Enhancements: AGPL-3.0 (see LICENSE)
See NOTICE for complete attribution and licensing information.






