<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: How to create a topology? in Extensions</title>
    <link>https://community.dynatrace.com/t5/Extensions/How-to-create-a-topology/m-p/267069#M5790</link>
    <description>&lt;P&gt;In Extension Framework 2 the way to define topology changed completely. You now need to define your topology in the extension.yaml file to match the metrics you are sending from your code.&lt;/P&gt;&lt;P&gt;Have a look at &lt;A href="https://community.dynatrace.com/t5/Extensions/Python-EF2-topology-setting/m-p/251797#M4895" target="_self"&gt;this thread&lt;/A&gt; for an example and explanation on how you could do it.&lt;/P&gt;</description>
    <pubDate>Fri, 10 Jan 2025 10:24:13 GMT</pubDate>
    <dc:creator>TomásSeroteRoos</dc:creator>
    <dc:date>2025-01-10T10:24:13Z</dc:date>
    <item>
      <title>How to create a topology?</title>
      <link>https://community.dynatrace.com/t5/Extensions/How-to-create-a-topology/m-p/266069#M5721</link>
      <description>&lt;P&gt;In extensions framework I can't use groups and devices any more.&lt;/P&gt;
&lt;P&gt;Therefor I need to create a topology for the definition here below that I need to add in the extension.yaml file&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp;# report device metrics from the API&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; def reportDeviceMetrics(self, session):&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # Create group - provide group id used to calculate unique entity id in dynatrace&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # &amp;nbsp; and display name for UI presentation&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; group = self.topology_builder.create_group(identifier=self.unifisitename,&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;group_name=self.unifisitedesc)&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; response = session.get( &lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url="{}/api/s/{}/stat/device".format(self.url, self.unifisitename), &lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; headers = self.headers, &lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; verify = False, &lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; timeout = 1&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if response.status_code != 200:&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logger.error("Exception happened during device-basic api call = " + resp.text)&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; devices = response.json().get("data")&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for device in devices:&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(device.get("name"))&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # Create device - provide device id used to calculate unique entity id in dynatrace&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # &amp;nbsp; and display name for UI presentation&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; node = group.create_device(identifier="unifi-device-{}".format(device.get("name")), display_name=device.get("name"))&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logger.info("Topology: group name=%s, device name=%s", group.name, node.name)&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # report property - any string-string values pair. It is added to device metadata displayed in dynatrace UI&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; node.report_property(key='mac', value=device.get('mac'))&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; node.report_property(key='disabled', value=str(device.get('disabled')))&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; node.report_property(key='adopted', value=str(device.get('adopted')))&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; node.report_property(key='type', value=device.get('type'))&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; node.report_property(key='model', value=device.get('model'))&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # report state - value must be one from list located in json file.&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; devicestate = 'OFF'&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if device.get('state') == 1:&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; devicestate = 'ON'&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; node.state_metric(key='state', value=devicestate)&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;BR /&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; systemStats = device.get('system-stats')&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if systemStats is not None:&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; node.absolute(key='sys-cpu', value=float(systemStats.get("cpu")))&lt;/STRONG&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; node.absolute(key='sys-memory', value=float(systemStats.get("mem"&lt;/STRONG&gt;&lt;/EM&gt;&lt;SPAN&gt;&lt;EM&gt;&lt;STRONG&gt;)))&lt;/STRONG&gt;&lt;/EM&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;Anybody an idea how to do that?&lt;/DIV&gt;
&lt;/DIV&gt;</description>
      <pubDate>Mon, 30 Dec 2024 07:18:29 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Extensions/How-to-create-a-topology/m-p/266069#M5721</guid>
      <dc:creator>jannick_deturck</dc:creator>
      <dc:date>2024-12-30T07:18:29Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a topology?</title>
      <link>https://community.dynatrace.com/t5/Extensions/How-to-create-a-topology/m-p/267069#M5790</link>
      <description>&lt;P&gt;In Extension Framework 2 the way to define topology changed completely. You now need to define your topology in the extension.yaml file to match the metrics you are sending from your code.&lt;/P&gt;&lt;P&gt;Have a look at &lt;A href="https://community.dynatrace.com/t5/Extensions/Python-EF2-topology-setting/m-p/251797#M4895" target="_self"&gt;this thread&lt;/A&gt; for an example and explanation on how you could do it.&lt;/P&gt;</description>
      <pubDate>Fri, 10 Jan 2025 10:24:13 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Extensions/How-to-create-a-topology/m-p/267069#M5790</guid>
      <dc:creator>TomásSeroteRoos</dc:creator>
      <dc:date>2025-01-10T10:24:13Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a topology?</title>
      <link>https://community.dynatrace.com/t5/Extensions/How-to-create-a-topology/m-p/267218#M5801</link>
      <description>&lt;P&gt;Thanks for this example,&amp;nbsp; but I was already aware that we need to add a topology in the extension.yaml file.&lt;BR /&gt;&lt;BR /&gt;My question is &lt;EM&gt;&lt;STRONG&gt;HOW&lt;/STRONG&gt;&lt;/EM&gt; I can do this?&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;topology&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;types&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; - &lt;/SPAN&gt;&lt;SPAN&gt;enabled&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;true&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;name&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;displayName&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;rules&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &lt;/SPAN&gt;&lt;SPAN&gt;idPattern&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;instanceNamePattern&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;iconPattern&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;sources&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &lt;/SPAN&gt;&lt;SPAN&gt;sourceType&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;Metrics&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;condition&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;()&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;role&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;default&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Mon, 13 Jan 2025 11:05:24 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Extensions/How-to-create-a-topology/m-p/267218#M5801</guid>
      <dc:creator>jannick_deturck</dc:creator>
      <dc:date>2025-01-13T11:05:24Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a topology?</title>
      <link>https://community.dynatrace.com/t5/Extensions/How-to-create-a-topology/m-p/291907#M6950</link>
      <description>&lt;P&gt;Hi Jannick,&lt;/P&gt;
&lt;P&gt;I must have somehow missed your original reply, sorry about that.&lt;/P&gt;
&lt;P&gt;Not sure if you already figured out how to make this work, but for anyone else who might stumble upon this thread:&lt;/P&gt;
&lt;P&gt;This generic topology works by defining entities from metrics and logs, as opposed to the old one which worked by first defining the entity and then the attaching metrics and logs to it.&lt;/P&gt;
&lt;P&gt;On the YAML you defined a set a&amp;nbsp;&lt;EM&gt;rules.&amp;nbsp;&lt;/EM&gt;Each rule defines and&amp;nbsp;&lt;EM&gt;idPattern&lt;/EM&gt; which is how the entity ID will be calculated, and &lt;EM&gt;sources&lt;/EM&gt;, which is what metrics/logs are going to create this entity. These are the most important fields. Let's give a very simple example:&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;topology:
  types:
    - enabled: true
      name: unifi-device
      displayName: Unifi device
      rules:
        - idPattern: unifi_device_{device.name}
          instanceNamePattern: {device.name}
          sources:
            - sourceType: Metrics
              condition: $prefix(unifi.)&lt;/LI-CODE&gt;
&lt;P&gt;With this topology definition, for every metric whose key starts with&amp;nbsp;&lt;EM&gt;unifi. &lt;/EM&gt;which has the dimension&amp;nbsp;&lt;EM&gt;device.name&lt;/EM&gt; (here the dimension is implicitly required because you are using it in the&amp;nbsp;&lt;EM&gt;idPattern&lt;/EM&gt;), Dynatrace will calculate an ID hash from the string&amp;nbsp;&lt;EM&gt;unifi_device_{device.name}&lt;/EM&gt; (where it replaces&amp;nbsp;&lt;EM&gt;device.name&lt;/EM&gt; with the actual value of the dimension in your metric). Then, if no entity with that ID exists in your environment, it will create a new one. Otherwise, it will attach this metric to the existing entity.&lt;/P&gt;
&lt;P&gt;You can then enrich this with properties:&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;topology:
  types:
    - enabled: true
      name: unifi-device
      displayName: Unifi device
      rules:
        - idPattern: unifi_device_{device.name}
          instanceNamePattern: {device.name}
          sources:
            - sourceType: Metrics
              condition: $prefix(unifi.)
          attributes:
            - pattern: '{mac}'
              key: mac
              displayName: MAC address
            - pattern: '{type}'
              key: type
              displayName: Device type
            - pattern: '{adopted}'
              key: adopted
              displayName: Adopted&lt;/LI-CODE&gt;
&lt;P&gt;where the rule will now try to extract as properties the dimensions&amp;nbsp;mac, &lt;EM&gt;type &lt;/EM&gt;and&amp;nbsp;&lt;EM&gt;adopted&lt;/EM&gt; from the matching metrics (if these dimensions exist).&lt;/P&gt;
&lt;P&gt;A strategy that we normally use in our extension to populate this attributes, is to have a "dummy" metric like &lt;EM&gt;unifi.device.attributes&amp;nbsp;&lt;/EM&gt;which we populate with all the dimensions that should be attributes, and then have as our first rule something with this source:&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;sourceType: Metrics
condition: $eq(unifi.device.attributes)&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Let me know if that was helpful, and once again apologies for the very delayed reply.&lt;/P&gt;</description>
      <pubDate>Fri, 19 Dec 2025 11:09:22 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Extensions/How-to-create-a-topology/m-p/291907#M6950</guid>
      <dc:creator>TomásSeroteRoos</dc:creator>
      <dc:date>2025-12-19T11:09:22Z</dc:date>
    </item>
  </channel>
</rss>

