βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Browser β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Vue 3 + Vite Frontend β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββ β β
β β β Monaco Editorβ β ECharts β β Vue Routerβ β β
β β β (PromQL) β β (Charts) β β β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββ β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β PromQL Workbench Component β β β
β β β - Editor Panel β β β
β β β - Analysis Panel (AST, Dependencies, Issues) β β β
β β β - Results Panel (Charts, Tables) β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β HTTP/REST API
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Cloudwego (Hertz) Backend β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β HTTP Server β β
β β - CORS Middleware β β
β β - Request/Response Handling β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Handler Layer β β
β β - ParsePromQL Handler β β
β β - QueryRange Handler β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Business Logic Layer β β
β β ββββββββββββββββ ββββββββββββββββ β β
β β β Parser β β Analyzer β β β
β β β Module β β Module β β β
β β β β β β β β
β β β - Parse β β - Dependency β β β
β β β - Format β β Extraction β β β
β β β - AST β β - Issues β β β
β β β Conversion β β Detection β β β
β β ββββββββββββββββ ββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Prometheus Parser Library β β
β β - Official PromQL Parser β β
β β - AST Generation β β
β β - Expression Validation β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β (Optional)
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β External Services β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β Prometheus β β Thanos β βVictoriaMetricsβ β
β β β β β β β β
β β Query API β β Query API β β Query API β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
User Input (PromQL)
β
βΌ
ββββββββββββββββ
β Monaco Editorβ
ββββββββββββββββ
β
β POST /api/promql/parse
β { query, options: { format, analyze } }
βΌ
ββββββββββββββββ
β Hertz Server β
ββββββββββββββββ
β
βΌ
ββββββββββββββββ
β Handler β
β - Validate β
β - Dispatch β
ββββββββββββββββ
β
βββββββββββββββββββ
β β
βΌ βΌ
ββββββββββββββββ ββββββββββββββββ
β Parser β β Analyzer β
β β β β
β - Parse β β - Extract β
β - Format β β Metrics β
β - AST β JSON β β - Check β
ββββββββββββββββ β Issues β
β ββββββββββββββββ
β β
ββββββββββ¬βββββββββ
β
βΌ
ββββββββββββββββ
β Response β
β { formatted, β
β ast, β
β deps, β
β issues } β
ββββββββββββββββ
β
βΌ
ββββββββββββββββ
β Frontend β
β - Update UI β
β - Show AST β
β - Show Issuesβ
ββββββββββββββββ
User Click "Run"
β
βΌ
ββββββββββββββββ
β Frontend β
β - Get Query β
β - Get Time β
β Range β
ββββββββββββββββ
β
β POST /api/query/range
β { query, start, end, step, datasource }
βΌ
ββββββββββββββββ
β Hertz Server β
ββββββββββββββββ
β
βΌ
ββββββββββββββββ
β Handler β
β - Validate β
β - Proxy to β
β Prometheusβ
ββββββββββββββββ
β
βΌ
ββββββββββββββββ
β Prometheus β
β Query API β
ββββββββββββββββ
β
βΌ
ββββββββββββββββ
β Response β
β { status, β
β data: { β
β result β
β } } β
ββββββββββββββββ
β
βΌ
ββββββββββββββββ
β Frontend β
β - ECharts β
β - Table β
ββββββββββββββββ
- Component: Monaco Editor integration
- Responsibilities:
- PromQL syntax highlighting
- Code completion
- Error highlighting
- Format on demand
- Components: ASTTree, Dependencies, Issues
- Responsibilities:
- AST visualization
- Dependency display
- Issue presentation
- Interactive highlighting
- Component: QueryResults
- Responsibilities:
- Chart rendering (ECharts)
- Table view
- Data filtering
- Location:
internal/promql/parser/ - Responsibilities:
- Parse PromQL string
- Format PromQL
- Convert AST to JSON DTO
- Error handling
- Location:
internal/promql/analyzer/ - Responsibilities:
- Extract dependencies
- Detect issues
- Static analysis rules
- Performance hints
- Location:
internal/handler/ - Responsibilities:
- HTTP request handling
- Request validation
- Response formatting
- Error responses
- Location:
internal/dto/ - Responsibilities:
- Request/Response structures
- Type definitions
- JSON serialization
- Framework: Vue 3 (Composition API)
- Build Tool: Vite
- Language: TypeScript
- Editor: Monaco Editor
- Charts: ECharts
- State: Pinia
- Router: Vue Router
- Framework: Cloudwego (Hertz)
- Language: Go 1.21+
- Parser: Prometheus PromQL Parser
- JSON: Sonic (high-performance JSON)
Request:
{
"query": "sum(rate(http_requests_total[5m]))",
"dialect": "prometheus",
"options": {
"format": true,
"analyze": true
}
}Response:
{
"formatted": "sum(rate(http_requests_total[5m]))",
"ast": {
"type": "AggregateExpr",
"op": "sum",
"expr": {
"type": "Call",
"op": "rate",
"args": [...]
}
},
"dependencies": {
"metrics": ["http_requests_total"],
"labels": [],
"functions": ["rate"],
"aggregations": ["sum"]
},
"issues": []
}Request:
{
"query": "sum(rate(http_requests_total[5m]))",
"start": 1700000000,
"end": 1700003600,
"step": 15,
"datasource": "default"
}Response:
{
"status": "success",
"data": {
"resultType": "matrix",
"result": [
{
"metric": {},
"values": [[1700000000, "1.23"]]
}
]
}
}βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Load Balancer β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββ΄ββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββββββββββ βββββββββββββββββββββββββββ
β Frontend Server 1 β β Frontend Server 2 β
β (Nginx + Vue) β β (Nginx + Vue) β
βββββββββββββββββββββββββββ βββββββββββββββββββββββββββ
β β
βββββββββββββββββ¬ββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β API Gateway β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββ΄ββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββββββββββ βββββββββββββββββββββββββββ
β Backend Server 1 β β Backend Server 2 β
β (Cloudwego) β β (Cloudwego) β
βββββββββββββββββββββββββββ βββββββββββββββββββββββββββ
β β
βββββββββββββββββ¬ββββββββββββββββ
β
βββββββββββββββββΌββββββββββββββββ
β β β
βΌ βΌ βΌ
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Prometheus β β Thanos β βVictoriaMetrics β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
- Authentication: JWT-based authentication for API access
- Authorization: Role-based access control for datasources
- Rate Limiting: Per-user and per-datasource rate limits
- Input Validation: Strict validation of PromQL queries
- CORS: Configurable CORS policies
- Audit Logging: All queries logged for compliance
- Code splitting with dynamic imports
- Lazy loading of components
- Virtual scrolling for large datasets
- Debounced API calls
- Caching of parse results
- Connection pooling for Prometheus clients
- Caching of metadata
- Parallel processing of independent analyses
- Efficient AST traversal
- Streaming of large query results
- Metrics: Request latency, error rates, query complexity
- Logging: Structured logging with correlation IDs
- Tracing: Distributed tracing for request flows
- Health Checks: Liveness and readiness probes