Summary
Build the first version of an event-native log exploration pipeline for lapp.
The core idea is to treat each log line as an event with:
- raw text payload
- extracted attributes
- inferred metadata
This issue tracks the work needed to turn plain text logs into a searchable, filterable event stream with basic pattern grouping and drilldown-friendly metadata.
Goals
- Ingest plain text logs as structured events
- Extract stable metadata from text when no structured envelope exists
- Keep raw text as the source of truth
- Separate explicit parsed attributes from inferred metadata
- Enable basic exploration through timeline, facets, and event list views
Non-goals
- Perfect semantic extraction
- Full natural-language understanding of logs
- Complex multi-entity graph modeling in v1
- Advanced query language design
Proposed event model
{
"ts": "2026-03-10T21:00:00Z",
"text": "raw log line",
"attrs": {
"level": "error",
"service": "payments-api",
"env": "prod",
"request_id": "req_123",
"trace_id": "trace_456",
"user_id": "user_789",
"endpoint": "/checkout"
},
"inferred": {
"pattern": "user <id> failed to login",
"entity": "payments-api"
}
}
Design principles
- Raw text must always be preserved
attrs and inferred must stay separate
- Favor deterministic extraction over clever guessing
- Entity detection is a navigation aid, not ground truth
- The first version should optimize for usefulness, not completeness
Execution plan
Phase 1: Event schema
Phase 2: Ingestion foundation
Phase 3: Parser pipeline
Phase 4: Stable attribute extraction
Phase 5: Canonical normalization
Phase 6: Inference layer
Phase 7: Indexing and filtering
Phase 8: Minimal exploration UI
Phase 9: Quality and observability
Suggested milestone split
Milestone 1: Ingestion + schema
- Event schema
- Raw ingestion path
- Parser pipeline scaffold
Milestone 2: Basic extraction
- Timestamp
- Level
- Service
- Request / trace identifiers
- Canonical normalization
Milestone 3: Usable exploration
- Pattern extraction
- Basic indexing
- Timeline + facets + event list
- Click-to-filter
Acceptance criteria for v1
- A plain text log line can always be ingested as an event
- Common structured log formats can populate
attrs
- Users can filter events by time, level, service, and pattern
- Users can inspect raw text alongside extracted metadata
- Pattern grouping works well enough to reduce repeated noisy lines
Open questions
- What is the canonical field schema for lapp beyond the v1 core fields?
- Should inferred fields carry confidence scores in v1 or wait until v2?
- What storage/index model is best for raw text + extracted attrs + inferred fields?
- Should request/trace correlation be part of v1 or follow immediately after?
Summary
Build the first version of an event-native log exploration pipeline for lapp.
The core idea is to treat each log line as an event with:
This issue tracks the work needed to turn plain text logs into a searchable, filterable event stream with basic pattern grouping and drilldown-friendly metadata.
Goals
Non-goals
Proposed event model
{ "ts": "2026-03-10T21:00:00Z", "text": "raw log line", "attrs": { "level": "error", "service": "payments-api", "env": "prod", "request_id": "req_123", "trace_id": "trace_456", "user_id": "user_789", "endpoint": "/checkout" }, "inferred": { "pattern": "user <id> failed to login", "entity": "payments-api" } }Design principles
attrsandinferredmust stay separateExecution plan
Phase 1: Event schema
Phase 2: Ingestion foundation
Phase 3: Parser pipeline
Phase 4: Stable attribute extraction
Phase 5: Canonical normalization
service,service_name,service.name->attrs.service)production->prod, etc.)Phase 6: Inference layer
inferred.patternattrs.serviceas the primary entity when availablePhase 7: Indexing and filtering
Phase 8: Minimal exploration UI
Phase 9: Quality and observability
Suggested milestone split
Milestone 1: Ingestion + schema
Milestone 2: Basic extraction
Milestone 3: Usable exploration
Acceptance criteria for v1
attrsOpen questions