Skip to content

Adding schema collection to sqlserver #17258

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 132 commits into from
Jun 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
132 commits
Select commit Hold shift + click to select a range
eacbd7f
Adding schema collection to sqlserver
kozlovb Mar 22, 2024
720aa45
rather use sys tables
kozlovb Apr 3, 2024
d2e035f
snapshot collect data
kozlovb Apr 5, 2024
f200aeb
remove unused function
kozlovb Apr 5, 2024
5b5b511
small improvments
kozlovb Apr 5, 2024
7c6e4e9
improving code
kozlovb Apr 8, 2024
c0dacf8
fixed errors
kozlovb Apr 8, 2024
c3f5be2
refactored code
kozlovb Apr 8, 2024
0b7e3fa
Introduced a function that iterates between databases
kozlovb Apr 9, 2024
b267d8f
minor changes
kozlovb Apr 9, 2024
39013ab
put in a separate class
kozlovb Apr 9, 2024
5ef0459
some clean up
kozlovb Apr 9, 2024
c4e6a74
Corrected column query
kozlovb Apr 10, 2024
541541e
added partitions count
kozlovb Apr 10, 2024
ec55910
Added foreign count
kozlovb Apr 10, 2024
593452a
Added stop
kozlovb Apr 13, 2024
a7f20c1
fixed errors
kozlovb Apr 13, 2024
d7e6ec9
fixed errors
kozlovb Apr 13, 2024
7c0b59b
removed old code
kozlovb Apr 13, 2024
300ddbb
Fixed some bugs in chunk schema collection
kozlovb Apr 15, 2024
a63c924
removed some comments
kozlovb Apr 16, 2024
41609dd
some diffs
kozlovb Apr 16, 2024
bf5cef9
working version send data in chunks
kozlovb Apr 16, 2024
ba643ed
introduced collection per tables
kozlovb Apr 16, 2024
0d6d279
Introduced a class for data submit
kozlovb Apr 17, 2024
f204f7a
pretending to be postgres for testing
kozlovb Apr 18, 2024
0f08c7f
Adopted to Postgres
kozlovb Apr 19, 2024
37962ae
adopted payload to the backend
kozlovb Apr 22, 2024
2bef067
remove breakpoints
kozlovb Apr 22, 2024
0c3f0b9
adding a test
kozlovb Apr 24, 2024
cafb6af
Put back resolved hostname
kozlovb Apr 24, 2024
8a2af6c
ficed resolved host name
kozlovb Apr 24, 2024
f150102
Fixed more resolved host name
kozlovb Apr 24, 2024
b6f096e
Imporved unit test
kozlovb Apr 24, 2024
e4e1ada
trying to add deepdiff pkg
kozlovb Apr 24, 2024
8c7a958
Fixed test to combine payloads
kozlovb Apr 24, 2024
80714f3
added deepdiff to the sqlserver hatch
kozlovb Apr 25, 2024
c1a0576
Tried to add deepdifff deferently
kozlovb Apr 25, 2024
1d9e43c
Enabled test
kozlovb Apr 25, 2024
769d155
Added a total limit of columns
kozlovb Apr 29, 2024
4ed01eb
Improved exception treatment
kozlovb Apr 29, 2024
292cb52
fixed hostname
kozlovb Apr 29, 2024
ddba122
Added Foreign key columns
kozlovb Apr 30, 2024
d3a04fc
Added Foreign key columns
kozlovb Apr 30, 2024
c3731f6
Sorted tables
kozlovb May 3, 2024
1dc10e9
add time log for individual query
kozlovb May 3, 2024
dd1f438
removed other jobs
kozlovb May 3, 2024
cf20c18
Added timestamps
kozlovb May 3, 2024
7366af8
Add more logs
kozlovb May 4, 2024
983bd9e
increase to 500
kozlovb May 4, 2024
6b591b1
removing postgres simulation
kozlovb May 6, 2024
3009c45
fix errors
kozlovb May 6, 2024
c44b8bd
added collection interval
kozlovb May 6, 2024
03858a1
Added arrays to indexes nd partitions
kozlovb May 6, 2024
5452f01
added error logs
kozlovb May 6, 2024
1b9fc98
formatted queries
kozlovb May 6, 2024
c68e849
format queries
kozlovb May 7, 2024
bcc95b1
refactored queries execution
kozlovb May 7, 2024
060eacb
improved formatting
kozlovb May 7, 2024
648914e
applied lnter
kozlovb May 7, 2024
50aa7b9
Updated test expectations
kozlovb May 7, 2024
861eef0
Removed pdb
kozlovb May 7, 2024
a24433d
Adding a changelog
kozlovb May 7, 2024
c318747
removed pdb
kozlovb May 7, 2024
0035119
Formatted
kozlovb May 7, 2024
2b2531b
removed populate
kozlovb May 7, 2024
f6cebf0
Clean up empty lines
kozlovb May 7, 2024
7261e4c
put back the driver
kozlovb May 7, 2024
c9f8e0b
put remove check
kozlovb May 7, 2024
c029d07
put back space
kozlovb May 7, 2024
75c7c34
remove space
kozlovb May 7, 2024
3426b14
reapplied linter
kozlovb May 7, 2024
f7b89ea
Improved changelog
kozlovb May 7, 2024
2209de4
Improved docs
kozlovb May 7, 2024
233ceac
improved example
kozlovb May 7, 2024
d98d1d1
corrected comment
kozlovb May 8, 2024
65d190d
added submitter unit test
kozlovb May 8, 2024
b41fa38
xchanged config
kozlovb May 10, 2024
b611a8b
Added param query
kozlovb May 10, 2024
63178b8
improved logging
kozlovb May 10, 2024
8346d3c
changelog changed
kozlovb May 13, 2024
1073f06
Added stop iteration
kozlovb May 13, 2024
04f77c9
pujt back odb
kozlovb May 13, 2024
183ce9c
Inherited from async job
kozlovb May 21, 2024
9148cb3
Added conf parameters
kozlovb May 21, 2024
e2dc3e5
Fixed unit test
kozlovb May 22, 2024
d9c1a00
removed pdb
kozlovb May 22, 2024
9b90162
Formatted comments
kozlovb May 22, 2024
220e228
Added a chnage to dbmasync
kozlovb May 22, 2024
ea42501
Update spec
kozlovb May 22, 2024
84efb89
Removed pdb
kozlovb May 22, 2024
cd1fbbd
put back driver
kozlovb May 22, 2024
9277676
fixed changelogs
kozlovb May 23, 2024
5e29818
applied linter
kozlovb May 23, 2024
8b98973
minor improvments
kozlovb Jun 3, 2024
82f2b78
fixed typo
kozlovb Jun 3, 2024
653135a
removed base change
kozlovb Jun 3, 2024
cb87df5
Moved do for db in schemas
kozlovb Jun 5, 2024
f9025a4
Improved const
kozlovb Jun 5, 2024
6b0ab43
Applied linter
kozlovb Jun 5, 2024
573554c
Improved specs
kozlovb Jun 5, 2024
ebe3894
added more tests
kozlovb Jun 6, 2024
780eefb
Improved doc
kozlovb Jun 6, 2024
b0979fc
improve variable names
kozlovb Jun 7, 2024
91df5f8
Applied linter
kozlovb Jun 7, 2024
ff93303
linter
kozlovb Jun 7, 2024
77b5017
Added test for truncation
kozlovb Jun 11, 2024
fe7e780
Add db to the message
kozlovb Jun 11, 2024
f6b2a51
Fixed unit test
kozlovb Jun 12, 2024
ca243ee
Applied linter
kozlovb Jun 12, 2024
f905214
Changed truncation msg
kozlovb Jun 12, 2024
f1be755
applied linter
kozlovb Jun 12, 2024
72c61f8
Require base package version
kozlovb Jun 13, 2024
772a90f
Removed deepdiff from ddev hatch
kozlovb Jun 18, 2024
d88bc65
resolved errors after merge
kozlovb Jun 18, 2024
ca28cc6
remove modification from base
kozlovb Jun 18, 2024
260c6ce
removed white space
kozlovb Jun 18, 2024
893875f
removed white space again
kozlovb Jun 18, 2024
2fae927
synced example
kozlovb Jun 19, 2024
a783db6
Added a license
kozlovb Jun 19, 2024
12fe2fc
Put correct date in license
kozlovb Jun 19, 2024
ae640a0
applied model sync
kozlovb Jun 19, 2024
7356165
create a dedicated test db for schemas
kozlovb Jun 19, 2024
026dd0f
applied linter
kozlovb Jun 19, 2024
3816e00
added test schema db to all envs
kozlovb Jun 19, 2024
96d1697
lint test
kozlovb Jun 19, 2024
c112f88
normalized ids
kozlovb Jun 19, 2024
f22ff21
convert to bool windows value
kozlovb Jun 19, 2024
aba611e
fix convert function
kozlovb Jun 19, 2024
272b684
fixed put back index row
kozlovb Jun 19, 2024
6819b64
Make test agnostic to order of index columns
kozlovb Jun 19, 2024
3a101e5
updated with latest ddev
kozlovb Jun 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions sqlserver/assets/configuration/spec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,30 @@ files:
type: number
example: 1800
display_default: false
- name: schemas_collection
description: |
Configure collection of schemas. If `database_autodiscovery` is not enabled, data is collected
only for the database configured with `database` parameter.
options:
- name: enabled
description: |
Enable schema collection. Requires `dbm: true`. Defaults to false.
value:
type: boolean
example: false
- name: collection_interval
description: |
Set the database schema collection interval (in seconds). Defaults to 600 seconds.
value:
type: number
example: 600
- name: max_execution_time
description: |
Set the maximum time for schema collection (in seconds). Defaults to 10 seconds.
Capped by `schemas_collection.collection_interval`
value:
type: number
example: 10
- template: instances/default
- template: logs
example:
Expand Down
2 changes: 2 additions & 0 deletions sqlserver/changelog.d/17258.added
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Adding schema collection to sqlserver
Schema data includes information about the tables, their columns, indexes, foreign keys, and partitions.
6 changes: 5 additions & 1 deletion sqlserver/datadog_checks/sqlserver/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@

from datadog_checks.base.config import is_affirmative
from datadog_checks.base.utils.common import to_native_string
from datadog_checks.sqlserver.const import DEFAULT_AUTODISCOVERY_INTERVAL, PROC_CHAR_LIMIT
from datadog_checks.sqlserver.const import (
DEFAULT_AUTODISCOVERY_INTERVAL,
PROC_CHAR_LIMIT,
)


class SQLServerConfig:
Expand Down Expand Up @@ -45,6 +48,7 @@ def __init__(self, init_config, instance, log):
self.procedure_metrics_config: dict = instance.get('procedure_metrics', {}) or {}
self.settings_config: dict = instance.get('collect_settings', {}) or {}
self.activity_config: dict = instance.get('query_activity', {}) or {}
self.schema_config: dict = instance.get('schemas_collection', {}) or {}
self.cloud_metadata: dict = {}
aws: dict = instance.get('aws', {}) or {}
gcp: dict = instance.get('gcp', {}) or {}
Expand Down
11 changes: 11 additions & 0 deletions sqlserver/datadog_checks/sqlserver/config_models/instance.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,16 @@ class QueryMetrics(BaseModel):
samples_per_hour_per_query: Optional[int] = None


class SchemasCollection(BaseModel):
model_config = ConfigDict(
arbitrary_types_allowed=True,
frozen=True,
)
collection_interval: Optional[float] = None
enabled: Optional[bool] = None
max_execution_time: Optional[float] = None


class InstanceConfig(BaseModel):
model_config = ConfigDict(
validate_default=True,
Expand Down Expand Up @@ -199,6 +209,7 @@ class InstanceConfig(BaseModel):
query_activity: Optional[QueryActivity] = None
query_metrics: Optional[QueryMetrics] = None
reported_hostname: Optional[str] = None
schemas_collection: Optional[SchemasCollection] = None
server_version: Optional[str] = None
service: Optional[str] = None
stored_procedure: Optional[str] = None
Expand Down
2 changes: 2 additions & 0 deletions sqlserver/datadog_checks/sqlserver/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,3 +268,5 @@
]

PROC_CHAR_LIMIT = 500

DEFAULT_SCHEMAS_COLLECTION_INTERVAL = 600
21 changes: 21 additions & 0 deletions sqlserver/datadog_checks/sqlserver/data/conf.yaml.example
Original file line number Diff line number Diff line change
Expand Up @@ -659,6 +659,27 @@ instances:
#
# ignore_missing_database: false

## Configure collection of schemas. If `database_autodiscovery` is not enabled, data is collected
## only for the database configured with `database` parameter.
#
# schemas_collection:

## @param enabled - boolean - optional - default: false
## Enable schema collection. Requires `dbm: true`. Defaults to false.
#
# enabled: false

## @param collection_interval - number - optional - default: 600
## Set the database schema collection interval (in seconds). Defaults to 600 seconds.
#
# collection_interval: 600

## @param max_execution_time - number - optional - default: 10
## Set the maximum time for schema collection (in seconds). Defaults to 10 seconds.
## Capped by `schemas_collection.collection_interval`
#
# max_execution_time: 10

## @param tags - list of strings - optional
## A list of tags to attach to every metric and service check emitted by this instance.
##
Expand Down
67 changes: 67 additions & 0 deletions sqlserver/datadog_checks/sqlserver/queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,73 @@
],
}

DB_QUERY = """
SELECT
db.database_id AS id, db.name AS name, db.collation_name AS collation, dp.name AS owner
FROM
sys.databases db LEFT JOIN sys.database_principals dp ON db.owner_sid = dp.sid
WHERE db.name IN ({});
"""

SCHEMA_QUERY = """
SELECT
s.name AS name, s.schema_id AS id, dp.name AS owner_name
FROM
sys.schemas AS s JOIN sys.database_principals dp ON s.principal_id = dp.principal_id
WHERE s.name NOT IN ('sys', 'information_schema')
"""

TABLES_IN_SCHEMA_QUERY = """
SELECT
object_id AS id, name
FROM
sys.tables
WHERE schema_id=?
"""

COLUMN_QUERY = """
SELECT
column_name AS name, data_type, column_default, is_nullable AS nullable , table_name, ordinal_position
FROM
information_schema.columns
WHERE
table_name IN ({}) and table_schema='{}';
"""

PARTITIONS_QUERY = """
SELECT
object_id AS id, COUNT(*) AS partition_count
FROM
sys.partitions
WHERE
object_id IN ({}) GROUP BY object_id;
"""

INDEX_QUERY = """
SELECT
i.object_id AS id, i.name, i.type, i.is_unique, i.is_primary_key, i.is_unique_constraint,
i.is_disabled, STRING_AGG(c.name, ',') AS column_names
FROM
sys.indexes i JOIN sys.index_columns ic ON i.object_id = ic.object_id
AND i.index_id = ic.index_id JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE
i.object_id IN ({}) GROUP BY i.object_id, i.name, i.type,
i.is_unique, i.is_primary_key, i.is_unique_constraint, i.is_disabled;
"""

FOREIGN_KEY_QUERY = """
SELECT
FK.referenced_object_id AS id, FK.name AS foreign_key_name,
OBJECT_NAME(FK.parent_object_id) AS referencing_table,
STRING_AGG(COL_NAME(FKC.parent_object_id, FKC.parent_column_id),',') AS referencing_column,
OBJECT_NAME(FK.referenced_object_id) AS referenced_table,
STRING_AGG(COL_NAME(FKC.referenced_object_id, FKC.referenced_column_id),',') AS referenced_column
FROM
sys.foreign_keys AS FK JOIN sys.foreign_key_columns AS FKC ON FK.object_id = FKC.constraint_object_id
WHERE
FK.referenced_object_id IN ({}) GROUP BY FK.name, FK.parent_object_id, FK.referenced_object_id;
"""


def get_query_ao_availability_groups(sqlserver_major_version):
"""
Expand Down
Loading
Loading