129 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
| package jolokia2
 | |
| 
 | |
| import "strings"
 | |
| 
 | |
| // A MetricConfig represents a TOML form of
 | |
| // a Metric with some optional fields.
 | |
| type MetricConfig struct {
 | |
| 	Name           string
 | |
| 	Mbean          string
 | |
| 	Paths          []string
 | |
| 	FieldName      *string
 | |
| 	FieldPrefix    *string
 | |
| 	FieldSeparator *string
 | |
| 	TagPrefix      *string
 | |
| 	TagKeys        []string
 | |
| }
 | |
| 
 | |
| // A Metric represents a specification for a
 | |
| // Jolokia read request, and the transformations
 | |
| // to apply to points generated from the responses.
 | |
| type Metric struct {
 | |
| 	Name           string
 | |
| 	Mbean          string
 | |
| 	Paths          []string
 | |
| 	FieldName      string
 | |
| 	FieldPrefix    string
 | |
| 	FieldSeparator string
 | |
| 	TagPrefix      string
 | |
| 	TagKeys        []string
 | |
| 
 | |
| 	mbeanDomain     string
 | |
| 	mbeanProperties []string
 | |
| }
 | |
| 
 | |
| func NewMetric(config MetricConfig, defaultFieldPrefix, defaultFieldSeparator, defaultTagPrefix string) Metric {
 | |
| 	metric := Metric{
 | |
| 		Name:    config.Name,
 | |
| 		Mbean:   config.Mbean,
 | |
| 		Paths:   config.Paths,
 | |
| 		TagKeys: config.TagKeys,
 | |
| 	}
 | |
| 
 | |
| 	if config.FieldName != nil {
 | |
| 		metric.FieldName = *config.FieldName
 | |
| 	}
 | |
| 
 | |
| 	if config.FieldPrefix == nil {
 | |
| 		metric.FieldPrefix = defaultFieldPrefix
 | |
| 	} else {
 | |
| 		metric.FieldPrefix = *config.FieldPrefix
 | |
| 	}
 | |
| 
 | |
| 	if config.FieldSeparator == nil {
 | |
| 		metric.FieldSeparator = defaultFieldSeparator
 | |
| 	} else {
 | |
| 		metric.FieldSeparator = *config.FieldSeparator
 | |
| 	}
 | |
| 
 | |
| 	if config.TagPrefix == nil {
 | |
| 		metric.TagPrefix = defaultTagPrefix
 | |
| 	} else {
 | |
| 		metric.TagPrefix = *config.TagPrefix
 | |
| 	}
 | |
| 
 | |
| 	mbeanDomain, mbeanProperties := parseMbeanObjectName(config.Mbean)
 | |
| 	metric.mbeanDomain = mbeanDomain
 | |
| 	metric.mbeanProperties = mbeanProperties
 | |
| 
 | |
| 	return metric
 | |
| }
 | |
| 
 | |
| func (m Metric) MatchObjectName(name string) bool {
 | |
| 	if name == m.Mbean {
 | |
| 		return true
 | |
| 	}
 | |
| 
 | |
| 	mbeanDomain, mbeanProperties := parseMbeanObjectName(name)
 | |
| 	if mbeanDomain != m.mbeanDomain {
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	if len(mbeanProperties) != len(m.mbeanProperties) {
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| NEXT_PROPERTY:
 | |
| 	for _, mbeanProperty := range m.mbeanProperties {
 | |
| 		for i := range mbeanProperties {
 | |
| 			if mbeanProperties[i] == mbeanProperty {
 | |
| 				continue NEXT_PROPERTY
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	return true
 | |
| }
 | |
| 
 | |
| func (m Metric) MatchAttributeAndPath(attribute, innerPath string) bool {
 | |
| 	path := attribute
 | |
| 	if innerPath != "" {
 | |
| 		path = path + "/" + innerPath
 | |
| 	}
 | |
| 
 | |
| 	for i := range m.Paths {
 | |
| 		if path == m.Paths[i] {
 | |
| 			return true
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| func parseMbeanObjectName(name string) (string, []string) {
 | |
| 	index := strings.Index(name, ":")
 | |
| 	if index == -1 {
 | |
| 		return name, []string{}
 | |
| 	}
 | |
| 
 | |
| 	domain := name[:index]
 | |
| 
 | |
| 	if index+1 > len(name) {
 | |
| 		return domain, []string{}
 | |
| 	}
 | |
| 
 | |
| 	return domain, strings.Split(name[index+1:], ",")
 | |
| }
 |