You've already forked wp-prometheus
feat: Add runtime metrics for HTTP requests and database queries (v0.1.0)
All checks were successful
Create Release Package / build-release (push) Successful in 59s
All checks were successful
Create Release Package / build-release (push) Successful in 59s
- Add RuntimeCollector class for tracking request lifecycle metrics - Add wordpress_http_requests_total counter (method, status, endpoint) - Add wordpress_http_request_duration_seconds histogram - Add wordpress_db_queries_total counter (endpoint) - Add wordpress_db_query_duration_seconds histogram (requires SAVEQUERIES) - Update Collector to expose stored runtime metrics - Add new settings options for enabling/disabling runtime metrics - Create translation files (.pot, .po, .mo) for internationalization - Update documentation and changelog Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -95,6 +95,9 @@ class Collector {
|
||||
$this->collect_plugins_total();
|
||||
}
|
||||
|
||||
// Collect runtime metrics (HTTP requests, DB queries).
|
||||
$this->collect_runtime_metrics( $enabled_metrics );
|
||||
|
||||
/**
|
||||
* Fires after default metrics are collected.
|
||||
*
|
||||
@@ -233,6 +236,153 @@ class Collector {
|
||||
$gauge->set( count( $all_plugins ) - count( $active_plugins ), array( 'inactive' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Collect runtime metrics from stored data.
|
||||
*
|
||||
* @param array $enabled_metrics List of enabled metrics.
|
||||
* @return void
|
||||
*/
|
||||
private function collect_runtime_metrics( array $enabled_metrics ): void {
|
||||
$runtime_collector = RuntimeCollector::get_instance();
|
||||
$stored_metrics = $runtime_collector->get_stored_metrics();
|
||||
|
||||
// HTTP requests total counter.
|
||||
if ( in_array( 'wordpress_http_requests_total', $enabled_metrics, true ) && ! empty( $stored_metrics['counters'] ) ) {
|
||||
foreach ( $stored_metrics['counters'] as $counter_data ) {
|
||||
if ( 'http_requests_total' !== $counter_data['name'] ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$counter = $this->registry->getOrRegisterCounter(
|
||||
$this->namespace,
|
||||
'http_requests_total',
|
||||
'Total number of HTTP requests',
|
||||
array( 'method', 'status', 'endpoint' )
|
||||
);
|
||||
|
||||
$counter->incBy(
|
||||
(int) $counter_data['value'],
|
||||
array(
|
||||
$counter_data['labels']['method'] ?? 'GET',
|
||||
$counter_data['labels']['status'] ?? '200',
|
||||
$counter_data['labels']['endpoint'] ?? 'unknown',
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// HTTP request duration histogram.
|
||||
if ( in_array( 'wordpress_http_request_duration_seconds', $enabled_metrics, true ) && ! empty( $stored_metrics['histograms'] ) ) {
|
||||
foreach ( $stored_metrics['histograms'] as $histogram_data ) {
|
||||
if ( 'http_request_duration_seconds' !== $histogram_data['name'] ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// For histograms, we expose as a gauge with pre-aggregated bucket counts.
|
||||
// This is a workaround since we can't directly populate histogram buckets.
|
||||
$this->expose_histogram_as_gauges(
|
||||
'http_request_duration_seconds',
|
||||
'HTTP request duration in seconds',
|
||||
$histogram_data,
|
||||
array( 'method', 'endpoint' )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Database queries total counter.
|
||||
if ( in_array( 'wordpress_db_queries_total', $enabled_metrics, true ) && ! empty( $stored_metrics['counters'] ) ) {
|
||||
foreach ( $stored_metrics['counters'] as $counter_data ) {
|
||||
if ( 'db_queries_total' !== $counter_data['name'] ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$counter = $this->registry->getOrRegisterCounter(
|
||||
$this->namespace,
|
||||
'db_queries_total',
|
||||
'Total number of database queries',
|
||||
array( 'endpoint' )
|
||||
);
|
||||
|
||||
$counter->incBy(
|
||||
(int) $counter_data['value'],
|
||||
array(
|
||||
$counter_data['labels']['endpoint'] ?? 'unknown',
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Database query duration histogram (if SAVEQUERIES is enabled).
|
||||
if ( in_array( 'wordpress_db_queries_total', $enabled_metrics, true ) && ! empty( $stored_metrics['histograms'] ) ) {
|
||||
foreach ( $stored_metrics['histograms'] as $histogram_data ) {
|
||||
if ( 'db_query_duration_seconds' !== $histogram_data['name'] ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->expose_histogram_as_gauges(
|
||||
'db_query_duration_seconds',
|
||||
'Database query duration in seconds',
|
||||
$histogram_data,
|
||||
array( 'endpoint' )
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose pre-aggregated histogram data as gauge metrics.
|
||||
*
|
||||
* Since we store histogram data externally, we expose it using gauges
|
||||
* that follow Prometheus histogram naming conventions.
|
||||
*
|
||||
* @param string $name Metric name.
|
||||
* @param string $help Metric description.
|
||||
* @param array $histogram_data Stored histogram data.
|
||||
* @param array $label_names Label names.
|
||||
* @return void
|
||||
*/
|
||||
private function expose_histogram_as_gauges( string $name, string $help, array $histogram_data, array $label_names ): void {
|
||||
$label_values = array();
|
||||
foreach ( $label_names as $label_name ) {
|
||||
$label_values[] = $histogram_data['labels'][ $label_name ] ?? 'unknown';
|
||||
}
|
||||
|
||||
// Expose bucket counts.
|
||||
$bucket_gauge = $this->registry->getOrRegisterGauge(
|
||||
$this->namespace,
|
||||
$name . '_bucket',
|
||||
$help . ' (bucket)',
|
||||
array_merge( $label_names, array( 'le' ) )
|
||||
);
|
||||
|
||||
$cumulative_count = 0;
|
||||
foreach ( $histogram_data['buckets'] as $le => $count ) {
|
||||
$cumulative_count += $count;
|
||||
$bucket_gauge->set(
|
||||
$cumulative_count,
|
||||
array_merge( $label_values, array( $le ) )
|
||||
);
|
||||
}
|
||||
|
||||
// Expose sum.
|
||||
$sum_gauge = $this->registry->getOrRegisterGauge(
|
||||
$this->namespace,
|
||||
$name . '_sum',
|
||||
$help . ' (sum)',
|
||||
$label_names
|
||||
);
|
||||
$sum_gauge->set( $histogram_data['sum'], $label_values );
|
||||
|
||||
// Expose count.
|
||||
$count_gauge = $this->registry->getOrRegisterGauge(
|
||||
$this->namespace,
|
||||
$name . '_count',
|
||||
$help . ' (count)',
|
||||
$label_names
|
||||
);
|
||||
$count_gauge->set( $histogram_data['count'], $label_values );
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a custom gauge metric.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user