Skip to content

Commit e923b0a

Browse files
authored
Use correct config nodes for metrics settings; when using global meter registry set metrics config correctly (helidon-io#8008)
Signed-off-by: Tim Quinn <tim.quinn@oracle.com>
1 parent ef55462 commit e923b0a

8 files changed

Lines changed: 110 additions & 11 deletions

File tree

metrics/api/src/main/java/io/helidon/metrics/api/MetricsFactoryManager.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ static MetricsFactory getMetricsFactory(Config metricsConfigNode) {
122122
*/
123123
static MetricsFactory getMetricsFactory() {
124124
return access(() -> {
125-
metricsConfigNode = Objects.requireNonNullElseGet(metricsConfigNode, GlobalConfig::config);
125+
metricsConfigNode = Objects.requireNonNullElseGet(metricsConfigNode,
126+
MetricsFactoryManager::externalMetricsConfig);
126127
metricsFactory = Objects.requireNonNullElseGet(metricsFactory,
127128
() -> getMetricsFactory(metricsConfigNode));
128129
return metricsFactory;
@@ -149,6 +150,14 @@ static void closeAll() {
149150
metricsFactory = null;
150151
}
151152

153+
private static Config externalMetricsConfig() {
154+
Config serverFeaturesMetricsConfig = GlobalConfig.config().get("server.features.observe.observers.metrics");
155+
if (!serverFeaturesMetricsConfig.exists()) {
156+
serverFeaturesMetricsConfig = GlobalConfig.config().get("metrics");
157+
}
158+
return serverFeaturesMetricsConfig;
159+
}
160+
152161
private static MetricsFactory completeGetInstance(MetricsConfig metricsConfig, Config metricsConfigNode) {
153162

154163
metricsConfig = applyOverrides(metricsConfig);

microprofile/metrics/src/main/java/io/helidon/microprofile/metrics/MetricsCdiExtension.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -551,14 +551,10 @@ private MetricsObserver configure() {
551551
MetricsFactory metricsFactory = MetricsFactory.getInstance(config);
552552

553553
Contexts.globalContext().register(metricsFactory);
554-
MetricsConfig.Builder metricsConfigBuilder = MetricsConfig.builder()
555-
.config(config);
556-
MetricsConfig metricsConfig = metricsConfigBuilder.build();
554+
MetricsConfig metricsConfig = metricsFactory.metricsConfig();
557555
MeterRegistry meterRegistry = metricsFactory.globalRegistry(metricsConfig);
558-
RegistryFactory.getInstance(meterRegistry); // initialize before first use
559-
return builder.metricsConfig(metricsConfigBuilder)
556+
return builder.metricsConfig(metricsConfig)
560557
.meterRegistry(meterRegistry)
561-
.metricsConfig(MetricsConfig.builder(metricsConfig))
562558
.build();
563559
}
564560

microprofile/metrics/src/main/java/io/helidon/microprofile/metrics/RegistryFactory.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,9 @@ static RegistryFactory create(MeterRegistry meterRegistry) {
7676
}
7777

7878
static RegistryFactory getInstance(MeterRegistry meterRegistry) {
79-
REGISTRY_FACTORY.set(create(meterRegistry));
80-
return REGISTRY_FACTORY.get();
79+
return REGISTRY_FACTORY.updateAndGet(rf -> rf != null && rf.meterRegistry == meterRegistry
80+
? rf
81+
: create(meterRegistry));
8182
}
8283

8384
/**

webserver/observe/metrics/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@
9393
<artifactId>helidon-config-yaml</artifactId>
9494
<scope>test</scope>
9595
</dependency>
96+
<dependency>
97+
<groupId>io.helidon.webserver.testing.junit5</groupId>
98+
<artifactId>helidon-webserver-testing-junit5</artifactId>
99+
<scope>test</scope>
100+
</dependency>
96101
</dependencies>
97102

98103
<build>

webserver/observe/metrics/src/main/java/io/helidon/webserver/observe/metrics/MetricsFeature.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ class MetricsFeature {
6464
private KeyPerformanceIndicatorSupport.Metrics kpiMetrics;
6565

6666
MetricsFeature(MetricsObserverConfig config) {
67-
this.meterRegistry = config.meterRegistry().orElseGet(MetricsFactory.getInstance()::globalRegistry);
6867
this.metricsConfig = config.metricsConfig();
68+
this.meterRegistry = config.meterRegistry().orElseGet(() -> MetricsFactory.getInstance().globalRegistry(metricsConfig));
6969
}
7070

7171
/**

webserver/observe/metrics/src/main/java/io/helidon/webserver/observe/metrics/MetricsObserver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public MetricsObserverConfig prototype() {
122122

123123
@Override
124124
public String type() {
125-
return "log";
125+
return "metrics";
126126
}
127127

128128
@Override
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright (c) 2023 Oracle and/or its affiliates.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.helidon.webserver.observe.metrics;
17+
18+
import io.helidon.common.media.type.MediaTypes;
19+
import io.helidon.webclient.http1.Http1Client;
20+
import io.helidon.webclient.http1.Http1ClientResponse;
21+
import io.helidon.webserver.WebServer;
22+
import io.helidon.webserver.testing.junit5.ServerTest;
23+
24+
import jakarta.json.JsonObject;
25+
import org.junit.jupiter.api.Test;
26+
27+
import static org.hamcrest.MatcherAssert.assertThat;
28+
import static org.hamcrest.Matchers.greaterThan;
29+
import static org.hamcrest.Matchers.is;
30+
import static org.hamcrest.Matchers.notNullValue;
31+
import static org.hamcrest.Matchers.nullValue;
32+
33+
@ServerTest
34+
class TestMetricsConfigPropagation {
35+
36+
private final Http1Client client;
37+
38+
TestMetricsConfigPropagation(WebServer server, Http1Client client) {
39+
this.client = client;
40+
}
41+
42+
@Test
43+
void checkExtendedKpiMetrics() {
44+
try (Http1ClientResponse response = client.get("/observe/metrics")
45+
.accept(MediaTypes.APPLICATION_JSON)
46+
.request()) {
47+
assertThat("Metrics endpoint", response.status().code(), is(200));
48+
JsonObject metricsResponse = response.as(JsonObject.class);
49+
JsonObject vendorMeters = metricsResponse.getJsonObject("vendor");
50+
assertThat("Vendor meters", vendorMeters, notNullValue());
51+
52+
// Make sure that the extended KPI metrics were turned on as directed by the configuration.
53+
assertThat("Metrics KPI load",
54+
vendorMeters.getJsonNumber("requests.load").intValue(),
55+
greaterThan(0));
56+
57+
// Make sure that requests.count is absent because of the filtering in the config.
58+
assertThat("Metrics KPI requests.count", vendorMeters.get("requests.count"), nullValue());
59+
}
60+
}
61+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#
2+
# Copyright (c) 2023 Oracle and/or its affiliates.
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
#
16+
server:
17+
features:
18+
observe:
19+
observers:
20+
metrics:
21+
scoping:
22+
scopes:
23+
- name: vendor
24+
filter:
25+
include: requests.l.*
26+
key-performance-indicators:
27+
extended: true

0 commit comments

Comments
 (0)