Skip to content

Commit 7011c8c

Browse files
[PLINT-389] Merge new ironic metrics into master (#17541)
* [PLINT-383] Adding Ironic node portgroup metrics (#17498) * adding metric openstack.ironic.node.portgroup.count Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * undoing change to conf.yaml.example Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * clarified portgroup metric name by prepending portgroup_ Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> --------- Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * [PLINT-386] Adding Ironic port metrics (#17508) * adding metric openstack.ironic.port.count Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * lint Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * standardizing metric name Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * removing redundant loop Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * Update openstack_controller/datadog_checks/openstack_controller/components/bare_metal.py Co-authored-by: José Manuel Almaza Ramiro <josemanuel.almaza@datadoghq.com> --------- Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> Co-authored-by: José Manuel Almaza Ramiro <josemanuel.almaza@datadoghq.com> * [PLINT-387] Adding Ironic Volume Connector and Target Metrics (#17517) * adding metric openstack.ironic.volume.connector.count Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * adding metric openstack.ironic.volume.target.count Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * updating instance.py Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * removing COUNT from metrics in get_metrics_and_tags Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * removing duplicate IRONIC_VOLUME_PREFIX Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> --------- Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * [PLINT-388] Adding Ironic Driver and Allocation metrics (#17525) * adding metric openstack.ironic.driver.count Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * adding metric openstack.ironic.allocation.count Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> --------- Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * adding a changelog Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * adding pagination support for /v1/ports/detail Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * adding pagination support for /v1/volume/connectors Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * lint Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * adding pagination support for /v1/volume/targets Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * adding pagination support for /v1/allocations and log INFO if microversion is too low Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * adding pagination support for /v1/nodes/{node_ident}/portgroups/detail Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * addressed comments Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> * asserting that the number of allocations is 0 Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> --------- Signed-off-by: rahulkaukuntla <rahul.kaukuntla@datadoghq.com> Co-authored-by: José Manuel Almaza Ramiro <josemanuel.almaza@datadoghq.com>
1 parent 50d77c7 commit 7011c8c

File tree

34 files changed

+2140
-2
lines changed

34 files changed

+2140
-2
lines changed

openstack_controller/assets/configuration/spec.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,8 +448,27 @@ files:
448448
type: string
449449
- name: interval
450450
type: integer
451+
- name: portgroups
452+
anyOf:
453+
- type: boolean
454+
- type: object
451455
- name: conductors
452456
type: boolean
457+
- name: volumes
458+
anyOf:
459+
- type: boolean
460+
- type: object
461+
properties:
462+
- name: connectors
463+
type: boolean
464+
- name: targets
465+
type: boolean
466+
- name: ports
467+
type: boolean
468+
- name: drivers
469+
type: boolean
470+
- name: allocations
471+
type: boolean
453472
- name: load-balancer
454473
anyOf:
455474
- type: boolean
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Adding new Ironic metrics

openstack_controller/datadog_checks/openstack_controller/api/api_rest.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,22 @@ def use_legacy_nodes_resource(microversion):
429429

430430
return self.make_paginated_request(url, 'nodes', 'uuid', params=params)
431431

432+
def get_baremetal_portgroups(self, node_id):
433+
return self.make_paginated_request(
434+
'{}/v1/nodes/{}/portgroups/detail'.format(
435+
self._catalog.get_endpoint_by_type(Component.Types.BAREMETAL.value), node_id
436+
),
437+
'portgroups',
438+
'uuid',
439+
)
440+
441+
def get_baremetal_ports(self):
442+
return self.make_paginated_request(
443+
'{}/v1/ports/detail'.format(self._catalog.get_endpoint_by_type(Component.Types.BAREMETAL.value)),
444+
'ports',
445+
'uuid',
446+
)
447+
432448
def get_baremetal_conductors(self):
433449

434450
ironic_endpoint = self._catalog.get_endpoint_by_type(Component.Types.BAREMETAL.value)
@@ -437,6 +453,40 @@ def get_baremetal_conductors(self):
437453

438454
return self.make_paginated_request(url, 'conductors', 'hostname', params={})
439455

456+
def get_baremetal_volume_connectors(self):
457+
return self.make_paginated_request(
458+
'{}/v1/volume/connectors'.format(self._catalog.get_endpoint_by_type(Component.Types.BAREMETAL.value)),
459+
'connectors',
460+
'uuid',
461+
)
462+
463+
def get_baremetal_volume_targets(self):
464+
return self.make_paginated_request(
465+
'{}/v1/volume/targets'.format(self._catalog.get_endpoint_by_type(Component.Types.BAREMETAL.value)),
466+
'targets',
467+
'uuid',
468+
)
469+
470+
def get_baremetal_drivers(self):
471+
response = self.http.get(
472+
'{}/v1/drivers'.format(self._catalog.get_endpoint_by_type(Component.Types.BAREMETAL.value))
473+
)
474+
response.raise_for_status()
475+
return response.json().get('drivers', [])
476+
477+
def get_baremetal_allocations(self):
478+
if float(self.config.ironic_microversion) < 1.52:
479+
self.log.info(
480+
"Ironic microversion is below 1.52 and set to %s, cannot collect allocations",
481+
self.config.ironic_microversion,
482+
)
483+
return []
484+
return self.make_paginated_request(
485+
'{}/v1/allocations'.format(self._catalog.get_endpoint_by_type(Component.Types.BAREMETAL.value)),
486+
'allocations',
487+
'uuid',
488+
)
489+
440490
def get_load_balancer_loadbalancers(self, project_id):
441491
params = {'project_id': project_id}
442492
return self.make_paginated_request(

openstack_controller/datadog_checks/openstack_controller/api/api_sdk.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,20 @@ def get_baremetal_nodes(self):
254254
)
255255
]
256256

257+
def get_baremetal_portgroups(self, node_id):
258+
return [
259+
portgroup.to_dict(original_names=True)
260+
for portgroup in self.call_paginated_api(
261+
self.connection.baremetal.portgroups, node_id, limit=self.config.paginated_limit
262+
)
263+
]
264+
265+
def get_baremetal_ports(self):
266+
return [
267+
port.to_dict(original_names=True)
268+
for port in self.call_paginated_api(self.connection.baremetal.ports, limit=self.config.paginated_limit)
269+
]
270+
257271
def get_baremetal_conductors(self):
258272
return [
259273
conductor.to_dict(original_names=True)
@@ -262,6 +276,39 @@ def get_baremetal_conductors(self):
262276
)
263277
]
264278

279+
def get_baremetal_volume_connectors(self):
280+
return [
281+
connector.to_dict(original_names=True)
282+
for connector in self.call_paginated_api(
283+
self.connection.baremetal.volume_connectors, limit=self.config.paginated_limit
284+
)
285+
]
286+
287+
def get_baremetal_volume_targets(self):
288+
return [
289+
target.to_dict(original_names=True)
290+
for target in self.call_paginated_api(
291+
self.connection.baremetal.volume_targets, limit=self.config.paginated_limit
292+
)
293+
]
294+
295+
def get_baremetal_drivers(self):
296+
return [driver.to_dict(original_names=True) for driver in self.connection.baremetal.drivers()]
297+
298+
def get_baremetal_allocations(self):
299+
if float(self.config.ironic_microversion) < 1.52:
300+
self.log.info(
301+
"Ironic microversion is below 1.52 and set to %s, cannot collect allocations",
302+
self.config.ironic_microversion,
303+
)
304+
return []
305+
return [
306+
allocation.to_dict(original_names=True)
307+
for allocation in self.call_paginated_api(
308+
self.connection.baremetal.allocations, limit=self.config.paginated_limit
309+
)
310+
]
311+
265312
def get_auth_projects(self):
266313
response = self.http.get('{}/v3/auth/projects'.format(self.cloud_config.get_auth_args().get('auth_url')))
267314
response.raise_for_status()

openstack_controller/datadog_checks/openstack_controller/components/bare_metal.py

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,34 @@
66
from datadog_checks.openstack_controller.components.component import Component
77
from datadog_checks.openstack_controller.config import normalize_discover_config_include
88
from datadog_checks.openstack_controller.metrics import (
9+
IRONIC_ALLOCATION_COUNT,
10+
IRONIC_ALLOCATION_PREFIX,
11+
IRONIC_ALLOCATION_TAGS,
912
IRONIC_CONDUCTOR_COUNT,
1013
IRONIC_CONDUCTOR_METRICS,
1114
IRONIC_CONDUCTOR_METRICS_PREFIX,
1215
IRONIC_CONDUCTOR_TAGS,
16+
IRONIC_DRIVER_COUNT,
17+
IRONIC_DRIVER_PREFIX,
18+
IRONIC_DRIVER_TAGS,
1319
IRONIC_NODE_COUNT,
1420
IRONIC_NODE_METRICS,
1521
IRONIC_NODE_METRICS_PREFIX,
22+
IRONIC_NODE_PORTGROUP_COUNT,
23+
IRONIC_NODE_PORTGROUP_PREFIX,
24+
IRONIC_NODE_PORTGROUP_TAGS,
1625
IRONIC_NODE_TAGS,
26+
IRONIC_PORT_COUNT,
27+
IRONIC_PORT_PREFIX,
28+
IRONIC_PORT_TAGS,
1729
IRONIC_RESPONSE_TIME,
1830
IRONIC_SERVICE_CHECK,
31+
IRONIC_VOLUME_CONNECTOR_COUNT,
32+
IRONIC_VOLUME_CONNECTOR_PREFIX,
33+
IRONIC_VOLUME_CONNECTOR_TAGS,
34+
IRONIC_VOLUME_TARGET_COUNT,
35+
IRONIC_VOLUME_TARGET_PREFIX,
36+
IRONIC_VOLUME_TARGET_TAGS,
1937
get_metrics_and_tags,
2038
)
2139

@@ -84,6 +102,42 @@ def _report_nodes(self, config, tags):
84102
for metric, value in node['metrics'].items():
85103
self.check.gauge(metric, value, tags=tags + node['tags'], hostname=item['uuid'])
86104
self.check.external_tags.append((item['uuid'], {'openstack': ['host_type:baremetal']}))
105+
self._report_portgroups(config, tags, item['uuid'])
106+
107+
@Component.http_error()
108+
def _report_portgroups(self, config, tags, node_id):
109+
if 'portgroups' not in config:
110+
report_portgroups = config.get('nodes', {}).get('portgroups', True)
111+
else:
112+
report_portgroups = config.get('portgroups', True)
113+
if report_portgroups:
114+
self.check.log.debug("reporting portgroups for node: %s", node_id)
115+
data = self.check.api.get_baremetal_portgroups(node_id)
116+
for item in data:
117+
portgroup = get_metrics_and_tags(
118+
item,
119+
tags=IRONIC_NODE_PORTGROUP_TAGS,
120+
prefix=IRONIC_NODE_PORTGROUP_PREFIX,
121+
metrics=[IRONIC_NODE_PORTGROUP_COUNT],
122+
)
123+
self.check.log.debug("portgroup: %s", portgroup)
124+
self.check.gauge(IRONIC_NODE_PORTGROUP_COUNT, 1, tags=tags + portgroup['tags'], hostname=item['uuid'])
125+
126+
@Component.register_global_metrics(ID)
127+
@Component.http_error()
128+
def _report_ports(self, config, tags):
129+
report_ports = config.get('ports', True)
130+
if report_ports:
131+
data = self.check.api.get_baremetal_ports()
132+
for item in data:
133+
port = get_metrics_and_tags(
134+
item,
135+
tags=IRONIC_PORT_TAGS,
136+
prefix=IRONIC_PORT_PREFIX,
137+
metrics={},
138+
)
139+
self.check.log.debug("port: %s", port)
140+
self.check.gauge(IRONIC_PORT_COUNT, 1, tags=tags + port['tags'])
87141

88142
@Component.register_global_metrics(ID)
89143
@Component.http_error()
@@ -103,3 +157,75 @@ def _report_conductors(self, config, tags):
103157
self.check.gauge(IRONIC_CONDUCTOR_COUNT, 1, tags=tags + conductor['tags'])
104158
for metric, value in conductor['metrics'].items():
105159
self.check.gauge(metric, value, tags=tags + conductor['tags'])
160+
161+
@Component.register_global_metrics(ID)
162+
@Component.http_error()
163+
def _report_volume_connectors(self, config, tags):
164+
if 'connectors' not in config:
165+
report_connectors = config.get('volumes', {}).get('connectors', True)
166+
else:
167+
report_connectors = config.get('connectors', True)
168+
if report_connectors:
169+
data = self.check.api.get_baremetal_volume_connectors()
170+
for item in data:
171+
connector = get_metrics_and_tags(
172+
item,
173+
tags=IRONIC_VOLUME_CONNECTOR_TAGS,
174+
prefix=IRONIC_VOLUME_CONNECTOR_PREFIX,
175+
metrics={},
176+
)
177+
self.check.log.debug("connector: %s", connector)
178+
self.check.gauge(IRONIC_VOLUME_CONNECTOR_COUNT, 1, tags=tags + connector['tags'])
179+
180+
@Component.register_global_metrics(ID)
181+
@Component.http_error()
182+
def _report_volume_targets(self, config, tags):
183+
if 'targets' not in config:
184+
report_targets = config.get('volumes', {}).get('targets', True)
185+
else:
186+
report_targets = config.get('targets', True)
187+
if report_targets:
188+
data = self.check.api.get_baremetal_volume_targets()
189+
for item in data:
190+
target = get_metrics_and_tags(
191+
item,
192+
tags=IRONIC_VOLUME_TARGET_TAGS,
193+
prefix=IRONIC_VOLUME_TARGET_PREFIX,
194+
metrics={},
195+
)
196+
self.check.log.debug("target: %s", target)
197+
self.check.gauge(IRONIC_VOLUME_TARGET_COUNT, 1, tags=tags + target['tags'])
198+
199+
@Component.register_global_metrics(ID)
200+
@Component.http_error()
201+
def _report_drivers(self, config, tags):
202+
if 'drivers' not in config:
203+
report_drivers = config.get('drivers', True)
204+
if report_drivers:
205+
data = self.check.api.get_baremetal_drivers()
206+
for item in data:
207+
driver = get_metrics_and_tags(
208+
item,
209+
tags=IRONIC_DRIVER_TAGS,
210+
prefix=IRONIC_DRIVER_PREFIX,
211+
metrics={},
212+
)
213+
self.check.log.debug("driver: %s", driver)
214+
self.check.gauge(IRONIC_DRIVER_COUNT, 1, tags=tags + driver['tags'])
215+
216+
@Component.register_global_metrics(ID)
217+
@Component.http_error()
218+
def _report_allocations(self, config, tags):
219+
if 'allocations' not in config:
220+
report_allocations = config.get('allocations', True)
221+
if report_allocations:
222+
data = self.check.api.get_baremetal_allocations()
223+
for item in data:
224+
allocation = get_metrics_and_tags(
225+
item,
226+
tags=IRONIC_ALLOCATION_TAGS,
227+
prefix=IRONIC_ALLOCATION_PREFIX,
228+
metrics={},
229+
)
230+
self.check.log.debug("allocation: %s", allocation)
231+
self.check.gauge(IRONIC_ALLOCATION_COUNT, 1, tags=tags + allocation['tags'])

openstack_controller/datadog_checks/openstack_controller/config_models/instance.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,29 @@ class Node(BaseModel):
4747
include: Optional[tuple[Union[str, IncludeItem], ...]] = None
4848
interval: Optional[int] = None
4949
limit: Optional[int] = Field(None, description='Maximum number of nodes to be processed.\n')
50+
portgroups: Optional[Union[bool, MappingProxyType[str, Any]]] = None
51+
52+
53+
class Volume(BaseModel):
54+
model_config = ConfigDict(
55+
arbitrary_types_allowed=True,
56+
frozen=True,
57+
)
58+
connectors: Optional[bool] = None
59+
targets: Optional[bool] = None
5060

5161

5262
class BaremetalItem(BaseModel):
5363
model_config = ConfigDict(
5464
arbitrary_types_allowed=True,
5565
frozen=True,
5666
)
67+
allocations: Optional[bool] = None
5768
conductors: Optional[bool] = None
69+
drivers: Optional[bool] = None
5870
nodes: Optional[Union[bool, Node]] = None
71+
ports: Optional[bool] = None
72+
volumes: Optional[Union[bool, Volume]] = None
5973

6074

6175
class BlockStorageItem(BaseModel):

0 commit comments

Comments
 (0)