+ `;
+ this.showResult('success', html);
+ }
+ else if (answer === 'paid') {
+ // High confidence it's InfluxDB 3 Enterprise
+ const html = `
+ Based on your localhost:8181 server and paid license:
+ `;
+ this.showResult('success', html);
+ }
+ analyzePingHeaders() {
+ const headersText = this.container.querySelector('#ping-headers')?.value.trim();
+ if (!headersText) {
+ this.showResult('error', 'Please paste the ping response headers');
+ return;
+ }
+ // Check if user is trying to analyze the example content
+ if (headersText.includes('# Replace this with your actual response headers') ||
+ headersText.includes('# Example formats:')) {
+ this.showResult('error', 'Please replace the example content with your actual ping response headers');
+ return;
+ }
+ // Check for 401/403 unauthorized responses
+ if (headersText.includes('401') || headersText.includes('403')) {
+ this.showResult('info', `
+ Authentication Required Detected
+ The ping endpoint requires authentication, which indicates you're likely using one of:
+# Get version info:
+docker exec <container> influxd version
+
+# Get ping headers:
+docker exec <container> curl -I localhost:8086/ping
+
+# Or check startup logs:
+docker logs <container> 2>&1 | head -20
+
+
+ Replace <container> with your actual container name or ID.
+
+
+
+
+ Can't run these commands?
+
+
+ `;
+ this.showResult('success', html);
+ }
+ showMultipleCandidatesSuggestion(url, port) {
+ let candidates = [];
+ let portDescription = '';
+ if (port === '8086') {
+ candidates = [
+ 'InfluxDB OSS 1.x',
+ 'InfluxDB OSS 2.x',
+ 'InfluxDB Enterprise',
+ ];
+ portDescription =
+ 'Port 8086 is used by InfluxDB OSS v1.x, OSS v2.x, and Enterprise v1.x';
+ }
+ else if (port === '8181') {
+ candidates = ['InfluxDB 3 Core', 'InfluxDB 3 Enterprise'];
+ portDescription = 'Port 8181 is used by InfluxDB 3 Core and Enterprise';
+ }
+ const candidatesList = candidates
+ .map((product) => this.generateProductResult(product, false, 'Medium', false))
+ .join('');
+ const html = `
+ Based on the port pattern in your URL, here are the possible products:
+
+
${portDescription}. Without additional information, we cannot determine which specific version you're using.
+
+
+ Possible products:
+ ${candidatesList}
+
+
+
+ To narrow this down:
+
+
+ `;
+ this.showResult('info', html);
+ }
+ showDetectedVersion(productName) {
+ // Track successful detection
+ this.trackAnalyticsEvent({
+ interaction_type: 'product_detected',
+ detected_product: productName.toLowerCase().replace(/\s+/g, '_'),
+ completion_status: 'success',
+ section: this.getCurrentPageSection(),
+ });
+ const html = `
+ Based on your input, we believe the InfluxDB product you are using is most likely:
+ ${this.generateProductResult(productName, true, 'High', false)}
+ `;
+ this.showResult('success', html);
+ }
+ restart() {
+ this.answers = {};
+ this.questionFlow = [];
+ this.currentQuestionIndex = 0;
+ this.questionHistory = [];
+ // Clear inputs
+ const urlInput = this.container.querySelector('#url-input');
+ const pingHeaders = this.container.querySelector('#ping-headers');
+ const dockerOutput = this.container.querySelector('#docker-output');
+ if (urlInput)
+ urlInput.value = '';
+ if (pingHeaders)
+ pingHeaders.value = '';
+ if (dockerOutput)
+ dockerOutput.value = '';
+ // Remove URL prefilled indicator if present
+ const indicator = this.container.querySelector('.url-prefilled-indicator');
+ if (indicator) {
+ indicator.remove();
+ }
+ // Hide result
+ if (this.resultDiv) {
+ this.resultDiv.classList.remove('show');
+ }
+ if (this.restartBtn) {
+ this.restartBtn.style.display = 'none';
+ }
+ // Show first question
+ this.showQuestion('q-url-known');
+ // Reset progress
+ if (this.progressBar) {
+ this.progressBar.style.width = '0%';
+ }
+ }
+}
+// Export as component initializer
+export default function initInfluxDBVersionDetector(options) {
+ return new InfluxDBVersionDetector(options);
+}
+//# sourceMappingURL=influxdb-version-detector.js.map
\ No newline at end of file
diff --git a/dist/influxdb-version-detector.js.map b/dist/influxdb-version-detector.js.map
new file mode 100644
index 0000000000..a6955f2826
--- /dev/null
+++ b/dist/influxdb-version-detector.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"influxdb-version-detector.js","sourceRoot":"","sources":["../assets/js/influxdb-version-detector.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/services/influxdb-urls.d.ts b/dist/services/influxdb-urls.d.ts
new file mode 100644
index 0000000000..6c1aa5b7b8
--- /dev/null
+++ b/dist/services/influxdb-urls.d.ts
@@ -0,0 +1,2 @@
+export const influxdbUrls: any;
+//# sourceMappingURL=influxdb-urls.d.ts.map
\ No newline at end of file
diff --git a/dist/services/influxdb-urls.d.ts.map b/dist/services/influxdb-urls.d.ts.map
new file mode 100644
index 0000000000..cd0f13cb47
--- /dev/null
+++ b/dist/services/influxdb-urls.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"influxdb-urls.d.ts","sourceRoot":"","sources":["../../assets/js/services/influxdb-urls.js"],"names":[],"mappings":"AAEA,+BAAoD"}
\ No newline at end of file
diff --git a/dist/services/influxdb-urls.js b/dist/services/influxdb-urls.js
new file mode 100644
index 0000000000..c3ce86b388
--- /dev/null
+++ b/dist/services/influxdb-urls.js
@@ -0,0 +1,3 @@
+import { influxdb_urls as influxdbUrlsParam } from '@params';
+export const influxdbUrls = influxdbUrlsParam || {};
+//# sourceMappingURL=influxdb-urls.js.map
\ No newline at end of file
diff --git a/dist/services/influxdb-urls.js.map b/dist/services/influxdb-urls.js.map
new file mode 100644
index 0000000000..05bb0a0e62
--- /dev/null
+++ b/dist/services/influxdb-urls.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"influxdb-urls.js","sourceRoot":"","sources":["../../assets/js/services/influxdb-urls.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE7D,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,IAAI,EAAE,CAAC"}
\ No newline at end of file
diff --git a/dist/services/local-storage.d.ts b/dist/services/local-storage.d.ts
new file mode 100644
index 0000000000..b0524ed880
--- /dev/null
+++ b/dist/services/local-storage.d.ts
@@ -0,0 +1,30 @@
+export namespace DEFAULT_STORAGE_URLS {
+ let oss: any;
+ let cloud: any;
+ let serverless: any;
+ let core: any;
+ let enterprise: any;
+ let dedicated: any;
+ let clustered: any;
+ let prev_oss: any;
+ let prev_cloud: any;
+ let prev_core: any;
+ let prev_enterprise: any;
+ let prev_serverless: any;
+ let prev_dedicated: any;
+ let prev_clustered: any;
+ let custom: string;
+}
+export const defaultUrls: {};
+export function initializeStorageItem(storageKey: any, defaultValue: any): void;
+export function getPreference(prefName: any): any;
+export function setPreference(prefID: any, prefValue: any): void;
+export function getPreferences(): any;
+export function getInfluxDBUrls(): any;
+export function getInfluxDBUrl(product: any): any;
+export function setInfluxDBUrls(updatedUrlsObj: any): void;
+export function removeInfluxDBUrl(product: any): void;
+export function getNotifications(): any;
+export function notificationIsRead(notificationID: any, notificationType: any): any;
+export function setNotificationAsRead(notificationID: any, notificationType: any): void;
+//# sourceMappingURL=local-storage.d.ts.map
\ No newline at end of file
diff --git a/dist/services/local-storage.d.ts.map b/dist/services/local-storage.d.ts.map
new file mode 100644
index 0000000000..3bc42d3cc1
--- /dev/null
+++ b/dist/services/local-storage.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"local-storage.d.ts","sourceRoot":"","sources":["../../assets/js/services/local-storage.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAqFA,6BAAuB;AAhEvB,gFAOC;AAwBD,kDAYC;AAGD,iEAOC;AAGD,sCAEC;AAkCD,uCAOC;AAGD,kDAYC;AAOD,2DAOC;AAGD,sDAOC;AAgBD,wCAeC;AAYD,oFAKC;AAWD,wFAWC"}
\ No newline at end of file
diff --git a/dist/services/local-storage.js b/dist/services/local-storage.js
new file mode 100644
index 0000000000..9e42ada09e
--- /dev/null
+++ b/dist/services/local-storage.js
@@ -0,0 +1,187 @@
+/*
+ This represents an API for managing user and client-side settings for the
+ InfluxData documentation. It uses the local browser storage.
+
+ These functions manage the following InfluxDB settings:
+
+ - influxdata_docs_preferences: Docs UI/UX-related preferences (obj)
+ - influxdata_docs_urls: User-defined InfluxDB URLs for each product (obj)
+ - influxdata_docs_notifications:
+ - messages: Messages (data/notifications.yaml) that have been seen (array)
+ - callouts: Feature callouts that have been seen (array)
+*/
+import { influxdbUrls } from './influxdb-urls.js';
+// Prefix for all InfluxData docs local storage
+const storagePrefix = 'influxdata_docs_';
+/*
+ Initialize data in local storage with a default value.
+*/
+function initializeStorageItem(storageKey, defaultValue) {
+ const fullStorageKey = storagePrefix + storageKey;
+ // Check if the data exists before initializing the data
+ if (localStorage.getItem(fullStorageKey) === null) {
+ localStorage.setItem(fullStorageKey, defaultValue);
+ }
+}
+/*
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////// INFLUXDATA DOCS PREFERENCES /////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+*/
+const prefStorageKey = storagePrefix + 'preferences';
+// Default preferences
+const defaultPrefObj = {
+ api_lib: null,
+ influxdb_url: 'cloud',
+ sidebar_state: 'open',
+ theme: 'light',
+ sample_get_started_date: null,
+ v3_wayfinding_show: true,
+};
+/*
+ Retrieve a preference from the preference key.
+ If the key doesn't exist, initialize it with default values.
+*/
+function getPreference(prefName) {
+ // Initialize preference data if it doesn't already exist
+ if (localStorage.getItem(prefStorageKey) === null) {
+ initializeStorageItem('preferences', JSON.stringify(defaultPrefObj));
+ }
+ // Retrieve and parse preferences as JSON
+ const prefString = localStorage.getItem(prefStorageKey);
+ const prefObj = JSON.parse(prefString);
+ // Return the value of the specified preference
+ return prefObj[prefName];
+}
+// Set a preference in the preferences key
+function setPreference(prefID, prefValue) {
+ const prefString = localStorage.getItem(prefStorageKey);
+ const prefObj = JSON.parse(prefString);
+ prefObj[prefID] = prefValue;
+ localStorage.setItem(prefStorageKey, JSON.stringify(prefObj));
+}
+// Return an object containing all preferences
+function getPreferences() {
+ return JSON.parse(localStorage.getItem(prefStorageKey));
+}
+////////////////////////////////////////////////////////////////////////////////
+//////////// MANAGE INFLUXDATA DOCS URLS IN LOCAL STORAGE //////////////////////
+////////////////////////////////////////////////////////////////////////////////
+const defaultUrls = {};
+Object.entries(influxdbUrls).forEach(([product, { providers }]) => {
+ defaultUrls[product] =
+ providers.filter((provider) => provider.name === 'Default')[0]?.regions[0]
+ ?.url || 'https://cloud2.influxdata.com';
+});
+export const DEFAULT_STORAGE_URLS = {
+ oss: defaultUrls.oss,
+ cloud: defaultUrls.cloud,
+ serverless: defaultUrls.serverless,
+ core: defaultUrls.core,
+ enterprise: defaultUrls.enterprise,
+ dedicated: defaultUrls.cloud_dedicated,
+ clustered: defaultUrls.clustered,
+ prev_oss: defaultUrls.oss,
+ prev_cloud: defaultUrls.cloud,
+ prev_core: defaultUrls.core,
+ prev_enterprise: defaultUrls.enterprise,
+ prev_serverless: defaultUrls.serverless,
+ prev_dedicated: defaultUrls.cloud_dedicated,
+ prev_clustered: defaultUrls.clustered,
+ custom: '',
+};
+const urlStorageKey = storagePrefix + 'urls';
+// Return an object that contains all InfluxDB urls stored in the urls key
+function getInfluxDBUrls() {
+ // Initialize urls data if it doesn't already exist
+ if (localStorage.getItem(urlStorageKey) === null) {
+ initializeStorageItem('urls', JSON.stringify(DEFAULT_STORAGE_URLS));
+ }
+ return JSON.parse(localStorage.getItem(urlStorageKey));
+}
+// Get the current or previous URL for a specific product or a custom url
+function getInfluxDBUrl(product) {
+ // Initialize urls data if it doesn't already exist
+ if (localStorage.getItem(urlStorageKey) === null) {
+ initializeStorageItem('urls', JSON.stringify(DEFAULT_STORAGE_URLS));
+ }
+ // Retrieve and parse the URLs as JSON
+ const urlsString = localStorage.getItem(urlStorageKey);
+ const urlsObj = JSON.parse(urlsString);
+ // Return the URL of the specified product
+ return urlsObj[product];
+}
+/*
+ Set multiple product URLs in the urls key.
+ Input should be an object where the key is the product and the value is the
+ URL to set for that product.
+*/
+function setInfluxDBUrls(updatedUrlsObj) {
+ const urlsString = localStorage.getItem(urlStorageKey);
+ const urlsObj = JSON.parse(urlsString);
+ const newUrlsObj = { ...urlsObj, ...updatedUrlsObj };
+ localStorage.setItem(urlStorageKey, JSON.stringify(newUrlsObj));
+}
+// Set an InfluxDB URL to an empty string in the urls key
+function removeInfluxDBUrl(product) {
+ const urlsString = localStorage.getItem(urlStorageKey);
+ const urlsObj = JSON.parse(urlsString);
+ urlsObj[product] = '';
+ localStorage.setItem(urlStorageKey, JSON.stringify(urlsObj));
+}
+/*
+////////////////////////////////////////////////////////////////////////////////
+///////////////////////// INFLUXDATA DOCS NOTIFICATIONS ////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+*/
+const notificationStorageKey = storagePrefix + 'notifications';
+// Default notifications
+const defaultNotificationsObj = {
+ messages: [],
+ callouts: [],
+};
+function getNotifications() {
+ // Initialize notifications data if it doesn't already exist
+ if (localStorage.getItem(notificationStorageKey) === null) {
+ initializeStorageItem('notifications', JSON.stringify(defaultNotificationsObj));
+ }
+ // Retrieve and parse the notifications data as JSON
+ const notificationString = localStorage.getItem(notificationStorageKey);
+ const notificationObj = JSON.parse(notificationString);
+ // Return the notifications object
+ return notificationObj;
+}
+/*
+ Checks if a notification is read. Provide the notification ID and one of the
+ following notification types:
+
+ - message
+ - callout
+
+ If the notification ID exists in the array assigned to the specified type, the
+ notification has been read.
+*/
+function notificationIsRead(notificationID, notificationType) {
+ const notificationsObj = getNotifications();
+ const readNotifications = notificationsObj[`${notificationType}s`];
+ return readNotifications.includes(notificationID);
+}
+/*
+ Sets a notification as read. Provide the notification ID and one of the
+ following notification types:
+
+ - message
+ - callout
+
+ The notification ID is added to the array assigned to the specified type.
+*/
+function setNotificationAsRead(notificationID, notificationType) {
+ const notificationsObj = getNotifications();
+ const readNotifications = notificationsObj[`${notificationType}s`];
+ readNotifications.push(notificationID);
+ notificationsObj[notificationType + 's'] = readNotifications;
+ localStorage.setItem(notificationStorageKey, JSON.stringify(notificationsObj));
+}
+// Export functions as a module and make the file backwards compatible for non-module environments until all remaining dependent scripts are ported to modules
+export { defaultUrls, initializeStorageItem, getPreference, setPreference, getPreferences, getInfluxDBUrls, getInfluxDBUrl, setInfluxDBUrls, removeInfluxDBUrl, getNotifications, notificationIsRead, setNotificationAsRead, };
+//# sourceMappingURL=local-storage.js.map
\ No newline at end of file
diff --git a/dist/services/local-storage.js.map b/dist/services/local-storage.js.map
new file mode 100644
index 0000000000..54c11dc98f
--- /dev/null
+++ b/dist/services/local-storage.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"local-storage.js","sourceRoot":"","sources":["../../assets/js/services/local-storage.js"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/test/influxdb3/debug_metrics_test.py b/test/influxdb3/debug_metrics_test.py
new file mode 100644
index 0000000000..f5781e6aa5
--- /dev/null
+++ b/test/influxdb3/debug_metrics_test.py
@@ -0,0 +1,71 @@
+"""Debug test to show actual metrics output."""
+
+import os
+import requests
+
+
+def test_show_actual_metrics():
+ """Display actual metrics from Core instance."""
+
+ # Get token
+ token = os.environ.get("INFLUXDB3_CORE_TOKEN")
+ headers = {"Authorization": f"Token {token}"} if token else {}
+
+ # Fetch metrics
+ url = "http://influxdb3-core:8181"
+ response = requests.get(f"{url}/metrics", headers=headers, timeout=5)
+
+ print(f"\n{'='*80}")
+ print(f"ACTUAL METRICS FROM {url}")
+ print(f"Status Code: {response.status_code}")
+ print(f"Using Auth: {'Yes' if token else 'No'}")
+ print(f"{'='*80}\n")
+
+ if response.status_code == 200:
+ lines = response.text.split('\n')
+ print(f"Total lines: {len(lines)}\n")
+
+ # Show first 100 lines
+ print("First 100 lines of actual output:\n")
+ for i, line in enumerate(lines[:100], 1):
+ print(f"{i:4d} | {line}")
+
+ # Show examples of documented metrics
+ print(f"\n{'='*80}")
+ print("SEARCHING FOR DOCUMENTED METRICS:")
+ print(f"{'='*80}\n")
+
+ documented_metrics = [
+ "http_requests_total",
+ "grpc_requests_total",
+ "influxdb3_catalog_operations_total",
+ "influxdb_iox_query_log_compute_duration_seconds",
+ "datafusion_mem_pool_bytes",
+ "object_store_op_duration_seconds",
+ "jemalloc_memstats_bytes",
+ ]
+
+ for metric in documented_metrics:
+ # Find TYPE and HELP lines
+ type_line = next((line for line in lines if f"# TYPE {metric}" in line), None)
+ help_line = next((line for line in lines if f"# HELP {metric}" in line), None)
+
+ # Find first few data lines
+ data_lines = [line for line in lines if line.startswith(metric) and not line.startswith("#")][:3]
+
+ if type_line or help_line or data_lines:
+ print(f"\n✓ {metric}:")
+ if help_line:
+ print(f" {help_line}")
+ if type_line:
+ print(f" {type_line}")
+ for data in data_lines:
+ print(f" {data}")
+ else:
+ print(f"\n✗ {metric}: NOT FOUND")
+ else:
+ print(f"ERROR: Status {response.status_code}")
+ print(response.text[:500])
+
+ # Always pass so we can see the output
+ assert True
diff --git a/test/influxdb3/metrics_endpoint_test.py b/test/influxdb3/metrics_endpoint_test.py
new file mode 100644
index 0000000000..40aabad5f1
--- /dev/null
+++ b/test/influxdb3/metrics_endpoint_test.py
@@ -0,0 +1,320 @@
+"""Test InfluxDB 3 metrics endpoint for PR #6422.
+
+This test suite validates that the metrics documentation in PR #6422 is accurate
+by checking that all documented metrics are actually exposed by the
+InfluxDB 3 Core and Enterprise instances.
+
+Usage:
+ # Basic test execution
+ docker compose run --rm influxdb3-core-pytest test/metrics_endpoint_test.py
+
+ # With verbose output (shows actual metrics and matches)
+ VERBOSE_METRICS_TEST=true docker compose run --rm influxdb3-core-pytest test/metrics_endpoint_test.py
+
+ # Using the wrapper script (recommended)
+ ./test/run-metrics-tests.sh
+
+ # With verbose output using wrapper script
+ VERBOSE_METRICS_TEST=true ./test/run-metrics-tests.sh
+
+Verbose Output:
+ Set VERBOSE_METRICS_TEST=true to see detailed output showing:
+ - Which metrics are being searched for
+ - Actual matching lines from the Prometheus metrics endpoint
+ - Total occurrence counts (for tests that include comments)
+ - Clear indication when metrics are not found
+
+ Example verbose output:
+ TEST: HTTP/gRPC Metrics
+ ================================================================================
+
+ ✓ Searching for: http_requests_total
+ Found 12 total occurrences
+ Matches:
+ # HELP http_requests_total accumulated total requests
+ # TYPE http_requests_total counter
+ http_requests_total{method="GET",path="/metrics",status="aborted"} 0
+
+Authentication:
+ These tests require authentication tokens for InfluxDB 3 Core and Enterprise.
+ If you get 401 errors, set the following environment variables:
+ - INFLUXDB3_CORE_TOKEN: Admin token for InfluxDB 3 Core instance
+ - INFLUXDB3_ENTERPRISE_TOKEN: Admin token for InfluxDB 3 Enterprise instance
+
+Prerequisites:
+ - Docker and Docker Compose installed
+ - Running InfluxDB 3 Core and Enterprise containers
+ - Valid authentication tokens stored in ~/.env.influxdb3-core-admin-token
+ and ~/.env.influxdb3-enterprise-admin-token (for wrapper script)
+"""
+
+import os
+import re
+
+import pytest
+import requests
+
+# Set to True to see detailed output of what's being checked
+VERBOSE_OUTPUT = os.environ.get("VERBOSE_METRICS_TEST", "false").lower() == "true"
+
+
+class MetricsHelper:
+ """Helper class for metrics endpoint testing."""
+
+ @staticmethod
+ def get_auth_headers(token_env_var):
+ """Get authorization headers if token is set."""
+ token = os.environ.get(token_env_var)
+ if token:
+ return {"Authorization": f"Token {token}"}
+ return {}
+
+ @staticmethod
+ def get_metrics(url, token_env_var):
+ """Get metrics from endpoint with optional authentication."""
+ headers = MetricsHelper.get_auth_headers(token_env_var)
+ response = requests.get(f"{url}/metrics", headers=headers, timeout=5)
+
+ if response.status_code == 401:
+ pytest.skip(f"Authentication required. Set {token_env_var} environment variable.")
+
+ assert response.status_code == 200, f"Metrics returned {response.status_code}"
+ return response.text
+
+ @staticmethod
+ def print_metric_search(test_name, metrics, text, include_comments=False):
+ """Print verbose output showing searched metrics and matches."""
+ if not VERBOSE_OUTPUT:
+ return
+
+ print("\n" + "="*80)
+ print(f"TEST: {test_name}")
+ print("="*80)
+
+ for metric in metrics:
+ lines = text.split('\n')
+ if include_comments:
+ matches = [line for line in lines if metric in line][:3]
+ else:
+ matches = [line for line in lines if metric in line and not line.startswith("#")][:3]
+
+ print(f"\n✓ Searching for: {metric}")
+ if matches:
+ if include_comments:
+ print(f" Found {len([l for l in lines if metric in l])} total occurrences")
+ print(" Matches:")
+ for match in matches:
+ print(f" {match}")
+ else:
+ print(f" ✗ NOT FOUND")
+
+
+def test_core_metrics_endpoint_accessible():
+ """Test that Core metrics endpoint is accessible."""
+ text = MetricsHelper.get_metrics("http://influxdb3-core:8181", "INFLUXDB3_CORE_TOKEN")
+ assert len(text) > 0, "Core metrics response is empty"
+
+
+def test_enterprise_metrics_endpoint_accessible():
+ """Test that Enterprise metrics endpoint is accessible."""
+ text = MetricsHelper.get_metrics("http://influxdb3-enterprise:8181", "INFLUXDB3_ENTERPRISE_TOKEN")
+ assert len(text) > 0, "Enterprise metrics response is empty"
+
+
+def test_prometheus_format():
+ """Test that metrics follow Prometheus exposition format."""
+ text = MetricsHelper.get_metrics("http://influxdb3-core:8181", "INFLUXDB3_CORE_TOKEN")
+
+ # Check for HELP comments
+ assert "# HELP" in text, "Missing HELP comments"
+
+ # Check for TYPE comments
+ assert "# TYPE" in text, "Missing TYPE comments"
+
+ # Check for valid metric lines (name{labels} value or name value)
+ metric_pattern = r"^[a-zA-Z_][a-zA-Z0-9_]*(\{[^}]*\})?\s+[\d\.\+\-eE]+(\s+\d+)?$"
+ lines = [line for line in text.split("\n") if line and not line.startswith("#")]
+ assert any(
+ re.match(metric_pattern, line) for line in lines
+ ), "No valid metric lines found"
+
+
+def test_http_grpc_metrics():
+ """Test HTTP and gRPC metrics exist."""
+ text = MetricsHelper.get_metrics("http://influxdb3-core:8181", "INFLUXDB3_CORE_TOKEN")
+
+ metrics = [
+ "http_requests_total",
+ "http_request_duration_seconds",
+ "http_response_body_size_bytes",
+ "grpc_requests_total",
+ "grpc_request_duration_seconds",
+ ]
+
+ MetricsHelper.print_metric_search("HTTP/gRPC Metrics", metrics, text, include_comments=True)
+
+ missing = [m for m in metrics if m not in text]
+ assert not missing, f"Missing HTTP/gRPC metrics: {missing}"
+
+
+def test_database_operation_metrics():
+ """Test database operation metrics exist."""
+ text = MetricsHelper.get_metrics("http://influxdb3-core:8181", "INFLUXDB3_CORE_TOKEN")
+
+ metrics = [
+ "influxdb3_catalog_operations_total",
+ "influxdb3_catalog_operation_retries_total",
+ ]
+
+ MetricsHelper.print_metric_search("Database Operation Metrics", metrics, text)
+
+ missing = [m for m in metrics if m not in text]
+ assert not missing, f"Missing database operation metrics: {missing}"
+
+
+def test_query_performance_metrics():
+ """Test query performance metrics exist."""
+ text = MetricsHelper.get_metrics("http://influxdb3-core:8181", "INFLUXDB3_CORE_TOKEN")
+
+ metrics = [
+ "influxdb_iox_query_log_compute_duration_seconds",
+ "influxdb_iox_query_log_execute_duration_seconds",
+ "influxdb_iox_query_log_plan_duration_seconds",
+ "influxdb_iox_query_log_end2end_duration_seconds",
+ "influxdb_iox_query_log_max_memory",
+ "influxdb_iox_query_log_parquet_files",
+ ]
+
+ MetricsHelper.print_metric_search("Query Performance Metrics", metrics, text)
+
+ missing = [m for m in metrics if m not in text]
+ assert not missing, f"Missing query performance metrics: {missing}"
+
+
+def test_memory_caching_metrics():
+ """Test memory and caching metrics exist."""
+ text = MetricsHelper.get_metrics("http://influxdb3-core:8181", "INFLUXDB3_CORE_TOKEN")
+
+ metrics = [
+ "datafusion_mem_pool_bytes",
+ "influxdb3_parquet_cache_access_total",
+ "influxdb3_parquet_cache_size_bytes",
+ "influxdb3_parquet_cache_size_number_of_files",
+ "jemalloc_memstats_bytes",
+ ]
+
+ MetricsHelper.print_metric_search("Memory & Caching Metrics", metrics, text)
+
+ missing = [m for m in metrics if m not in text]
+ assert not missing, f"Missing memory/caching metrics: {missing}"
+
+
+def test_object_storage_metrics():
+ """Test object storage metrics exist."""
+ text = MetricsHelper.get_metrics("http://influxdb3-core:8181", "INFLUXDB3_CORE_TOKEN")
+
+ metrics = [
+ "object_store_op_duration_seconds",
+ "object_store_transfer_bytes_total",
+ "object_store_transfer_objects_total",
+ ]
+
+ MetricsHelper.print_metric_search("Object Storage Metrics", metrics, text)
+
+ missing = [m for m in metrics if m not in text]
+ assert not missing, f"Missing object storage metrics: {missing}"
+
+
+def test_runtime_system_metrics():
+ """Test runtime and system metrics exist."""
+ text = MetricsHelper.get_metrics("http://influxdb3-core:8181", "INFLUXDB3_CORE_TOKEN")
+
+ metrics = [
+ "process_start_time_seconds",
+ "thread_panic_count_total",
+ "tokio_runtime_num_alive_tasks",
+ ]
+
+ MetricsHelper.print_metric_search("Runtime & System Metrics", metrics, text)
+
+ missing = [m for m in metrics if m not in text]
+ assert not missing, f"Missing runtime/system metrics: {missing}"
+
+
+def test_metric_types():
+ """Test that key metrics have correct types."""
+ text = MetricsHelper.get_metrics("http://influxdb3-core:8181", "INFLUXDB3_CORE_TOKEN")
+
+ # Check for expected types (case-insensitive partial match)
+ type_checks = [
+ ("http_requests_total", "counter"),
+ ("http_request_duration_seconds", "histogram"),
+ ("datafusion_mem_pool_bytes", "gauge"),
+ ]
+
+ if VERBOSE_OUTPUT:
+ print("\n" + "="*80)
+ print("TEST: Metric Type Validation")
+ print("="*80)
+ for metric_name, expected_type in type_checks:
+ type_pattern = rf"# TYPE {metric_name}\s+{expected_type}"
+ match = re.search(type_pattern, text, re.IGNORECASE)
+ print(f"\n✓ Checking: {metric_name} should be {expected_type}")
+ if match:
+ print(f" Match: {match.group()}")
+ else:
+ print(f" ✗ NOT FOUND or WRONG TYPE")
+
+ for metric_name, expected_type in type_checks:
+ # Look for TYPE line for this metric
+ type_pattern = rf"# TYPE {metric_name}\s+{expected_type}"
+ assert re.search(
+ type_pattern, text, re.IGNORECASE
+ ), f"Metric {metric_name} should be type {expected_type}"
+
+
+def test_enterprise_cluster_metrics():
+ """Test Enterprise-specific cluster metrics exist."""
+ text = MetricsHelper.get_metrics("http://influxdb3-enterprise:8181", "INFLUXDB3_ENTERPRISE_TOKEN")
+
+ # These metrics are mentioned in Enterprise documentation
+ metrics = [
+ "influxdb3_catalog_operation_retries_total",
+ "influxdb_iox_query_log_ingester_latency",
+ ]
+
+ MetricsHelper.print_metric_search("Enterprise Cluster Metrics", metrics, text)
+
+ missing = [m for m in metrics if m not in text]
+ assert not missing, f"Missing Enterprise cluster metrics: {missing}"
+
+
+@pytest.mark.parametrize("url,token_env,instance", [
+ ("http://influxdb3-core:8181", "INFLUXDB3_CORE_TOKEN", "Core"),
+ ("http://influxdb3-enterprise:8181", "INFLUXDB3_ENTERPRISE_TOKEN", "Enterprise")
+])
+def test_metrics_have_labels(url, token_env, instance):
+ """Test that metrics have proper labels."""
+ text = MetricsHelper.get_metrics(url, token_env)
+
+ # Find a metric with labels (look for http_requests_total)
+ label_pattern = r'http_requests_total\{[^}]+\}'
+ matches = re.findall(label_pattern, text)
+
+ if VERBOSE_OUTPUT:
+ print("\n" + "="*80)
+ print(f"TEST: Metric Label Validation ({instance})")
+ print("="*80)
+ print(f"\n✓ Searching for labeled metrics using pattern: {label_pattern}")
+ print(f" Found {len(matches)} labeled metrics")
+ if matches:
+ print(" Sample matches:")
+ for match in matches[:3]:
+ print(f" {match}")
+
+ assert len(matches) > 0, f"{instance}: No metrics with labels found"
+
+ # Check that labels are properly formatted
+ for match in matches:
+ assert '="' in match, f"{instance}: Labels should use = and quotes"
+ assert match.endswith("}"), f"{instance}: Labels should end with }}"
diff --git a/test/influxdb3/prometheus.yml b/test/influxdb3/prometheus.yml
new file mode 100644
index 0000000000..38056c6630
--- /dev/null
+++ b/test/influxdb3/prometheus.yml
@@ -0,0 +1,87 @@
+# Prometheus configuration for testing InfluxDB 3 metrics
+# Based on documentation in content/shared/influxdb3-admin/monitor-metrics.md
+# This configuration matches the examples provided in PR #6422
+
+# NOTE: If your InfluxDB instance requires authentication for the /metrics endpoint,
+# you'll need to configure bearer_token or bearer_token_file in the scrape configs below.
+# See: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config
+
+global:
+ scrape_interval: 30s
+ evaluation_interval: 30s
+ external_labels:
+ monitor: 'influxdb3-test'
+
+# Scrape configurations
+scrape_configs:
+ # InfluxDB 3 Core
+ # Documentation reference: lines 563-571 in monitor-metrics.md
+ - job_name: 'influxdb3-core'
+ static_configs:
+ - targets: ['influxdb3-core:8181']
+ labels:
+ environment: 'test'
+ product: 'core'
+ metrics_path: '/metrics'
+ scrape_interval: 30s
+ scrape_timeout: 10s
+ # Authentication - uses credential file
+ # Token is written to /tmp/core-token by docker-compose entrypoint
+ authorization:
+ credentials_file: /tmp/core-token
+ # Fallback protocol for targets that don't send Content-Type
+ fallback_scrape_protocol: 'PrometheusText0.0.4'
+
+ # Relabeling to add node identification (same as Enterprise)
+ relabel_configs:
+ # Extract node name from address
+ - source_labels: [__address__]
+ target_label: node_name
+ regex: '([^:]+):.*'
+ replacement: '${1}'
+ # Add node role based on name pattern
+ - source_labels: [node_name]
+ target_label: node_role
+ regex: '.*core.*'
+ replacement: 'all-in-one-core'
+ - source_labels: [node_name]
+ target_label: node_role
+ regex: '.*enterprise.*'
+ replacement: 'all-in-one-enterprise'
+
+ # InfluxDB 3 Enterprise
+ # Documentation reference: lines 399-418 in monitor-metrics.md
+ # Includes relabeling from lines 536-553
+ - job_name: 'influxdb3-enterprise'
+ static_configs:
+ - targets: ['influxdb3-enterprise:8181']
+ labels:
+ environment: 'test'
+ product: 'enterprise'
+ metrics_path: '/metrics'
+ scrape_interval: 30s
+ scrape_timeout: 10s
+ # Authentication - uses credential file
+ # Token is written to /tmp/enterprise-token by docker-compose entrypoint
+ authorization:
+ credentials_file: /tmp/enterprise-token
+ # Fallback protocol for targets that don't send Content-Type
+ fallback_scrape_protocol: 'PrometheusText0.0.4'
+
+ # Relabeling to add node identification
+ # Documentation reference: lines 536-553
+ relabel_configs:
+ # Extract node name from address
+ - source_labels: [__address__]
+ target_label: node_name
+ regex: '([^:]+):.*'
+ replacement: '${1}'
+ # Add node role based on name pattern
+ - source_labels: [node_name]
+ target_label: node_role
+ regex: '.*core.*'
+ replacement: 'all-in-one-core'
+ - source_labels: [node_name]
+ target_label: node_role
+ regex: '.*enterprise.*'
+ replacement: 'all-in-one-enterprise'
diff --git a/test/influxdb3/prometheus_integration_test.py b/test/influxdb3/prometheus_integration_test.py
new file mode 100644
index 0000000000..6057995f86
--- /dev/null
+++ b/test/influxdb3/prometheus_integration_test.py
@@ -0,0 +1,391 @@
+"""Test Prometheus integration and relabeling for PR #6422.
+
+This test suite validates that the Prometheus configuration and relabeling
+examples documented in PR #6422 actually work correctly.
+
+Unlike metrics_endpoint_test.py which directly queries InfluxDB endpoints,
+this test:
+1. Starts Prometheus with the documented configuration
+2. Validates Prometheus can scrape InfluxDB endpoints
+3. Verifies relabeling rules add node_name and node_role labels
+4. Tests PromQL queries with the relabeled metrics
+
+Usage:
+ # Start Prometheus and run integration tests
+ docker compose --profile monitoring up -d
+ docker compose run --rm influxdb3-core-pytest test/prometheus_integration_test.py
+
+ # Or use the wrapper script
+ ./test/run-prometheus-tests.sh
+
+Prerequisites:
+ - Docker and Docker Compose installed
+ - Running InfluxDB 3 Core and Enterprise containers
+ - Prometheus service started with --profile monitoring
+ - Valid authentication tokens (if required)
+"""
+
+import os
+import time
+
+import pytest
+import requests
+
+# Prometheus API endpoint
+PROMETHEUS_URL = os.environ.get("PROMETHEUS_URL", "http://prometheus:9090")
+
+# Set to True to see detailed output
+VERBOSE_OUTPUT = os.environ.get("VERBOSE_PROMETHEUS_TEST", "false").lower() == "true"
+
+
+class PrometheusHelper:
+ """Helper class for Prometheus integration testing."""
+
+ @staticmethod
+ def wait_for_prometheus(timeout=30):
+ """Wait for Prometheus to be ready."""
+ start_time = time.time()
+ while time.time() - start_time < timeout:
+ try:
+ response = requests.get(f"{PROMETHEUS_URL}/-/ready", timeout=5)
+ if response.status_code == 200:
+ return True
+ except requests.exceptions.RequestException:
+ pass
+ time.sleep(1)
+ return False
+
+ @staticmethod
+ def wait_for_targets(timeout=60):
+ """Wait for Prometheus to discover and scrape targets."""
+ start_time = time.time()
+ while time.time() - start_time < timeout:
+ try:
+ response = requests.get(
+ f"{PROMETHEUS_URL}/api/v1/targets",
+ timeout=5
+ )
+ if response.status_code == 200:
+ data = response.json()
+ active_targets = data.get("data", {}).get("activeTargets", [])
+
+ # Check if all targets are up
+ all_up = all(
+ target.get("health") == "up"
+ for target in active_targets
+ )
+
+ if all_up and len(active_targets) >= 2:
+ if VERBOSE_OUTPUT:
+ print(f"\n✓ All {len(active_targets)} targets are up")
+ return True
+
+ if VERBOSE_OUTPUT:
+ up_count = sum(
+ 1 for t in active_targets
+ if t.get("health") == "up"
+ )
+ print(f" Waiting for targets: {up_count}/{len(active_targets)} up")
+ except requests.exceptions.RequestException as e:
+ if VERBOSE_OUTPUT:
+ print(f" Error checking targets: {e}")
+ time.sleep(2)
+ return False
+
+ @staticmethod
+ def query_prometheus(query):
+ """Execute a PromQL query."""
+ response = requests.get(
+ f"{PROMETHEUS_URL}/api/v1/query",
+ params={"query": query},
+ timeout=10
+ )
+ assert response.status_code == 200, f"Query failed: {response.text}"
+ return response.json()
+
+ @staticmethod
+ def print_query_result(query, result):
+ """Print verbose query result."""
+ if not VERBOSE_OUTPUT:
+ return
+
+ print(f"\n✓ Query: {query}")
+ data = result.get("data", {})
+ result_type = data.get("resultType")
+ results = data.get("result", [])
+
+ print(f" Result type: {result_type}")
+ print(f" Number of results: {len(results)}")
+
+ if results:
+ print(" Sample results:")
+ for result in results[:3]:
+ metric = result.get("metric", {})
+ value = result.get("value", [None, None])
+ print(f" {metric} => {value[1]}")
+
+
+def test_prometheus_is_ready():
+ """Test that Prometheus service is ready."""
+ assert PrometheusHelper.wait_for_prometheus(), (
+ "Prometheus not ready after 30 seconds. "
+ "Ensure Prometheus is running: docker compose --profile monitoring up -d"
+ )
+
+
+def test_prometheus_targets_discovered():
+ """Test that Prometheus has discovered InfluxDB targets."""
+ response = requests.get(f"{PROMETHEUS_URL}/api/v1/targets", timeout=10)
+ assert response.status_code == 200, "Failed to get targets"
+
+ data = response.json()
+ targets = data.get("data", {}).get("activeTargets", [])
+
+ if VERBOSE_OUTPUT:
+ print("\n" + "="*80)
+ print("TEST: Prometheus Target Discovery")
+ print("="*80)
+ for target in targets:
+ health = target.get("health")
+ job = target.get("labels", {}).get("job")
+ address = target.get("scrapeUrl")
+ print(f"\n✓ Target: {job}")
+ print(f" Health: {health}")
+ print(f" Address: {address}")
+
+ # Should have at least 2 targets (core and enterprise)
+ assert len(targets) >= 2, f"Expected at least 2 targets, found {len(targets)}"
+
+ # Check for expected job names
+ job_names = {target.get("labels", {}).get("job") for target in targets}
+ assert "influxdb3-core" in job_names, "Missing influxdb3-core target"
+ assert "influxdb3-enterprise" in job_names, "Missing influxdb3-enterprise target"
+
+
+def test_prometheus_targets_up():
+ """Test that all Prometheus targets are healthy."""
+ assert PrometheusHelper.wait_for_targets(), (
+ "Targets not healthy after 60 seconds. "
+ "Check that InfluxDB instances are running and accessible."
+ )
+
+ response = requests.get(f"{PROMETHEUS_URL}/api/v1/targets", timeout=10)
+ data = response.json()
+ targets = data.get("data", {}).get("activeTargets", [])
+
+ unhealthy = [
+ target for target in targets
+ if target.get("health") != "up"
+ ]
+
+ assert not unhealthy, (
+ f"Found {len(unhealthy)} unhealthy targets: "
+ f"{[t.get('labels', {}).get('job') for t in unhealthy]}"
+ )
+
+
+def test_relabeling_adds_node_name():
+ """Test that relabeling adds node_name label.
+
+ Documentation reference: monitor-metrics.md lines 536-540
+ Relabeling extracts hostname from __address__ and adds as node_name.
+ """
+ # Wait for metrics to be scraped
+ time.sleep(5)
+
+ # Query for any metric with node_name label
+ query = 'http_requests_total{node_name!=""}'
+ result = PrometheusHelper.query_prometheus(query)
+
+ PrometheusHelper.print_query_result(query, result)
+
+ data = result.get("data", {})
+ results = data.get("result", [])
+
+ assert len(results) > 0, (
+ "No metrics found with node_name label. "
+ "Relabeling may not be working correctly."
+ )
+
+ # Verify node_name values match expected patterns
+ node_names = {
+ result.get("metric", {}).get("node_name")
+ for result in results
+ }
+
+ if VERBOSE_OUTPUT:
+ print(f"\n✓ Found node_name labels: {node_names}")
+
+ # Should have node names for both core and enterprise
+ assert any("core" in name for name in node_names), (
+ "No node_name containing 'core' found"
+ )
+ assert any("enterprise" in name for name in node_names), (
+ "No node_name containing 'enterprise' found"
+ )
+
+
+def test_relabeling_adds_node_role():
+ """Test that relabeling adds node_role label.
+
+ Documentation reference: monitor-metrics.md lines 541-553
+ Relabeling assigns node_role based on node_name pattern.
+ """
+ # Wait for metrics to be scraped
+ time.sleep(5)
+
+ # Query for metrics with node_role label
+ query = 'http_requests_total{node_role!=""}'
+ result = PrometheusHelper.query_prometheus(query)
+
+ PrometheusHelper.print_query_result(query, result)
+
+ data = result.get("data", {})
+ results = data.get("result", [])
+
+ assert len(results) > 0, (
+ "No metrics found with node_role label. "
+ "Relabeling may not be working correctly."
+ )
+
+ # Verify node_role values
+ node_roles = {
+ result.get("metric", {}).get("node_role")
+ for result in results
+ }
+
+ if VERBOSE_OUTPUT:
+ print(f"\n✓ Found node_role labels: {node_roles}")
+
+ # Based on test/prometheus.yml relabeling rules
+ expected_roles = {"all-in-one-core", "all-in-one-enterprise"}
+ assert node_roles & expected_roles, (
+ f"Expected roles {expected_roles}, found {node_roles}"
+ )
+
+
+def test_query_metrics_by_node():
+ """Test that metrics can be queried by node labels.
+
+ This validates that users can filter metrics by node_name and node_role
+ as documented in the monitoring guide.
+ """
+ # Wait for metrics to be scraped
+ time.sleep(5)
+
+ # Query metrics for specific node
+ queries = [
+ 'http_requests_total{node_name="influxdb3-core"}',
+ 'http_requests_total{node_name="influxdb3-enterprise"}',
+ 'http_requests_total{node_role="all-in-one-core"}',
+ 'http_requests_total{node_role="all-in-one-enterprise"}',
+ ]
+
+ if VERBOSE_OUTPUT:
+ print("\n" + "="*80)
+ print("TEST: Query Metrics by Node Labels")
+ print("="*80)
+
+ for query in queries:
+ result = PrometheusHelper.query_prometheus(query)
+ PrometheusHelper.print_query_result(query, result)
+
+ data = result.get("data", {})
+ results = data.get("result", [])
+
+ assert len(results) > 0, f"No results for query: {query}"
+
+
+def test_promql_rate_query():
+ """Test rate() query from documentation examples.
+
+ Documentation commonly shows rate queries for counters.
+ """
+ # Wait for enough data
+ time.sleep(10)
+
+ query = 'rate(http_requests_total[1m])'
+ result = PrometheusHelper.query_prometheus(query)
+
+ PrometheusHelper.print_query_result(query, result)
+
+ data = result.get("data", {})
+ results = data.get("result", [])
+
+ # Should have results (may be 0 if no recent requests)
+ assert isinstance(results, list), "Expected list of results"
+
+
+def test_promql_histogram_quantile():
+ """Test histogram_quantile() query from documentation examples.
+
+ Documentation reference: Example queries for query duration metrics.
+ """
+ # Wait for enough data
+ time.sleep(10)
+
+ query = 'histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[1m]))'
+ result = PrometheusHelper.query_prometheus(query)
+
+ PrometheusHelper.print_query_result(query, result)
+
+ # Query should execute without error
+ assert result.get("status") == "success", (
+ f"Query failed: {result.get('error')}"
+ )
+
+
+def test_enterprise_metrics_queryable():
+ """Test that Enterprise-specific metrics are queryable via Prometheus."""
+ # Wait for metrics to be scraped
+ time.sleep(5)
+
+ # Query Enterprise-specific metrics
+ queries = [
+ 'influxdb3_catalog_operation_retries_total',
+ 'influxdb_iox_query_log_ingester_latency',
+ ]
+
+ if VERBOSE_OUTPUT:
+ print("\n" + "="*80)
+ print("TEST: Enterprise-Specific Metrics")
+ print("="*80)
+
+ for query in queries:
+ result = PrometheusHelper.query_prometheus(query)
+ PrometheusHelper.print_query_result(query, result)
+
+ # Query should execute (may have no results if no activity)
+ assert result.get("status") == "success", (
+ f"Query failed: {result.get('error')}"
+ )
+
+
+def test_prometheus_config_matches_docs():
+ """Verify Prometheus configuration matches documented examples.
+
+ This test validates that test/prometheus.yml matches the configuration
+ examples in the documentation.
+ """
+ response = requests.get(f"{PROMETHEUS_URL}/api/v1/status/config", timeout=10)
+ assert response.status_code == 200, "Failed to get Prometheus config"
+
+ config = response.json()
+ config_yaml = config.get("data", {}).get("yaml", "")
+
+ if VERBOSE_OUTPUT:
+ print("\n" + "="*80)
+ print("TEST: Prometheus Configuration")
+ print("="*80)
+ print("\nConfiguration (first 500 chars):")
+ print(config_yaml[:500])
+
+ # Verify key configuration elements from documentation
+ assert "influxdb3-core" in config_yaml, "Missing influxdb3-core job"
+ assert "influxdb3-enterprise" in config_yaml, "Missing influxdb3-enterprise job"
+ assert "relabel_configs" in config_yaml, "Missing relabel_configs"
+ assert "node_name" in config_yaml, "Missing node_name in relabeling"
+ assert "node_role" in config_yaml, "Missing node_role in relabeling"
+
+ # Verify scrape settings
+ assert "/metrics" in config_yaml, "Missing /metrics path"
diff --git a/test/influxdb3/run-metrics-tests.sh b/test/influxdb3/run-metrics-tests.sh
new file mode 100755
index 0000000000..d0a4017f5b
--- /dev/null
+++ b/test/influxdb3/run-metrics-tests.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+# Run metrics endpoint tests with authentication
+#
+# Usage:
+# ./test/run-metrics-tests.sh # Run direct metrics tests
+# ./test/run-metrics-tests.sh --prometheus # Run Prometheus integration tests
+# ./test/run-metrics-tests.sh --all # Run both test suites
+
+set -e
+
+# Read tokens from secret files
+INFLUXDB3_CORE_TOKEN=$(cat ~/.env.influxdb3-core-admin-token)
+INFLUXDB3_ENTERPRISE_TOKEN=$(cat ~/.env.influxdb3-enterprise-admin-token)
+
+# Export for docker compose
+export INFLUXDB3_CORE_TOKEN
+export INFLUXDB3_ENTERPRISE_TOKEN
+export VERBOSE_METRICS_TEST
+
+# Parse arguments
+RUN_DIRECT=true
+RUN_PROMETHEUS=false
+
+if [[ "$1" == "--prometheus" ]]; then
+ RUN_DIRECT=false
+ RUN_PROMETHEUS=true
+ shift
+elif [[ "$1" == "--all" ]]; then
+ RUN_DIRECT=true
+ RUN_PROMETHEUS=true
+ shift
+fi
+
+# Run direct metrics tests
+if [[ "$RUN_DIRECT" == "true" ]]; then
+ echo "Running direct metrics endpoint tests..."
+ docker compose run --rm \
+ -e INFLUXDB3_CORE_TOKEN \
+ -e INFLUXDB3_ENTERPRISE_TOKEN \
+ -e VERBOSE_METRICS_TEST \
+ influxdb3-core-pytest \
+ "test/influxdb3/metrics_endpoint_test.py" "$@"
+ echo ""
+fi
+
+# Run Prometheus integration tests
+if [[ "$RUN_PROMETHEUS" == "true" ]]; then
+ echo "Running Prometheus integration tests..."
+ ./test/influxdb3/run-prometheus-tests.sh "$@"
+fi
diff --git a/test/influxdb3/run-prometheus-tests.sh b/test/influxdb3/run-prometheus-tests.sh
new file mode 100755
index 0000000000..f5df654e06
--- /dev/null
+++ b/test/influxdb3/run-prometheus-tests.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+# Run Prometheus integration tests with authentication
+# This script validates that Prometheus can scrape InfluxDB metrics
+# and that relabeling configuration works as documented.
+
+set -e
+
+# Read tokens from secret files
+INFLUXDB3_CORE_TOKEN=$(cat ~/.env.influxdb3-core-admin-token)
+INFLUXDB3_ENTERPRISE_TOKEN=$(cat ~/.env.influxdb3-enterprise-admin-token)
+
+# Export for docker compose
+export INFLUXDB3_CORE_TOKEN
+export INFLUXDB3_ENTERPRISE_TOKEN
+export VERBOSE_PROMETHEUS_TEST
+
+echo "Starting Prometheus integration tests..."
+echo ""
+echo "This will:"
+echo " 1. Start Prometheus with documented configuration"
+echo " 2. Wait for Prometheus to scrape InfluxDB endpoints"
+echo " 3. Validate relabeling adds node_name and node_role labels"
+echo " 4. Test PromQL queries with relabeled metrics"
+echo ""
+
+# Start Prometheus if not already running
+if ! docker ps | grep -q prometheus; then
+ echo "Starting Prometheus service..."
+ docker compose --profile monitoring up -d prometheus
+ echo "Waiting for Prometheus to start..."
+ sleep 5
+fi
+
+# Run tests
+echo "Running Prometheus integration tests..."
+docker compose run --rm \
+ -e INFLUXDB3_CORE_TOKEN \
+ -e INFLUXDB3_ENTERPRISE_TOKEN \
+ -e VERBOSE_PROMETHEUS_TEST \
+ -e PROMETHEUS_URL=http://prometheus:9090 \
+ influxdb3-core-pytest \
+ "test/influxdb3/prometheus_integration_test.py" "$@"
+
+echo ""
+echo "Tests complete!"
+echo ""
+echo "To view Prometheus UI, visit: http://localhost:9090"
+echo "To stop Prometheus: docker compose --profile monitoring down"
diff --git a/test/influxdb3/show-metrics-sample.py b/test/influxdb3/show-metrics-sample.py
new file mode 100644
index 0000000000..acd1fec158
--- /dev/null
+++ b/test/influxdb3/show-metrics-sample.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python3
+"""Display sample metrics output from InfluxDB 3 instances."""
+
+import os
+import sys
+import requests
+
+def show_metrics_sample(url, token_env_var, instance_name, num_lines=150):
+ """Fetch and display sample metrics."""
+ print(f"\n{'='*80}")
+ print(f"{instance_name} Metrics Sample (first {num_lines} lines)")
+ print(f"URL: {url}/metrics")
+ print(f"{'='*80}\n")
+
+ # Get auth headers
+ headers = {}
+ token = os.environ.get(token_env_var)
+ if token:
+ headers = {"Authorization": f"Token {token}"}
+ print(f"✓ Using authentication token from {token_env_var}\n")
+ else:
+ print(f"⚠ No token found in {token_env_var} - trying without auth\n")
+
+ try:
+ response = requests.get(f"{url}/metrics", headers=headers, timeout=5)
+
+ if response.status_code == 401:
+ print(f"✗ Authentication required but no valid token provided")
+ return
+
+ if response.status_code != 200:
+ print(f"✗ Unexpected status code: {response.status_code}")
+ return
+
+ # Display first N lines
+ lines = response.text.split('\n')
+ print(f"Total lines: {len(lines)}\n")
+
+ for i, line in enumerate(lines[:num_lines], 1):
+ print(f"{i:4d} | {line}")
+
+ if len(lines) > num_lines:
+ print(f"\n... ({len(lines) - num_lines} more lines)")
+
+ # Show some interesting metrics
+ print(f"\n{'='*80}")
+ print("Sample Metric Searches:")
+ print(f"{'='*80}\n")
+
+ metrics_to_show = [
+ "http_requests_total",
+ "grpc_requests_total",
+ "influxdb3_catalog_operations_total",
+ "influxdb_iox_query_log_compute_duration_seconds",
+ "datafusion_mem_pool_bytes",
+ "object_store_op_duration_seconds",
+ ]
+
+ for metric in metrics_to_show:
+ matching = [line for line in lines if metric in line and not line.startswith("#")]
+ if matching:
+ print(f"✓ Found '{metric}' - showing first 3 values:")
+ for match in matching[:3]:
+ print(f" {match}")
+ else:
+ print(f"✗ Metric '{metric}' not found")
+
+ except Exception as e:
+ print(f"✗ Error fetching metrics: {e}")
+
+if __name__ == "__main__":
+ # Show Core metrics
+ show_metrics_sample(
+ "http://influxdb3-core:8181",
+ "INFLUXDB3_CORE_TOKEN",
+ "InfluxDB 3 Core",
+ num_lines=100
+ )
+
+ print("\n\n")
+
+ # Show Enterprise metrics
+ show_metrics_sample(
+ "http://influxdb3-enterprise:8181",
+ "INFLUXDB3_ENTERPRISE_TOKEN",
+ "InfluxDB 3 Enterprise",
+ num_lines=100
+ )
diff --git a/test/pytest/pytest.ini b/test/pytest/pytest.ini
index 2a8564cca2..4f785bff3f 100644
--- a/test/pytest/pytest.ini
+++ b/test/pytest/pytest.ini
@@ -5,8 +5,8 @@
python_files = *_test.py *_test_sh.py
# Collect classes with names ending in Test.
python_classes = *Test
-# Collect all functions.
-python_functions = *
+# Collect test functions (exclude helpers).
+python_functions = test_*
filterwarnings = ignore::pytest.PytestReturnNotNoneWarning
# Log settings.