001/* 002 * Copyright © 2025 CUI-OpenSource-Software (info@cuioss.de) 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package de.cuioss.benchmarking.common.constants; 017 018import lombok.experimental.UtilityClass; 019 020/** 021 * Consolidated constants for benchmark modules. 022 * Organized using the DSL-Style Nested Constants Pattern with static imports. 023 */ 024@SuppressWarnings("java:S1075") 025// False positive, no URL Parameter 026@UtilityClass 027public final class BenchmarkConstants { 028 029 /** 030 * Metrics-related constants for measurement and reporting. 031 */ 032 @UtilityClass 033 public static final class Metrics { 034 035 /** 036 * The common prefix for all JWT metrics. 037 */ 038 public static final String PREFIX = "sheriff.oauth"; 039 040 /** 041 * Metrics related to bearer token operations. 042 */ 043 @UtilityClass 044 public static final class BearerToken { 045 /** 046 * Base path for bearer token metrics. 047 */ 048 public static final String BASE = PREFIX + ".bearer.token"; 049 050 /** 051 * Metric identifier for bearer token validation duration. 052 */ 053 public static final String VALIDATION = BASE + ".validation"; 054 } 055 056 /** 057 * Benchmark modes. 058 */ 059 @UtilityClass 060 public static final class Modes { 061 public static final String THROUGHPUT = "thrpt"; 062 public static final String AVERAGE_TIME = "avgt"; 063 public static final String SAMPLE = "sample"; 064 } 065 066 /** 067 * Unit strings for benchmark measurements. 068 */ 069 @UtilityClass 070 public static final class Units { 071 // Operations per time unit 072 public static final String OPS_PER_SEC = "ops/s"; 073 public static final String OPS_PER_SEC_ALT = "ops/sec"; 074 public static final String OPS_PER_MS = "ops/ms"; 075 public static final String OPS_PER_US = "ops/us"; 076 public static final String OPS_PER_NS = "ops/ns"; 077 public static final String OPS = "ops"; 078 079 // Time per operation 080 public static final String SEC_PER_OP = "s/op"; 081 public static final String MS_PER_OP = "ms/op"; 082 public static final String US_PER_OP = "us/op"; 083 public static final String NS_PER_OP = "ns/op"; 084 085 // Display suffixes 086 public static final String K_OPS_S = "K ops/s"; 087 public static final String M_OPS_S = "M ops/s"; 088 public static final String SPACE_OPS_S = " ops/s"; 089 public static final String SUFFIX_S = "s"; 090 public static final String SUFFIX_MS = "ms"; 091 public static final String SUFFIX_OP = "/op"; 092 } 093 094 /** 095 * Conversion factors between different units. 096 */ 097 @UtilityClass 098 public static final class Conversions { 099 public static final double MILLIS_TO_SECONDS = 1000.0; 100 public static final double MICROS_TO_SECONDS = 1_000_000.0; 101 public static final double NANOS_TO_SECONDS = 1_000_000_000.0; 102 public static final double MICROS_TO_MILLIS = 1000.0; 103 public static final double NANOS_TO_MILLIS = 1_000_000.0; 104 } 105 106 /** 107 * Percentile-related constants. 108 */ 109 @UtilityClass 110 public static final class Percentiles { 111 // Percentile keys 112 public static final String P_0 = "0.0"; 113 public static final String P_50 = "50.0"; 114 public static final String P_90 = "90.0"; 115 public static final String P_95 = "95.0"; 116 public static final String P_99 = "99.0"; 117 public static final String P_99_9 = "99.9"; 118 public static final String P_99_99 = "99.99"; 119 public static final String P_100 = "100.0"; 120 121 // Percentile labels 122 public static final String LABEL_P0 = "P0"; 123 public static final String LABEL_P50 = "P50"; 124 public static final String LABEL_P90 = "P90"; 125 public static final String LABEL_P95 = "P95"; 126 public static final String LABEL_P99 = "P99"; 127 public static final String LABEL_P99_9 = "P99.9"; 128 public static final String LABEL_P99_99 = "P99.99"; 129 public static final String LABEL_P100 = "P100"; 130 131 public static final String SUFFIX_TH = "th"; 132 } 133 } 134 135 /** 136 * Report-related constants for benchmark report generation. 137 */ 138 @UtilityClass 139 public static final class Report { 140 141 /** 142 * JSON field names used in benchmark data structures. 143 */ 144 @UtilityClass 145 public static final class JsonFields { 146 // Primary fields 147 public static final String PRIMARY_METRIC = "primaryMetric"; 148 public static final String SECONDARY_METRICS = "secondaryMetrics"; 149 public static final String BENCHMARK = "benchmark"; 150 public static final String MODE = "mode"; 151 public static final String SCORE = "score"; 152 public static final String SCORE_UNIT = "scoreUnit"; 153 public static final String RAW_DATA = "rawData"; 154 public static final String SCORE_PERCENTILES = "scorePercentiles"; 155 public static final String SCORE_ERROR = "scoreError"; 156 public static final String SCORE_CONFIDENCE = "scoreConfidence"; 157 public static final String TIMESTAMP = "timestamp"; 158 public static final String BENCHMARKS = "benchmarks"; 159 public static final String SUMMARY = "summary"; 160 161 // Report data fields 162 public static final String METADATA = "metadata"; 163 public static final String OVERVIEW = "overview"; 164 public static final String CHART_DATA = "chartData"; 165 public static final String TRENDS = "trends"; 166 public static final String DISPLAY_TIMESTAMP = "displayTimestamp"; 167 public static final String BENCHMARK_TYPE = "benchmarkType"; 168 public static final String REPORT_VERSION = "reportVersion"; 169 170 // Metrics fields 171 public static final String THROUGHPUT = "throughput"; 172 public static final String LATENCY = "latency"; 173 public static final String THROUGHPUT_BENCHMARK_NAME = "throughputBenchmarkName"; 174 public static final String LATENCY_BENCHMARK_NAME = "latencyBenchmarkName"; 175 public static final String PERFORMANCE_SCORE = "performanceScore"; 176 public static final String PERFORMANCE_GRADE = "performanceGrade"; 177 public static final String PERFORMANCE_GRADE_CLASS = "performanceGradeClass"; 178 179 // Result fields 180 public static final String NAME = "name"; 181 public static final String FULL_NAME = "fullName"; 182 public static final String ERROR = "error"; 183 public static final String VARIABILITY_COEFFICIENT = "variabilityCoefficient"; 184 public static final String CONFIDENCE_LOW = "confidenceLow"; 185 public static final String CONFIDENCE_HIGH = "confidenceHigh"; 186 public static final String PERCENTILES = "percentiles"; 187 188 // Chart fields 189 public static final String LABELS = "labels"; 190 public static final String PERCENTILES_DATA = "percentilesData"; 191 public static final String PERCENTILE_LABELS = "percentileLabels"; 192 public static final String DATA = "data"; 193 public static final String DATASETS = "datasets"; 194 195 // Status fields 196 public static final String STATUS = "status"; 197 public static final String GENERATED = "generated"; 198 public static final String LAST_RUN = "last_run"; 199 public static final String SERVICES = "services"; 200 public static final String LINKS = "links"; 201 public static final String AVAILABLE = "available"; 202 203 // Summary fields 204 public static final String TOTAL_BENCHMARKS = "total_benchmarks"; 205 public static final String PERFORMANCE_GRADE_KEY = "performance_grade"; 206 public static final String AVERAGE_THROUGHPUT = "average_throughput"; 207 } 208 209 /** 210 * Badge-related constants for shields.io integration. 211 */ 212 @UtilityClass 213 public static final class Badge { 214 public static final String SCHEMA_VERSION = "schemaVersion"; 215 public static final String LABEL = "label"; 216 public static final String MESSAGE = "message"; 217 public static final String COLOR = "color"; 218 219 /** 220 * Badge colors following shields.io color scheme. 221 */ 222 @UtilityClass 223 public static final class Colors { 224 public static final String BRIGHT_GREEN = "brightgreen"; 225 public static final String GREEN = "green"; 226 public static final String YELLOW_GREEN = "yellowgreen"; 227 public static final String YELLOW = "yellow"; 228 public static final String ORANGE = "orange"; 229 public static final String RED = "red"; 230 public static final String BLUE = "blue"; 231 public static final String LIGHT_GRAY = "lightgray"; 232 } 233 234 /** 235 * Badge labels. 236 */ 237 @UtilityClass 238 public static final class Labels { 239 public static final String PERFORMANCE = "Performance"; 240 public static final String PERFORMANCE_TREND = "Performance Trend"; 241 public static final String TREND = "Trend"; 242 public static final String LAST_RUN = "Last Run"; 243 } 244 245 /** 246 * Trend indicators. 247 */ 248 @UtilityClass 249 public static final class Trends { 250 public static final String STABLE = "→ stable"; 251 public static final String IMPROVING_FORMAT = "↑ +%.1f%%"; 252 public static final String DEGRADING_FORMAT = "↓ %.1f%%"; 253 } 254 255 /** 256 * Badge messages. 257 */ 258 @UtilityClass 259 public static final class Messages { 260 public static final String NO_HISTORY = "No history"; 261 } 262 263 /** 264 * Badge file names. 265 */ 266 @UtilityClass 267 public static final class FileNames { 268 public static final String PERFORMANCE_BADGE_JSON = "performance-badge.json"; 269 public static final String TREND_BADGE_JSON = "trend-badge.json"; 270 public static final String LAST_RUN_BADGE_JSON = "last-run-badge.json"; 271 } 272 273 /** 274 * Trend direction constants. 275 */ 276 @UtilityClass 277 public static final class TrendDirection { 278 public static final String UP = "up"; 279 public static final String DOWN = "down"; 280 public static final String STABLE = "stable"; 281 } 282 283 /** 284 * Arrow symbols for trends. 285 */ 286 @UtilityClass 287 public static final class Arrows { 288 public static final String UP = "↑"; 289 public static final String DOWN = "↓"; 290 public static final String RIGHT = "→"; 291 public static final String BULLET = "•"; 292 } 293 } 294 295 /** 296 * Performance grade constants. 297 */ 298 @UtilityClass 299 public static final class Grades { 300 public static final String A_PLUS = "A+"; 301 public static final String A = "A"; 302 public static final String B = "B"; 303 public static final String C = "C"; 304 public static final String D = "D"; 305 public static final String F = "F"; 306 307 /** 308 * CSS class names for grades. 309 */ 310 @UtilityClass 311 public static final class CssClasses { 312 public static final String GRADE_A_PLUS = "grade-a-plus"; 313 public static final String GRADE_A = "grade-a"; 314 public static final String GRADE_B = "grade-b"; 315 public static final String GRADE_C = "grade-c"; 316 public static final String GRADE_D = "grade-d"; 317 public static final String GRADE_F = "grade-f"; 318 public static final String GRADE_UNKNOWN = "grade-unknown"; 319 } 320 } 321 322 /** 323 * Default values for missing data. 324 */ 325 @UtilityClass 326 public static final class Defaults { 327 public static final String N_A = "N/A"; 328 public static final String NOT_AVAILABLE = "n/a"; 329 } 330 331 /** 332 * Template paths and resources. 333 */ 334 @UtilityClass 335 public static final class Templates { 336 public static final String PATH_PREFIX = "/templates/"; 337 public static final String NOT_FOUND_FORMAT = "Template not found: %s"; 338 } 339 340 /** 341 * Error messages. 342 */ 343 @UtilityClass 344 public static final class Errors { 345 public static final String THROUGHPUT_NAME_REQUIRED = "Throughput benchmark name must be specified"; 346 public static final String LATENCY_NAME_REQUIRED = "Latency benchmark name must be specified"; 347 public static final String NO_RESULTS_PROVIDED = "No benchmark results provided"; 348 public static final String THROUGHPUT_NOT_FOUND_FORMAT = "Required throughput benchmark '%s' not found in results"; 349 public static final String LATENCY_NOT_FOUND_FORMAT = "Required latency benchmark '%s' not found in results"; 350 public static final String THROUGHPUT_POSITIVE = "Throughput must be positive, got: "; 351 public static final String LATENCY_POSITIVE = "Latency must be positive, got: "; 352 public static final String SCORE_NON_NEGATIVE = "Performance score must be non-negative, got: "; 353 } 354 355 /** 356 * Messages for UI display. 357 */ 358 @UtilityClass 359 public static final class Messages { 360 public static final String HISTORICAL_DATA_NOT_AVAILABLE = "Historical data not yet available"; 361 public static final String PERFORMANCE_STABLE_FORMAT = "Performance is stable (%.1f%% change)"; 362 public static final String PERFORMANCE_IMPROVED_FORMAT = "Performance improved by %.1f%%"; 363 public static final String PERFORMANCE_DECREASED_FORMAT = "Performance decreased by %.1f%%"; 364 } 365 366 /** 367 * Date/time format patterns. 368 */ 369 @UtilityClass 370 public static final class DateFormats { 371 public static final String DISPLAY_TIMESTAMP_PATTERN = "yyyy-MM-dd HH:mm:ss 'UTC'"; 372 } 373 374 /** 375 * Version information. 376 */ 377 @UtilityClass 378 public static final class Versions { 379 public static final String REPORT_VERSION = "1.0"; 380 } 381 382 /** 383 * API endpoint paths. 384 */ 385 @UtilityClass 386 public static final class Api { 387 public static final String LATEST_JSON = "latest.json"; 388 public static final String BENCHMARKS_JSON = "benchmarks.json"; 389 public static final String STATUS_JSON = "status.json"; 390 391 // API paths 392 public static final String API_BENCHMARKS_PATH = "/api/benchmarks.json"; 393 public static final String BADGES_PATH = "/badges/"; 394 395 // Status values 396 public static final String STATUS_OPERATIONAL = "operational"; 397 public static final String STATUS_NO_DATA = "no_data"; 398 public static final String STATUS_HEALTHY = "healthy"; 399 public static final String STATUS_SUCCESS = "success"; 400 } 401 } 402 403 /** 404 * Integration-related constants for configuration and setup. 405 */ 406 @UtilityClass 407 public static final class Integration { 408 409 /** 410 * System properties for integration configuration. 411 */ 412 @UtilityClass 413 public static final class Properties { 414 public static final String INTEGRATION_SERVICE_URL = "integration.service.url"; 415 public static final String KEYCLOAK_URL = "keycloak.url"; 416 public static final String METRICS_URL = "quarkus.metrics.url"; 417 } 418 419 /** 420 * JMH configuration properties. 421 */ 422 @UtilityClass 423 public static final class Jmh { 424 public static final String INCLUDE = "jmh.include"; 425 public static final String FORKS = "jmh.forks"; 426 public static final String WARMUP_ITERATIONS = "jmh.warmupIterations"; 427 public static final String MEASUREMENT_ITERATIONS = "jmh.iterations"; 428 public static final String MEASUREMENT_TIME = "jmh.time"; 429 public static final String WARMUP_TIME = "jmh.warmupTime"; 430 public static final String THREADS = "jmh.threads"; 431 public static final String RESULT_FORMAT = "jmh.result.format"; 432 } 433 } 434 435 /** 436 * File and directory constants for benchmark I/O operations. 437 */ 438 @UtilityClass 439 public static final class Files { 440 441 /** 442 * Directory paths. 443 */ 444 @UtilityClass 445 public static final class Directories { 446 public static final String RESULTS_DIR = "target/benchmark-results"; 447 public static final String REPORTS_DIR = "reports"; 448 public static final String BADGES_DIR = "badges"; 449 public static final String DATA_DIR = "data"; 450 public static final String API_DIR = "api"; 451 } 452 453 /** 454 * HTML files. 455 */ 456 @UtilityClass 457 public static final class Html { 458 public static final String INDEX = "index.html"; 459 public static final String TRENDS = "trends.html"; 460 public static final String DETAILED = "detailed.html"; 461 public static final String ERROR_404 = "404.html"; 462 } 463 464 /** 465 * Support files. 466 */ 467 @UtilityClass 468 public static final class Support { 469 public static final String REPORT_STYLES_CSS = "report-styles.css"; 470 public static final String DATA_LOADER_JS = "data-loader.js"; 471 public static final String ROBOTS_TXT = "robots.txt"; 472 public static final String SITEMAP_XML = "sitemap.xml"; 473 } 474 475 /** 476 * Data files. 477 */ 478 @UtilityClass 479 public static final class Data { 480 public static final String BENCHMARK_DATA_JSON = "benchmark-data.json"; 481 public static final String BENCHMARK_SUMMARY_JSON = "data/benchmark-summary.json"; 482 public static final String LAST_RUN_BADGE_JSON = "last-run-badge.json"; 483 public static final String INTEGRATION_PERFORMANCE_BADGE_JSON = "integration-performance-badge.json"; 484 public static final String PERFORMANCE_BADGE_JSON = "performance-badge.json"; 485 public static final String INTEGRATION_TREND_BADGE_JSON = "integration-trend-badge.json"; 486 } 487 488 /** 489 * File extensions. 490 */ 491 @UtilityClass 492 public static final class Extensions { 493 public static final String HTML = ".html"; 494 public static final String JSON = ".json"; 495 } 496 } 497}