diff --git a/runsc/cli/main.go b/runsc/cli/main.go index 342433204..d9b9a7b95 100644 --- a/runsc/cli/main.go +++ b/runsc/cli/main.go @@ -94,16 +94,19 @@ func Main(version string) { subcommands.Register(new(cmd.Statefile), debugGroup) subcommands.Register(new(cmd.Symbolize), debugGroup) subcommands.Register(new(cmd.Usage), debugGroup) - subcommands.Register(new(cmd.MetricExport), debugGroup) subcommands.Register(new(cmd.ReadControl), debugGroup) subcommands.Register(new(cmd.WriteControl), debugGroup) + const metricGroup = "metrics" + subcommands.Register(new(cmd.MetricMetadata), metricGroup) + subcommands.Register(new(cmd.MetricExport), metricGroup) + subcommands.Register(new(cmd.MetricServer), metricGroup) + // Internal commands. const internalGroup = "internal use only" subcommands.Register(new(cmd.Boot), internalGroup) subcommands.Register(new(cmd.Gofer), internalGroup) subcommands.Register(new(cmd.Umount), internalGroup) - subcommands.Register(new(cmd.MetricServer), internalGroup) // Register with the main command line. config.RegisterFlags(flag.CommandLine) diff --git a/runsc/cmd/BUILD b/runsc/cmd/BUILD index 2a9c06cd6..011ba4b2a 100644 --- a/runsc/cmd/BUILD +++ b/runsc/cmd/BUILD @@ -22,6 +22,7 @@ go_library( "kill.go", "list.go", "metric_export.go", + "metric_metadata.go", "metric_server.go", "mitigate.go", "mitigate_extras.go", @@ -79,6 +80,7 @@ go_library( "@com_github_google_subcommands//:go_default_library", "@com_github_opencontainers_runtime_spec//specs-go:go_default_library", "@com_github_syndtr_gocapability//capability:go_default_library", + "@org_golang_google_protobuf//encoding/prototext:go_default_library", "@org_golang_x_sys//unix:go_default_library", ], ) diff --git a/runsc/cmd/metric_metadata.go b/runsc/cmd/metric_metadata.go new file mode 100644 index 000000000..0ebb367ab --- /dev/null +++ b/runsc/cmd/metric_metadata.go @@ -0,0 +1,62 @@ +// Copyright 2023 The gVisor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cmd + +import ( + "context" + "fmt" + + "github.com/google/subcommands" + "google.golang.org/protobuf/encoding/prototext" + "gvisor.dev/gvisor/pkg/metric" + "gvisor.dev/gvisor/runsc/cmd/util" + "gvisor.dev/gvisor/runsc/flag" +) + +// MetricMetadata implements subcommands.Command for the "metric-metadata" command. +type MetricMetadata struct { +} + +// Name implements subcommands.Command.Name. +func (*MetricMetadata) Name() string { + return "metric-metadata" +} + +// Synopsis implements subcommands.Command.Synopsis. +func (*MetricMetadata) Synopsis() string { + return "export metric metadata of metrics registered in this build, in text proto format" +} + +// Usage implements subcommands.Command.Usage. +func (*MetricMetadata) Usage() string { + return "metric-metadata" +} + +// SetFlags implements subcommands.Command.SetFlags. +func (m *MetricMetadata) SetFlags(f *flag.FlagSet) { +} + +// Execute implements subcommands.Command.Execute. +func (m *MetricMetadata) Execute(ctx context.Context, f *flag.FlagSet, args ...any) subcommands.ExitStatus { + if err := metric.Initialize(); err != nil { + util.Fatalf("Cannot initialize metrics: %v", err) + } + registration, err := metric.GetMetricRegistration() + if err != nil { + util.Fatalf("Cannot get metric registration data: %v", err) + } + fmt.Println(prototext.MarshalOptions{Multiline: true, EmitASCII: true}.Format(registration)) + return subcommands.ExitSuccess +}