Skip to content

Commit d4c3ad1

Browse files
authored
Skip index fragmentation metrics for tempdb (#17361)
* Skip index fragmentation metrics in tempdb * add changelog
1 parent 3153e70 commit d4c3ad1

File tree

8 files changed

+36
-1
lines changed

8 files changed

+36
-1
lines changed

sqlserver/assets/configuration/spec.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,17 @@ files:
197197
value:
198198
type: boolean
199199
example: false
200+
- name: include_db_fragmentation_metrics_tempdb
201+
description: |
202+
Configure the collection of database index fragmentation statistics in tempdb database from the
203+
`sys.dm_db_index_physical_stats` DMF.
204+
205+
By default, we do not collect index fragmentation statistics in the tempdb database, as those queries
206+
might cause blocking. This configuration parameter allows enabling the collection of this metric.
207+
This parameter is ignored if 'include_db_fragmentation_metrics' is set to false.
208+
value:
209+
type: boolean
210+
example: false
200211
- name: include_index_usage_metrics
201212
description: |
202213
Configure the collection of user table index usage statistics from the `sys.dm_db_index_usage_stats` DMV.

sqlserver/changelog.d/17361.added

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add a new config option include_db_fragmentation_metrics_tempdb to skip index fragmentation metrics for tempdb. By default, index fragmentation metrics are NOT be collected for tempdb.

sqlserver/datadog_checks/sqlserver/config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ def __init__(self, init_config, instance, log):
2929
self.include_index_usage_metrics_tempdb: bool = is_affirmative(
3030
instance.get('include_index_usage_metrics_tempdb', False)
3131
)
32+
self.include_db_fragmentation_metrics_tempdb: bool = is_affirmative(
33+
instance.get('include_db_fragmentation_metrics_tempdb', False)
34+
)
3235
self.ignore_missing_database = is_affirmative(instance.get("ignore_missing_database", False))
3336
if self.ignore_missing_database:
3437
self.log.warning(

sqlserver/datadog_checks/sqlserver/config_models/defaults.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ def instance_include_db_fragmentation_metrics():
6868
return False
6969

7070

71+
def instance_include_db_fragmentation_metrics_tempdb():
72+
return False
73+
74+
7175
def instance_include_fci_metrics():
7276
return False
7377

sqlserver/datadog_checks/sqlserver/config_models/instance.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ class InstanceConfig(BaseModel):
173173
ignore_missing_database: Optional[bool] = None
174174
include_ao_metrics: Optional[bool] = None
175175
include_db_fragmentation_metrics: Optional[bool] = None
176+
include_db_fragmentation_metrics_tempdb: Optional[bool] = None
176177
include_fci_metrics: Optional[bool] = None
177178
include_index_usage_metrics: Optional[bool] = None
178179
include_index_usage_metrics_tempdb: Optional[bool] = None

sqlserver/datadog_checks/sqlserver/data/conf.yaml.example

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,16 @@ instances:
188188
#
189189
# include_db_fragmentation_metrics: false
190190

191+
## @param include_db_fragmentation_metrics_tempdb - boolean - optional - default: false
192+
## Configure the collection of database index fragmentation statistics in tempdb database from the
193+
## `sys.dm_db_index_physical_stats` DMF.
194+
##
195+
## By default, we do not collect index fragmentation statistics in the tempdb database, as those queries
196+
## might cause blocking. This configuration parameter allows enabling the collection of this metric.
197+
## This parameter is ignored if 'include_db_fragmentation_metrics' is set to false.
198+
#
199+
# include_db_fragmentation_metrics_tempdb: false
200+
191201
## @param include_index_usage_metrics - boolean - optional - default: true
192202
## Configure the collection of user table index usage statistics from the `sys.dm_db_index_usage_stats` DMV.
193203
##

sqlserver/datadog_checks/sqlserver/metrics.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ class SqlDbFragmentation(BaseSqlServerMetric):
692692
"DDIPS.page_count as page_count, "
693693
"DDIPS.avg_fragmentation_in_percent as avg_fragmentation_in_percent, I.name as index_name "
694694
"FROM {table} (DB_ID('{{db}}'),null,null,null,null) as DDIPS "
695-
"INNER JOIN sys.indexes as I ON I.object_id = DDIPS.object_id "
695+
"INNER JOIN sys.indexes as I WITH (nolock) ON I.object_id = DDIPS.object_id "
696696
"AND DDIPS.index_id = I.index_id "
697697
"WHERE DDIPS.fragment_count is not null".format(table=TABLE)
698698
)
@@ -712,6 +712,7 @@ def fetch_all_values(cls, cursor, counters_list, logger, databases=None):
712712
logger.debug("%s: gathering fragmentation metrics for these databases: %s", cls.__name__, databases)
713713

714714
for db in databases:
715+
print(db)
715716
ctx = construct_use_statement(db)
716717
query = cls.QUERY_BASE.format(db=db)
717718
start = get_precise_time()
@@ -721,6 +722,7 @@ def fetch_all_values(cls, cursor, counters_list, logger, databases=None):
721722
logger.debug("%s: fetch_all executing query: %s", cls.__name__, query)
722723
cursor.execute(query)
723724
data = cursor.fetchall()
725+
print(query, data)
724726
except Exception as e:
725727
logger.warning("Error when trying to query db %s - skipping. Error: %s", db, e)
726728
continue

sqlserver/datadog_checks/sqlserver/sqlserver.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,9 @@ def _make_metric_list_to_collect(self, custom_metrics):
514514
self.instance.get('database', self.connection.DEFAULT_DATABASE)
515515
]
516516

517+
if not self._config.include_db_fragmentation_metrics_tempdb:
518+
db_names = [db_name for db_name in db_names if db_name != 'tempdb']
519+
517520
if not db_fragmentation_object_names:
518521
self.log.debug(
519522
"No fragmentation object names specified, will return fragmentation metrics for all "

0 commit comments

Comments
 (0)