You've already forked wp-prometheus
All checks were successful
Create Release Package / build-release (push) Successful in 59s
- Custom Metrics Builder with admin UI for gauge metrics - Support for static values and WordPress option-based values - JSON-based export/import with skip/overwrite/rename modes - Three Grafana dashboard templates (overview, runtime, WooCommerce) - New tabs: Custom Metrics and Dashboards - Reset runtime metrics button Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
152 lines
3.6 KiB
PHP
152 lines
3.6 KiB
PHP
<?php
|
|
/**
|
|
* Dashboard provider class.
|
|
*
|
|
* @package WP_Prometheus
|
|
*/
|
|
|
|
namespace Magdev\WpPrometheus\Admin;
|
|
|
|
// Prevent direct file access.
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* DashboardProvider class.
|
|
*
|
|
* Provides Grafana dashboard templates for download.
|
|
*/
|
|
class DashboardProvider {
|
|
|
|
/**
|
|
* Dashboard directory path.
|
|
*
|
|
* @var string
|
|
*/
|
|
private string $dashboard_dir;
|
|
|
|
/**
|
|
* Available dashboard definitions.
|
|
*
|
|
* @var array
|
|
*/
|
|
private array $dashboards = array();
|
|
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
public function __construct() {
|
|
$this->dashboard_dir = WP_PROMETHEUS_PATH . 'assets/dashboards/';
|
|
|
|
$this->dashboards = array(
|
|
'wordpress-overview' => array(
|
|
'title' => __( 'WordPress Overview', 'wp-prometheus' ),
|
|
'description' => __( 'General WordPress metrics including users, posts, comments, and plugins.', 'wp-prometheus' ),
|
|
'file' => 'wordpress-overview.json',
|
|
'icon' => 'dashicons-wordpress',
|
|
),
|
|
'wordpress-runtime' => array(
|
|
'title' => __( 'Runtime Performance', 'wp-prometheus' ),
|
|
'description' => __( 'HTTP request metrics, database query performance, and response times.', 'wp-prometheus' ),
|
|
'file' => 'wordpress-runtime.json',
|
|
'icon' => 'dashicons-performance',
|
|
),
|
|
'wordpress-woocommerce' => array(
|
|
'title' => __( 'WooCommerce Store', 'wp-prometheus' ),
|
|
'description' => __( 'WooCommerce metrics including products, orders, revenue, and customers.', 'wp-prometheus' ),
|
|
'file' => 'wordpress-woocommerce.json',
|
|
'icon' => 'dashicons-cart',
|
|
),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get list of available dashboards.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_available(): array {
|
|
$available = array();
|
|
|
|
foreach ( $this->dashboards as $slug => $dashboard ) {
|
|
$file_path = $this->dashboard_dir . $dashboard['file'];
|
|
if ( file_exists( $file_path ) ) {
|
|
$available[ $slug ] = $dashboard;
|
|
}
|
|
}
|
|
|
|
return $available;
|
|
}
|
|
|
|
/**
|
|
* Get dashboard content by slug.
|
|
*
|
|
* @param string $slug Dashboard slug.
|
|
* @return string|null JSON content or null if not found.
|
|
*/
|
|
public function get_dashboard( string $slug ): ?string {
|
|
// Validate slug to prevent directory traversal.
|
|
$slug = sanitize_file_name( $slug );
|
|
|
|
if ( ! isset( $this->dashboards[ $slug ] ) ) {
|
|
return null;
|
|
}
|
|
|
|
$file_path = $this->dashboard_dir . $this->dashboards[ $slug ]['file'];
|
|
|
|
// Security: Ensure file is within dashboard directory.
|
|
$real_path = realpath( $file_path );
|
|
$real_dir = realpath( $this->dashboard_dir );
|
|
|
|
if ( false === $real_path || false === $real_dir || strpos( $real_path, $real_dir ) !== 0 ) {
|
|
return null;
|
|
}
|
|
|
|
if ( ! file_exists( $file_path ) || ! is_readable( $file_path ) ) {
|
|
return null;
|
|
}
|
|
|
|
// phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
|
|
$content = file_get_contents( $file_path );
|
|
|
|
if ( false === $content ) {
|
|
return null;
|
|
}
|
|
|
|
return $content;
|
|
}
|
|
|
|
/**
|
|
* Get dashboard metadata by slug.
|
|
*
|
|
* @param string $slug Dashboard slug.
|
|
* @return array|null Dashboard metadata or null if not found.
|
|
*/
|
|
public function get_metadata( string $slug ): ?array {
|
|
$slug = sanitize_file_name( $slug );
|
|
|
|
if ( ! isset( $this->dashboards[ $slug ] ) ) {
|
|
return null;
|
|
}
|
|
|
|
return $this->dashboards[ $slug ];
|
|
}
|
|
|
|
/**
|
|
* Get filename for download.
|
|
*
|
|
* @param string $slug Dashboard slug.
|
|
* @return string|null Filename or null if not found.
|
|
*/
|
|
public function get_filename( string $slug ): ?string {
|
|
$slug = sanitize_file_name( $slug );
|
|
|
|
if ( ! isset( $this->dashboards[ $slug ] ) ) {
|
|
return null;
|
|
}
|
|
|
|
return $this->dashboards[ $slug ]['file'];
|
|
}
|
|
}
|