1 /**
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements.  See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership.  The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License.  You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 package org.apache.hadoop.metrics2.impl;
20 
21 import java.util.Collections;
22 import java.util.List;
23 
24 import com.google.common.collect.Lists;
25 
26 import org.apache.hadoop.metrics2.AbstractMetric;
27 import org.apache.hadoop.metrics2.MetricsInfo;
28 import org.apache.hadoop.metrics2.MetricsCollector;
29 import org.apache.hadoop.metrics2.MetricsFilter;
30 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
31 import org.apache.hadoop.metrics2.MetricsTag;
32 import org.apache.hadoop.metrics2.lib.Interns;
33 import org.apache.hadoop.util.Time;
34 
35 class MetricsRecordBuilderImpl extends MetricsRecordBuilder {
36   private final MetricsCollector parent;
37   private final long timestamp;
38   private final MetricsInfo recInfo;
39   private final List<AbstractMetric> metrics;
40   private final List<MetricsTag> tags;
41   private final MetricsFilter recordFilter, metricFilter;
42   private final boolean acceptable;
43 
MetricsRecordBuilderImpl(MetricsCollector parent, MetricsInfo info, MetricsFilter rf, MetricsFilter mf, boolean acceptable)44   MetricsRecordBuilderImpl(MetricsCollector parent, MetricsInfo info,
45                            MetricsFilter rf, MetricsFilter mf,
46                            boolean acceptable) {
47     this.parent = parent;
48     timestamp = Time.now();
49     recInfo = info;
50     metrics = Lists.newArrayList();
51     tags = Lists.newArrayList();
52     recordFilter = rf;
53     metricFilter = mf;
54     this.acceptable = acceptable;
55   }
56 
57   @Override
parent()58   public MetricsCollector parent() { return parent; }
59 
60   @Override
tag(MetricsInfo info, String value)61   public MetricsRecordBuilderImpl tag(MetricsInfo info, String value) {
62     if (acceptable) {
63       tags.add(Interns.tag(info, value));
64     }
65     return this;
66   }
67 
68   @Override
add(MetricsTag tag)69   public MetricsRecordBuilderImpl add(MetricsTag tag) {
70     tags.add(tag);
71     return this;
72   }
73 
74   @Override
add(AbstractMetric metric)75   public MetricsRecordBuilderImpl add(AbstractMetric metric) {
76     metrics.add(metric);
77     return this;
78   }
79 
80   @Override
addCounter(MetricsInfo info, int value)81   public MetricsRecordBuilderImpl addCounter(MetricsInfo info, int value) {
82     if (acceptable && (metricFilter == null ||
83         metricFilter.accepts(info.name()))) {
84       metrics.add(new MetricCounterInt(info, value));
85     }
86     return this;
87   }
88 
89   @Override
addCounter(MetricsInfo info, long value)90   public MetricsRecordBuilderImpl addCounter(MetricsInfo info, long value) {
91     if (acceptable && (metricFilter == null ||
92         metricFilter.accepts(info.name()))) {
93       metrics.add(new MetricCounterLong(info, value));
94     }
95     return this;
96   }
97 
98   @Override
addGauge(MetricsInfo info, int value)99   public MetricsRecordBuilderImpl addGauge(MetricsInfo info, int value) {
100     if (acceptable && (metricFilter == null ||
101         metricFilter.accepts(info.name()))) {
102       metrics.add(new MetricGaugeInt(info, value));
103     }
104     return this;
105   }
106 
107   @Override
addGauge(MetricsInfo info, long value)108   public MetricsRecordBuilderImpl addGauge(MetricsInfo info, long value) {
109     if (acceptable && (metricFilter == null ||
110         metricFilter.accepts(info.name()))) {
111       metrics.add(new MetricGaugeLong(info, value));
112     }
113     return this;
114   }
115 
116   @Override
addGauge(MetricsInfo info, float value)117   public MetricsRecordBuilderImpl addGauge(MetricsInfo info, float value) {
118     if (acceptable && (metricFilter == null ||
119         metricFilter.accepts(info.name()))) {
120       metrics.add(new MetricGaugeFloat(info, value));
121     }
122     return this;
123   }
124 
125   @Override
addGauge(MetricsInfo info, double value)126   public MetricsRecordBuilderImpl addGauge(MetricsInfo info, double value) {
127     if (acceptable && (metricFilter == null ||
128         metricFilter.accepts(info.name()))) {
129       metrics.add(new MetricGaugeDouble(info, value));
130     }
131     return this;
132   }
133 
134   @Override
setContext(String value)135   public MetricsRecordBuilderImpl setContext(String value) {
136     return tag(MsInfo.Context, value);
137   }
138 
getRecord()139   public MetricsRecordImpl getRecord() {
140     if (acceptable && (recordFilter == null || recordFilter.accepts(tags))) {
141       return new MetricsRecordImpl(recInfo, timestamp, tags(), metrics());
142     }
143     return null;
144   }
145 
tags()146   List<MetricsTag> tags() {
147     return Collections.unmodifiableList(tags);
148   }
149 
metrics()150   List<AbstractMetric> metrics() {
151     return Collections.unmodifiableList(metrics);
152   }
153 }
154