Skip to content

Instantly share code, notes, and snippets.

@epifanio
Created February 24, 2022 10:15
Show Gist options
  • Save epifanio/42d8c0ddb4bbf94a1e63b3c223a20208 to your computer and use it in GitHub Desktop.
Save epifanio/42d8c0ddb4bbf94a1e63b3c223a20208 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import iplantuml"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" contentStyleType=\"text/css\" height=\"987px\" preserveAspectRatio=\"none\" style=\"width:1895px;height:987px;background:#FFFFFF;\" version=\"1.1\" viewBox=\"0 0 1895 987\" width=\"1895px\" zoomAndPan=\"magnify\"><defs/><g><!--MD5=[11e4ccc881db60eff8b15d16aceed072]\n",
"cluster monitoring--><g id=\"cluster_monitoring\"><rect height=\"617\" style=\"stroke:#444444;stroke-width:1.0;fill:none;\" width=\"976\" x=\"229.5\" y=\"169\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"99\" x=\"668\" y=\"185.8516\">Monitoring</text><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"64\" x=\"685.5\" y=\"200.7637\">[System]</text></g><!--MD5=[2f9795ea503557699cddd4010d0870e5]\n",
"entity checker--><g id=\"elem_checker\"><rect fill=\"#438DD5\" height=\"134.0781\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"241\" x=\"695\" y=\"294.5\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"167\" x=\"732\" y=\"319.3516\">Metadata Checker</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"52\" x=\"789.5\" y=\"334.2637\">[Python]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"817.5\" y=\"350.0889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"120\" x=\"755.5\" y=\"366.3857\">Regularly checks</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"153\" x=\"737\" y=\"382.6826\">consistency between</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"176\" x=\"725.5\" y=\"398.9795\">metadata, data and data</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"221\" x=\"705\" y=\"415.2764\">representations/visualizations.</text></g><!--MD5=[9f0f17dcbbb2e82333b68d7cc441304d]\n",
"entity pagerduty--><g id=\"elem_pagerduty\"><rect fill=\"#438DD5\" height=\"85.1875\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"159\" x=\"501\" y=\"319\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"94\" x=\"533.5\" y=\"343.8516\">Pagerduty</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"18\" x=\"571.5\" y=\"358.7637\">[--]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"582.5\" y=\"374.5889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"135\" x=\"515\" y=\"390.8857\">Needs description.</text></g><!--MD5=[d40ecb68fd03c4f349b7481a726a4cee]\n",
"entity web_app--><g id=\"elem_web_app\"><rect fill=\"#438DD5\" height=\"215.5625\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"220\" x=\"245.5\" y=\"253.5\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"148\" x=\"281.5\" y=\"278.3516\">Web Application</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"43\" x=\"334\" y=\"293.2637\">[HTML]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"357.5\" y=\"309.0889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"285.5\" y=\"325.3857\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"75\" x=\"285.5\" y=\"325.3857\">Optional.</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"61\" x=\"364.5\" y=\"325.3857\">Provides</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"172\" x=\"267.5\" y=\"341.6826\">functionality to register</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"140\" x=\"283.5\" y=\"357.9795\">dataset and service</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"187\" x=\"260\" y=\"374.2764\">metadata, display dataset</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"200\" x=\"255.5\" y=\"390.5732\">and service usage statistics,</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"161\" x=\"273\" y=\"406.8701\">production status, and</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"152\" x=\"277.5\" y=\"423.167\">monitor metadata to</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"194\" x=\"256.5\" y=\"439.4639\">display errors and warnings</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"169\" x=\"271\" y=\"455.7607\">(e.g., about dead links).</text></g><!--MD5=[e46539660b77c402df5ce5423023be25]\n",
"entity ghc--><g id=\"elem_ghc\"><rect fill=\"#438DD5\" height=\"283.0781\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"218\" x=\"971.5\" y=\"220\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"172\" x=\"991.5\" y=\"244.8516\">Service Status and</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"116\" x=\"1022.5\" y=\"263.4766\">QoS Checker</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"86\" x=\"1037.5\" y=\"278.3887\">[Python/Flask]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1082.5\" y=\"294.2139\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"194\" x=\"985.5\" y=\"310.5107\">Probably GeoHealthCheck.</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"140\" x=\"1008.5\" y=\"326.8076\">GHC can be used to</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"179\" x=\"989\" y=\"343.1045\">monitor overall health of</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"172\" x=\"992.5\" y=\"359.4014\">OGC services (OWS) like</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"171\" x=\"993\" y=\"375.6982\">WMS, WFS, WCS, WMTS,</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"179\" x=\"989\" y=\"391.9951\">SOS, CSW and more, plus</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"191\" x=\"983\" y=\"408.292\">some recent OGC APIs like</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"188\" x=\"984.5\" y=\"424.5889\">SensorThings API and WFS</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"190\" x=\"983.5\" y=\"440.8857\">v3 (OGC Features API). But</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"170\" x=\"993.5\" y=\"457.1826\">also standard web REST</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"190\" x=\"983.5\" y=\"473.4795\">APIs and ordinary URLs can</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"104\" x=\"1028.5\" y=\"489.7764\">be monitored.</text></g><!--MD5=[76c72a0d0666ffe20c687699125b4b7c]\n",
"entity prometheus--><g id=\"elem_prometheus\"><rect fill=\"#438DD5\" height=\"85.1875\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"150\" x=\"505.5\" y=\"685\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"112\" x=\"524.5\" y=\"709.8516\">Prometheus</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"82\" x=\"539.5\" y=\"724.7637\">[Prometheus]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"582.5\" y=\"740.5889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"126\" x=\"519.5\" y=\"756.8857\">To be described..</text></g><!--MD5=[97029dda41c7f1332efacff3a5502fd8]\n",
"entity grafana--><g id=\"elem_grafana\"><rect fill=\"#438DD5\" height=\"85.1875\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"150\" x=\"690.5\" y=\"685\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"73\" x=\"729\" y=\"709.8516\">Grafana</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"57\" x=\"737\" y=\"724.7637\">[Grafana]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"767.5\" y=\"740.5889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"126\" x=\"704.5\" y=\"756.8857\">To be described..</text></g><!--MD5=[ea52956992243d37ba36a5b465c6cd73]\n",
"entity dataproducer--><g id=\"elem_dataproducer\"><rect fill=\"#08427B\" height=\"86.625\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#073B6F;stroke-width:0.5;\" width=\"183\" x=\"123\" y=\"7\"/><image height=\"48\" width=\"48\" x=\"190.5\" xlink:href=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=\" y=\"17\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"163\" x=\"133\" y=\"79.8516\">Dataset Producer</text></g><!--MD5=[90bbd96a2befa14d681e15cbf81c3bde]\n",
"entity dmservice--><g id=\"elem_dmservice\"><rect fill=\"#1168BD\" height=\"299.375\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"219\" x=\"1222\" y=\"578\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"170\" x=\"1246.5\" y=\"602.8516\">Metadata Services</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1333.5\" y=\"619.6201\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"185\" x=\"1239\" y=\"635.917\">Defines a REST API to add</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"187\" x=\"1236\" y=\"652.2139\">events to an event queue,</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"140\" x=\"1259.5\" y=\"668.5107\">which subsequently</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"197\" x=\"1233\" y=\"684.8076\">triggers subscriber actions.</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"158\" x=\"1250.5\" y=\"701.1045\">The API requires input</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"168\" x=\"1245.5\" y=\"717.4014\">metadata on a required</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"150\" x=\"1254.5\" y=\"733.6982\">format, and provides</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"185\" x=\"1237\" y=\"749.9951\">metadata validators (e.g.,</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"169\" x=\"1245\" y=\"766.292\">for MMD). Also contains</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"190\" x=\"1234.5\" y=\"782.5889\">various storage and search</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"161\" x=\"1249\" y=\"798.8857\">solutions for discovery</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"199\" x=\"1232\" y=\"815.1826\">metadata. The event queue</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"149\" x=\"1255\" y=\"831.4795\">maintains history for</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"195\" x=\"1232\" y=\"847.7764\">allowing temporarily failing</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"173\" x=\"1245\" y=\"864.0732\">subscribers to catch up.</text></g><!--MD5=[30db5ff674db4f06b01c09627501cce9]\n",
"entity productionhub--><g id=\"elem_productionhub\"><rect fill=\"#1168BD\" height=\"103.8125\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"203\" x=\"7\" y=\"309.5\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"101\" x=\"58\" y=\"334.3516\">Production</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"110.5\" y=\"351.1201\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"162\" x=\"27.5\" y=\"367.417\">Automated system for</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"179\" x=\"17\" y=\"383.7139\">data production. ECFlow,</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"97\" x=\"60\" y=\"400.0107\">PPI, SMS, etc.</text></g><!--MD5=[018f7c1d5ecf6c17927325c1265b2bd4]\n",
"entity dist_systems--><g id=\"elem_dist_systems\"><rect fill=\"#1168BD\" height=\"106.1406\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"185\" x=\"1476\" y=\"674.5\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"159\" x=\"1486\" y=\"699.3516\">Data Distribution</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"76\" x=\"1530.5\" y=\"717.9766\">Services</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1570.5\" y=\"734.7451\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"63\" x=\"1537\" y=\"751.042\">Primarily</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"135\" x=\"1501\" y=\"767.3389\">thredds/OPeNDAP.</text></g><!--MD5=[fb72620717b8fda022827df25c9698a7]\n",
"entity vis_systems--><g id=\"elem_vis_systems\"><rect fill=\"#1168BD\" height=\"89.8438\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"193\" x=\"1696\" y=\"682.5\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"167\" x=\"1706\" y=\"707.3516\">Data Visualization</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"76\" x=\"1754.5\" y=\"725.9766\">Services</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1794.5\" y=\"742.7451\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"72\" x=\"1758.5\" y=\"759.042\">WMS, etc.</text></g><!--MD5=[1f74baffd83c813573b91ef6fb90a454]\n",
"link checker to dmservice--><g id=\"link_checker_dmservice\"><path d=\"M867.986,428.518 C891.923,454.904 922.138,483.576 954.5,503 C1054.33,562.917 1108.03,514.314 1205.5,578 C1208.78,580.141 1212.02,582.393 1215.21,584.74 \" fill=\"none\" id=\"checker-to-dmservice\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1221.71,589.687,1217.1587,582.4561,1213.5264,587.2317,1221.71,589.687\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"36\" x=\"1137.5\" y=\"545.1387\">Read</text></g><!--MD5=[95f94857b2229433f28a789a2a19da37]\n",
"link checker to dist_systems--><g id=\"link_checker_dist_systems\"><path d=\"M864.334,428.539 C888.343,456.103 919.617,485.683 954.5,503 C1046.05,548.447 1081.38,518.108 1182.5,533 C1305.46,551.109 1352.38,513.309 1458.5,578 C1493.14,599.115 1520.39,635.596 1539.11,667.115 \" fill=\"none\" id=\"checker-to-dist_systems\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1543.21,674.173,1541.7838,665.7489,1536.5963,668.7638,1543.21,674.173\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"36\" x=\"1390.5\" y=\"545.1387\">Read</text></g><!--MD5=[7a1b9b2f386169cd041d94b2c31c5212]\n",
"link checker to vis_systems--><g id=\"link_checker_vis_systems\"><path d=\"M862.858,428.559 C886.878,456.665 918.576,486.675 954.5,503 C1052,547.307 1329.21,519.892 1435.5,533 C1544.51,546.443 1584.84,520.628 1678.5,578 C1716.54,601.299 1746.55,642.295 1766.22,675.317 \" fill=\"none\" id=\"checker-to-vis_systems\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1770.26,682.234,1768.8195,673.8123,1763.6371,676.8361,1770.26,682.234\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"36\" x=\"1614.5\" y=\"545.1387\">Read</text></g><!--MD5=[cecbab7a32098c86e4dece7dc561ec62]\n",
"link dataproducer to web_app--><g id=\"link_dataproducer_web_app\"><path d=\"M259.695,94.258 C267.759,103.491 275.491,113.616 281.5,124 C303.015,161.178 319.004,205.33 330.505,245.362 \" fill=\"none\" id=\"dataproducer-to-web_app\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"332.746,253.31,333.462,244.7961,327.6873,246.4246,332.746,253.31\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"95\" x=\"295.5\" y=\"143.1387\">Check status</text></g><!--MD5=[eb16f039d35181c4fe431cb7f361e714]\n",
"link dataproducer to productionhub--><g id=\"link_dataproducer_productionhub\"><path d=\"M160.766,94.385 C152.462,103.334 144.874,113.324 139.5,124 C111.545,179.535 105.7178,251.278 105.6784,301.114 \" fill=\"none\" id=\"dataproducer-to-productionhub\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"105.7228,309.227,108.6785,301.2105,102.6786,301.2437,105.7228,309.227\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"85\" x=\"164\" y=\"136.1387\">Set up data</text><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"136\" x=\"140.5\" y=\"150.1074\">production system</text></g><!--MD5=[f4ec7d816dcb9673b5bbc0a9bdc172bb]\n",
"link pagerduty to ghc--></g></svg>"
],
"text/plain": [
"<IPython.core.display.SVG object>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%plantuml\n",
"\n",
"@startuml S-ENDA-monitoring-container-diagram\n",
"!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml\n",
"\n",
"LAYOUT_TOP_DOWN()\n",
"\n",
"Person(dataproducer, \"Dataset Producer\")\n",
"\n",
"System(dmservice, \"Metadata Services\", \"Defines a REST API to add events to an event queue, which subsequently triggers subscriber actions. The API requires input metadata on a required format, and provides metadata validators (e.g., for MMD). Also contains various storage and search solutions for discovery metadata. The event queue maintains history for allowing temporarily failing subscribers to catch up.\")\n",
"System(productionhub, \"Production\", \"Automated system for data production. ECFlow, PPI, SMS, etc.\")\n",
"System(dist_systems, \"Data Distribution Services\", \"Primarily thredds/OPeNDAP.\")\n",
"System(vis_systems, \"Data Visualization Services\", \"WMS, etc.\")\n",
"\n",
"System_Boundary(monitoring, \"Monitoring\", \"Monitoring of usage, metadata consistency, and status of services and production chains. Uses existing systems (e.g., prometheus/grafana).\"){\n",
"\n",
" Container(checker, \"Metadata Checker\", \"Python\", \"Regularly checks consistency between metadata, data and data representations/visualizations.\")\n",
"\n",
" Container(pagerduty, \"Pagerduty\", \"--\", \"Needs description.\")\n",
"\n",
" Container(web_app, \"Web Application\", \"HTML\", \"<b>Optional.</b> Provides functionality to register dataset and service metadata, display dataset and service usage statistics, production status, and monitor metadata to display errors and warnings (e.g., about dead links).\")\n",
"\n",
" Container(ghc, \"Service Status and QoS Checker\", \"Python/Flask\", \"Probably GeoHealthCheck. GHC can be used to monitor overall health of OGC services (OWS) like WMS, WFS, WCS, WMTS, SOS, CSW and more, plus some recent OGC APIs like SensorThings API and WFS v3 (OGC Features API). But also standard web REST APIs and ordinary URLs can be monitored.\")\n",
"\n",
" Container(prometheus, \"Prometheus\", \"Prometheus\", \"To be described..\")\n",
" Container(grafana, \"Grafana\", \"Grafana\", \"To be described..\")\n",
"\n",
"}\n",
"\n",
"Rel(checker, dmservice, \"Read\")\n",
"Rel(checker, dist_systems, \"Read\")\n",
"Rel(checker, vis_systems, \"Read\")\n",
"\n",
"Rel(dataproducer, web_app, \"Check status\")\n",
"\n",
"Rel(dataproducer, productionhub, \"Set up data production system\")\n",
"'Rel(productionhub, dist_systems, \"Store\")\n",
"'Rel(productionhub, dmservice, \"Validate/create/update/delete\", \"HTTP POST\")\n",
"'Rel(productionhub, dmservice, \"Listen\", \"CloudEvent\")\n",
"'Rel(productionhub, vis_systems, \"Store/Configure\")\n",
"\n",
"SHOW_LEGEND()\n",
"\n",
"@enduml"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" contentStyleType=\"text/css\" height=\"1631px\" preserveAspectRatio=\"none\" style=\"width:1783px;height:1631px;background:#FFFFFF;\" version=\"1.1\" viewBox=\"0 0 1783 1631\" width=\"1783px\" zoomAndPan=\"magnify\"><defs/><g><!--MD5=[11e4ccc881db60eff8b15d16aceed072]\n",
"cluster monitoring--><g id=\"cluster_monitoring\"><rect height=\"1173\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#444444;stroke-width:1.0;fill:none;\" width=\"949\" x=\"690.5\" y=\"348\"/><text fill=\"#444444\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"99\" x=\"1115.5\" y=\"364.8516\">Monitoring</text><text fill=\"#444444\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"64\" x=\"1133\" y=\"379.7637\">[System]</text></g><!--MD5=[2f9795ea503557699cddd4010d0870e5]\n",
"entity checker--><g id=\"elem_checker\"><rect fill=\"#438DD5\" height=\"134.0781\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"241\" x=\"707\" y=\"441\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"167\" x=\"744\" y=\"465.8516\">Metadata Checker</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"52\" x=\"801.5\" y=\"480.7637\">[Python]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"829.5\" y=\"496.5889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"120\" x=\"767.5\" y=\"512.8857\">Regularly checks</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"153\" x=\"749\" y=\"529.1826\">consistency between</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"176\" x=\"737.5\" y=\"545.4795\">metadata, data and data</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"221\" x=\"717\" y=\"561.7764\">representations/visualizations.</text></g><!--MD5=[9f0f17dcbbb2e82333b68d7cc441304d]\n",
"entity pagerduty--><g id=\"elem_pagerduty\"><rect fill=\"#438DD5\" height=\"117.7813\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"209\" x=\"964\" y=\"1387\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"96\" x=\"1020.5\" y=\"1411.8516\">PagerDuty</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"135\" x=\"1001\" y=\"1426.7637\">[SaaS-based platform]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1070.5\" y=\"1442.5889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"181\" x=\"978\" y=\"1458.8857\">Externally hosted service</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"177\" x=\"978\" y=\"1475.1826\">to manage incidents and</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"46\" x=\"1045.5\" y=\"1491.4795\">alerts.</text></g><!--MD5=[1fe137faeb30a9a0530a08fa6f9d4126]\n",
"entity pushgateway--><g id=\"elem_pushgateway\"><rect fill=\"#438DD5\" height=\"148.0469\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"217\" x=\"1406\" y=\"434\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"122\" x=\"1453.5\" y=\"458.8516\">Pushgateway</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"184\" x=\"1420.5\" y=\"473.7637\">[Server: mostly JavaScript and</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"21\" x=\"1504\" y=\"487.7324\">Go]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1516.5\" y=\"503.5576\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"193\" x=\"1420\" y=\"519.8545\">Intermediary service which</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"180\" x=\"1422.5\" y=\"536.1514\">allows to push metrics to</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"160\" x=\"1432.5\" y=\"552.4482\">Prometheus from jobs</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"184\" x=\"1422.5\" y=\"568.7451\">which cannot be scraped.</text></g><!--MD5=[01642738cedb32e5523dd6705f7fffc8]\n",
"entity alertmanager--><g id=\"elem_alertmanager\"><rect fill=\"#438DD5\" height=\"266.7813\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"220\" x=\"958.5\" y=\"1045\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"112\" x=\"1009.5\" y=\"1069.8516\">Prometheus</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"125\" x=\"1006\" y=\"1088.4766\">Alertmanager</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"117\" x=\"1010\" y=\"1103.3887\">[Server: mostly Go]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1070.5\" y=\"1119.2139\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"189\" x=\"974\" y=\"1135.5107\">The Alertmanager handles</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"144\" x=\"994.5\" y=\"1151.8076\">alerts sent by client</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"172\" x=\"980.5\" y=\"1168.1045\">applications such as the</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"200\" x=\"968.5\" y=\"1184.4014\">Prometheus server. It takes</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"156\" x=\"988.5\" y=\"1200.6982\">care of deduplicating,</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"197\" x=\"970\" y=\"1216.9951\">grouping, and routing them</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"165\" x=\"984\" y=\"1233.292\">to the correct receiver</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"198\" x=\"969.5\" y=\"1249.5889\">integration such as email or</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"171\" x=\"981\" y=\"1265.8857\">PagerDuty. It also takes</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"147\" x=\"993\" y=\"1282.1826\">care of silencing and</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"138\" x=\"999.5\" y=\"1298.4795\">inhibition of alerts.</text></g><!--MD5=[d40ecb68fd03c4f349b7481a726a4cee]\n",
"entity web_app--><g id=\"elem_web_app\"><rect fill=\"#438DD5\" height=\"215.5625\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"220\" x=\"1110.5\" y=\"712.5\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"148\" x=\"1146.5\" y=\"737.3516\">Web Application</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"43\" x=\"1199\" y=\"752.2637\">[HTML]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1222.5\" y=\"768.0889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1150.5\" y=\"784.3857\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"75\" x=\"1150.5\" y=\"784.3857\">Optional.</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"61\" x=\"1229.5\" y=\"784.3857\">Provides</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"172\" x=\"1132.5\" y=\"800.6826\">functionality to register</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"140\" x=\"1148.5\" y=\"816.9795\">dataset and service</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"187\" x=\"1125\" y=\"833.2764\">metadata, display dataset</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"200\" x=\"1120.5\" y=\"849.5732\">and service usage statistics,</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"161\" x=\"1138\" y=\"865.8701\">production status, and</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"152\" x=\"1142.5\" y=\"882.167\">monitor metadata to</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"194\" x=\"1121.5\" y=\"898.4639\">display errors and warnings</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"169\" x=\"1136\" y=\"914.7607\">(e.g., about dead links).</text></g><!--MD5=[e46539660b77c402df5ce5423023be25]\n",
"entity ghc--><g id=\"elem_ghc\"><rect fill=\"#438DD5\" height=\"134.0781\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"219\" x=\"813\" y=\"753.5\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"149\" x=\"848\" y=\"778.3516\">GeoHealthCheck</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"99\" x=\"873\" y=\"793.2637\">[Server: Python]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"924.5\" y=\"809.0889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"193\" x=\"828\" y=\"825.3857\">Check validity of resources</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"199\" x=\"823\" y=\"841.6826\">available via OGC Standards</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"185\" x=\"828\" y=\"857.9795\">(WMS, WFS, CSW, HTTP) +</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"162\" x=\"841.5\" y=\"874.2764\">custom probe system.</text></g><!--MD5=[76c72a0d0666ffe20c687699125b4b7c]\n",
"entity prometheus--><g id=\"elem_prometheus\"><rect fill=\"#438DD5\" height=\"182.9688\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"220\" x=\"1386.5\" y=\"729\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"112\" x=\"1440.5\" y=\"753.8516\">Prometheus</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"117\" x=\"1438\" y=\"768.7637\">[Server: mostly Go]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1498.5\" y=\"784.5889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"156\" x=\"1418.5\" y=\"800.8857\">Collects metrics from</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"196\" x=\"1396.5\" y=\"817.1826\">configured targets at given</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"169\" x=\"1410\" y=\"833.4795\">intervals, evaluates rule</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"179\" x=\"1405\" y=\"849.7764\">expressions, displays the</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"165\" x=\"1412\" y=\"866.0732\">results, and can trigger</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"153\" x=\"1418\" y=\"882.3701\">alerts when specified</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"178\" x=\"1407.5\" y=\"898.667\">conditions are observed.</text></g><!--MD5=[97029dda41c7f1332efacff3a5502fd8]\n",
"entity grafana--><g id=\"elem_grafana\"><rect fill=\"#438DD5\" height=\"150.375\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"210\" x=\"1216.5\" y=\"1103.5\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"73\" x=\"1285\" y=\"1128.3516\">Grafana</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"164\" x=\"1239.5\" y=\"1143.2637\">[mostly Typescript and Go]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1323.5\" y=\"1159.0889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"182\" x=\"1230.5\" y=\"1175.3857\">Open source visualization</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"160\" x=\"1239.5\" y=\"1191.6826\">and analytics software</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"156\" x=\"1241.5\" y=\"1207.9795\">which allows to query,</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"154\" x=\"1242.5\" y=\"1224.2764\">visualize, alert on and</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"145\" x=\"1249\" y=\"1240.5732\">understand metrics.</text></g><!--MD5=[9d78178ee84daed132385cf48b48bda8]\n",
"entity pingdom--><g id=\"elem_pingdom\"><rect fill=\"#438DD5\" height=\"101.4844\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"209\" x=\"707\" y=\"1128\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"79\" x=\"772\" y=\"1152.8516\">Pingdom</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"135\" x=\"744\" y=\"1167.7637\">[SaaS-based platform]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"813.5\" y=\"1183.5889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"181\" x=\"721\" y=\"1199.8857\">Externally hosted service</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"171\" x=\"726\" y=\"1216.1826\">for website monitoring.</text></g><!--MD5=[43030a5e48a55402ac9ddc0b9f97953f]\n",
"entity portainer--><g id=\"elem_portainer\"><rect fill=\"#438DD5\" height=\"117.7813\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"174\" x=\"1196.5\" y=\"449\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"87\" x=\"1240\" y=\"473.8516\">Portainer</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"98\" x=\"1234.5\" y=\"488.7637\">[Server: js/html]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1285.5\" y=\"504.5889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"136\" x=\"1215.5\" y=\"520.8857\">centralized service</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"150\" x=\"1206.5\" y=\"537.1826\">delivery platform for</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"138\" x=\"1214.5\" y=\"553.4795\">containerized apps</text></g><!--MD5=[568c7b5f69f145e09249e8a9011ba912]\n",
"entity swarmpit--><g id=\"elem_swarmpit\"><rect fill=\"#438DD5\" height=\"101.4844\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"178\" x=\"983.5\" y=\"457.5\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"87\" x=\"1029\" y=\"482.3516\">Swarmpit</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"12\" font-style=\"italic\" lengthAdjust=\"spacing\" textLength=\"82\" x=\"1031.5\" y=\"497.2637\">[Server: Java]</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1074.5\" y=\"513.0889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"150\" x=\"997.5\" y=\"529.3857\">UI to manage Docker</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"101\" x=\"1022\" y=\"545.6826\">Swarm cluster</text></g><!--MD5=[ea52956992243d37ba36a5b465c6cd73]\n",
"entity dataproducer--><g id=\"elem_dataproducer\"><rect fill=\"#08427B\" height=\"86.625\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#073B6F;stroke-width:0.5;\" width=\"183\" x=\"1504\" y=\"7\"/><image height=\"48\" width=\"48\" x=\"1571.5\" xlink:href=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=\" y=\"17\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"163\" x=\"1514\" y=\"79.8516\">Dataset Producer</text></g><!--MD5=[90bbd96a2befa14d681e15cbf81c3bde]\n",
"entity dmservice--><g id=\"elem_dmservice\"><rect fill=\"#1168BD\" height=\"299.375\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"219\" x=\"7\" y=\"671\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"170\" x=\"31.5\" y=\"695.8516\">Metadata Services</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"118.5\" y=\"712.6201\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"185\" x=\"24\" y=\"728.917\">Defines a REST API to add</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"187\" x=\"21\" y=\"745.2139\">events to an event queue,</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"140\" x=\"44.5\" y=\"761.5107\">which subsequently</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"197\" x=\"18\" y=\"777.8076\">triggers subscriber actions.</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"158\" x=\"35.5\" y=\"794.1045\">The API requires input</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"168\" x=\"30.5\" y=\"810.4014\">metadata on a required</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"150\" x=\"39.5\" y=\"826.6982\">format, and provides</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"185\" x=\"22\" y=\"842.9951\">metadata validators (e.g.,</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"169\" x=\"30\" y=\"859.292\">for MMD). Also contains</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"190\" x=\"19.5\" y=\"875.5889\">various storage and search</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"161\" x=\"34\" y=\"891.8857\">solutions for discovery</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"199\" x=\"17\" y=\"908.1826\">metadata. The event queue</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"149\" x=\"40\" y=\"924.4795\">maintains history for</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"195\" x=\"17\" y=\"940.7764\">allowing temporarily failing</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"173\" x=\"30\" y=\"957.0732\">subscribers to catch up.</text></g><!--MD5=[30db5ff674db4f06b01c09627501cce9]\n",
"entity productionhub--><g id=\"elem_productionhub\"><rect fill=\"#1168BD\" height=\"103.8125\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"203\" x=\"1414\" y=\"183\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"101\" x=\"1465\" y=\"207.8516\">Production</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1517.5\" y=\"224.6201\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"162\" x=\"1434.5\" y=\"240.917\">Automated system for</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"179\" x=\"1424\" y=\"257.2139\">data production. ECFlow,</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"97\" x=\"1467\" y=\"273.5107\">PPI, SMS, etc.</text></g><!--MD5=[018f7c1d5ecf6c17927325c1265b2bd4]\n",
"entity dist_systems--><g id=\"elem_dist_systems\"><rect fill=\"#1168BD\" height=\"106.1406\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"185\" x=\"261\" y=\"767.5\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"159\" x=\"271\" y=\"792.3516\">Data Distribution</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"76\" x=\"315.5\" y=\"810.9766\">Services</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"355.5\" y=\"827.7451\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"63\" x=\"322\" y=\"844.042\">Primarily</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"135\" x=\"286\" y=\"860.3389\">thredds/OPeNDAP.</text></g><!--MD5=[fb72620717b8fda022827df25c9698a7]\n",
"entity vis_systems--><g id=\"elem_vis_systems\"><rect fill=\"#1168BD\" height=\"89.8438\" rx=\"2.5\" ry=\"2.5\" style=\"stroke:#3C7FC0;stroke-width:0.5;\" width=\"193\" x=\"481\" y=\"775.5\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"167\" x=\"491\" y=\"800.3516\">Data Visualization</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"16\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"76\" x=\"539.5\" y=\"818.9766\">Services</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"579.5\" y=\"835.7451\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"72\" x=\"543.5\" y=\"852.042\">WMS, etc.</text></g><!--MD5=[1f74baffd83c813573b91ef6fb90a454]\n",
"link checker to dmservice--><g id=\"link_checker_dmservice\"><path d=\"M706.822,521.26 C582.372,538.523 386.791,578.93 243.5,671 C239.935,673.291 236.415,675.712 232.945,678.244 \" fill=\"none\" id=\"checker-to-dmservice\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"226.334,683.248,234.5236,680.8126,230.9028,676.0282,226.334,683.248\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"36\" x=\"346.5\" y=\"631.1387\">Read</text></g><!--MD5=[95f94857b2229433f28a789a2a19da37]\n",
"link checker to dist_systems--><g id=\"link_checker_dist_systems\"><path d=\"M706.676,539.678 C651.169,556.577 585.771,580.583 531.5,612 C470.033,647.583 419.606,712.466 388.315,760.237 \" fill=\"none\" id=\"checker-to-dist_systems\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"383.838,767.155,390.7024,762.0677,385.6647,758.8086,383.838,767.155\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"36\" x=\"532.5\" y=\"631.1387\">Read</text></g><!--MD5=[7a1b9b2f386169cd041d94b2c31c5212]\n",
"link checker to vis_systems--><g id=\"link_checker_vis_systems\"><path d=\"M706.877,533.55 C663.136,548.717 617.809,573.068 590.5,612 C558.823,657.16 560.334,722.349 566.697,767.56 \" fill=\"none\" id=\"checker-to-vis_systems\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"567.889,775.479,569.664,767.1214,563.7309,768.0151,567.889,775.479\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"36\" x=\"591.5\" y=\"631.1387\">Read</text></g><!--MD5=[e80a643f421f5ecf65d7970d8062f105]\n",
"link productionhub to pushgateway--><g id=\"link_productionhub_pushgateway\"><path d=\"M1515.31,287.29 C1515.17,326.3 1514.97,380.72 1514.8,425.64 \" fill=\"none\" id=\"productionhub-to-pushgateway\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1514.77,433.92,1517.7986,425.9308,1511.7986,425.9093,1514.77,433.92\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1520.5\" y=\"329.1387\"/></g><!--MD5=[28d05b0625e781deb7bcf83a7d6b2954]\n",
"link pushgateway to prometheus--><g id=\"link_pushgateway_prometheus\"><path d=\"M1510.26,582.191 C1507.86,623.545 1504.83,675.8 1502.23,720.741 \" fill=\"none\" id=\"pushgateway-to-prometheus\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1501.76,728.753,1505.2179,720.94,1499.2279,720.5928,1501.76,728.753\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1513.5\" y=\"631.1387\"/></g><!--MD5=[b3afc139621b30d2e4bbd5c83d326514]\n",
"link productionhub to prometheus--><g id=\"link_productionhub_prometheus\"><path d=\"M1598.24,287.16 C1615.31,301.95 1630.97,319.68 1640.5,340 C1686.16,437.38 1669.45,478.41 1640.5,582 C1626.64,631.6 1599.28,681.152 1572.1,722.064 \" fill=\"none\" id=\"productionhub-to-prometheus\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1567.56,728.814,1574.5108,723.8454,1569.5299,720.5002,1567.56,728.814\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1673.5\" y=\"512.6387\"/></g><!--MD5=[d8074b0272503366730e533c57d73f41]\n",
"link prometheus to alertmanager--><g id=\"link_prometheus_alertmanager\"><path d=\"M1414.87,912.092 C1394.04,932.514 1370.9,953.118 1347.5,970 C1287.38,1013.38 1258.38,1001.284 1198.5,1045 C1194.04,1048.256 1189.6,1051.669 1185.18,1055.204 \" fill=\"none\" id=\"prometheus-to-alertmanager\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1178.75,1060.467,1186.8443,1057.7315,1183.0497,1053.0838,1178.75,1060.467\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1297.5\" y=\"1012.1387\"/></g><!--MD5=[e5eef6f85d0f1369eeedb40d06fabd84]\n",
"link prometheus to pagerduty--><g id=\"link_prometheus_pagerduty\"><path d=\"M1513.21,912.17 C1527.55,1019.471 1533.65,1197.929 1443.5,1312 C1380.78,1391.358 1267.12,1423.446 1181.32,1436.376 \" fill=\"none\" id=\"prometheus-to-pagerduty\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1173.37,1437.5321,1181.7197,1439.3437,1180.8521,1433.4067,1173.37,1437.5321\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1526.5\" y=\"1183.1387\"/></g><!--MD5=[c99996f3d76a1e2c6e62b222f69894a7]\n",
"link prometheus to grafana--><g id=\"link_prometheus_grafana\"><path d=\"M1451.89,912.255 C1424.02,968.936 1388.45,1041.298 1361.51,1096.118 \" fill=\"none\" id=\"prometheus-to-grafana\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1357.93,1103.393,1364.1546,1097.5403,1358.7714,1094.8905,1357.93,1103.393\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1409.5\" y=\"1012.1387\"/></g><!--MD5=[849777644cf8b17b9a91d03eba699c6a]\n",
"link alertmanager to pagerduty--><g id=\"link_alertmanager_pagerduty\"><path d=\"M1068.5,1312.25 C1068.5,1335.266 1068.5,1358.282 1068.5,1378.53 \" fill=\"none\" id=\"alertmanager-to-pagerduty\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1068.5,1386.735,1071.5,1378.735,1065.5,1378.735,1068.5,1386.735\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1073.5\" y=\"1354.1387\"/></g><!--MD5=[248658fd1424c9b4fb0dcdc8f7e9a9c8]\n",
"link dist_systems to pingdom--><g id=\"link_dist_systems_pingdom\"><path d=\"M384.734,873.673 C404.689,904.159 432.572,942.016 463.5,970 C534.099,1033.878 627.325,1088.214 699.516,1125.242 \" fill=\"none\" id=\"dist_systems-to-pingdom\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"706.877,1128.995,701.1129,1122.6882,698.3873,1128.0334,706.877,1128.995\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"520.5\" y=\"1012.1387\"/></g><!--MD5=[580292ada5fed90cf0856adc2bbcb077]\n",
"link vis_systems to pingdom--><g id=\"link_vis_systems_pingdom\"><path d=\"M606.428,865.51 C648.836,930.028 727.885,1050.291 774.478,1121.176 \" fill=\"none\" id=\"vis_systems-to-pingdom\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"778.883,1127.878,776.996,1119.545,771.982,1122.8405,778.883,1127.878\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"707.5\" y=\"1012.1387\"/></g><!--MD5=[e4d9ed99ec0b723a3c737c7702883c6a]\n",
"link dmservice to pingdom--><g id=\"link_dmservice_pingdom\"><path d=\"M226.282,956.897 C231.901,961.543 237.648,965.938 243.5,970 C384.962,1068.191 578.324,1125.74 699.007,1154.417 \" fill=\"none\" id=\"dmservice-to-pingdom\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"706.85,1156.264,699.7509,1151.5097,698.3753,1157.3499,706.85,1156.264\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"318.5\" y=\"1012.1387\"/></g><!--MD5=[07ed39e1e1668c0a94046ea7e15d2abd]\n",
"link web_app to pingdom--><g id=\"link_web_app_pingdom\"><path d=\"M1110.34,924.694 C1090.77,940.797 1070.06,956.538 1049.5,970 C1023.56,986.989 1011.93,982.249 986.5,1000 C963.048,1016.37 960.699,1024.752 940.5,1045 C915.521,1070.039 888.152,1098.065 865.075,1121.87 \" fill=\"none\" id=\"web_app-to-pingdom\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"859.305,1127.827,867.0264,1124.1691,862.7173,1119.994,859.305,1127.827\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"991.5\" y=\"1012.1387\"/></g><!--MD5=[e41d29f5d5f8c7562613cf022b49aa29]\n",
"link pingdom to pagerduty--><g id=\"link_pingdom_pagerduty\"><path d=\"M859.538,1229.127 C901.057,1272.019 961.328,1334.283 1006.483,1380.932 \" fill=\"none\" id=\"pingdom-to-pagerduty\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1012.19,1386.829,1008.7826,1378.9938,1004.4709,1383.1663,1012.19,1386.829\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"983.5\" y=\"1354.1387\"/></g><!--MD5=[cecbab7a32098c86e4dece7dc561ec62]\n",
"link dataproducer to web_app--><g id=\"link_dataproducer_web_app\"><path d=\"M1637.95,94.15 C1644.73,103.32 1650.75,113.45 1654.5,124 C1659.99,139.43 1719.3,459.02 1640.5,582 C1571.87,689.094 1480.74,611.168 1368.5,671 C1350.49,680.598 1333.28,693.114 1317.37,706.809 \" fill=\"none\" id=\"dataproducer-to-web_app\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1311.1,712.321,1319.0878,709.2885,1315.1242,704.7841,1311.1,712.321\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"95\" x=\"1680.5\" y=\"329.1387\">Check status</text></g><!--MD5=[eb16f039d35181c4fe431cb7f361e714]\n",
"link dataproducer to productionhub--><g id=\"link_dataproducer_productionhub\"><path d=\"M1533.61,94.28 C1525.04,103.06 1517.49,113.03 1512.5,124 C1505.44,139.55 1503.67,157.64 1504.37,174.62 \" fill=\"none\" id=\"dataproducer-to-productionhub\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1504.89,182.84,1507.3697,174.6637,1501.3821,175.0493,1504.89,182.84\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"85\" x=\"1537\" y=\"136.1387\">Set up data</text><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"136\" x=\"1513.5\" y=\"150.1074\">production system</text></g><!--MD5=[f973c495864faf9a886102954d978d94]\n",
"link ghc to alertmanager--><g id=\"link_ghc_alertmanager\"><path d=\"M949.619,887.627 C966.872,929.695 989.874,985.782 1011.05,1037.409 \" fill=\"none\" id=\"ghc-to-alertmanager\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"1014.16,1044.991,1013.8992,1036.451,1008.3482,1038.7282,1014.16,1044.991\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"67\" x=\"1001.5\" y=\"1012.1387\">WebHook</text></g><!--MD5=[ad0852325fb4f8b4caa4af2fb53e873a]\n",
"link ghc to dist_systems--><g id=\"link_ghc_dist_systems\"><path d=\"M885.803,753.415 C859.924,713.566 821.226,666.535 772.5,644 C709.939,615.066 522.42,635.229 463.5,671 C428.801,692.066 401.616,728.6 382.952,760.278 \" fill=\"none\" id=\"ghc-to-dist_systems\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"378.864,767.374,385.4571,761.9398,380.2583,758.9445,378.864,767.374\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"130\" x=\"637.5\" y=\"624.1387\">custom* OpenDAP</text><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"43\" x=\"683\" y=\"638.1074\">probe</text></g><!--MD5=[6720083defb3a68e2f36383efd109b12]\n",
"link ghc to vis_systems--><g id=\"link_ghc_vis_systems\"><path d=\"M812.886,820.5 C771.086,820.5 723.578,820.5 682.242,820.5 \" fill=\"none\" id=\"ghc-to-vis_systems\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"674.06,820.5,682.06,823.5,682.06,817.5,674.06,820.5\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"77\" x=\"705\" y=\"814.6387\">OGC probe</text></g><!--MD5=[3524d9a308bf1af242ef33dbfc088051]\n",
"link portainer to ghc--><g id=\"link_portainer_ghc\"><path d=\"M1214.34,567.246 C1177.97,597.979 1132.7,636.394 1092.5,671 C1063.51,695.956 1031.91,723.473 1003.903,747.967 \" fill=\"none\" id=\"portainer-to-ghc\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"997.613,753.471,1005.6088,750.4599,1001.6573,745.9448,997.613,753.471\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1166.5\" y=\"631.1387\"/></g><!--MD5=[4de6b852f2847d46163882122be00a16]\n",
"link swarmpit to ghc--><g id=\"link_swarmpit_ghc\"><path d=\"M1048.57,558.543 C1024.14,609.115 985.937,688.185 957.987,746.042 \" fill=\"none\" id=\"swarmpit-to-ghc\" style=\"stroke:#666666;stroke-width:1.0;\"/><polygon fill=\"#666666\" points=\"954.459,753.345,960.6405,747.4468,955.238,744.8366,954.459,753.345\" style=\"stroke:#666666;stroke-width:1.0;\"/><text fill=\"#666666\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1025.5\" y=\"631.1387\"/></g><rect height=\"81.1875\" rx=\"7.5\" ry=\"7.5\" style=\"stroke:#00000000;stroke-width:1.0;fill:none;\" width=\"109\" x=\"1652.5\" y=\"1534\"/><rect height=\"16.2969\" style=\"stroke:none;stroke-width:1.0;fill:none;\" width=\"97\" x=\"1658.5\" y=\"1542\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"14\" font-weight=\"bold\" lengthAdjust=\"spacing\" textLength=\"57\" x=\"1658.5\" y=\"1554.9951\">Legend</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1719.5\" y=\"1554.9951\"/><rect fill=\"#08427B\" height=\"16.2969\" style=\"stroke:none;stroke-width:1.0;\" width=\"97\" x=\"1658.5\" y=\"1558.2969\"/><text fill=\"#073B6F\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"8\" x=\"1662.5\" y=\"1571.292\">▯</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1674.5\" y=\"1571.292\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"50\" x=\"1678.5\" y=\"1571.292\">person</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1736.5\" y=\"1571.292\"/><rect fill=\"#1168BD\" height=\"16.2969\" style=\"stroke:none;stroke-width:1.0;\" width=\"97\" x=\"1658.5\" y=\"1574.5938\"/><text fill=\"#3C7FC0\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"8\" x=\"1662.5\" y=\"1587.5889\">▯</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1674.5\" y=\"1587.5889\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"52\" x=\"1678.5\" y=\"1587.5889\">system</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1738.5\" y=\"1587.5889\"/><rect fill=\"#438DD5\" height=\"16.2969\" style=\"stroke:none;stroke-width:1.0;\" width=\"97\" x=\"1658.5\" y=\"1590.8906\"/><text fill=\"#3C7FC0\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"8\" x=\"1662.5\" y=\"1603.8857\">▯</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1674.5\" y=\"1603.8857\"/><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"69\" x=\"1678.5\" y=\"1603.8857\">container</text><text fill=\"#FFFFFF\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacing\" textLength=\"0\" x=\"1755.5\" y=\"1603.8857\"/><line style=\"stroke:#00000000;stroke-width:1.0;\" x1=\"1658.5\" x2=\"1755.5\" y1=\"1542\" y2=\"1542\"/><line style=\"stroke:#00000000;stroke-width:1.0;\" x1=\"1658.5\" x2=\"1755.5\" y1=\"1558.2969\" y2=\"1558.2969\"/><line style=\"stroke:#00000000;stroke-width:1.0;\" x1=\"1658.5\" x2=\"1755.5\" y1=\"1574.5938\" y2=\"1574.5938\"/><line style=\"stroke:#00000000;stroke-width:1.0;\" x1=\"1658.5\" x2=\"1755.5\" y1=\"1590.8906\" y2=\"1590.8906\"/><line style=\"stroke:#00000000;stroke-width:1.0;\" x1=\"1658.5\" x2=\"1755.5\" y1=\"1607.1875\" y2=\"1607.1875\"/><line style=\"stroke:#00000000;stroke-width:1.0;\" x1=\"1658.5\" x2=\"1658.5\" y1=\"1542\" y2=\"1607.1875\"/><line style=\"stroke:#00000000;stroke-width:1.0;\" x1=\"1755.5\" x2=\"1755.5\" y1=\"1542\" y2=\"1607.1875\"/><!--MD5=[07812930c3b8247843975a884837e05e]\n",
"@startuml\n",
"!include <C4/C4_Container>\n",
"\n",
"LAYOUT_TOP_DOWN()\n",
"'left to right direction\n",
"\n",
"\n",
"Person(dataproducer, \"Dataset Producer\")\n",
"\n",
"System(dmservice, \"Metadata Services\", \"Defines a REST API to add events to an event queue, which subsequently triggers subscriber actions. The API requires input metadata on a required format, and provides metadata validators (e.g., for MMD). Also contains various storage and search solutions for discovery metadata. The event queue maintains history for allowing temporarily failing subscribers to catch up.\")\n",
"System(productionhub, \"Production\", \"Automated system for data production. ECFlow, PPI, SMS, etc.\")\n",
"System(dist_systems, \"Data Distribution Services\", \"Primarily thredds/OPeNDAP.\")\n",
"System(vis_systems, \"Data Visualization Services\", \"WMS, etc.\")\n",
"\n",
"System_Boundary(monitoring, \"Monitoring\", \"Monitoring of usage, metadata consistency, and status of services and production chains. Uses existing systems (e.g., prometheus/grafana).\"){\n",
"\n",
" Container(checker, \"Metadata Checker\", \"Python\", \"Regularly checks consistency between metadata, data and data representations/visualizations.\")\n",
"\n",
" Container(pagerduty, \"PagerDuty\", \"SaaS-based platform\", \"Externally hosted service to manage incidents and alerts.\")\n",
"\n",
" Container(pushgateway, \"Pushgateway\", \"Server: mostly JavaScript and Go\", \"Intermediary service which allows to push metrics to Prometheus from jobs which cannot be scraped.\")\n",
"\n",
" Container(alertmanager, \"Prometheus Alertmanager\", \"Server: mostly Go\", \"The Alertmanager handles alerts sent by client applications such as the Prometheus server. It takes care of deduplicating, grouping, and routing them to the correct receiver integration such as email or PagerDuty. It also takes care of silencing and inhibition of alerts.\")\n",
"\n",
" Container(web_app, \"Web Application\", \"HTML\", \"<b>Optional.</b> Provides functionality to register dataset and service metadata, display dataset and service usage statistics, production status, and monitor metadata to display errors and warnings (e.g., about dead links).\")\n",
"\n",
" Container(ghc, \"Service Status and QoS Checker\", \"Python/Flask\", \"Probably GeoHealthCheck. GHC can be used to monitor overall health of OGC services (OWS) like WMS, WFS, WCS, WMTS, SOS, CSW and more, plus some recent OGC APIs like SensorThings API and WFS v3 (OGC Features API). But also standard web REST APIs and ordinary URLs can be monitored.\")\n",
"\n",
" Container(prometheus, \"Prometheus\", \"Server: mostly Go\", \"Collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts when specified conditions are observed.\")\n",
" Container(grafana, \"Grafana\", \"mostly Typescript and Go\", \"Open source visualization and analytics software which allows to query, visualize, alert on and understand metrics.\")\n",
" Container(pingdom, \"Pingdom\", \"SaaS-based platform\", \"Externally hosted service for website monitoring.\")\n",
"\n",
" Container(ghc, \"GeoHealthCheck\", \"Server: Python\", \"Check validity of resources available via OGC Standards (WMS, WFS, CSW, HTTP) + custom probe system.\") \n",
" 'Monitoring health interfaces and messaging system in case of failure via e-mail or custom web-hook\n",
"\n",
" Container(portainer, \"Portainer\", \"Server: js/html\", \"centralized service delivery platform for containerized apps\") \n",
" Container(swarmpit, \"Swarmpit\", \"Server: Java\", \"UI to manage Docker Swarm cluster\") \n",
"}\n",
"\n",
"Rel(checker, dmservice, \"Read\")\n",
"Rel(checker, dist_systems, \"Read\")\n",
"Rel(checker, vis_systems, \"Read\")\n",
"\n",
"Rel(productionhub,pushgateway,\" \")\n",
"Rel(pushgateway,prometheus,\" \")\n",
"Rel(productionhub,prometheus,\" \")\n",
"Rel(prometheus,alertmanager,\" \")\n",
"Rel(prometheus,pagerduty,\" \")\n",
"Rel(prometheus,grafana,\" \")\n",
"Rel(alertmanager,pagerduty,\" \")\n",
"\n",
"Rel(dist_systems,pingdom,\" \")\n",
"Rel(vis_systems,pingdom,\" \")\n",
"Rel(dmservice,pingdom,\" \")\n",
"Rel(web_app,pingdom,\" \")\n",
"Rel(pingdom,pagerduty,\" \")\n",
"\n",
"Rel(dataproducer, web_app, \"Check status\")\n",
"\n",
"\n",
"Rel(dataproducer, productionhub, \"Set up data production system\")\n",
"'Rel(productionhub, dist_systems, \"Store\")\n",
"'Rel(productionhub, dmservice, \"Validate/create/update/delete\", \"HTTP POST\")\n",
"'Rel(productionhub, dmservice, \"Listen\", \"CloudEvent\")\n",
"'Rel(productionhub, vis_systems, \"Store/Configure\")\n",
"\n",
"Rel(ghc, alertmanager, \"WebHook\")\n",
"Rel(ghc, dist_systems, \"custom* OpenDAP probe\")\n",
"Rel(ghc, vis_systems, \"OGC probe\")\n",
"Rel(portainer, ghc, \" \")\n",
"Rel(swarmpit, ghc, \" \")\n",
"\n",
"\n",
"SHOW_LEGEND()\n",
"@enduml\n",
"\n",
"@startuml\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"skinparam defaultTextAlignment center\n",
"\n",
"skinparam wrapWidth 200\n",
"skinparam maxMessageSize 150\n",
"\n",
"skinparam LegendBorderColor transparent\n",
"skinparam LegendBackgroundColor transparent\n",
"skinparam LegendFontColor #FFFFFF\n",
"\n",
"skinparam shadowing<<legendArea>> false\n",
"skinparam rectangle<<legendArea>> {\n",
" backgroundcolor #00000000\n",
" bordercolor #00000000\n",
"}\n",
"\n",
"skinparam rectangle {\n",
" StereotypeFontSize 12\n",
" shadowing false\n",
"}\n",
"\n",
"skinparam database {\n",
" StereotypeFontSize 12\n",
" shadowing false\n",
"}\n",
"\n",
"skinparam queue {\n",
" StereotypeFontSize 12\n",
" shadowing false\n",
"}\n",
"\n",
"skinparam arrow {\n",
" Color #666666\n",
" FontColor #666666\n",
" FontSize 12\n",
"}\n",
"\n",
"skinparam actor {\n",
" StereotypeFontSize 12\n",
" shadowing false\n",
" style awesome\n",
"}\n",
"\n",
"skinparam person {\n",
" StereotypeFontSize 12\n",
" shadowing false\n",
"}\n",
"\n",
"skinparam package {\n",
" StereotypeFontSize 6\n",
" StereotypeFontColor transparent\n",
" FontStyle plain\n",
" BackgroundColor transparent\n",
"}\n",
"\n",
"skinparam rectangle<<boundary>> {\n",
" Shadowing false\n",
" StereotypeFontSize 6\n",
" StereotypeFontColor transparent\n",
" FontColor #444444\n",
" BorderColor #444444\n",
" BackgroundColor transparent\n",
" BorderStyle dashed\n",
"}\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"skinparam rectangle<<person>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #08427B\n",
" BorderColor #073B6F\n",
"}\n",
"skinparam database<<person>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #08427B\n",
" BorderColor #073B6F\n",
"}\n",
"skinparam queue<<person>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #08427B\n",
" BorderColor #073B6F\n",
"}\n",
"skinparam actor<<person>> {\n",
" StereotypeFontColor #08427B\n",
" FontColor #08427B\n",
" BackgroundColor #08427B\n",
" BorderColor #073B6F\n",
"}\n",
"skinparam person<<person>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #08427B\n",
" BorderColor #073B6F\n",
"}\n",
"\n",
"\n",
"skinparam rectangle<<external_person>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #686868\n",
" BorderColor #8A8A8A\n",
"}\n",
"skinparam database<<external_person>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #686868\n",
" BorderColor #8A8A8A\n",
"}\n",
"skinparam queue<<external_person>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #686868\n",
" BorderColor #8A8A8A\n",
"}\n",
"skinparam actor<<external_person>> {\n",
" StereotypeFontColor #686868\n",
" FontColor #686868\n",
" BackgroundColor #686868\n",
" BorderColor #8A8A8A\n",
"}\n",
"skinparam person<<external_person>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #686868\n",
" BorderColor #8A8A8A\n",
"}\n",
"\n",
"\n",
"skinparam rectangle<<system>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #1168BD\n",
" BorderColor #3C7FC0\n",
"}\n",
"skinparam database<<system>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #1168BD\n",
" BorderColor #3C7FC0\n",
"}\n",
"skinparam queue<<system>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #1168BD\n",
" BorderColor #3C7FC0\n",
"}\n",
"skinparam actor<<system>> {\n",
" StereotypeFontColor #1168BD\n",
" FontColor #1168BD\n",
" BackgroundColor #1168BD\n",
" BorderColor #3C7FC0\n",
"}\n",
"skinparam person<<system>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #1168BD\n",
" BorderColor #3C7FC0\n",
"}\n",
"\n",
"\n",
"skinparam rectangle<<external_system>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #999999\n",
" BorderColor #8A8A8A\n",
"}\n",
"skinparam database<<external_system>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #999999\n",
" BorderColor #8A8A8A\n",
"}\n",
"skinparam queue<<external_system>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #999999\n",
" BorderColor #8A8A8A\n",
"}\n",
"skinparam actor<<external_system>> {\n",
" StereotypeFontColor #999999\n",
" FontColor #999999\n",
" BackgroundColor #999999\n",
" BorderColor #8A8A8A\n",
"}\n",
"skinparam person<<external_system>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #999999\n",
" BorderColor #8A8A8A\n",
"}\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"sprite $person [48x48/16] {\n",
"000000000000000000000000000000000000000000000000\n",
"000000000000000000000000000000000000000000000000\n",
"0000000000000000000049BCCA7200000000000000000000\n",
"0000000000000000006EFFFFFFFFB3000000000000000000\n",
"00000000000000001CFFFFFFFFFFFF700000000000000000\n",
"0000000000000001EFFFFFFFFFFFFFF80000000000000000\n",
"000000000000000CFFFFFFFFFFFFFFFF6000000000000000\n",
"000000000000007FFFFFFFFFFFFFFFFFF100000000000000\n",
"00000000000001FFFFFFFFFFFFFFFFFFF900000000000000\n",
"00000000000006FFFFFFFFFFFFFFFFFFFF00000000000000\n",
"0000000000000BFFFFFFFFFFFFFFFFFFFF40000000000000\n",
"0000000000000EFFFFFFFFFFFFFFFFFFFF70000000000000\n",
"0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000\n",
"0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000\n",
"0000000000000DFFFFFFFFFFFFFFFFFFFF60000000000000\n",
"0000000000000AFFFFFFFFFFFFFFFFFFFF40000000000000\n",
"00000000000006FFFFFFFFFFFFFFFFFFFE00000000000000\n",
"00000000000000EFFFFFFFFFFFFFFFFFF800000000000000\n",
"000000000000007FFFFFFFFFFFFFFFFFF100000000000000\n",
"000000000000000BFFFFFFFFFFFFFFFF5000000000000000\n",
"0000000000000001DFFFFFFFFFFFFFF70000000000000000\n",
"00000000000000000BFFFFFFFFFFFF500000000000000000\n",
"0000000000000000005DFFFFFFFFA1000000000000000000\n",
"0000000000000000000037ABB96100000000000000000000\n",
"000000000000000000000000000000000000000000000000\n",
"000000000000000000000000000000000000000000000000\n",
"000000000000025788300000000005886410000000000000\n",
"000000000007DFFFFFFD9643347BFFFFFFFB400000000000\n",
"0000000004EFFFFFFFFFFFFFFFFFFFFFFFFFFB1000000000\n",
"000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFD200000000\n",
"00000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE10000000\n",
"0000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000000\n",
"000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5000000\n",
"000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD000000\n",
"000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF200000\n",
"00000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF600000\n",
"00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000\n",
"00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA00000\n",
"00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000\n",
"00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000\n",
"00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000\n",
"00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA00000\n",
"00000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF700000\n",
"000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE100000\n",
"0000008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3000000\n",
"000000014555555555555555555555555555555300000000\n",
"000000000000000000000000000000000000000000000000\n",
"000000000000000000000000000000000000000000000000\n",
"}\n",
"\n",
"sprite $person2 [48x48/16] {\n",
"0000000000000000000049BCCA7200000000000000000000\n",
"0000000000000000006EFFFFFFFFB3000000000000000000\n",
"00000000000000001CFFFFFFFFFFFF700000000000000000\n",
"0000000000000001EFFFFFFFFFFFFFF80000000000000000\n",
"000000000000000CFFFFFFFFFFFFFFFF6000000000000000\n",
"000000000000007FFFFFFFFFFFFFFFFFF100000000000000\n",
"00000000000001FFFFFFFFFFFFFFFFFFF900000000000000\n",
"00000000000006FFFFFFFFFFFFFFFFFFFF00000000000000\n",
"0000000000000BFFFFFFFFFFFFFFFFFFFF40000000000000\n",
"0000000000000EFFFFFFFFFFFFFFFFFFFF70000000000000\n",
"0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000\n",
"0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000\n",
"0000000000000DFFFFFFFFFFFFFFFFFFFF60000000000000\n",
"0000000000000AFFFFFFFFFFFFFFFFFFFF40000000000000\n",
"00000000000006FFFFFFFFFFFFFFFFFFFE00000000000000\n",
"00000000000000EFFFFFFFFFFFFFFFFFF800000000000000\n",
"000000000000007FFFFFFFFFFFFFFFFFF100000000000000\n",
"000000000000000BFFFFFFFFFFFFFFFF5000000000000000\n",
"0000000000000001DFFFFFFFFFFFFFF70000000000000000\n",
"00000000000000000BFFFFFFFFFFFF500000000000000000\n",
"0000000000000000005DFFFFFFFFA1000000000000000000\n",
"0000000000000000000037ABB96100000000000000000000\n",
"000000000002578888300000000005888864100000000000\n",
"0000000007DFFFFFFFFD9643347BFFFFFFFFFB4000000000\n",
"00000004EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB10000000\n",
"0000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2000000\n",
"000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE100000\n",
"00003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000\n",
"0000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50000\n",
"0003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0000\n",
"0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2000\n",
"000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6000\n",
"000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n",
"001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000\n",
"001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000\n",
"001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000\n",
"001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA000\n",
"000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000\n",
"000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6000\n",
"0009FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF2000\n",
"0003FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFD0000\n",
"0000BFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFF50000\n",
"00003FFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFB00000\n",
"000006FFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFE100000\n",
"0000007FFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFD2000000\n",
"00000004EFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFB10000000\n",
"0000000007DF8FFFFFFFFFFFFFFFFFFFFFF8FB4000000000\n",
"000000000002578888888888888888888864100000000000\n",
"}\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"skinparam rectangle<<container>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #438DD5\n",
" BorderColor #3C7FC0\n",
"}\n",
"skinparam database<<container>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #438DD5\n",
" BorderColor #3C7FC0\n",
"}\n",
"skinparam queue<<container>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #438DD5\n",
" BorderColor #3C7FC0\n",
"}\n",
"skinparam actor<<container>> {\n",
" StereotypeFontColor #438DD5\n",
" FontColor #438DD5\n",
" BackgroundColor #438DD5\n",
" BorderColor #3C7FC0\n",
"}\n",
"skinparam person<<container>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #438DD5\n",
" BorderColor #3C7FC0\n",
"}\n",
"\n",
"\n",
"skinparam rectangle<<external_container>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #B3B3B3\n",
" BorderColor #A6A6A6\n",
"}\n",
"skinparam database<<external_container>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #B3B3B3\n",
" BorderColor #A6A6A6\n",
"}\n",
"skinparam queue<<external_container>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #B3B3B3\n",
" BorderColor #A6A6A6\n",
"}\n",
"skinparam actor<<external_container>> {\n",
" StereotypeFontColor #B3B3B3\n",
" FontColor #B3B3B3\n",
" BackgroundColor #B3B3B3\n",
" BorderColor #A6A6A6\n",
"}\n",
"skinparam person<<external_container>> {\n",
" StereotypeFontColor #FFFFFF\n",
" FontColor #FFFFFF\n",
" BackgroundColor #B3B3B3\n",
" BorderColor #A6A6A6\n",
"}\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"top to bottom direction\n",
"\n",
"\n",
"rectangle \"<$person>\\n==Dataset Producer\" <<person>> as dataproducer \n",
"\n",
"rectangle \"==Metadata Services\\n\\n Defines a REST API to add events to an event queue, which subsequently triggers subscriber actions. The API requires input metadata on a required format, and provides metadata validators (e.g., for MMD). Also contains various storage and search solutions for discovery metadata. The event queue maintains history for allowing temporarily failing subscribers to catch up.\" <<system>> as dmservice \n",
"rectangle \"==Production\\n\\n Automated system for data production. ECFlow, PPI, SMS, etc.\" <<system>> as productionhub \n",
"rectangle \"==Data Distribution Services\\n\\n Primarily thredds/OPeNDAP.\" <<system>> as dist_systems \n",
"rectangle \"==Data Visualization Services\\n\\n WMS, etc.\" <<system>> as vis_systems \n",
"\n",
"rectangle \"==Monitoring\\n<size:12>[System]</size>\" <<Monitoring of usage, metadata consistency, and status of services and production chains. Uses existing systems (e.g., prometheus/grafana).>><<boundary>> as monitoring {\n",
"\n",
" rectangle \"==Metadata Checker\\n//<size:12>[Python]</size>//\\n\\n Regularly checks consistency between metadata, data and data representations/visualizations.\" <<container>> as checker \n",
"\n",
" rectangle \"==PagerDuty\\n//<size:12>[SaaS-based platform]</size>//\\n\\n Externally hosted service to manage incidents and alerts.\" <<container>> as pagerduty \n",
"\n",
" rectangle \"==Pushgateway\\n//<size:12>[Server: mostly JavaScript and Go]</size>//\\n\\n Intermediary service which allows to push metrics to Prometheus from jobs which cannot be scraped.\" <<container>> as pushgateway \n",
"\n",
" rectangle \"==Prometheus Alertmanager\\n//<size:12>[Server: mostly Go]</size>//\\n\\n The Alertmanager handles alerts sent by client applications such as the Prometheus server. It takes care of deduplicating, grouping, and routing them to the correct receiver integration such as email or PagerDuty. It also takes care of silencing and inhibition of alerts.\" <<container>> as alertmanager \n",
"\n",
" rectangle \"==Web Application\\n//<size:12>[HTML]</size>//\\n\\n <b>Optional.</b> Provides functionality to register dataset and service metadata, display dataset and service usage statistics, production status, and monitor metadata to display errors and warnings (e.g., about dead links).\" <<container>> as web_app \n",
"\n",
" rectangle \"==Service Status and QoS Checker\\n//<size:12>[Python/Flask]</size>//\\n\\n Probably GeoHealthCheck. GHC can be used to monitor overall health of OGC services (OWS) like WMS, WFS, WCS, WMTS, SOS, CSW and more, plus some recent OGC APIs like SensorThings API and WFS v3 (OGC Features API). But also standard web REST APIs and ordinary URLs can be monitored.\" <<container>> as ghc \n",
"\n",
" rectangle \"==Prometheus\\n//<size:12>[Server: mostly Go]</size>//\\n\\n Collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts when specified conditions are observed.\" <<container>> as prometheus \n",
" rectangle \"==Grafana\\n//<size:12>[mostly Typescript and Go]</size>//\\n\\n Open source visualization and analytics software which allows to query, visualize, alert on and understand metrics.\" <<container>> as grafana \n",
" rectangle \"==Pingdom\\n//<size:12>[SaaS-based platform]</size>//\\n\\n Externally hosted service for website monitoring.\" <<container>> as pingdom \n",
"\n",
" rectangle \"==GeoHealthCheck\\n//<size:12>[Server: Python]</size>//\\n\\n Check validity of resources available via OGC Standards (WMS, WFS, CSW, HTTP) + custom probe system.\" <<container>> as ghc \n",
"\n",
" rectangle \"==Portainer\\n//<size:12>[Server: js/html]</size>//\\n\\n centralized service delivery platform for containerized apps\" <<container>> as portainer \n",
" rectangle \"==Swarmpit\\n//<size:12>[Server: Java]</size>//\\n\\n UI to manage Docker Swarm cluster\" <<container>> as swarmpit \n",
"}\n",
"\n",
"checker - ->> dmservice : **Read**\n",
"checker - ->> dist_systems : **Read**\n",
"checker - ->> vis_systems : **Read**\n",
"\n",
"productionhub - ->> pushgateway : ** **\n",
"pushgateway - ->> prometheus : ** **\n",
"productionhub - ->> prometheus : ** **\n",
"prometheus - ->> alertmanager : ** **\n",
"prometheus - ->> pagerduty : ** **\n",
"prometheus - ->> grafana : ** **\n",
"alertmanager - ->> pagerduty : ** **\n",
"\n",
"dist_systems - ->> pingdom : ** **\n",
"vis_systems - ->> pingdom : ** **\n",
"dmservice - ->> pingdom : ** **\n",
"web_app - ->> pingdom : ** **\n",
"pingdom - ->> pagerduty : ** **\n",
"\n",
"dataproducer - ->> web_app : **Check status**\n",
"\n",
"\n",
"dataproducer - ->> productionhub : **Set up data production system**\n",
"\n",
"ghc - ->> alertmanager : **WebHook**\n",
"ghc - ->> dist_systems : **custom* OpenDAP probe**\n",
"ghc - ->> vis_systems : **OGC probe**\n",
"portainer - ->> ghc : ** **\n",
"swarmpit - ->> ghc : ** **\n",
"\n",
"\n",
"hide stereotype\n",
"legend right\n",
"<#00000000,#00000000>|<color:#000000>**Legend**</color> |\n",
"|<#08427B><color:#073B6F> <U+25AF></color> <color:#FFFFFF> person </color> |\n",
"|<#1168BD><color:#3C7FC0> <U+25AF></color> <color:#FFFFFF> system </color> |\n",
"|<#438DD5><color:#3C7FC0> <U+25AF></color> <color:#FFFFFF> container </color> |\n",
"endlegend\n",
"@enduml\n",
"\n",
"PlantUML version 1.2022.2beta8(Unknown compile time)\n",
"(GPL source distribution)\n",
"Java Runtime: Java(TM) SE Runtime Environment\n",
"JVM: Java HotSpot(TM) 64-Bit Server VM\n",
"Default Encoding: UTF-8\n",
"Language: en\n",
"Country: US\n",
"--></g></svg>"
],
"text/plain": [
"<IPython.core.display.SVG object>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%plantuml\n",
"\n",
"@startuml img/deployment-diagram\n",
"\n",
"!include <C4/C4_Container>\n",
"\n",
"LAYOUT_TOP_DOWN()\n",
"'left to right direction\n",
"\n",
"\n",
"Person(dataproducer, \"Dataset Producer\")\n",
"\n",
"System(dmservice, \"Metadata Services\", \"Defines a REST API to add events to an event queue, which subsequently triggers subscriber actions. The API requires input metadata on a required format, and provides metadata validators (e.g., for MMD). Also contains various storage and search solutions for discovery metadata. The event queue maintains history for allowing temporarily failing subscribers to catch up.\")\n",
"System(productionhub, \"Production\", \"Automated system for data production. ECFlow, PPI, SMS, etc.\")\n",
"System(dist_systems, \"Data Distribution Services\", \"Primarily thredds/OPeNDAP.\")\n",
"System(vis_systems, \"Data Visualization Services\", \"WMS, etc.\")\n",
"\n",
"System_Boundary(monitoring, \"Monitoring\", \"Monitoring of usage, metadata consistency, and status of services and production chains. Uses existing systems (e.g., prometheus/grafana).\"){\n",
"\n",
" Container(checker, \"Metadata Checker\", \"Python\", \"Regularly checks consistency between metadata, data and data representations/visualizations.\")\n",
"\n",
" Container(pagerduty, \"PagerDuty\", \"SaaS-based platform\", \"Externally hosted service to manage incidents and alerts.\")\n",
"\n",
" Container(pushgateway, \"Pushgateway\", \"Server: mostly JavaScript and Go\", \"Intermediary service which allows to push metrics to Prometheus from jobs which cannot be scraped.\")\n",
"\n",
" Container(alertmanager, \"Prometheus Alertmanager\", \"Server: mostly Go\", \"The Alertmanager handles alerts sent by client applications such as the Prometheus server. It takes care of deduplicating, grouping, and routing them to the correct receiver integration such as email or PagerDuty. It also takes care of silencing and inhibition of alerts.\")\n",
"\n",
" Container(web_app, \"Web Application\", \"HTML\", \"<b>Optional.</b> Provides functionality to register dataset and service metadata, display dataset and service usage statistics, production status, and monitor metadata to display errors and warnings (e.g., about dead links).\")\n",
"\n",
" Container(ghc, \"Service Status and QoS Checker\", \"Python/Flask\", \"Probably GeoHealthCheck. GHC can be used to monitor overall health of OGC services (OWS) like WMS, WFS, WCS, WMTS, SOS, CSW and more, plus some recent OGC APIs like SensorThings API and WFS v3 (OGC Features API). But also standard web REST APIs and ordinary URLs can be monitored.\")\n",
"\n",
" Container(prometheus, \"Prometheus\", \"Server: mostly Go\", \"Collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts when specified conditions are observed.\")\n",
" Container(grafana, \"Grafana\", \"mostly Typescript and Go\", \"Open source visualization and analytics software which allows to query, visualize, alert on and understand metrics.\")\n",
" Container(pingdom, \"Pingdom\", \"SaaS-based platform\", \"Externally hosted service for website monitoring.\")\n",
"\n",
" Container(ghc, \"GeoHealthCheck\", \"Server: Python\", \"Check validity of resources available via OGC Standards (WMS, WFS, CSW, HTTP) + custom probe system.\") \n",
" 'Monitoring health interfaces and messaging system in case of failure via e-mail or custom web-hook\n",
"\n",
" Container(portainer, \"Portainer\", \"Server: js/html\", \"centralized service delivery platform for containerized apps\") \n",
" Container(swarmpit, \"Swarmpit\", \"Server: Java\", \"UI to manage Docker Swarm cluster\") \n",
"}\n",
"\n",
"Rel(checker, dmservice, \"Read\")\n",
"Rel(checker, dist_systems, \"Read\")\n",
"Rel(checker, vis_systems, \"Read\")\n",
"\n",
"Rel(productionhub,pushgateway,\" \")\n",
"Rel(pushgateway,prometheus,\" \")\n",
"Rel(productionhub,prometheus,\" \")\n",
"Rel(prometheus,alertmanager,\" \")\n",
"Rel(prometheus,pagerduty,\" \")\n",
"Rel(prometheus,grafana,\" \")\n",
"Rel(alertmanager,pagerduty,\" \")\n",
"\n",
"Rel(dist_systems,pingdom,\" \")\n",
"Rel(vis_systems,pingdom,\" \")\n",
"Rel(dmservice,pingdom,\" \")\n",
"Rel(web_app,pingdom,\" \")\n",
"Rel(pingdom,pagerduty,\" \")\n",
"\n",
"Rel(dataproducer, web_app, \"Check status\")\n",
"\n",
"\n",
"Rel(dataproducer, productionhub, \"Set up data production system\")\n",
"'Rel(productionhub, dist_systems, \"Store\")\n",
"'Rel(productionhub, dmservice, \"Validate/create/update/delete\", \"HTTP POST\")\n",
"'Rel(productionhub, dmservice, \"Listen\", \"CloudEvent\")\n",
"'Rel(productionhub, vis_systems, \"Store/Configure\")\n",
"\n",
"Rel(ghc, alertmanager, \"WebHook\")\n",
"Rel(ghc, dist_systems, \"custom* OpenDAP probe\")\n",
"Rel(ghc, vis_systems, \"OGC probe\")\n",
"Rel(portainer, ghc, \" \")\n",
"Rel(swarmpit, ghc, \" \")\n",
"\n",
"\n",
"SHOW_LEGEND()\n",
"@enduml"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment