Skip to content

Commit eece332

Browse files
committed
Add support for sending device metadata
1 parent 370b3fa commit eece332

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

cisco_aci/datadog_checks/cisco_aci/fabric.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
from six import iteritems
66

7+
from datadog_checks.base.utils.serialization import json
8+
from datadog_checks.cisco_aci.models import DeviceMetadata, Node
79
from . import aci_metrics, exceptions, helpers
810

911

@@ -25,6 +27,7 @@ def __init__(self, check, api, instance):
2527
self.submit_metrics = check.submit_metrics
2628
self.tagger = self.check.tagger
2729
self.external_host_tags = self.check.external_host_tags
30+
self.ndm_metadata = check.ndm_metadata
2831

2932
def collect(self):
3033
fabric_pods = self.api.get_fabric_pods()
@@ -70,6 +73,7 @@ def submit_nodes_health(self, nodes, pods):
7073
continue
7174
self.log.info("processing node %s on pod %s", node_id, pod_id)
7275
try:
76+
self.submit_node_metadata(node_attrs, tags)
7377
self.submit_process_metric(n, tags + self.check_tags + user_tags, hostname=hostname)
7478
except (exceptions.APIConnectionException, exceptions.APIParsingException):
7579
pass
@@ -209,3 +213,34 @@ def get_fabric_type(self, obj_type):
209213
return 'pod'
210214
if obj_type == 'l1PhysIf':
211215
return 'port'
216+
217+
def submit_node_metadata(self, node_attrs, tags):
218+
vendor = 'cisco_aci'
219+
namespace='default'
220+
node = Node(attributes=node_attrs)
221+
id_tags = [
222+
f'namespace:{namespace}',
223+
f'system_ip:{node.attributes.address}'
224+
]
225+
device_tags = [
226+
f'device_vendor:{vendor}',
227+
f'device_namespace:{namespace}',
228+
f'device_hostname:{node.attributes.dn}',
229+
f'hostname:{node.attributes.dn}',
230+
f'system_ip:{node.attributes.address}',
231+
f'device_ip:{node.attributes.address}',
232+
f'device_id:{namespace}:{node.attributes.address}',
233+
]
234+
device = DeviceMetadata(
235+
device_id=f'{namespace}:{node.attributes.address}',
236+
id_tags=id_tags,
237+
tags=device_tags + tags,
238+
name=node.attributes.dn,
239+
ip_address=node.attributes.address,
240+
model=node.attributes.model,
241+
adSt=node.attributes.adSt,
242+
vendor=vendor,
243+
version=node.attributes.version,
244+
serial_number=node.attributes.serial
245+
)
246+
self.ndm_metadata(json.dumps(device.model_dump()))
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from pydantic import BaseModel, Field, computed_field
2+
3+
class NodeAttributes(BaseModel):
4+
address: str | None = None
5+
adSt: str | None = None
6+
role: str | None = None
7+
dn: str | None = None
8+
model: str | None = None
9+
version: str | None = None
10+
serial: str | None = None
11+
vendor: str | None = Field(default='cisco_aci')
12+
namespace: str | None = Field(default='default')
13+
14+
class Node(BaseModel):
15+
attributes: NodeAttributes
16+
17+
class DeviceMetadata(BaseModel):
18+
device_id: str | None = Field(default=None)
19+
id_tags: list = Field(default_factory=list)
20+
tags: list = Field(default_factory=list)
21+
name: str | None = Field(default=None)
22+
ip_address: str | None = Field(default=None)
23+
model: str | None = Field(default=None)
24+
adSt: str | None = Field(default=None, exclude=True)
25+
vendor: str | None = Field(default=None)
26+
version: str | None = Field(default=None)
27+
serial_number: str | None = Field(default=None)
28+
29+
@computed_field
30+
@property
31+
def status(self) -> int:
32+
return 1 if self.adSt=='on' else 2
33+
34+
class DeviceMetadataList(BaseModel):
35+
device_metadata: list = Field(default_factory=list)

datadog_checks_base/datadog_checks/base/checks/base.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,12 @@ def database_monitoring_metadata(self, raw_event):
662662

663663
aggregator.submit_event_platform_event(self, self.check_id, to_native_string(raw_event), "dbm-metadata")
664664

665+
def ndm_metadata(self, raw_event):
666+
# type: (str) -> None
667+
if raw_event is None:
668+
return
669+
aggregator.submit_event_platform_event(self, self.check_id, to_native_string(raw_event), "ndm")
670+
665671
def should_send_metric(self, metric_name):
666672
return not self._metric_excluded(metric_name) and self._metric_included(metric_name)
667673

0 commit comments

Comments
 (0)