59 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
package templating
 | 
						|
 | 
						|
import (
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
// matcher determines which template should be applied to a given metric
 | 
						|
// based on a filter tree.
 | 
						|
type matcher struct {
 | 
						|
	root            *node
 | 
						|
	defaultTemplate *Template
 | 
						|
}
 | 
						|
 | 
						|
// newMatcher creates a new matcher.
 | 
						|
func newMatcher(defaultTemplate *Template) *matcher {
 | 
						|
	return &matcher{
 | 
						|
		root:            &node{},
 | 
						|
		defaultTemplate: defaultTemplate,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (m *matcher) addSpec(tmplt templateSpec) error {
 | 
						|
	// Parse out the default tags specific to this template
 | 
						|
	tags := map[string]string{}
 | 
						|
	if tmplt.tagstring != "" {
 | 
						|
		for _, kv := range strings.Split(tmplt.tagstring, ",") {
 | 
						|
			parts := strings.Split(kv, "=")
 | 
						|
			tags[parts[0]] = parts[1]
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	tmpl, err := NewTemplate(tmplt.separator, tmplt.template, tags)
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	m.add(tmplt.filter, tmpl)
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// add inserts the template in the filter tree based the given filter
 | 
						|
func (m *matcher) add(filter string, template *Template) {
 | 
						|
	if filter == "" {
 | 
						|
		m.defaultTemplate = template
 | 
						|
		m.root.separator = template.separator
 | 
						|
		return
 | 
						|
	}
 | 
						|
	m.root.insert(filter, template)
 | 
						|
}
 | 
						|
 | 
						|
// match returns the template that matches the given measurement line.
 | 
						|
// If no template matches, the default template is returned.
 | 
						|
func (m *matcher) match(line string) *Template {
 | 
						|
	tmpl := m.root.search(line)
 | 
						|
	if tmpl != nil {
 | 
						|
		return tmpl
 | 
						|
	}
 | 
						|
	return m.defaultTemplate
 | 
						|
}
 |