Skip to content

Commit ab162fa

Browse files
committed
Remove SSL status tag from metrics
Update `SslMeterBinder` to the status tag is no longer included in the reported metrics. Instead the expiry date should be used directly by the monitoring system. Closes gh-45602
1 parent 8070701 commit ab162fa

File tree

3 files changed

+4
-78
lines changed
  • spring-boot-project
    • spring-boot-actuator-autoconfigure/src
    • spring-boot-docs/src/docs/antora/modules/reference/pages/actuator

3 files changed

+4
-78
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/ssl/SslMeterBinder.java

Lines changed: 2 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,12 @@
2323
import java.util.ArrayList;
2424
import java.util.Collection;
2525
import java.util.Comparator;
26-
import java.util.EnumSet;
2726
import java.util.HashSet;
2827
import java.util.List;
2928
import java.util.Map;
3029
import java.util.Set;
3130
import java.util.concurrent.ConcurrentHashMap;
3231

33-
import io.micrometer.core.instrument.Gauge;
3432
import io.micrometer.core.instrument.MeterRegistry;
3533
import io.micrometer.core.instrument.MultiGauge;
3634
import io.micrometer.core.instrument.MultiGauge.Row;
@@ -42,21 +40,16 @@
4240
import org.springframework.boot.info.SslInfo.BundleInfo;
4341
import org.springframework.boot.info.SslInfo.CertificateChainInfo;
4442
import org.springframework.boot.info.SslInfo.CertificateInfo;
45-
import org.springframework.boot.info.SslInfo.CertificateValidityInfo;
46-
import org.springframework.boot.info.SslInfo.CertificateValidityInfo.Status;
4743
import org.springframework.boot.ssl.SslBundles;
4844

4945
/**
50-
* {@link MeterBinder} which registers the SSL chain validity (soonest to expire
51-
* certificate in the chain) as a {@link TimeGauge}. Also contributes two {@link Gauge
52-
* gauges} to count the valid and invalid chains.
46+
* {@link MeterBinder} which registers the SSL chain expiry (soonest to expire certificate
47+
* in the chain) as a {@link TimeGauge}.
5348
*
5449
* @author Moritz Halbritter
5550
*/
5651
class SslMeterBinder implements MeterBinder {
5752

58-
private static final String CHAINS_METRIC_NAME = "ssl.chains";
59-
6053
private static final String CHAIN_EXPIRY_METRIC_NAME = "ssl.chain.expiry";
6154

6255
private final Clock clock;
@@ -91,18 +84,6 @@ public void bindTo(MeterRegistry meterRegistry) {
9184
for (BundleInfo bundle : this.sslInfo.getBundles()) {
9285
createOrUpdateBundleMetrics(meterRegistry, bundle);
9386
}
94-
Gauge.builder(CHAINS_METRIC_NAME, () -> countChainsByStatus(Status.VALID))
95-
.tag("status", "valid")
96-
.register(meterRegistry);
97-
Gauge.builder(CHAINS_METRIC_NAME, () -> countChainsByStatus(Status.EXPIRED))
98-
.tag("status", "expired")
99-
.register(meterRegistry);
100-
Gauge.builder(CHAINS_METRIC_NAME, () -> countChainsByStatus(Status.NOT_YET_VALID))
101-
.tag("status", "not-yet-valid")
102-
.register(meterRegistry);
103-
Gauge.builder(CHAINS_METRIC_NAME, () -> countChainsByStatus(Status.WILL_EXPIRE_SOON))
104-
.tag("status", "will-expire-soon")
105-
.register(meterRegistry);
10687
}
10788

10889
private void createOrUpdateBundleMetrics(MeterRegistry meterRegistry, BundleInfo bundle) {
@@ -130,36 +111,6 @@ private Row<CertificateInfo> createRowForChain(BundleInfo bundle, CertificateCha
130111
return Row.of(tags, leastValidCertificate, this::getChainExpiry);
131112
}
132113

133-
private long countChainsByStatus(Status status) {
134-
long count = 0;
135-
for (BundleInfo bundle : this.bundleMetrics.getBundles()) {
136-
for (CertificateChainInfo chain : bundle.getCertificateChains()) {
137-
if (getChainStatus(chain) == status) {
138-
count++;
139-
}
140-
}
141-
}
142-
return count;
143-
}
144-
145-
private Status getChainStatus(CertificateChainInfo chain) {
146-
EnumSet<Status> statuses = EnumSet.noneOf(Status.class);
147-
for (CertificateInfo certificate : chain.getCertificates()) {
148-
CertificateValidityInfo validity = certificate.getValidity();
149-
statuses.add(validity.getStatus());
150-
}
151-
if (statuses.contains(Status.EXPIRED)) {
152-
return Status.EXPIRED;
153-
}
154-
if (statuses.contains(Status.NOT_YET_VALID)) {
155-
return Status.NOT_YET_VALID;
156-
}
157-
if (statuses.contains(Status.WILL_EXPIRE_SOON)) {
158-
return Status.WILL_EXPIRE_SOON;
159-
}
160-
return statuses.isEmpty() ? null : Status.VALID;
161-
}
162-
163114
private long getChainExpiry(CertificateInfo certificate) {
164115
Duration valid = Duration.between(Instant.now(this.clock), certificate.getValidityEnds());
165116
return valid.get(ChronoUnit.SECONDS);
@@ -184,18 +135,6 @@ MultiGauge getGauge(BundleInfo bundleInfo, MeterRegistry meterRegistry) {
184135
return gauges.getGauge(meterRegistry);
185136
}
186137

187-
/**
188-
* Returns all bundles.
189-
* @return all bundles
190-
*/
191-
Collection<BundleInfo> getBundles() {
192-
List<BundleInfo> result = new ArrayList<>();
193-
for (Gauges metrics : this.gauges.values()) {
194-
result.add(metrics.bundle());
195-
}
196-
return result;
197-
}
198-
199138
/**
200139
* Returns all meter registries.
201140
* @return all meter registries

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/ssl/SslMeterBinderTests.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,6 @@ class SslMeterBinderTests {
4444

4545
private static final Clock CLOCK = Clock.fixed(Instant.parse("2024-10-21T13:51:40Z"), ZoneId.of("UTC"));
4646

47-
@Test
48-
void shouldRegisterChainMetrics() {
49-
MeterRegistry meterRegistry = bindToRegistry();
50-
assertThat(meterRegistry.get("ssl.chains").tag("status", "valid").gauge().value()).isEqualTo(3.0);
51-
assertThat(meterRegistry.get("ssl.chains").tag("status", "expired").gauge().value()).isEqualTo(1.0);
52-
assertThat(meterRegistry.get("ssl.chains").tag("status", "not-yet-valid").gauge().value()).isEqualTo(1.0);
53-
assertThat(meterRegistry.get("ssl.chains").tag("status", "will-expire-soon").gauge().value()).isEqualTo(0.0);
54-
}
55-
5647
@Test
5748
void shouldRegisterChainExpiryMetrics() {
5849
MeterRegistry meterRegistry = bindToRegistry();

spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/metrics.adoc

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -836,13 +836,9 @@ To customize the tags, provide a javadoc:org.springframework.context.annotation.
836836

837837

838838
[[actuator.metrics.supported.ssl]]
839-
=== SSL bundle metrics
840-
841-
Spring Boot Actuator publishes two metrics about SSL bundles:
842-
843-
The metric `ssl.chains` gauges how many certificate chains have been registered.
844-
The `status` tag can be used to differentiate between valid, not-yet-valid, expired and soon-to-be-expired certificates.
839+
=== SSL Bundle Metrics
845840

841+
Spring Boot Actuator publishes expiry metrics about SSL bundles.
846842
The metric `ssl.chain.expiry` gauges the expiry date of each certificate chain in seconds.
847843
This number will be negative if the chain has already expired.
848844
This metric is tagged with the following information:

0 commit comments

Comments
 (0)