Skip to content

Commit b9cf1b3

Browse files
committed
fix: 修复设备统计没有产品字段问题
1 parent 773f9f4 commit b9cf1b3

9 files changed

Lines changed: 283 additions & 70 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.jetlinks.community.micrometer;
2+
3+
import org.springframework.beans.factory.ObjectProvider;
4+
import org.springframework.beans.factory.config.BeanDefinition;
5+
import org.springframework.boot.autoconfigure.AutoConfiguration;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Role;
8+
import org.springframework.core.Ordered;
9+
import org.springframework.core.annotation.Order;
10+
11+
import java.util.stream.Collectors;
12+
13+
@AutoConfiguration
14+
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
15+
public class MeterRegistryConfiguration {
16+
17+
@Bean(destroyMethod = "shutdown")
18+
@Order(Ordered.HIGHEST_PRECEDENCE + 100)
19+
public MeterRegistryManager meterRegistryManager(ObjectProvider<MeterRegistrySupplier> registrySuppliers,
20+
ObjectProvider<MeterRegistryCustomizer> customizers) {
21+
return new MeterRegistryManager(registrySuppliers.stream().collect(Collectors.toList()),
22+
customizers.stream().collect(Collectors.toList()));
23+
}
24+
25+
}

jetlinks-components/common-component/src/main/java/org/jetlinks/community/micrometer/MeterRegistryManager.java

Lines changed: 48 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,37 +19,74 @@
1919
import io.micrometer.core.instrument.MeterRegistry;
2020
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
2121
import lombok.Setter;
22+
import org.jetlinks.core.metadata.DataType;
23+
import org.jetlinks.core.metadata.types.StringType;
2224
import org.springframework.beans.factory.annotation.Autowired;
2325
import org.springframework.stereotype.Component;
2426

25-
import java.util.List;
26-
import java.util.Map;
27+
import java.util.*;
2728
import java.util.concurrent.ConcurrentHashMap;
29+
import java.util.function.Function;
2830
import java.util.stream.Collectors;
2931

3032
/**
3133
* @author bsetfeng
3234
* @author wanghzeng
3335
* @since 1.0
3436
**/
35-
@Component
3637
@Setter
3738
public class MeterRegistryManager {
3839

40+
3941
private Map<String, MeterRegistry> meterRegistryMap = new ConcurrentHashMap<>();
4042

41-
@Autowired
42-
private List<MeterRegistrySupplier> suppliers;
43+
private final List<MeterRegistrySupplier> suppliers;
44+
45+
private final List<MeterRegistryCustomizer> customizers;
46+
47+
public MeterRegistryManager(List<MeterRegistrySupplier> suppliers,
48+
List<MeterRegistryCustomizer> customizers) {
49+
this.suppliers = suppliers == null ? Collections.emptyList() : suppliers;
50+
this.customizers = customizers == null ? Collections.emptyList() : customizers;
51+
}
52+
53+
public void shutdown() {
54+
meterRegistryMap
55+
.values()
56+
.forEach(MeterRegistry::close);
57+
}
58+
59+
private MeterRegistry createMeterRegistry(String metric, Map<String, DataType> tagDefine) {
60+
Map<String, DataType> tags = new HashMap<>(tagDefine);
61+
MeterRegistrySettings settings = tags::put;
62+
customizers.forEach(customizer -> customizer.custom(metric, settings));
63+
64+
if (suppliers.size() == 1) {
65+
return suppliers.get(0).getMeterRegistry(metric, tags);
66+
}
4367

44-
private MeterRegistry createMeterRegistry(String metric, String... tagKeys) {
45-
return new CompositeMeterRegistry(Clock.SYSTEM,
46-
suppliers.stream()
47-
.map(supplier -> supplier.getMeterRegistry(metric, tagKeys))
48-
.collect(Collectors.toList()));
68+
return new CompositeMeterRegistry(Clock.SYSTEM, suppliers
69+
.stream()
70+
.map(supplier -> supplier.getMeterRegistry(metric, tags))
71+
.collect(Collectors.toList()));
4972
}
5073

5174
public MeterRegistry getMeterRegister(String metric, String... tagKeys) {
52-
return meterRegistryMap.computeIfAbsent(metric, _metric -> createMeterRegistry(_metric, tagKeys));
75+
76+
return meterRegistryMap.computeIfAbsent(metric, _metric -> {
77+
if (tagKeys.length == 0) {
78+
return createMeterRegistry(metric, Collections.emptyMap());
79+
}
80+
return createMeterRegistry(metric, Arrays
81+
.stream(tagKeys)
82+
.collect(Collectors.toMap(Function.identity(), key -> StringType.GLOBAL)));
83+
});
5384
}
5485

86+
@Deprecated
87+
public MeterRegistry getMeterRegister(String metric, Map<String, DataType> tagDefine) {
88+
return meterRegistryMap.computeIfAbsent(metric, _metric -> createMeterRegistry(_metric, tagDefine));
89+
}
90+
91+
5592
}

jetlinks-components/common-component/src/main/java/org/jetlinks/community/micrometer/MeterRegistrySupplier.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@
1616
package org.jetlinks.community.micrometer;
1717

1818
import io.micrometer.core.instrument.MeterRegistry;
19+
import org.jetlinks.core.metadata.DataType;
20+
21+
import java.util.Map;
1922

2023
public interface MeterRegistrySupplier {
2124

2225
MeterRegistry getMeterRegistry(String metric, String... tagKeys);
2326

27+
MeterRegistry getMeterRegistry(String metric, Map<String, DataType> tagDefine);
28+
2429
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package org.jetlinks.community.micrometer;
2+
3+
import io.micrometer.core.instrument.*;
4+
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
5+
import io.micrometer.core.instrument.distribution.pause.PauseDetector;
6+
import io.micrometer.core.instrument.noop.*;
7+
8+
import javax.annotation.Nonnull;
9+
import java.util.concurrent.TimeUnit;
10+
import java.util.function.ToDoubleFunction;
11+
import java.util.function.ToLongFunction;
12+
13+
public class NoopMeterRegistry extends MeterRegistry {
14+
public static final NoopMeterRegistry INSTANCE = new NoopMeterRegistry();
15+
16+
private NoopMeterRegistry() {
17+
super(Clock.SYSTEM);
18+
}
19+
20+
@Override
21+
@Nonnull
22+
protected <T> Gauge newGauge(@Nonnull Meter.Id id, T t, @Nonnull ToDoubleFunction<T> toDoubleFunction) {
23+
return new NoopGauge(id);
24+
}
25+
26+
@Override
27+
@Nonnull
28+
protected Counter newCounter(@Nonnull Meter.Id id) {
29+
return new NoopCounter(id);
30+
}
31+
32+
@Override
33+
protected LongTaskTimer newLongTaskTimer(Meter.Id id, DistributionStatisticConfig distributionStatisticConfig) {
34+
return new NoopLongTaskTimer(id);
35+
}
36+
37+
@Override
38+
protected <T> TimeGauge newTimeGauge(Meter.Id id, T obj, TimeUnit valueFunctionUnit, ToDoubleFunction<T> valueFunction) {
39+
return new NoopTimeGauge(id);
40+
}
41+
42+
@Override
43+
protected LongTaskTimer newLongTaskTimer(Meter.Id id) {
44+
return new NoopLongTaskTimer(id);
45+
}
46+
47+
@Override
48+
@Nonnull
49+
protected Timer newTimer(@Nonnull Meter.Id id, @Nonnull DistributionStatisticConfig distributionStatisticConfig, @Nonnull PauseDetector pauseDetector) {
50+
return new NoopTimer(id);
51+
}
52+
53+
@Override
54+
@Nonnull
55+
protected DistributionSummary newDistributionSummary(@Nonnull Meter.Id id, @Nonnull DistributionStatisticConfig distributionStatisticConfig, double v) {
56+
return new NoopDistributionSummary(id);
57+
}
58+
59+
@Override
60+
@Nonnull
61+
protected Meter newMeter(@Nonnull Meter.Id id, @Nonnull Meter.Type type, @Nonnull Iterable<Measurement> iterable) {
62+
return new NoopMeter(id);
63+
}
64+
65+
@Override
66+
@Nonnull
67+
protected <T> FunctionTimer newFunctionTimer(@Nonnull Meter.Id id, @Nonnull T t,
68+
@Nonnull ToLongFunction<T> toLongFunction,
69+
@Nonnull ToDoubleFunction<T> toDoubleFunction,
70+
@Nonnull TimeUnit timeUnit) {
71+
return new NoopFunctionTimer(id);
72+
}
73+
74+
@Override
75+
@Nonnull
76+
protected <T> FunctionCounter newFunctionCounter(@Nonnull Meter.Id id, @Nonnull T t, @Nonnull ToDoubleFunction<T> toDoubleFunction) {
77+
return new NoopFunctionCounter(id);
78+
}
79+
80+
@Override
81+
@Nonnull
82+
protected TimeUnit getBaseTimeUnit() {
83+
return TimeUnit.MILLISECONDS;
84+
}
85+
86+
@Override
87+
@Nonnull
88+
protected DistributionStatisticConfig defaultHistogramConfig() {
89+
return DistributionStatisticConfig.NONE;
90+
}
91+
}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
org.jetlinks.community.configuration.CommonConfiguration
22
org.jetlinks.community.dictionary.DictionaryConfiguration
3-
org.jetlinks.community.configuration.UiResourceConfiguration
3+
org.jetlinks.community.configuration.UiResourceConfiguration
4+
org.jetlinks.community.micrometer.MeterRegistryConfiguration

jetlinks-components/timeseries-component/src/main/java/org/jetlinks/community/timeseries/micrometer/MeterTimeSeriesData.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,22 @@
1616
package org.jetlinks.community.timeseries.micrometer;
1717

1818
import io.micrometer.core.instrument.*;
19+
import org.hswebframework.web.id.IDGenerator;
1920
import org.jetlinks.community.timeseries.TimeSeriesData;
21+
import org.jetlinks.core.metadata.Converter;
22+
import org.jetlinks.core.metadata.DataType;
2023

2124
import java.util.HashMap;
2225
import java.util.List;
2326
import java.util.Map;
2427
import java.util.concurrent.TimeUnit;
28+
import java.util.function.Function;
2529

2630
public class MeterTimeSeriesData implements TimeSeriesData {
2731

28-
private Map<String, Object> data = new HashMap<>();
32+
private final Map<String, Object> data = new HashMap<>(24);
2933

30-
private long timestamp = System.currentTimeMillis();
34+
private final long timestamp = System.currentTimeMillis();
3135

3236
@Override
3337
public long getTimestamp() {
@@ -52,9 +56,14 @@ public MeterTimeSeriesData write(Map<String, String> tags) {
5256
return this;
5357
}
5458

55-
public MeterTimeSeriesData write(List<Tag> tags) {
59+
public MeterTimeSeriesData write(List<Tag> tags, Function<String, DataType> typeGetter) {
5660
for (Tag tag : tags) {
57-
data.put(tag.getKey(), tag.getValue());
61+
DataType type = typeGetter.apply(tag.getKey());
62+
Object value = tag.getValue();
63+
if (type instanceof Converter) {
64+
value = ((Converter<?>) type).convert(value);
65+
}
66+
data.put(tag.getKey(), value);
5867
}
5968
return this;
6069
}
@@ -84,7 +93,6 @@ public MeterTimeSeriesData write(TimeGauge gauge) {
8493
}
8594

8695
public MeterTimeSeriesData write(FunctionTimer timer) {
87-
8896
data.put("count", timer.count());
8997
data.put("sum", timer.totalTime(TimeUnit.MILLISECONDS));
9098
data.put("mean", timer.mean(TimeUnit.MILLISECONDS));
@@ -126,6 +134,7 @@ public MeterTimeSeriesData write(Meter meter) {
126134

127135
public static MeterTimeSeriesData of(Meter meter) {
128136
MeterTimeSeriesData data = new MeterTimeSeriesData();
137+
data.data.put("id", IDGenerator.RANDOM.generate());
129138
data.write(meter);
130139
meter.match(
131140
data::write,

jetlinks-components/timeseries-component/src/main/java/org/jetlinks/community/timeseries/micrometer/MeterTimeSeriesMetadata.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,21 @@
1919
import lombok.Getter;
2020
import org.jetlinks.community.timeseries.TimeSeriesMetadata;
2121
import org.jetlinks.community.timeseries.TimeSeriesMetric;
22+
import org.jetlinks.core.metadata.DataType;
2223
import org.jetlinks.core.metadata.PropertyMetadata;
2324
import org.jetlinks.core.metadata.SimplePropertyMetadata;
2425
import org.jetlinks.core.metadata.types.DoubleType;
2526
import org.jetlinks.core.metadata.types.StringType;
2627

2728
import java.util.ArrayList;
2829
import java.util.List;
29-
30+
import java.util.Map;
31+
@Getter
3032
@AllArgsConstructor(staticName = "of")
3133
class MeterTimeSeriesMetadata implements TimeSeriesMetadata {
32-
@Getter
3334
private TimeSeriesMetric metric;
3435

35-
@Getter
36-
private List<String> keys;
36+
private Map<String, DataType> keys;
3737

3838
static final List<PropertyMetadata> properties = new ArrayList<>();
3939

@@ -133,11 +133,11 @@ class MeterTimeSeriesMetadata implements TimeSeriesMetadata {
133133
public List<PropertyMetadata> getProperties() {
134134

135135
List<PropertyMetadata> metadata = new ArrayList<>(properties);
136-
for (String key : keys) {
136+
for (Map.Entry<String,DataType> key : keys.entrySet()) {
137137
SimplePropertyMetadata property = new SimplePropertyMetadata();
138-
property.setId(key);
139-
property.setName(key);
140-
property.setValueType(new StringType());
138+
property.setId(key.getKey());
139+
property.setName(key.getKey());
140+
property.setValueType(key.getValue());
141141
metadata.add(property);
142142
}
143143
return metadata;

0 commit comments

Comments
 (0)