diff --git a/pkg/query-service/app/inframetrics/namespaces.go b/pkg/query-service/app/inframetrics/namespaces.go index c1e5928e16..9cc1e65d6d 100644 --- a/pkg/query-service/app/inframetrics/namespaces.go +++ b/pkg/query-service/app/inframetrics/namespaces.go @@ -23,10 +23,11 @@ var ( } queryNamesForNamespaces = map[string][]string{ - "cpu": {"A"}, - "memory": {"D"}, + "cpu": {"A"}, + "memory": {"D"}, + "pod_phase": {"H", "I", "J", "K"}, } - namespaceQueryNames = []string{"A", "D"} + namespaceQueryNames = []string{"A", "D", "H", "I", "J", "K"} attributesKeysForNamespaces = []v3.AttributeKey{ {Key: "k8s_namespace_name"}, @@ -307,6 +308,19 @@ func (p *NamespacesRepo) GetNamespaceList(ctx context.Context, req model.Namespa record.MemoryUsage = memory } + if pending, ok := row.Data["H"].(float64); ok { + record.CountByPhase.Pending = int(pending) + } + if running, ok := row.Data["I"].(float64); ok { + record.CountByPhase.Running = int(running) + } + if succeeded, ok := row.Data["J"].(float64); ok { + record.CountByPhase.Succeeded = int(succeeded) + } + if failed, ok := row.Data["K"].(float64); ok { + record.CountByPhase.Failed = int(failed) + } + record.Meta = map[string]string{} if _, ok := namespaceAttrs[record.NamespaceName]; ok { record.Meta = namespaceAttrs[record.NamespaceName] diff --git a/pkg/query-service/app/inframetrics/nodes.go b/pkg/query-service/app/inframetrics/nodes.go index 796d6acb73..0aa40552c6 100644 --- a/pkg/query-service/app/inframetrics/nodes.go +++ b/pkg/query-service/app/inframetrics/nodes.go @@ -17,7 +17,7 @@ import ( var ( metricToUseForNodes = "k8s_node_cpu_utilization" - nodeAttrsToEnrich = []string{"k8s_node_name", "k8s_node_uid"} + nodeAttrsToEnrich = []string{"k8s_node_name", "k8s_node_uid", "k8s_cluster_name"} k8sNodeUIDAttrKey = "k8s_node_uid" @@ -27,13 +27,14 @@ var ( "memory": {"C"}, "memory_allocatable": {"D"}, } - nodeQueryNames = []string{"A", "B", "C", "D"} + nodeQueryNames = []string{"A", "B", "C", "D", "E", "F"} metricNamesForNodes = map[string]string{ "cpu": "k8s_node_cpu_utilization", "cpu_allocatable": "k8s_node_allocatable_cpu", "memory": "k8s_node_memory_usage", "memory_allocatable": "k8s_node_allocatable_memory", + "node_condition": "k8s_node_condition_ready", } ) @@ -325,6 +326,14 @@ func (p *NodesRepo) GetNodeList(ctx context.Context, req model.NodeListRequest) record.NodeMemoryAllocatable = memory } + if ready, ok := row.Data["E"].(float64); ok { + record.CountByCondition.Ready = int(ready) + } + + if notReady, ok := row.Data["F"].(float64); ok { + record.CountByCondition.NotReady = int(notReady) + } + record.Meta = map[string]string{} if _, ok := nodeAttrs[record.NodeUID]; ok { record.Meta = nodeAttrs[record.NodeUID] diff --git a/pkg/query-service/app/inframetrics/nodes_query.go b/pkg/query-service/app/inframetrics/nodes_query.go index 36503e4bd9..60754b3e98 100644 --- a/pkg/query-service/app/inframetrics/nodes_query.go +++ b/pkg/query-service/app/inframetrics/nodes_query.go @@ -109,6 +109,74 @@ var NodesTableListQuery = v3.QueryRangeParamsV3{ SpaceAggregation: v3.SpaceAggregationSum, Disabled: false, }, + // node conditions - Ready + "E": { + QueryName: "E", + DataSource: v3.DataSourceMetrics, + AggregateAttribute: v3.AttributeKey{ + Key: metricNamesForNodes["node_condition"], + DataType: v3.AttributeKeyDataTypeFloat64, + }, + Temporality: v3.Unspecified, + Filters: &v3.FilterSet{ + Operator: "AND", + Items: []v3.FilterItem{ + { + Key: v3.AttributeKey{ + Key: "__value", + }, + Operator: v3.FilterOperatorEqual, + Value: 1, + }, + }, + }, + GroupBy: []v3.AttributeKey{ + { + Key: k8sNodeUIDAttrKey, + DataType: v3.AttributeKeyDataTypeString, + Type: v3.AttributeKeyTypeResource, + }, + }, + Expression: "E", + ReduceTo: v3.ReduceToOperatorAvg, + TimeAggregation: v3.TimeAggregationAnyLast, + SpaceAggregation: v3.SpaceAggregationSum, + Disabled: false, + }, + // node conditions - NotReady + "F": { + QueryName: "F", + DataSource: v3.DataSourceMetrics, + AggregateAttribute: v3.AttributeKey{ + Key: metricNamesForNodes["node_condition"], + DataType: v3.AttributeKeyDataTypeFloat64, + }, + Temporality: v3.Unspecified, + Filters: &v3.FilterSet{ + Operator: "AND", + Items: []v3.FilterItem{ + { + Key: v3.AttributeKey{ + Key: "__value", + }, + Operator: v3.FilterOperatorEqual, + Value: 0, + }, + }, + }, + GroupBy: []v3.AttributeKey{ + { + Key: k8sNodeUIDAttrKey, + DataType: v3.AttributeKeyDataTypeString, + Type: v3.AttributeKeyTypeResource, + }, + }, + Expression: "F", + ReduceTo: v3.ReduceToOperatorAvg, + TimeAggregation: v3.TimeAggregationAnyLast, + SpaceAggregation: v3.SpaceAggregationSum, + Disabled: false, + }, }, PanelType: v3.PanelTypeTable, QueryType: v3.QueryTypeBuilder, diff --git a/pkg/query-service/app/inframetrics/pods.go b/pkg/query-service/app/inframetrics/pods.go index 908aef10c1..ac96286fd8 100644 --- a/pkg/query-service/app/inframetrics/pods.go +++ b/pkg/query-service/app/inframetrics/pods.go @@ -27,6 +27,7 @@ var ( "k8s_daemonset_name", "k8s_job_name", "k8s_cronjob_name", + "k8s_cluster_name", } k8sPodUIDAttrKey = "k8s_pod_uid" @@ -39,8 +40,9 @@ var ( "memory_request": {"E", "D"}, "memory_limit": {"F", "D"}, "restarts": {"G", "A"}, + "pod_phase": {"H", "I", "J", "K"}, } - podQueryNames = []string{"A", "B", "C", "D", "E", "F", "G"} + podQueryNames = []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"} metricNamesForPods = map[string]string{ "cpu": "k8s_pod_cpu_utilization", @@ -50,6 +52,7 @@ var ( "memory_request": "k8s_pod_memory_request_utilization", "memory_limit": "k8s_pod_memory_limit_utilization", "restarts": "k8s_container_restarts", + "pod_phase": "k8s_pod_phase", } ) @@ -365,6 +368,22 @@ func (p *PodsRepo) GetPodList(ctx context.Context, req model.PodListRequest) (mo record.RestartCount = int(restarts) } + if pending, ok := row.Data["H"].(float64); ok { + record.CountByPhase.Pending = int(pending) + } + + if running, ok := row.Data["I"].(float64); ok { + record.CountByPhase.Running = int(running) + } + + if succeeded, ok := row.Data["J"].(float64); ok { + record.CountByPhase.Succeeded = int(succeeded) + } + + if failed, ok := row.Data["K"].(float64); ok { + record.CountByPhase.Failed = int(failed) + } + record.Meta = map[string]string{} if _, ok := podAttrs[record.PodUID]; ok { record.Meta = podAttrs[record.PodUID] diff --git a/pkg/query-service/app/inframetrics/pods_query.go b/pkg/query-service/app/inframetrics/pods_query.go index 108f8b1476..900a934e80 100644 --- a/pkg/query-service/app/inframetrics/pods_query.go +++ b/pkg/query-service/app/inframetrics/pods_query.go @@ -54,7 +54,7 @@ var PodsTableListQuery = v3.QueryRangeParamsV3{ Expression: "B", ReduceTo: v3.ReduceToOperatorAvg, TimeAggregation: v3.TimeAggregationAvg, - SpaceAggregation: v3.SpaceAggregationSum, + SpaceAggregation: v3.SpaceAggregationAvg, Disabled: false, }, // pod cpu limit utilization @@ -80,7 +80,7 @@ var PodsTableListQuery = v3.QueryRangeParamsV3{ Expression: "C", ReduceTo: v3.ReduceToOperatorAvg, TimeAggregation: v3.TimeAggregationAvg, - SpaceAggregation: v3.SpaceAggregationSum, + SpaceAggregation: v3.SpaceAggregationAvg, Disabled: false, }, // pod memory utilization @@ -132,7 +132,7 @@ var PodsTableListQuery = v3.QueryRangeParamsV3{ Expression: "E", ReduceTo: v3.ReduceToOperatorAvg, TimeAggregation: v3.TimeAggregationAvg, - SpaceAggregation: v3.SpaceAggregationSum, + SpaceAggregation: v3.SpaceAggregationAvg, Disabled: false, }, // pod memory limit utilization @@ -158,7 +158,7 @@ var PodsTableListQuery = v3.QueryRangeParamsV3{ Expression: "F", ReduceTo: v3.ReduceToOperatorAvg, TimeAggregation: v3.TimeAggregationAvg, - SpaceAggregation: v3.SpaceAggregationSum, + SpaceAggregation: v3.SpaceAggregationAvg, Disabled: false, }, "G": { @@ -187,6 +187,142 @@ var PodsTableListQuery = v3.QueryRangeParamsV3{ Functions: []v3.Function{{Name: v3.FunctionNameRunningDiff}}, Disabled: false, }, + // pod phase pending + "H": { + QueryName: "H", + DataSource: v3.DataSourceMetrics, + AggregateAttribute: v3.AttributeKey{ + Key: metricNamesForPods["pod_phase"], + DataType: v3.AttributeKeyDataTypeFloat64, + }, + Temporality: v3.Unspecified, + Filters: &v3.FilterSet{ + Operator: "AND", + Items: []v3.FilterItem{ + { + Key: v3.AttributeKey{ + Key: "__value", + }, + Operator: v3.FilterOperatorEqual, + Value: 1, + }, + }, + }, + GroupBy: []v3.AttributeKey{ + { + Key: k8sPodUIDAttrKey, + DataType: v3.AttributeKeyDataTypeString, + Type: v3.AttributeKeyTypeResource, + }, + }, + Expression: "H", + ReduceTo: v3.ReduceToOperatorLast, + TimeAggregation: v3.TimeAggregationAnyLast, + SpaceAggregation: v3.SpaceAggregationCount, + Disabled: false, + }, + // pod phase running + "I": { + QueryName: "I", + DataSource: v3.DataSourceMetrics, + AggregateAttribute: v3.AttributeKey{ + Key: metricNamesForPods["pod_phase"], + DataType: v3.AttributeKeyDataTypeFloat64, + }, + Temporality: v3.Unspecified, + Filters: &v3.FilterSet{ + Operator: "AND", + Items: []v3.FilterItem{ + { + Key: v3.AttributeKey{ + Key: "__value", + }, + Operator: v3.FilterOperatorEqual, + Value: 2, + }, + }, + }, + GroupBy: []v3.AttributeKey{ + { + Key: k8sPodUIDAttrKey, + DataType: v3.AttributeKeyDataTypeString, + Type: v3.AttributeKeyTypeResource, + }, + }, + Expression: "I", + ReduceTo: v3.ReduceToOperatorLast, + TimeAggregation: v3.TimeAggregationAnyLast, + SpaceAggregation: v3.SpaceAggregationCount, + Disabled: false, + }, + // pod phase succeeded + "J": { + QueryName: "J", + DataSource: v3.DataSourceMetrics, + AggregateAttribute: v3.AttributeKey{ + Key: metricNamesForPods["pod_phase"], + DataType: v3.AttributeKeyDataTypeFloat64, + }, + Temporality: v3.Unspecified, + Filters: &v3.FilterSet{ + Operator: "AND", + Items: []v3.FilterItem{ + { + Key: v3.AttributeKey{ + Key: "__value", + }, + Operator: v3.FilterOperatorEqual, + Value: 3, + }, + }, + }, + GroupBy: []v3.AttributeKey{ + { + Key: k8sPodUIDAttrKey, + DataType: v3.AttributeKeyDataTypeString, + Type: v3.AttributeKeyTypeResource, + }, + }, + Expression: "J", + ReduceTo: v3.ReduceToOperatorLast, + TimeAggregation: v3.TimeAggregationAnyLast, + SpaceAggregation: v3.SpaceAggregationCount, + Disabled: false, + }, + // pod phase failed + "K": { + QueryName: "K", + DataSource: v3.DataSourceMetrics, + AggregateAttribute: v3.AttributeKey{ + Key: metricNamesForPods["pod_phase"], + DataType: v3.AttributeKeyDataTypeFloat64, + }, + Temporality: v3.Unspecified, + Filters: &v3.FilterSet{ + Operator: "AND", + Items: []v3.FilterItem{ + { + Key: v3.AttributeKey{ + Key: "__value", + }, + Operator: v3.FilterOperatorEqual, + Value: 4, + }, + }, + }, + GroupBy: []v3.AttributeKey{ + { + Key: k8sPodUIDAttrKey, + DataType: v3.AttributeKeyDataTypeString, + Type: v3.AttributeKeyTypeResource, + }, + }, + Expression: "K", + ReduceTo: v3.ReduceToOperatorLast, + TimeAggregation: v3.TimeAggregationAnyLast, + SpaceAggregation: v3.SpaceAggregationCount, + Disabled: false, + }, }, PanelType: v3.PanelTypeTable, QueryType: v3.QueryTypeBuilder, diff --git a/pkg/query-service/app/inframetrics/workload_query.go b/pkg/query-service/app/inframetrics/workload_query.go index 6050dba50d..8481c20756 100644 --- a/pkg/query-service/app/inframetrics/workload_query.go +++ b/pkg/query-service/app/inframetrics/workload_query.go @@ -4,13 +4,13 @@ import v3 "go.signoz.io/signoz/pkg/query-service/model/v3" var ( metricNamesForWorkloads = map[string]string{ - "cpu": "k8s_pod_cpu_utilization", - "cpu_req": "k8s_pod_cpu_request_utilization", - "cpu_limit": "k8s_pod_cpu_limit_utilization", - "memory": "k8s_pod_memory_usage", - "memory_req": "k8s_pod_memory_request_utilization", - "memory_limit": "k8s_pod_memory_limit_utilization", - "restarts": "k8s_container_restarts", + "cpu": "k8s_pod_cpu_utilization", + "cpu_request": "k8s_pod_cpu_request_utilization", + "cpu_limit": "k8s_pod_cpu_limit_utilization", + "memory": "k8s_pod_memory_usage", + "memory_request": "k8s_pod_memory_request_utilization", + "memory_limit": "k8s_pod_memory_limit_utilization", + "restarts": "k8s_container_restarts", } ) @@ -54,7 +54,7 @@ var WorkloadTableListQuery = v3.QueryRangeParamsV3{ Expression: "B", ReduceTo: v3.ReduceToOperatorAvg, TimeAggregation: v3.TimeAggregationAvg, - SpaceAggregation: v3.SpaceAggregationSum, + SpaceAggregation: v3.SpaceAggregationAvg, Disabled: false, }, // pod cpu limit utilization @@ -74,7 +74,7 @@ var WorkloadTableListQuery = v3.QueryRangeParamsV3{ Expression: "C", ReduceTo: v3.ReduceToOperatorAvg, TimeAggregation: v3.TimeAggregationAvg, - SpaceAggregation: v3.SpaceAggregationSum, + SpaceAggregation: v3.SpaceAggregationAvg, Disabled: false, }, // pod memory utilization @@ -114,7 +114,7 @@ var WorkloadTableListQuery = v3.QueryRangeParamsV3{ Expression: "E", ReduceTo: v3.ReduceToOperatorAvg, TimeAggregation: v3.TimeAggregationAvg, - SpaceAggregation: v3.SpaceAggregationSum, + SpaceAggregation: v3.SpaceAggregationAvg, Disabled: false, }, // pod memory limit utilization @@ -134,7 +134,7 @@ var WorkloadTableListQuery = v3.QueryRangeParamsV3{ Expression: "F", ReduceTo: v3.ReduceToOperatorAvg, TimeAggregation: v3.TimeAggregationAvg, - SpaceAggregation: v3.SpaceAggregationSum, + SpaceAggregation: v3.SpaceAggregationAvg, Disabled: false, }, "G": { diff --git a/pkg/query-service/app/metrics/query_builder.go b/pkg/query-service/app/metrics/query_builder.go index f6828540b2..8800b9f633 100644 --- a/pkg/query-service/app/metrics/query_builder.go +++ b/pkg/query-service/app/metrics/query_builder.go @@ -5,9 +5,73 @@ import ( "reflect" "strings" + v3 "go.signoz.io/signoz/pkg/query-service/model/v3" "go.uber.org/zap" ) +func AddMetricValueFilter(mq *v3.BuilderQuery) *v3.MetricValueFilter { + + var metricValueFilter *v3.MetricValueFilter = nil + + if mq != nil && mq.Filters != nil && mq.Filters.Items != nil { + for _, item := range mq.Filters.Items { + if item.Key.Key == "__value" { + switch v := item.Value.(type) { + case float64: + metricValueFilter = &v3.MetricValueFilter{ + Value: v, + } + case float32: + metricValueFilter = &v3.MetricValueFilter{ + Value: float64(v), + } + case int: + metricValueFilter = &v3.MetricValueFilter{ + Value: float64(v), + } + case int8: + metricValueFilter = &v3.MetricValueFilter{ + Value: float64(v), + } + case int16: + metricValueFilter = &v3.MetricValueFilter{ + Value: float64(v), + } + case int32: + metricValueFilter = &v3.MetricValueFilter{ + Value: float64(v), + } + case int64: + metricValueFilter = &v3.MetricValueFilter{ + Value: float64(v), + } + case uint: + metricValueFilter = &v3.MetricValueFilter{ + Value: float64(v), + } + case uint8: + metricValueFilter = &v3.MetricValueFilter{ + Value: float64(v), + } + case uint16: + metricValueFilter = &v3.MetricValueFilter{ + Value: float64(v), + } + case uint32: + metricValueFilter = &v3.MetricValueFilter{ + Value: float64(v), + } + case uint64: + metricValueFilter = &v3.MetricValueFilter{ + Value: float64(v), + } + } + } + } + } + return metricValueFilter +} + // FormattedValue formats the value to be used in clickhouse query func FormattedValue(v interface{}) string { switch x := v.(type) { diff --git a/pkg/query-service/app/metrics/v3/query_builder.go b/pkg/query-service/app/metrics/v3/query_builder.go index bb13937d4e..25f5990148 100644 --- a/pkg/query-service/app/metrics/v3/query_builder.go +++ b/pkg/query-service/app/metrics/v3/query_builder.go @@ -5,6 +5,7 @@ import ( "strings" "time" + "go.signoz.io/signoz/pkg/query-service/app/metrics" "go.signoz.io/signoz/pkg/query-service/app/metrics/v4/helpers" "go.signoz.io/signoz/pkg/query-service/common" "go.signoz.io/signoz/pkg/query-service/constants" @@ -335,6 +336,10 @@ func PrepareMetricQuery(start, end int64, queryType v3.QueryType, panelType v3.P start, end = common.AdjustedMetricTimeRange(start, end, mq.StepInterval, *mq) + if valFilter := metrics.AddMetricValueFilter(mq); valFilter != nil { + mq.MetricValueFilter = valFilter + } + // if the aggregate operator is a histogram quantile, and user has not forgotten // the le tag in the group by then add the le tag to the group by if mq.AggregateOperator == v3.AggregateOperatorHistQuant50 || diff --git a/pkg/query-service/app/metrics/v4/cumulative/table.go b/pkg/query-service/app/metrics/v4/cumulative/table.go index 3e021a5811..8ce7dbe0bb 100644 --- a/pkg/query-service/app/metrics/v4/cumulative/table.go +++ b/pkg/query-service/app/metrics/v4/cumulative/table.go @@ -20,11 +20,16 @@ func PrepareMetricQueryCumulativeTable(start, end, step int64, mq *v3.BuilderQue orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy) selectLabels := helpers.GroupByAttributeKeyTags(mq.GroupBy...) + valueFilter := " WHERE isNaN(per_series_value) = 0" + if mq.MetricValueFilter != nil { + valueFilter += fmt.Sprintf(" AND per_series_value = %f", mq.MetricValueFilter.Value) + } + queryTmpl := "SELECT %s," + " %s as value" + " FROM (%s)" + - " WHERE isNaN(per_series_value) = 0" + + valueFilter + " GROUP BY %s" + " ORDER BY %s" diff --git a/pkg/query-service/app/metrics/v4/cumulative/timeseries.go b/pkg/query-service/app/metrics/v4/cumulative/timeseries.go index 4089cb64a0..7cbf6a083b 100644 --- a/pkg/query-service/app/metrics/v4/cumulative/timeseries.go +++ b/pkg/query-service/app/metrics/v4/cumulative/timeseries.go @@ -190,11 +190,16 @@ func PrepareMetricQueryCumulativeTimeSeries(start, end, step int64, mq *v3.Build orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy) selectLabels := helpers.GroupByAttributeKeyTags(mq.GroupBy...) + valueFilter := " WHERE isNaN(per_series_value) = 0" + if mq.MetricValueFilter != nil { + valueFilter += fmt.Sprintf(" AND per_series_value = %f", mq.MetricValueFilter.Value) + } + queryTmpl := "SELECT %s," + " %s as value" + " FROM (%s)" + - " WHERE isNaN(per_series_value) = 0" + + valueFilter + " GROUP BY %s" + " ORDER BY %s" diff --git a/pkg/query-service/app/metrics/v4/delta/table.go b/pkg/query-service/app/metrics/v4/delta/table.go index bec10772f5..1629760795 100644 --- a/pkg/query-service/app/metrics/v4/delta/table.go +++ b/pkg/query-service/app/metrics/v4/delta/table.go @@ -25,11 +25,16 @@ func PrepareMetricQueryDeltaTable(start, end, step int64, mq *v3.BuilderQuery) ( orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy) selectLabels := helpers.GroupByAttributeKeyTags(mq.GroupBy...) + valueFilter := " WHERE isNaN(per_series_value) = 0" + if mq.MetricValueFilter != nil { + valueFilter += fmt.Sprintf(" AND per_series_value = %f", mq.MetricValueFilter.Value) + } + queryTmpl := "SELECT %s," + " %s as value" + " FROM (%s)" + - " WHERE isNaN(per_series_value) = 0" + + valueFilter + " GROUP BY %s" + " ORDER BY %s" diff --git a/pkg/query-service/app/metrics/v4/delta/timeseries.go b/pkg/query-service/app/metrics/v4/delta/timeseries.go index 0f6cbf82fb..2acec7a0b7 100644 --- a/pkg/query-service/app/metrics/v4/delta/timeseries.go +++ b/pkg/query-service/app/metrics/v4/delta/timeseries.go @@ -142,11 +142,16 @@ func PrepareMetricQueryDeltaTimeSeries(start, end, step int64, mq *v3.BuilderQue orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy) selectLabels := helpers.GroupByAttributeKeyTags(mq.GroupBy...) + valueFilter := " WHERE isNaN(per_series_value) = 0" + if mq.MetricValueFilter != nil { + valueFilter += fmt.Sprintf(" AND per_series_value = %f", mq.MetricValueFilter.Value) + } + queryTmpl := "SELECT %s," + " %s as value" + " FROM (%s)" + - " WHERE isNaN(per_series_value) = 0" + + valueFilter + " GROUP BY %s" + " ORDER BY %s" diff --git a/pkg/query-service/app/metrics/v4/helpers/sub_query.go b/pkg/query-service/app/metrics/v4/helpers/sub_query.go index 468f693646..3ce933661a 100644 --- a/pkg/query-service/app/metrics/v4/helpers/sub_query.go +++ b/pkg/query-service/app/metrics/v4/helpers/sub_query.go @@ -270,6 +270,10 @@ func PrepareTimeseriesFilterQuery(start, end int64, mq *v3.BuilderQuery) (string if fs != nil && len(fs.Items) != 0 { for _, item := range fs.Items { + if item.Key.Key == "__value" { + continue + } + toFormat := item.Value op := v3.FilterOperator(strings.ToLower(strings.TrimSpace(string(item.Operator)))) if op == v3.FilterOperatorContains || op == v3.FilterOperatorNotContains { diff --git a/pkg/query-service/app/metrics/v4/query_builder.go b/pkg/query-service/app/metrics/v4/query_builder.go index 380fb44f22..8725162d67 100644 --- a/pkg/query-service/app/metrics/v4/query_builder.go +++ b/pkg/query-service/app/metrics/v4/query_builder.go @@ -4,6 +4,7 @@ import ( "fmt" "time" + "go.signoz.io/signoz/pkg/query-service/app/metrics" metricsV3 "go.signoz.io/signoz/pkg/query-service/app/metrics/v3" "go.signoz.io/signoz/pkg/query-service/app/metrics/v4/cumulative" "go.signoz.io/signoz/pkg/query-service/app/metrics/v4/delta" @@ -19,6 +20,9 @@ import ( // step is in seconds func PrepareMetricQuery(start, end int64, queryType v3.QueryType, panelType v3.PanelType, mq *v3.BuilderQuery, options metricsV3.Options) (string, error) { + if valFilter := metrics.AddMetricValueFilter(mq); valFilter != nil { + mq.MetricValueFilter = valFilter + } start, end = common.AdjustedMetricTimeRange(start, end, mq.StepInterval, *mq) var quantile float64 diff --git a/pkg/query-service/model/infra.go b/pkg/query-service/model/infra.go index 4904ea2399..6a83dbc0c2 100644 --- a/pkg/query-service/model/infra.go +++ b/pkg/query-service/model/infra.go @@ -151,13 +151,20 @@ type NodeListResponse struct { Total int `json:"total"` } +type NodeCountByCondition struct { + Ready int `json:"ready"` + NotReady int `json:"notReady"` + Unknown int `json:"unknown"` +} + type NodeListRecord struct { - NodeUID string `json:"nodeUID,omitempty"` - NodeCPUUsage float64 `json:"nodeCPUUsage"` - NodeCPUAllocatable float64 `json:"nodeCPUAllocatable"` - NodeMemoryUsage float64 `json:"nodeMemoryUsage"` - NodeMemoryAllocatable float64 `json:"nodeMemoryAllocatable"` - Meta map[string]string `json:"meta"` + NodeUID string `json:"nodeUID,omitempty"` + NodeCPUUsage float64 `json:"nodeCPUUsage"` + NodeCPUAllocatable float64 `json:"nodeCPUAllocatable"` + NodeMemoryUsage float64 `json:"nodeMemoryUsage"` + NodeMemoryAllocatable float64 `json:"nodeMemoryAllocatable"` + CountByCondition NodeCountByCondition `json:"countByCondition"` + Meta map[string]string `json:"meta"` } type NamespaceListRequest struct { @@ -180,6 +187,7 @@ type NamespaceListRecord struct { NamespaceName string `json:"namespaceName"` CPUUsage float64 `json:"cpuUsage"` MemoryUsage float64 `json:"memoryUsage"` + CountByPhase PodCountByPhase `json:"countByPhase"` Meta map[string]string `json:"meta"` } diff --git a/pkg/query-service/model/v3/v3.go b/pkg/query-service/model/v3/v3.go index 4d6a6b1ac8..158718a12b 100644 --- a/pkg/query-service/model/v3/v3.go +++ b/pkg/query-service/model/v3/v3.go @@ -770,6 +770,19 @@ type MetricTableHints struct { SamplesTableName string } +type MetricValueFilter struct { + Value float64 +} + +func (m *MetricValueFilter) Clone() *MetricValueFilter { + if m == nil { + return nil + } + return &MetricValueFilter{ + Value: m.Value, + } +} + type BuilderQuery struct { QueryName string `json:"queryName"` StepInterval int64 `json:"stepInterval"` @@ -795,7 +808,8 @@ type BuilderQuery struct { ShiftBy int64 IsAnomaly bool QueriesUsedInFormula []string - MetricTableHints *MetricTableHints `json:"-"` + MetricTableHints *MetricTableHints `json:"-"` + MetricValueFilter *MetricValueFilter `json:"-"` } func (b *BuilderQuery) SetShiftByFromFunc() { @@ -859,6 +873,7 @@ func (b *BuilderQuery) Clone() *BuilderQuery { ShiftBy: b.ShiftBy, IsAnomaly: b.IsAnomaly, QueriesUsedInFormula: b.QueriesUsedInFormula, + MetricValueFilter: b.MetricValueFilter.Clone(), } }