Skip to content

Commit b88da59

Browse files
bragi92Copilot
andcommitted
[AKS] Add --enable-control-plane-metrics and --disable-control-plane-metrics for Managed Prometheus
Add CLI support for the ManagedClusterAzureMonitorProfileMetricsControlPlane feature, which enables collection of control plane component metrics (kube-apiserver, etcd, etc.) via the Azure Managed Prometheus addon. Changes: - Add --enable-control-plane-metrics param for aks create and update - Add --disable-control-plane-metrics param for aks create and update - Add getter/validator methods with mutual exclusivity checks - Add validation: control plane metrics flags require --enable-azure-monitor-metrics or that Azure Monitor Metrics is already enabled on the cluster - Wire control_plane into set_up/update_azure_monitor_profile decorators - Add help text for all new parameters Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent adb7895 commit b88da59

4 files changed

Lines changed: 123 additions & 0 deletions

File tree

src/azure-cli/azure/cli/command_modules/acs/_help.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,12 @@
534534
- name: --enable-windows-recording-rules
535535
type: bool
536536
short-summary: Enable Windows Recording Rules when enabling the Azure Monitor Metrics addon
537+
- name: --enable-control-plane-metrics
538+
type: bool
539+
short-summary: Enable collection of control plane metrics for the Azure Managed Prometheus addon. Configures collection of operational runtime metrics from managed control plane components (kube-apiserver, etcd, etc). See aka.ms/aks/controlplane-metrics for details. Must be used with --enable-azure-monitor-metrics.
540+
- name: --disable-control-plane-metrics
541+
type: bool
542+
short-summary: Disable collection of control plane metrics for the Azure Managed Prometheus addon.
537543
- name: --nodepool-taints
538544
type: string
539545
short-summary: The node taints for all node pool.
@@ -1063,6 +1069,12 @@
10631069
- name: --disable-azure-monitor-metrics
10641070
type: bool
10651071
short-summary: Disable Azure Monitor Metrics Profile. This will delete all DCRA's associated with the cluster, any linked DCRs with the data stream = prometheus-stream and the recording rule groups created by the addon for this AKS cluster.
1072+
- name: --enable-control-plane-metrics
1073+
type: bool
1074+
short-summary: Enable collection of control plane metrics for the Azure Managed Prometheus addon. Configures collection of operational runtime metrics from managed control plane components (kube-apiserver, etcd, etc). See aka.ms/aks/controlplane-metrics for details.
1075+
- name: --disable-control-plane-metrics
1076+
type: bool
1077+
short-summary: Disable collection of control plane metrics for the Azure Managed Prometheus addon.
10661078
- name: --nodepool-taints
10671079
type: string
10681080
short-summary: The node taints for all node pool.

src/azure-cli/azure/cli/command_modules/acs/_params.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,8 @@ def load_arguments(self, _):
568568
c.argument('ksm_metric_annotations_allow_list')
569569
c.argument('grafana_resource_id', validator=validate_grafanaresourceid)
570570
c.argument('enable_windows_recording_rules', action='store_true')
571+
c.argument('enable_control_plane_metrics', action='store_true')
572+
c.argument('disable_control_plane_metrics', action='store_true')
571573
c.argument('node_public_ip_tags', arg_type=tags_type, validator=validate_node_public_ip_tags,
572574
help='space-separated tags: key[=value] [key[=value] ...].')
573575
# azure container storage
@@ -795,6 +797,8 @@ def load_arguments(self, _):
795797
c.argument('grafana_resource_id', validator=validate_grafanaresourceid)
796798
c.argument('enable_windows_recording_rules', action='store_true')
797799
c.argument('disable_azure_monitor_metrics', action='store_true')
800+
c.argument('enable_control_plane_metrics', action='store_true')
801+
c.argument('disable_control_plane_metrics', action='store_true')
798802
# azure container storage
799803
c.argument(
800804
"enable_azure_container_storage",

src/azure-cli/azure/cli/command_modules/acs/custom.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,8 @@ def aks_create(
10081008
ksm_metric_annotations_allow_list=None,
10091009
grafana_resource_id=None,
10101010
enable_windows_recording_rules=False,
1011+
enable_control_plane_metrics=False,
1012+
disable_control_plane_metrics=False,
10111013
# azure container storage
10121014
enable_azure_container_storage=None,
10131015
container_storage_version=None,
@@ -1200,6 +1202,8 @@ def aks_update(
12001202
grafana_resource_id=None,
12011203
enable_windows_recording_rules=False,
12021204
disable_azure_monitor_metrics=False,
1205+
enable_control_plane_metrics=False,
1206+
disable_control_plane_metrics=False,
12031207
# azure container storage
12041208
enable_azure_container_storage=None,
12051209
disable_azure_container_storage=None,

src/azure-cli/azure/cli/command_modules/acs/managed_cluster_decorator.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5762,6 +5762,91 @@ def get_disable_azure_monitor_metrics(self) -> bool:
57625762
"""
57635763
return self._get_disable_azure_monitor_metrics(enable_validation=True)
57645764

5765+
def _get_enable_control_plane_metrics(self, enable_validation: bool = False) -> bool:
5766+
"""Internal function to obtain the value of enable_control_plane_metrics.
5767+
5768+
:return: bool
5769+
"""
5770+
enable_control_plane_metrics = self.raw_param.get("enable_control_plane_metrics")
5771+
if enable_validation:
5772+
if enable_control_plane_metrics and self._get_disable_control_plane_metrics(False):
5773+
raise MutuallyExclusiveArgumentError(
5774+
"Cannot specify --enable-control-plane-metrics and "
5775+
"--disable-control-plane-metrics at the same time"
5776+
)
5777+
if enable_control_plane_metrics:
5778+
# In create mode, --enable-azure-monitor-metrics must be specified
5779+
if self.decorator_mode == DecoratorMode.CREATE:
5780+
if not self._get_enable_azure_monitor_metrics(False):
5781+
raise RequiredArgumentMissingError(
5782+
"--enable-control-plane-metrics cannot be used as a standalone flag. "
5783+
"This flag must be used in conjunction with --enable-azure-monitor-metrics "
5784+
"to enable control plane metrics collection. "
5785+
"Usage: az aks create --enable-azure-monitor-metrics --name <cluster-name> "
5786+
"--resource-group <cluster-resource-group> --enable-control-plane-metrics"
5787+
)
5788+
# In update mode, azure monitor metrics must already be enabled on the cluster or being enabled now
5789+
if self.decorator_mode == DecoratorMode.UPDATE:
5790+
is_metrics_enabled = (
5791+
self.mc and
5792+
hasattr(self.mc, "azure_monitor_profile") and
5793+
self.mc.azure_monitor_profile and
5794+
self.mc.azure_monitor_profile.metrics and
5795+
getattr(self.mc.azure_monitor_profile.metrics, "enabled", False)
5796+
)
5797+
if not self._get_enable_azure_monitor_metrics(False) and not is_metrics_enabled:
5798+
raise RequiredArgumentMissingError(
5799+
"--enable-control-plane-metrics cannot be used as a standalone flag. "
5800+
"This flag must be used in conjunction with --enable-azure-monitor-metrics "
5801+
"to enable control plane metrics collection, or Azure Monitor Metrics must "
5802+
"already be enabled on the cluster. "
5803+
"Usage: az aks update --enable-azure-monitor-metrics --name <cluster-name> "
5804+
"--resource-group <cluster-resource-group> --enable-control-plane-metrics"
5805+
)
5806+
return enable_control_plane_metrics
5807+
5808+
def get_enable_control_plane_metrics(self) -> bool:
5809+
"""Obtain the value of enable_control_plane_metrics.
5810+
5811+
:return: bool
5812+
"""
5813+
return self._get_enable_control_plane_metrics(enable_validation=True)
5814+
5815+
def _get_disable_control_plane_metrics(self, enable_validation: bool = False) -> bool:
5816+
"""Internal function to obtain the value of disable_control_plane_metrics.
5817+
5818+
:return: bool
5819+
"""
5820+
disable_control_plane_metrics = self.raw_param.get("disable_control_plane_metrics")
5821+
if enable_validation:
5822+
if disable_control_plane_metrics and self._get_enable_control_plane_metrics(False):
5823+
raise MutuallyExclusiveArgumentError(
5824+
"Cannot specify --enable-control-plane-metrics and "
5825+
"--disable-control-plane-metrics at the same time"
5826+
)
5827+
if disable_control_plane_metrics:
5828+
# Control plane metrics can only be disabled if azure monitor metrics is enabled
5829+
is_metrics_enabled = (
5830+
self.mc and
5831+
hasattr(self.mc, "azure_monitor_profile") and
5832+
self.mc.azure_monitor_profile and
5833+
self.mc.azure_monitor_profile.metrics and
5834+
getattr(self.mc.azure_monitor_profile.metrics, "enabled", False)
5835+
)
5836+
if not self._get_enable_azure_monitor_metrics(False) and not is_metrics_enabled:
5837+
raise RequiredArgumentMissingError(
5838+
"--disable-control-plane-metrics requires Azure Monitor Metrics to be enabled "
5839+
"on the cluster. Enable it first with --enable-azure-monitor-metrics."
5840+
)
5841+
return disable_control_plane_metrics
5842+
5843+
def get_disable_control_plane_metrics(self) -> bool:
5844+
"""Obtain the value of disable_control_plane_metrics.
5845+
5846+
:return: bool
5847+
"""
5848+
return self._get_disable_control_plane_metrics(enable_validation=True)
5849+
57655850
def _get_enable_vpa(self, enable_validation: bool = False) -> bool:
57665851
"""Internal function to obtain the value of enable_vpa.
57675852
This function supports the option of enable_vpa. When enabled, if both enable_vpa and enable_vpa are
@@ -7328,6 +7413,13 @@ def set_up_azure_monitor_profile(self, mc: ManagedCluster) -> ManagedCluster:
73287413
mc.azure_monitor_profile.metrics.kube_state_metrics = self.models.ManagedClusterAzureMonitorProfileKubeStateMetrics( # pylint:disable=line-too-long
73297414
metric_labels_allowlist=str(ksm_metric_labels_allow_list),
73307415
metric_annotations_allow_list=str(ksm_metric_annotations_allow_list))
7416+
# set up control plane metrics if requested
7417+
enable_control_plane_metrics = self.context.raw_param.get("enable_control_plane_metrics")
7418+
disable_control_plane_metrics = self.context.raw_param.get("disable_control_plane_metrics")
7419+
if enable_control_plane_metrics:
7420+
mc.azure_monitor_profile.metrics.control_plane = self.models.ManagedClusterAzureMonitorProfileMetricsControlPlane(enabled=True) # pylint:disable=line-too-long
7421+
elif disable_control_plane_metrics:
7422+
mc.azure_monitor_profile.metrics.control_plane = self.models.ManagedClusterAzureMonitorProfileMetricsControlPlane(enabled=False) # pylint:disable=line-too-long
73317423
# set intermediate
73327424
self.context.set_intermediate("azuremonitormetrics_addon_enabled", True, overwrite_exists=True)
73337425
return mc
@@ -9269,6 +9361,17 @@ def update_azure_monitor_profile(self, mc: ManagedCluster) -> ManagedCluster:
92699361
mc.azure_monitor_profile = self.models.ManagedClusterAzureMonitorProfile()
92709362
mc.azure_monitor_profile.metrics = self.models.ManagedClusterAzureMonitorProfileMetrics(enabled=False)
92719363

9364+
# handle control plane metrics enable/disable independently
9365+
enable_control_plane_metrics = self.context.get_enable_control_plane_metrics()
9366+
disable_control_plane_metrics = self.context.get_disable_control_plane_metrics()
9367+
if enable_control_plane_metrics or disable_control_plane_metrics:
9368+
if mc.azure_monitor_profile is None:
9369+
mc.azure_monitor_profile = self.models.ManagedClusterAzureMonitorProfile()
9370+
if mc.azure_monitor_profile.metrics is None:
9371+
mc.azure_monitor_profile.metrics = self.models.ManagedClusterAzureMonitorProfileMetrics(enabled=True)
9372+
mc.azure_monitor_profile.metrics.control_plane = self.models.ManagedClusterAzureMonitorProfileMetricsControlPlane( # pylint:disable=line-too-long
9373+
enabled=bool(enable_control_plane_metrics))
9374+
92729375
if (
92739376
self.context.raw_param.get("enable_azure_monitor_metrics") or
92749377
self.context.raw_param.get("disable_azure_monitor_metrics")

0 commit comments

Comments
 (0)