Skip to content

Commit

Permalink
Migrate ruleset: azure_databases
Browse files Browse the repository at this point in the history
Marked the old ruleset as deprecated and replaced it with
new metric-specific ones.

Created an update action to migrate rulesets.

CMK-20829

Change-Id: I7fcb41007e85a57b7ac72372a45c92adff170d1b
  • Loading branch information
crazyscientist committed Feb 12, 2025
1 parent 28dae44 commit f2dc191
Show file tree
Hide file tree
Showing 12 changed files with 537 additions and 62 deletions.
1 change: 1 addition & 0 deletions cmk/gui/plugins/wato/check_parameters/azure.py
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,7 @@ def _parameter_valuespec_azure_databases():
match_type="dict",
parameter_valuespec=_parameter_valuespec_azure_databases,
title=lambda: _("Azure Databases"),
is_deprecated=True,
)
)

Expand Down
86 changes: 30 additions & 56 deletions cmk/plugins/azure/agent_based/azure_databases.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
# Copyright (C) 2019 Checkmk GmbH - License: GNU General Public License v2
# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
# conditions defined in the file COPYING, which is part of this source code package.
from collections.abc import Mapping
from typing import Any

from cmk.agent_based.v2 import (
AgentSection,
check_levels,
CheckPlugin,
CheckResult,
DiscoveryResult,
Expand Down Expand Up @@ -37,9 +37,10 @@ def create_check_azure_databases_storage() -> CheckFunction:
"storage_percent",
"Storage",
render.percent,
upper_levels_param="storage_percent_levels",
upper_levels_param="storage_percent",
)
]
],
check_levels=check_levels,
)


Expand All @@ -49,13 +50,8 @@ def create_check_azure_databases_storage() -> CheckFunction:
sections=["azure_databases"],
discovery_function=create_discover_by_metrics_function("average_storage_percent"),
check_function=create_check_azure_databases_storage(),
check_ruleset_name="azure_databases",
check_default_parameters={
"storage_percent_levels": (85.0, 95.0),
"cpu_percent_levels": (85.0, 95.0),
"dtu_percent_levels": (85.0, 95.0),
"deadlocks_levels": None,
},
check_ruleset_name="azure_databases_storage",
check_default_parameters={"storage_percent": ("no_levels", None)},
)


Expand All @@ -67,9 +63,10 @@ def create_check_azure_databases_deadlock() -> CheckFunction:
"deadlocks",
"Deadlocks",
lambda x: str(x),
upper_levels_param="deadlocks_levels",
upper_levels_param="deadlocks",
)
]
],
check_levels=check_levels,
)


Expand All @@ -79,13 +76,8 @@ def create_check_azure_databases_deadlock() -> CheckFunction:
sections=["azure_databases"],
discovery_function=create_discover_by_metrics_function("average_deadlock"),
check_function=create_check_azure_databases_deadlock(),
check_ruleset_name="azure_databases",
check_default_parameters={
"storage_percent_levels": (85.0, 95.0),
"cpu_percent_levels": (85.0, 95.0),
"dtu_percent_levels": (85.0, 95.0),
"deadlocks_levels": None,
},
check_ruleset_name="azure_databases_deadlock",
check_default_parameters={"deadlocks": ("no_levels", None)},
)


Expand All @@ -97,9 +89,10 @@ def create_check_azure_databases_cpu() -> CheckFunction:
"util",
"CPU",
render.percent,
upper_levels_param="cpu_percent_levels",
upper_levels_param="cpu_percent",
)
]
],
check_levels=check_levels,
)


Expand All @@ -109,13 +102,8 @@ def create_check_azure_databases_cpu() -> CheckFunction:
sections=["azure_databases"],
discovery_function=create_discover_by_metrics_function("average_cpu_percent"),
check_function=create_check_azure_databases_cpu(),
check_ruleset_name="azure_databases",
check_default_parameters={
"storage_percent_levels": (85.0, 95.0),
"cpu_percent_levels": (85.0, 95.0),
"dtu_percent_levels": (85.0, 95.0),
"deadlocks_levels": None,
},
check_ruleset_name="azure_databases_cpu",
check_default_parameters={"cpu_percent": ("no_levels", None)},
)


Expand All @@ -127,9 +115,10 @@ def create_check_azure_databases_dtu() -> CheckFunction:
"dtu_percent",
"Database throughput units",
render.percent,
upper_levels_param="dtu_percent_levels",
upper_levels_param="dtu_percent",
)
]
],
check_levels=check_levels,
)


Expand All @@ -139,13 +128,8 @@ def create_check_azure_databases_dtu() -> CheckFunction:
sections=["azure_databases"],
discovery_function=create_discover_by_metrics_function("average_dtu_consumption_percent"),
check_function=create_check_azure_databases_dtu(),
check_ruleset_name="azure_databases",
check_default_parameters={
"storage_percent_levels": (85.0, 95.0),
"cpu_percent_levels": (85.0, 95.0),
"dtu_percent_levels": (85.0, 95.0),
"deadlocks_levels": None,
},
check_ruleset_name="azure_databases_dtu",
check_default_parameters={"dtu_percent": ("no_levels", None)},
)


Expand All @@ -157,16 +141,17 @@ def create_check_azure_databases_connections() -> CheckFunction:
"connections",
"Successful connections",
lambda x: str(x),
upper_levels_param="connections_levels",
upper_levels_param="successful_connections",
),
MetricData(
"average_connection_failed",
"connections_failed_rate",
"Failed connections",
lambda x: str(x),
upper_levels_param="connections_failed_rate_levels",
upper_levels_param="failed_connections",
),
]
],
check_levels=check_levels,
)


Expand All @@ -178,18 +163,14 @@ def create_check_azure_databases_connections() -> CheckFunction:
"average_connection_successful", "average_connection_failed"
),
check_function=create_check_azure_databases_connections(),
# TODO: Use the actual ruleset defining connection limits
check_ruleset_name="azure_databases",
check_default_parameters={
"storage_percent_levels": (85.0, 95.0),
"cpu_percent_levels": (85.0, 95.0),
"dtu_percent_levels": (85.0, 95.0),
"deadlocks_levels": None,
},
# FYI: Using explicitly None as ruleset name in order to use the factory function without
# additional modification.
check_ruleset_name=None,
check_default_parameters={},
)


def check_azure_databases(item: str, params: Mapping[str, Any], section: Section) -> CheckResult:
def check_azure_databases(item: str, section: Section) -> CheckResult:
resource = section.get(item)
if not resource:
return
Expand All @@ -213,11 +194,4 @@ def discover_azure_databases(section: Any) -> DiscoveryResult:
service_name="DB %s",
discovery_function=discover_azure_databases,
check_function=check_azure_databases,
check_ruleset_name="azure_databases",
check_default_parameters={
"storage_percent_levels": (85.0, 95.0),
"cpu_percent_levels": (85.0, 95.0),
"dtu_percent_levels": (85.0, 95.0),
"deadlocks_levels": None,
},
)
42 changes: 42 additions & 0 deletions cmk/plugins/azure/rulesets/azure_databases_cpu.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/usr/bin/env python3
# Copyright (C) 2025 Checkmk GmbH - License: GNU General Public License v2
# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
# conditions defined in the file COPYING, which is part of this source code package.
from cmk.rulesets.v1 import Help, Title
from cmk.rulesets.v1.form_specs import (
DefaultValue,
DictElement,
Dictionary,
Float,
LevelDirection,
migrate_to_float_simple_levels,
SimpleLevels,
)
from cmk.rulesets.v1.rule_specs import CheckParameters, HostAndItemCondition, Topic


def _make_form() -> Dictionary:
return Dictionary(
help_text=Help("This ruleset allows you to configure levels for the database CPU usage"),
elements={
"cpu_percent": DictElement(
required=True,
parameter_form=SimpleLevels(
title=Title("CPU"),
level_direction=LevelDirection.UPPER,
form_spec_template=Float(),
migrate=migrate_to_float_simple_levels,
prefill_fixed_levels=DefaultValue((85.0, 95.0)),
),
)
},
)


rule_spec_azure_databases_cpu = CheckParameters(
name="azure_databases_cpu",
title=Title("Azure SQL database CPU usage"),
topic=Topic.APPLICATIONS,
parameter_form=_make_form,
condition=HostAndItemCondition(item_title=Title("Database name")),
)
44 changes: 44 additions & 0 deletions cmk/plugins/azure/rulesets/azure_databases_deadlock.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#!/usr/bin/env python3
# Copyright (C) 2025 Checkmk GmbH - License: GNU General Public License v2
# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
# conditions defined in the file COPYING, which is part of this source code package.
from cmk.rulesets.v1 import Help, Title
from cmk.rulesets.v1.form_specs import (
DictElement,
Dictionary,
Float,
InputHint,
LevelDirection,
migrate_to_integer_simple_levels,
SimpleLevels,
)
from cmk.rulesets.v1.rule_specs import CheckParameters, HostAndItemCondition, Topic


def _make_form() -> Dictionary:
return Dictionary(
help_text=Help(
"This ruleset allows you to configure levels for the deadlocks in the database"
),
elements={
"deadlocks": DictElement(
required=True,
parameter_form=SimpleLevels(
title=Title("Deadlocks"),
level_direction=LevelDirection.UPPER,
form_spec_template=Float(),
migrate=migrate_to_integer_simple_levels,
prefill_fixed_levels=InputHint((10, 100)), # No default defined previously
),
)
},
)


rule_spec_azure_databases_deadlock = CheckParameters(
name="azure_databases_deadlock",
title=Title("Azure SQL database deadlocks"),
topic=Topic.APPLICATIONS,
parameter_form=_make_form,
condition=HostAndItemCondition(item_title=Title("Database name")),
)
42 changes: 42 additions & 0 deletions cmk/plugins/azure/rulesets/azure_databases_dtu.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/usr/bin/env python3
# Copyright (C) 2025 Checkmk GmbH - License: GNU General Public License v2
# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
# conditions defined in the file COPYING, which is part of this source code package.
from cmk.rulesets.v1 import Help, Title
from cmk.rulesets.v1.form_specs import (
DefaultValue,
DictElement,
Dictionary,
Float,
LevelDirection,
migrate_to_float_simple_levels,
SimpleLevels,
)
from cmk.rulesets.v1.rule_specs import CheckParameters, HostAndItemCondition, Topic


def _make_form() -> Dictionary:
return Dictionary(
help_text=Help("This ruleset allows you to configure levels for the database throughput"),
elements={
"dtu_percent": DictElement(
required=True,
parameter_form=SimpleLevels(
title=Title("Database throughput units in percent"),
level_direction=LevelDirection.UPPER,
form_spec_template=Float(),
migrate=migrate_to_float_simple_levels,
prefill_fixed_levels=DefaultValue((40.0, 50.0)),
),
)
},
)


rule_spec_azure_databases_dtu = CheckParameters(
name="azure_databases_dtu",
title=Title("Azure SQL database throughput"),
topic=Topic.APPLICATIONS,
parameter_form=_make_form,
condition=HostAndItemCondition(item_title=Title("Database name")),
)
44 changes: 44 additions & 0 deletions cmk/plugins/azure/rulesets/azure_databases_storage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#!/usr/bin/env python3
# Copyright (C) 2025 Checkmk GmbH - License: GNU General Public License v2
# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
# conditions defined in the file COPYING, which is part of this source code package.
from cmk.rulesets.v1 import Help, Title
from cmk.rulesets.v1.form_specs import (
DefaultValue,
DictElement,
Dictionary,
Float,
LevelDirection,
migrate_to_float_simple_levels,
SimpleLevels,
)
from cmk.rulesets.v1.rule_specs import CheckParameters, HostAndItemCondition, Topic


def _make_form() -> Dictionary:
return Dictionary(
help_text=Help(
"This ruleset allows you to configure levels for the used storage space in percent"
),
elements={
"storage_percent": DictElement(
required=True,
parameter_form=SimpleLevels(
title=Title("Used storage"),
level_direction=LevelDirection.UPPER,
form_spec_template=Float(unit_symbol="%"),
migrate=migrate_to_float_simple_levels,
prefill_fixed_levels=DefaultValue((85.0, 95.0)),
),
)
},
)


rule_spec_azure_databases_storage = CheckParameters(
name="azure_databases_storage",
title=Title("Azure SQL database storage"),
topic=Topic.APPLICATIONS,
parameter_form=_make_form,
condition=HostAndItemCondition(item_title=Title("Database name")),
)
27 changes: 27 additions & 0 deletions cmk/update_config/plugins/actions/azure_databases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/usr/bin/env python3
# Copyright (C) 2025 Checkmk GmbH - License: GNU General Public License v2
# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
# conditions defined in the file COPYING, which is part of this source code package.
from logging import Logger

from cmk.gui.watolib.rulesets import AllRulesets

from cmk.update_config.plugins.lib.azure_databases import AzureDatabaseMigration
from cmk.update_config.registry import update_action_registry, UpdateAction


class MigrateAzureDatabases(UpdateAction):
def __call__(self, logger: Logger) -> None:
migration = AzureDatabaseMigration(
logger=logger, all_rulesets=AllRulesets.load_all_rulesets()
)
for error in migration:
pass
migration.all_rulesets.save()


update_action_registry.register(
# Sort index is chosen such that this action is executed before "rulesets".
# But this is only a weak requirement.
MigrateAzureDatabases(name="azure-databases", title="Migrate Azure Databases", sort_index=29)
)
Loading

0 comments on commit f2dc191

Please sign in to comment.