Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
c88a6d2
initial changes
gracewehner Sep 9, 2025
44176aa
linting
gracewehner Sep 9, 2025
f604862
more lint fixes
gracewehner Sep 9, 2025
a97b5a4
linter 3
gracewehner Sep 9, 2025
03ef05d
linter 4
gracewehner Sep 9, 2025
a52af6e
style
gracewehner Sep 9, 2025
130846a
style 2
gracewehner Sep 9, 2025
db56151
style 3
gracewehner Sep 10, 2025
7dbf857
style 3
gracewehner Sep 10, 2025
e808691
style 4
gracewehner Sep 10, 2025
ddbb008
final linter
gracewehner Sep 10, 2025
e4667fa
cleanup
gracewehner Sep 18, 2025
d2d039c
more cleanup
gracewehner Sep 18, 2025
955d9e5
Merge branch 'main' into grwehner/otlp-preview
gracewehner Sep 18, 2025
f23320c
update version
gracewehner Sep 18, 2025
72326d7
azure-monitor-logs command
gracewehner Sep 25, 2025
24ae90f
fix disable
gracewehner Sep 30, 2025
07610a9
fixes
gracewehner Sep 30, 2025
7aae185
view diff
gracewehner Oct 1, 2025
47eabbc
feedback
gracewehner Oct 2, 2025
c12f04e
debugging
gracewehner Oct 3, 2025
0a52309
fix msi auth and http request header
gracewehner Oct 3, 2025
3962664
final fixes and all tests
gracewehner Oct 7, 2025
b6f831f
fix for live
gracewehner Oct 7, 2025
c44f8e7
fix issues
gracewehner Oct 7, 2025
63970d4
try with different file format
gracewehner Oct 7, 2025
f6b4753
linting
gracewehner Oct 7, 2025
9e20795
fix live tests to use preview flag
gracewehner Oct 7, 2025
4f235dc
linter
gracewehner Oct 7, 2025
a319963
test faillure fixes
gracewehner Oct 7, 2025
854dcc3
Merge remote-tracking branch 'upstream/main' into grwehner/otlp-preview
gracewehner Oct 7, 2025
7fa57b0
cleanup
gracewehner Oct 7, 2025
077b4b8
remove unecessary changes
gracewehner Oct 7, 2025
da23c9b
linter
gracewehner Oct 7, 2025
652855b
pass all tests
gracewehner Oct 7, 2025
48fee49
fix msi issue
gracewehner Oct 7, 2025
ecbe7a5
more linter
gracewehner Oct 7, 2025
3b71c30
revert custom changes
gracewehner Oct 8, 2025
f64ca84
fix test waiting
gracewehner Oct 8, 2025
48ed2e3
fix all commands to have a wait
gracewehner Oct 8, 2025
6f473c0
Merge remote-tracking branch 'upstream/main' into grwehner/otlp-preview
gracewehner Oct 8, 2025
d89275a
cleanup
gracewehner Oct 8, 2025
d22877d
style
gracewehner Oct 8, 2025
a2ef834
debug logging for one live test failing
gracewehner Oct 8, 2025
efeab66
remove debug logs
gracewehner Oct 8, 2025
ac774fa
linter
gracewehner Oct 8, 2025
c5f78c9
feedback
gracewehner Oct 10, 2025
2ba98d8
add extra waiting to tests
gracewehner Oct 10, 2025
67bb6fd
fix syntax
gracewehner Oct 10, 2025
19909b6
fixes
gracewehner Oct 10, 2025
4856eb0
more live test cleanup
gracewehner Oct 10, 2025
6259ba8
try to fix flaky tests
gracewehner Oct 10, 2025
48d7107
check if timing out
gracewehner Oct 10, 2025
58c52ff
last flaky test
gracewehner Oct 10, 2025
c81b044
flaky test check
gracewehner Oct 10, 2025
54de667
more debugging
gracewehner Oct 10, 2025
9a48fe1
test
gracewehner Oct 10, 2025
7ea6673
test
gracewehner Oct 10, 2025
42f2556
test
gracewehner Oct 11, 2025
711f66d
test
gracewehner Oct 11, 2025
97776a6
remove all debug logs
gracewehner Oct 13, 2025
536720b
linter
gracewehner Oct 13, 2025
99b5a17
Merge branch 'main' into grwehner/otlp-preview
gracewehner Oct 13, 2025
25faecc
remove last debug logs
gracewehner Oct 14, 2025
7e5676a
Merge branch 'main' into grwehner/otlp-preview
FumingZhang Oct 15, 2025
ec9d69e
Update src/aks-preview/HISTORY.rst
FumingZhang Oct 15, 2025
73db626
fix history.rst
gracewehner Oct 15, 2025
c3ff29b
account for portal using camelcase for omsagent
gracewehner Oct 15, 2025
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
65 changes: 65 additions & 0 deletions src/aks-preview/azext_aks_preview/_help.py
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,27 @@
- name: --enable-azure-monitor-app-monitoring
type: bool
short-summary: Enable Azure Monitor Application Monitoring
- name: --enable-azure-monitor-logs
type: bool
short-summary: Enable Azure Monitor logs collection (equivalent to enabling the monitoring addon)
- name: --enable-opentelemetry-metrics
type: bool
short-summary: Enable OpenTelemetry metrics collection. Requires Azure Monitor metrics to be enabled.
- name: --opentelemetry-metrics-port
type: int
short-summary: Port for OpenTelemetry metrics collection (default port will be used if not specified)
- name: --disable-opentelemetry-metrics
type: bool
short-summary: Disable OpenTelemetry metrics collection
- name: --enable-opentelemetry-logs
type: bool
short-summary: Enable OpenTelemetry logs collection. Requires Azure Monitor logs to be enabled.
- name: --opentelemetry-logs-port
type: int
short-summary: Port for OpenTelemetry logs collection (default port will be used if not specified)
- name: --disable-opentelemetry-logs
type: bool
short-summary: Disable OpenTelemetry logs collection
- name: --nodepool-labels
type: string
short-summary: The node labels for all node pools in this cluster. See https://aka.ms/node-labels for syntax of labels.
Expand Down Expand Up @@ -739,6 +760,14 @@
text: az aks create -g MyResourceGroup -n MyManagedCluster --enable-azuremonitormetrics
- name: Create a kubernetes cluster with Azure Monitor App Monitoring enabled
text: az aks create -g MyResourceGroup -n MyManagedCluster --enable-azure-monitor-app-monitoring
- name: Create a kubernetes cluster with OpenTelemetry metrics collection enabled
text: az aks create -g MyResourceGroup -n MyManagedCluster --enable-opentelemetry-metrics --enable-azuremonitormetrics
- name: Create a kubernetes cluster with OpenTelemetry logs collection enabled
text: az aks create -g MyResourceGroup -n MyManagedCluster --enable-opentelemetry-logs --enable-addons monitoring
- name: Create a kubernetes cluster with OpenTelemetry metrics on custom port
text: az aks create -g MyResourceGroup -n MyManagedCluster --enable-opentelemetry-metrics --opentelemetry-metrics-port 8888 --enable-azuremonitormetrics
- name: Create a kubernetes cluster with OpenTelemetry logs on custom port
text: az aks create -g MyResourceGroup -n MyManagedCluster --enable-opentelemetry-logs --opentelemetry-logs-port 4317 --enable-addons monitoring
- name: Create a kubernetes cluster with a nodepool having ip allocation mode set to "StaticBlock"
text: az aks create -g MyResourceGroup -n MyManagedCluster --os-sku Ubuntu --max-pods MaxPodsPerNode --network-plugin azure --vnet-subnet-id /subscriptions/00000/resourceGroups/AnotherResourceGroup/providers/Microsoft.Network/virtualNetworks/MyVnet/subnets/NodeSubnet --pod-subnet-id /subscriptions/00000/resourceGroups/AnotherResourceGroup/providers/Microsoft.Network/virtualNetworks/MyVnet/subnets/PodSubnet --pod-ip-allocation-mode StaticBlock
- name: Create a kubernetes cluster with a VirtualMachines nodepool
Expand Down Expand Up @@ -1182,6 +1211,30 @@
- name: --disable-azure-monitor-app-monitoring
type: bool
short-summary: Disable Azure Monitor Application Monitoring
- name: --enable-azure-monitor-logs
type: bool
short-summary: Enable Azure Monitor logs collection (equivalent to enabling the monitoring addon)
- name: --disable-azure-monitor-logs
type: bool
short-summary: Disable Azure Monitor logs collection (equivalent to disabling the monitoring addon)
- name: --enable-opentelemetry-metrics
type: bool
short-summary: Enable OpenTelemetry metrics collection. Requires Azure Monitor metrics to be enabled.
- name: --opentelemetry-metrics-port
type: int
short-summary: Port for OpenTelemetry metrics collection (default port will be used if not specified)
- name: --disable-opentelemetry-metrics
type: bool
short-summary: Disable OpenTelemetry metrics collection
- name: --enable-opentelemetry-logs
type: bool
short-summary: Enable OpenTelemetry logs collection. Requires Azure Monitor logs to be enabled.
- name: --opentelemetry-logs-port
type: int
short-summary: Port for OpenTelemetry logs collection (default port will be used if not specified)
- name: --disable-opentelemetry-logs
type: bool
short-summary: Disable OpenTelemetry logs collection
- name: --enable-private-cluster
type: bool
short-summary: Enable private cluster for apiserver vnet integration cluster.
Expand Down Expand Up @@ -1376,6 +1429,18 @@
text: az aks update -g MyResourceGroup -n MyManagedCluster --safeguards-level Warning --safeguards-excluded-ns ns1,ns2
- name: Update a kubernetes cluster to clear any namespaces excluded from safeguards. Assumes azure policy addon is already enabled
text: az aks update -g MyResourceGroup -n MyManagedCluster --safeguards-excluded-ns ""
- name: Enable OpenTelemetry metrics collection on an existing cluster
text: az aks update -g MyResourceGroup -n MyManagedCluster --enable-opentelemetry-metrics
- name: Enable OpenTelemetry logs collection on an existing cluster
text: az aks update -g MyResourceGroup -n MyManagedCluster --enable-opentelemetry-logs
- name: Configure OpenTelemetry metrics with custom port
text: az aks update -g MyResourceGroup -n MyManagedCluster --enable-opentelemetry-metrics --opentelemetry-metrics-port 8888
- name: Configure OpenTelemetry logs with custom port
text: az aks update -g MyResourceGroup -n MyManagedCluster --enable-opentelemetry-logs --opentelemetry-logs-port 4317
- name: Disable OpenTelemetry metrics collection on an existing cluster
text: az aks update -g MyResourceGroup -n MyManagedCluster --disable-opentelemetry-metrics
- name: Disable OpenTelemetry logs collection on an existing cluster
text: az aks update -g MyResourceGroup -n MyManagedCluster --disable-opentelemetry-logs
"""

helps['aks kollect'] = """
Expand Down
107 changes: 100 additions & 7 deletions src/aks-preview/azext_aks_preview/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@
validate_assign_kubelet_identity,
validate_azure_keyvault_kms_key_id,
validate_azure_keyvault_kms_key_vault_resource_id,
validate_azure_monitor_and_opentelemetry_for_create,
validate_azure_monitor_and_opentelemetry_for_update,
validate_azuremonitorworkspaceresourceid,
validate_cluster_id,
validate_cluster_snapshot_id,
Expand Down Expand Up @@ -985,7 +987,6 @@ def load_arguments(self, _):
hide=True,
),
)
c.argument("enable_azure_monitor_metrics", action="store_true")
c.argument(
"azure_monitor_workspace_resource_id",
validator=validate_azuremonitorworkspaceresourceid,
Expand All @@ -994,9 +995,56 @@ def load_arguments(self, _):
c.argument("ksm_metric_annotations_allow_list")
c.argument("grafana_resource_id", validator=validate_grafanaresourceid)
c.argument("enable_windows_recording_rules", action="store_true")
c.argument("enable_azure_monitor_app_monitoring", is_preview=True, action="store_true")
c.argument("enable_cost_analysis", action="store_true")
c.argument('enable_ai_toolchain_operator', is_preview=True, action='store_true')
c.argument("enable_azure_monitor_app_monitoring",
options_list=["--enable-azure-monitor-app-monitoring", "--enable-app-mon"],
is_preview=True,
action="store_true"
)
# OpenTelemetry parameters
c.argument("enable_opentelemetry_metrics",
options_list=["--enable-opentelemetry-metrics", "--enable-otel-metrics"],
is_preview=True,
action="store_true",
help="Enable OpenTelemetry metrics collection",
validator=validate_azure_monitor_and_opentelemetry_for_create
)
c.argument("opentelemetry_metrics_port",
options_list=["--opentelemetry-metrics-port", "--otel-metrics-port"],
is_preview=True,
type=int,
help="Port for OpenTelemetry metrics collection"
)
c.argument("disable_opentelemetry_metrics",
options_list=["--disable-opentelemetry-metrics", "--disable-otel-metrics"],
is_preview=True,
action="store_true",
help="Disable OpenTelemetry metrics collection"
)
c.argument("enable_opentelemetry_logs",
options_list=["--enable-opentelemetry-logs", "--enable-otel-logs"],
is_preview=True,
action="store_true",
help="Enable OpenTelemetry logs collection"
)
c.argument("opentelemetry_logs_port",
options_list=["--opentelemetry-logs-port", "--otel-logs-port", "--otlp-port"],
is_preview=True,
type=int,
help="Port for OpenTelemetry logs collection"
)
c.argument("disable_opentelemetry_logs",
options_list=["--disable-opentelemetry-logs", "--disable-otel-logs"],
is_preview=True,
action="store_true",
help="Disable OpenTelemetry logs collection"
)
c.argument("enable_cost_analysis",
action="store_true"
)
c.argument("enable_ai_toolchain_operator",
is_preview=True,
action="store_true"
)
# azure container storage
c.argument(
"enable_azure_container_storage",
Expand Down Expand Up @@ -1359,9 +1407,54 @@ def load_arguments(self, _):
hide=True,
),
)
c.argument("disable_azure_monitor_metrics", action="store_true")
c.argument("enable_azure_monitor_app_monitoring", action="store_true", is_preview=True)
c.argument("disable_azure_monitor_app_monitoring", action="store_true", is_preview=True)
c.argument("enable_azure_monitor_app_monitoring",
options_list=["--enable-azure-monitor-app-monitoring", "--enable-app-mon"],
action="store_true",
is_preview=True
)
c.argument("disable_azure_monitor_app_monitoring",
options_list=["--disable-azure-monitor-app-monitoring", "--disable-app-mon"],
action="store_true",
is_preview=True
)
# OpenTelemetry parameters
c.argument("enable_opentelemetry_metrics",
options_list=["--enable-opentelemetry-metrics", "--enable-otel-metrics"],
is_preview=True,
action="store_true",
help="Enable OpenTelemetry metrics collection",
validator=validate_azure_monitor_and_opentelemetry_for_update
)
c.argument("opentelemetry_metrics_port",
options_list=["--opentelemetry-metrics-port", "--otel-metrics-port"],
is_preview=True,
type=int,
help="Port for OpenTelemetry metrics collection"
)
c.argument("disable_opentelemetry_metrics",
options_list=["--disable-opentelemetry-metrics", "--disable-otel-metrics"],
is_preview=True,
action="store_true",
help="Disable OpenTelemetry metrics collection"
)
c.argument("enable_opentelemetry_logs",
options_list=["--enable-opentelemetry-logs", "--enable-otel-logs"],
is_preview=True,
action="store_true",
help="Enable OpenTelemetry logs collection"
)
c.argument("opentelemetry_logs_port",
options_list=["--opentelemetry-logs-port", "--otel-logs-port", "--otlp-port"],
is_preview=True,
type=int,
help="Port for OpenTelemetry logs collection"
)
c.argument("disable_opentelemetry_logs",
options_list=["--disable-opentelemetry-logs", "--disable-otel-logs"],
is_preview=True,
action="store_true",
help="Disable OpenTelemetry logs collection"
)
c.argument(
"enable_vpa",
action="store_true",
Expand Down
112 changes: 112 additions & 0 deletions src/aks-preview/azext_aks_preview/_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -972,3 +972,115 @@ def validate_location_resource_group_cluster_parameters(namespace):
raise MutuallyExclusiveArgumentError(
"Cannot specify --location and --resource-group and --cluster at the same time."
)


def validate_opentelemetry_ports(namespace):
"""Validate that OpenTelemetry metrics and logs ports don't conflict."""
metrics_port = getattr(namespace, 'opentelemetry_metrics_port', None)
logs_port = getattr(namespace, 'opentelemetry_logs_port', None)

# Check if both ports are specified and are the same
if metrics_port is not None and logs_port is not None and metrics_port == logs_port:
raise ArgumentUsageError(
"OpenTelemetry metrics port and logs port cannot be the same. "
"Please specify different ports for --opentelemetry-metrics-port and --opentelemetry-logs-port."
)

# Validate port ranges
for port, port_name in [(metrics_port, 'metrics'), (logs_port, 'logs')]:
if port is not None and not (1 <= port <= 65535):
raise ArgumentUsageError(
f"OpenTelemetry {port_name} port must be between 1 and 65535, got {port}."
)


def validate_opentelemetry_metrics_dependencies(namespace):
"""Validate OpenTelemetry metrics dependencies for create operations."""
enable_otlp_metrics = getattr(namespace, 'enable_opentelemetry_metrics', False)
disable_otlp_metrics = getattr(namespace, 'disable_opentelemetry_metrics', False)
# Try both new and deprecated parameter names for Azure Monitor metrics
enable_azure_monitor_metrics = getattr(namespace, 'enable_azure_monitor_metrics', False)
enable_azuremonitormetrics = getattr(namespace, 'enable_azuremonitormetrics', False) # deprecated flag

# Check mutual exclusion
if enable_otlp_metrics and disable_otlp_metrics:
raise MutuallyExclusiveArgumentError(
"Cannot specify both --enable-opentelemetry-metrics and --disable-opentelemetry-metrics at the same time."
)

# Check if trying to enable OTLP metrics without Azure Monitor metrics
# For create operations, require explicit Azure Monitor enablement
azure_monitor_enabled_via_params = enable_azure_monitor_metrics or enable_azuremonitormetrics

if enable_otlp_metrics and not azure_monitor_enabled_via_params:
raise ArgumentUsageError(
"OpenTelemetry metrics requires Azure Monitor metrics to be enabled. "
"Please add --enable-azure-monitor-metrics or --enable-azuremonitormetrics to your command."
)


def validate_opentelemetry_metrics_dependencies_for_update(namespace):
"""Validate OpenTelemetry metrics dependencies for update operations."""
enable_otlp_metrics = getattr(namespace, 'enable_opentelemetry_metrics', False)
disable_otlp_metrics = getattr(namespace, 'disable_opentelemetry_metrics', False)

# Check mutual exclusion
if enable_otlp_metrics and disable_otlp_metrics:
raise MutuallyExclusiveArgumentError(
"Cannot specify both --enable-opentelemetry-metrics and --disable-opentelemetry-metrics at the same time."
)

# For update operations, validation is deferred to the decorator where we have access
# to the cluster's Azure Monitor profile


def validate_opentelemetry_logs_dependencies(namespace):
"""Validate OpenTelemetry logs dependencies for create operations."""
enable_otlp_logs = getattr(namespace, 'enable_opentelemetry_logs', False)
disable_otlp_logs = getattr(namespace, 'disable_opentelemetry_logs', False)
# Azure Monitor logs parameter may come from parent class or be set directly
enable_azure_monitor_logs = getattr(namespace, 'enable_azure_monitor_logs', False)

# Check mutual exclusion
if enable_otlp_logs and disable_otlp_logs:
raise MutuallyExclusiveArgumentError(
"Cannot specify both --enable-opentelemetry-logs and --disable-opentelemetry-logs at the same time."
)

# Check if trying to enable OTLP logs without Azure Monitor logs
# For create operations, require explicit Azure Monitor enablement
if enable_otlp_logs and not enable_azure_monitor_logs:
raise ArgumentUsageError(
"OpenTelemetry logs requires Azure Monitor logs to be enabled. "
"Please add --enable-azure-monitor-logs to your command."
)


def validate_opentelemetry_logs_dependencies_for_update(namespace):
"""Validate OpenTelemetry logs dependencies for update operations."""
enable_otlp_logs = getattr(namespace, 'enable_opentelemetry_logs', False)
disable_otlp_logs = getattr(namespace, 'disable_opentelemetry_logs', False)

# Check mutual exclusion
if enable_otlp_logs and disable_otlp_logs:
raise MutuallyExclusiveArgumentError(
"Cannot specify both --enable-opentelemetry-logs and --disable-opentelemetry-logs at the same time."
)
# For update operations, validation is deferred to the decorator where we have access
# to the cluster's Azure Monitor profile


def validate_azure_monitor_and_opentelemetry_for_create(namespace):
"""Main validator for Azure Monitor and OpenTelemetry configurations for create operations."""
# Run all OpenTelemetry-related validations
validate_opentelemetry_ports(namespace)
validate_opentelemetry_metrics_dependencies(namespace)
validate_opentelemetry_logs_dependencies(namespace)


def validate_azure_monitor_and_opentelemetry_for_update(namespace):
"""Main validator for Azure Monitor and OpenTelemetry configurations for update operations."""
# Run all OpenTelemetry-related validations
validate_opentelemetry_ports(namespace)
validate_opentelemetry_metrics_dependencies_for_update(namespace)
validate_opentelemetry_logs_dependencies_for_update(namespace)
Loading
Loading