Skip to content
2 changes: 1 addition & 1 deletion pkg/modules/metricsexplorer/implmetricsexplorer/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func generateMetricMetadataCacheKey(metricName string) string {

func getStatsOrderByColumn(order *qbtypes.OrderBy) (string, string, error) {
if order == nil {
return sqlColumnTimeSeries, qbtypes.OrderDirectionDesc.StringValue(), nil
return sqlColumnSamples, qbtypes.OrderDirectionDesc.StringValue(), nil
}

var columnName string
Expand Down
45 changes: 26 additions & 19 deletions pkg/modules/metricsexplorer/implmetricsexplorer/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ import (
"github.com/SigNoz/signoz/pkg/errors"
"github.com/SigNoz/signoz/pkg/factory"
"github.com/SigNoz/signoz/pkg/modules/metricsexplorer"
"github.com/SigNoz/signoz/pkg/query-service/constants"
"github.com/SigNoz/signoz/pkg/querybuilder"
"github.com/SigNoz/signoz/pkg/telemetrymetrics"
"github.com/SigNoz/signoz/pkg/telemetrystore"
"github.com/SigNoz/signoz/pkg/types/ctxtypes"
"github.com/SigNoz/signoz/pkg/types/metricsexplorertypes"
"github.com/SigNoz/signoz/pkg/types/metrictypes"
qbtypes "github.com/SigNoz/signoz/pkg/types/querybuildertypes/querybuildertypesv5"
Expand Down Expand Up @@ -94,7 +96,6 @@ func (m *module) GetStats(ctx context.Context, orgID valuer.UUID, req *metricsex
}, nil
}

// GetTreemap will return metrics treemap information once implemented.
func (m *module) GetTreemap(ctx context.Context, orgID valuer.UUID, req *metricsexplorertypes.TreemapRequest) (*metricsexplorertypes.TreemapResponse, error) {
if err := req.Validate(); err != nil {
return nil, err
Expand All @@ -106,7 +107,7 @@ func (m *module) GetTreemap(ctx context.Context, orgID valuer.UUID, req *metrics
}

resp := &metricsexplorertypes.TreemapResponse{}
switch req.Treemap {
switch req.Mode {
case metricsexplorertypes.TreemapModeSamples:
entries, err := m.computeSamplesTreemap(ctx, req, filterWhereClause)
if err != nil {
Expand Down Expand Up @@ -231,8 +232,9 @@ func (m *module) fetchUpdatedMetadata(ctx context.Context, orgID valuer.UUID, me

query, args := sb.BuildWithFlavor(sqlbuilder.ClickHouse)

valueCtx := ctxtypes.SetClickhouseMaxThreads(ctx, constants.MetricsExplorerClickhouseThreads)
db := m.telemetryStore.ClickhouseDB()
rows, err := db.Query(ctx, query, args...)
rows, err := db.Query(valueCtx, query, args...)
if err != nil {
return nil, errors.WrapInternalf(err, errors.CodeInternal, "failed to fetch updated metrics metadata")
}
Expand Down Expand Up @@ -276,20 +278,21 @@ func (m *module) fetchTimeseriesMetadata(ctx context.Context, orgID valuer.UUID,
sb := sqlbuilder.NewSelectBuilder()
sb.Select(
"metric_name",
"ANY_VALUE(description) AS description",
"ANY_VALUE(type) AS metric_type",
"ANY_VALUE(unit) AS metric_unit",
"ANY_VALUE(temporality) AS temporality",
"ANY_VALUE(is_monotonic) AS is_monotonic",
"anyLast(description) AS description",
"anyLast(type) AS metric_type",
"anyLast(unit) AS metric_unit",
"anyLast(temporality) AS temporality",
"anyLast(is_monotonic) AS is_monotonic",
)
sb.From(fmt.Sprintf("%s.%s", telemetrymetrics.DBName, telemetrymetrics.TimeseriesV4TableName))
sb.Where(sb.In("metric_name", args...))
sb.GroupBy("metric_name")

query, args := sb.BuildWithFlavor(sqlbuilder.ClickHouse)

valueCtx := ctxtypes.SetClickhouseMaxThreads(ctx, constants.MetricsExplorerClickhouseThreads)
db := m.telemetryStore.ClickhouseDB()
rows, err := db.Query(ctx, query, args...)
rows, err := db.Query(valueCtx, query, args...)
if err != nil {
return nil, errors.WrapInternalf(err, errors.CodeInternal, "failed to fetch metrics metadata from timeseries table")
}
Expand Down Expand Up @@ -373,7 +376,7 @@ func (m *module) validateMetricLabels(ctx context.Context, req *metricsexplorert
return err
}
if !hasLabel {
return errors.NewInvalidInputf(errors.CodeInvalidInput, "metric '%s' cannot be set as histogram type", req.MetricName)
return errors.NewInvalidInputf(errors.CodeInvalidInput, "metric '%s' cannot be set as histogram type: histogram metrics require the 'le' (less than or equal) label for bucket boundaries", req.MetricName)
}
}

Expand All @@ -383,7 +386,7 @@ func (m *module) validateMetricLabels(ctx context.Context, req *metricsexplorert
return err
}
if !hasLabel {
return errors.NewInvalidInputf(errors.CodeInvalidInput, "metric '%s' cannot be set as summary type", req.MetricName)
return errors.NewInvalidInputf(errors.CodeInvalidInput, "metric '%s' cannot be set as summary type: summary metrics require the 'quantile' label for quantile values", req.MetricName)
}
}

Expand All @@ -400,9 +403,10 @@ func (m *module) checkForLabelInMetric(ctx context.Context, metricName string, l

query, args := sb.BuildWithFlavor(sqlbuilder.ClickHouse)

valueCtx := ctxtypes.SetClickhouseMaxThreads(ctx, constants.MetricsExplorerClickhouseThreads)
var hasLabel bool
db := m.telemetryStore.ClickhouseDB()
err := db.QueryRow(ctx, query, args...).Scan(&hasLabel)
err := db.QueryRow(valueCtx, query, args...).Scan(&hasLabel)
if err != nil {
return false, errors.WrapInternalf(err, errors.CodeInternal, "error checking metric label %q", label)
}
Expand All @@ -428,8 +432,9 @@ func (m *module) insertMetricsMetadata(ctx context.Context, orgID valuer.UUID, r

query, args := ib.BuildWithFlavor(sqlbuilder.ClickHouse)

valueCtx := ctxtypes.SetClickhouseMaxThreads(ctx, constants.MetricsExplorerClickhouseThreads)
db := m.telemetryStore.ClickhouseDB()
if err := db.Exec(ctx, query, args...); err != nil {
if err := db.Exec(valueCtx, query, args...); err != nil {
return errors.WrapInternalf(err, errors.CodeInternal, "failed to insert metrics metadata")
}

Expand Down Expand Up @@ -458,7 +463,6 @@ func (m *module) buildFilterClause(ctx context.Context, filter *qbtypes.Filter,
return sqlbuilder.NewWhereClause(), nil
}

// TODO(nikhilmantri0902, srikanthccv): if this is the right way of dealing with whereClauseSelectors
whereClauseSelectors := querybuilder.QueryStringToKeysSelectors(expression)
for idx := range whereClauseSelectors {
whereClauseSelectors[idx].Signal = telemetrytypes.SignalMetrics
Expand All @@ -483,8 +487,8 @@ func (m *module) buildFilterClause(ctx context.Context, filter *qbtypes.Filter,
FieldKeys: keys,
}

startNs := uint64(startMillis * 1_000_000)
endNs := uint64(endMillis * 1_000_000)
startNs := querybuilder.ToNanoSecs(uint64(startMillis))
endNs := querybuilder.ToNanoSecs(uint64(endMillis))

whereClause, err := querybuilder.PrepareWhereClause(expression, opts, startNs, endNs)
if err != nil {
Expand Down Expand Up @@ -581,8 +585,9 @@ func (m *module) fetchMetricsStatsWithSamples(

query, args := finalSB.BuildWithFlavor(sqlbuilder.ClickHouse)

valueCtx := ctxtypes.SetClickhouseMaxThreads(ctx, constants.MetricsExplorerClickhouseThreads)
db := m.telemetryStore.ClickhouseDB()
rows, err := db.Query(ctx, query, args...)
rows, err := db.Query(valueCtx, query, args...)
if err != nil {
return nil, 0, errors.WrapInternalf(err, errors.CodeInternal, "failed to execute metrics stats with samples query")
}
Expand Down Expand Up @@ -650,8 +655,9 @@ func (m *module) computeTimeseriesTreemap(ctx context.Context, req *metricsexplo

query, args := finalSB.BuildWithFlavor(sqlbuilder.ClickHouse)

valueCtx := ctxtypes.SetClickhouseMaxThreads(ctx, constants.MetricsExplorerClickhouseThreads)
db := m.telemetryStore.ClickhouseDB()
rows, err := db.Query(ctx, query, args...)
rows, err := db.Query(valueCtx, query, args...)
if err != nil {
return nil, errors.WrapInternalf(err, errors.CodeInternal, "failed to execute timeseries treemap query")
}
Expand Down Expand Up @@ -749,8 +755,9 @@ func (m *module) computeSamplesTreemap(ctx context.Context, req *metricsexplorer

query, args := finalSB.BuildWithFlavor(sqlbuilder.ClickHouse)

valueCtx := ctxtypes.SetClickhouseMaxThreads(ctx, constants.MetricsExplorerClickhouseThreads)
db := m.telemetryStore.ClickhouseDB()
rows, err := db.Query(ctx, query, args...)
rows, err := db.Query(valueCtx, query, args...)
if err != nil {
return nil, errors.WrapInternalf(err, errors.CodeInternal, "failed to execute samples treemap query")
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/query-service/app/http_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,7 @@ func (ah *APIHandler) MetricExplorerRoutes(router *mux.Router, am *middleware.Au
router.HandleFunc("/api/v2/metrics/stats", am.ViewAccess(ah.Signoz.Handlers.Metrics.GetStats)).Methods(http.MethodPost)
router.HandleFunc("/api/v2/metrics/treemap", am.ViewAccess(ah.Signoz.Handlers.Metrics.GetTreemap)).Methods(http.MethodPost)
router.HandleFunc("/api/v2/metrics/metadata", am.ViewAccess(ah.Signoz.Handlers.Metrics.GetMetricMetadata)).Methods(http.MethodGet)
router.HandleFunc("/api/v2/metrics/{metric_name}/metadata", am.ViewAccess(ah.Signoz.Handlers.Metrics.UpdateMetricMetadata)).Methods(http.MethodPost)
router.HandleFunc("/api/v2/metrics/{metric_name}/metadata", am.EditAccess(ah.Signoz.Handlers.Metrics.UpdateMetricMetadata)).Methods(http.MethodPost)
}

func Intersection(a, b []int) (c []int) {
Expand Down
14 changes: 7 additions & 7 deletions pkg/types/metricsexplorertypes/metricsexplorertypes.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,11 +140,11 @@ type UpdateMetricMetadataRequest struct {

// TreemapRequest represents the payload for the metrics treemap endpoint.
type TreemapRequest struct {
Filter *qbtypes.Filter `json:"filter,omitempty"`
Start int64 `json:"start"`
End int64 `json:"end"`
Limit int `json:"limit"`
Treemap TreemapMode `json:"treemap"`
Filter *qbtypes.Filter `json:"filter,omitempty"`
Start int64 `json:"start"`
End int64 `json:"end"`
Limit int `json:"limit"`
Mode TreemapMode `json:"mode"`
}

// Validate enforces basic constraints on TreemapRequest.
Expand Down Expand Up @@ -182,11 +182,11 @@ func (req *TreemapRequest) Validate() error {
return errors.NewInvalidInputf(errors.CodeInvalidInput, "limit must be between 1 and 5000")
}

if req.Treemap != TreemapModeSamples && req.Treemap != TreemapModeTimeSeries {
if req.Mode != TreemapModeSamples && req.Mode != TreemapModeTimeSeries {
return errors.NewInvalidInputf(
errors.CodeInvalidInput,
"invalid treemap mode %q: supported values are %q or %q",
req.Treemap,
req.Mode,
TreemapModeSamples,
TreemapModeTimeSeries,
)
Expand Down
Loading