chore: address some gaps in k8s monitoring (#6653)

This commit is contained in:
Srikanth Chekuri 2024-12-19 17:22:39 +05:30 committed by GitHub
parent cecc57e72d
commit 77420b9d3a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 398 additions and 32 deletions

View File

@ -23,10 +23,11 @@ var (
} }
queryNamesForNamespaces = map[string][]string{ queryNamesForNamespaces = map[string][]string{
"cpu": {"A"}, "cpu": {"A"},
"memory": {"D"}, "memory": {"D"},
"pod_phase": {"H", "I", "J", "K"},
} }
namespaceQueryNames = []string{"A", "D"} namespaceQueryNames = []string{"A", "D", "H", "I", "J", "K"}
attributesKeysForNamespaces = []v3.AttributeKey{ attributesKeysForNamespaces = []v3.AttributeKey{
{Key: "k8s_namespace_name"}, {Key: "k8s_namespace_name"},
@ -307,6 +308,19 @@ func (p *NamespacesRepo) GetNamespaceList(ctx context.Context, req model.Namespa
record.MemoryUsage = memory 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{} record.Meta = map[string]string{}
if _, ok := namespaceAttrs[record.NamespaceName]; ok { if _, ok := namespaceAttrs[record.NamespaceName]; ok {
record.Meta = namespaceAttrs[record.NamespaceName] record.Meta = namespaceAttrs[record.NamespaceName]

View File

@ -17,7 +17,7 @@ import (
var ( var (
metricToUseForNodes = "k8s_node_cpu_utilization" 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" k8sNodeUIDAttrKey = "k8s_node_uid"
@ -27,13 +27,14 @@ var (
"memory": {"C"}, "memory": {"C"},
"memory_allocatable": {"D"}, "memory_allocatable": {"D"},
} }
nodeQueryNames = []string{"A", "B", "C", "D"} nodeQueryNames = []string{"A", "B", "C", "D", "E", "F"}
metricNamesForNodes = map[string]string{ metricNamesForNodes = map[string]string{
"cpu": "k8s_node_cpu_utilization", "cpu": "k8s_node_cpu_utilization",
"cpu_allocatable": "k8s_node_allocatable_cpu", "cpu_allocatable": "k8s_node_allocatable_cpu",
"memory": "k8s_node_memory_usage", "memory": "k8s_node_memory_usage",
"memory_allocatable": "k8s_node_allocatable_memory", "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 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{} record.Meta = map[string]string{}
if _, ok := nodeAttrs[record.NodeUID]; ok { if _, ok := nodeAttrs[record.NodeUID]; ok {
record.Meta = nodeAttrs[record.NodeUID] record.Meta = nodeAttrs[record.NodeUID]

View File

@ -109,6 +109,74 @@ var NodesTableListQuery = v3.QueryRangeParamsV3{
SpaceAggregation: v3.SpaceAggregationSum, SpaceAggregation: v3.SpaceAggregationSum,
Disabled: false, 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, PanelType: v3.PanelTypeTable,
QueryType: v3.QueryTypeBuilder, QueryType: v3.QueryTypeBuilder,

View File

@ -27,6 +27,7 @@ var (
"k8s_daemonset_name", "k8s_daemonset_name",
"k8s_job_name", "k8s_job_name",
"k8s_cronjob_name", "k8s_cronjob_name",
"k8s_cluster_name",
} }
k8sPodUIDAttrKey = "k8s_pod_uid" k8sPodUIDAttrKey = "k8s_pod_uid"
@ -39,8 +40,9 @@ var (
"memory_request": {"E", "D"}, "memory_request": {"E", "D"},
"memory_limit": {"F", "D"}, "memory_limit": {"F", "D"},
"restarts": {"G", "A"}, "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{ metricNamesForPods = map[string]string{
"cpu": "k8s_pod_cpu_utilization", "cpu": "k8s_pod_cpu_utilization",
@ -50,6 +52,7 @@ var (
"memory_request": "k8s_pod_memory_request_utilization", "memory_request": "k8s_pod_memory_request_utilization",
"memory_limit": "k8s_pod_memory_limit_utilization", "memory_limit": "k8s_pod_memory_limit_utilization",
"restarts": "k8s_container_restarts", "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) 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{} record.Meta = map[string]string{}
if _, ok := podAttrs[record.PodUID]; ok { if _, ok := podAttrs[record.PodUID]; ok {
record.Meta = podAttrs[record.PodUID] record.Meta = podAttrs[record.PodUID]

View File

@ -54,7 +54,7 @@ var PodsTableListQuery = v3.QueryRangeParamsV3{
Expression: "B", Expression: "B",
ReduceTo: v3.ReduceToOperatorAvg, ReduceTo: v3.ReduceToOperatorAvg,
TimeAggregation: v3.TimeAggregationAvg, TimeAggregation: v3.TimeAggregationAvg,
SpaceAggregation: v3.SpaceAggregationSum, SpaceAggregation: v3.SpaceAggregationAvg,
Disabled: false, Disabled: false,
}, },
// pod cpu limit utilization // pod cpu limit utilization
@ -80,7 +80,7 @@ var PodsTableListQuery = v3.QueryRangeParamsV3{
Expression: "C", Expression: "C",
ReduceTo: v3.ReduceToOperatorAvg, ReduceTo: v3.ReduceToOperatorAvg,
TimeAggregation: v3.TimeAggregationAvg, TimeAggregation: v3.TimeAggregationAvg,
SpaceAggregation: v3.SpaceAggregationSum, SpaceAggregation: v3.SpaceAggregationAvg,
Disabled: false, Disabled: false,
}, },
// pod memory utilization // pod memory utilization
@ -132,7 +132,7 @@ var PodsTableListQuery = v3.QueryRangeParamsV3{
Expression: "E", Expression: "E",
ReduceTo: v3.ReduceToOperatorAvg, ReduceTo: v3.ReduceToOperatorAvg,
TimeAggregation: v3.TimeAggregationAvg, TimeAggregation: v3.TimeAggregationAvg,
SpaceAggregation: v3.SpaceAggregationSum, SpaceAggregation: v3.SpaceAggregationAvg,
Disabled: false, Disabled: false,
}, },
// pod memory limit utilization // pod memory limit utilization
@ -158,7 +158,7 @@ var PodsTableListQuery = v3.QueryRangeParamsV3{
Expression: "F", Expression: "F",
ReduceTo: v3.ReduceToOperatorAvg, ReduceTo: v3.ReduceToOperatorAvg,
TimeAggregation: v3.TimeAggregationAvg, TimeAggregation: v3.TimeAggregationAvg,
SpaceAggregation: v3.SpaceAggregationSum, SpaceAggregation: v3.SpaceAggregationAvg,
Disabled: false, Disabled: false,
}, },
"G": { "G": {
@ -187,6 +187,142 @@ var PodsTableListQuery = v3.QueryRangeParamsV3{
Functions: []v3.Function{{Name: v3.FunctionNameRunningDiff}}, Functions: []v3.Function{{Name: v3.FunctionNameRunningDiff}},
Disabled: false, 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, PanelType: v3.PanelTypeTable,
QueryType: v3.QueryTypeBuilder, QueryType: v3.QueryTypeBuilder,

View File

@ -4,13 +4,13 @@ import v3 "go.signoz.io/signoz/pkg/query-service/model/v3"
var ( var (
metricNamesForWorkloads = map[string]string{ metricNamesForWorkloads = map[string]string{
"cpu": "k8s_pod_cpu_utilization", "cpu": "k8s_pod_cpu_utilization",
"cpu_req": "k8s_pod_cpu_request_utilization", "cpu_request": "k8s_pod_cpu_request_utilization",
"cpu_limit": "k8s_pod_cpu_limit_utilization", "cpu_limit": "k8s_pod_cpu_limit_utilization",
"memory": "k8s_pod_memory_usage", "memory": "k8s_pod_memory_usage",
"memory_req": "k8s_pod_memory_request_utilization", "memory_request": "k8s_pod_memory_request_utilization",
"memory_limit": "k8s_pod_memory_limit_utilization", "memory_limit": "k8s_pod_memory_limit_utilization",
"restarts": "k8s_container_restarts", "restarts": "k8s_container_restarts",
} }
) )
@ -54,7 +54,7 @@ var WorkloadTableListQuery = v3.QueryRangeParamsV3{
Expression: "B", Expression: "B",
ReduceTo: v3.ReduceToOperatorAvg, ReduceTo: v3.ReduceToOperatorAvg,
TimeAggregation: v3.TimeAggregationAvg, TimeAggregation: v3.TimeAggregationAvg,
SpaceAggregation: v3.SpaceAggregationSum, SpaceAggregation: v3.SpaceAggregationAvg,
Disabled: false, Disabled: false,
}, },
// pod cpu limit utilization // pod cpu limit utilization
@ -74,7 +74,7 @@ var WorkloadTableListQuery = v3.QueryRangeParamsV3{
Expression: "C", Expression: "C",
ReduceTo: v3.ReduceToOperatorAvg, ReduceTo: v3.ReduceToOperatorAvg,
TimeAggregation: v3.TimeAggregationAvg, TimeAggregation: v3.TimeAggregationAvg,
SpaceAggregation: v3.SpaceAggregationSum, SpaceAggregation: v3.SpaceAggregationAvg,
Disabled: false, Disabled: false,
}, },
// pod memory utilization // pod memory utilization
@ -114,7 +114,7 @@ var WorkloadTableListQuery = v3.QueryRangeParamsV3{
Expression: "E", Expression: "E",
ReduceTo: v3.ReduceToOperatorAvg, ReduceTo: v3.ReduceToOperatorAvg,
TimeAggregation: v3.TimeAggregationAvg, TimeAggregation: v3.TimeAggregationAvg,
SpaceAggregation: v3.SpaceAggregationSum, SpaceAggregation: v3.SpaceAggregationAvg,
Disabled: false, Disabled: false,
}, },
// pod memory limit utilization // pod memory limit utilization
@ -134,7 +134,7 @@ var WorkloadTableListQuery = v3.QueryRangeParamsV3{
Expression: "F", Expression: "F",
ReduceTo: v3.ReduceToOperatorAvg, ReduceTo: v3.ReduceToOperatorAvg,
TimeAggregation: v3.TimeAggregationAvg, TimeAggregation: v3.TimeAggregationAvg,
SpaceAggregation: v3.SpaceAggregationSum, SpaceAggregation: v3.SpaceAggregationAvg,
Disabled: false, Disabled: false,
}, },
"G": { "G": {

View File

@ -5,9 +5,73 @@ import (
"reflect" "reflect"
"strings" "strings"
v3 "go.signoz.io/signoz/pkg/query-service/model/v3"
"go.uber.org/zap" "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 // FormattedValue formats the value to be used in clickhouse query
func FormattedValue(v interface{}) string { func FormattedValue(v interface{}) string {
switch x := v.(type) { switch x := v.(type) {

View File

@ -5,6 +5,7 @@ import (
"strings" "strings"
"time" "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/app/metrics/v4/helpers"
"go.signoz.io/signoz/pkg/query-service/common" "go.signoz.io/signoz/pkg/query-service/common"
"go.signoz.io/signoz/pkg/query-service/constants" "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) 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 // 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 // the le tag in the group by then add the le tag to the group by
if mq.AggregateOperator == v3.AggregateOperatorHistQuant50 || if mq.AggregateOperator == v3.AggregateOperatorHistQuant50 ||

View File

@ -20,11 +20,16 @@ func PrepareMetricQueryCumulativeTable(start, end, step int64, mq *v3.BuilderQue
orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy) orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy)
selectLabels := helpers.GroupByAttributeKeyTags(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 := queryTmpl :=
"SELECT %s," + "SELECT %s," +
" %s as value" + " %s as value" +
" FROM (%s)" + " FROM (%s)" +
" WHERE isNaN(per_series_value) = 0" + valueFilter +
" GROUP BY %s" + " GROUP BY %s" +
" ORDER BY %s" " ORDER BY %s"

View File

@ -190,11 +190,16 @@ func PrepareMetricQueryCumulativeTimeSeries(start, end, step int64, mq *v3.Build
orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy) orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy)
selectLabels := helpers.GroupByAttributeKeyTags(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 := queryTmpl :=
"SELECT %s," + "SELECT %s," +
" %s as value" + " %s as value" +
" FROM (%s)" + " FROM (%s)" +
" WHERE isNaN(per_series_value) = 0" + valueFilter +
" GROUP BY %s" + " GROUP BY %s" +
" ORDER BY %s" " ORDER BY %s"

View File

@ -25,11 +25,16 @@ func PrepareMetricQueryDeltaTable(start, end, step int64, mq *v3.BuilderQuery) (
orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy) orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy)
selectLabels := helpers.GroupByAttributeKeyTags(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 := queryTmpl :=
"SELECT %s," + "SELECT %s," +
" %s as value" + " %s as value" +
" FROM (%s)" + " FROM (%s)" +
" WHERE isNaN(per_series_value) = 0" + valueFilter +
" GROUP BY %s" + " GROUP BY %s" +
" ORDER BY %s" " ORDER BY %s"

View File

@ -142,11 +142,16 @@ func PrepareMetricQueryDeltaTimeSeries(start, end, step int64, mq *v3.BuilderQue
orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy) orderBy := helpers.OrderByAttributeKeyTags(mq.OrderBy, mq.GroupBy)
selectLabels := helpers.GroupByAttributeKeyTags(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 := queryTmpl :=
"SELECT %s," + "SELECT %s," +
" %s as value" + " %s as value" +
" FROM (%s)" + " FROM (%s)" +
" WHERE isNaN(per_series_value) = 0" + valueFilter +
" GROUP BY %s" + " GROUP BY %s" +
" ORDER BY %s" " ORDER BY %s"

View File

@ -270,6 +270,10 @@ func PrepareTimeseriesFilterQuery(start, end int64, mq *v3.BuilderQuery) (string
if fs != nil && len(fs.Items) != 0 { if fs != nil && len(fs.Items) != 0 {
for _, item := range fs.Items { for _, item := range fs.Items {
if item.Key.Key == "__value" {
continue
}
toFormat := item.Value toFormat := item.Value
op := v3.FilterOperator(strings.ToLower(strings.TrimSpace(string(item.Operator)))) op := v3.FilterOperator(strings.ToLower(strings.TrimSpace(string(item.Operator))))
if op == v3.FilterOperatorContains || op == v3.FilterOperatorNotContains { if op == v3.FilterOperatorContains || op == v3.FilterOperatorNotContains {

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"time" "time"
"go.signoz.io/signoz/pkg/query-service/app/metrics"
metricsV3 "go.signoz.io/signoz/pkg/query-service/app/metrics/v3" 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/cumulative"
"go.signoz.io/signoz/pkg/query-service/app/metrics/v4/delta" "go.signoz.io/signoz/pkg/query-service/app/metrics/v4/delta"
@ -19,6 +20,9 @@ import (
// step is in seconds // step is in seconds
func PrepareMetricQuery(start, end int64, queryType v3.QueryType, panelType v3.PanelType, mq *v3.BuilderQuery, options metricsV3.Options) (string, error) { 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) start, end = common.AdjustedMetricTimeRange(start, end, mq.StepInterval, *mq)
var quantile float64 var quantile float64

View File

@ -151,13 +151,20 @@ type NodeListResponse struct {
Total int `json:"total"` Total int `json:"total"`
} }
type NodeCountByCondition struct {
Ready int `json:"ready"`
NotReady int `json:"notReady"`
Unknown int `json:"unknown"`
}
type NodeListRecord struct { type NodeListRecord struct {
NodeUID string `json:"nodeUID,omitempty"` NodeUID string `json:"nodeUID,omitempty"`
NodeCPUUsage float64 `json:"nodeCPUUsage"` NodeCPUUsage float64 `json:"nodeCPUUsage"`
NodeCPUAllocatable float64 `json:"nodeCPUAllocatable"` NodeCPUAllocatable float64 `json:"nodeCPUAllocatable"`
NodeMemoryUsage float64 `json:"nodeMemoryUsage"` NodeMemoryUsage float64 `json:"nodeMemoryUsage"`
NodeMemoryAllocatable float64 `json:"nodeMemoryAllocatable"` NodeMemoryAllocatable float64 `json:"nodeMemoryAllocatable"`
Meta map[string]string `json:"meta"` CountByCondition NodeCountByCondition `json:"countByCondition"`
Meta map[string]string `json:"meta"`
} }
type NamespaceListRequest struct { type NamespaceListRequest struct {
@ -180,6 +187,7 @@ type NamespaceListRecord struct {
NamespaceName string `json:"namespaceName"` NamespaceName string `json:"namespaceName"`
CPUUsage float64 `json:"cpuUsage"` CPUUsage float64 `json:"cpuUsage"`
MemoryUsage float64 `json:"memoryUsage"` MemoryUsage float64 `json:"memoryUsage"`
CountByPhase PodCountByPhase `json:"countByPhase"`
Meta map[string]string `json:"meta"` Meta map[string]string `json:"meta"`
} }

View File

@ -770,6 +770,19 @@ type MetricTableHints struct {
SamplesTableName string 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 { type BuilderQuery struct {
QueryName string `json:"queryName"` QueryName string `json:"queryName"`
StepInterval int64 `json:"stepInterval"` StepInterval int64 `json:"stepInterval"`
@ -795,7 +808,8 @@ type BuilderQuery struct {
ShiftBy int64 ShiftBy int64
IsAnomaly bool IsAnomaly bool
QueriesUsedInFormula []string QueriesUsedInFormula []string
MetricTableHints *MetricTableHints `json:"-"` MetricTableHints *MetricTableHints `json:"-"`
MetricValueFilter *MetricValueFilter `json:"-"`
} }
func (b *BuilderQuery) SetShiftByFromFunc() { func (b *BuilderQuery) SetShiftByFromFunc() {
@ -859,6 +873,7 @@ func (b *BuilderQuery) Clone() *BuilderQuery {
ShiftBy: b.ShiftBy, ShiftBy: b.ShiftBy,
IsAnomaly: b.IsAnomaly, IsAnomaly: b.IsAnomaly,
QueriesUsedInFormula: b.QueriesUsedInFormula, QueriesUsedInFormula: b.QueriesUsedInFormula,
MetricValueFilter: b.MetricValueFilter.Clone(),
} }
} }