| /* |
| * Copyright 2024 gRPC authors. |
| * |
| * Licensed 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 stats |
| |
| import "maps" |
| |
| // MetricSet is a set of metrics to record. Once created, MetricSet is immutable, |
| // however Add and Remove can make copies with specific metrics added or |
| // removed, respectively. |
| // |
| // Do not construct directly; use NewMetricSet instead. |
| type MetricSet struct { |
| // metrics are the set of metrics to initialize. |
| metrics map[string]bool |
| } |
| |
| // NewMetricSet returns a MetricSet containing metricNames. |
| func NewMetricSet(metricNames ...string) *MetricSet { |
| newMetrics := make(map[string]bool) |
| for _, metric := range metricNames { |
| newMetrics[metric] = true |
| } |
| return &MetricSet{metrics: newMetrics} |
| } |
| |
| // Metrics returns the metrics set. The returned map is read-only and must not |
| // be modified. |
| func (m *MetricSet) Metrics() map[string]bool { |
| return m.metrics |
| } |
| |
| // Add adds the metricNames to the metrics set and returns a new copy with the |
| // additional metrics. |
| func (m *MetricSet) Add(metricNames ...string) *MetricSet { |
| newMetrics := make(map[string]bool) |
| for metric := range m.metrics { |
| newMetrics[metric] = true |
| } |
| |
| for _, metric := range metricNames { |
| newMetrics[metric] = true |
| } |
| return &MetricSet{metrics: newMetrics} |
| } |
| |
| // Join joins the metrics passed in with the metrics set, and returns a new copy |
| // with the merged metrics. |
| func (m *MetricSet) Join(metrics *MetricSet) *MetricSet { |
| newMetrics := make(map[string]bool) |
| maps.Copy(newMetrics, m.metrics) |
| maps.Copy(newMetrics, metrics.metrics) |
| return &MetricSet{metrics: newMetrics} |
| } |
| |
| // Remove removes the metricNames from the metrics set and returns a new copy |
| // with the metrics removed. |
| func (m *MetricSet) Remove(metricNames ...string) *MetricSet { |
| newMetrics := make(map[string]bool) |
| for metric := range m.metrics { |
| newMetrics[metric] = true |
| } |
| |
| for _, metric := range metricNames { |
| delete(newMetrics, metric) |
| } |
| return &MetricSet{metrics: newMetrics} |
| } |