pkg/meter/scope.go (45 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 meter import ( "sync" ) // HierarchicalScope is a Scope implementation that supports hierarchical scopes. type HierarchicalScope struct { parent *HierarchicalScope labels LabelPairs sep string name string mu sync.RWMutex } // NewHierarchicalScope creates a new hierarchical scope. func NewHierarchicalScope(name, sep string) Scope { return &HierarchicalScope{sep: sep, name: name} } // ConstLabels merges the given labels with the labels of the parent scope. func (s *HierarchicalScope) ConstLabels(labels LabelPairs) Scope { s.mu.Lock() defer s.mu.Unlock() if s.parent != nil { labels = s.parent.GetLabels().Merge(labels) } s.labels = labels return s } // SubScope creates a new sub-scope with the given name. func (s *HierarchicalScope) SubScope(name string) Scope { s.mu.Lock() defer s.mu.Unlock() return &HierarchicalScope{ parent: s, name: name, sep: s.sep, } } // GetNamespace returns the namespace of this scope. func (s *HierarchicalScope) GetNamespace() string { s.mu.RLock() defer s.mu.RUnlock() if s.parent == nil { return s.name } return s.parent.GetNamespace() + s.sep + s.name } // GetLabels returns the labels of this scope. func (s *HierarchicalScope) GetLabels() LabelPairs { s.mu.RLock() defer s.mu.RUnlock() return s.labels }