Files
logwisp/doc/architecture.md

16 KiB

Architecture Overview

LogWisp implements a flexible pipeline architecture for real-time log processing and streaming.

Core Architecture

┌─────────────────────────────────────────────────────────────────────────┐
│                              LogWisp Service                            │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌─────────────────────────── Pipeline 1 ───────────────────────────┐   │
│  │                                                                  │   │
│  │  Sources           Filters              Sinks                    │   │
│  │  ┌──────┐        ┌────────┐          ┌──────┐                    │   │
│  │  │ Dir  │──┐     │Include │     ┌────│ HTTP │←── Client 1        │   │
│  │  └──────┘  │     │ ERROR  │     │    └──────┘                    │   │
│  │            ├────▶│  WARN  │────▶├────┌──────┐                    │   │
│  │  ┌──────┐  │     └────────┘     │    │ File │                    │   │
│  │  │ File │──┘          ▼         │    └──────┘                    │   │
│  │  └──────┘        ┌────────┐     │    ┌──────┐                    │   │
│  │                  │Exclude │     └────│ TCP  │←── Client 2        │   │
│  │                  │ DEBUG  │          └──────┘                    │   │
│  │                  └────────┘                                      │   │
│  └──────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  ┌─────────────────────────── Pipeline 2 ───────────────────────────┐   │
│  │                                                                  │   │
│  │  ┌──────┐                            ┌──────┐                    │   │
│  │  │Stdin │────────────────────────────│Stdout│                    │   │
│  │  └──────┘         (No Filters)       └──────┘                    │   │
│  └──────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  ┌─────────────────────────── Pipeline N ───────────────────────────┐   │
│  │  Multiple Sources → Filter Chain → Multiple Sinks                │   │
│  └──────────────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────────────┘

Data Flow

Log Entry Flow:

┌─────────┐     ┌─────────┐     ┌─────────┐     ┌─────────┐
│  File   │     │  Parse  │     │ Filter  │     │ Format  │
│ Watcher │────▶│  Entry  │────▶│  Chain  │────▶│  Send   │
└─────────┘     └─────────┘     └─────────┘     └─────────┘
     │               │               │               │
     ▼               ▼               ▼               ▼
  Detect         Extract         Include/        Deliver to
  Changes        Timestamp       Exclude         Clients
                 & Level         Patterns


Entry Processing:

1. Source Detection     2. Entry Creation      3. Filter Application
   ┌──────────┐           ┌────────────┐         ┌─────────────┐
   │New Entry │           │ Timestamp  │         │  Filter 1   │
   │Detected  │──────────▶│   Level    │────────▶│ Include?    │
   └──────────┘           │  Message   │         └──────┬──────┘
                          └────────────┘                │
                                                        ▼
4. Sink Distribution                             ┌─────────────┐
   ┌──────────┐                                  │  Filter 2   │
   │   HTTP   │◀───┐                             │ Exclude?    │
   └──────────┘    │                             └──────┬──────┘
   ┌──────────┐    │                                    │
   │   TCP    │◀───┼────────── Entry ◀──────────────────┘
   └──────────┘    │           (if passed)
   ┌──────────┐    │
   │   File   │◀───┘
   └──────────┘

Component Details

Sources

Sources monitor inputs and generate log entries:

Directory Source:
┌─────────────────────────────────┐
│        Directory Monitor        │
├─────────────────────────────────┤
│ • Pattern Matching (*.log)      │
│ • File Rotation Detection       │
│ • Position Tracking             │
│ • Concurrent File Watching      │
└─────────────────────────────────┘
           │
           ▼
    ┌──────────────┐
    │ File Watcher │ (per file)
    ├──────────────┤
    │ • Read New   │
    │ • Track Pos  │
    │ • Detect Rot │
    └──────────────┘

Filters

Filters process entries through pattern matching:

Filter Chain:
                 ┌─────────────┐
Entry ──────────▶│  Filter 1   │
                 │  (Include)  │
                 └──────┬──────┘
                        │ Pass?
                        ▼
                 ┌─────────────┐
                 │  Filter 2   │
                 │  (Exclude)  │
                 └──────┬──────┘
                        │ Pass?
                        ▼
                 ┌─────────────┐
                 │  Filter N   │
                 └──────┬──────┘
                        │
                        ▼
                    To Sinks

Sinks

Sinks deliver processed entries to destinations:

HTTP Sink (SSE):
┌───────────────────────────────────┐
│            HTTP Server            │
├───────────────────────────────────┤
│    ┌─────────┐    ┌─────────┐     │
│    │ Stream  │    │ Status  │     │
│    │Endpoint │    │Endpoint │     │
│    └────┬────┘    └────┬────┘     │
│         │              │          │
│    ┌────▼──────────────▼────┐     │
│    │   Connection Manager   │     │
│    ├────────────────────────┤     │
│    │ • Rate Limiting        │     │
│    │ • Heartbeat            │     │
│    │ • Buffer Management    │     │
│    └────────────────────────┘     │
└───────────────────────────────────┘

TCP Sink:
┌───────────────────────────────────┐
│            TCP Server             │
├───────────────────────────────────┤
│    ┌────────────────────────┐     │
│    │    gnet Event Loop     │     │
│    ├────────────────────────┤     │
│    │ • Async I/O            │     │
│    │ • Connection Pool      │     │
│    │ • Rate Limiting        │     │
│    └────────────────────────┘     │
└───────────────────────────────────┘

Router Mode

In router mode, multiple pipelines share HTTP ports:

Router Architecture:
                    ┌─────────────────┐
                    │   HTTP Router   │
                    │    Port 8080    │
                    └────────┬────────┘
                             │
        ┌────────────────────┼────────────────────┐
        │                    │                    │
   /app/stream          /db/stream         /sys/stream
        │                    │                    │
   ┌────▼────┐         ┌────▼────┐         ┌────▼────┐
   │Pipeline │         │Pipeline │         │Pipeline │
   │  "app"  │         │  "db"   │         │  "sys"  │
   └─────────┘         └─────────┘         └─────────┘

Path Routing:
Client Request ──▶ Router ──▶ Parse Path ──▶ Find Pipeline ──▶ Route
                                  │
                                  ▼
                           Extract Pipeline Name
                           from /pipeline/endpoint

Memory Management

Buffer Flow:
┌──────────┐     ┌──────────┐     ┌──────────┐
│  Source  │     │ Pipeline │     │   Sink   │
│  Buffer  │────▶│  Buffer  │────▶│  Buffer  │
│ (1000)   │     │  (chan)  │     │ (1000)   │
└──────────┘     └──────────┘     └──────────┘
     │                │                 │
     ▼                ▼                 ▼
 Drop if full    Backpressure      Drop if full
 (counted)        (blocking)        (counted)

Rate Limiting

Token Bucket Algorithm:
┌─────────────────────────────┐
│        Token Bucket         │
├─────────────────────────────┤
│ Capacity: burst_size        │
│ Refill: requests_per_second │
│                             │
│   ┌─────────────────────┐   │
│   │ ● ● ● ● ● ● ○ ○ ○ ○ │   │
│   └─────────────────────┘   │
│    6/10 tokens available    │
└─────────────────────────────┘
         │
         ▼
   Request arrives
         │
         ▼
   Token available? ──No──▶ Reject (429)
         │
        Yes
         ▼
   Consume token ──▶ Allow request

Concurrency Model

Goroutine Structure:

Main ────┬──── Pipeline 1 ────┬──── Source Reader 1
         │                    ├──── Source Reader 2
         │                    ├──── Filter Processor
         │                    ├──── HTTP Server
         │                    └──── TCP Server
         │
         ├──── Pipeline 2 ────┬──── Source Reader
         │                    └──── Sink Writers
         │
         └──── HTTP Router (if enabled)

Channel Communication:
Source ──chan──▶ Filter ──chan──▶ Sink
  │                                 │
  └── Non-blocking send ────────────┘
      (drop & count if full)

Configuration Loading

Priority Order:
1. CLI Flags ─────────┐
2. Environment Vars ──┼──▶ Merge ──▶ Final Config
3. Config File ───────┤
4. Defaults ──────────┘

Example:
CLI:     --log-level debug
Env:     LOGWISP_PIPELINES_0_NAME=app
File:    pipelines.toml
Default: buffer_size = 1000

Security Architecture

Security Layers:

┌─────────────────────────────────────┐
│         Network Layer               │
├─────────────────────────────────────┤
│ • Rate Limiting (per IP/global)     │
│ • Connection Limits                 │
│ • TLS/SSL (planned)                 │
└──────────────┬──────────────────────┘
               │
┌──────────────▼──────────────────────┐
│      Authentication Layer           │
├─────────────────────────────────────┤
│ • Basic Auth (planned)              │
│ • Bearer Tokens (planned)           │
│ • IP Whitelisting (planned)         │
└──────────────┬──────────────────────┘
               │
┌──────────────▼──────────────────────┐
│      Application Layer              │
├─────────────────────────────────────┤
│ • Input Validation                  │
│ • Path Traversal Prevention         │
│ • Resource Limits                   │
└─────────────────────────────────────┘