Homeโ€บ๐Ÿ”„ Platform Overviewโ€บModule 32 min read ยท 4/21

Smartscape: New Entity Model

Tutorial3 exercises

Classic Entities vs Smartscape

Gen2 used classic entities with IDs like HOST-ABC123, queried via entity selectors. Gen3 introduces Smartscape โ€” a new topology model where entities are nodes and relationships are edges.

GEN2 Entity Model                       GEN3 Smartscape Model
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Entity selectors:                       DQL smartscapeNodes:
  type(HOST),tag(prod)                    smartscapeNodes "HOST"
                                          | filter matchesValue(dt.tags, "prod")

Entity API v2:                          DQL queries:
  GET /api/v2/entities?selector=...       smartscapeNodes "SERVICE"
                                          | fields name, id

Relationships via entity properties:    Relationships via traverse:
  entity.fromRelationships.isInstanceOf   smartscapeNodes "HOST"
                                          | traverse "runs_on", "SERVICE"

Entity Type Mapping

Every classic entity type has a Smartscape equivalent:

Classic (Gen2)                          Smartscape (Gen3)
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
dt.entity.host                          dt.smartscape.host โ†’ HOST
dt.entity.service                       dt.smartscape.service โ†’ SERVICE
dt.entity.process_group_instance        dt.smartscape.process โ†’ PROCESS
dt.entity.application                   dt.smartscape.frontend โ†’ FRONTEND
dt.entity.kubernetes_cluster            dt.smartscape.k8s_cluster โ†’ K8S_CLUSTER
dt.entity.cloud_application_instance    dt.smartscape.k8s_pod โ†’ K8S_POD
dt.entity.aws_lambda_function           dt.smartscape.aws.lambda_function โ†’ AWS_LAMBDA_FUNCTION

Function Migration

Classic Function                        Smartscape Replacement
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
entityName(entityId)                    name (on node) or getNodeName(id)
entityAttr(entityId, "attr")            direct field or getNodeField(id, "attr")
classicEntitySelector("type(HOST)")     smartscapeNodes "HOST" | filter ...
belongs_to[...], runs[...]              traverse "edge_type", "TARGET_TYPE"
dt.entity.host (in DQL dimensions)      dt.smartscape.host
affected_entity_ids                     smartscape.affected_entity.ids

Special Cases

Some classic entities don't have a direct 1:1 mapping:

  • Host group โ€” no standalone Smartscape entity. Use fields on HOST nodes instead.
  • Process group โ€” no standalone entity. Use fields on PROCESS nodes.
  • Container group โ€” no standalone entity. Use CONTAINER nodes.
  • Classic entity IDs โ€” don't assume they carry over. Use toSmartscapeId() for conversion.

Relationship Traversal

In Gen2, you accessed relationships through entity properties. In Gen3, you use traverse:

// Find all services running on a specific host
smartscapeNodes "HOST"
| filter name == "my-host"
| traverse "runs_on", "SERVICE", direction: backward
| fields name, id

Common traversal pairs:

HOST โ†’ SERVICE:           traverse "runs_on", "SERVICE", direction: backward
SERVICE โ†’ PROCESS:        traverse "runs_on", "PROCESS"
HOST โ†’ CONTAINER:         traverse "runs_on", "CONTAINER", direction: backward
K8S_POD โ†’ CONTAINER:      traverse "is_part_of", "CONTAINER", direction: backward
LB โ†’ TARGET_GROUP:        traverse "balanced_by", direction: backward
TARGET_GROUP โ†’ INSTANCE:  traverse "balances"