13
13
from datadog_checks .base .errors import CheckException
14
14
from datadog_checks .base .utils .time import get_precise_time
15
15
16
- from .utils import construct_use_statement
16
+ from .utils import construct_use_statement , is_azure_sql_database
17
17
18
18
# Queries
19
19
ALL_INSTANCES = 'ALL'
@@ -80,7 +80,7 @@ def _fetch_generic_values(cls, cursor, counters_list, logger):
80
80
return rows , columns
81
81
82
82
@classmethod
83
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
83
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
84
84
raise NotImplementedError
85
85
86
86
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -98,7 +98,7 @@ class SqlSimpleMetric(BaseSqlServerMetric):
98
98
OPERATION_NAME = 'simple_metrics'
99
99
100
100
@classmethod
101
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
101
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
102
102
return cls ._fetch_generic_values (cursor , counters_list , logger )
103
103
104
104
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -136,7 +136,7 @@ class SqlFractionMetric(BaseSqlServerMetric):
136
136
OPERATION_NAME = 'fraction_metrics'
137
137
138
138
@classmethod
139
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
139
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
140
140
placeholders = ', ' .join ('?' for _ in counters_list )
141
141
query = cls .QUERY_BASE .format (placeholders = placeholders )
142
142
@@ -257,7 +257,7 @@ class SqlOsWaitStat(BaseSqlServerMetric):
257
257
OPERATION_NAME = 'os_wait_stat_metric'
258
258
259
259
@classmethod
260
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
260
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
261
261
return cls ._fetch_generic_values (cursor , counters_list , logger )
262
262
263
263
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -289,7 +289,7 @@ class SqlIoVirtualFileStat(BaseSqlServerMetric):
289
289
OPERATION_NAME = 'io_virtual_file_stats_metrics'
290
290
291
291
@classmethod
292
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
292
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
293
293
# since we want the database name we need to update the SQL query at runtime with our custom columns
294
294
# multiple formats on a string are harmless
295
295
extra_cols = ', ' .join (col for col in counters_list )
@@ -349,7 +349,7 @@ class SqlOsMemoryClerksStat(BaseSqlServerMetric):
349
349
OPERATION_NAME = 'os_memory_clerks_stat_metrics'
350
350
351
351
@classmethod
352
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
352
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
353
353
return cls ._fetch_generic_values (cursor , counters_list , logger )
354
354
355
355
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -381,7 +381,7 @@ class SqlOsSchedulers(BaseSqlServerMetric):
381
381
OPERATION_NAME = 'os_schedulers_metrics'
382
382
383
383
@classmethod
384
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
384
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
385
385
return cls ._fetch_generic_values (cursor , None , logger )
386
386
387
387
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -418,7 +418,7 @@ class SqlOsTasks(BaseSqlServerMetric):
418
418
OPERATION_NAME = 'os_tasks_metrics'
419
419
420
420
@classmethod
421
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
421
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
422
422
return cls ._fetch_generic_values (cursor , None , logger )
423
423
424
424
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -451,7 +451,7 @@ class SqlMasterDatabaseFileStats(BaseSqlServerMetric):
451
451
OPERATION_NAME = 'master_database_file_stats_metrics'
452
452
453
453
@classmethod
454
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
454
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
455
455
return cls ._fetch_generic_values (cursor , None , logger )
456
456
457
457
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -502,7 +502,7 @@ def __init__(self, cfg_instance, base_name, report_function, column, logger):
502
502
super (SqlDatabaseFileStats , self ).__init__ (cfg_instance , base_name , report_function , column , logger )
503
503
504
504
@classmethod
505
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
505
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
506
506
# special case since this table is specific to databases, need to run query for each database instance
507
507
rows = []
508
508
columns = []
@@ -519,8 +519,10 @@ def fetch_all_values(cls, cursor, counters_list, logger, databases=None):
519
519
# use statements need to be executed separate from select queries
520
520
ctx = construct_use_statement (db )
521
521
try :
522
- logger .debug ("%s: changing cursor context via use statement: %s" , cls .__name__ , ctx )
523
- cursor .execute (ctx )
522
+ # Azure SQL DB does not allow running the USE command
523
+ if not is_azure_sql_database (engine_edition ):
524
+ logger .debug ("%s: changing cursor context via use statement: %s" , cls .__name__ , ctx )
525
+ cursor .execute (ctx )
524
526
logger .debug ("%s: fetch_all executing query: %s" , cls .__name__ , cls .QUERY_BASE )
525
527
cursor .execute (cls .QUERY_BASE )
526
528
data = cursor .fetchall ()
@@ -546,9 +548,11 @@ def fetch_all_values(cls, cursor, counters_list, logger, databases=None):
546
548
547
549
logger .debug ("%s: received %d rows and %d columns for db %s" , cls .__name__ , len (data ), len (columns ), db )
548
550
549
- # reset back to previous db
550
- logger .debug ("%s: reverting cursor context via use statement to %s" , cls .__name__ , current_db )
551
- cursor .execute (construct_use_statement (current_db ))
551
+ # Azure SQL DB does not allow running the USE command
552
+ if not is_azure_sql_database (engine_edition ):
553
+ # reset back to previous db
554
+ logger .debug ("%s: reverting cursor context via use statement to %s" , cls .__name__ , current_db )
555
+ cursor .execute (construct_use_statement (current_db ))
552
556
553
557
return rows , columns
554
558
@@ -602,7 +606,7 @@ class SqlDatabaseStats(BaseSqlServerMetric):
602
606
OPERATION_NAME = 'database_stats_metrics'
603
607
604
608
@classmethod
605
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
609
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
606
610
return cls ._fetch_generic_values (cursor , None , logger )
607
611
608
612
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -648,7 +652,7 @@ class SqlDatabaseBackup(BaseSqlServerMetric):
648
652
OPERATION_NAME = 'database_backup_metrics'
649
653
650
654
@classmethod
651
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
655
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
652
656
return cls ._fetch_generic_values (cursor , None , logger )
653
657
654
658
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -702,7 +706,7 @@ def __init__(self, cfg_instance, base_name, report_function, column, logger):
702
706
super (SqlDbFragmentation , self ).__init__ (cfg_instance , base_name , report_function , column , logger )
703
707
704
708
@classmethod
705
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
709
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
706
710
# special case to limit this query to specific databases and monitor performance
707
711
rows = []
708
712
columns = []
@@ -712,17 +716,16 @@ def fetch_all_values(cls, cursor, counters_list, logger, databases=None):
712
716
logger .debug ("%s: gathering fragmentation metrics for these databases: %s" , cls .__name__ , databases )
713
717
714
718
for db in databases :
715
- print (db )
716
719
ctx = construct_use_statement (db )
717
720
query = cls .QUERY_BASE .format (db = db )
718
721
start = get_precise_time ()
719
722
try :
720
- logger .debug ("%s: changing cursor context via use statement: %s" , cls .__name__ , ctx )
721
- cursor .execute (ctx )
723
+ if not is_azure_sql_database (engine_edition ):
724
+ logger .debug ("%s: changing cursor context via use statement: %s" , cls .__name__ , ctx )
725
+ cursor .execute (ctx )
722
726
logger .debug ("%s: fetch_all executing query: %s" , cls .__name__ , query )
723
727
cursor .execute (query )
724
728
data = cursor .fetchall ()
725
- print (query , data )
726
729
except Exception as e :
727
730
logger .warning ("Error when trying to query db %s - skipping. Error: %s" , db , e )
728
731
continue
@@ -787,7 +790,7 @@ class SqlDbReplicaStates(BaseSqlServerMetric):
787
790
OPERATION_NAME = 'db_replica_states_metrics'
788
791
789
792
@classmethod
790
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
793
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
791
794
return cls ._fetch_generic_values (cursor , None , logger )
792
795
793
796
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -842,7 +845,7 @@ class SqlAvailabilityGroups(BaseSqlServerMetric):
842
845
OPERATION_NAME = 'availability_groups_metrics'
843
846
844
847
@classmethod
845
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
848
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
846
849
return cls ._fetch_generic_values (cursor , None , logger )
847
850
848
851
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -896,7 +899,7 @@ class SqlAvailabilityReplicas(BaseSqlServerMetric):
896
899
OPERATION_NAME = 'availability_replicas_metrics'
897
900
898
901
@classmethod
899
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
902
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
900
903
return cls ._fetch_generic_values (cursor , None , logger )
901
904
902
905
def fetch_metric (self , rows , columns , values_cache = None ):
@@ -973,7 +976,7 @@ class SqlDbFileSpaceUsage(BaseSqlServerMetric):
973
976
OPERATION_NAME = 'db_file_space_usage_metrics'
974
977
975
978
@classmethod
976
- def fetch_all_values (cls , cursor , counters_list , logger , databases = None ):
979
+ def fetch_all_values (cls , cursor , counters_list , logger , databases = None , engine_edition = None ):
977
980
rows = []
978
981
columns = []
979
982
@@ -987,8 +990,9 @@ def fetch_all_values(cls, cursor, counters_list, logger, databases=None):
987
990
ctx = construct_use_statement (db )
988
991
start = get_precise_time ()
989
992
try :
990
- logger .debug ("%s: changing cursor context via use statement: %s" , cls .__name__ , ctx )
991
- cursor .execute (ctx )
993
+ if not is_azure_sql_database (engine_edition ):
994
+ logger .debug ("%s: changing cursor context via use statement: %s" , cls .__name__ , ctx )
995
+ cursor .execute (ctx )
992
996
logger .debug ("%s: fetch_all executing query: %s" , cls .__name__ , cls .QUERY_BASE )
993
997
cursor .execute (cls .QUERY_BASE )
994
998
data = cursor .fetchall ()
@@ -1007,7 +1011,7 @@ def fetch_all_values(cls, cursor, counters_list, logger, databases=None):
1007
1011
logger .debug ("%s: received %d rows for db %s, elapsed time: %.4f sec" , cls .__name__ , len (data ), db , elapsed )
1008
1012
1009
1013
# reset back to previous db
1010
- if current_db :
1014
+ if current_db and not is_azure_sql_database ( engine_edition ) :
1011
1015
logger .debug ("%s: reverting cursor context via use statement to %s" , cls .__name__ , current_db )
1012
1016
cursor .execute (construct_use_statement (current_db ))
1013
1017
0 commit comments