Skip to main content

Examples

Here are comprehensive examples demonstrating the capabilities of diagrams-js.

info

These examples are reproduced from the original Python's Diagrams library documentations.

Live Demo

For interactive examples with live rendered diagrams, check out the playground.

Grouped Workers on AWS

import { Diagram } from "diagrams-js";
import { EC2 } from "diagrams-js/aws/compute";
import { RDS } from "diagrams-js/aws/database";
import { ELB } from "diagrams-js/aws/network";

const diagram = Diagram("Grouped Workers", {
direction: "TB",
});

const lb = diagram.add(ELB("lb"));
const workers = [
diagram.add(EC2("worker1")),
diagram.add(EC2("worker2")),
diagram.add(EC2("worker3")),
diagram.add(EC2("worker4")),
diagram.add(EC2("worker5")),
];
const events = diagram.add(RDS("events"));

lb.to(workers);
workers.forEach((w) => w.to(events));

const svg = await diagram.render();
diagram.destroy();
Grouped Workers on AWS

Clustered Web Services

import { Diagram } from "diagrams-js";
import { ECS } from "diagrams-js/aws/compute";
import { RDS, Elasticache } from "diagrams-js/aws/database";
import { ELB, Route53 } from "diagrams-js/aws/network";

const diagram = Diagram("Clustered Web Services");

const dns = diagram.add(Route53("dns"));
const lb = diagram.add(ELB("lb"));

const svcCluster = diagram.cluster("Services");
const svcGroup = [
svcCluster.add(ECS("web1")),
svcCluster.add(ECS("web2")),
svcCluster.add(ECS("web3")),
];
lb.to(svcGroup);

const dbCluster = diagram.cluster("DB Cluster");
const dbPrimary = dbCluster.add(RDS("userdb"));
const dbReplica = dbCluster.add(RDS("userdb ro"));
dbPrimary.with(dbReplica);
svcGroup.forEach((s) => s.to(dbPrimary));

const memcached = diagram.add(Elasticache("memcached"));
svcGroup.forEach((s) => s.to(memcached));

dns.to(lb);

const svg = await diagram.render();
diagram.destroy();
Clustered Web Services

Event Processing on AWS

import { Diagram } from "diagrams-js";
import { ECS, EKS, Lambda } from "diagrams-js/aws/compute";
import { Redshift } from "diagrams-js/aws/database";
import { SQS } from "diagrams-js/aws/integration";
import { S3 } from "diagrams-js/aws/storage";

const diagram = Diagram("Event Processing");

const source = diagram.add(EKS("k8s source"));
const store = diagram.add(S3("events store"));
const dw = diagram.add(Redshift("analytics"));

const flowsCluster = diagram.cluster("Event Flows");

const workersCluster = flowsCluster.cluster("Event Workers");
const workerNodes = [
workersCluster.add(ECS("worker1")),
workersCluster.add(ECS("worker2")),
workersCluster.add(ECS("worker3")),
];
source.to(workerNodes);

const queue = flowsCluster.add(SQS("event queue"));
workerNodes.forEach((w) => w.to(queue));

const procCluster = flowsCluster.cluster("Processing");
const handlers = [
procCluster.add(Lambda("proc1")),
procCluster.add(Lambda("proc2")),
procCluster.add(Lambda("proc3")),
];
queue.to(handlers);
handlers.forEach((h) => {
h.to(store);
h.to(dw);
});

const svg = await diagram.render();
diagram.destroy();
Event Processing on AWS

Message Collecting System on GCP

import { Diagram } from "diagrams-js";
import { BigQuery, Dataflow, PubSub } from "diagrams-js/gcp/analytics";
import { AppEngine, Functions } from "diagrams-js/gcp/compute";
import { Bigtable } from "diagrams-js/gcp/database";
import { IotCore } from "diagrams-js/gcp/iot";
import { Storage } from "diagrams-js/gcp/storage";

const diagram = Diagram("Message Collecting");

const pubsub = diagram.add(PubSub("pubsub"));

const sourceCluster = diagram.cluster("Source of Data");
const sources = [
sourceCluster.add(IotCore("core1")),
sourceCluster.add(IotCore("core2")),
sourceCluster.add(IotCore("core3")),
];
sources.forEach((s) => s.to(pubsub));

const targetsCluster = diagram.cluster("Targets");
const flowCluster = targetsCluster.cluster("Data Flow");
const dataflow = flowCluster.add(Dataflow("data flow"));
pubsub.to(dataflow);

const lakeCluster = targetsCluster.cluster("Data Lake");
const bq = lakeCluster.add(BigQuery("bq"));
const gcs = lakeCluster.add(Storage("storage"));
dataflow.to([bq, gcs]);

const eventCluster = targetsCluster.cluster("Event Driven");

const procCluster = eventCluster.cluster("Processing");
const engine = procCluster.add(AppEngine("engine"));
const bigtable = procCluster.add(Bigtable("bigtable"));
dataflow.to(engine).to(bigtable);

const serverlessCluster = eventCluster.cluster("Serverless");
const func = serverlessCluster.add(Functions("func"));
const appengine = serverlessCluster.add(AppEngine("appengine"));
dataflow.to(func).to(appengine);

const svg = await diagram.render();
diagram.destroy();
Message Collecting System on GCP

Exposed Pod with 3 Replicas on Kubernetes

import { Diagram } from "diagrams-js";
import { HPA } from "diagrams-js/k8s/clusterconfig";
import { Deployment, Pod, ReplicaSet } from "diagrams-js/k8s/compute";
import { Ingress, Service } from "diagrams-js/k8s/network";

const diagram = Diagram("Exposed Pod with 3 Replicas");

const ingress = diagram.add(Ingress("domain.com"));
const svc = diagram.add(Service("svc"));
const pods = [diagram.add(Pod("pod1")), diagram.add(Pod("pod2")), diagram.add(Pod("pod3"))];
const rs = diagram.add(ReplicaSet("rs"));
const dp = diagram.add(Deployment("dp"));
const hpa = diagram.add(HPA("hpa"));

ingress.to(svc);
svc.to(pods);
pods.forEach((p) => p.from(rs));
rs.from(dp);
dp.from(hpa);

const svg = await diagram.render();
diagram.destroy();
Exposed Pod with 3 Replicas

Stateful Architecture on Kubernetes

import { Diagram } from "diagrams-js";
import { Pod, StatefulSet } from "diagrams-js/k8s/compute";
import { Service } from "diagrams-js/k8s/network";
import { PV, PVC } from "diagrams-js/k8s/storage";

const diagram = Diagram("Stateful Architecture");
const appsCluster = diagram.cluster("Apps");
const svc = appsCluster.add(Service("svc"));
const sts = appsCluster.add(StatefulSet("sts"));
const pods = [];
const pvcs = [];
for (let i = 0; i < 3; i++) {
const pod = appsCluster.add(Pod("pod"));
const pvc = appsCluster.add(PVC("pvc"));

pod.with(sts).with(pvc);
svc.to(pod).to(pvc);

pods.push(pod);
pvcs.push(pvc);
}

const pv = diagram.add(PV("pv"));
const sc = diagram.add(StorageClass("sc"));

pvcs.forEach((pvc) => {
pvc.from(pv);
});
pv.from(sc);

const svg = await diagram.render();
diagram.destroy();
Stateful Architecture

Advanced Web Service with On-Premises

import { Diagram } from "diagrams-js";
import { Spark } from "diagrams-js/onprem/analytics";
import { Server } from "diagrams-js/onprem/compute";
import { PostgreSQL } from "diagrams-js/onprem/database";
import { Redis } from "diagrams-js/onprem/inmemory";
import { Fluentd } from "diagrams-js/onprem/aggregator";
import { Grafana, Prometheus } from "diagrams-js/onprem/monitoring";
import { Nginx } from "diagrams-js/onprem/network";
import { Kafka } from "diagrams-js/onprem/queue";

const diagram = Diagram("Advanced Web Service with On-Premises");

const ingress = diagram.add(Nginx("ingress"));

const metrics = diagram.add(Prometheus("metric"));
const grafana = diagram.add(Grafana("monitoring"));
metrics.from(grafana);

const serviceCluster = diagram.cluster("Service Cluster");
const grpcsvc = [
serviceCluster.add(Server("grpc1")),
serviceCluster.add(Server("grpc2")),
serviceCluster.add(Server("grpc3")),
];

const sessionsCluster = diagram.cluster("Sessions HA");
const sessionPrimary = sessionsCluster.add(Redis("session"));
const sessionReplica = sessionsCluster.add(Redis("replica"));
sessionPrimary.with(sessionReplica);
sessionReplica.from(metrics);
grpcsvc.forEach((svc) => svc.to(sessionPrimary));

const dbCluster = diagram.cluster("Database HA");
const dbPrimary = dbCluster.add(PostgreSQL("users"));
const dbReplica = dbCluster.add(PostgreSQL("replica"));
dbPrimary.with(dbReplica);
dbReplica.from(metrics);
grpcsvc.forEach((svc) => svc.to(dbPrimary));

const aggregator = diagram.add(Fluentd("logging"));
const kafka = diagram.add(Kafka("stream"));
const spark = diagram.add(Spark("analytics"));
aggregator.to(kafka).to(spark);

ingress.to(grpcsvc);
grpcsvc.forEach((svc) => svc.to(aggregator));

const svg = await diagram.render();
diagram.destroy();
Advanced Web Service with On-Premises

Advanced Web Service with On-Premises (with colors and labels)

import { Diagram, Edge } from "diagrams-js";
import { Spark } from "diagrams-js/onprem/analytics";
import { Server } from "diagrams-js/onprem/compute";
import { PostgreSQL } from "diagrams-js/onprem/database";
import { Redis } from "diagrams-js/onprem/inmemory";
import { Fluentd } from "diagrams-js/onprem/aggregator";
import { Grafana, Prometheus } from "diagrams-js/onprem/monitoring";
import { Nginx } from "diagrams-js/onprem/network";
import { Kafka } from "diagrams-js/onprem/queue";

const diagram = Diagram("Advanced Web Service with On-Premises (colored)");

const ingress = diagram.add(Nginx("ingress"));

const metrics = diagram.add(Prometheus("metric"));
const grafana = diagram.add(Grafana("monitoring"));
grafana.to(Edge({ color: "firebrick", style: "dashed" }), metrics);

const serviceCluster = diagram.cluster("Service Cluster");
const grpcsvc = [
serviceCluster.add(Server("grpc1")),
serviceCluster.add(Server("grpc2")),
serviceCluster.add(Server("grpc3")),
];

const sessionsCluster = diagram.cluster("Sessions HA");
const sessionPrimary = sessionsCluster.add(Redis("session"));
const sessionReplica = sessionsCluster.add(Redis("replica"));
sessionPrimary.with(Edge({ color: "brown", style: "dashed" }), sessionReplica);
sessionReplica.from(Edge({ label: "collect" }), metrics);
grpcsvc.forEach((svc) => svc.to(Edge({ color: "brown" }), sessionPrimary));

const dbCluster = diagram.cluster("Database HA");
const dbPrimary = dbCluster.add(PostgreSQL("users"));
const dbReplica = dbCluster.add(PostgreSQL("replica"));
dbPrimary.with(Edge({ color: "brown", style: "dotted" }), dbReplica);
dbReplica.from(Edge({ label: "collect" }), metrics);
grpcsvc.forEach((svc) => svc.to(Edge({ color: "black" }), dbPrimary));

const aggregator = diagram.add(Fluentd("logging"));
const kafka = diagram.add(Kafka("stream"));
const spark = diagram.add(Spark("analytics"));
aggregator.to(Edge({ label: "parse" }), kafka);
kafka.to(Edge({ color: "black", style: "bold" }), spark);

grpcsvc.forEach((svc) => {
ingress.to(Edge({ color: "darkgreen", forward: true, reverse: true }), svc);
});
grpcsvc.forEach((svc) => svc.to(Edge({ color: "darkorange" }), aggregator));

const svg = await diagram.render();
diagram.destroy();
Advanced Web Service with On-Premises (with colors and labels)

RabbitMQ Consumers with Custom Nodes

import { Diagram, Custom } from "diagrams-js";
import { Pod } from "diagrams-js/k8s/compute";
import { Aurora } from "diagrams-js/aws/database";

const diagram = Diagram("Broker Consumers");

const consumersCluster = diagram.cluster("Consumers");
const consumers = [
consumersCluster.add(Pod("worker")),
consumersCluster.add(Pod("worker")),
consumersCluster.add(Pod("worker")),
];

const queue = diagram.add(
Custom("Message queue", "https://jpadilla.github.io/rabbitmqapp/assets/img/icon.png", {
width: "1.0",
}),
);

const database = diagram.add(Aurora("Database"));

queue.to(consumers);
consumers.forEach((consumer) => consumer.to(database));

const svg = await diagram.render();
diagram.destroy();
RabbitMQ Consumers with Custom Nodes

Next Steps