diff --git a/cmd/ctr/commands/tasks/metrics.go b/cmd/ctr/commands/tasks/metrics.go index 009ebfb74..80041867e 100644 --- a/cmd/ctr/commands/tasks/metrics.go +++ b/cmd/ctr/commands/tasks/metrics.go @@ -68,44 +68,40 @@ var metricsCommand = cli.Command{ if err != nil { return err } - anydata, err := typeurl.UnmarshalAny(metric.Data) - if err != nil { - return err - } - var ( - data *v1.Metrics - data2 *v2.Metrics - windowsStats *wstats.Statistics - ) - switch v := anydata.(type) { - case *v1.Metrics: - data = v - case *v2.Metrics: - data2 = v - case *wstats.Statistics: - windowsStats = v + + var data interface{} + switch { + case typeurl.Is(metric.Data, (*v1.Metrics)(nil)): + data = &v1.Metrics{} + case typeurl.Is(metric.Data, (*v2.Metrics)(nil)): + data = &v2.Metrics{} + case typeurl.Is(metric.Data, (*wstats.Statistics)(nil)): + data = &wstats.Statistics{} default: return errors.New("cannot convert metric data to cgroups.Metrics or windows.Statistics") } + if err := typeurl.UnmarshalTo(metric.Data, data); err != nil { + return err + } switch context.String(formatFlag) { case formatTable: w := tabwriter.NewWriter(os.Stdout, 1, 8, 4, ' ', 0) fmt.Fprintf(w, "ID\tTIMESTAMP\t\n") fmt.Fprintf(w, "%s\t%s\t\n\n", metric.ID, metric.Timestamp) - if data != nil { - printCgroupMetricsTable(w, data) - } else if data2 != nil { - printCgroup2MetricsTable(w, data2) - } else { - err := printWindowsStats(w, windowsStats) - if err != nil { + switch v := data.(type) { + case *v1.Metrics: + printCgroupMetricsTable(w, v) + case *v2.Metrics: + printCgroup2MetricsTable(w, v) + case *wstats.Statistics: + if err := printWindowsStats(w, v); err != nil { return fmt.Errorf("cannot convert metrics data from windows.Statistics: %w", err) } } return w.Flush() case formatJSON: - marshaledJSON, err := json.MarshalIndent(anydata, "", " ") + marshaledJSON, err := json.MarshalIndent(data, "", " ") if err != nil { return err }