Skip to content

Diagrams Rendering Support¤

Diagram rendering support with svg mode.

Requirements¤

pip install diagrams

Example¤

Set up your defaults, typically in a silent block:

# graphviz setup
 gv = {
     "fontsize": "17",
     "fontcolor": "gray",
     "labelfontcolor": "white",
     "bgcolor": "transparent",
 }
 
 def diagr(**kw):
     '''factory creating same style Diagram context mgr objects'''
     from diagrams import Diagram
     setup = dict(show=False, outformat='svg', filename='tmpf',
                  graph_attr=gv,
                  node_attr=gv,
                  edge_attr=gv)
     setup.update(kw)
     return Diagram(**setup)
 
 def T(typ, *a, **kw):
     kw['graph_attr'] = gv
     return typ(*a, **kw)
  • Note the outformat is svg
  • No limits regarding sophistication - the factory approach is just an example

Then use the library like normal, added our show based renderer at the end:

LP Source:

 ```python lp:python addsrc eval=always session=gvdiag
 from diagrams import Cluster, Diagram
 from diagrams.aws.compute import ECS
 from diagrams.aws.database import ElastiCache, RDS
 from diagrams.aws.network import ELB
 from diagrams.aws.network import Route53
 
 with diagr(name="Clustered Web Services") as d:
     dns = Route53("dns")
     lb = ELB("lb")
 
     with Cluster("Services"):
         svc_group = [ECS("web1"),
                      ECS("web2"),
                      ECS("web3")]
 
     with Cluster("DB Cluster"):
         db_main = RDS("userdb")
         db_main - [RDS("userdb ro")]
 
     memcached = ElastiCache("memcached")
 
     dns >> lb >> svc_group
     svc_group >> db_main
     svc_group >> memcached
 show(d)
 ```

Result:

Clustered Web ServicesClustered Web Servicescluster_ServicesServicescluster_DB ClusterDB Cluster776bfdfdf58a4c0d9074098bb2bc62e0dns015d19a1d46c45288d70b4190546953blb776bfdfdf58a4c0d9074098bb2bc62e0->015d19a1d46c45288d70b4190546953bc2ca207263ca4b25a2128a20f0b0fa65web1015d19a1d46c45288d70b4190546953b->c2ca207263ca4b25a2128a20f0b0fa652c194b6e322848f493bd16109cf0b44eweb2015d19a1d46c45288d70b4190546953b->2c194b6e322848f493bd16109cf0b44e9d421a1340cd47f5aacc0f73d8614ca2web3015d19a1d46c45288d70b4190546953b->9d421a1340cd47f5aacc0f73d8614ca29a74ef601c9a491fa547d6a504be36f8userdbc2ca207263ca4b25a2128a20f0b0fa65->9a74ef601c9a491fa547d6a504be36f8c746c41396b74c0586d9a364b53ba5a6memcachedc2ca207263ca4b25a2128a20f0b0fa65->c746c41396b74c0586d9a364b53ba5a62c194b6e322848f493bd16109cf0b44e->9a74ef601c9a491fa547d6a504be36f82c194b6e322848f493bd16109cf0b44e->c746c41396b74c0586d9a364b53ba5a69d421a1340cd47f5aacc0f73d8614ca2->9a74ef601c9a491fa547d6a504be36f89d421a1340cd47f5aacc0f73d8614ca2->c746c41396b74c0586d9a364b53ba5a69e32f524dee04accabb101ae2a66631buserdb ro9a74ef601c9a491fa547d6a504be36f8->9e32f524dee04accabb101ae2a66631b

Inline Colors¤

Advanced Web Service with On-Premise (colored)Advanced Web Service with On-Premise (colored)cluster_Service ClusterService Clustercluster_Sessions HASessions HAcluster_Database HADatabase HA6e53d0f429ba4c5ca4d779093d9e8c4dingress3f7442482dfd42828fa620e3e7d2800egrpc16e53d0f429ba4c5ca4d779093d9e8c4d->3f7442482dfd42828fa620e3e7d2800e21fdb266c3dc44fe96eb95329f814ed7grpc26e53d0f429ba4c5ca4d779093d9e8c4d->21fdb266c3dc44fe96eb95329f814ed7e00d344b041a471c84583063b1e00df8grpc36e53d0f429ba4c5ca4d779093d9e8c4d->e00d344b041a471c84583063b1e00df8a1976ffe07a54005b1c523e654631e6dmetricfca70c4b09984c908c1f3c672087d5f1monitoringa1976ffe07a54005b1c523e654631e6d->fca70c4b09984c908c1f3c672087d5f1d32429e2910844b7b7d48a359544a150session3f7442482dfd42828fa620e3e7d2800e->d32429e2910844b7b7d48a359544a150cf75bd19e68d4e4baa09dbd372b7e3dbusers3f7442482dfd42828fa620e3e7d2800e->cf75bd19e68d4e4baa09dbd372b7e3db115ce6056b8a4149b373f01d431e3f82logging3f7442482dfd42828fa620e3e7d2800e->115ce6056b8a4149b373f01d431e3f8221fdb266c3dc44fe96eb95329f814ed7->d32429e2910844b7b7d48a359544a15021fdb266c3dc44fe96eb95329f814ed7->cf75bd19e68d4e4baa09dbd372b7e3db21fdb266c3dc44fe96eb95329f814ed7->115ce6056b8a4149b373f01d431e3f82e00d344b041a471c84583063b1e00df8->d32429e2910844b7b7d48a359544a150e00d344b041a471c84583063b1e00df8->cf75bd19e68d4e4baa09dbd372b7e3dbe00d344b041a471c84583063b1e00df8->115ce6056b8a4149b373f01d431e3f82eff1e881c2cf403da36c097764740b87replicad32429e2910844b7b7d48a359544a150->eff1e881c2cf403da36c097764740b87eff1e881c2cf403da36c097764740b87->a1976ffe07a54005b1c523e654631e6dcollecta6c6421c007c4ac38aca5bd285bcb305replicacf75bd19e68d4e4baa09dbd372b7e3db->a6c6421c007c4ac38aca5bd285bcb305a6c6421c007c4ac38aca5bd285bcb305->a1976ffe07a54005b1c523e654631e6dcollected04c63b66da47f4850b0dc10e8e1644stream115ce6056b8a4149b373f01d431e3f82->ed04c63b66da47f4850b0dc10e8e1644parse6f15ced1fdae47b8848393da8767c3a9analyticsed04c63b66da47f4850b0dc10e8e1644->6f15ced1fdae47b8848393da8767c3a9

 
 ```python lp:python addsrc="Cloud Computing Example" eval=always session=gvdiag
 from diagrams import Cluster, Edge
 from diagrams.onprem.analytics import Spark
 from diagrams.onprem.compute import Server
 from diagrams.onprem.database import PostgreSQL
 from diagrams.onprem.inmemory import Redis
 from diagrams.onprem.aggregator import Fluentd
 from diagrams.onprem.monitoring import Grafana, Prometheus
 from diagrams.onprem.network import Nginx
 from diagrams.onprem.queue import Kafka
 
 
 with diagr(name="Advanced Web Service with On-Premise (colored)") as diag:
     ingress = Nginx("ingress")
 
     metrics = Prometheus("metric")
     metrics << Edge(color="firebrick", style="dashed") << Grafana("monitoring")
 
     with T(Cluster, "Service Cluster"):
         grpcsvc = [
             Server("grpc1", fontcolor="black"),
             Server("grpc2"),
             Server("grpc3")]
 
     with T(Cluster,"Sessions HA"):
         main = Redis("session")
         main - Edge(color="brown", style="dashed") - Redis("replica") << Edge(label="collect") << metrics
         grpcsvc >> Edge(color="brown") >> main
 
     with T(Cluster, "Database HA"):
         main = PostgreSQL("users")
         main - Edge(color="brown", style="dotted") - PostgreSQL("replica") << Edge(label="collect") << metrics
         grpcsvc >> Edge(color="black") >> main
 
     aggregator = Fluentd("logging")
     aggregator >> Edge(label="parse") >> Kafka("stream") >> Edge(color="black", style="bold") >> Spark("analytics")
 
     ingress >> Edge(color="darkgreen") << grpcsvc >> Edge(color="darkorange") >> aggregator
 
 show(diag) # this is passed into the plugin rendering function
 ```

Tech¤

The challenge here is to get svgs displayable within your docs.

They normally contain xlinked png images, pointing to your diagram package in site-directory - i.e. not served by a static documentation server.

Solution:

Through a patched icon loader, we detect which png icons your diagram requires and copy them over to docsdir/icons_diagram. You can git-ignore that directory, so that images do not pile up there.