From 5e29d232f37c34513c9fa8ea4126b90fabe046d9 Mon Sep 17 00:00:00 2001 From: Wu Sheng Date: Tue, 23 Jun 2026 17:14:52 +0800 Subject: [PATCH 1/2] Add --value-column / --value-type to admin inspect entities for foreign-metric inspect SkyWalking OAP's /inspect/entities now accepts a metric persisted by another OAP (one this node does not define locally) when the caller supplies the metric's value column + type. Expose those as --value-column / --value-type on `swctl admin inspect entities`; both are passed through as query params and are required only when the metric is unknown to the target OAP's local registry. --- internal/commands/admin/inspect/inspect.go | 26 +++++++++++++++++----- pkg/admin/inspect/inspect.go | 11 +++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/internal/commands/admin/inspect/inspect.go b/internal/commands/admin/inspect/inspect.go index 528d6c6..21ba454 100644 --- a/internal/commands/admin/inspect/inspect.go +++ b/internal/commands/admin/inspect/inspect.go @@ -92,7 +92,11 @@ Each row carries an MQE-ready entity to paste into a follow-up "swctl metrics ex Examples: 1. Entities reporting service_cpm in the last 30 minutes: -$ swctl admin inspect entities --metric service_cpm`, +$ swctl admin inspect entities --metric service_cpm + +2. Inspect a metric persisted by ANOTHER OAP (not defined on this OAP) — supply its value + column + type so the OAP resolves it from storage without its local registry: +$ swctl admin inspect entities --metric meter_foo --value-column value --value-type LONG`, Flags: flags.Flags( flags.DurationFlags, []cli.Flag{ @@ -105,6 +109,14 @@ $ swctl admin inspect entities --metric service_cpm`, Name: "limit", Usage: fmt.Sprintf("max rows scanned at the storage layer (1-%d, server default 300)", inspect.MaxLimit), }, + &cli.StringFlag{ + Name: "value-column", + Usage: "the metric's value `column` (e.g. value, value_, double_value); REQUIRED when the metric is not defined on the target OAP", + }, + &cli.StringFlag{ + Name: "value-type", + Usage: "value data `type` (LONG / INT / DOUBLE / LABELED); REQUIRED when the metric is not defined on the target OAP", + }, }, ), Before: interceptor.BeforeChain( @@ -118,11 +130,13 @@ $ swctl admin inspect entities --metric service_cpm`, step := ctx.Generic("step").(*model.StepEnumValue).Selected entities, err := inspect.ListEntities(ctx.Context, inspect.EntitiesOptions{ - Metric: ctx.String("metric"), - Start: ctx.String("start"), - End: ctx.String("end"), - Step: string(step), - Limit: limit, + Metric: ctx.String("metric"), + Start: ctx.String("start"), + End: ctx.String("end"), + Step: string(step), + Limit: limit, + ValueColumn: ctx.String("value-column"), + ValueType: ctx.String("value-type"), }) if err != nil { return preflight.Explain(ctx.Context, err, preflight.ModuleInspect, "SW_INSPECT") diff --git a/pkg/admin/inspect/inspect.go b/pkg/admin/inspect/inspect.go index 6ff9807..7c45bbb 100644 --- a/pkg/admin/inspect/inspect.go +++ b/pkg/admin/inspect/inspect.go @@ -82,6 +82,11 @@ type EntitiesOptions struct { End string Step string Limit int + // ValueColumn / ValueType are required only when the metric is NOT defined on the target OAP + // (a metric persisted by another OAP). When set, the OAP resolves the metric from storage + // using this caller-supplied metadata instead of its local registry. + ValueColumn string + ValueType string } // ListMetrics lists the registered metric catalog (GET /inspect/metrics). @@ -116,6 +121,12 @@ func ListEntities(ctx context.Context, opts EntitiesOptions) (*Entities, error) if opts.Limit > 0 { query.Set("limit", strconv.Itoa(opts.Limit)) } + if opts.ValueColumn != "" { + query.Set("valueColumn", opts.ValueColumn) + } + if opts.ValueType != "" { + query.Set("valueType", opts.ValueType) + } var out Entities err := client.GetJSON(ctx, "/inspect/entities", query, &out) From 5a58a20b3b190adfc1f7a33705a1e1f536d4f68c Mon Sep 17 00:00:00 2001 From: Wu Sheng Date: Tue, 23 Jun 2026 20:16:46 +0800 Subject: [PATCH 2/2] Pass EntitiesOptions by pointer to satisfy gocritic hugeParam Adding ValueColumn/ValueType pushed EntitiesOptions to 104 bytes, over gocritic's hugeParam 80-byte threshold; pass it by pointer. --- internal/commands/admin/inspect/inspect.go | 2 +- pkg/admin/inspect/inspect.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/commands/admin/inspect/inspect.go b/internal/commands/admin/inspect/inspect.go index 21ba454..385807a 100644 --- a/internal/commands/admin/inspect/inspect.go +++ b/internal/commands/admin/inspect/inspect.go @@ -129,7 +129,7 @@ $ swctl admin inspect entities --metric meter_foo --value-column value --value-t } step := ctx.Generic("step").(*model.StepEnumValue).Selected - entities, err := inspect.ListEntities(ctx.Context, inspect.EntitiesOptions{ + entities, err := inspect.ListEntities(ctx.Context, &inspect.EntitiesOptions{ Metric: ctx.String("metric"), Start: ctx.String("start"), End: ctx.String("end"), diff --git a/pkg/admin/inspect/inspect.go b/pkg/admin/inspect/inspect.go index 7c45bbb..ef3ee20 100644 --- a/pkg/admin/inspect/inspect.go +++ b/pkg/admin/inspect/inspect.go @@ -112,7 +112,7 @@ func ListMetrics(ctx context.Context, opts MetricsOptions) (*Metrics, error) { // ListEntities enumerates the entities holding values for a metric over a time range // (GET /inspect/entities). Only REGULAR_VALUE / LABELED_VALUE metrics are accepted. -func ListEntities(ctx context.Context, opts EntitiesOptions) (*Entities, error) { +func ListEntities(ctx context.Context, opts *EntitiesOptions) (*Entities, error) { query := url.Values{} query.Set("metric", opts.Metric) query.Set("start", opts.Start)