You've already forked wp-prometheus
fix: Separate settings groups to prevent cross-tab overwrites (v0.4.5)
All checks were successful
Create Release Package / build-release (push) Successful in 1m2s
All checks were successful
Create Release Package / build-release (push) Successful in 1m2s
Split Metrics sub-tab settings into separate WordPress option groups: - wp_prometheus_endpoint_settings for auth token - wp_prometheus_selection_settings for enabled metrics - wp_prometheus_advanced_settings for isolated mode This fixes the bug where saving from one sub-tab would clear settings from other sub-tabs due to all settings sharing a single option group. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
* Plugin Name: WP Prometheus
|
||||
* Plugin URI: https://src.bundespruefstelle.ch/magdev/wp-prometheus
|
||||
* Description: Prometheus metrics endpoint for WordPress with extensible hooks for custom metrics.
|
||||
* Version: 0.4.3
|
||||
* Version: 0.4.5
|
||||
* Requires at least: 6.4
|
||||
* Requires PHP: 8.3
|
||||
* Author: Marco Graetsch
|
||||
@@ -22,11 +22,16 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Early metrics endpoint handler.
|
||||
* Early metrics request detection.
|
||||
*
|
||||
* Intercepts /metrics requests before full WordPress initialization to avoid
|
||||
* conflicts with other plugins that may cause issues during template loading.
|
||||
* This runs at plugin load time, before plugins_loaded hook.
|
||||
* Detects /metrics requests early and removes problematic content filters
|
||||
* to prevent recursion issues with Twig-based plugins. Unlike the previous
|
||||
* "early mode", this allows WordPress to continue loading so that third-party
|
||||
* plugins can register their wp_prometheus_collect_metrics hooks.
|
||||
*
|
||||
* Two modes are available:
|
||||
* - Safe mode (default): Removes filters early, lets WP load, fires custom hooks
|
||||
* - Isolated mode: Outputs metrics immediately without custom hooks (legacy early mode)
|
||||
*/
|
||||
function wp_prometheus_early_metrics_check(): void {
|
||||
// Only handle /metrics requests.
|
||||
@@ -37,18 +42,58 @@ function wp_prometheus_early_metrics_check(): void {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if early mode is disabled via environment variable.
|
||||
$env_disable = getenv( 'WP_PROMETHEUS_DISABLE_EARLY_MODE' );
|
||||
if ( false !== $env_disable && in_array( strtolower( $env_disable ), array( '1', 'true', 'yes', 'on' ), true ) ) {
|
||||
return;
|
||||
// Set flag to indicate we're handling a metrics request.
|
||||
define( 'WP_PROMETHEUS_METRICS_REQUEST', true );
|
||||
|
||||
// Check if isolated mode is enabled via environment variable.
|
||||
$env_isolated = getenv( 'WP_PROMETHEUS_ISOLATED_MODE' );
|
||||
$isolated_mode = false !== $env_isolated && in_array( strtolower( $env_isolated ), array( '1', 'true', 'yes', 'on' ), true );
|
||||
|
||||
// Check if isolated mode is enabled via option (legacy "early mode" setting).
|
||||
if ( ! $isolated_mode && ! get_option( 'wp_prometheus_disable_early_mode', false ) ) {
|
||||
// Check for legacy isolated mode option.
|
||||
$isolated_mode = (bool) get_option( 'wp_prometheus_isolated_mode', false );
|
||||
}
|
||||
|
||||
// Check if early mode is disabled via option.
|
||||
// We can use get_option() here because WordPress core is already loaded.
|
||||
if ( get_option( 'wp_prometheus_disable_early_mode', false ) ) {
|
||||
return;
|
||||
}
|
||||
// Remove all content filters immediately to prevent recursion with Twig-based plugins.
|
||||
// This is done for BOTH safe mode and isolated mode.
|
||||
add_action( 'plugins_loaded', 'wp_prometheus_remove_content_filters', 0 );
|
||||
|
||||
// Also remove filters now in case they were added by mu-plugins.
|
||||
wp_prometheus_remove_content_filters();
|
||||
|
||||
// If isolated mode is enabled, handle metrics immediately without waiting for plugins.
|
||||
if ( $isolated_mode ) {
|
||||
wp_prometheus_isolated_metrics_handler();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove content filters that can cause recursion.
|
||||
*
|
||||
* Called early during metrics requests to prevent infinite loops
|
||||
* with Twig-based plugins that hook into content filters.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function wp_prometheus_remove_content_filters(): void {
|
||||
remove_all_filters( 'the_content' );
|
||||
remove_all_filters( 'the_excerpt' );
|
||||
remove_all_filters( 'get_the_excerpt' );
|
||||
remove_all_filters( 'the_title' );
|
||||
remove_all_filters( 'the_content_feed' );
|
||||
remove_all_filters( 'comment_text' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle metrics in isolated mode (no custom hooks).
|
||||
*
|
||||
* This is the legacy "early mode" that outputs metrics immediately
|
||||
* without allowing third-party plugins to add custom metrics.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function wp_prometheus_isolated_metrics_handler(): void {
|
||||
// Check if autoloader exists.
|
||||
$autoloader = __DIR__ . '/vendor/autoload.php';
|
||||
if ( ! file_exists( $autoloader ) ) {
|
||||
@@ -99,14 +144,8 @@ function wp_prometheus_early_metrics_check(): void {
|
||||
exit;
|
||||
}
|
||||
|
||||
// Set flag to indicate early metrics mode - Collector will skip extensibility hooks.
|
||||
define( 'WP_PROMETHEUS_EARLY_METRICS', true );
|
||||
|
||||
// Remove all content filters to prevent recursion with Twig-based plugins.
|
||||
remove_all_filters( 'the_content' );
|
||||
remove_all_filters( 'the_excerpt' );
|
||||
remove_all_filters( 'get_the_excerpt' );
|
||||
remove_all_filters( 'the_title' );
|
||||
// Set flag to indicate isolated mode - Collector will skip extensibility hooks.
|
||||
define( 'WP_PROMETHEUS_ISOLATED_MODE', true );
|
||||
|
||||
// Output metrics and exit immediately.
|
||||
$collector = new \Magdev\WpPrometheus\Metrics\Collector();
|
||||
@@ -130,7 +169,7 @@ wp_prometheus_early_metrics_check();
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
define( 'WP_PROMETHEUS_VERSION', '0.4.3' );
|
||||
define( 'WP_PROMETHEUS_VERSION', '0.4.5' );
|
||||
|
||||
/**
|
||||
* Plugin file path.
|
||||
|
||||
Reference in New Issue
Block a user