Skip to content

Commit 84e45c5

Browse files
authored
Envoy metrics service receiver: support adapter listener metrics. (#13692)
1 parent 65137fc commit 84e45c5

File tree

8 files changed

+140
-3
lines changed

8 files changed

+140
-3
lines changed

docs/en/changes/changes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
* `BanyanDB Client`: Property query support `Order By`.
3030
* MQE: trim the label values condition for the labeled metrics query to enhance the readability.
3131
* PromQL service: fix time parse issue when using RFC3339 time format for querying.
32+
* Envoy metrics service receiver: support adapter listener metrics.
3233

3334
#### UI
3435
* Fix the missing icon in new native trace view.

oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/EnvoyMetricReceiverConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.apache.skywalking.oap.server.library.module.ModuleConfig;
3434
import org.apache.skywalking.oap.server.library.module.ModuleStartException;
3535
import org.apache.skywalking.oap.server.receiver.envoy.metrics.adapters.ClusterManagerMetricsAdapter;
36+
import org.apache.skywalking.oap.server.receiver.envoy.metrics.adapters.ListenerMetricsAdapter;
3637

3738
public class EnvoyMetricReceiverConfig extends ModuleConfig {
3839
@Getter
@@ -67,6 +68,8 @@ public class EnvoyMetricReceiverConfig extends ModuleConfig {
6768
private final ServiceMetaInfoFactory serviceMetaInfoFactory = new ServiceMetaInfoFactoryImpl();
6869
@Getter
6970
private final ClusterManagerMetricsAdapter clusterManagerMetricsAdapter = new ClusterManagerMetricsAdapter(this);
71+
@Getter
72+
private final ListenerMetricsAdapter listenerMetricsAdapter = new ListenerMetricsAdapter();
7073

7174
public List<String> getAlsHTTPAnalysis() {
7275
if (Strings.isNullOrEmpty(alsHTTPAnalysis)) {

oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/MetricServiceGRPCHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public void onNext(StreamMetricsMessage message) {
112112
counter.inc();
113113
try (final HistogramMetrics.Timer ignored = histogram.createTimer()) {
114114
final ProtoMetricFamily2MetricsAdapter adapter = new ProtoMetricFamily2MetricsAdapter(
115-
metricFamily, config.getClusterManagerMetricsAdapter());
115+
metricFamily, config.getClusterManagerMetricsAdapter(), config.getListenerMetricsAdapter());
116116
adapter.adapt().forEach(it -> {
117117
it.getLabels().putIfAbsent("app", service.getServiceName());
118118
it.getLabels().putIfAbsent("instance", service.getServiceInstanceName());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*/
18+
19+
package org.apache.skywalking.oap.server.receiver.envoy.metrics.adapters;
20+
21+
import io.prometheus.client.Metrics;
22+
import java.util.Map;
23+
24+
public class ListenerMetricsAdapter {
25+
26+
public String adaptMetricsName(final Metrics.MetricFamily metricFamily) {
27+
return "envoy_listener_metrics";
28+
}
29+
30+
public Map<String, String> adaptLabels(final Metrics.MetricFamily metricFamily, final Map<String, String> labels) {
31+
String metricsName = metricFamily.getName();
32+
labels.putIfAbsent("metrics_name", metricsName);
33+
34+
return labels;
35+
}
36+
}

oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/metrics/adapters/ProtoMetricFamily2MetricsAdapter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
public class ProtoMetricFamily2MetricsAdapter {
3636
protected final Metrics.MetricFamily metricFamily;
3737
private final ClusterManagerMetricsAdapter clusterManagerMetricsAdapter;
38+
private final ListenerMetricsAdapter listenerMetricsAdapter;
3839

3940
public Stream<Metric> adapt() {
4041
switch (metricFamily.getType()) {
@@ -75,6 +76,8 @@ public Stream<Metric> adapt() {
7576
public String adaptMetricsName(final Metrics.Metric metric) {
7677
if (metricFamily.getName().startsWith("cluster.")) {
7778
return clusterManagerMetricsAdapter.adaptMetricsName(metricFamily);
79+
} else if (metricFamily.getName().startsWith("listener.")) {
80+
return listenerMetricsAdapter.adaptMetricsName(metricFamily);
7881
}
7982

8083
return metricFamily.getName();
@@ -90,6 +93,8 @@ public Map<String, String> adaptLabels(final Metrics.Metric metric) {
9093
.collect(toMap(Metrics.LabelPair::getName, Metrics.LabelPair::getValue));
9194
if (metricFamily.getName().startsWith("cluster.")) {
9295
return clusterManagerMetricsAdapter.adaptLabels(metricFamily, labels);
96+
} else if (metricFamily.getName().startsWith("listener.")) {
97+
return listenerMetricsAdapter.adaptLabels(metricFamily, labels);
9398
}
9499

95100
return labels;

oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/ClusterManagerMetricsAdapterTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class ClusterManagerMetricsAdapterTest {
3737
private Metrics.MetricFamily cbNameOutboundFQDN = Metrics.MetricFamily.newBuilder().setName("cluster.outbound|9080||reviews.default.svc.cluster.local.circuit_breakers.default.cx_pool_open").build();
3838
private Metrics.MetricFamily cbNameOutboundFQDNSubset = Metrics.MetricFamily.newBuilder().setName("cluster.outbound|9080|v1|reviews.default.svc.cluster.local.circuit_breakers.default.cx_pool_open").build();
3939
private Metrics.MetricFamily cbNameInboundFQDN = Metrics.MetricFamily.newBuilder().setName("cluster.inbound|9080||.upstream_cx_total").build();
40+
private Metrics.MetricFamily ca = Metrics.MetricFamily.newBuilder().setName("cluster.outbound|9080|v2-mysql|ratings.default.svc.cluster.local;.ssl.certificate.ROOTCA.expiration_unix_time_seconds").build();
4041

4142
@SneakyThrows
4243
@BeforeEach
@@ -68,6 +69,8 @@ public void testAdaptLabels() {
6869
assertThat(
6970
clusterManagerMetricsAdapter.adaptLabels(cbNameInboundFQDN, new HashMap<>()).toString()
7071
).isEqualTo("{cluster_name=-.inbound:9080.-, metrics_name=" + cbNameInboundFQDN.getName() + "}");
71-
72+
assertThat(
73+
clusterManagerMetricsAdapter.adaptLabels(ca, new HashMap<>()).toString()
74+
).isEqualTo("{cluster_name=v2-mysql.ratings.default, metrics_name=" + ca.getName() + "}");
7275
}
7376
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*/
18+
19+
package org.apache.skywalking.oap.server.receiver.envoy;
20+
21+
import io.prometheus.client.Metrics;
22+
import org.apache.skywalking.oap.server.receiver.envoy.metrics.adapters.ListenerMetricsAdapter;
23+
import org.junit.jupiter.api.BeforeEach;
24+
import org.junit.jupiter.api.Test;
25+
26+
import java.util.HashMap;
27+
28+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
29+
30+
public class ListenerMetricsAdapterTest {
31+
32+
private ListenerMetricsAdapter listenerMetricsAdapter;
33+
private final Metrics.MetricFamily downstream = Metrics.MetricFamily.newBuilder()
34+
.setName(
35+
"listener.0.0.0.0_15090.downstream_cx_total")
36+
.build();
37+
private final Metrics.MetricFamily http = Metrics.MetricFamily.newBuilder()
38+
.setName(
39+
"listener.0.0.0.0_15090.http.inbound_0.0.0.0_15090.downstream_rq_2xx")
40+
.build();
41+
private final Metrics.MetricFamily adminListener = Metrics.MetricFamily.newBuilder()
42+
.setName(
43+
"listener.admin.downstream_cx_destroy")
44+
.build();
45+
private final Metrics.MetricFamily virtualListener = Metrics.MetricFamily.newBuilder()
46+
.setName(
47+
"listener.0.0.0.0_15001.downstream_cx_active")
48+
.build();
49+
private final Metrics.MetricFamily ca = Metrics.MetricFamily.newBuilder()
50+
.setName(
51+
"listener.0.0.0.0_15006.ssl.certificate.ROOTCA.expiration_unix_time_seconds")
52+
.build();
53+
54+
@BeforeEach
55+
public void setUp() {
56+
listenerMetricsAdapter = new ListenerMetricsAdapter();
57+
}
58+
59+
@Test
60+
public void testAdaptMetricsName() {
61+
assertThat(listenerMetricsAdapter.adaptMetricsName(downstream)).isEqualTo("envoy_listener_metrics");
62+
assertThat(listenerMetricsAdapter.adaptMetricsName(http)).isEqualTo("envoy_listener_metrics");
63+
assertThat(listenerMetricsAdapter.adaptMetricsName(adminListener)).isEqualTo("envoy_listener_metrics");
64+
assertThat(listenerMetricsAdapter.adaptMetricsName(virtualListener)).isEqualTo("envoy_listener_metrics");
65+
assertThat(listenerMetricsAdapter.adaptMetricsName(ca)).isEqualTo("envoy_listener_metrics");
66+
}
67+
68+
@Test
69+
public void testAdaptLabels() {
70+
assertThat(
71+
listenerMetricsAdapter.adaptLabels(downstream, new HashMap<>()).toString()
72+
).isEqualTo("{metrics_name=" + downstream.getName() + "}");
73+
74+
assertThat(
75+
listenerMetricsAdapter.adaptLabels(http, new HashMap<>()).toString()
76+
).isEqualTo("{metrics_name=" + http.getName() + "}");
77+
78+
assertThat(
79+
listenerMetricsAdapter.adaptLabels(adminListener, new HashMap<>()).toString()
80+
).isEqualTo("{metrics_name=" + adminListener.getName() + "}");
81+
82+
assertThat(
83+
listenerMetricsAdapter.adaptLabels(virtualListener, new HashMap<>()).toString()
84+
).isEqualTo("{metrics_name=" + virtualListener.getName() + "}");
85+
assertThat(
86+
listenerMetricsAdapter.adaptLabels(ca, new HashMap<>()).toString()
87+
).isEqualTo("{metrics_name=" + ca.getName() + "}");
88+
}
89+
}

test/e2e-v2/cases/virtual-mq/e2e.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ trigger:
3838
verify:
3939
retry:
4040
count: 20
41-
interval: 3s
41+
interval: 10s
4242
cases:
4343
- includes:
4444
- mq-cases.yaml

0 commit comments

Comments
 (0)