From 4ef4ef849fbd6570af1ac5fb4ba03a76ffa21ef1 Mon Sep 17 00:00:00 2001 From: andsel Date: Tue, 10 Mar 2026 11:47:39 +0100 Subject: [PATCH 1/5] Updates the flow metrics view in Logstash's diagnostic creation to include batch structure metrics informations, for current, average and windowed p50 and p90 --- README.md | 6 +- .../flow_metrics.html.ftlh | 69 +++++++++++++++++++ 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7aeca775..2f1c4587 100644 --- a/README.md +++ b/README.md @@ -79,10 +79,8 @@ This software is licensed under [Elastic License v2](https://www.elastic.co/lice - Clone or download the Github repo. In order to clone the repo you must have Git installed and running. See the instructions appropriate for your operating system. - Make sure you have a JDK version 17 or greater. It **must** be a JDK, not a JRE or you will not be able to compile. - Set the `JAVA_HOME` environment variable to point to your JDK installation. -- Make sure a recent version of Maven is installed on the build machine. -- Create a `MAVEN_HOME` directory pointing to the location you've unzipped it to. -- `cd` to the top level repo directory and type `mvn package`. -- The release artifacts will be contained in the `target` directory. +- `cd` to the top level repo directory and type `./gradlew package`. +- The release artifacts will be contained in the `build/libs` directory. ### Creating A Docker Image diff --git a/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh b/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh index 5bd248ec..094a132b 100644 --- a/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh +++ b/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh @@ -833,6 +833,75 @@ + + + + Batch structure + } /> + + + + + + + Metric + Current + Average + p50 + p90 + + + + + + 1 min + 5 min + 15 min + 1 min + 5 min + 15 min + + + + + Event count + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.current)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.average.lifetime)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p50.last_1_minute)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p50.last_5_minutes)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p50.last_15_minutes)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p90.last_1_minute)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p90.last_5_minutes)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p90.last_15_minutes)} + + + Byte size + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.current)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.average.lifetime)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p50.last_1_minute)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p50.last_5_minutes)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p50.last_15_minutes)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p90.last_1_minute)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p90.last_5_minutes)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p90.last_15_minutes)} + + +
+
+
+
Date: Thu, 26 Mar 2026 11:02:11 +0100 Subject: [PATCH 2/5] Conditionally display the batch structure metrics panel --- build.gradle.kts | 18 ++++++++++++++++++ .../flow_metrics.html.ftlh | 2 ++ 2 files changed, 20 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index bbcf3b2e..14fa4535 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,11 +5,15 @@ plugins { `maven-publish` signing id("com.github.jk1.dependency-license-report") +// application } group = property("group") as String version = property("version") as String +//application { +// mainClass.set("co.elastic.support.diagnostics.DiagnosticApp") +//} java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 @@ -173,6 +177,20 @@ tasks.named("build") { dependsOn(distZip, distZipChecksum, copyDependencies) } +tasks.register("runApplication") { + group = "Execution" + description = "Runs the specified main class" + + // Set the full path to your main class + mainClass.set("co.elastic.support.diagnostics.DiagnosticApp") + + // Use the compiled classes and dependencies as the classpath + classpath = sourceSets["main"].runtimeClasspath + + // Optional: Pass command-line arguments + // args("arg1", "arg2") +} + // --------------------------------------------------------------------------- // Test // --------------------------------------------------------------------------- diff --git a/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh b/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh index 094a132b..da36318c 100644 --- a/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh +++ b/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh @@ -834,6 +834,7 @@ + {_try(() => data.stats.pipelines[selectedPipeline.name].batch) && ( + )} Date: Thu, 26 Mar 2026 11:34:06 +0100 Subject: [PATCH 3/5] Selectively display p50 and p90 group columns of if present --- .../flow_metrics.html.ftlh | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh b/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh index da36318c..21238926 100644 --- a/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh +++ b/src/main/resources/logstash-diagnostic-templates/flow_metrics.html.ftlh @@ -757,6 +757,11 @@ }; } + const hasBatchP50 = _try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p50) !== "" + || _try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p50) !== ""; + const hasBatchP90 = _try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p90) !== "" + || _try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p90) !== ""; + return ( @@ -860,19 +865,23 @@ Metric Current Average - p50 - p90 + {hasBatchP50 && p50} + {hasBatchP90 && p90} - 1 min - 5 min - 15 min - 1 min - 5 min - 15 min + {hasBatchP50 && + 1 min + 5 min + 15 min + } + {hasBatchP90 && + 1 min + 5 min + 15 min + } @@ -880,23 +889,31 @@ Event count {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.current)} {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.average.lifetime)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p50.last_1_minute)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p50.last_5_minutes)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p50.last_15_minutes)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p90.last_1_minute)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p90.last_5_minutes)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p90.last_15_minutes)} + {hasBatchP50 && + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p50.last_1_minute)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p50.last_5_minutes)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p50.last_15_minutes)} + } + {hasBatchP90 && + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p90.last_1_minute)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p90.last_5_minutes)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.event_count.p90.last_15_minutes)} + } Byte size {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.current)} {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.average.lifetime)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p50.last_1_minute)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p50.last_5_minutes)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p50.last_15_minutes)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p90.last_1_minute)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p90.last_5_minutes)} - {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p90.last_15_minutes)} + {hasBatchP50 && + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p50.last_1_minute)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p50.last_5_minutes)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p50.last_15_minutes)} + } + {hasBatchP90 && + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p90.last_1_minute)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p90.last_5_minutes)} + {_try(() => data.stats.pipelines[selectedPipeline.name].batch.byte_size.p90.last_15_minutes)} + } From 6e826184b2290fb26c5a32cf101aeeb3e45333d4 Mon Sep 17 00:00:00 2001 From: andsel Date: Thu, 26 Mar 2026 11:37:21 +0100 Subject: [PATCH 4/5] Removed runApplication utility task for dev --- build.gradle.kts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 14fa4535..bbcf3b2e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,15 +5,11 @@ plugins { `maven-publish` signing id("com.github.jk1.dependency-license-report") -// application } group = property("group") as String version = property("version") as String -//application { -// mainClass.set("co.elastic.support.diagnostics.DiagnosticApp") -//} java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 @@ -177,20 +173,6 @@ tasks.named("build") { dependsOn(distZip, distZipChecksum, copyDependencies) } -tasks.register("runApplication") { - group = "Execution" - description = "Runs the specified main class" - - // Set the full path to your main class - mainClass.set("co.elastic.support.diagnostics.DiagnosticApp") - - // Use the compiled classes and dependencies as the classpath - classpath = sourceSets["main"].runtimeClasspath - - // Optional: Pass command-line arguments - // args("arg1", "arg2") -} - // --------------------------------------------------------------------------- // Test // --------------------------------------------------------------------------- From 657cfc42b55a97aa7f096c894695df81ab180e33 Mon Sep 17 00:00:00 2001 From: Andrea Selva Date: Tue, 14 Apr 2026 16:24:07 +0200 Subject: [PATCH 5/5] Fixed name of task to run in Gradle to build --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f1c4587..d17f69a2 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ This software is licensed under [Elastic License v2](https://www.elastic.co/lice - Clone or download the Github repo. In order to clone the repo you must have Git installed and running. See the instructions appropriate for your operating system. - Make sure you have a JDK version 17 or greater. It **must** be a JDK, not a JRE or you will not be able to compile. - Set the `JAVA_HOME` environment variable to point to your JDK installation. -- `cd` to the top level repo directory and type `./gradlew package`. +- `cd` to the top level repo directory and type `./gradlew build`. - The release artifacts will be contained in the `build/libs` directory. ### Creating A Docker Image