Custom Diagram Creator

User guide

Everything you can do on the diagram list and in the editor.

The diagram list

The start page lists every diagram with its owner and dates. Click anywhere on a row to open it. The row actions duplicate, download (JSON) or delete a diagram; select several rows to download or delete them together.

  • New diagram opens an empty canvas in edit mode.
  • Upload imports one or more .json files in a single write. They are validated against the schema; if a diagram with the same id exists, the upload gets a new id. The list refreshes as soon as the lookup serves the new rows.
  • ⓘ About shows the version, the author and links to the source code and these docs.
  • ⚙ Storage administration lists the app's lookup files and can delete one.

The editor toolbar

ControlWhat it does
Diagram nameRename the diagram (saved with Save).
Edit / ViewEdit mode shows the palette, the floating toolbar and the resize grips. View mode locks the layout; a click opens the details.
Save · Save as · Export JSONSave to the lookup, save a copy with a new name, or download the JSON.
TimeframeApplies to every query on the page: problems, KPIs and KPI connections. Presets go from the last 5 minutes to the last 7 days, plus any custom range. Saved with the diagram.
Auto-refresh · ⟳Off by default; 30 s to 30 min. Pauses while the browser tab is hidden. ⟳ refreshes now. Saved with the diagram.
Dots · Grid · BlankCanvas background. Dots and grid also snap nodes to a 16 px grid.
Zoom out · % · Zoom in · Fit viewZoom controls (the mouse wheel and pinch also zoom).
Undo · Redo · Auto-arrangeHistory of canvas changes, and a left-to-right layout with dagre.

Adding components

In edit mode, the palette on the left lists every kind of component. Custom component is pinned on top. Below it, type in Filter components to narrow the list by name, category or Smartscape type — for example lambda, kubernetes or K8S_POD. Drag a component onto the canvas, or click it to drop it in the middle; its editor opens docked on the right.

Entity components represent one or more real entities. There are 49 of them, grouped by category. Endpoint components list the endpoints of your services (they aren't Smartscape nodes, so they come from the endpoint.name dimension of the request metric) and show the problems of their service; Synthetic components are browser, HTTP and network availability monitors.

CategoryComponent typesSmartscape types listed
ApplicationsFrontend, Mobile, Service, Endpoint, Process, GenAIFRONTEND GENAI_AGENT GENAI_MODEL GENAI_SERVICE PROCESS SERVICE · endpoints from endpoint.name
SyntheticBrowser monitor, HTTP monitor, Network availability monitorBROWSER_MONITOR HTTP_MONITOR NETWORK_AVAILABILITY_MONITOR
InfrastructureHost, Container, Database, Network deviceCONTAINER DB_DATABASE_* DB_INSTANCE_* EXT_NETWORK_DEVICE HOST
KubernetesK8s cluster, K8s namespace, K8s node, Workload, K8s pod, K8s service, K8s ingressK8S_CLUSTER K8S_DAEMONSET K8S_DEPLOYMENT K8S_INGRESS K8S_NAMESPACE K8S_NODE K8S_POD K8S_SERVICE K8S_STATEFULSET
AWSAWS EC2 instance, AWS Lambda, AWS ECS service, AWS EKS cluster, AWS RDS, AWS DynamoDB, AWS ElastiCache, AWS S3 bucket, AWS SQS queue, AWS SNS topic, AWS load balancer, AWS API GatewayAWS_APIGATEWAYV2_API AWS_APIGATEWAY_RESTAPI AWS_DYNAMODB_TABLE AWS_EC2_INSTANCE AWS_ECS_SERVICE AWS_EKS_CLUSTER AWS_ELASTICACHE_CACHECLUSTER AWS_ELASTICACHE_REPLICATIONGROUP AWS_ELASTICACHE_SERVERLESSCACHE AWS_ELASTICLOADBALANCINGV2_LOADBALANCER AWS_ELASTICLOADBALANCING_LOADBALANCER AWS_LAMBDA_FUNCTION AWS_RDS_DBCLUSTER AWS_RDS_DBINSTANCE AWS_S3_BUCKET AWS_SNS_TOPIC AWS_SQS_QUEUE
AzureAzure VM, Azure App Service, Azure Function, Azure Container App, Azure AKS cluster, Azure SQL database, Azure Cosmos DB, Azure Cache for Redis, Azure Storage account, Azure Service Bus, Azure Event Hubs, Azure load balancer, Azure Application Gateway, Azure API ManagementAZURE_MICROSOFT_APIMANAGEMENT_SERVICE AZURE_MICROSOFT_APP_CONTAINERAPPS AZURE_MICROSOFT_CACHE_REDIS AZURE_MICROSOFT_COMPUTE_VIRTUALMACHINES AZURE_MICROSOFT_CONTAINERSERVICE_MANAGEDCLUSTERS AZURE_MICROSOFT_DOCUMENTDB_DATABASEACCOUNTS AZURE_MICROSOFT_EVENTHUB_NAMESPACES AZURE_MICROSOFT_NETWORK_APPLICATIONGATEWAYS AZURE_MICROSOFT_NETWORK_LOADBALANCERS AZURE_MICROSOFT_SERVICEBUS_NAMESPACES AZURE_MICROSOFT_SQL_SERVERS_DATABASES AZURE_MICROSOFT_STORAGE_STORAGEACCOUNTS AZURE_MICROSOFT_WEB_SITES AZURE_MICROSOFT_WEB_SITES_FUNCTIONS
Google CloudGCP Compute Engine VM, GCP Cloud Run service, GCP Pub/Sub topicGCP_COMPUTE_GOOGLEAPIS_COM_INSTANCE GCP_PUBSUB_GOOGLEAPIS_COM_TOPIC GCP_RUN_GOOGLEAPIS_COM_SERVICE

On the Data tab:

  1. pick the component type — type in the list to filter it; changing it clears the selection;
  2. open the entities combo box, type to search and pick one or more entities. It lists the entities of that type seen in the last 7 days, sorted by name (web frontends for frontend, mobile frontends for mobile). Types that cover several Smartscape types show which one each entity is. When an environment has more than 2,000 entities of a type, the list shows the first 2,000 and what you type is searched across all of them.

The component then reflects the Davis problems that affect any of the picked entities and were open at any time during the timeframe — a snapshot of that moment: with Last 5 minutes you see what is open now, and with a past day you see what was open that day, even if it closed later. Frontends and synthetic monitors also match their classic id (APPLICATION-…, SYNTHETIC_TEST-…), so problems raised on either id count.

Next to the status icon, the component says how many: 0 problems, 1 problem, 3 problems. Click the count to list those problems — each opens in the Problems app, marked as still active or closed — or to open the component's details with all of them.

Components created from a query — the sample diagram, an imported file or the agent skill — keep working: the panel shows the query, and picking entities replaces it with a fixed selection.

On the Status tab you set when the component changes color:

  • Warning threshold — number of problems open in the timeframe to turn orange.
  • Failing threshold — number of problems open in the timeframe to turn red (red wins when both are equal).
  • Match — an optional DQL fragment appended as | filter … to the problem query, e.g. event.category == "ERROR".

Custom components (containers)

A custom component is a resizable container with one row per child. A child is either an entity returned by your own DQL query or an SLO you pick. Every row has its own status light, and the container's color sums them up.

How the container color is computed

ChildrenContainer
All children are redRed (failing)
At least one child is red or orange, but not all are redOrange (warning)
All children are greenGreen (pass)
No children, or green mixed with children without dataGray (no data)

A container with a single entity shows that entity as one large block in the container's color instead of a list.

Entities mode

Write a DQL query that returns one row per child. Use it to group entities that belong together — the databases of a domain, the services of a team, the hosts of a cluster.

dql
smartscapeNodes "DB_INSTANCE_*"
| filter contains(name, "orders", caseSensitive: false)
| fields id, name
| limit 20
FieldWhat it does
DQLRequired columns: id — the entity id matched against Davis problems; Smartscape ids such as SERVICE-… and classic ids both work, and an id_classic column is matched too — and name. Run previews the rows, loads the columns into the selectors and applies the query.
Child name fieldColumn shown as each row's label. Default: name.
CriterionAny active problem turns a child red as soon as a problem open in the timeframe affects it. Only problems that satisfy the match counts only the problems that also pass the match filter.
MatchDQL filter fragment appended as | filter <match> to the problem query, e.g. event.category == "AVAILABILITY".

SLOs mode

Pick one or more SLOs. Each row shows the SLO's current value and error budget and is green when the SLO meets its target, orange when it is below its warning and red when it is below its target. Each SLO is evaluated with the timeframe defined in the SLO itself, not the page timeframe.

Visual options

FieldWhat it does
NameShown in the container header.
IconAny Strato icon, shown next to the name.
Visible rows before scrollingHow many rows are shown before the container scrolls internally. Default: 8.

KPI blocks

Any node can show a list of KPIs under it. On the KPIs tab, turn on Show KPIs under the node, give the block a title and add as many KPIs as you need with Add KPI.

Ready-made KPIs

Entity components come with ready-made KPIs for their type, built for the entities you pick on the Data tab: each KPI shows one line per picked entity — pick three services and Request count lists three services. New components start with the type's main KPIs (in bold below); Add KPI offers the rest, plus Custom KPI for your own query. KPIs added this way are marked Ready-made; editing the query turns one into a custom KPI.

ComponentReady-made KPIs
ServiceRequest count, Response time (avg), Failure rate, Response time (p95), Failed requests
EndpointRequest count, Response time (avg), Failure rate, Response time (p95), Failed requests
ProcessAvailability, CPU usage, Memory usage
HostAvailability, CPU usage, Memory usage, Disk usage
FrontendUser actions, User action duration, Errors, Largest contentful paint, Requests
MobileUser actions, App starts, Errors, App start duration
Browser monitorAvailability, Duration, Executions
HTTP monitorAvailability, Duration, Executions
Network availability monitorAvailability, Execution time, Executions
K8s clusterCPU usage, Memory (working set)
K8s namespaceCPU usage, Memory (working set)
K8s nodeCPU usage, Memory (working set)
K8s podCPU usage, Memory (working set), Container restarts
WorkloadCPU usage, Memory (working set)
ContainerCPU usage, Memory (working set), Container restarts

When you pick several entities, each KPI shows its title above its lines — Request count, then one line per service, then Response time… — so you always know what you are reading; with a single entity, the line itself carries the title. Ready-made KPIs bring their title; for your own KPIs named from a column, type one in Name.

Their queries use placeholders that the app fills with the component's selection right before running them, so they follow the selection when you change it. The query editor paints them in blue and validates them as regular values. You can use them in your own KPIs too (entity components only):

PlaceholderReplaced with
$entityIdsthe Smartscape ids of the picked entities (or of the rows of the entity query), quoted and comma-separated — use it inside array(…)
$entityNamestheir names
$endpointNamesthe picked endpoints of an endpoint component
dql
timeseries requests = sum(dt.service.request.count, scalar: true), by: {dt.smartscape.service},
  filter: { in(toString(dt.smartscape.service), array($entityIds)) }
| fieldsAdd name = getNodeName(dt.smartscape.service), value = requests
| fields name, value
| sort value desc

Run in the editor fills the placeholders too, and the details panel shows each KPI's query as it ran.

KPI settings

Each KPI has its own query and its own settings:

FieldWhat it does
QueryAny DQL that returns a numeric column. Run previews it and loads its columns into the selectors.
ValueThe result column that holds the number to show. Default: the first numeric column. Timeseries arrays show their last value.
NameCustom text: a fixed name; the KPI shows the value of the first row. From a column: the name comes from a result column and the KPI shows one line per result row.
Lines to showFrom a column only: how many result rows the KPI lists under the node, from the top (1–50, default 5).
UnitPick a common unit (ms, s, %, req/s, B, MB, …) or Custom… to type any unit.
DecimalsDigits after the decimal point (0–10).

A single value with a custom name:

dql
timeseries rt = avg(dt.service.request.response_time, scalar: true)
| fieldsAdd avg_ms = rt / 1000
| fields avg_ms

One line per service, named from the service column:

dql
timeseries rt = avg(dt.service.request.response_time, scalar: true), by: {dt.smartscape.service}
| fieldsAdd service = getNodeName(dt.smartscape.service), avg_ms = rt / 1000
| fields service, avg_ms
| sort avg_ms desc
| limit 5

Connections

Drag from the dots on the side of a node to another node. The connection editor opens so you can choose:

  • Normal — a plain line with an optional label.
  • KPI relation — a query that returns a single value (first row; the chosen column or the first numeric one), a unit (common units or a custom one), decimals and a threshold. above means high values are bad, below means low values are bad.

A new KPI relation starts with the request count of the page timeframe, without limits — set them on the Threshold tab:

dql
timeseries requests = sum(dt.service.request.count, scalar: true)
| fields requests

For the average response time in milliseconds:

dql
timeseries r = avg(dt.service.request.response_time, scalar: true)
| fieldsAdd v = r / 1000
| fields v

Every connection has a direction — source to target, target to source, or no arrow. KPI connections show a pill with the value, color the line by status and animate dots in the arrow's direction (off when the system asks for reduced motion).

Changing where a connection starts or ends

  • On the canvas: select the connection; its two ends show a small circle. Drag an end onto another dot — on the same component or on a different one. The connection keeps its type, query and label.
  • In the editor: on the Visual tab, Connection points sets the side (top, right, bottom or left) where it starts and where it ends.

Editing like a dashboard

  • Select a node to get the floating toolbar: its size, Duplicate, Edit and a ⋮ menu with View details and Delete. Selected connections get Edit and Delete.
  • Resize any node from the grips in its bottom corners.
  • Edit in the panel docked to the right. There is no Apply button: names, icons and labels change on the canvas as you type, Run applies a query, and threshold, filter and selection changes refresh the status after a short pause.
  • The element you are editing is highlighted on the canvas with a blue outline and an Editing badge, and becomes the selection.
  • While the editor is open, click another element to switch to it.
  • Each editing session is one undo step.

View mode and details

In view mode, click a node or a KPI connection to open its details on the right:

  • the applied timeframe, in your time zone;
  • the picked entities (name, id and classic id) or the entity query, and the full problem query with the timeframe and ids already filled in — copy it or open it in Notebooks;
  • each KPI with its query and its current lines;
  • the problems in the timeframe, each linking to the Problems app;
  • the breakdown per child or per SLO, and for KPI connections the raw value and how the threshold was evaluated.

Saving, sharing and versions

The timeframe and the auto-refresh are part of the diagram: whoever opens it starts with the ones it was saved with. Changing either one shows Unsaved changes — in edit or view mode — and Save keeps it. Save a relative window such as Last 5 minutes for a live wall screen, or a fixed date range to always show the same incident or demo window.

Save writes the diagram to the lookup table. If someone else saved it after you opened it, the app asks whether to Overwrite their version or Reload theirs. Export JSON downloads a file you can upload again without losing anything — use it to move diagrams between environments or to keep them in Git.

Keyboard shortcuts

KeysAction
Ctrl + ZUndo
Ctrl + Y or Ctrl + Shift + ZRedo
Delete / BackspaceDelete the selected nodes and connections (edit mode)
Double-clickOpen the editor of a node or connection (edit mode) or its details (view mode)