From 58dca799fceda6a96c02bc804ad2d426edd8fc75 Mon Sep 17 00:00:00 2001 From: Mashhur Date: Thu, 14 May 2026 17:07:47 -0700 Subject: [PATCH] Fix the URI consistency between 8.x and 9.x stack versions. --- .../src/main/java/org/logstash/health/HelpUrl.java | 14 ++++++++++++-- .../org/logstash/health/PipelineIndicatorTest.java | 13 +++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/logstash-core/src/main/java/org/logstash/health/HelpUrl.java b/logstash-core/src/main/java/org/logstash/health/HelpUrl.java index db2586765d..f48508062f 100644 --- a/logstash-core/src/main/java/org/logstash/health/HelpUrl.java +++ b/logstash-core/src/main/java/org/logstash/health/HelpUrl.java @@ -24,9 +24,11 @@ public class HelpUrl { static final String BASE_URL; + static final boolean IS_MAJOR_9_PLUS; static { + IS_MAJOR_9_PLUS = Integer.parseInt(Logstash.VERSION_MAJOR) >= 9; final String versionAnchor; - if (Integer.parseInt(Logstash.VERSION_MAJOR) >= 9) { + if (IS_MAJOR_9_PLUS) { versionAnchor = "master"; } else { versionAnchor = String.format("%s.%s", Logstash.VERSION_MAJOR, Logstash.VERSION_MINOR); @@ -38,8 +40,16 @@ public HelpUrl(final String page) { this(page, null); } + /** + * Returns a new {@code HelpUrl} with a version-appropriate anchor. + *

+ * Logstash 9.0+ doc pages use fully-qualified anchors of the form + * {@code {page}-diagnosis-{anchor}} (e.g. {@code health-report-pipeline-status-diagnosis-loading}). + * Earlier versions use the short form {@code {anchor}} (e.g. {@code loading}). + */ public HelpUrl withAnchor(final String anchor) { - return new HelpUrl(this.page, anchor); + final String resolved = IS_MAJOR_9_PLUS ? this.page + "-diagnosis-" + anchor : anchor; + return new HelpUrl(this.page, resolved); } private HelpUrl(final String page, final String anchor) { diff --git a/logstash-core/src/test/java/org/logstash/health/PipelineIndicatorTest.java b/logstash-core/src/test/java/org/logstash/health/PipelineIndicatorTest.java index 3b242dee7c..0f12401520 100644 --- a/logstash-core/src/test/java/org/logstash/health/PipelineIndicatorTest.java +++ b/logstash-core/src/test/java/org/logstash/health/PipelineIndicatorTest.java @@ -37,7 +37,7 @@ public void testLoading() { assertThat(analysis.status, is(Status.YELLOW)); assertThat(analysis.diagnosis, is(notNullValue())); assertThat(analysis.diagnosis.cause, containsString("loading")); - assertThat(analysis.diagnosis.helpUrl, containsString("/health-report-pipeline-status.html#loading")); + assertThat(analysis.diagnosis.helpUrl, containsString("/health-report-pipeline-status.html#" + expectedAnchor("health-report-pipeline-status", "loading"))); assertThat(analysis.impact, is(notNullValue())); assertThat(analysis.impact.id, containsString("not_processing")); assertThat(analysis.impact.impactAreas, contains(ImpactArea.PIPELINE_EXECUTION)); @@ -51,7 +51,7 @@ public void testFinished() { assertThat(analysis.status, is(Status.YELLOW)); assertThat(analysis.diagnosis, is(notNullValue())); assertThat(analysis.diagnosis.cause, containsString("finished")); - assertThat(analysis.diagnosis.helpUrl, containsString("/health-report-pipeline-status.html#finished")); + assertThat(analysis.diagnosis.helpUrl, containsString("/health-report-pipeline-status.html#" + expectedAnchor("health-report-pipeline-status", "finished"))); assertThat(analysis.impact, is(notNullValue())); assertThat(analysis.impact.id, containsString("not_processing")); assertThat(analysis.impact.impactAreas, contains(ImpactArea.PIPELINE_EXECUTION)); @@ -65,7 +65,7 @@ public void testTerminated() { assertThat(analysis.status, is(Status.RED)); assertThat(analysis.diagnosis, is(notNullValue())); assertThat(analysis.diagnosis.cause, containsString("error")); - assertThat(analysis.diagnosis.helpUrl, containsString("/health-report-pipeline-status.html#terminated")); + assertThat(analysis.diagnosis.helpUrl, containsString("/health-report-pipeline-status.html#" + expectedAnchor("health-report-pipeline-status", "terminated"))); assertThat(analysis.impact, is(notNullValue())); assertThat(analysis.impact.id, containsString("not_processing")); assertThat(analysis.impact.impactAreas, contains(ImpactArea.PIPELINE_EXECUTION)); @@ -79,12 +79,17 @@ public void testUnknown() { assertThat(analysis.status, is(Status.UNKNOWN)); assertThat(analysis.diagnosis, is(notNullValue())); assertThat(analysis.diagnosis.cause, containsString("not known")); - assertThat(analysis.diagnosis.helpUrl, containsString("/health-report-pipeline-status.html#unknown")); + assertThat(analysis.diagnosis.helpUrl, containsString("/health-report-pipeline-status.html#" + expectedAnchor("health-report-pipeline-status", "unknown"))); assertThat(analysis.impact, is(notNullValue())); assertThat(analysis.impact.id, containsString("not_processing")); assertThat(analysis.impact.impactAreas, contains(ImpactArea.PIPELINE_EXECUTION)); } + /** Mirrors {@link HelpUrl#withAnchor} for use in assertions. */ + private static String expectedAnchor(final String page, final String anchor) { + return HelpUrl.IS_MAJOR_9_PLUS ? page + "-diagnosis-" + anchor : anchor; + } + static PipelineIndicator.Details detailsForStatus(PipelineIndicator.Status status) { return new PipelineIndicator.Details(status); }