@@ -22,8 +22,8 @@ public partial class RemoteCollectorService
2222{
2323 /// <summary>
2424 /// Collects per-file database sizes for growth trending and capacity planning.
25- /// On-prem: queries sys.master_files + sys.databases for all online databases .
26- /// Azure SQL DB: queries sys.database_files for the single database.
25+ /// On-prem: queries sys.master_files + sys.databases + dm_os_volume_stats for file and drive context .
26+ /// Azure SQL DB: queries sys.database_files for the single database (no volume stats available) .
2727 /// </summary>
2828 private async Task < int > CollectDatabaseSizeStatsAsync ( ServerConnection server , CancellationToken cancellationToken )
2929 {
@@ -63,10 +63,17 @@ ELSE CONVERT(decimal(19,2), mf.max_size * 8.0 / 1024.0)
6363 compatibility_level =
6464 CONVERT(int, d.compatibility_level),
6565 state_desc =
66- d.state_desc
66+ d.state_desc,
67+ volume_mount_point =
68+ RTRIM(vs.volume_mount_point),
69+ volume_total_mb =
70+ CONVERT(decimal(19,2), vs.total_bytes / 1048576.0),
71+ volume_free_mb =
72+ CONVERT(decimal(19,2), vs.available_bytes / 1048576.0)
6773FROM sys.master_files AS mf
6874JOIN sys.databases AS d
6975 ON d.database_id = mf.database_id
76+ CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) AS vs
7077WHERE d.state_desc = N'ONLINE'
7178ORDER BY
7279 d.name,
@@ -106,7 +113,13 @@ ELSE CONVERT(decimal(19,2), df.max_size * 8.0 / 1024.0)
106113 compatibility_level =
107114 CONVERT(int, NULL),
108115 state_desc =
109- N'ONLINE'
116+ N'ONLINE',
117+ volume_mount_point =
118+ CONVERT(nvarchar(256), NULL),
119+ volume_total_mb =
120+ CONVERT(decimal(19,2), NULL),
121+ volume_free_mb =
122+ CONVERT(decimal(19,2), NULL)
110123FROM sys.database_files AS df
111124ORDER BY
112125 df.file_id
@@ -123,7 +136,8 @@ ORDER BY
123136 var rows = new List < ( string DatabaseName , int DatabaseId , int FileId , string FileTypeDesc ,
124137 string FileName , string PhysicalName , decimal TotalSizeMb , decimal ? UsedSizeMb ,
125138 decimal ? AutoGrowthMb , decimal ? MaxSizeMb , string ? RecoveryModel ,
126- int ? CompatibilityLevel , string ? StateDesc ) > ( ) ;
139+ int ? CompatibilityLevel , string ? StateDesc , string ? VolumeMountPoint ,
140+ decimal ? VolumeTotalMb , decimal ? VolumeFreeMb ) > ( ) ;
127141
128142 var sqlSw = Stopwatch . StartNew ( ) ;
129143 using var sqlConnection = await CreateConnectionAsync ( server , cancellationToken ) ;
@@ -146,7 +160,10 @@ ORDER BY
146160 reader . IsDBNull ( 9 ) ? null : reader . GetDecimal ( 9 ) ,
147161 reader . IsDBNull ( 10 ) ? null : reader . GetString ( 10 ) ,
148162 reader . IsDBNull ( 11 ) ? null : reader . GetInt32 ( 11 ) ,
149- reader . IsDBNull ( 12 ) ? null : reader . GetString ( 12 ) ) ) ;
163+ reader . IsDBNull ( 12 ) ? null : reader . GetString ( 12 ) ,
164+ reader . IsDBNull ( 13 ) ? null : reader . GetString ( 13 ) ,
165+ reader . IsDBNull ( 14 ) ? null : reader . GetDecimal ( 14 ) ,
166+ reader . IsDBNull ( 15 ) ? null : reader . GetDecimal ( 15 ) ) ) ;
150167 }
151168 sqlSw . Stop ( ) ;
152169
@@ -178,6 +195,9 @@ ORDER BY
178195 . AppendValue ( r . RecoveryModel )
179196 . AppendValue ( r . CompatibilityLevel )
180197 . AppendValue ( r . StateDesc )
198+ . AppendValue ( r . VolumeMountPoint )
199+ . AppendValue ( r . VolumeTotalMb )
200+ . AppendValue ( r . VolumeFreeMb )
181201 . EndRow ( ) ;
182202 rowsCollected ++ ;
183203 }
0 commit comments