diff --git a/cmd/collectors/zapiperf/plugins/vscan/vscan.go b/cmd/collectors/zapiperf/plugins/vscan/vscan.go index db7e22807..1510620ac 100644 --- a/cmd/collectors/zapiperf/plugins/vscan/vscan.go +++ b/cmd/collectors/zapiperf/plugins/vscan/vscan.go @@ -44,17 +44,35 @@ func (v *Vscan) addSvmAndScannerLabels(data *matrix.Matrix) { continue } ontapName := instance.GetLabel("instance_uuid") - // colon separated list of fields - // vs_test4 : 2.2.2.2 : umeng-aff300-05 - // svm : scanner : node - if split := strings.Split(ontapName, ":"); len(split) >= 3 { - instance.SetLabel("svm", split[0]) - instance.SetLabel("scanner", split[1]) - instance.SetLabel("node", split[2]) - } else { + svm, scanner, node, ok := splitOntapName(ontapName) + if !ok { v.Logger.Warn().Str("ontapName", ontapName).Msg("Failed to parse svm and scanner labels") + continue } + instance.SetLabel("svm", svm) + instance.SetLabel("scanner", scanner) + instance.SetLabel("node", node) + } +} + +func splitOntapName(ontapName string) (string, string, string, bool) { + // colon separated list of fields + // svm : scanner : node + // vs_test4 : 2.2.2.2 : umeng-aff300-05 + // moon-ad : 2a03:1e80:a15:60c::1:2a5 : moon-02 + + firstColon := strings.Index(ontapName, ":") + if firstColon == -1 { + return "", "", "", false + } + lastColon := strings.LastIndex(ontapName, ":") + if lastColon == -1 { + return "", "", "", false + } + if firstColon == lastColon { + return "", "", "", false } + return ontapName[:firstColon], ontapName[firstColon+1 : lastColon], ontapName[lastColon+1:], true } func (v *Vscan) aggregatePerScanner(data *matrix.Matrix) ([]*matrix.Matrix, *util.Metadata, error) { diff --git a/cmd/collectors/zapiperf/plugins/vscan/vscan_test.go b/cmd/collectors/zapiperf/plugins/vscan/vscan_test.go new file mode 100644 index 000000000..bf9031aa7 --- /dev/null +++ b/cmd/collectors/zapiperf/plugins/vscan/vscan_test.go @@ -0,0 +1,65 @@ +package vscan + +import "testing" + +func Test_splitOntapName(t *testing.T) { + tests := []struct { + name string + ontapName string + svm string + scanner string + node string + isValid bool + }{ + { + name: "valid", + ontapName: "svm:scanner:node", + svm: "svm", + scanner: "scanner", + node: "node", + isValid: true, + }, + { + name: "ipv6", + ontapName: "moon-ad:2a03:1e80:a15:60c::1:2a5:moon-02", + svm: "moon-ad", + scanner: "2a03:1e80:a15:60c::1:2a5", + node: "moon-02", + isValid: true, + }, + { + name: "invalid zero colon", + ontapName: "svm", + svm: "", + scanner: "", + node: "", + isValid: false, + }, + { + name: "invalid one colon", + ontapName: "svm:scanner", + svm: "", + scanner: "", + node: "", + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotSVM, gotScanner, gotNode, ok := splitOntapName(tt.ontapName) + if gotSVM != tt.svm { + t.Errorf("splitOntapName() got = %v, want %v", gotSVM, tt.svm) + } + if gotScanner != tt.scanner { + t.Errorf("splitOntapName() got = %v, want %v", gotScanner, tt.scanner) + } + if gotNode != tt.node { + t.Errorf("splitOntapName() got = %v, want %v", gotNode, tt.node) + } + if ok != tt.isValid { + t.Errorf("splitOntapName() got = %v, want %v", ok, tt.isValid) + } + }) + } +}