-
Notifications
You must be signed in to change notification settings - Fork 774
/
SdkMeterProviderBuilder.java
204 lines (187 loc) · 6.93 KB
/
SdkMeterProviderBuilder.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.metrics;
import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.internal.ScopeConfigurator;
import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder;
import io.opentelemetry.sdk.metrics.export.MetricProducer;
import io.opentelemetry.sdk.metrics.export.MetricReader;
import io.opentelemetry.sdk.metrics.internal.MeterConfig;
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
import io.opentelemetry.sdk.metrics.internal.debug.SourceInfo;
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarFilter;
import io.opentelemetry.sdk.metrics.internal.export.CardinalityLimitSelector;
import io.opentelemetry.sdk.metrics.internal.view.RegisteredView;
import io.opentelemetry.sdk.resources.Resource;
import java.util.ArrayList;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;
/**
* Builder class for the {@link SdkMeterProvider}.
*
* @since 1.14.0
*/
public final class SdkMeterProviderBuilder {
/**
* By default, the exemplar filter is set to sample with traces.
*
* @see #setExemplarFilter(ExemplarFilter)
*/
private static final ExemplarFilter DEFAULT_EXEMPLAR_FILTER = ExemplarFilter.traceBased();
private Clock clock = Clock.getDefault();
private Resource resource = Resource.getDefault();
private final IdentityHashMap<MetricReader, CardinalityLimitSelector> metricReaders =
new IdentityHashMap<>();
private final List<MetricProducer> metricProducers = new ArrayList<>();
private final List<RegisteredView> registeredViews = new ArrayList<>();
private ExemplarFilter exemplarFilter = DEFAULT_EXEMPLAR_FILTER;
private ScopeConfiguratorBuilder<MeterConfig> meterConfiguratorBuilder =
MeterConfig.configuratorBuilder();
SdkMeterProviderBuilder() {}
/**
* Assign a {@link Clock}.
*
* @param clock The clock to use for all temporal needs.
*/
public SdkMeterProviderBuilder setClock(Clock clock) {
Objects.requireNonNull(clock, "clock");
this.clock = clock;
return this;
}
/** Assign a {@link Resource} to be attached to all metrics. */
public SdkMeterProviderBuilder setResource(Resource resource) {
Objects.requireNonNull(resource, "resource");
this.resource = resource;
return this;
}
/**
* Merge a {@link Resource} with the current.
*
* @param resource {@link Resource} to merge with current.
* @since 1.29.0
*/
public SdkMeterProviderBuilder addResource(Resource resource) {
Objects.requireNonNull(resource, "resource");
this.resource = this.resource.merge(resource);
return this;
}
/**
* Assign an {@link ExemplarFilter} for all metrics created by Meters.
*
* <p>Note: not currently stable but available for experimental use via {@link
* SdkMeterProviderUtil#setExemplarFilter(SdkMeterProviderBuilder, ExemplarFilter)}.
*/
SdkMeterProviderBuilder setExemplarFilter(ExemplarFilter filter) {
this.exemplarFilter = filter;
return this;
}
/**
* Register a {@link View}.
*
* <p>The {@code view} influences how instruments which match the {@code selector} are aggregated
* and exported.
*
* <p>For example, the following code registers a view which changes all histogram instruments to
* aggregate with bucket boundaries different from the default:
*
* <pre>{@code
* // create a SdkMeterProviderBuilder
* SdkMeterProviderBuilder meterProviderBuilder = SdkMeterProvider.builder();
*
* // register the view with the SdkMeterProviderBuilder
* meterProviderBuilder.registerView(
* InstrumentSelector.builder()
* .setType(InstrumentType.HISTOGRAM)
* .build(),
* View.builder()
* .setAggregation(
* Aggregation.explicitBucketHistogram(Arrays.asList(10d, 20d, 30d, 40d, 50d)))
* .build());
* }</pre>
*/
public SdkMeterProviderBuilder registerView(InstrumentSelector selector, View view) {
Objects.requireNonNull(selector, "selector");
Objects.requireNonNull(view, "view");
registeredViews.add(
RegisteredView.create(
selector,
view,
view.getAttributesProcessor(),
view.getCardinalityLimit(),
SourceInfo.fromCurrentStack()));
return this;
}
/** Registers a {@link MetricReader}. */
public SdkMeterProviderBuilder registerMetricReader(MetricReader reader) {
metricReaders.put(reader, CardinalityLimitSelector.defaultCardinalityLimitSelector());
return this;
}
/**
* Registers a {@link MetricReader} with a {@link CardinalityLimitSelector}.
*
* <p>Note: not currently stable but available for experimental use via {@link
* SdkMeterProviderUtil#registerMetricReaderWithCardinalitySelector(SdkMeterProviderBuilder,
* MetricReader, CardinalityLimitSelector)}.
*/
SdkMeterProviderBuilder registerMetricReader(
MetricReader reader, CardinalityLimitSelector cardinalityLimitSelector) {
metricReaders.put(reader, cardinalityLimitSelector);
return this;
}
/**
* Registers a {@link MetricProducer}.
*
* @since 1.31.0
*/
public SdkMeterProviderBuilder registerMetricProducer(MetricProducer metricProducer) {
metricProducers.add(metricProducer);
return this;
}
/**
* Set the meter configurator, which computes {@link MeterConfig} for each {@link
* InstrumentationScopeInfo}.
*
* <p>Overrides any matchers added via {@link #addMeterConfiguratorCondition(Predicate,
* MeterConfig)}.
*
* @see MeterConfig#configuratorBuilder()
*/
SdkMeterProviderBuilder setMeterConfigurator(ScopeConfigurator<MeterConfig> meterConfigurator) {
this.meterConfiguratorBuilder = meterConfigurator.toBuilder();
return this;
}
/**
* Adds a condition to the meter configurator, which computes {@link MeterConfig} for each {@link
* InstrumentationScopeInfo}.
*
* <p>Applies after any previously added conditions.
*
* <p>If {@link #setMeterConfigurator(ScopeConfigurator)} was previously called, this condition
* will only be applied if the {@link ScopeConfigurator#apply(Object)} returns null for the
* matched {@link InstrumentationScopeInfo}(s).
*
* @see ScopeConfiguratorBuilder#nameEquals(String)
* @see ScopeConfiguratorBuilder#nameMatchesGlob(String)
*/
SdkMeterProviderBuilder addMeterConfiguratorCondition(
Predicate<InstrumentationScopeInfo> scopeMatcher, MeterConfig meterConfig) {
this.meterConfiguratorBuilder.addCondition(scopeMatcher, meterConfig);
return this;
}
/** Returns an {@link SdkMeterProvider} built with the configuration of this builder. */
public SdkMeterProvider build() {
return new SdkMeterProvider(
registeredViews,
metricReaders,
metricProducers,
clock,
resource,
exemplarFilter,
meterConfiguratorBuilder.build());
}
}