diff --git a/docs/prometheus.md b/docs/prometheus.md index ec7f69a..d09cbee 100644 --- a/docs/prometheus.md +++ b/docs/prometheus.md @@ -24,6 +24,9 @@ The two paths are **complementary**, not mutually exclusive. Most of the Grafana | `mssql_dba_stableinfo.collector.yml` | Instance- and host-level stable facts (SQL version, core count, RAM). | | `mssql_dba_aghealth.collector.yml` | AG primary/secondary state, redo/log-send queue. | | `mssql_dba_whoisactive.collector.yml` | Top concurrent queries — higher cardinality. | +| `mssql_sqlagent_jobs.collector.yml` | SQL Agent job status / outcome / duration / next-run / 24h-failure count from `msdb`. | +| `mssql_backup_history.collector.yml` | Per-(database, backup_type) last-time / size / duration / age from `msdb.dbo.backupset`. | +| `mssql_xevent.collector.yml` | 5-minute aggregates from `DBA.dbo.xevent_metrics` (guarded with an existence check; no-op where the XEvent collector proc isn't installed). | | `mssql_standard.collector.yml` | The upstream [sql_exporter](https://github.com/burningalchemist/sql_exporter/tree/master/examples/mssql_standard) stock collector. | | `windows_exporter_config.yml` | Matching config for [windows_exporter](https://github.com/prometheus-community/windows_exporter) — host-level CPU, disk, network. | | `tessell-metrics.collector.yml` | Managed-instance variant (no `xp_cmdshell`). | @@ -95,6 +98,50 @@ For AGs add `sqlmonitor_ag` with `scrape_interval: 30s` pointing at the same tar 2. Import `sql_exporter/SQL-Exporter-Metrics-Dashboard-External.json` — this is the Prometheus counterpart of the SQL-backed distributed dashboard. 3. Optionally import the unified-alerting YAMLs from `sql_exporter/alert-engine/` — they define the same CPU / memory / wait / blocking alerts the Python engine provides, but run inside Grafana Alerting instead. +## Prometheus-backed dashboard pack + +The repo ships a parallel set of Grafana dashboards under [`sql_exporter/Prometheus-Dashboards/`](https://github.com/imajaydwivedi/SQLMonitor/tree/dev/sql_exporter/Prometheus-Dashboards) that mirror the SQL-backed dashboards in [`Grafana-Dashboards/`](https://github.com/imajaydwivedi/SQLMonitor/tree/dev/Grafana-Dashboards) but source every panel from Prometheus metrics. + +Phase 1 ships 12 dashboards covering the fleet's core signal set: + +| UID | Title | Data panels | +|---|---|---:| +| `prom_core_metrics_trend` | Core Metrics - Trend | 9 | +| `prom_wait_stats` | Wait Stats | 4 | +| `prom_disk_space` | Disk Space | 5 | +| `prom_ag_health_state` | Ag Health State | 3 | +| `prom_sql_agent_jobs` | SQL Agent Jobs | 6 | +| `prom_backup_history` | Backup History | 6 | +| `prom_xevent_trend` | XEvent - Trend | 4 | +| `prom_database_file_io_stats` | Database File IO Stats | 12 | +| `prom_dba_inventory` | DBA Inventory | 6 (+8 deep-links) | +| `prom_monitoring_live_all_servers` | Monitoring - Live - All Servers | 15 (+6 deep-links) | +| `prom_monitoring_live_distributed` | Monitoring - Live - Distributed | 52 (+6 deep-links) | +| `prom_monitoring_perfmon_quest` | Monitoring - Perfmon Counters - Quest Softwares - Distributed | 51 (+4 deep-links) | + +Panels that depend on the SQLMonitor central inventory database (alert history, AG-vs-nonAG backup split, LAMA config-change deltas, `dm_os_memory_clerks` snapshot, tempdb/log_space cache tables, `sql_server_patching`) render as markdown **deep-link tiles** that jump back to the SQL-backed dashboard so every source section remains visible. + +### Regenerating the dashboards + +Each dashboard is built from a small Python spec: + +```bash +cd sql_exporter/Prometheus-Dashboards +python3 generate.py # rebuild every *.json +python3 generate.py backup # filter: rebuild only backup_history +python3 _tools/validate.py # structural + expr sanity check +``` + +High-fidelity PromQL patterns used across the specs: + +- `increase(metric[$__range])` — selective-duration deltas (File IO, Wait Stats). +- `@ end() offset $__range` — prior-window comparison tables (day-over-day). +- `quantile_over_time($percentile_q, (expr)[$trend_window:])` — percentile trends. +- `topk($top_n, sum by (...) (...))` — XEvent / wait-type / memory-consumer trends. +- `time() - timestamp(up == 1)` — data-collection-issue detection. + +See the folder's [`README.md`](https://github.com/imajaydwivedi/SQLMonitor/blob/dev/sql_exporter/Prometheus-Dashboards/README.md) for the full spec-driven workflow and Grafana API bulk-import snippet. + ## Choosing between the two paths | Consideration | SQL table path (classic) | Prometheus path | diff --git a/sql_exporter/Perfmon-SQL-Exporter-Migration-Progress.md b/sql_exporter/Perfmon-SQL-Exporter-Migration-Progress.md deleted file mode 100644 index 62db936..0000000 --- a/sql_exporter/Perfmon-SQL-Exporter-Migration-Progress.md +++ /dev/null @@ -1,25 +0,0 @@ -## Resumable Retry Plan - -### Objective -1. Inventory metrics/data covered by `Grafana-Dashboards/*.json` and `DDLs/SCH-usp_collect_performance_metrics.sql`. -2. Ensure matching coverage exists in `sql_exporter/mssql_*.collector.yml`; add missing items to `sql_exporter/mssql_dba_metrics.collector.yml`. -3. Copy `Grafana-Dashboards/Monitoring - Perfmon Counters - Quest Softwares - Distributed.json` into `sql_exporter/` and retarget its datasource/queries to `sql_exporter` metrics without changing layout, thresholds, or titles. - -### Checkpoints -- [ ] Step 01A: Extract dashboard metric inventory from `Grafana-Dashboards/` -- [ ] Step 01B: Extract procedure metric/data inventory from `DDLs/SCH-usp_collect_performance_metrics.sql` -- [ ] Step 01C: Compare inventory with `sql_exporter/mssql_*.collector.yml` -- [ ] Step 01D: Add missing items to `sql_exporter/mssql_dba_metrics.collector.yml` -- [ ] Step 02A: Copy Perfmon dashboard into `sql_exporter/` -- [ ] Step 02B: Retarget datasource and queries to `sql_exporter` metrics -- [ ] Step 02C: Validate migrated dashboard JSON - -### Current status -- Active phase: Step 01A / Step 01B inventory gathering -- Notes: task list created and repository scope confirmed. - -### Resume instructions -- Re-open this file first. -- Continue from the first unchecked checkpoint. -- Re-run only the inventory/validation commands for the incomplete phase. - diff --git a/sql_exporter/Prometheus-Dashboards/.gitignore b/sql_exporter/Prometheus-Dashboards/.gitignore new file mode 100644 index 0000000..7a60b85 --- /dev/null +++ b/sql_exporter/Prometheus-Dashboards/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +*.pyc diff --git a/sql_exporter/SQL-Exporter-Metrics-Dashboard-External.json b/sql_exporter/Prometheus-Dashboards/SQL-Exporter-Metrics-Dashboard-External.json similarity index 100% rename from sql_exporter/SQL-Exporter-Metrics-Dashboard-External.json rename to sql_exporter/Prometheus-Dashboards/SQL-Exporter-Metrics-Dashboard-External.json diff --git a/sql_exporter/README-sql_exporter.md b/sql_exporter/README-sql_exporter.md index 1c520b6..970f7eb 100644 --- a/sql_exporter/README-sql_exporter.md +++ b/sql_exporter/README-sql_exporter.md @@ -135,6 +135,30 @@ scrape_configs: ``` +# Collectors + +`sql_exporter.yml` binds each collector file (`mssql_*.collector.yml`) to a +job; every target in the job runs every metric definition in the named +collectors. + +| Collector file | Job | Scrape interval | What it publishes | +|---|---|---|---| +| `mssql_standard.collector.yml` | `mssql_common` | default | Upstream [sql_exporter](https://github.com/burningalchemist/sql_exporter/tree/master/examples/mssql_standard) baseline — `mssql_perfmon__*`, `mssql_up`, `mssql_sqlserver_*`. | +| `mssql_dba_cached.collector.yml` | `mssql_common` | 1m | `mssql_virtualfilestats__*`, `mssql_waits__*`, `mssql_cpu_utilization__*`. | +| `mssql_dba_regular.collector.yml` | `mssql_common` | default | `mssql_service_info`, `mssql_db_state`, registry/config snapshot. | +| `mssql_dba_stableinfo.collector.yml` | `mssql_common` | 10m | Low-churn info (CPU count, version, clustering). | +| `mssql_dba_aghealth.collector.yml` | `mssql_ag` | 1m | `mssql_aghealth__*` (AG sync_health / latency / queues). | +| `mssql_dba_whoisactive.collector.yml` | `mssql_long_running` | 2m | `mssql_whoisactive__*` — current sp_WhoIsActive snapshot. | +| `mssql_sqlagent_jobs.collector.yml` | `mssql_msdb` | 1m | `mssql_sqlagent_job__*` — job enabled / outcome / duration / next run / 24h step failures. | +| `mssql_backup_history.collector.yml` | `mssql_msdb` | 5m | `mssql_backup__*` — per-(db, backup_type) last-time / size / duration / age. | +| `mssql_xevent.collector.yml` | `mssql_xevent` | 1m | `mssql_xevent__*` — 5-minute aggregates of `DBA.dbo.xevent_metrics` (guarded; no-op where the XEvent proc isn't installed). | + +The three **msdb / xevent** collectors are new in Phase 1 of the Prometheus +dashboard rollout and feed the new Grafana dashboards under +`sql_exporter/Prometheus-Dashboards/`. See [`Prometheus-Dashboards/README.md`](Prometheus-Dashboards/README.md) +for the generator / spec workflow and the per-dashboard panel inventory. + + # Refresh Collectors ``` # E:\Github\SQLMonitor\sql_exporter\sql_exporter.exe --config.file E:\Github\SQLMonitor\sql_exporter\sql_exporter.yml diff --git a/sql_exporter/SQL-Exporter-Metrics-Documentation.md b/sql_exporter/SQL-Exporter-Metrics-Documentation.md deleted file mode 100644 index 4c7b39f..0000000 --- a/sql_exporter/SQL-Exporter-Metrics-Documentation.md +++ /dev/null @@ -1,228 +0,0 @@ -# SQL Server Exporter Metrics Dashboard Documentation - -## Overview - -This repository now contains the current Grafana dashboard for SQL Server metrics exposed by `sql_exporter`: - -- `sql_exporter/SQL-Exporter-Metrics-Dashboard.json` - - cleaner operational layout intended for day-to-day use - -The current dashboard details are: - -- **Title:** `SQL Exporter Metrics` -- **UID:** `sql-exporter-metrics` -- **Panels:** 53 -- **Rows:** 10 -- **Metric families covered:** 74 `mssql_*` metrics from `sql_exporter/sql_exporter_metrics.txt` - -Every panel includes a description so the dashboard remains self-documenting inside Grafana. - -## Which Dashboard Should You Use? - -### Use `SQL-Exporter-Metrics-Dashboard.json` when you want - -- a cleaner operational layout -- a stronger top-level overview row -- better grouping for troubleshooting -- easier side-by-side monitoring of workload, waits, memory, I/O, and log pressure - -## Dashboard Structure - -### 1. Overview - -Top-row KPIs for fast triage: - -- **SQL Instance Up**: `mssql_up` -- **SQL Agent Service**: `mssql_service_info` filtered to SQL Server Agent -- **User Connections**: `mssql_user_connections` -- **Batch Req/sec**: rate of `mssql_batch_requests` -- **SQL CPU %**: `mssql_cpu_utilization_percentage` -- **Memory Util %**: `mssql_memory_utilization_percentage` -- **PLE (sec)**: `mssql_page_life_expectancy_seconds` -- **Max Log Used %**: max of `mssql_database_percent_log_used` - -This row is intended to answer: **Is the instance up, busy, pressured, or approaching a log-space issue?** - -### 2. Availability & Inventory - -- Instance & service availability trend -- HA / replica queue gauges -- Exporter local time -- Service & instance metadata snapshot table -- Database inventory snapshot table - -Use this row to confirm exporter coverage, instance availability, service state, and discovered database metadata. - -### 3. Workload, Sessions & Connections - -- connections by database -- login / logout / reset rates -- active cursors and SQL attentions - -Use this row to understand connection churn and session pressure. - -### 4. CPU, Compilation & Execution Patterns - -- CPU by scope, resource pool, and workload group -- batch requests, compilations, recompilations, and auto-parameterization -- access methods activity - -Use this row to identify CPU pressure, heavy compilation churn, and scan-heavy behavior. - -### 5. Memory & Buffer Pool - -- host / OS / page file memory -- SQL process memory and grant pressure -- memory manager breakdown -- buffer pool capacity -- buffer cache health -- buffer manager operations / checkpoints - -Use this row for memory pressure analysis and buffer pool behavior. - -### 6. I/O, Pages & Latches - -- page lookup / read / write rates -- I/O stall by database -- latch, network I/O, and page I/O wait gauges - -Use this row to correlate read/write patterns with storage or latch bottlenecks. - -### 7. Transactions, Locks & Waits - -- transaction activity -- blocking, lock waits, and deadlocks -- waits in progress - -Use this row for contention investigations and long-running transaction analysis. - -### 8. Database Storage & File Layout - -- database file sizes -- database log used % -- XTP memory by database - -Use this row for capacity review and per-database file footprint tracking. - -### 9. Transaction Log, Redo & Data Movement - -- log flushes / bytes / waits -- log wait time / events / growths -- mirroring / redo movement - -Use this row when diagnosing log write pressure, AG / redo issues, or database growth events. - -### 10. Errors & Tempdb - -- SQL errors and connection kills -- tempdb space and temp objects -- misc operational counters - -Use this row for application-facing issues, tempdb pressure, and general anomaly detection. - -## Single-Server Selection - -Both dashboards intentionally allow **one server at a time**. - -### Variable details - -- **Variable name:** `Server` -- **Query:** `label_values(mssql_up, instance)` -- **Multi-select:** `false` -- **Include All:** `false` - -The `Server` selector still comes from `mssql_up` because it is now the clean instance-level availability metric and always carries the Prometheus `instance` target label. - -### How it works - -1. Select one target from the `Server` dropdown. -2. Every panel filters on `instance="$Server"`. -3. This prevents mixed-server graphs and makes troubleshooting clearer. - -## Panel Descriptions - -Every panel in the dashboard JSON includes a description that references the underlying metric family or families. - -This is especially useful when: - -- importing the dashboard into a new Grafana environment -- handing the dashboard to another DBA or SRE -- troubleshooting unfamiliar counters directly from the Grafana UI - -## Metric Coverage - -The dashboards were generated from the metrics reference file: - -- `sql_exporter/sql_exporter_metrics.txt` - -The current generated dashboards are intended to cover all discovered `mssql_*` metric families from that file. - -Key domains represented include: - -- availability -- connections and sessions -- workload and compilations -- CPU and memory -- buffer pool and page activity -- I/O and latch waits -- transactions, locks, and waits -- database file and log usage -- tempdb and errors - -## Operational Interpretation Guide - -### Healthy signals - -- `mssql_up = 1` for the selected SQL instance -- `mssql_service_info = 1` for expected services such as SQL Server Agent -- CPU generally below sustained saturation -- memory utilization stable relative to your baseline -- page life expectancy stable or improving -- deadlocks near zero -- blocked processes near zero -- log used % comfortably below critical thresholds - -### Warning signals - -- rising recompilation rates -- falling PLE -- increasing blocked processes -- recurring deadlocks -- growing I/O stall rates -- rising tempdb usage -- persistent log growth events - -### Critical signals - -- SQL instance down (`mssql_up = 0` or absent) -- expected SQL services not reporting through `mssql_service_info` -- sustained high CPU or memory pressure -- log space nearing full -- sharp spike in waits / deadlocks / blocking -- rapid rise in SQL errors or kill-connection errors - -## Import and Customization - -### Recommended import target - -Import this file: - -- `sql_exporter/SQL-Exporter-Metrics-Dashboard.json` - -### After import - -1. select your Prometheus datasource -2. select a single `Server` -3. compare observed values against your own environment baseline -4. tune thresholds if your workload profile needs different warning levels - -## Related Files - -- `sql_exporter/SQL-Exporter-Metrics-Dashboard.json` -- `sql_exporter/SQL-Exporter-Metrics-QuickRef.md` -- `sql_exporter/sql_exporter_metrics.txt` - -## References - -- SQL Server DMV documentation: https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/system-dynamic-management-views -- Grafana dashboard documentation: https://grafana.com/docs/grafana/latest/dashboards/ diff --git a/sql_exporter/SQL-Exporter-Metrics-QuickRef.md b/sql_exporter/SQL-Exporter-Metrics-QuickRef.md deleted file mode 100644 index d827fe0..0000000 --- a/sql_exporter/SQL-Exporter-Metrics-QuickRef.md +++ /dev/null @@ -1,154 +0,0 @@ -# SQL Server Metrics Quick Reference - -## Recommended Dashboard - -Use: - -- `sql_exporter/SQL-Exporter-Metrics-Dashboard.json` - -This is the cleaner operational dashboard. - -### Current dashboard facts - -- **Grafana title:** `SQL Exporter Metrics` -- **UID:** `sql-exporter-metrics` -- **Panels:** 53 -- **Rows:** 10 -- **Metrics covered:** 74 `mssql_*` metric families -- **Server selector:** single-select only - -## Key Features - -✅ **Single Server Selection** - one instance at a time -✅ **Overview KPIs** - fast operational triage -✅ **Category Rows** - organized by troubleshooting domain -✅ **Trend Panels** - time-series views for operational drift -✅ **Panel Descriptions** - each panel documents its metric source -✅ **Inventory Tables** - service and database snapshots - ---- - -## Row-by-Row Layout - -| Row | Purpose | Example Panels | -|-----|---------|----------------| -| Overview | Fast health check | SQL Instance Up, SQL Agent Service, User Connections, SQL CPU %, PLE | -| Availability & Inventory | Instance/service state and discovered objects | Instance & Service Availability, Metadata Snapshot, Database Inventory Snapshot | -| Workload, Sessions & Connections | Connection churn and session pressure | Connections by Database, Login/Logout/Reset Rates | -| CPU, Compilation & Execution Patterns | CPU pressure and plan churn | CPU by Scope, Batch/Compilation Trends, Access Methods | -| Memory & Buffer Pool | Memory pressure and cache behavior | Host/OS Memory, Memory Grants, Buffer Cache Health | -| I/O, Pages & Latches | Disk and latch bottlenecks | Page Read/Write Rates, I/O Stall by Database | -| Transactions, Locks & Waits | Contention analysis | Transaction Activity, Blocking/Deadlocks, Waits in Progress | -| Database Storage & File Layout | Capacity and file footprint | File Sizes, Log Used %, XTP Memory | -| Transaction Log, Redo & Data Movement | Log write and HA flow analysis | Log Flushes, Log Events/Growths, Mirroring/Redo | -| Errors & Tempdb | Error spikes and tempdb pressure | SQL Errors, Tempdb Space, Temp Objects | - ---- - -## Overview KPIs to Watch First - -| KPI | Metric Basis | Healthy Direction | -|-----|--------------|------------------| -| SQL Instance Up | `mssql_up` | should be `1` | -| SQL Agent Service | `mssql_service_info{service_name="SQLSERVERAGENT"}` | should be `1` when expected | -| User Connections | `mssql_user_connections` | stable around baseline | -| Batch Req/sec | `rate(mssql_batch_requests)` | workload-dependent baseline | -| SQL CPU % | `mssql_cpu_utilization_percentage` | avoid sustained high values | -| Memory Util % | `mssql_memory_utilization_percentage` | stable relative to baseline | -| PLE (sec) | `mssql_page_life_expectancy_seconds` | stable / higher is generally better | -| Max Log Used % | `mssql_database_percent_log_used` | keep comfortably below critical | - ---- - -## Single-Server Filtering - -The dashboard intentionally restricts analysis to **one server at a time**. - -- **Variable:** `Server` -- **Query:** `label_values(mssql_up, instance)` -- **Multi-select:** disabled -- **Include All:** disabled - -The selector uses `mssql_up` because it is now the instance-level metric, while `mssql_service_info` holds service-specific state and metadata. - -All Prometheus queries filter on: - -- `instance="$Server"` - -This prevents cross-server mixing in the same graph. - ---- - -## Quick Triage Guide - -### If CPU is high - -Check these rows in order: - -1. **Overview** - confirm CPU spike -2. **CPU, Compilation & Execution Patterns** - compilations, recompilations, scans -3. **Workload, Sessions & Connections** - connection surge - -### If memory pressure is suspected - -Check: - -1. **Overview** - Memory Util % and PLE -2. **Memory & Buffer Pool** - grants, cache health, page faults -3. **I/O, Pages & Latches** - rising physical reads / page activity - -### If blocking or slowness is reported - -Check: - -1. **Transactions, Locks & Waits** -2. **I/O, Pages & Latches** -3. **Transaction Log, Redo & Data Movement** - -### If log growth is a concern - -Check: - -1. **Overview** - Max Log Used % -2. **Database Storage & File Layout** - per-database log used % -3. **Transaction Log, Redo & Data Movement** - flush waits, events, growths - ---- - -## Baseline Template - -Record these against a known-good period: - -- Batch Requests/sec -- SQL CPU % -- Memory Util % -- Page Life Expectancy -- Max Log Used % -- I/O Stall by Database -- Deadlocks/sec -- Lock Waits/sec -- User Connections - ---- - -## File Locations - -- `sql_exporter/SQL-Exporter-Metrics-Dashboard.json` -- `sql_exporter/SQL-Exporter-Metrics-Documentation.md` -- `sql_exporter/SQL-Exporter-Metrics-QuickRef.md` -- `sql_exporter/sql_exporter_metrics.txt` - ---- - -## Recommended Import Choice - -Import this dashboard: - -- `sql_exporter/SQL-Exporter-Metrics-Dashboard.json` - ---- - -**Last Updated:** 2026-03-17 -**Dashboard Version:** 2.0 -**Metrics Covered:** 74 -**Panels:** 53 diff --git a/sql_exporter/mssql_backup_history.collector.yml b/sql_exporter/mssql_backup_history.collector.yml new file mode 100644 index 0000000..5046c42 --- /dev/null +++ b/sql_exporter/mssql_backup_history.collector.yml @@ -0,0 +1,118 @@ +# Backup history metrics for SQLMonitor. +# +# Required permissions (on msdb): +# +# GRANT SELECT ON OBJECT::msdb.dbo.backupset TO ; +# GRANT SELECT ON OBJECT::msdb.dbo.backupmediafamily TO ; +# +# One sample per (database_name, backup_type) so cardinality is bounded: +# SQL Server itself exposes at most ~8 backup_type values per database. +# +collector_name: mssql_backup_history + +min_interval: 5m + +metrics: + - metric_name: mssql_backup__last_time_utc + type: gauge + help: 'Unix epoch seconds when the last backup of the given type finished. 0 if no history.' + key_labels: [database_name, backup_type, backup_type_desc, recovery_model] + values: [last_backup_time_utc] + query_ref: mssql_backup_history_latest + + - metric_name: mssql_backup__last_duration_seconds + type: gauge + help: 'Duration (seconds) of the last backup of the given type.' + key_labels: [database_name, backup_type] + values: [last_backup_duration_seconds] + query_ref: mssql_backup_history_latest + + - metric_name: mssql_backup__last_size_bytes + type: gauge + help: 'Size (bytes) of the last backup of the given type.' + key_labels: [database_name, backup_type] + values: [last_backup_size_bytes] + query_ref: mssql_backup_history_latest + + - metric_name: mssql_backup__last_compressed_size_bytes + type: gauge + help: 'Compressed size (bytes) of the last backup of the given type.' + key_labels: [database_name, backup_type] + values: [last_backup_compressed_size_bytes] + query_ref: mssql_backup_history_latest + + - metric_name: mssql_backup__age_seconds + type: gauge + help: 'Age (seconds) of the last backup of the given type relative to server time.' + key_labels: [database_name, backup_type] + values: [backup_age_seconds] + query_ref: mssql_backup_history_latest + + - metric_name: mssql_backup__count_last_24h + type: gauge + help: 'Count of successful backups of the given type that finished within the last 24 hours.' + key_labels: [database_name, backup_type] + values: [count_last_24h] + query_ref: mssql_backup_history_latest + +queries: + - query_name: mssql_backup_history_latest + query: | + SET NOCOUNT ON; + + IF OBJECT_ID('tempdb..#latest') IS NOT NULL DROP TABLE #latest; + IF OBJECT_ID('tempdb..#count_24h') IS NOT NULL DROP TABLE #count_24h; + + -- Latest row per (database_name, type) from backupset. + WITH b AS ( + SELECT database_name, type, + backup_finish_date, backup_start_date, + backup_size, compressed_backup_size, recovery_model, + rn = ROW_NUMBER() OVER ( + PARTITION BY database_name, type + ORDER BY backup_finish_date DESC, backup_set_id DESC) + FROM msdb.dbo.backupset + WHERE backup_finish_date IS NOT NULL + ) + SELECT database_name, type, backup_finish_date, backup_start_date, + backup_size, compressed_backup_size, recovery_model + INTO #latest + FROM b WHERE rn = 1; + + -- 24-hour count per (database_name, type). + SELECT database_name, type, c = COUNT(*) + INTO #count_24h + FROM msdb.dbo.backupset + WHERE backup_finish_date IS NOT NULL + AND backup_finish_date >= DATEADD(hour, -24, GETDATE()) + GROUP BY database_name, type; + + SELECT database_name = CAST(COALESCE(l.database_name, N'') AS nvarchar(256)), + backup_type = CAST(l.type AS nvarchar(4)), + backup_type_desc = CASE l.type + WHEN 'D' THEN N'Database (Full)' + WHEN 'I' THEN N'Differential' + WHEN 'L' THEN N'Log' + WHEN 'F' THEN N'File or Filegroup' + WHEN 'G' THEN N'File Differential' + WHEN 'P' THEN N'Partial' + WHEN 'Q' THEN N'Partial Differential' + ELSE N'Unknown' END, + recovery_model = CAST(COALESCE(l.recovery_model, N'') AS nvarchar(64)), + last_backup_time_utc = CAST( + DATEDIFF_BIG(second, + CONVERT(datetime2, '19700101'), + DATEADD(mi, DATEDIFF(mi, GETDATE(), GETUTCDATE()), + l.backup_finish_date)) AS bigint), + last_backup_duration_seconds = CAST( + DATEDIFF(second, l.backup_start_date, l.backup_finish_date) + AS bigint), + last_backup_size_bytes = CAST(COALESCE(l.backup_size, 0) AS bigint), + last_backup_compressed_size_bytes = CAST( + COALESCE(l.compressed_backup_size, l.backup_size, 0) AS bigint), + backup_age_seconds = CAST( + DATEDIFF_BIG(second, l.backup_finish_date, GETDATE()) AS bigint), + count_last_24h = CAST(COALESCE(c24.c, 0) AS bigint) + FROM #latest l + LEFT JOIN #count_24h c24 + ON c24.database_name = l.database_name AND c24.type = l.type; diff --git a/sql_exporter/mssql_dba_stableinfo.collector.yml b/sql_exporter/mssql_dba_stableinfo.collector.yml index 25a86e6..59c3e34 100644 --- a/sql_exporter/mssql_dba_stableinfo.collector.yml +++ b/sql_exporter/mssql_dba_stableinfo.collector.yml @@ -610,18 +610,36 @@ metrics: queries: - query_name: mssql_sys_databases query: | + -- Dynamic SQL: substitute CAST(0 AS bigint) for columns that do not + -- exist on the running SQL Server version so the same metric schema + -- is emitted on SQL 2016 through SQL 2025. The following columns are + -- present only on SQL Server 2022 (16.x) or later. + DECLARE @c_tempdb_spill_to_remote_store nvarchar(200) = IIF( + COL_LENGTH('sys.databases','is_tempdb_spill_to_remote_store') IS NOT NULL, + N'CAST(d.is_tempdb_spill_to_remote_store AS bigint)', N'CAST(0 AS bigint)'); + DECLARE @c_stale_page_detection_on nvarchar(200) = IIF( + COL_LENGTH('sys.databases','is_stale_page_detection_on') IS NOT NULL, + N'CAST(d.is_stale_page_detection_on AS bigint)', N'CAST(0 AS bigint)'); + DECLARE @c_memory_optimized_enabled nvarchar(200) = IIF( + COL_LENGTH('sys.databases','is_memory_optimized_enabled') IS NOT NULL, + N'CAST(d.is_memory_optimized_enabled AS bigint)', N'CAST(0 AS bigint)'); + DECLARE @c_data_retention_enabled nvarchar(200) = IIF( + COL_LENGTH('sys.databases','is_data_retention_enabled') IS NOT NULL, + N'CAST(d.is_data_retention_enabled AS bigint)', N'CAST(0 AS bigint)'); + + DECLARE @sql nvarchar(max) = N' SELECT - CAST(DATEDIFF_BIG(second, CONVERT(datetime2, '19700101'), GETUTCDATE()) AS bigint) as collection_time_utc, + CAST(DATEDIFF_BIG(second, CONVERT(datetime2, ''19700101''), GETUTCDATE()) AS bigint) as collection_time_utc, d.name AS db_name, - COALESCE(sys.fn_varbintohexstr(d.owner_sid), N'') AS owner_sid, - CAST(DATEDIFF_BIG(second, CONVERT(datetime2, '19700101'), d.create_date) AS bigint) AS create_date, - COALESCE(d.collation_name, N'') AS collation_name, - COALESCE(CONVERT(nvarchar(36), d.service_broker_guid), N'') AS service_broker_guid, - COALESCE(CONVERT(nvarchar(36), d.replica_id), N'') AS replica_id, - COALESCE(CONVERT(nvarchar(36), d.group_database_id), N'') AS group_database_id, - COALESCE(d.default_language_name, N'') AS default_language_name, - COALESCE(d.default_fulltext_language_name, N'') AS default_fulltext_language_name, - COALESCE(d.physical_database_name, N'') AS physical_database_name, + COALESCE(sys.fn_varbintohexstr(d.owner_sid), N'''') AS owner_sid, + CAST(DATEDIFF_BIG(second, CONVERT(datetime2, ''19700101''), d.create_date) AS bigint) AS create_date, + COALESCE(d.collation_name, N'''') AS collation_name, + COALESCE(CONVERT(nvarchar(36), d.service_broker_guid), N'''') AS service_broker_guid, + COALESCE(CONVERT(nvarchar(36), d.replica_id), N'''') AS replica_id, + COALESCE(CONVERT(nvarchar(36), d.group_database_id), N'''') AS group_database_id, + COALESCE(d.default_language_name, N'''') AS default_language_name, + COALESCE(d.default_fulltext_language_name, N'''') AS default_fulltext_language_name, + COALESCE(d.physical_database_name, N'''') AS physical_database_name, d.database_id AS database_id, d.source_database_id AS source_database_id, d.compatibility_level AS compatibility_level, @@ -685,20 +703,22 @@ queries: d.catalog_collation_type AS catalog_collation_type, CAST(d.is_result_set_caching_on AS bigint) AS is_result_set_caching_on, CAST(d.is_accelerated_database_recovery_on AS bigint) AS is_accelerated_database_recovery_on, - CAST(d.is_tempdb_spill_to_remote_store AS bigint) AS is_tempdb_spill_to_remote_store, - CAST(d.is_stale_page_detection_on AS bigint) AS is_stale_page_detection_on, - CAST(d.is_memory_optimized_enabled AS bigint) AS is_memory_optimized_enabled, - CAST(d.is_data_retention_enabled AS bigint) AS is_data_retention_enabled, - COALESCE(d.user_access_desc, N'') AS user_access_desc, - COALESCE(d.state_desc, N'') AS state_desc, - COALESCE(d.snapshot_isolation_state_desc, N'') AS snapshot_isolation_state_desc, - COALESCE(d.recovery_model_desc, N'') AS recovery_model_desc, - COALESCE(d.page_verify_option_desc, N'') AS page_verify_option_desc, - COALESCE(d.containment_desc, N'') AS containment_desc, - COALESCE(d.delayed_durability_desc, N'') AS delayed_durability_desc, - COALESCE(d.catalog_collation_type_desc, N'') AS catalog_collation_type_desc + ' + @c_tempdb_spill_to_remote_store + N' AS is_tempdb_spill_to_remote_store, + ' + @c_stale_page_detection_on + N' AS is_stale_page_detection_on, + ' + @c_memory_optimized_enabled + N' AS is_memory_optimized_enabled, + ' + @c_data_retention_enabled + N' AS is_data_retention_enabled, + COALESCE(d.user_access_desc, N'''') AS user_access_desc, + COALESCE(d.state_desc, N'''') AS state_desc, + COALESCE(d.snapshot_isolation_state_desc, N'''') AS snapshot_isolation_state_desc, + COALESCE(d.recovery_model_desc, N'''') AS recovery_model_desc, + COALESCE(d.page_verify_option_desc, N'''') AS page_verify_option_desc, + COALESCE(d.containment_desc, N'''') AS containment_desc, + COALESCE(d.delayed_durability_desc, N'''') AS delayed_durability_desc, + COALESCE(d.catalog_collation_type_desc, N'''') AS catalog_collation_type_desc FROM sys.databases AS d - ORDER BY d.name + ORDER BY d.name'; + + EXEC sp_executesql @sql; - query_name: mssql_sys_configurations query: | diff --git a/sql_exporter/mssql_sqlagent_jobs.collector.yml b/sql_exporter/mssql_sqlagent_jobs.collector.yml new file mode 100644 index 0000000..83d9f36 --- /dev/null +++ b/sql_exporter/mssql_sqlagent_jobs.collector.yml @@ -0,0 +1,144 @@ +# SQL Agent job activity metrics for SQLMonitor. +# +# Required permissions (on msdb): +# +# GRANT SELECT ON OBJECT::msdb.dbo.sysjobs TO ; +# GRANT SELECT ON OBJECT::msdb.dbo.sysjobhistory TO ; +# GRANT SELECT ON OBJECT::msdb.dbo.sysjobactivity TO ; +# GRANT SELECT ON OBJECT::msdb.dbo.sysjobschedules TO ; +# GRANT SELECT ON OBJECT::msdb.dbo.sysschedules TO ; +# GRANT SELECT ON OBJECT::msdb.dbo.syscategories TO ; +# +collector_name: mssql_sqlagent_jobs + +min_interval: 1m + +metrics: + - metric_name: mssql_sqlagent_job__enabled + type: gauge + help: 'Whether the SQL Agent job is enabled (1) or disabled (0).' + key_labels: [job_name, job_id, category_name, owner_name] + values: [enabled] + query_ref: mssql_sqlagent_jobs_latest + + - metric_name: mssql_sqlagent_job__last_run_outcome + type: gauge + help: 'Last run outcome code: 0=Failed, 1=Succeeded, 2=Retry, 3=Canceled, 5=Unknown/no-history.' + key_labels: [job_name, job_id, category_name, owner_name, last_run_outcome_desc] + values: [last_run_outcome] + query_ref: mssql_sqlagent_jobs_latest + + - metric_name: mssql_sqlagent_job__last_run_duration_seconds + type: gauge + help: 'Duration (seconds) of the last completed run of the job.' + key_labels: [job_name, job_id] + values: [last_run_duration_seconds] + query_ref: mssql_sqlagent_jobs_latest + + - metric_name: mssql_sqlagent_job__last_run_end_time_utc + type: gauge + help: 'Unix epoch seconds when the last completed run of the job ended. 0 if no history.' + key_labels: [job_name, job_id] + values: [last_run_end_time_utc] + query_ref: mssql_sqlagent_jobs_latest + + - metric_name: mssql_sqlagent_job__next_run_time_utc + type: gauge + help: 'Unix epoch seconds for the next scheduled run of the job. 0 if unscheduled.' + key_labels: [job_name, job_id] + values: [next_run_time_utc] + query_ref: mssql_sqlagent_jobs_latest + + - metric_name: mssql_sqlagent_job__is_running + type: gauge + help: 'Whether the SQL Agent job is currently running (1) or idle (0).' + key_labels: [job_name, job_id] + values: [is_running] + query_ref: mssql_sqlagent_jobs_latest + + - metric_name: mssql_sqlagent_job__step_failures_last_24h + type: gauge + help: 'Count of job step failures (run_status=0, step_id>0) in the last 24 hours.' + key_labels: [job_name, job_id] + values: [step_failures_last_24h] + query_ref: mssql_sqlagent_jobs_latest + +queries: + # NOTE: sql_exporter (go-mssqldb) only reads the FIRST result-set from a + # batch and treats `SELECT INTO #tmp` statements as zero-column resultsets + # that interleave with the final SELECT -- which causes silent scrape + # failures. So this query is deliberately a SINGLE SELECT using derived + # tables instead of temp tables. + - query_name: mssql_sqlagent_jobs_latest + query: | + SELECT job_name = CAST(j.name AS nvarchar(256)), + job_id = CONVERT(nvarchar(36), j.job_id), + category_name = ISNULL(c.name, N''), + owner_name = ISNULL(SUSER_SNAME(j.owner_sid), N''), + enabled = CAST(j.enabled AS int), + last_run_outcome = ISNULL(lo.run_status, 5), + last_run_outcome_desc = CASE ISNULL(lo.run_status, 5) + WHEN 0 THEN N'Failed' + WHEN 1 THEN N'Succeeded' + WHEN 2 THEN N'Retry' + WHEN 3 THEN N'Canceled' + ELSE N'Unknown' END, + last_run_duration_seconds = ISNULL(lo.run_seconds, 0), + last_run_end_time_utc = CAST(ISNULL( + DATEDIFF_BIG(second, + CONVERT(datetime2, '19700101'), + DATEADD(mi, DATEDIFF(mi, GETDATE(), GETUTCDATE()), lo.run_end_dt)), 0) AS bigint), + next_run_time_utc = CAST(ISNULL( + DATEDIFF_BIG(second, + CONVERT(datetime2, '19700101'), + DATEADD(mi, DATEDIFF(mi, GETDATE(), GETUTCDATE()), nr.next_run_dt)), 0) AS bigint), + is_running = ISNULL(r.is_running, 0), + step_failures_last_24h = ISNULL(sf.failures_24h, 0) + FROM msdb.dbo.sysjobs j + LEFT JOIN msdb.dbo.syscategories c + ON c.category_id = j.category_id + LEFT JOIN ( + SELECT job_id, run_status, run_end_dt, run_seconds + FROM ( + SELECT job_id, run_status, + run_end_dt = msdb.dbo.agent_datetime(run_date, run_time), + run_seconds = (run_duration / 10000) * 3600 + + ((run_duration / 100) % 100) * 60 + + (run_duration % 100), + rn = ROW_NUMBER() OVER ( + PARTITION BY job_id + ORDER BY run_date DESC, run_time DESC, instance_id DESC) + FROM msdb.dbo.sysjobhistory + WHERE step_id = 0 + ) x + WHERE rn = 1 + ) lo ON lo.job_id = j.job_id + LEFT JOIN ( + SELECT h.job_id, failures_24h = COUNT(*) + FROM msdb.dbo.sysjobhistory h + WHERE h.step_id > 0 AND h.run_status = 0 + AND msdb.dbo.agent_datetime(h.run_date, h.run_time) + >= DATEADD(hour, -24, GETDATE()) + GROUP BY h.job_id + ) sf ON sf.job_id = j.job_id + LEFT JOIN ( + SELECT a.job_id, is_running = 1 + FROM msdb.dbo.sysjobactivity a + INNER JOIN ( + SELECT job_id, max_ts = MAX(session_id) + FROM msdb.dbo.sysjobactivity GROUP BY job_id + ) m ON m.job_id = a.job_id AND m.max_ts = a.session_id + WHERE a.start_execution_date IS NOT NULL + AND a.stop_execution_date IS NULL + ) r ON r.job_id = j.job_id + LEFT JOIN ( + SELECT js.job_id, + next_run_dt = MIN(msdb.dbo.agent_datetime( + NULLIF(js.next_run_date, 0), + NULLIF(js.next_run_time, 0))) + FROM msdb.dbo.sysjobschedules js + INNER JOIN msdb.dbo.sysschedules s + ON s.schedule_id = js.schedule_id + WHERE s.enabled = 1 AND js.next_run_date > 0 + GROUP BY js.job_id + ) nr ON nr.job_id = j.job_id; diff --git a/sql_exporter/mssql_xevent.collector.yml b/sql_exporter/mssql_xevent.collector.yml new file mode 100644 index 0000000..a6247d9 --- /dev/null +++ b/sql_exporter/mssql_xevent.collector.yml @@ -0,0 +1,124 @@ +# Extended Event (xevent_metrics) aggregates for SQLMonitor. +# +# Source table: [DBA].[dbo].[xevent_metrics] populated by +# dbo.usp_collect_xevent_metrics (file target) or +# usp_collect_xevent_metrics_ringbuffer (ring buffer target). See +# SCH-Create-XEvents.sql / SCH-Create-XEvents-RingBuffer.sql. +# +# Cardinality strategy: aggregate per (event_name, database_name, result, +# client_app_name) over the most recent 5 minutes. Top 500 rows by event +# count to cap label combos even on busy workloads. Use PromQL rate() on +# the *_total counters to render the XEvent Trend dashboard. +# +# Required permissions: +# +# USE [DBA]; GRANT SELECT ON OBJECT::dbo.xevent_metrics TO ; +# +collector_name: mssql_xevent + +min_interval: 1m + +metrics: + - metric_name: mssql_xevent__events_last_5m + type: gauge + help: 'Count of extended events in the last 5 minutes, grouped by event/database/result/app.' + key_labels: [event_name, database_name, result, client_app_name] + values: [events_count] + query_ref: mssql_xevent_recent + + - metric_name: mssql_xevent__cpu_time_ms_last_5m + type: gauge + help: 'Sum of cpu_time_ms over extended events in the last 5 minutes.' + key_labels: [event_name, database_name, result, client_app_name] + values: [cpu_time_ms_sum] + query_ref: mssql_xevent_recent + + - metric_name: mssql_xevent__duration_seconds_last_5m + type: gauge + help: 'Sum of duration_seconds over extended events in the last 5 minutes.' + key_labels: [event_name, database_name, result, client_app_name] + values: [duration_seconds_sum] + query_ref: mssql_xevent_recent + + - metric_name: mssql_xevent__logical_reads_last_5m + type: gauge + help: 'Sum of logical_reads over extended events in the last 5 minutes.' + key_labels: [event_name, database_name, result, client_app_name] + values: [logical_reads_sum] + query_ref: mssql_xevent_recent + + - metric_name: mssql_xevent__physical_reads_last_5m + type: gauge + help: 'Sum of physical_reads over extended events in the last 5 minutes.' + key_labels: [event_name, database_name, result, client_app_name] + values: [physical_reads_sum] + query_ref: mssql_xevent_recent + + - metric_name: mssql_xevent__writes_last_5m + type: gauge + help: 'Sum of writes over extended events in the last 5 minutes.' + key_labels: [event_name, database_name, result, client_app_name] + values: [writes_sum] + query_ref: mssql_xevent_recent + + - metric_name: mssql_xevent__collection_time_utc + type: gauge + help: 'Unix epoch seconds when this 5-minute window was aggregated.' + key_labels: [event_name, database_name, result, client_app_name] + values: [collection_time_utc] + query_ref: mssql_xevent_recent + +queries: + # NOTE: sql_exporter (go-mssqldb) reads only the first result-set from a + # batch. IF / ELSE branches + a stand-alone `SELECT TOP 0` gate upstream + # of sp_executesql confuse the driver and cause silent scrape failures. + # We collapse the query into a single sp_executesql call whose dynamic + # SQL is chosen up front (real query if DBA.dbo.xevent_metrics exists, + # otherwise a TOP 0 shim). Exactly one result-set, always. + - query_name: mssql_xevent_recent + query: | + DECLARE @now datetime2 = SYSDATETIME(); + DECLARE @from datetime2 = DATEADD(minute, -5, @now); + DECLARE @now_utc bigint = DATEDIFF_BIG(second, + CONVERT(datetime2, '19700101'), SYSUTCDATETIME()); + DECLARE @have_xev bit = CASE WHEN DB_ID('DBA') IS NOT NULL + AND OBJECT_ID('DBA.dbo.xevent_metrics') IS NOT NULL + THEN 1 ELSE 0 END; + + DECLARE @sql nvarchar(max) = + CASE WHEN @have_xev = 1 THEN N' + SELECT TOP 500 + event_name = CAST(COALESCE(x.event_name, N'''') AS nvarchar(128)), + database_name = CAST(COALESCE(x.database_name, N'''') AS nvarchar(128)), + result = CAST(COALESCE(x.result, N'''') AS nvarchar(32)), + client_app_name = CAST(COALESCE(x.client_app_name, N'''') AS nvarchar(256)), + events_count = CAST(COUNT_BIG(*) AS bigint), + cpu_time_ms_sum = CAST(SUM(CAST(x.cpu_time_ms AS bigint)) AS bigint), + duration_seconds_sum = CAST(SUM(CAST(x.duration_seconds AS bigint)) AS bigint), + logical_reads_sum = CAST(SUM(CAST(x.logical_reads AS bigint)) AS bigint), + physical_reads_sum = CAST(SUM(CAST(x.physical_reads AS bigint)) AS bigint), + writes_sum = CAST(SUM(CAST(x.writes AS bigint)) AS bigint), + collection_time_utc = @now_utc + FROM [DBA].[dbo].[xevent_metrics] AS x WITH (NOLOCK) + WHERE x.event_time >= @from AND x.event_time <= @now + GROUP BY x.event_name, x.database_name, x.result, x.client_app_name + ORDER BY events_count DESC' + ELSE N' + SELECT TOP 0 + CAST(N'''' AS nvarchar(128)) AS event_name, + CAST(N'''' AS nvarchar(128)) AS database_name, + CAST(N'''' AS nvarchar(32)) AS result, + CAST(N'''' AS nvarchar(256)) AS client_app_name, + CAST(0 AS bigint) AS events_count, + CAST(0 AS bigint) AS cpu_time_ms_sum, + CAST(0 AS bigint) AS duration_seconds_sum, + CAST(0 AS bigint) AS logical_reads_sum, + CAST(0 AS bigint) AS physical_reads_sum, + CAST(0 AS bigint) AS writes_sum, + CAST(@now_utc AS bigint) AS collection_time_utc' + END; + + EXEC sp_executesql + @sql, + N'@from datetime2, @now datetime2, @now_utc bigint', + @from = @from, @now = @now, @now_utc = @now_utc; diff --git a/sql_exporter/sql_exporter.yml b/sql_exporter/sql_exporter.yml index e141b57..3ca522b 100644 --- a/sql_exporter/sql_exporter.yml +++ b/sql_exporter/sql_exporter.yml @@ -42,6 +42,21 @@ jobs: - targets: localhost: 'sqlserver://localhost:1433/master?trusted_connection=yes&encrypt=true&TrustServerCertificate=true' + - job_name: mssql_msdb + collectors: + - mssql_sqlagent_jobs + - mssql_backup_history + static_configs: + - targets: + localhost: 'sqlserver://localhost:1433/master?trusted_connection=yes&encrypt=true&TrustServerCertificate=true' + + - job_name: mssql_xevent + collectors: + - mssql_xevent + static_configs: + - targets: + localhost: 'sqlserver://localhost:1433/master?trusted_connection=yes&encrypt=true&TrustServerCertificate=true' + # Collector files specifies a list of globs. One collector definition is read from each matching file. # Glob patterns are supported (see for syntax). collector_files: diff --git a/sql_exporter/sql_exporter_metrics.txt b/sql_exporter/sql_exporter_metrics.txt deleted file mode 100644 index 2b6a57f..0000000 --- a/sql_exporter/sql_exporter_metrics.txt +++ /dev/null @@ -1,501 +0,0 @@ -# HELP mssql_access_methods_total Access methods counters since SQL Server startup. -# TYPE mssql_access_methods_total counter -mssql_access_methods_total{operation="forwarded_records"} 0 -mssql_access_methods_total{operation="full_scans"} 31299 -mssql_access_methods_total{operation="index_searches"} 1.367884e+06 -mssql_access_methods_total{operation="page_splits"} 1228 -mssql_access_methods_total{operation="table_lock_escalations"} 0 -mssql_access_methods_total{operation="workfiles_created"} 5100 -mssql_access_methods_total{operation="worktables_created"} 2667 -# HELP mssql_active_cursors Current active cursors by cursor type. -# TYPE mssql_active_cursors gauge -mssql_active_cursors{cursor_type="API Cursor"} 0 -mssql_active_cursors{cursor_type="TSQL Global Cursor"} 0 -mssql_active_cursors{cursor_type="TSQL Local Cursor"} 2 -# HELP mssql_active_transactions_count Count of active transactions from sys.dm_tran_active_transactions. -# TYPE mssql_active_transactions_count gauge -mssql_active_transactions_count 19 -# HELP mssql_average_latch_wait_time_ms Average latch wait time metric from SQL Server performance counters. -# TYPE mssql_average_latch_wait_time_ms gauge -mssql_average_latch_wait_time_ms 15838 -# HELP mssql_batch_requests Number of command batches received. -# TYPE mssql_batch_requests counter -mssql_batch_requests 7927 -# HELP mssql_buffer_cache_hit_ratio Ratio of requests that hit the buffer cache -# TYPE mssql_buffer_cache_hit_ratio gauge -mssql_buffer_cache_hit_ratio 16773 -# HELP mssql_buffer_database_pages Database pages in the SQL Server buffer pool. -# TYPE mssql_buffer_database_pages gauge -mssql_buffer_database_pages 62189 -# HELP mssql_buffer_manager_operations_total Buffer manager operation counters since SQL Server startup. -# TYPE mssql_buffer_manager_operations_total counter -mssql_buffer_manager_operations_total{operation="free_list_stalls"} 0 -mssql_buffer_manager_operations_total{operation="lazy_writes"} 0 -mssql_buffer_manager_operations_total{operation="readahead_pages"} 21454 -# HELP mssql_buffer_target_pages Target pages in the SQL Server buffer pool. -# TYPE mssql_buffer_target_pages gauge -mssql_buffer_target_pages 1.32448e+06 -# HELP mssql_checkpoint_pages_sec Checkpoint Pages Per Second -# TYPE mssql_checkpoint_pages_sec gauge -mssql_checkpoint_pages_sec 13 -# HELP mssql_connection_reset Connection resets since SQL Server startup. -# TYPE mssql_connection_reset counter -mssql_connection_reset 1775 -# HELP mssql_connections Number of active connections. -# TYPE mssql_connections gauge -mssql_connections{db="AdventureWorksDW2025"} 1 -mssql_connections{db="DBA"} 11 -mssql_connections{db="master"} 66 -mssql_connections{db="msdb"} 11 -# HELP mssql_cpu_utilization_percentage CPU utilization percentages from the SQL Server scheduler monitor ring buffer. -# TYPE mssql_cpu_utilization_percentage gauge -mssql_cpu_utilization_percentage{scope="sqlserver"} 1 -mssql_cpu_utilization_percentage{scope="system"} 7 -# HELP mssql_database_active_transactions Current active transactions per database. -# TYPE mssql_database_active_transactions gauge -mssql_database_active_transactions{db="AdventureWorks2025"} 0 -mssql_database_active_transactions{db="AdventureWorksDW2025"} 0 -mssql_database_active_transactions{db="CDCDemo"} 0 -mssql_database_active_transactions{db="DBA"} 0 -mssql_database_active_transactions{db="ScratchPad"} 0 -mssql_database_active_transactions{db="StackOverflow2013"} 0 -mssql_database_active_transactions{db="TutorialDB"} 0 -mssql_database_active_transactions{db="master"} 0 -mssql_database_active_transactions{db="model"} 0 -mssql_database_active_transactions{db="model_msdb"} 0 -mssql_database_active_transactions{db="model_replicatedmaster"} 0 -mssql_database_active_transactions{db="msdb"} 0 -mssql_database_active_transactions{db="sqlnexus"} 0 -mssql_database_active_transactions{db="tempdb"} 0 -# HELP mssql_database_file_size_bytes Database file sizes in bytes. -# TYPE mssql_database_file_size_bytes gauge -mssql_database_file_size_bytes{db="AdventureWorks2025",state="data"} 1.5711862784e+10 -mssql_database_file_size_bytes{db="AdventureWorks2025",state="log"} 1.015013376e+09 -mssql_database_file_size_bytes{db="AdventureWorks2025",state="log_used"} 5.6605696e+07 -mssql_database_file_size_bytes{db="AdventureWorksDW2025",state="data"} 1.42606336e+08 -mssql_database_file_size_bytes{db="AdventureWorksDW2025",state="log"} 7.548928e+07 -mssql_database_file_size_bytes{db="AdventureWorksDW2025",state="log_used"} 8.670208e+06 -mssql_database_file_size_bytes{db="CDCDemo",state="data"} 1.048576e+09 -mssql_database_file_size_bytes{db="CDCDemo",state="log"} 5.24279808e+08 -mssql_database_file_size_bytes{db="CDCDemo",state="log_used"} 3.7390336e+07 -mssql_database_file_size_bytes{db="DBA",state="data"} 1.0510925824e+10 -mssql_database_file_size_bytes{db="DBA",state="log"} 1.4680055808e+10 -mssql_database_file_size_bytes{db="DBA",state="log_used"} 8.505522176e+09 -mssql_database_file_size_bytes{db="ScratchPad",state="data"} 1.048576e+09 -mssql_database_file_size_bytes{db="ScratchPad",state="log"} 5.24279808e+08 -mssql_database_file_size_bytes{db="ScratchPad",state="log_used"} 3.2442368e+07 -mssql_database_file_size_bytes{db="StackOverflow2013",state="data"} 5.4525952e+10 -mssql_database_file_size_bytes{db="StackOverflow2013",state="log"} 7.98941184e+08 -mssql_database_file_size_bytes{db="StackOverflow2013",state="log_used"} 6.764032e+07 -mssql_database_file_size_bytes{db="TutorialDB",state="data"} 1.048576e+09 -mssql_database_file_size_bytes{db="TutorialDB",state="log"} 5.24279808e+08 -mssql_database_file_size_bytes{db="TutorialDB",state="log_used"} 3.7608448e+07 -mssql_database_file_size_bytes{db="master",state="data"} 1.1206656e+07 -mssql_database_file_size_bytes{db="master",state="log"} 2.351104e+06 -mssql_database_file_size_bytes{db="master",state="log_used"} 829440 -mssql_database_file_size_bytes{db="model",state="data"} 1.048576e+09 -mssql_database_file_size_bytes{db="model",state="log"} 5.24279808e+08 -mssql_database_file_size_bytes{db="model",state="log_used"} 1.7152e+06 -mssql_database_file_size_bytes{db="model_msdb",state="data"} 1.4811136e+07 -mssql_database_file_size_bytes{db="model_msdb",state="log"} 778240 -mssql_database_file_size_bytes{db="model_msdb",state="log_used"} 391168 -mssql_database_file_size_bytes{db="model_replicatedmaster",state="data"} 4.9152e+06 -mssql_database_file_size_bytes{db="model_replicatedmaster",state="log"} 2.351104e+06 -mssql_database_file_size_bytes{db="model_replicatedmaster",state="log_used"} 823296 -mssql_database_file_size_bytes{db="msdb",state="data"} 9.44439296e+08 -mssql_database_file_size_bytes{db="msdb",state="log"} 3.61684992e+08 -mssql_database_file_size_bytes{db="msdb",state="log_used"} 5.885952e+06 -mssql_database_file_size_bytes{db="sqlnexus",state="data"} 1.048576e+09 -mssql_database_file_size_bytes{db="sqlnexus",state="log"} 5.24279808e+08 -mssql_database_file_size_bytes{db="sqlnexus",state="log_used"} 4.6893056e+07 -mssql_database_file_size_bytes{db="tempdb",state="data"} 1.3631488e+09 -mssql_database_file_size_bytes{db="tempdb",state="log"} 2.28917248e+08 -mssql_database_file_size_bytes{db="tempdb",state="log_used"} 7.196672e+06 -# HELP mssql_database_info Info metric with database state and AG status. Value is always 1. -# TYPE mssql_database_info gauge -mssql_database_info{database_name="AdventureWorks2025",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -mssql_database_info{database_name="AdventureWorksDW2025",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -mssql_database_info{database_name="CDCDemo",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -mssql_database_info{database_name="DBA",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -mssql_database_info{database_name="ScratchPad",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -mssql_database_info{database_name="StackOverflow2013",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -mssql_database_info{database_name="TutorialDB",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -mssql_database_info{database_name="master",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -mssql_database_info{database_name="model",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -mssql_database_info{database_name="msdb",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -mssql_database_info{database_name="sqlnexus",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -mssql_database_info{database_name="tempdb",is_ha_instance="false",is_in_ag="0",state="0",state_desc="ONLINE"} 1 -# HELP mssql_database_log_bytes_flushed_total Database log bytes flushed since SQL Server startup. -# TYPE mssql_database_log_bytes_flushed_total counter -mssql_database_log_bytes_flushed_total{db="AdventureWorks2025"} 411136 -mssql_database_log_bytes_flushed_total{db="AdventureWorksDW2025"} 2048 -mssql_database_log_bytes_flushed_total{db="CDCDemo"} 1024 -mssql_database_log_bytes_flushed_total{db="DBA"} 2.36032e+06 -mssql_database_log_bytes_flushed_total{db="ScratchPad"} 4608 -mssql_database_log_bytes_flushed_total{db="StackOverflow2013"} 512 -mssql_database_log_bytes_flushed_total{db="TutorialDB"} 512 -mssql_database_log_bytes_flushed_total{db="master"} 132608 -mssql_database_log_bytes_flushed_total{db="model"} 1536 -mssql_database_log_bytes_flushed_total{db="model_msdb"} 0 -mssql_database_log_bytes_flushed_total{db="model_replicatedmaster"} 0 -mssql_database_log_bytes_flushed_total{db="msdb"} 1.654784e+06 -mssql_database_log_bytes_flushed_total{db="sqlnexus"} 2048 -mssql_database_log_bytes_flushed_total{db="tempdb"} 6.454272e+06 -# HELP mssql_database_log_events_total Database log event counts since SQL Server startup. -# TYPE mssql_database_log_events_total counter -mssql_database_log_events_total{db="AdventureWorks2025",event="growths"} 0 -mssql_database_log_events_total{db="AdventureWorks2025",event="shrinks"} 0 -mssql_database_log_events_total{db="AdventureWorks2025",event="truncations"} 0 -mssql_database_log_events_total{db="AdventureWorksDW2025",event="growths"} 0 -mssql_database_log_events_total{db="AdventureWorksDW2025",event="shrinks"} 0 -mssql_database_log_events_total{db="AdventureWorksDW2025",event="truncations"} 0 -mssql_database_log_events_total{db="CDCDemo",event="growths"} 0 -mssql_database_log_events_total{db="CDCDemo",event="shrinks"} 0 -mssql_database_log_events_total{db="CDCDemo",event="truncations"} 0 -mssql_database_log_events_total{db="DBA",event="growths"} 0 -mssql_database_log_events_total{db="DBA",event="shrinks"} 0 -mssql_database_log_events_total{db="DBA",event="truncations"} 0 -mssql_database_log_events_total{db="ScratchPad",event="growths"} 0 -mssql_database_log_events_total{db="ScratchPad",event="shrinks"} 0 -mssql_database_log_events_total{db="ScratchPad",event="truncations"} 0 -mssql_database_log_events_total{db="StackOverflow2013",event="growths"} 0 -mssql_database_log_events_total{db="StackOverflow2013",event="shrinks"} 0 -mssql_database_log_events_total{db="StackOverflow2013",event="truncations"} 0 -mssql_database_log_events_total{db="TutorialDB",event="growths"} 0 -mssql_database_log_events_total{db="TutorialDB",event="shrinks"} 0 -mssql_database_log_events_total{db="TutorialDB",event="truncations"} 0 -mssql_database_log_events_total{db="master",event="growths"} 0 -mssql_database_log_events_total{db="master",event="shrinks"} 0 -mssql_database_log_events_total{db="master",event="truncations"} 0 -mssql_database_log_events_total{db="model",event="growths"} 0 -mssql_database_log_events_total{db="model",event="shrinks"} 0 -mssql_database_log_events_total{db="model",event="truncations"} 0 -mssql_database_log_events_total{db="model_msdb",event="growths"} 0 -mssql_database_log_events_total{db="model_msdb",event="shrinks"} 0 -mssql_database_log_events_total{db="model_msdb",event="truncations"} 0 -mssql_database_log_events_total{db="model_replicatedmaster",event="growths"} 0 -mssql_database_log_events_total{db="model_replicatedmaster",event="shrinks"} 0 -mssql_database_log_events_total{db="model_replicatedmaster",event="truncations"} 0 -mssql_database_log_events_total{db="msdb",event="growths"} 0 -mssql_database_log_events_total{db="msdb",event="shrinks"} 0 -mssql_database_log_events_total{db="msdb",event="truncations"} 0 -mssql_database_log_events_total{db="sqlnexus",event="growths"} 0 -mssql_database_log_events_total{db="sqlnexus",event="shrinks"} 0 -mssql_database_log_events_total{db="sqlnexus",event="truncations"} 0 -mssql_database_log_events_total{db="tempdb",event="growths"} 0 -mssql_database_log_events_total{db="tempdb",event="shrinks"} 0 -mssql_database_log_events_total{db="tempdb",event="truncations"} 0 -# HELP mssql_database_log_flush_wait_time_ms_total Accumulated database log flush wait time in milliseconds since SQL Server startup. -# TYPE mssql_database_log_flush_wait_time_ms_total counter -mssql_database_log_flush_wait_time_ms_total{db="AdventureWorks2025"} 163 -mssql_database_log_flush_wait_time_ms_total{db="AdventureWorksDW2025"} 0 -mssql_database_log_flush_wait_time_ms_total{db="CDCDemo"} 0 -mssql_database_log_flush_wait_time_ms_total{db="DBA"} 601 -mssql_database_log_flush_wait_time_ms_total{db="ScratchPad"} 1 -mssql_database_log_flush_wait_time_ms_total{db="StackOverflow2013"} 0 -mssql_database_log_flush_wait_time_ms_total{db="TutorialDB"} 0 -mssql_database_log_flush_wait_time_ms_total{db="master"} 67 -mssql_database_log_flush_wait_time_ms_total{db="model"} 48 -mssql_database_log_flush_wait_time_ms_total{db="model_msdb"} 0 -mssql_database_log_flush_wait_time_ms_total{db="model_replicatedmaster"} 0 -mssql_database_log_flush_wait_time_ms_total{db="msdb"} 1840 -mssql_database_log_flush_wait_time_ms_total{db="sqlnexus"} 0 -mssql_database_log_flush_wait_time_ms_total{db="tempdb"} 0 -# HELP mssql_database_log_flushes_total Database log flushes since SQL Server startup. -# TYPE mssql_database_log_flushes_total counter -mssql_database_log_flushes_total{db="AdventureWorks2025"} 23 -mssql_database_log_flushes_total{db="AdventureWorksDW2025"} 1 -mssql_database_log_flushes_total{db="CDCDemo"} 1 -mssql_database_log_flushes_total{db="DBA"} 216 -mssql_database_log_flushes_total{db="ScratchPad"} 8 -mssql_database_log_flushes_total{db="StackOverflow2013"} 1 -mssql_database_log_flushes_total{db="TutorialDB"} 1 -mssql_database_log_flushes_total{db="master"} 30 -mssql_database_log_flushes_total{db="model"} 3 -mssql_database_log_flushes_total{db="model_msdb"} 0 -mssql_database_log_flushes_total{db="model_replicatedmaster"} 0 -mssql_database_log_flushes_total{db="msdb"} 1129 -mssql_database_log_flushes_total{db="sqlnexus"} 3 -mssql_database_log_flushes_total{db="tempdb"} 111 -# HELP mssql_database_log_waits_total Database log flush waits since SQL Server startup. -# TYPE mssql_database_log_waits_total counter -mssql_database_log_waits_total{db="AdventureWorks2025"} 17 -mssql_database_log_waits_total{db="AdventureWorksDW2025"} 1 -mssql_database_log_waits_total{db="CDCDemo"} 1 -mssql_database_log_waits_total{db="DBA"} 220 -mssql_database_log_waits_total{db="ScratchPad"} 8 -mssql_database_log_waits_total{db="StackOverflow2013"} 1 -mssql_database_log_waits_total{db="TutorialDB"} 1 -mssql_database_log_waits_total{db="master"} 30 -mssql_database_log_waits_total{db="model"} 3 -mssql_database_log_waits_total{db="model_msdb"} 0 -mssql_database_log_waits_total{db="model_replicatedmaster"} 0 -mssql_database_log_waits_total{db="msdb"} 1146 -mssql_database_log_waits_total{db="sqlnexus"} 3 -mssql_database_log_waits_total{db="tempdb"} 6 -# HELP mssql_database_percent_log_used Transaction log space used as a percentage per database. -# TYPE mssql_database_percent_log_used gauge -mssql_database_percent_log_used{db="AdventureWorks2025"} 5 -mssql_database_percent_log_used{db="AdventureWorksDW2025"} 11 -mssql_database_percent_log_used{db="CDCDemo"} 7 -mssql_database_percent_log_used{db="DBA"} 57 -mssql_database_percent_log_used{db="ScratchPad"} 6 -mssql_database_percent_log_used{db="StackOverflow2013"} 8 -mssql_database_percent_log_used{db="TutorialDB"} 7 -mssql_database_percent_log_used{db="master"} 35 -mssql_database_percent_log_used{db="model"} 0 -mssql_database_percent_log_used{db="model_msdb"} 50 -mssql_database_percent_log_used{db="model_replicatedmaster"} 35 -mssql_database_percent_log_used{db="msdb"} 1 -mssql_database_percent_log_used{db="sqlnexus"} 8 -mssql_database_percent_log_used{db="tempdb"} 3 -# HELP mssql_database_xtp_memory_used_bytes XTP memory usage in bytes per database. -# TYPE mssql_database_xtp_memory_used_bytes gauge -mssql_database_xtp_memory_used_bytes{db="AdventureWorks2025"} 0 -mssql_database_xtp_memory_used_bytes{db="AdventureWorksDW2025"} 0 -mssql_database_xtp_memory_used_bytes{db="CDCDemo"} 0 -mssql_database_xtp_memory_used_bytes{db="DBA"} 6.5052672e+07 -mssql_database_xtp_memory_used_bytes{db="ScratchPad"} 0 -mssql_database_xtp_memory_used_bytes{db="StackOverflow2013"} 0 -mssql_database_xtp_memory_used_bytes{db="TutorialDB"} 0 -mssql_database_xtp_memory_used_bytes{db="master"} 0 -mssql_database_xtp_memory_used_bytes{db="model"} 0 -mssql_database_xtp_memory_used_bytes{db="model_msdb"} 0 -mssql_database_xtp_memory_used_bytes{db="model_replicatedmaster"} 0 -mssql_database_xtp_memory_used_bytes{db="msdb"} 0 -mssql_database_xtp_memory_used_bytes{db="sqlnexus"} 0 -mssql_database_xtp_memory_used_bytes{db="tempdb"} 0 -# HELP mssql_deadlocks Number of lock requests that resulted in a deadlock. -# TYPE mssql_deadlocks counter -mssql_deadlocks 0 -# HELP mssql_host_physical_memory_bytes Host physical memory in bytes. -# TYPE mssql_host_physical_memory_bytes gauge -mssql_host_physical_memory_bytes{state="available"} 1.9592138752e+10 -mssql_host_physical_memory_bytes{state="total"} 2.576924672e+10 -# HELP mssql_io_stall_seconds Stall time in seconds per database and I/O operation. -# TYPE mssql_io_stall_seconds counter -mssql_io_stall_seconds{db="AdventureWorks2025",operation="read"} 2.142 -mssql_io_stall_seconds{db="AdventureWorks2025",operation="write"} 0.278 -mssql_io_stall_seconds{db="AdventureWorksDW2025",operation="read"} 0.35 -mssql_io_stall_seconds{db="AdventureWorksDW2025",operation="write"} 0.003 -mssql_io_stall_seconds{db="CDCDemo",operation="read"} 0.33 -mssql_io_stall_seconds{db="CDCDemo",operation="write"} 0.005 -mssql_io_stall_seconds{db="DBA",operation="read"} 68.031 -mssql_io_stall_seconds{db="DBA",operation="write"} 0.582 -mssql_io_stall_seconds{db="ScratchPad",operation="read"} 0.508 -mssql_io_stall_seconds{db="ScratchPad",operation="write"} 0.068 -mssql_io_stall_seconds{db="StackOverflow2013",operation="read"} 5.796 -mssql_io_stall_seconds{db="StackOverflow2013",operation="write"} 0.003 -mssql_io_stall_seconds{db="TutorialDB",operation="read"} 0.408 -mssql_io_stall_seconds{db="TutorialDB",operation="write"} 0.291 -mssql_io_stall_seconds{db="master",operation="read"} 0.278 -mssql_io_stall_seconds{db="master",operation="write"} 0.218 -mssql_io_stall_seconds{db="model",operation="read"} 5.557 -mssql_io_stall_seconds{db="model",operation="write"} 0.072 -mssql_io_stall_seconds{db="msdb",operation="read"} 13.194 -mssql_io_stall_seconds{db="msdb",operation="write"} 1.938 -mssql_io_stall_seconds{db="sqlnexus",operation="read"} 0.675 -mssql_io_stall_seconds{db="sqlnexus",operation="write"} 0.004 -mssql_io_stall_seconds{db="tempdb",operation="read"} 0.051 -mssql_io_stall_seconds{db="tempdb",operation="write"} 0.081 -# HELP mssql_io_stall_total_seconds Total stall time in seconds per database. -# TYPE mssql_io_stall_total_seconds counter -mssql_io_stall_total_seconds{db="AdventureWorks2025"} 2.42 -mssql_io_stall_total_seconds{db="AdventureWorksDW2025"} 0.353 -mssql_io_stall_total_seconds{db="CDCDemo"} 0.335 -mssql_io_stall_total_seconds{db="DBA"} 68.613 -mssql_io_stall_total_seconds{db="ScratchPad"} 0.576 -mssql_io_stall_total_seconds{db="StackOverflow2013"} 5.799 -mssql_io_stall_total_seconds{db="TutorialDB"} 0.699 -mssql_io_stall_total_seconds{db="master"} 0.496 -mssql_io_stall_total_seconds{db="model"} 5.629 -mssql_io_stall_total_seconds{db="msdb"} 15.132 -mssql_io_stall_total_seconds{db="sqlnexus"} 0.679 -mssql_io_stall_total_seconds{db="tempdb"} 0.132 -# HELP mssql_kill_connection_errors Number of severe errors that caused SQL Server to kill the connection. -# TYPE mssql_kill_connection_errors counter -mssql_kill_connection_errors 0 -# HELP mssql_local_time_seconds Local time in seconds since epoch (Unix time). -# TYPE mssql_local_time_seconds gauge -mssql_local_time_seconds 1.773740761e+09 -# HELP mssql_lock_wait_time_ms_total Accumulated lock wait time in milliseconds since SQL Server startup. -# TYPE mssql_lock_wait_time_ms_total counter -mssql_lock_wait_time_ms_total 93639 -# HELP mssql_lock_waits_total Lock waits since SQL Server startup. -# TYPE mssql_lock_waits_total counter -mssql_lock_waits_total 94 -# HELP mssql_log_apply_pending_queue Log apply pending queue. -# TYPE mssql_log_apply_pending_queue gauge -mssql_log_apply_pending_queue 0 -# HELP mssql_log_growths Number of times the transaction log has been expanded, per database. -# TYPE mssql_log_growths counter -mssql_log_growths{db="AdventureWorks2025"} 0 -mssql_log_growths{db="AdventureWorksDW2025"} 0 -mssql_log_growths{db="CDCDemo"} 0 -mssql_log_growths{db="DBA"} 0 -mssql_log_growths{db="ScratchPad"} 0 -mssql_log_growths{db="StackOverflow2013"} 0 -mssql_log_growths{db="TutorialDB"} 0 -mssql_log_growths{db="master"} 0 -mssql_log_growths{db="model"} 0 -mssql_log_growths{db="model_msdb"} 0 -mssql_log_growths{db="model_replicatedmaster"} 0 -mssql_log_growths{db="msdb"} 0 -mssql_log_growths{db="mssqlsystemresource"} 0 -mssql_log_growths{db="sqlnexus"} 0 -mssql_log_growths{db="tempdb"} 0 -# HELP mssql_log_remaining_for_undo Log remaining for undo. -# TYPE mssql_log_remaining_for_undo gauge -mssql_log_remaining_for_undo 0 -# HELP mssql_log_send_queue Log send queue. -# TYPE mssql_log_send_queue gauge -mssql_log_send_queue 0 -# HELP mssql_logins Logins since SQL Server startup. -# TYPE mssql_logins counter -mssql_logins 438 -# HELP mssql_logouts Logouts since SQL Server startup. -# TYPE mssql_logouts counter -mssql_logouts 418 -# HELP mssql_longest_transaction_running_time_seconds Longest transaction running time in seconds. -# TYPE mssql_longest_transaction_running_time_seconds gauge -mssql_longest_transaction_running_time_seconds 0 -# HELP mssql_memory_grants_outstanding Outstanding workspace memory grants. -# TYPE mssql_memory_grants_outstanding gauge -mssql_memory_grants_outstanding 0 -# HELP mssql_memory_grants_pending Pending workspace memory grants. -# TYPE mssql_memory_grants_pending gauge -mssql_memory_grants_pending 0 -# HELP mssql_memory_manager_bytes SQL Server memory manager allocations in bytes. -# TYPE mssql_memory_manager_bytes gauge -mssql_memory_manager_bytes{state="free"} 2.07495168e+08 -mssql_memory_manager_bytes{state="granted_workspace"} 0 -mssql_memory_manager_bytes{state="maximum_workspace"} 9.56510208e+09 -mssql_memory_manager_bytes{state="sql_cache"} 2.78528e+06 -mssql_memory_manager_bytes{state="stolen_server"} 2.036334592e+09 -mssql_memory_manager_bytes{state="target_server"} 1.2884901888e+10 -mssql_memory_manager_bytes{state="total_server"} 2.753282048e+09 -# HELP mssql_memory_utilization_percentage The percentage of committed memory that is in the working set. -# TYPE mssql_memory_utilization_percentage gauge -mssql_memory_utilization_percentage 100 -# HELP mssql_mirrored_write_transactions Mirrored write transactions since SQL Server startup. -# TYPE mssql_mirrored_write_transactions counter -mssql_mirrored_write_transactions 0 -# HELP mssql_network_io_waits_ms Network IO wait time metric from SQL Server wait statistics. -# TYPE mssql_network_io_waits_ms gauge -mssql_network_io_waits_ms 0 -# HELP mssql_os_memory OS physical memory, used and available. -# TYPE mssql_os_memory gauge -mssql_os_memory{state="available"} 1.95801088e+10 -mssql_os_memory{state="used"} 6.18913792e+09 -# HELP mssql_os_page_file OS page file, used and available. -# TYPE mssql_os_page_file gauge -mssql_os_page_file{state="available"} 2.2955978752e+10 -mssql_os_page_file{state="used"} 6.571364352e+09 -# HELP mssql_page_fault_count The number of page faults that were incurred by the SQL Server process. -# TYPE mssql_page_fault_count counter -mssql_page_fault_count 1.095273e+06 -# HELP mssql_page_io_latch_waits_ms Page IO latch wait time metric from SQL Server wait statistics. -# TYPE mssql_page_io_latch_waits_ms gauge -mssql_page_io_latch_waits_ms 0 -# HELP mssql_page_life_expectancy_seconds The minimum number of seconds a page will stay in the buffer pool on this node without references. -# TYPE mssql_page_life_expectancy_seconds gauge -mssql_page_life_expectancy_seconds 300 -# HELP mssql_page_lookups Buffer manager page lookups since SQL Server startup. -# TYPE mssql_page_lookups counter -mssql_page_lookups 3.085629e+06 -# HELP mssql_page_reads Buffer manager page reads since SQL Server startup. -# TYPE mssql_page_reads counter -mssql_page_reads 54967 -# HELP mssql_page_writes Buffer manager page writes since SQL Server startup. -# TYPE mssql_page_writes counter -mssql_page_writes 413 -# HELP mssql_processes_blocked Currently blocked processes. -# TYPE mssql_processes_blocked gauge -mssql_processes_blocked 0 -# HELP mssql_redo_blocked Redo blocked events since SQL Server startup. -# TYPE mssql_redo_blocked counter -mssql_redo_blocked 0 -# HELP mssql_resident_memory_bytes SQL Server resident memory size (AKA working set). -# TYPE mssql_resident_memory_bytes gauge -mssql_resident_memory_bytes 2.919161856e+09 -# HELP mssql_resource_pool_cpu_usage_percentage CPU usage percentage by resource pool. -# TYPE mssql_resource_pool_cpu_usage_percentage gauge -mssql_resource_pool_cpu_usage_percentage{resource_pool="default"} 0 -mssql_resource_pool_cpu_usage_percentage{resource_pool="internal"} 0.024826216484607 -# HELP mssql_sql_attentions_total SQL attentions since SQL Server startup. -# TYPE mssql_sql_attentions_total counter -mssql_sql_attentions_total 148 -# HELP mssql_sql_auto_params_total Automatic parameterization activity counters since SQL Server startup. -# TYPE mssql_sql_auto_params_total counter -mssql_sql_auto_params_total{mode="attempts"} 728 -mssql_sql_auto_params_total{mode="failed"} 571 -mssql_sql_auto_params_total{mode="safe"} 10 -mssql_sql_auto_params_total{mode="unsafe"} 147 -# HELP mssql_sql_compilations SQL compilations since SQL Server startup. -# TYPE mssql_sql_compilations counter -mssql_sql_compilations 5803 -# HELP mssql_sql_errors_total SQL error counters since SQL Server startup. -# TYPE mssql_sql_errors_total counter -mssql_sql_errors_total{error_type="DB Offline Errors"} 0 -mssql_sql_errors_total{error_type="Info Errors"} 2893 -mssql_sql_errors_total{error_type="Kill Connection Errors"} 0 -mssql_sql_errors_total{error_type="User Errors"} 196 -mssql_sql_errors_total{error_type="_Total"} 3089 -# HELP mssql_sql_process_memory_bytes SQL Server process memory allocations in bytes. -# TYPE mssql_sql_process_memory_bytes gauge -mssql_sql_process_memory_bytes{state="in_use"} 2.919718912e+09 -mssql_sql_process_memory_bytes{state="large_pages"} 0 -mssql_sql_process_memory_bytes{state="locked_pages"} 0 -# HELP mssql_sql_recompilations SQL recompilations since SQL Server startup. -# TYPE mssql_sql_recompilations counter -mssql_sql_recompilations 473 -# HELP mssql_temp_tables_for_destruction Temp tables waiting to be destroyed. -# TYPE mssql_temp_tables_for_destruction gauge -mssql_temp_tables_for_destruction 0 -# HELP mssql_tempdb_active_temp_tables Active temp tables from SQL Server general statistics. -# TYPE mssql_tempdb_active_temp_tables gauge -mssql_tempdb_active_temp_tables 66 -# HELP mssql_tempdb_space_bytes tempdb free space and version store size in bytes. -# TYPE mssql_tempdb_space_bytes gauge -mssql_tempdb_space_bytes{state="free_space"} 1.34938624e+09 -mssql_tempdb_space_bytes{state="version_store"} 745472 -# HELP mssql_transaction_delay Transaction delay for database replicas. -# TYPE mssql_transaction_delay gauge -mssql_transaction_delay 0 -# HELP mssql_up SQL Server instance/service availability and metadata. -# TYPE mssql_up gauge -mssql_up{at_server_name="SQLMonitor",domain="LAB",domain_reg="Lab.com",edition="Enterprise Developer Edition (64-bit)",host_name="SQLMONITOR",instance_name="MSSQLSERVER",ip="127.0.0.1",machine_name="SQLMonitor",ports="1433",product_level="RC1",product_version="17.0.925.4",server_name="SQLMonitor",service_account="LAB\\SQLService",service_name="MSSQLSERVER",service_name_str="SQL Server (MSSQLSERVER)",sql_version="Microsoft SQL Server 2025 (RC1) - 17.0.925.4 (X64) \n Sep 9 2025 17:31:28 \n Copyright (C) 2025 Microsoft Corporation\n Enterprise Developer Edition (64-bit) on Windows Server 2019 Datacenter 10.0 (Build 17763: ) (Hypervisor)\n"} 1 -mssql_up{at_server_name="SQLMonitor",domain="LAB",domain_reg="Lab.com",edition="Enterprise Developer Edition (64-bit)",host_name="SQLMONITOR",instance_name="MSSQLSERVER",ip="127.0.0.1",machine_name="SQLMonitor",ports="1433",product_level="RC1",product_version="17.0.925.4",server_name="SQLMonitor",service_account="LAB\\SQLService",service_name="SQLSERVERAGENT",service_name_str="SQL Server Agent (MSSQLSERVER)",sql_version="Microsoft SQL Server 2025 (RC1) - 17.0.925.4 (X64) \n Sep 9 2025 17:31:28 \n Copyright (C) 2025 Microsoft Corporation\n Enterprise Developer Edition (64-bit) on Windows Server 2019 Datacenter 10.0 (Build 17763: ) (Hypervisor)\n"} 1 -# HELP mssql_user_connections Current user connections from SQL Server general statistics. -# TYPE mssql_user_connections gauge -mssql_user_connections 20 -# HELP mssql_user_errors Number of user errors. -# TYPE mssql_user_errors counter -mssql_user_errors 196 -# HELP mssql_virtual_memory_bytes SQL Server committed virtual memory size. -# TYPE mssql_virtual_memory_bytes gauge -mssql_virtual_memory_bytes 3.09387264e+09 -# HELP mssql_waits_in_progress Current waits in progress by wait category. -# TYPE mssql_waits_in_progress gauge -mssql_waits_in_progress{wait_type="Lock waits"} 0 -mssql_waits_in_progress{wait_type="Log buffer waits"} 0 -mssql_waits_in_progress{wait_type="Log write waits"} 0 -mssql_waits_in_progress{wait_type="Memory grant queue waits"} 0 -mssql_waits_in_progress{wait_type="Network IO waits"} 0 -mssql_waits_in_progress{wait_type="Non-Page latch waits"} 0 -mssql_waits_in_progress{wait_type="Page IO latch waits"} 0 -mssql_waits_in_progress{wait_type="Page latch waits"} 0 -mssql_waits_in_progress{wait_type="Thread-safe memory objects waits"} 0 -mssql_waits_in_progress{wait_type="Transaction ownership waits"} 0 -mssql_waits_in_progress{wait_type="Wait for the worker"} 0 -mssql_waits_in_progress{wait_type="Workspace synchronization waits"} 0 -# HELP mssql_workload_group_cpu_usage_percentage CPU usage percentage by workload group. -# TYPE mssql_workload_group_cpu_usage_percentage gauge -mssql_workload_group_cpu_usage_percentage{workload_group="default"} 15.288844621513944 -mssql_workload_group_cpu_usage_percentage{workload_group="internal"} 0.572709163346613 -# HELP mssqlbuffer_pool_committed SQL Server buffer pool committed bytes. -# TYPE mssqlbuffer_pool_committed gauge -mssqlbuffer_pool_committed 2.758295552e+09 -# HELP mssqlbuffer_pool_committed_target SQL Server buffer pool committed target bytes. -# TYPE mssqlbuffer_pool_committed_target gauge -mssqlbuffer_pool_committed_target 1.2884901888e+10 \ No newline at end of file