diff --git a/pkg/handler/clients.go b/pkg/handler/clients.go index 6ade05dcd..85d5d3c96 100644 --- a/pkg/handler/clients.go +++ b/pkg/handler/clients.go @@ -9,7 +9,7 @@ import ( "github.com/netobserv/network-observability-console-plugin/pkg/config" "github.com/netobserv/network-observability-console-plugin/pkg/handler/apierrors" "github.com/netobserv/network-observability-console-plugin/pkg/httpclient" - "github.com/netobserv/network-observability-console-plugin/pkg/loki" + "github.com/netobserv/network-observability-console-plugin/pkg/merger" "github.com/netobserv/network-observability-console-plugin/pkg/model" "github.com/netobserv/network-observability-console-plugin/pkg/prometheus" "github.com/prometheus/client_golang/api" @@ -53,7 +53,7 @@ func newLokiClients(cfg *config.Config, requestHeader http.Header, useLokiStatus return clients{loki: lokiClient} } -func (c *clients) fetchLokiSingle(logQL string, merger loki.Merger) (int, apierrors.StructuredError) { +func (c *clients) fetchLokiSingle(logQL string, merger merger.Merger) (int, apierrors.StructuredError) { qr, code, err := fetchLogQL(logQL, c.loki) if err != nil { return code, err @@ -71,7 +71,7 @@ func (c *clients) getPromClient(isDev bool) api.Client { return c.promAdmin } -func (c *clients) fetchPrometheusSingle(ctx context.Context, promQL *prometheus.Query, merger loki.Merger, client api.Client) (int, apierrors.StructuredError) { +func (c *clients) fetchPrometheusSingle(ctx context.Context, promQL *prometheus.Query, merger merger.Merger, client api.Client) (int, apierrors.StructuredError) { qr, code, err := prometheus.QueryMatrix(ctx, client, promQL) if err != nil { return code, apierrors.NewPromClientError(err) @@ -82,7 +82,7 @@ func (c *clients) fetchPrometheusSingle(ctx context.Context, promQL *prometheus. return code, nil } -func (c *clients) fetchSingle(ctx context.Context, logQL string, promQL *prometheus.Query, merger loki.Merger, isDev bool) (int, apierrors.StructuredError) { +func (c *clients) fetchSingle(ctx context.Context, logQL string, promQL *prometheus.Query, merger merger.Merger, isDev bool) (int, apierrors.StructuredError) { if promQL != nil { client := c.getPromClient(isDev) if client == nil { @@ -96,7 +96,7 @@ func (c *clients) fetchSingle(ctx context.Context, logQL string, promQL *prometh return c.fetchLokiSingle(logQL, merger) } -func (c *clients) fetchParallel(ctx context.Context, logQL []string, promQL []*prometheus.Query, merger loki.Merger, isDev bool) (int, apierrors.StructuredError) { +func (c *clients) fetchParallel(ctx context.Context, logQL []string, promQL []*prometheus.Query, merger merger.Merger, isDev bool) (int, apierrors.StructuredError) { type errorWithCode struct { err apierrors.StructuredError code int diff --git a/pkg/handler/topology.go b/pkg/handler/topology.go index f37dfd33b..a1d9a5d90 100644 --- a/pkg/handler/topology.go +++ b/pkg/handler/topology.go @@ -12,12 +12,14 @@ import ( "github.com/netobserv/network-observability-console-plugin/pkg/config" "github.com/netobserv/network-observability-console-plugin/pkg/handler/apierrors" "github.com/netobserv/network-observability-console-plugin/pkg/loki" + "github.com/netobserv/network-observability-console-plugin/pkg/merger" "github.com/netobserv/network-observability-console-plugin/pkg/metrics" "github.com/netobserv/network-observability-console-plugin/pkg/model" "github.com/netobserv/network-observability-console-plugin/pkg/model/fields" "github.com/netobserv/network-observability-console-plugin/pkg/model/filters" "github.com/netobserv/network-observability-console-plugin/pkg/prometheus" "github.com/netobserv/network-observability-console-plugin/pkg/utils/constants" + "github.com/netobserv/network-observability-console-plugin/pkg/utils/queryparams" v1 "github.com/prometheus/client_golang/api/prometheus/v1" ) @@ -82,8 +84,8 @@ func (h *Handlers) GetTopology(ctx context.Context) func(w http.ResponseWriter, } } -func (h *Handlers) extractTopologyQueryParams(params url.Values, ds constants.DataSource) (*loki.TopologyInput, filters.MultiQueries, v1.Range, int, error) { - in := loki.TopologyInput{DataSource: ds} +func (h *Handlers) extractTopologyQueryParams(params url.Values, ds constants.DataSource) (*queryparams.TopologyInput, filters.MultiQueries, v1.Range, int, error) { + in := queryparams.TopologyInput{DataSource: ds} qr := v1.Range{} var reqLimit int var err error @@ -161,7 +163,7 @@ func (h *Handlers) getTopologyFlows(ctx context.Context, cl clients, params url. return nil, http.StatusBadRequest, err } isDev := params.Get(namespaceKey) != "" - merger := loki.NewMatrixMerger(reqLimit) + mm := merger.NewMatrixMerger(reqLimit) if len(filterGroups) > 1 { // match any, and multiple filters => run in parallel then aggregate var lokiQ []string @@ -179,7 +181,7 @@ func (h *Handlers) getTopologyFlows(ctx context.Context, cl clients, params url. dataSources[constants.DataSourceLoki] = true } } - code, err := cl.fetchParallel(ctx, lokiQ, promQ, merger, isDev) + code, err := cl.fetchParallel(ctx, lokiQ, promQ, mm, isDev) if err != nil { return nil, code, err } @@ -199,13 +201,13 @@ func (h *Handlers) getTopologyFlows(ctx context.Context, cl clients, params url. if promQ != nil { dataSources[constants.DataSourceProm] = true } - code, err = cl.fetchSingle(ctx, lokiQ, promQ, merger, isDev) + code, err = cl.fetchSingle(ctx, lokiQ, promQ, mm, isDev) if err != nil { return nil, code, err } } - qresp := merger.Get() + qresp := mm.Get() qresp.Stats.DataSources = []constants.DataSource{} for str, ok := range dataSources { if ok { @@ -272,7 +274,7 @@ func buildTopologyQuery( cfg *config.Config, promInventory *prometheus.Inventory, filters filters.SingleQuery, - in *loki.TopologyInput, + in *queryparams.TopologyInput, qr *v1.Range, isDev bool, ) (string, *prometheus.Query, int, error) { @@ -310,7 +312,7 @@ func buildTopologyQuery( return EncodeQuery(qb.Build()), nil, http.StatusOK, nil } -func getEligiblePromMetric(kl map[string][]string, promInventory *prometheus.Inventory, filters filters.SingleQuery, in *loki.TopologyInput, isDev bool) (*prometheus.SearchResult, string) { +func getEligiblePromMetric(kl map[string][]string, promInventory *prometheus.Inventory, filters filters.SingleQuery, in *queryparams.TopologyInput, isDev bool) (*prometheus.SearchResult, string) { if in.DataSource != constants.DataSourceAuto && in.DataSource != constants.DataSourceProm { return nil, "" } diff --git a/pkg/loki/merger.go b/pkg/loki/merger.go deleted file mode 100644 index 572787df7..000000000 --- a/pkg/loki/merger.go +++ /dev/null @@ -1,10 +0,0 @@ -package loki - -import ( - "github.com/netobserv/network-observability-console-plugin/pkg/model" -) - -type Merger interface { - Add(from model.QueryResponseData) (model.ResultValue, error) - Get() *model.AggregatedQueryResponse -} diff --git a/pkg/loki/streams_merger.go b/pkg/loki/streams_merger.go index 03efda081..e5ee17dd2 100644 --- a/pkg/loki/streams_merger.go +++ b/pkg/loki/streams_merger.go @@ -9,7 +9,6 @@ import ( ) type StreamMerger struct { - Merger index map[string]indexedStream merged model.Streams stats []interface{} diff --git a/pkg/loki/topology_query.go b/pkg/loki/topology_query.go index d4e0c5247..151f888fc 100644 --- a/pkg/loki/topology_query.go +++ b/pkg/loki/topology_query.go @@ -7,43 +7,22 @@ import ( "github.com/netobserv/network-observability-console-plugin/pkg/config" "github.com/netobserv/network-observability-console-plugin/pkg/utils/constants" + "github.com/netobserv/network-observability-console-plugin/pkg/utils/queryparams" ) const ( topologyDefaultLimit = "100" ) -type TopologyInput struct { - Start string - End string - Top string - RateInterval string - Step string - DataField string - MetricFunction constants.MetricFunction - RecordType constants.RecordType - DataSource constants.DataSource - PacketLoss constants.PacketLoss - Aggregate string - Groups string -} - -func (in *TopologyInput) GetActualDataField() string { - switch in.DataField { - case constants.MetricTypeFlows, constants.MetricTypeDNSFlows, constants.MetricTypeTLSFlows: - return "" - default: - return in.DataField - } -} - +// TopologyQueryBuilder builds LogQL metric queries for topology views. type TopologyQueryBuilder struct { *FlowQueryBuilder - topology *TopologyInput + topology *queryparams.TopologyInput aggregateKeyLabels map[string][]string } -func NewTopologyQuery(cfg *config.Loki, kl map[string][]string, in *TopologyInput) (*TopologyQueryBuilder, error) { +// NewTopologyQuery creates a new TopologyQueryBuilder for the given Loki config and topology input. +func NewTopologyQuery(cfg *config.Loki, kl map[string][]string, in *queryparams.TopologyInput) (*TopologyQueryBuilder, error) { var rt constants.RecordType if slices.Contains(constants.AnyConnectionType, string(in.RecordType)) { rt = "endConnection" @@ -59,36 +38,7 @@ func NewTopologyQuery(cfg *config.Loki, kl map[string][]string, in *TopologyInpu }, nil } -func GetLabelsAndFilter(kl map[string][]string, aggregate, groups string) ([]string, string) { - var fields []string - var filter string - if fields = kl[aggregate]; fields == nil { - fields = []string{aggregate} - filter = aggregate - } - if groups != "" { - for gr, labels := range kl { - if strings.Contains(groups, gr) { - for _, label := range labels { - if !slices.Contains(fields, label) { - fields = append(fields, label) - } - } - } - } - } - return fields, filter -} - -func getFactor(metricType string) string { - switch metricType { - case constants.MetricTypeFlowRTT: - return "/1000000" // nanoseconds to milliseconds - default: - return "" - } -} - +// GetFunctionWithQuantile maps a MetricFunction to its LogQL function name and optional quantile value. func GetFunctionWithQuantile(metricFunction constants.MetricFunction) (string, string) { switch metricFunction { case constants.MetricFunctionCount: @@ -112,13 +62,23 @@ func GetFunctionWithQuantile(metricFunction constants.MetricFunction) (string, s } } +func getFactor(metricType string) string { + switch metricType { + case constants.MetricTypeFlowRTT: + return "/1000000" // nanoseconds to milliseconds + default: + return "" + } +} + +// Build constructs the full LogQL topology query URL string. func (q *TopologyQueryBuilder) Build() string { top := q.topology.Top if top == "" { top = topologyDefaultLimit } - labels, extraFilter := GetLabelsAndFilter(q.aggregateKeyLabels, q.topology.Aggregate, q.topology.Groups) + labels, extraFilter := queryparams.GetLabelsAndFilter(q.aggregateKeyLabels, q.topology.Aggregate, q.topology.Groups) if q.config.IsLabel(extraFilter) { extraFilter = "" } diff --git a/pkg/loki/topology_query_test.go b/pkg/loki/topology_query_test.go index 7f710ebe5..adba70fed 100644 --- a/pkg/loki/topology_query_test.go +++ b/pkg/loki/topology_query_test.go @@ -5,6 +5,7 @@ import ( "github.com/netobserv/network-observability-console-plugin/pkg/config" "github.com/netobserv/network-observability-console-plugin/pkg/utils/constants" + "github.com/netobserv/network-observability-console-plugin/pkg/utils/queryparams" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -29,7 +30,7 @@ var aggregateKeyLabels = map[string][]string{ } func TestBuildTopologyQuery_SimpleAggregate(t *testing.T) { - in := TopologyInput{ + in := queryparams.TopologyInput{ Start: "(start)", End: "", Top: "50", @@ -53,7 +54,7 @@ func TestBuildTopologyQuery_SimpleAggregate(t *testing.T) { } func TestBuildTopologyQuery_GroupsAndAggregate(t *testing.T) { - in := TopologyInput{ + in := queryparams.TopologyInput{ Start: "(start)", End: "", Top: "50", @@ -78,7 +79,7 @@ func TestBuildTopologyQuery_GroupsAndAggregate(t *testing.T) { } func TestBuildTopologyQuery_CustomAggregate(t *testing.T) { - in := TopologyInput{ + in := queryparams.TopologyInput{ Start: "(start)", End: "", Top: "50", @@ -102,7 +103,7 @@ func TestBuildTopologyQuery_CustomAggregate(t *testing.T) { } func TestBuildTopologyQuery_CustomLabelAggregate(t *testing.T) { - in := TopologyInput{ + in := queryparams.TopologyInput{ Start: "(start)", End: "", Top: "50", @@ -126,7 +127,7 @@ func TestBuildTopologyQuery_CustomLabelAggregate(t *testing.T) { } func TestBuildTopologyQuery_TlsFlowsOwnerPlusTlsVersionAggregate(t *testing.T) { - in := TopologyInput{ + in := queryparams.TopologyInput{ Start: "(start)", End: "", Top: "50", diff --git a/pkg/loki/matrix_merger.go b/pkg/merger/matrix_merger.go similarity index 86% rename from pkg/loki/matrix_merger.go rename to pkg/merger/matrix_merger.go index d567de5a8..b7145f20e 100644 --- a/pkg/loki/matrix_merger.go +++ b/pkg/merger/matrix_merger.go @@ -1,4 +1,4 @@ -package loki +package merger import ( "fmt" @@ -9,9 +9,8 @@ import ( "github.com/netobserv/network-observability-console-plugin/pkg/model" ) -// MatrixMerger stores a state to build unique Matrix from multiple ones +// MatrixMerger aggregates multiple Matrix results from Loki or Prometheus queries. type MatrixMerger struct { - Merger index map[string]indexedSampleStream merged model.Matrix stats []interface{} @@ -20,6 +19,7 @@ type MatrixMerger struct { limitReached bool } +// NewMatrixMerger creates a new MatrixMerger with the given per-query result limit. func NewMatrixMerger(reqLimit int) *MatrixMerger { return &MatrixMerger{ reqLimit: reqLimit, @@ -35,10 +35,11 @@ type indexedSampleStream struct { index int } +// Add merges a new QueryResponseData (Matrix result) into the aggregated result. func (m *MatrixMerger) Add(from model.QueryResponseData) (model.ResultValue, error) { matrix, ok := from.Result.(model.Matrix) if !ok { - return nil, fmt.Errorf("loki returned an unexpected type for MatrixMerger: %T", from) + return nil, fmt.Errorf("unexpected result type for MatrixMerger: %T", from) } m.numQueries++ @@ -75,6 +76,7 @@ func (m *MatrixMerger) Add(from model.QueryResponseData) (model.ResultValue, err return m.merged, nil } +// Get returns the final aggregated AggregatedQueryResponse. func (m *MatrixMerger) Get() *model.AggregatedQueryResponse { for idx, stream := range m.merged { skey := stream.Metric.String() diff --git a/pkg/loki/matrix_merger_test.go b/pkg/merger/matrix_merger_test.go similarity index 82% rename from pkg/loki/matrix_merger_test.go rename to pkg/merger/matrix_merger_test.go index e58ee5052..d0978439c 100644 --- a/pkg/loki/matrix_merger_test.go +++ b/pkg/merger/matrix_merger_test.go @@ -1,4 +1,4 @@ -package loki +package merger import ( "testing" @@ -11,9 +11,13 @@ import ( "github.com/netobserv/network-observability-console-plugin/pkg/model" ) +func qrData(result model.ResultValue) model.QueryResponseData { + return model.QueryResponseData{Result: result} +} + func TestMatrixMerge(t *testing.T) { now := pmodel.Now() - merger := NewMatrixMerger(100) + m := NewMatrixMerger(100) baseline := pmodel.SampleStream{ Metric: pmodel.Metric{ "foo": "bar", @@ -23,11 +27,11 @@ func TestMatrixMerge(t *testing.T) { Value: pmodel.SampleValue(42), }}, } - _, err := merger.Add(qrData(model.Matrix{baseline})) + _, err := m.Add(qrData(model.Matrix{baseline})) require.NoError(t, err) // Different metric, different value pair => no dedup - _, err = merger.Add(qrData(model.Matrix{{ + _, err = m.Add(qrData(model.Matrix{{ Metric: pmodel.Metric{ "foo": "bar", "foo2": "bar2", @@ -41,7 +45,7 @@ func TestMatrixMerge(t *testing.T) { }}, }})) require.NoError(t, err) - result := merger.Get().Result.(model.Matrix) + result := m.Get().Result.(model.Matrix) assert.Len(t, result, 2) assert.Len(t, result[0].Values, 1) assert.Equal(t, result[0].Values[0].Value, pmodel.SampleValue(54)) @@ -49,7 +53,7 @@ func TestMatrixMerge(t *testing.T) { assert.Equal(t, result[1].Values[0].Value, pmodel.SampleValue(42)) // Same metrics in different order => no dedup - _, err = merger.Add(qrData(model.Matrix{{ + _, err = m.Add(qrData(model.Matrix{{ Metric: pmodel.Metric{ "foo2": "bar2", "foo": "bar", @@ -69,7 +73,7 @@ func TestMatrixMerge(t *testing.T) { Values: baseline.Values, }})) require.NoError(t, err) - result = merger.Get().Result.(model.Matrix) + result = m.Get().Result.(model.Matrix) assert.Len(t, result, 2) assert.Len(t, result[0].Values, 1) assert.Equal(t, result[0].Values[0].Value, pmodel.SampleValue(54)) @@ -77,7 +81,7 @@ func TestMatrixMerge(t *testing.T) { assert.Equal(t, result[1].Values[0].Value, pmodel.SampleValue(168)) // Different timestamp => no dedup - _, err = merger.Add(qrData(model.Matrix{{ + _, err = m.Add(qrData(model.Matrix{{ Metric: baseline.Metric, Values: []pmodel.SamplePair{{ Timestamp: now.Add(time.Hour), @@ -85,7 +89,7 @@ func TestMatrixMerge(t *testing.T) { }}, }})) require.NoError(t, err) - result = merger.Get().Result.(model.Matrix) + result = m.Get().Result.(model.Matrix) assert.Len(t, result, 2) assert.Len(t, result[0].Values, 2) assert.Equal(t, result[0].Values[0].Value, pmodel.SampleValue(54)) @@ -94,7 +98,7 @@ func TestMatrixMerge(t *testing.T) { assert.Equal(t, result[1].Values[0].Value, pmodel.SampleValue(168)) // no dedup - _, err = merger.Add(qrData(model.Matrix{{ + _, err = m.Add(qrData(model.Matrix{{ // changed value => no dedup Metric: baseline.Metric, Values: []pmodel.SamplePair{{ @@ -122,7 +126,7 @@ func TestMatrixMerge(t *testing.T) { // Different timestamp require.NoError(t, err) - result = merger.Get().Result.(model.Matrix) + result = m.Get().Result.(model.Matrix) assert.Len(t, result, 2) assert.Len(t, result[0].Values, 2) assert.Equal(t, result[0].Values[0].Value, pmodel.SampleValue(104)) @@ -133,7 +137,7 @@ func TestMatrixMerge(t *testing.T) { func TestMatrixLimitReached(t *testing.T) { now := pmodel.Now() - merger := NewMatrixMerger(2) + m := NewMatrixMerger(2) // Single entry => should not reach limit first := pmodel.SampleStream{ @@ -145,12 +149,12 @@ func TestMatrixLimitReached(t *testing.T) { Value: pmodel.SampleValue(42), }}, } - _, err := merger.Add(qrData(model.Matrix{first})) + _, err := m.Add(qrData(model.Matrix{first})) require.NoError(t, err) - assert.False(t, merger.limitReached) + assert.False(t, m.limitReached) // Another single entry => limit still not reached (even if total is 2) - _, err = merger.Add(qrData(model.Matrix{pmodel.SampleStream{ + _, err = m.Add(qrData(model.Matrix{pmodel.SampleStream{ Metric: pmodel.Metric{ "foo": "bar", }, @@ -160,10 +164,10 @@ func TestMatrixLimitReached(t *testing.T) { }}, }})) require.NoError(t, err) - assert.False(t, merger.limitReached) + assert.False(t, m.limitReached) // 2 entries => limit reached - _, err = merger.Add(qrData(model.Matrix{pmodel.SampleStream{ + _, err = m.Add(qrData(model.Matrix{pmodel.SampleStream{ Metric: pmodel.Metric{ "foo": "bar", }, @@ -181,10 +185,10 @@ func TestMatrixLimitReached(t *testing.T) { }}, }})) require.NoError(t, err) - assert.True(t, merger.limitReached) + assert.True(t, m.limitReached) // Another single entry => limit still reached - _, err = merger.Add(qrData(model.Matrix{pmodel.SampleStream{ + _, err = m.Add(qrData(model.Matrix{pmodel.SampleStream{ Metric: pmodel.Metric{ "foo": "bar", }, @@ -194,5 +198,5 @@ func TestMatrixLimitReached(t *testing.T) { }}, }})) require.NoError(t, err) - assert.True(t, merger.limitReached) + assert.True(t, m.limitReached) } diff --git a/pkg/merger/merger.go b/pkg/merger/merger.go new file mode 100644 index 000000000..12a3d65f1 --- /dev/null +++ b/pkg/merger/merger.go @@ -0,0 +1,13 @@ +// Package merger provides interfaces and implementations for aggregating +// query responses from multiple storage backends (Loki, Prometheus). +package merger + +import ( + "github.com/netobserv/network-observability-console-plugin/pkg/model" +) + +// Merger aggregates multiple storage query responses into a single result. +type Merger interface { + Add(from model.QueryResponseData) (model.ResultValue, error) + Get() *model.AggregatedQueryResponse +} diff --git a/pkg/model/loki.go b/pkg/model/loki.go index 63553ff9a..4a022e83a 100644 --- a/pkg/model/loki.go +++ b/pkg/model/loki.go @@ -1,3 +1,4 @@ +// Package model contains data models for Loki-specific types (streams, entries, and label responses). package model import ( @@ -6,8 +7,6 @@ import ( "time" json "github.com/json-iterator/go" - "github.com/netobserv/network-observability-console-plugin/pkg/utils/constants" - "github.com/prometheus/common/model" ) type FlowLineMapping = func(string) string @@ -16,157 +15,30 @@ var ( flowLineMappings = []FlowLineMapping{} ) +// AddFlowLineMapping registers a function that transforms Loki log lines before parsing. func AddFlowLineMapping(f FlowLineMapping) { flowLineMappings = append(flowLineMappings, f) } -// QueryResponse represents the http json response to a logQL query -type QueryResponse struct { - Status string `json:"status"` - Data QueryResponseData `json:"data"` -} - -// AggregatedQueryResponse represents the modified json response to one or more logQL queries -type AggregatedQueryResponse struct { - ResultType ResultType `json:"resultType"` - Result ResultValue `json:"result"` - Stats AggregatedStats `json:"stats"` - UnixTimestamp int64 `json:"unixTimestamp"` -} - -// AggregatedStats represents the stats to one or more logQL queries -type AggregatedStats struct { - NumQueries int `json:"numQueries"` - TotalEntries int `json:"totalEntries"` - Duplicates int `json:"duplicates"` - LimitReached bool `json:"limitReached"` - QueriesStats []interface{} `json:"queriesStats"` - DataSources []constants.DataSource `json:"dataSources"` -} - -// ResultType holds the type of the result -type ResultType string - -// ResultType values -const ( - ResultTypeStream = "streams" - ResultTypeScalar = "scalar" - ResultTypeVector = "vector" - ResultTypeMatrix = "matrix" -) - -// ResultValue interface mimics the promql.Value interface -type ResultValue interface { - Type() ResultType -} - -// QueryResponseData represents the http json response to a label query -type QueryResponseData struct { - ResultType ResultType `json:"resultType"` - Result ResultValue `json:"result"` - Stats interface{} `json:"-"` -} - -// Type implements the promql.Value interface -func (Streams) Type() ResultType { return ResultTypeStream } - -// Type implements the promql.Value interface -func (Scalar) Type() ResultType { return ResultTypeScalar } - -// Type implements the promql.Value interface -func (Vector) Type() ResultType { return ResultTypeVector } - -// Type implements the promql.Value interface -func (Matrix) Type() ResultType { return ResultTypeMatrix } - // Streams is a slice of Stream type Streams []Stream -// Stream represents a log stream. It includes a set of log entries and their labels. +// Stream represents a Loki log stream. It includes a set of log entries and their labels. type Stream struct { Labels map[string]string `json:"stream"` Entries []Entry `json:"values"` } -// Entry represents a log entry. It includes a log message and the time it occurred at. +// Entry represents a Loki log entry. It includes a log message and the time it occurred at. type Entry struct { Timestamp time.Time Line string } -// UnmarshalJSON implements the json.Unmarshaler interface. -func (q *QueryResponseData) UnmarshalJSON(data []byte) error { - t, result, stats, err := unmarshalQueryResponseData(data) - if err != nil { - return err - } - q.ResultType = t - q.Result = result - q.Stats = stats - - return nil -} - -// UnmarshalJSON implements the json.Unmarshaler interface. -func (q *AggregatedQueryResponse) UnmarshalJSON(data []byte) error { - t, result, _, err := unmarshalQueryResponseData(data) - if err != nil { - return err - } - q.ResultType = t - q.Result = result - - return nil -} - -func unmarshalQueryResponseData(data []byte) (ResultType, ResultValue, interface{}, error) { - unmarshal := struct { - Type ResultType `json:"resultType"` - Result json.RawMessage `json:"result"` - Stats interface{} `json:"stats"` - }{} - - err := json.Unmarshal(data, &unmarshal) - if err != nil { - return "", nil, nil, err - } - - var value ResultValue - - // unmarshal results - switch unmarshal.Type { - case ResultTypeStream: - var s Streams - err = json.Unmarshal(unmarshal.Result, &s) - for _, mapping := range flowLineMappings { - for i := range s { - for ii := range s[i].Entries { - s[i].Entries[ii].Line = mapping(s[i].Entries[ii].Line) - } - } - } - value = s - case ResultTypeMatrix: - var m Matrix - err = json.Unmarshal(unmarshal.Result, &m) - value = m - case ResultTypeVector: - var v Vector - err = json.Unmarshal(unmarshal.Result, &v) - value = v - case ResultTypeScalar: - var v Scalar - err = json.Unmarshal(unmarshal.Result, &v) - value = v - default: - return "", nil, nil, fmt.Errorf("unknown type: %s", unmarshal.Type) - } - - if err != nil { - return "", nil, nil, err - } - - return unmarshal.Type, value, unmarshal.Stats, nil +// LabelValuesResponse represents the http json response to a Loki query for label values +type LabelValuesResponse struct { + Status string `json:"status"` + Data []string `json:"data"` } // MarshalJSON implements the json.Marshaler interface. @@ -197,31 +69,3 @@ func (e *Entry) UnmarshalJSON(data []byte) error { return nil } - -// Scalar is a single timestamp/float with no labels -type Scalar model.Scalar - -func (s Scalar) MarshalJSON() ([]byte, error) { - return model.Scalar(s).MarshalJSON() -} - -func (s *Scalar) UnmarshalJSON(b []byte) error { - var v model.Scalar - if err := v.UnmarshalJSON(b); err != nil { - return err - } - *s = Scalar(v) - return nil -} - -// Vector is a slice of Samples -type Vector []model.Sample - -// Matrix is a slice of SampleStreams -type Matrix []model.SampleStream - -// LabelValuesResponse represents the http json response to a query for label values -type LabelValuesResponse struct { - Status string `json:"status"` - Data []string `json:"data"` -} diff --git a/pkg/model/query_response.go b/pkg/model/query_response.go new file mode 100644 index 000000000..cd1c62f6d --- /dev/null +++ b/pkg/model/query_response.go @@ -0,0 +1,164 @@ +package model + +import ( + "fmt" + + json "github.com/json-iterator/go" + "github.com/netobserv/network-observability-console-plugin/pkg/utils/constants" + "github.com/prometheus/common/model" +) + +// QueryResponse represents the http json response to a storage query (LogQL or PromQL) +type QueryResponse struct { + Status string `json:"status"` + Data QueryResponseData `json:"data"` +} + +// AggregatedQueryResponse represents the aggregated json response to one or more storage queries +type AggregatedQueryResponse struct { + ResultType ResultType `json:"resultType"` + Result ResultValue `json:"result"` + Stats AggregatedStats `json:"stats"` + UnixTimestamp int64 `json:"unixTimestamp"` +} + +// AggregatedStats represents the stats of one or more storage queries +type AggregatedStats struct { + NumQueries int `json:"numQueries"` + TotalEntries int `json:"totalEntries"` + Duplicates int `json:"duplicates"` + LimitReached bool `json:"limitReached"` + QueriesStats []interface{} `json:"queriesStats"` + DataSources []constants.DataSource `json:"dataSources"` +} + +// ResultType holds the type of the result +type ResultType string + +// ResultType values +const ( + ResultTypeStream = "streams" + ResultTypeScalar = "scalar" + ResultTypeVector = "vector" + ResultTypeMatrix = "matrix" +) + +// ResultValue interface mimics the promql.Value interface +type ResultValue interface { + Type() ResultType +} + +// QueryResponseData represents the http json response data for a storage query +type QueryResponseData struct { + ResultType ResultType `json:"resultType"` + Result ResultValue `json:"result"` + Stats interface{} `json:"-"` +} + +// Type implements the ResultValue interface +func (Streams) Type() ResultType { return ResultTypeStream } + +// Type implements the ResultValue interface +func (Scalar) Type() ResultType { return ResultTypeScalar } + +// Type implements the ResultValue interface +func (Vector) Type() ResultType { return ResultTypeVector } + +// Type implements the ResultValue interface +func (Matrix) Type() ResultType { return ResultTypeMatrix } + +// Scalar is a single timestamp/float with no labels +type Scalar model.Scalar + +func (s Scalar) MarshalJSON() ([]byte, error) { + return model.Scalar(s).MarshalJSON() +} + +func (s *Scalar) UnmarshalJSON(b []byte) error { + var v model.Scalar + if err := v.UnmarshalJSON(b); err != nil { + return err + } + *s = Scalar(v) + return nil +} + +// Vector is a slice of Samples +type Vector []model.Sample + +// Matrix is a slice of SampleStreams +type Matrix []model.SampleStream + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (q *QueryResponseData) UnmarshalJSON(data []byte) error { + t, result, stats, err := unmarshalQueryResponseData(data) + if err != nil { + return err + } + q.ResultType = t + q.Result = result + q.Stats = stats + + return nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (q *AggregatedQueryResponse) UnmarshalJSON(data []byte) error { + t, result, _, err := unmarshalQueryResponseData(data) + if err != nil { + return err + } + q.ResultType = t + q.Result = result + + return nil +} + +func unmarshalQueryResponseData(data []byte) (ResultType, ResultValue, interface{}, error) { + unmarshal := struct { + Type ResultType `json:"resultType"` + Result json.RawMessage `json:"result"` + Stats interface{} `json:"stats"` + }{} + + err := json.Unmarshal(data, &unmarshal) + if err != nil { + return "", nil, nil, err + } + + var value ResultValue + + switch unmarshal.Type { + case ResultTypeStream: + var s Streams + err = json.Unmarshal(unmarshal.Result, &s) + for _, mapping := range flowLineMappings { + for i := range s { + for ii := range s[i].Entries { + s[i].Entries[ii].Line = mapping(s[i].Entries[ii].Line) + } + } + } + value = s + case ResultTypeMatrix: + var m Matrix + err = json.Unmarshal(unmarshal.Result, &m) + value = m + case ResultTypeVector: + var v Vector + err = json.Unmarshal(unmarshal.Result, &v) + value = v + case ResultTypeScalar: + var v Scalar + err = json.Unmarshal(unmarshal.Result, &v) + value = v + default: + return "", nil, nil, fmt.Errorf("unknown type: %s", unmarshal.Type) + } + + if err != nil { + return "", nil, nil, err + } + + return unmarshal.Type, value, unmarshal.Stats, nil +} diff --git a/pkg/prometheus/query.go b/pkg/prometheus/query.go index ee1ef4502..f12689eff 100644 --- a/pkg/prometheus/query.go +++ b/pkg/prometheus/query.go @@ -3,15 +3,15 @@ package prometheus import ( "strings" - "github.com/netobserv/network-observability-console-plugin/pkg/loki" "github.com/netobserv/network-observability-console-plugin/pkg/model/filters" "github.com/netobserv/network-observability-console-plugin/pkg/utils/constants" + "github.com/netobserv/network-observability-console-plugin/pkg/utils/queryparams" v1 "github.com/prometheus/client_golang/api/prometheus/v1" ) type QueryBuilder struct { aggregateKeyLabels map[string][]string - in *loki.TopologyInput + in *queryparams.TopologyInput filters filters.SingleQuery orMetrics []string qRange v1.Range @@ -22,7 +22,8 @@ type Query struct { PromQL string } -func NewQuery(kl map[string][]string, in *loki.TopologyInput, qr *v1.Range, filters filters.SingleQuery, orMetrics []string) *QueryBuilder { +// NewQuery creates a new PromQL QueryBuilder for the given topology input. +func NewQuery(kl map[string][]string, in *queryparams.TopologyInput, qr *v1.Range, filters filters.SingleQuery, orMetrics []string) *QueryBuilder { return &QueryBuilder{ aggregateKeyLabels: kl, in: in, @@ -158,14 +159,17 @@ func appendFilteredMetric(sb *strings.Builder, metric string, filters filters.Si sb.WriteRune('}') } +// GetLabelsAndFilter returns the label fields for grouping and an optional extra filter string. +// For Prometheus, the "app" aggregate is a noop (it's only relevant for Loki stream selectors). func GetLabelsAndFilter(kl map[string][]string, aggregate, groups string) ([]string, string) { if aggregate == "app" { // ignore app: it's a noop aggregation needed for Loki, not relevant in promQL return nil, "" } - return loki.GetLabelsAndFilter(kl, aggregate, groups) + return queryparams.GetLabelsAndFilter(kl, aggregate, groups) } +// QueryFilters builds a PromQL metric selector string with the given filters applied. func QueryFilters(metric string, filters filters.SingleQuery) string { sb := strings.Builder{} appendFilteredMetric(&sb, metric, filters) diff --git a/pkg/prometheus/query_test.go b/pkg/prometheus/query_test.go index 29bb6fad3..6296d4287 100644 --- a/pkg/prometheus/query_test.go +++ b/pkg/prometheus/query_test.go @@ -4,10 +4,10 @@ import ( "testing" "time" - "github.com/netobserv/network-observability-console-plugin/pkg/loki" "github.com/netobserv/network-observability-console-plugin/pkg/model/fields" "github.com/netobserv/network-observability-console-plugin/pkg/model/filters" "github.com/netobserv/network-observability-console-plugin/pkg/utils/constants" + "github.com/netobserv/network-observability-console-plugin/pkg/utils/queryparams" v1 "github.com/prometheus/client_golang/api/prometheus/v1" "github.com/stretchr/testify/assert" ) @@ -28,7 +28,7 @@ var kl = map[string][]string{ } func TestBuildQuery_PromQLSimpleRateIgnoreApp(t *testing.T) { - in := loki.TopologyInput{ + in := queryparams.TopologyInput{ Top: "50", RateInterval: "2m", DataField: "Bytes", @@ -48,7 +48,7 @@ func TestBuildQuery_PromQLSimpleRateIgnoreApp(t *testing.T) { } func TestBuildQuery_PromQLSimpleRateNoFilter(t *testing.T) { - in := loki.TopologyInput{ + in := queryparams.TopologyInput{ Top: "50", RateInterval: "2m", DataField: "Bytes", @@ -68,7 +68,7 @@ func TestBuildQuery_PromQLSimpleRateNoFilter(t *testing.T) { } func TestBuildQuery_PromQLSimpleRateAndFilter(t *testing.T) { - in := loki.TopologyInput{ + in := queryparams.TopologyInput{ Top: "50", RateInterval: "2m", DataField: "Bytes", @@ -93,7 +93,7 @@ func TestBuildQuery_PromQLSimpleRateAndFilter(t *testing.T) { } func TestBuildQuery_PromQLRateMultiFilter(t *testing.T) { - in := loki.TopologyInput{ + in := queryparams.TopologyInput{ Top: "50", RateInterval: "2m", DataField: "Bytes", @@ -119,7 +119,7 @@ func TestBuildQuery_PromQLRateMultiFilter(t *testing.T) { } func TestBuildQuery_PromQLHistogramAverage(t *testing.T) { - in := loki.TopologyInput{ + in := queryparams.TopologyInput{ Top: "50", RateInterval: "2m", DataField: "TimeFlowRttNs", @@ -144,7 +144,7 @@ func TestBuildQuery_PromQLHistogramAverage(t *testing.T) { } func TestBuildQuery_PromQLHistogramP99(t *testing.T) { - in := loki.TopologyInput{ + in := queryparams.TopologyInput{ Top: "50", RateInterval: "2m", DataField: "TimeFlowRttNs", @@ -169,7 +169,7 @@ func TestBuildQuery_PromQLHistogramP99(t *testing.T) { } func TestBuildQuery_PromQLByDNSResponseCode(t *testing.T) { - in := loki.TopologyInput{ + in := queryparams.TopologyInput{ Top: "5", RateInterval: "1m", DataField: "DnsFlows", @@ -189,7 +189,7 @@ func TestBuildQuery_PromQLByDNSResponseCode(t *testing.T) { } func TestBuildQuery_PromQLORMetrics(t *testing.T) { - in := loki.TopologyInput{ + in := queryparams.TopologyInput{ Top: "50", RateInterval: "2m", DataField: "Bytes", diff --git a/pkg/utils/queryparams/topology.go b/pkg/utils/queryparams/topology.go new file mode 100644 index 000000000..50749e0e3 --- /dev/null +++ b/pkg/utils/queryparams/topology.go @@ -0,0 +1,62 @@ +// Package queryparams provides shared query parameter types and helpers used by +// both the Loki and Prometheus query builders. +package queryparams + +import ( + "slices" + "strings" + + "github.com/netobserv/network-observability-console-plugin/pkg/utils/constants" +) + +// TopologyInput holds the common query parameters for topology (metrics) queries, +// shared by both Loki and Prometheus query builders. +type TopologyInput struct { + Start string + End string + Top string + RateInterval string + Step string + DataField string + MetricFunction constants.MetricFunction + RecordType constants.RecordType + DataSource constants.DataSource + PacketLoss constants.PacketLoss + Aggregate string + Groups string +} + +// GetActualDataField returns the data field for unwrap/aggregation, or empty string +// for count-type metrics that do not unwrap a specific field. +func (in *TopologyInput) GetActualDataField() string { + switch in.DataField { + case constants.MetricTypeFlows, constants.MetricTypeDNSFlows, constants.MetricTypeTLSFlows: + return "" + default: + return in.DataField + } +} + +// GetLabelsAndFilter returns the label fields to aggregate by and an optional extra +// line filter for the given aggregate and groups configuration. +// This function is shared by both Loki and Prometheus query builders. +func GetLabelsAndFilter(kl map[string][]string, aggregate, groups string) ([]string, string) { + var fields []string + var filter string + if fields = kl[aggregate]; fields == nil { + fields = []string{aggregate} + filter = aggregate + } + if groups != "" { + for gr, labels := range kl { + if strings.Contains(groups, gr) { + for _, label := range labels { + if !slices.Contains(fields, label) { + fields = append(fields, label) + } + } + } + } + } + return fields, filter +} diff --git a/web/src/api/loki.ts b/web/src/api/query-response.ts similarity index 97% rename from web/src/api/loki.ts rename to web/src/api/query-response.ts index 603b090f4..bc64c7883 100644 --- a/web/src/api/loki.ts +++ b/web/src/api/query-response.ts @@ -79,7 +79,7 @@ export interface TopologyMetricPeer { subnetLabel?: string; } -/** TLS breakdown from Loki matrix metric labels (topology TLS aggregate: TLSVersion + TLSGroup). */ +/** TLS breakdown from matrix metric labels (topology TLS aggregate: TLSVersion + TLSGroup). */ export type GenericMetricTls = { versions?: string[]; /** Cipher / key-exchange group (PQC compliance). */ @@ -206,7 +206,7 @@ export type TopologyMetrics = { values: [number, number][]; stats: MetricStats; scope: FlowScope; - /** TLSVersion / TLSGroup from Loki topology matrix labels when present. */ + /** TLSVersion / TLSGroup from topology matrix labels when present. */ tls?: GenericMetricTls; }; diff --git a/web/src/api/routes.ts b/web/src/api/routes.ts index ff0990497..9666d6448 100644 --- a/web/src/api/routes.ts +++ b/web/src/api/routes.ts @@ -17,7 +17,7 @@ import { Stats, Status, StreamResult -} from './loki'; +} from './query-response'; export const getFlowRecords = (params: FlowQuery): Promise => { return axios.get(ContextSingleton.getHost() + '/api/loki/flow/records', { params }).then(r => { diff --git a/web/src/components/__tests-data__/flows.ts b/web/src/components/__tests-data__/flows.ts index e7945a71c..9a52cafaa 100644 --- a/web/src/components/__tests-data__/flows.ts +++ b/web/src/components/__tests-data__/flows.ts @@ -1,6 +1,6 @@ import flowsJson from '../../../../mocks/loki/flow_records.json'; import { FlowDirection, Record } from '../../api/ipfix'; -import { parseStream, RecordsResult, StreamResult } from '../../api/loki'; +import { parseStream, RecordsResult, StreamResult } from '../../api/query-response'; export const FlowsMock: Record[] = flowsJson.data.result.flatMap(r => parseStream(r as unknown as StreamResult)); diff --git a/web/src/components/__tests-data__/metrics.ts b/web/src/components/__tests-data__/metrics.ts index f82fe6ac0..d8c88086a 100644 --- a/web/src/components/__tests-data__/metrics.ts +++ b/web/src/components/__tests-data__/metrics.ts @@ -1,4 +1,4 @@ -import { RawTopologyMetrics, TopologyMetrics } from '../../api/loki'; +import { RawTopologyMetrics, TopologyMetrics } from '../../api/query-response'; import { parseTopologyMetrics } from '../../utils/metrics'; export const metric1: RawTopologyMetrics = { diff --git a/web/src/components/__tests__/netflow-tab.spec.tsx b/web/src/components/__tests__/netflow-tab.spec.tsx index db1b12ebb..71fe9ce40 100644 --- a/web/src/components/__tests__/netflow-tab.spec.tsx +++ b/web/src/components/__tests__/netflow-tab.spec.tsx @@ -2,7 +2,7 @@ import { useResolvedExtensions } from '@openshift-console/dynamic-plugin-sdk'; import { render, waitFor } from '@testing-library/react'; import * as React from 'react'; import { AlertsResult, SilencedAlert } from '../../api/alert'; -import { FlowMetricsResult, GenericMetricsResult } from '../../api/loki'; +import { FlowMetricsResult, GenericMetricsResult } from '../../api/query-response'; import { getConfig } from '../../api/routes'; import { FullConfigResultSample } from '../__tests-data__/config'; import { extensionsMock } from '../__tests-data__/extensions'; diff --git a/web/src/components/__tests__/netflow-traffic.spec.tsx b/web/src/components/__tests__/netflow-traffic.spec.tsx index 521e4b5e2..1a8676290 100644 --- a/web/src/components/__tests__/netflow-traffic.spec.tsx +++ b/web/src/components/__tests__/netflow-traffic.spec.tsx @@ -2,7 +2,7 @@ import { useResolvedExtensions } from '@openshift-console/dynamic-plugin-sdk'; import { act, fireEvent, render, waitFor } from '@testing-library/react'; import * as React from 'react'; import { AlertsResult, SilencedAlert } from '../../api/alert'; -import { FlowMetricsResult, GenericMetricsResult } from '../../api/loki'; +import { FlowMetricsResult, GenericMetricsResult } from '../../api/query-response'; import { getConfig, getFlowGenericMetrics, getFlowMetrics, getFlowRecords, getRole } from '../../api/routes'; import { FlowQuery } from '../../model/flow-query'; import { FullConfigResultSample, SimpleConfigResultSample } from '../__tests-data__/config'; diff --git a/web/src/components/drawer/element/__tests__/element-panel.spec.tsx b/web/src/components/drawer/element/__tests__/element-panel.spec.tsx index 23c3994df..2b9de8e6b 100644 --- a/web/src/components/drawer/element/__tests__/element-panel.spec.tsx +++ b/web/src/components/drawer/element/__tests__/element-panel.spec.tsx @@ -3,7 +3,7 @@ import { BaseEdge, BaseNode, NodeModel } from '@patternfly/react-topology'; import { fireEvent, render, waitFor } from '@testing-library/react'; import * as React from 'react'; -import { TopologyMetrics } from '../../../../api/loki'; +import { TopologyMetrics } from '../../../../api/query-response'; import { Filters } from '../../../../model/filters'; import { FlowScope, MetricType } from '../../../../model/flow-query'; import { NodeData } from '../../../../model/topology'; diff --git a/web/src/components/drawer/element/element-field.tsx b/web/src/components/drawer/element/element-field.tsx index a72578616..1f6c9901e 100644 --- a/web/src/components/drawer/element/element-field.tsx +++ b/web/src/components/drawer/element/element-field.tsx @@ -1,6 +1,6 @@ import { Content, ContentVariants, Flex, FlexItem } from '@patternfly/react-core'; import * as React from 'react'; -import { TopologyMetricPeer } from '../../../api/loki'; +import { TopologyMetricPeer } from '../../../api/query-response'; import { Filter, FilterDefinition, Filters } from '../../../model/filters'; import { NodeType } from '../../../model/flow-query'; import { PeerResourceLink } from '../../tabs/netflow-topology/peer-resource-link'; diff --git a/web/src/components/drawer/element/element-panel-metrics.tsx b/web/src/components/drawer/element/element-panel-metrics.tsx index 212b74ab9..64554de1c 100644 --- a/web/src/components/drawer/element/element-panel-metrics.tsx +++ b/web/src/components/drawer/element/element-panel-metrics.tsx @@ -1,7 +1,7 @@ import { Content, ContentVariants, Flex, FlexItem, Radio } from '@patternfly/react-core'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { TopologyMetrics } from '../../../api/loki'; +import { TopologyMetrics } from '../../../api/query-response'; import { isTimeMetric, MetricType } from '../../../model/flow-query'; import { getStat } from '../../../model/metrics'; import { decorated, NodeData } from '../../../model/topology'; diff --git a/web/src/components/drawer/element/element-panel-stats.tsx b/web/src/components/drawer/element/element-panel-stats.tsx index 369a0e29f..1ead6ad2d 100644 --- a/web/src/components/drawer/element/element-panel-stats.tsx +++ b/web/src/components/drawer/element/element-panel-stats.tsx @@ -1,7 +1,7 @@ import { Content, ContentVariants, Flex, FlexItem } from '@patternfly/react-core'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { TopologyMetrics } from '../../../api/loki'; +import { TopologyMetrics } from '../../../api/query-response'; import { isTimeMetric, MetricType } from '../../../model/flow-query'; import { getStat } from '../../../model/metrics'; import { getFormattedValue } from '../../../utils/metrics'; diff --git a/web/src/components/drawer/element/element-panel.tsx b/web/src/components/drawer/element/element-panel.tsx index 9d220f0d3..fee21e7d6 100644 --- a/web/src/components/drawer/element/element-panel.tsx +++ b/web/src/components/drawer/element/element-panel.tsx @@ -15,7 +15,7 @@ import { BaseEdge } from '@patternfly/react-topology'; import _ from 'lodash'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { TopologyMetrics } from '../../../api/loki'; +import { TopologyMetrics } from '../../../api/query-response'; import { RuleDetails } from '../../../components/health/rule-details'; import { Filter, FilterDefinition, Filters } from '../../../model/filters'; import { MetricType } from '../../../model/flow-query'; diff --git a/web/src/components/drawer/netflow-traffic-drawer.tsx b/web/src/components/drawer/netflow-traffic-drawer.tsx index f41230b99..a42ddc872 100644 --- a/web/src/components/drawer/netflow-traffic-drawer.tsx +++ b/web/src/components/drawer/netflow-traffic-drawer.tsx @@ -3,7 +3,7 @@ import _ from 'lodash'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { Record } from '../../api/ipfix'; -import { getFunctionMetricKey, getRateMetricKey, NetflowMetrics, Stats } from '../../api/loki'; +import { getFunctionMetricKey, getRateMetricKey, NetflowMetrics, Stats } from '../../api/query-response'; import { Config } from '../../model/config'; import { Filter, Filters, filtersEqual, hasIndexFields, hasNonIndexFields } from '../../model/filters'; import { FlowScope, MetricType, RecordType, StatFunction } from '../../model/flow-query'; diff --git a/web/src/components/messages/empty.tsx b/web/src/components/messages/empty.tsx index 894aec2e7..212dc173d 100644 --- a/web/src/components/messages/empty.tsx +++ b/web/src/components/messages/empty.tsx @@ -10,7 +10,7 @@ import { import { SearchIcon } from '@patternfly/react-icons'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { Status } from '../../api/loki'; +import { Status } from '../../api/query-response'; import { getStatus } from '../../api/routes'; import { Config } from '../../model/config'; import { ContextSingleton } from '../../utils/context'; diff --git a/web/src/components/messages/error.tsx b/web/src/components/messages/error.tsx index 0c26def7d..0eb6f89b4 100644 --- a/web/src/components/messages/error.tsx +++ b/web/src/components/messages/error.tsx @@ -11,7 +11,7 @@ import { import { ExclamationCircleIcon, ExclamationTriangleIcon } from '@patternfly/react-icons'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { Status } from '../../api/loki'; +import { Status } from '../../api/query-response'; import { getBuildInfo, getLimits, getLokiMetrics, getStatus } from '../../api/routes'; import { ContextSingleton } from '../../utils/context'; import { diff --git a/web/src/components/messages/status-texts.tsx b/web/src/components/messages/status-texts.tsx index e9137d7e5..45b2447d2 100644 --- a/web/src/components/messages/status-texts.tsx +++ b/web/src/components/messages/status-texts.tsx @@ -1,7 +1,7 @@ import { Content, ContentVariants } from '@patternfly/react-core'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { Status } from '../../api/loki'; +import { Status } from '../../api/query-response'; export interface StatusProps { status: Status; diff --git a/web/src/components/metrics/__tests__/metrics-donut.spec.tsx b/web/src/components/metrics/__tests__/metrics-donut.spec.tsx index ce55bbad1..c110fab02 100644 --- a/web/src/components/metrics/__tests__/metrics-donut.spec.tsx +++ b/web/src/components/metrics/__tests__/metrics-donut.spec.tsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react'; import * as React from 'react'; -import { NamedMetric } from '../../../api/loki'; +import { NamedMetric } from '../../../api/query-response'; import { metrics } from '../../__tests-data__/metrics'; import { MetricsDonut, MetricsDonutProps } from '../metrics-donut'; diff --git a/web/src/components/metrics/histogram.tsx b/web/src/components/metrics/histogram.tsx index 13fb52d13..44f3bc5c5 100644 --- a/web/src/components/metrics/histogram.tsx +++ b/web/src/components/metrics/histogram.tsx @@ -31,7 +31,7 @@ import { } from '@patternfly/react-icons'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { NamedMetric, TopologyMetrics } from '../../api/loki'; +import { NamedMetric, TopologyMetrics } from '../../api/query-response'; import { TimeRange } from '../../utils/datetime'; import { getDateMsInSeconds } from '../../utils/duration'; import { localStorageHistogramGuidedTourDoneKey, useLocalStorage } from '../../utils/local-storage-hook'; diff --git a/web/src/components/metrics/metrics-donut.tsx b/web/src/components/metrics/metrics-donut.tsx index 456da266a..65086f3f3 100644 --- a/web/src/components/metrics/metrics-donut.tsx +++ b/web/src/components/metrics/metrics-donut.tsx @@ -1,7 +1,7 @@ import { ChartDonut, ChartLabel, ChartLegend, ChartThemeColor } from '@patternfly/react-charts/victory'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { GenericMetric, MetricStats, NamedMetric } from '../../api/loki'; +import { GenericMetric, MetricStats, NamedMetric } from '../../api/query-response'; import { MetricFunction, MetricType } from '../../model/flow-query'; import { getStat } from '../../model/metrics'; import { localStorageOverviewDonutDimensionKey, useLocalStorage } from '../../utils/local-storage-hook'; diff --git a/web/src/components/metrics/metrics-graph-total.tsx b/web/src/components/metrics/metrics-graph-total.tsx index 5d0b00d50..053114911 100644 --- a/web/src/components/metrics/metrics-graph-total.tsx +++ b/web/src/components/metrics/metrics-graph-total.tsx @@ -13,7 +13,7 @@ import { } from '@patternfly/react-charts/victory'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { GenericMetric, NamedMetric } from '../../api/loki'; +import { GenericMetric, NamedMetric } from '../../api/query-response'; import { MetricFunction, MetricType } from '../../model/flow-query'; import { localStorageOverviewMetricsTotalDimensionKey, useLocalStorage } from '../../utils/local-storage-hook'; import { getFormattedValue, isUnknownPeer } from '../../utils/metrics'; diff --git a/web/src/components/metrics/metrics-graph.tsx b/web/src/components/metrics/metrics-graph.tsx index 275da0de4..22f8cd6a6 100644 --- a/web/src/components/metrics/metrics-graph.tsx +++ b/web/src/components/metrics/metrics-graph.tsx @@ -13,7 +13,7 @@ import { } from '@patternfly/react-charts/victory'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { GenericMetric, NamedMetric } from '../../api/loki'; +import { GenericMetric, NamedMetric } from '../../api/query-response'; import { MetricFunction, MetricType } from '../../model/flow-query'; import { localStorageOverviewMetricsDimensionKey, useLocalStorage } from '../../utils/local-storage-hook'; import { getFormattedValue } from '../../utils/metrics'; diff --git a/web/src/components/netflow-traffic.tsx b/web/src/components/netflow-traffic.tsx index ffba1ce96..e0e2e7aad 100644 --- a/web/src/components/netflow-traffic.tsx +++ b/web/src/components/netflow-traffic.tsx @@ -5,7 +5,7 @@ import * as _ from 'lodash'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; import { Record } from '../api/ipfix'; -import { defaultNetflowMetrics } from '../api/loki'; +import { defaultNetflowMetrics } from '../api/query-response'; import { Config, defaultConfig } from '../model/config'; import { DisabledFilters, Filters, getDisabledFiltersRecord } from '../model/filters'; import { diff --git a/web/src/components/query-summary/__tests__/metrics-query-summary.spec.tsx b/web/src/components/query-summary/__tests__/metrics-query-summary.spec.tsx index c123594b4..8603d505e 100644 --- a/web/src/components/query-summary/__tests__/metrics-query-summary.spec.tsx +++ b/web/src/components/query-summary/__tests__/metrics-query-summary.spec.tsx @@ -2,7 +2,7 @@ import { render, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import * as React from 'react'; -import { defaultNetflowMetrics, NetflowMetrics } from '../../../api/loki'; +import { defaultNetflowMetrics, NetflowMetrics } from '../../../api/query-response'; import { Result } from '../../../utils/result'; import { metrics } from '../../__tests-data__/metrics'; import { MetricsQuerySummary } from '../metrics-query-summary'; diff --git a/web/src/components/query-summary/__tests__/summary-panel.spec.tsx b/web/src/components/query-summary/__tests__/summary-panel.spec.tsx index 4018fc1ba..949b93e45 100644 --- a/web/src/components/query-summary/__tests__/summary-panel.spec.tsx +++ b/web/src/components/query-summary/__tests__/summary-panel.spec.tsx @@ -1,7 +1,7 @@ import { render, waitFor } from '@testing-library/react'; import * as React from 'react'; -import { defaultNetflowMetrics } from '../../../api/loki'; +import { defaultNetflowMetrics } from '../../../api/query-response'; import { FlowsSample } from '../../../components/__tests-data__/flows'; import { RecordType } from '../../../model/flow-query'; import { SummaryPanelContent } from '../summary-panel-content'; diff --git a/web/src/components/query-summary/flows-query-summary.tsx b/web/src/components/query-summary/flows-query-summary.tsx index 2fcb8e383..826ab00c9 100644 --- a/web/src/components/query-summary/flows-query-summary.tsx +++ b/web/src/components/query-summary/flows-query-summary.tsx @@ -2,7 +2,7 @@ import { Card } from '@patternfly/react-core'; import _ from 'lodash'; import * as React from 'react'; import { Record } from '../../api/ipfix'; -import { Stats } from '../../api/loki'; +import { Stats } from '../../api/query-response'; import { RecordType } from '../../model/flow-query'; import { Warning } from '../../model/warnings'; import { TimeRange } from '../../utils/datetime'; diff --git a/web/src/components/query-summary/metrics-query-summary-content.tsx b/web/src/components/query-summary/metrics-query-summary-content.tsx index 57d91ff77..8c15fe86c 100644 --- a/web/src/components/query-summary/metrics-query-summary-content.tsx +++ b/web/src/components/query-summary/metrics-query-summary-content.tsx @@ -3,7 +3,7 @@ import { DomainIcon, OutlinedClockIcon, TachometerAltIcon } from '@patternfly/re import _ from 'lodash'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { getRateMetricKey, NetflowMetrics } from '../../api/loki'; +import { getRateMetricKey, NetflowMetrics } from '../../api/query-response'; import { MetricType } from '../../model/flow-query'; import { Warning } from '../../model/warnings'; import { valueFormat } from '../../utils/format'; diff --git a/web/src/components/query-summary/metrics-query-summary.tsx b/web/src/components/query-summary/metrics-query-summary.tsx index 8d2a1aeab..e2999d1f4 100644 --- a/web/src/components/query-summary/metrics-query-summary.tsx +++ b/web/src/components/query-summary/metrics-query-summary.tsx @@ -1,6 +1,6 @@ import { Card } from '@patternfly/react-core'; import * as React from 'react'; -import { NetflowMetrics, Stats } from '../../api/loki'; +import { NetflowMetrics, Stats } from '../../api/query-response'; import { Warning } from '../../model/warnings'; import { MetricsQuerySummaryContent } from './metrics-query-summary-content'; import './query-summary.css'; diff --git a/web/src/components/query-summary/summary-panel-content.tsx b/web/src/components/query-summary/summary-panel-content.tsx index 3ef35f758..7d2011f1a 100644 --- a/web/src/components/query-summary/summary-panel-content.tsx +++ b/web/src/components/query-summary/summary-panel-content.tsx @@ -12,7 +12,7 @@ import _ from 'lodash'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; import { Record } from '../../api/ipfix'; -import { NetflowMetrics, Stats } from '../../api/loki'; +import { NetflowMetrics, Stats } from '../../api/query-response'; import { RecordType } from '../../model/flow-query'; import { Warning } from '../../model/warnings'; import { compareStrings } from '../../utils/base-compare'; diff --git a/web/src/components/query-summary/summary-panel.tsx b/web/src/components/query-summary/summary-panel.tsx index 5aa443e2e..2dfdf70aa 100644 --- a/web/src/components/query-summary/summary-panel.tsx +++ b/web/src/components/query-summary/summary-panel.tsx @@ -11,7 +11,7 @@ import { import * as React from 'react'; import { useTranslation } from 'react-i18next'; import { Record } from '../../api/ipfix'; -import { NetflowMetrics, Stats } from '../../api/loki'; +import { NetflowMetrics, Stats } from '../../api/query-response'; import { RecordType } from '../../model/flow-query'; import { Warning } from '../../model/warnings'; import { TimeRange } from '../../utils/datetime'; diff --git a/web/src/components/tabs/netflow-overview/__tests__/netflow-overview.spec.tsx b/web/src/components/tabs/netflow-overview/__tests__/netflow-overview.spec.tsx index d0529706b..5ad360f1c 100644 --- a/web/src/components/tabs/netflow-overview/__tests__/netflow-overview.spec.tsx +++ b/web/src/components/tabs/netflow-overview/__tests__/netflow-overview.spec.tsx @@ -1,7 +1,7 @@ import { render, waitFor } from '@testing-library/react'; import * as React from 'react'; -import { defaultNetflowMetrics } from '../../../../api/loki'; +import { defaultNetflowMetrics } from '../../../../api/query-response'; import { droppedMetrics, metrics } from '../../../../components/__tests-data__/metrics'; import { ScopeDefSample } from '../../../../components/__tests-data__/scopes'; import { TruncateLength } from '../../../../components/dropdowns/truncate-dropdown'; diff --git a/web/src/components/tabs/netflow-overview/netflow-overview.tsx b/web/src/components/tabs/netflow-overview/netflow-overview.tsx index b440d8998..f575abd0a 100644 --- a/web/src/components/tabs/netflow-overview/netflow-overview.tsx +++ b/web/src/components/tabs/netflow-overview/netflow-overview.tsx @@ -18,7 +18,7 @@ import { Stats, TotalFunctionMetrics, TotalRateMetrics -} from '../../../api/loki'; +} from '../../../api/query-response'; import { getFlowGenericMetrics } from '../../../api/routes'; import { ScopeSlider } from '../../../components/slider/scope-slider'; import { Config } from '../../../model/config'; diff --git a/web/src/components/tabs/netflow-table/netflow-table.tsx b/web/src/components/tabs/netflow-table/netflow-table.tsx index a6544aa27..e459154cf 100644 --- a/web/src/components/tabs/netflow-table/netflow-table.tsx +++ b/web/src/components/tabs/netflow-table/netflow-table.tsx @@ -4,7 +4,7 @@ import * as _ from 'lodash'; import * as React from 'react'; import { Record } from '../../../api/ipfix'; -import { defaultNetflowMetrics, Stats } from '../../../api/loki'; +import { defaultNetflowMetrics, Stats } from '../../../api/query-response'; import { Config } from '../../../model/config'; import { useNetflowContext } from '../../../model/netflow-context'; import { Column, ColumnsId, ColumnSizeMap } from '../../../utils/columns'; diff --git a/web/src/components/tabs/netflow-topology/2d/styles/styleNode.tsx b/web/src/components/tabs/netflow-topology/2d/styles/styleNode.tsx index e5fb0e3cd..7946318ef 100644 --- a/web/src/components/tabs/netflow-topology/2d/styles/styleNode.tsx +++ b/web/src/components/tabs/netflow-topology/2d/styles/styleNode.tsx @@ -18,7 +18,7 @@ import * as _ from 'lodash'; import * as React from 'react'; import { FaQuestion } from 'react-icons/fa'; import { TbWorldWww } from 'react-icons/tb'; -import { TopologyMetricPeer } from '../../../../../api/loki'; +import { TopologyMetricPeer } from '../../../../../api/query-response'; import { Match } from '../../../../../model/flow-query'; import { Decorated, NodeData } from '../../../../../model/topology'; import { useTheme } from '../../../../../utils/theme-hook'; diff --git a/web/src/components/tabs/netflow-topology/2d/topology-content.tsx b/web/src/components/tabs/netflow-topology/2d/topology-content.tsx index 2319d3678..7a169a62e 100644 --- a/web/src/components/tabs/netflow-topology/2d/topology-content.tsx +++ b/web/src/components/tabs/netflow-topology/2d/topology-content.tsx @@ -18,7 +18,7 @@ import { import _ from 'lodash'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { TopologyMetrics } from '../../../../api/loki'; +import { TopologyMetrics } from '../../../../api/query-response'; import { HealthStats } from '../../../../components/health/health-helper'; import { Config } from '../../../../model/config'; import { Filter, FilterDefinition, Filters } from '../../../../model/filters'; diff --git a/web/src/components/tabs/netflow-topology/__tests-data__/metrics.ts b/web/src/components/tabs/netflow-topology/__tests-data__/metrics.ts index c68045296..ece2e43b0 100644 --- a/web/src/components/tabs/netflow-topology/__tests-data__/metrics.ts +++ b/web/src/components/tabs/netflow-topology/__tests-data__/metrics.ts @@ -1,4 +1,4 @@ -import { RawTopologyMetrics, TopologyMetrics } from '../../../../api/loki'; +import { RawTopologyMetrics, TopologyMetrics } from '../../../../api/query-response'; import { parseTopologyMetrics } from '../../../../utils/metrics'; export const responseSample = { diff --git a/web/src/components/tabs/netflow-topology/__tests__/netflow-topology.spec.tsx b/web/src/components/tabs/netflow-topology/__tests__/netflow-topology.spec.tsx index effbcdca5..79848af68 100644 --- a/web/src/components/tabs/netflow-topology/__tests__/netflow-topology.spec.tsx +++ b/web/src/components/tabs/netflow-topology/__tests__/netflow-topology.spec.tsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react'; import * as React from 'react'; -import { TopologyMetrics } from '../../../../api/loki'; +import { TopologyMetrics } from '../../../../api/query-response'; import { FilterDefinitionSample } from '../../../../components/__tests-data__/filters'; import { ScopeDefSample } from '../../../../components/__tests-data__/scopes'; import { Config } from '../../../../model/config'; diff --git a/web/src/components/tabs/netflow-topology/netflow-topology.tsx b/web/src/components/tabs/netflow-topology/netflow-topology.tsx index 57400ee46..b6880565e 100644 --- a/web/src/components/tabs/netflow-topology/netflow-topology.tsx +++ b/web/src/components/tabs/netflow-topology/netflow-topology.tsx @@ -13,7 +13,7 @@ import { RateMetrics, Stats, TopologyMetrics -} from '../../../api/loki'; +} from '../../../api/query-response'; import { getK8SUDNIds } from '../../../api/routes'; import { Config } from '../../../model/config'; import { FilterDefinition, Filters } from '../../../model/filters'; diff --git a/web/src/components/tabs/netflow-topology/peer-resource-link.tsx b/web/src/components/tabs/netflow-topology/peer-resource-link.tsx index 5f097e118..9654e049f 100644 --- a/web/src/components/tabs/netflow-topology/peer-resource-link.tsx +++ b/web/src/components/tabs/netflow-topology/peer-resource-link.tsx @@ -1,7 +1,7 @@ import { ResourceLink } from '@openshift-console/dynamic-plugin-sdk'; import { Content } from '@patternfly/react-core'; import * as React from 'react'; -import { TopologyMetricPeer } from '../../../api/loki'; +import { TopologyMetricPeer } from '../../../api/query-response'; export interface PeerResourceLinkProps { peer: TopologyMetricPeer; diff --git a/web/src/components/toolbar/filters/__tests__/filters-toolbar.spec.tsx b/web/src/components/toolbar/filters/__tests__/filters-toolbar.spec.tsx index 4b7e7cdaf..74843e11e 100644 --- a/web/src/components/toolbar/filters/__tests__/filters-toolbar.spec.tsx +++ b/web/src/components/toolbar/filters/__tests__/filters-toolbar.spec.tsx @@ -30,7 +30,7 @@ const testCaps = { fetchFunctions: {} } as unknown as ConfigCapabilities; -import { defaultNetflowMetrics } from '../../../../api/loki'; +import { defaultNetflowMetrics } from '../../../../api/query-response'; import { FetchCallbacks } from '../../../../model/netflow-context'; const testFetchCallbacks: FetchCallbacks = { diff --git a/web/src/components/toolbar/filters/summary-filter-button.tsx b/web/src/components/toolbar/filters/summary-filter-button.tsx index 81fb0ca19..7fa9ff51c 100644 --- a/web/src/components/toolbar/filters/summary-filter-button.tsx +++ b/web/src/components/toolbar/filters/summary-filter-button.tsx @@ -2,7 +2,7 @@ import { MenuToggle, Select, SelectList, SelectOption } from '@patternfly/react- import { FilterIcon } from '@patternfly/react-icons'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { TopologyMetricPeer } from '../../../api/loki'; +import { TopologyMetricPeer } from '../../../api/query-response'; import { Filter, FilterDefinition, Filters } from '../../../model/filters'; import { NodeType } from '../../../model/flow-query'; import { FilterDir, isDirElementFiltered, toggleDirElementFilter } from '../../../model/topology'; diff --git a/web/src/components/toolbar/histogram-toolbar.tsx b/web/src/components/toolbar/histogram-toolbar.tsx index 0ddf83dfb..f4aaa84c3 100644 --- a/web/src/components/toolbar/histogram-toolbar.tsx +++ b/web/src/components/toolbar/histogram-toolbar.tsx @@ -1,7 +1,7 @@ import { Toolbar, ToolbarItem } from '@patternfly/react-core'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { TopologyMetrics } from '../../api/loki'; +import { TopologyMetrics } from '../../api/query-response'; import { getTimeRangeOptions, TimeRange } from '../../utils/datetime'; import { formatDuration, getDateMsInSeconds, getDateSInMiliseconds, parseDuration } from '../../utils/duration'; import { defaultTimeRange } from '../../utils/router'; diff --git a/web/src/model/metrics.ts b/web/src/model/metrics.ts index 64faa5ee4..5fd90c58c 100644 --- a/web/src/model/metrics.ts +++ b/web/src/model/metrics.ts @@ -1,4 +1,4 @@ -import { MetricStats } from '../api/loki'; +import { MetricStats } from '../api/query-response'; import { percentileValues } from '../utils/metrics'; import { StatFunction } from './flow-query'; diff --git a/web/src/model/netflow-context.ts b/web/src/model/netflow-context.ts index b9809b639..4074d0397 100644 --- a/web/src/model/netflow-context.ts +++ b/web/src/model/netflow-context.ts @@ -1,7 +1,7 @@ import { K8sModel } from '@openshift-console/dynamic-plugin-sdk'; import * as React from 'react'; import { Record } from '../api/ipfix'; -import { defaultNetflowMetrics, NetflowMetrics } from '../api/loki'; +import { defaultNetflowMetrics, NetflowMetrics } from '../api/query-response'; import { StructuredError } from '../utils/errors'; import { ConfigCapabilities } from '../utils/netflow-capabilities-hook'; import { Config, defaultConfig } from './config'; diff --git a/web/src/model/topology.ts b/web/src/model/topology.ts index 1961fb11d..1effe7258 100644 --- a/web/src/model/topology.ts +++ b/web/src/model/topology.ts @@ -15,7 +15,7 @@ import { } from '@patternfly/react-topology'; import { TFunction } from 'i18next'; import _ from 'lodash'; -import { GenericMetricTls, MetricStats, TopologyMetricPeer, TopologyMetrics } from '../api/loki'; +import { GenericMetricTls, MetricStats, TopologyMetricPeer, TopologyMetrics } from '../api/query-response'; import { TruncateLength } from '../components/dropdowns/truncate-dropdown'; import { getResourceSeverity, HealthStat, HealthStats, Severity } from '../components/health/health-helper'; import { diff --git a/web/src/utils/__tests__/back-and-forth.spec.ts b/web/src/utils/__tests__/back-and-forth.spec.ts index d03a50f4e..774a6a69e 100644 --- a/web/src/utils/__tests__/back-and-forth.spec.ts +++ b/web/src/utils/__tests__/back-and-forth.spec.ts @@ -1,4 +1,4 @@ -import { FlowMetricsResult, RawTopologyMetrics } from '../../api/loki'; +import { FlowMetricsResult, RawTopologyMetrics } from '../../api/query-response'; import { getFlowMetrics, getFlowRecords } from '../../api/routes'; import { FilterDefinitionSample } from '../../components/__tests-data__/filters'; import { ScopeDefSample } from '../../components/__tests-data__/scopes'; diff --git a/web/src/utils/__tests__/metrics.spec.ts b/web/src/utils/__tests__/metrics.spec.ts index 686f0b77f..aec333c7a 100644 --- a/web/src/utils/__tests__/metrics.spec.ts +++ b/web/src/utils/__tests__/metrics.spec.ts @@ -1,5 +1,11 @@ import { TFunction } from 'i18next'; -import { GenericMetric, MetricStats, RawTopologyMetrics, TopologyMetricPeer, TopologyMetrics } from '../../api/loki'; +import { + GenericMetric, + MetricStats, + RawTopologyMetrics, + TopologyMetricPeer, + TopologyMetrics +} from '../../api/query-response'; import { ScopeDefSample } from '../../components/__tests-data__/scopes'; import { NodeData } from '../../model/topology'; import { ContextSingleton } from '../context'; diff --git a/web/src/utils/__tests__/netflow-fetching-hook.spec.ts b/web/src/utils/__tests__/netflow-fetching-hook.spec.ts index c9d37611d..3f580552f 100644 --- a/web/src/utils/__tests__/netflow-fetching-hook.spec.ts +++ b/web/src/utils/__tests__/netflow-fetching-hook.spec.ts @@ -1,5 +1,5 @@ import * as React from 'react'; -import { defaultNetflowMetrics, Stats } from '../../api/loki'; +import { defaultNetflowMetrics, Stats } from '../../api/query-response'; import { canTick, handleQueryError, handleQueryResult, InitState } from '../netflow-fetching-hook'; describe('canTick', () => { diff --git a/web/src/utils/back-and-forth.ts b/web/src/utils/back-and-forth.ts index 993076231..7ea30b732 100644 --- a/web/src/utils/back-and-forth.ts +++ b/web/src/utils/back-and-forth.ts @@ -1,4 +1,4 @@ -import { FlowMetricsResult, RecordsResult } from '../api/loki'; +import { FlowMetricsResult, RecordsResult } from '../api/query-response'; import { getFlowMetrics, getFlowRecords } from '../api/routes'; import { Filter, FilterDefinition } from '../model/filters'; import { filtersToString, StructuredFlowQuery, structuredToRawQuery } from '../model/flow-query'; diff --git a/web/src/utils/filters-helper.ts b/web/src/utils/filters-helper.ts index 96e3dcec7..e79da0c96 100644 --- a/web/src/utils/filters-helper.ts +++ b/web/src/utils/filters-helper.ts @@ -149,7 +149,6 @@ export const bnfFilterValue = ( }; export const isLokiLabel = (filter: FilterDefinition, config: Config): boolean => { - console.log('#################'); const allowLoki = config.dataSources.some(ds => ds === 'loki'); if (!allowLoki) { return false; diff --git a/web/src/utils/ids.ts b/web/src/utils/ids.ts index 61b9e3b5e..7b8dca67d 100644 --- a/web/src/utils/ids.ts +++ b/web/src/utils/ids.ts @@ -3,7 +3,7 @@ */ import { Record } from '../api/ipfix'; -import { TopologyMetricPeer } from '../api/loki'; +import { TopologyMetricPeer } from '../api/query-response'; import { getCustomScopeIds } from '../model/scope'; export const idUnknown = '-'; diff --git a/web/src/utils/metrics-helper.ts b/web/src/utils/metrics-helper.ts index 3edf77f9f..e443e0f04 100644 --- a/web/src/utils/metrics-helper.ts +++ b/web/src/utils/metrics-helper.ts @@ -1,6 +1,6 @@ import { TFunction } from 'i18next'; import * as React from 'react'; -import { GenericMetric, NamedMetric, TopologyMetricPeer, TopologyMetrics } from '../api/loki'; +import { GenericMetric, NamedMetric, TopologyMetricPeer, TopologyMetrics } from '../api/query-response'; import { TruncateLength } from '../components/dropdowns/truncate-dropdown'; import { FlowScope } from '../model/flow-query'; import { NodeData } from '../model/topology'; diff --git a/web/src/utils/metrics.ts b/web/src/utils/metrics.ts index 78e975d48..4c7cac9d3 100644 --- a/web/src/utils/metrics.ts +++ b/web/src/utils/metrics.ts @@ -11,7 +11,7 @@ import { Stats, TopologyMetricPeer, TopologyMetrics -} from '../api/loki'; +} from '../api/query-response'; import { FlowScope, MetricFunction, MetricType, topologyTlsVersionAggregateSuffix } from '../model/flow-query'; import { getCustomScopes } from '../model/scope'; import { NodeData } from '../model/topology'; diff --git a/web/src/utils/netflow-fetching-hook.ts b/web/src/utils/netflow-fetching-hook.ts index 2c54e16f6..228cc379f 100644 --- a/web/src/utils/netflow-fetching-hook.ts +++ b/web/src/utils/netflow-fetching-hook.ts @@ -1,6 +1,6 @@ import * as React from 'react'; import { Record } from '../api/ipfix'; -import { defaultNetflowMetrics, NetflowMetrics, Stats } from '../api/loki'; +import { defaultNetflowMetrics, NetflowMetrics, Stats } from '../api/query-response'; import { NetflowTrafficDrawerHandle } from '../components/drawer/netflow-traffic-drawer'; import { ViewId } from '../components/netflow-traffic'; import { Config } from '../model/config';