mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-07-28 13:12:01 +08:00
97 lines
3.6 KiB
Go
97 lines
3.6 KiB
Go
package querier
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/SigNoz/signoz/pkg/errors"
|
|
"github.com/SigNoz/signoz/pkg/prometheus"
|
|
"github.com/SigNoz/signoz/pkg/telemetrystore"
|
|
"github.com/SigNoz/signoz/pkg/types/telemetrytypes"
|
|
|
|
qbtypes "github.com/SigNoz/signoz/pkg/types/querybuildertypes/querybuildertypesv5"
|
|
)
|
|
|
|
type querier struct {
|
|
telemetryStore telemetrystore.TelemetryStore
|
|
metadataStore telemetrytypes.MetadataStore
|
|
promEngine prometheus.Prometheus
|
|
traceStmtBuilder qbtypes.StatementBuilder[qbtypes.TraceAggregation]
|
|
logStmtBuilder qbtypes.StatementBuilder[qbtypes.LogAggregation]
|
|
metricStmtBuilder qbtypes.StatementBuilder[qbtypes.MetricAggregation]
|
|
}
|
|
|
|
func NewQuerier(
|
|
telemetryStore telemetrystore.TelemetryStore,
|
|
metadataStore telemetrytypes.MetadataStore,
|
|
promEngine prometheus.Prometheus,
|
|
traceStmtBuilder qbtypes.StatementBuilder[qbtypes.TraceAggregation],
|
|
logStmtBuilder qbtypes.StatementBuilder[qbtypes.LogAggregation],
|
|
metricStmtBuilder qbtypes.StatementBuilder[qbtypes.MetricAggregation],
|
|
) *querier {
|
|
return &querier{
|
|
telemetryStore: telemetryStore,
|
|
metadataStore: metadataStore,
|
|
promEngine: promEngine,
|
|
traceStmtBuilder: traceStmtBuilder,
|
|
logStmtBuilder: logStmtBuilder,
|
|
metricStmtBuilder: metricStmtBuilder,
|
|
}
|
|
}
|
|
|
|
func (q *querier) QueryRange(ctx context.Context, orgID string, req *qbtypes.QueryRangeRequest) (*qbtypes.QueryRangeResponse, error) {
|
|
|
|
queries := make(map[string]qbtypes.Query)
|
|
|
|
for _, query := range req.CompositeQuery.Queries {
|
|
switch query.Type {
|
|
case qbtypes.QueryTypePromQL:
|
|
promQuery, ok := query.Spec.(qbtypes.PromQuery)
|
|
if !ok {
|
|
return nil, errors.NewInvalidInputf(errors.CodeInvalidInput, "invalid promql query spec %T", query.Spec)
|
|
}
|
|
promqlQuery := newPromqlQuery(q.promEngine, promQuery, qbtypes.TimeRange{From: req.Start, To: req.End}, req.RequestType)
|
|
queries[query.Name] = promqlQuery
|
|
case qbtypes.QueryTypeClickHouseSQL:
|
|
chQuery, ok := query.Spec.(qbtypes.ClickHouseQuery)
|
|
if !ok {
|
|
return nil, errors.NewInvalidInputf(errors.CodeInvalidInput, "invalid clickhouse query spec %T", query.Spec)
|
|
}
|
|
chSQLQuery := newchSQLQuery(q.telemetryStore, chQuery, nil, qbtypes.TimeRange{From: req.Start, To: req.End}, req.RequestType)
|
|
queries[query.Name] = chSQLQuery
|
|
case qbtypes.QueryTypeBuilder:
|
|
switch spec := query.Spec.(type) {
|
|
case qbtypes.QueryBuilderQuery[qbtypes.TraceAggregation]:
|
|
bq := newBuilderQuery(q.telemetryStore, q.traceStmtBuilder, spec, qbtypes.TimeRange{From: req.Start, To: req.End}, req.RequestType)
|
|
queries[query.Name] = bq
|
|
|
|
case qbtypes.QueryBuilderQuery[qbtypes.LogAggregation]:
|
|
bq := newBuilderQuery(q.telemetryStore, q.logStmtBuilder, spec, qbtypes.TimeRange{From: req.Start, To: req.End}, req.RequestType)
|
|
queries[query.Name] = bq
|
|
|
|
case qbtypes.QueryBuilderQuery[qbtypes.MetricAggregation]:
|
|
bq := newBuilderQuery(q.telemetryStore, q.metricStmtBuilder, spec, qbtypes.TimeRange{From: req.Start, To: req.End}, req.RequestType)
|
|
queries[query.Name] = bq
|
|
default:
|
|
return nil, errors.NewInvalidInputf(errors.CodeInvalidInput, "unsupported builder spec type %T", query.Spec)
|
|
}
|
|
}
|
|
}
|
|
return q.run(ctx, orgID, queries, req.RequestType)
|
|
}
|
|
|
|
func (q *querier) run(ctx context.Context, _ string, qs map[string]qbtypes.Query, kind qbtypes.RequestType) (*qbtypes.QueryRangeResponse, error) {
|
|
results := make([]*qbtypes.Result, 0, len(qs))
|
|
for _, query := range qs {
|
|
// TODO: run in controlled batches
|
|
result, err := query.Execute(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
results = append(results, result)
|
|
}
|
|
return &qbtypes.QueryRangeResponse{
|
|
Type: kind,
|
|
Data: results,
|
|
}, nil
|
|
}
|