plugins/core/tracer_ignore.go (110 lines of code) (raw):

// Licensed to Apache Software Foundation (ASF) under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Apache Software Foundation (ASF) licenses this file to you 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 core import ( "strings" ) func tracerIgnore(operationName string, ignoreSuffixList, ignorePath []string) bool { return ignoreSuffix(operationName, ignoreSuffixList) || traceIgnorePath(operationName, ignorePath) } func ignoreSuffix(operationName string, ignoreSuffix []string) bool { if len(ignoreSuffix) == 0 { return false } suffixIdx := strings.LastIndex(operationName, ".") if suffixIdx == -1 { return false } for _, suffix := range ignoreSuffix { if suffix == operationName[suffixIdx:] { return true } } return false } func traceIgnorePath(operationName string, ignorePath []string) bool { if len(ignorePath) == 0 { return false } for _, pattern := range ignorePath { if normalMatch(pattern, 0, operationName, 0) { return true } } return false } // normalMatch determines whether the operation name matches the wildcard pattern. // The parameters `p` and `s` represent the current index in pattern and operationName respectively. func normalMatch(pattern string, p int, operationName string, s int) bool { for p < len(pattern) { pc := pattern[p] sc := safeCharAt(operationName, s) if pc == '*' { p++ if safeCharAt(pattern, p) == '*' { p++ return multiWildcardMatch(pattern, p, operationName, s) } return wildcardMatch(pattern, p, operationName, s) } if (pc == '?' && sc != 0 && sc != '/') || pc == sc { s++ p++ continue } return false } return s == len(operationName) } func wildcardMatch(pattern string, p int, operationName string, s int) bool { pc := safeCharAt(pattern, p) if pc == 0 { for { sc := safeCharAt(operationName, s) if sc == 0 { return true } if sc == '/' { return s == len(operationName)-1 } s++ } } for { sc := safeCharAt(operationName, s) if sc == '/' { if pc == sc { return normalMatch(pattern, p+1, operationName, s+1) } return false } if !normalMatch(pattern, p, operationName, s) { if s >= len(operationName) { return false } s++ continue } return true } } func multiWildcardMatch(pattern string, p int, operationName string, s int) bool { switch safeCharAt(pattern, p) { case 0: return true case '/': p++ } for { if !normalMatch(pattern, p, operationName, s) { if s >= len(operationName) { return false } s++ continue } return true } } func safeCharAt(value string, index int) byte { if index >= len(value) { return 0 } return value[index] }