{ "configuration" : { }, "description" : "CQRS/Event-Sourcing metrics platform with ingestion workers, projections, and dashboard delivery", "documentation" : { }, "id" : 1, "lastModifiedAgent" : "structurizr/1.0.0", "lastModifiedDate" : "2026-02-19T13:09:58Z", "lastModifiedUser" : "rui@MacBook-Pro-de-Rui.local", "model" : { "people" : [ { "description" : "Consumes predefined development dashboards", "id" : "1", "name" : "Developer", "properties" : { "structurizr.dsl.identifier" : "developer" }, "relationships" : [ { "description" : "Uses", "destinationId" : "16", "id" : "48", "sourceId" : "1", "tags" : "Relationship" }, { "description" : "Uses", "destinationId" : "7", "id" : "49", "linkedRelationshipId" : "48", "sourceId" : "1" } ], "tags" : "Element,Person" }, { "description" : "Builds custom analyses on top of metrics projections", "id" : "2", "name" : "BI Analyst", "properties" : { "structurizr.dsl.identifier" : "analyst" }, "relationships" : [ { "description" : "Uses", "destinationId" : "17", "id" : "50", "sourceId" : "2", "tags" : "Relationship" }, { "description" : "Uses", "destinationId" : "7", "id" : "51", "linkedRelationshipId" : "50", "sourceId" : "2" } ], "tags" : "Element,Person" } ], "softwareSystems" : [ { "description" : "External metrics source", "documentation" : { }, "id" : "3", "name" : "Source A", "properties" : { "structurizr.dsl.identifier" : "sourceA" }, "tags" : "Element,Software System" }, { "description" : "External metrics source", "documentation" : { }, "id" : "4", "name" : "Source B", "properties" : { "structurizr.dsl.identifier" : "sourceB" }, "tags" : "Element,Software System" }, { "description" : "External metrics source", "documentation" : { }, "id" : "5", "name" : "Source C", "properties" : { "structurizr.dsl.identifier" : "sourceC" }, "tags" : "Element,Software System" }, { "description" : "External metrics source", "documentation" : { }, "id" : "6", "name" : "Source D", "properties" : { "structurizr.dsl.identifier" : "sourceD" }, "tags" : "Element,Software System" }, { "containers" : [ { "description" : "Triggers ingestion cycles", "documentation" : { }, "id" : "8", "name" : "Job Scheduler", "properties" : { "structurizr.dsl.identifier" : "jobScheduler" }, "relationships" : [ { "description" : "Triggers ingestion run", "destinationId" : "9", "id" : "23", "sourceId" : "8", "tags" : "Relationship", "technology" : "Scheduled job" } ], "tags" : "Element,Container", "technology" : "Scheduler" }, { "description" : "Fetches from adapters, normalizes into domain model, stores raw data and emits domain events", "documentation" : { }, "id" : "9", "name" : "Ingestion Worker", "properties" : { "structurizr.dsl.identifier" : "ingestionWorker" }, "relationships" : [ { "description" : "Uses domain contracts", "destinationId" : "18", "id" : "24", "sourceId" : "9", "tags" : "Relationship" }, { "description" : "Uses", "destinationId" : "10", "id" : "25", "sourceId" : "9", "tags" : "Relationship" }, { "description" : "Uses", "destinationId" : "11", "id" : "26", "sourceId" : "9", "tags" : "Relationship" }, { "description" : "Uses", "destinationId" : "12", "id" : "27", "sourceId" : "9", "tags" : "Relationship" }, { "description" : "Uses", "destinationId" : "13", "id" : "28", "sourceId" : "9", "tags" : "Relationship" }, { "description" : "Stores raw payloads", "destinationId" : "19", "id" : "29", "sourceId" : "9", "tags" : "Relationship" }, { "description" : "Stores domain events", "destinationId" : "20", "id" : "30", "sourceId" : "9", "tags" : "Relationship" } ], "tags" : "Element,Container", "technology" : ".NET Service" }, { "description" : "Connector for Source A", "documentation" : { }, "id" : "10", "name" : "Adapter A", "properties" : { "structurizr.dsl.identifier" : "adapterA" }, "relationships" : [ { "description" : "Consumes", "destinationId" : "3", "id" : "31", "sourceId" : "10", "tags" : "Relationship" } ], "tags" : "Element,Container", "technology" : ".NET Library" }, { "description" : "Connector for Source B", "documentation" : { }, "id" : "11", "name" : "Adapter B", "properties" : { "structurizr.dsl.identifier" : "adapterB" }, "relationships" : [ { "description" : "Consumes", "destinationId" : "4", "id" : "33", "sourceId" : "11", "tags" : "Relationship" } ], "tags" : "Element,Container", "technology" : ".NET Library" }, { "description" : "Connector for Source C", "documentation" : { }, "id" : "12", "name" : "Adapter C", "properties" : { "structurizr.dsl.identifier" : "adapterC" }, "relationships" : [ { "description" : "Consumes", "destinationId" : "5", "id" : "35", "sourceId" : "12", "tags" : "Relationship" } ], "tags" : "Element,Container", "technology" : ".NET Library" }, { "description" : "Connector for Source D", "documentation" : { }, "id" : "13", "name" : "Adapter D", "properties" : { "structurizr.dsl.identifier" : "adapterD" }, "relationships" : [ { "description" : "Consumes", "destinationId" : "6", "id" : "37", "sourceId" : "13", "tags" : "Relationship" } ], "tags" : "Element,Container", "technology" : ".NET Library" }, { "description" : "Consumes domain events and rebuilds dashboard projections", "documentation" : { }, "id" : "14", "name" : "Projection Worker", "properties" : { "structurizr.dsl.identifier" : "projectionWorker" }, "relationships" : [ { "description" : "Uses domain contracts", "destinationId" : "18", "id" : "39", "sourceId" : "14", "tags" : "Relationship" }, { "description" : "Consumes event stream", "destinationId" : "20", "id" : "40", "sourceId" : "14", "tags" : "Relationship" }, { "description" : "Builds/saves projections", "destinationId" : "21", "id" : "41", "sourceId" : "14", "tags" : "Relationship" }, { "description" : "Reads dashboard configuration", "destinationId" : "22", "id" : "42", "sourceId" : "14", "tags" : "Relationship" } ], "tags" : "Element,Container", "technology" : ".NET Service" }, { "description" : "Serves projections and configuration to dashboard clients", "documentation" : { }, "id" : "15", "name" : "Metrics API", "properties" : { "structurizr.dsl.identifier" : "metricsApi" }, "relationships" : [ { "description" : "Uses projection contracts", "destinationId" : "18", "id" : "43", "sourceId" : "15", "tags" : "Relationship" }, { "description" : "Reads projections", "destinationId" : "21", "id" : "44", "sourceId" : "15", "tags" : "Relationship" }, { "description" : "Reads dashboard configuration", "destinationId" : "22", "id" : "45", "sourceId" : "15", "tags" : "Relationship" } ], "tags" : "Element,Container", "technology" : ".NET API" }, { "description" : "Predefined product dashboards", "documentation" : { }, "id" : "16", "name" : "Front 1 Web", "properties" : { "structurizr.dsl.identifier" : "front1Web" }, "relationships" : [ { "description" : "Reads predefined dashboards", "destinationId" : "15", "id" : "46", "sourceId" : "16", "tags" : "Relationship", "technology" : "HTTPS/JSON" } ], "tags" : "Element,Container", "technology" : ".NET + React" }, { "description" : "Advanced/custom BI views", "documentation" : { }, "id" : "17", "name" : "Front 2 BI", "properties" : { "structurizr.dsl.identifier" : "front2Bi" }, "relationships" : [ { "description" : "Reads/adapts metrics views", "destinationId" : "15", "id" : "47", "sourceId" : "17", "tags" : "Relationship", "technology" : "HTTPS/JSON" } ], "tags" : "Element,Container", "technology" : "Power BI / BI client" }, { "description" : "Canonical domain model for metrics, events, and projection rules", "documentation" : { }, "id" : "18", "name" : "Domain Core Model", "properties" : { "structurizr.dsl.identifier" : "domainCore" }, "tags" : "Element,Container", "technology" : ".NET Library" }, { "description" : "Persisted raw source payloads for traceability/reprocessing", "documentation" : { }, "id" : "19", "name" : "Raw Data Store", "properties" : { "structurizr.dsl.identifier" : "rawDataStore" }, "tags" : "Element,Container,Database", "technology" : "Data Store" }, { "description" : "Event stream following the domain core model", "documentation" : { }, "id" : "20", "name" : "Domain Event Store", "properties" : { "structurizr.dsl.identifier" : "domainEventStore" }, "tags" : "Element,Container,Database", "technology" : "Event Store" }, { "description" : "Read model with precomputed dashboard values", "documentation" : { }, "id" : "21", "name" : "Projection Store", "properties" : { "structurizr.dsl.identifier" : "projectionStore" }, "tags" : "Element,Container,Database", "technology" : "Read Model Store" }, { "description" : "Projection and dashboard configuration", "documentation" : { }, "id" : "22", "name" : "Configuration DB", "properties" : { "structurizr.dsl.identifier" : "configurationStore" }, "tags" : "Element,Container,Database", "technology" : "Database" } ], "description" : "Collects raw metrics, records domain events, builds projections, and serves dashboards", "documentation" : { }, "id" : "7", "name" : "Metrics Platform", "properties" : { "structurizr.dsl.identifier" : "metricsPlatform" }, "relationships" : [ { "description" : "Consumes", "destinationId" : "3", "id" : "32", "linkedRelationshipId" : "31", "sourceId" : "7" }, { "description" : "Consumes", "destinationId" : "4", "id" : "34", "linkedRelationshipId" : "33", "sourceId" : "7" }, { "description" : "Consumes", "destinationId" : "5", "id" : "36", "linkedRelationshipId" : "35", "sourceId" : "7" }, { "description" : "Consumes", "destinationId" : "6", "id" : "38", "linkedRelationshipId" : "37", "sourceId" : "7" } ], "tags" : "Element,Software System" } ] }, "name" : "Metrics Platform", "properties" : { "structurizr.inspection.info" : "0", "structurizr.inspection.ignore" : "0", "structurizr.inspection.error" : "29", "structurizr.inspection.warning" : "0", "structurizr.dsl" : "d29ya3NwYWNlICJNZXRyaWNzIFBsYXRmb3JtIiAiQ1FSUy9FdmVudC1Tb3VyY2luZyBtZXRyaWNzIHBsYXRmb3JtIHdpdGggaW5nZXN0aW9uIHdvcmtlcnMsIHByb2plY3Rpb25zLCBhbmQgZGFzaGJvYXJkIGRlbGl2ZXJ5IiB7CgogICAgbW9kZWwgewogICAgICAgIGRldmVsb3BlciA9IHBlcnNvbiAiRGV2ZWxvcGVyIiAiQ29uc3VtZXMgcHJlZGVmaW5lZCBkZXZlbG9wbWVudCBkYXNoYm9hcmRzIgogICAgICAgIGFuYWx5c3QgPSBwZXJzb24gIkJJIEFuYWx5c3QiICJCdWlsZHMgY3VzdG9tIGFuYWx5c2VzIG9uIHRvcCBvZiBtZXRyaWNzIHByb2plY3Rpb25zIgoKICAgICAgICBzb3VyY2VBID0gc29mdHdhcmVTeXN0ZW0gIlNvdXJjZSBBIiAiRXh0ZXJuYWwgbWV0cmljcyBzb3VyY2UiCiAgICAgICAgc291cmNlQiA9IHNvZnR3YXJlU3lzdGVtICJTb3VyY2UgQiIgIkV4dGVybmFsIG1ldHJpY3Mgc291cmNlIgogICAgICAgIHNvdXJjZUMgPSBzb2Z0d2FyZVN5c3RlbSAiU291cmNlIEMiICJFeHRlcm5hbCBtZXRyaWNzIHNvdXJjZSIKICAgICAgICBzb3VyY2VEID0gc29mdHdhcmVTeXN0ZW0gIlNvdXJjZSBEIiAiRXh0ZXJuYWwgbWV0cmljcyBzb3VyY2UiCgogICAgICAgIG1ldHJpY3NQbGF0Zm9ybSA9IHNvZnR3YXJlU3lzdGVtICJNZXRyaWNzIFBsYXRmb3JtIiAiQ29sbGVjdHMgcmF3IG1ldHJpY3MsIHJlY29yZHMgZG9tYWluIGV2ZW50cywgYnVpbGRzIHByb2plY3Rpb25zLCBhbmQgc2VydmVzIGRhc2hib2FyZHMiIHsKICAgICAgICAgICAgam9iU2NoZWR1bGVyID0gY29udGFpbmVyICJKb2IgU2NoZWR1bGVyIiAiVHJpZ2dlcnMgaW5nZXN0aW9uIGN5Y2xlcyIgIlNjaGVkdWxlciIKCiAgICAgICAgICAgIGluZ2VzdGlvbldvcmtlciA9IGNvbnRhaW5lciAiSW5nZXN0aW9uIFdvcmtlciIgIkZldGNoZXMgZnJvbSBhZGFwdGVycywgbm9ybWFsaXplcyBpbnRvIGRvbWFpbiBtb2RlbCwgc3RvcmVzIHJhdyBkYXRhIGFuZCBlbWl0cyBkb21haW4gZXZlbnRzIiAiLk5FVCBTZXJ2aWNlIgogICAgICAgICAgICBhZGFwdGVyQSA9IGNvbnRhaW5lciAiQWRhcHRlciBBIiAiQ29ubmVjdG9yIGZvciBTb3VyY2UgQSIgIi5ORVQgTGlicmFyeSIKICAgICAgICAgICAgYWRhcHRlckIgPSBjb250YWluZXIgIkFkYXB0ZXIgQiIgIkNvbm5lY3RvciBmb3IgU291cmNlIEIiICIuTkVUIExpYnJhcnkiCiAgICAgICAgICAgIGFkYXB0ZXJDID0gY29udGFpbmVyICJBZGFwdGVyIEMiICJDb25uZWN0b3IgZm9yIFNvdXJjZSBDIiAiLk5FVCBMaWJyYXJ5IgogICAgICAgICAgICBhZGFwdGVyRCA9IGNvbnRhaW5lciAiQWRhcHRlciBEIiAiQ29ubmVjdG9yIGZvciBTb3VyY2UgRCIgIi5ORVQgTGlicmFyeSIKCiAgICAgICAgICAgIHByb2plY3Rpb25Xb3JrZXIgPSBjb250YWluZXIgIlByb2plY3Rpb24gV29ya2VyIiAiQ29uc3VtZXMgZG9tYWluIGV2ZW50cyBhbmQgcmVidWlsZHMgZGFzaGJvYXJkIHByb2plY3Rpb25zIiAiLk5FVCBTZXJ2aWNlIgogICAgICAgICAgICBtZXRyaWNzQXBpID0gY29udGFpbmVyICJNZXRyaWNzIEFQSSIgIlNlcnZlcyBwcm9qZWN0aW9ucyBhbmQgY29uZmlndXJhdGlvbiB0byBkYXNoYm9hcmQgY2xpZW50cyIgIi5ORVQgQVBJIgoKICAgICAgICAgICAgZnJvbnQxV2ViID0gY29udGFpbmVyICJGcm9udCAxIFdlYiIgIlByZWRlZmluZWQgcHJvZHVjdCBkYXNoYm9hcmRzIiAiLk5FVCArIFJlYWN0IgogICAgICAgICAgICBmcm9udDJCaSA9IGNvbnRhaW5lciAiRnJvbnQgMiBCSSIgIkFkdmFuY2VkL2N1c3RvbSBCSSB2aWV3cyIgIlBvd2VyIEJJIC8gQkkgY2xpZW50IgoKICAgICAgICAgICAgZG9tYWluQ29yZSA9IGNvbnRhaW5lciAiRG9tYWluIENvcmUgTW9kZWwiICJDYW5vbmljYWwgZG9tYWluIG1vZGVsIGZvciBtZXRyaWNzLCBldmVudHMsIGFuZCBwcm9qZWN0aW9uIHJ1bGVzIiAiLk5FVCBMaWJyYXJ5IgoKICAgICAgICAgICAgcmF3RGF0YVN0b3JlID0gY29udGFpbmVyICJSYXcgRGF0YSBTdG9yZSIgIlBlcnNpc3RlZCByYXcgc291cmNlIHBheWxvYWRzIGZvciB0cmFjZWFiaWxpdHkvcmVwcm9jZXNzaW5nIiAiRGF0YSBTdG9yZSIgewogICAgICAgICAgICAgICAgdGFncyAiRGF0YWJhc2UiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG9tYWluRXZlbnRTdG9yZSA9IGNvbnRhaW5lciAiRG9tYWluIEV2ZW50IFN0b3JlIiAiRXZlbnQgc3RyZWFtIGZvbGxvd2luZyB0aGUgZG9tYWluIGNvcmUgbW9kZWwiICJFdmVudCBTdG9yZSIgewogICAgICAgICAgICAgICAgdGFncyAiRGF0YWJhc2UiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvamVjdGlvblN0b3JlID0gY29udGFpbmVyICJQcm9qZWN0aW9uIFN0b3JlIiAiUmVhZCBtb2RlbCB3aXRoIHByZWNvbXB1dGVkIGRhc2hib2FyZCB2YWx1ZXMiICJSZWFkIE1vZGVsIFN0b3JlIiB7CiAgICAgICAgICAgICAgICB0YWdzICJEYXRhYmFzZSIKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25maWd1cmF0aW9uU3RvcmUgPSBjb250YWluZXIgIkNvbmZpZ3VyYXRpb24gREIiICJQcm9qZWN0aW9uIGFuZCBkYXNoYm9hcmQgY29uZmlndXJhdGlvbiIgIkRhdGFiYXNlIiB7CiAgICAgICAgICAgICAgICB0YWdzICJEYXRhYmFzZSIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgam9iU2NoZWR1bGVyIC0+IGluZ2VzdGlvbldvcmtlciAiVHJpZ2dlcnMgaW5nZXN0aW9uIHJ1biIgIlNjaGVkdWxlZCBqb2IiCgogICAgICAgICAgICBpbmdlc3Rpb25Xb3JrZXIgLT4gZG9tYWluQ29yZSAiVXNlcyBkb21haW4gY29udHJhY3RzIgogICAgICAgICAgICBpbmdlc3Rpb25Xb3JrZXIgLT4gYWRhcHRlckEgIlVzZXMiCiAgICAgICAgICAgIGluZ2VzdGlvbldvcmtlciAtPiBhZGFwdGVyQiAiVXNlcyIKICAgICAgICAgICAgaW5nZXN0aW9uV29ya2VyIC0+IGFkYXB0ZXJDICJVc2VzIgogICAgICAgICAgICBpbmdlc3Rpb25Xb3JrZXIgLT4gYWRhcHRlckQgIlVzZXMiCiAgICAgICAgICAgIGluZ2VzdGlvbldvcmtlciAtPiByYXdEYXRhU3RvcmUgIlN0b3JlcyByYXcgcGF5bG9hZHMiCiAgICAgICAgICAgIGluZ2VzdGlvbldvcmtlciAtPiBkb21haW5FdmVudFN0b3JlICJTdG9yZXMgZG9tYWluIGV2ZW50cyIKCiAgICAgICAgICAgIGFkYXB0ZXJBIC0+IHNvdXJjZUEgIkNvbnN1bWVzIgogICAgICAgICAgICBhZGFwdGVyQiAtPiBzb3VyY2VCICJDb25zdW1lcyIKICAgICAgICAgICAgYWRhcHRlckMgLT4gc291cmNlQyAiQ29uc3VtZXMiCiAgICAgICAgICAgIGFkYXB0ZXJEIC0+IHNvdXJjZUQgIkNvbnN1bWVzIgoKICAgICAgICAgICAgcHJvamVjdGlvbldvcmtlciAtPiBkb21haW5Db3JlICJVc2VzIGRvbWFpbiBjb250cmFjdHMiCiAgICAgICAgICAgIHByb2plY3Rpb25Xb3JrZXIgLT4gZG9tYWluRXZlbnRTdG9yZSAiQ29uc3VtZXMgZXZlbnQgc3RyZWFtIgogICAgICAgICAgICBwcm9qZWN0aW9uV29ya2VyIC0+IHByb2plY3Rpb25TdG9yZSAiQnVpbGRzL3NhdmVzIHByb2plY3Rpb25zIgogICAgICAgICAgICBwcm9qZWN0aW9uV29ya2VyIC0+IGNvbmZpZ3VyYXRpb25TdG9yZSAiUmVhZHMgZGFzaGJvYXJkIGNvbmZpZ3VyYXRpb24iCgogICAgICAgICAgICBtZXRyaWNzQXBpIC0+IGRvbWFpbkNvcmUgIlVzZXMgcHJvamVjdGlvbiBjb250cmFjdHMiCiAgICAgICAgICAgIG1ldHJpY3NBcGkgLT4gcHJvamVjdGlvblN0b3JlICJSZWFkcyBwcm9qZWN0aW9ucyIKICAgICAgICAgICAgbWV0cmljc0FwaSAtPiBjb25maWd1cmF0aW9uU3RvcmUgIlJlYWRzIGRhc2hib2FyZCBjb25maWd1cmF0aW9uIgoKICAgICAgICAgICAgZnJvbnQxV2ViIC0+IG1ldHJpY3NBcGkgIlJlYWRzIHByZWRlZmluZWQgZGFzaGJvYXJkcyIgIkhUVFBTL0pTT04iCiAgICAgICAgICAgIGZyb250MkJpIC0+IG1ldHJpY3NBcGkgIlJlYWRzL2FkYXB0cyBtZXRyaWNzIHZpZXdzIiAiSFRUUFMvSlNPTiIKCiAgICAgICAgICAgIGRldmVsb3BlciAtPiBmcm9udDFXZWIgIlVzZXMiCiAgICAgICAgICAgIGFuYWx5c3QgLT4gZnJvbnQyQmkgIlVzZXMiCiAgICAgICAgfQogICAgfQoKICAgIHZpZXdzIHsKICAgICAgICBzeXN0ZW1Db250ZXh0IG1ldHJpY3NQbGF0Zm9ybSAiY29udGV4dCIgewogICAgICAgICAgICBpbmNsdWRlIGRldmVsb3BlcgogICAgICAgICAgICBpbmNsdWRlIGFuYWx5c3QKICAgICAgICAgICAgaW5jbHVkZSBzb3VyY2VBCiAgICAgICAgICAgIGluY2x1ZGUgc291cmNlQgogICAgICAgICAgICBpbmNsdWRlIHNvdXJjZUMKICAgICAgICAgICAgaW5jbHVkZSBzb3VyY2VECiAgICAgICAgICAgIGluY2x1ZGUgbWV0cmljc1BsYXRmb3JtCiAgICAgICAgICAgIGF1dG9sYXlvdXQgbHIKICAgICAgICAgICAgdGl0bGUgIlN5c3RlbSBDb250ZXh0IC0gTWV0cmljcyBQbGF0Zm9ybSIKICAgICAgICB9CgogICAgICAgIGNvbnRhaW5lciBtZXRyaWNzUGxhdGZvcm0gImNvbnRhaW5lcnMiIHsKICAgICAgICAgICAgaW5jbHVkZSAqCiAgICAgICAgICAgIGF1dG9sYXlvdXQgbHIKICAgICAgICAgICAgdGl0bGUgIkNvbnRhaW5lciAtIE1ldHJpY3MgUGxhdGZvcm0iCiAgICAgICAgfQoKICAgICAgICBkeW5hbWljIG1ldHJpY3NQbGF0Zm9ybSAiaW5nZXN0aW9uLWZsb3ciIHsKICAgICAgICAgICAgdGl0bGUgIkR5bmFtaWMgLSBJbmdlc3Rpb24gYW5kIEV2ZW50IFJlY29yZGluZyIKCiAgICAgICAgICAgIGpvYlNjaGVkdWxlciAtPiBpbmdlc3Rpb25Xb3JrZXIgIjEuIFRyaWdnZXIgaW5nZXN0aW9uIGN5Y2xlIgogICAgICAgICAgICBpbmdlc3Rpb25Xb3JrZXIgLT4gYWRhcHRlckEgIjIuIFB1bGwgZGF0YSIKICAgICAgICAgICAgaW5nZXN0aW9uV29ya2VyIC0+IGFkYXB0ZXJCICIyLiBQdWxsIGRhdGEiCiAgICAgICAgICAgIGluZ2VzdGlvbldvcmtlciAtPiBhZGFwdGVyQyAiMi4gUHVsbCBkYXRhIgogICAgICAgICAgICBpbmdlc3Rpb25Xb3JrZXIgLT4gYWRhcHRlckQgIjIuIFB1bGwgZGF0YSIKICAgICAgICAgICAgaW5nZXN0aW9uV29ya2VyIC0+IHJhd0RhdGFTdG9yZSAiMy4gUGVyc2lzdCByYXcgcGF5bG9hZHMiCiAgICAgICAgICAgIGluZ2VzdGlvbldvcmtlciAtPiBkb21haW5Db3JlICI0LiBNYXAgdG8gY2Fub25pY2FsIG1vZGVsIgogICAgICAgICAgICBpbmdlc3Rpb25Xb3JrZXIgLT4gZG9tYWluRXZlbnRTdG9yZSAiNS4gUGVyc2lzdCBkb21haW4gZXZlbnRzIgogICAgICAgIH0KCiAgICAgICAgZHluYW1pYyBtZXRyaWNzUGxhdGZvcm0gInByb2plY3Rpb24tYW5kLXNlcnZpbmctZmxvdyIgewogICAgICAgICAgICB0aXRsZSAiRHluYW1pYyAtIFByb2plY3Rpb24gUmVidWlsZCBhbmQgRGFzaGJvYXJkIFNlcnZpbmciCgogICAgICAgICAgICBwcm9qZWN0aW9uV29ya2VyIC0+IGRvbWFpbkV2ZW50U3RvcmUgIjEuIFJlYWQgZXZlbnRzIgogICAgICAgICAgICBwcm9qZWN0aW9uV29ya2VyIC0+IGNvbmZpZ3VyYXRpb25TdG9yZSAiMi4gcmVhZCBwcm9qZWN0aW9uIGRlZmluaXRpb25zIgogICAgICAgICAgICBwcm9qZWN0aW9uV29ya2VyIC0+IGRvbWFpbkNvcmUgIjMuIEFwcGx5IHByb2plY3Rpb24gY29uZmlndXJhdGlvbiB1c2luZyBkb21haW4gbW9kZWxzIgogICAgICAgICAgICBwcm9qZWN0aW9uV29ya2VyIC0+IHByb2plY3Rpb25TdG9yZSAiNC4gV3JpdGUgcmVmcmVzaGVkIHByb2plY3Rpb25zIgogICAgICAgICAgICBmcm9udDFXZWIgLT4gbWV0cmljc0FwaSAiNS4gUmVxdWVzdCBwcmVkZWZpbmVkIGRhc2hib2FyZHMiCiAgICAgICAgICAgIG1ldHJpY3NBcGkgLT4gcHJvamVjdGlvblN0b3JlICI2LiBSZWFkIHByb2plY3RlZCBtZXRyaWNzIgogICAgICAgICAgICBmcm9udDJCaSAtPiBtZXRyaWNzQXBpICI3LiBSZXF1ZXN0IGN1c3RvbSB2aWV3cyBvbiBub3JtYWxpemVkIGRhdGEiCiAgICAgICAgICAgIG1ldHJpY3NBcGkgLT4gcHJvamVjdGlvblN0b3JlICI4LiBSZWFkIHByb2plY3RlZCBtZXRyaWNzIgogICAgICAgIH0KCiAgICAgICAgc3R5bGVzIHsKICAgICAgICAgICAgZWxlbWVudCAiUGVyc29uIiB7CiAgICAgICAgICAgICAgICBzaGFwZSBQZXJzb24KICAgICAgICAgICAgICAgIGJhY2tncm91bmQgIzI0MGQ2MAogICAgICAgICAgICAgICAgY29sb3IgI2ZmZmZmZgogICAgICAgICAgICB9CgogICAgICAgICAgICBlbGVtZW50ICJTb2Z0d2FyZSBTeXN0ZW0iIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQgIzdmYTA2ZQogICAgICAgICAgICAgICAgY29sb3IgIzAwMDAwMAogICAgICAgICAgICB9CgogICAgICAgICAgICBlbGVtZW50ICJDb250YWluZXIiIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQgI2Y3MTQxNAogICAgICAgICAgICAgICAgY29sb3IgI2ZmZmZmZgogICAgICAgICAgICB9CgogICAgICAgICAgICBlbGVtZW50ICJEYXRhYmFzZSIgewogICAgICAgICAgICAgICAgc2hhcGUgQ3lsaW5kZXIKICAgICAgICAgICAgICAgIGJhY2tncm91bmQgI2I0Y2QzNwogICAgICAgICAgICAgICAgY29sb3IgIzAwMDAwMAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9" }, "views" : { "configuration" : { "styles" : { "elements" : [ { "background" : "#f71414", "color" : "#ffffff", "tag" : "Container" }, { "background" : "#b4cd37", "color" : "#000000", "shape" : "Cylinder", "tag" : "Database" }, { "background" : "#240d60", "color" : "#ffffff", "shape" : "Person", "tag" : "Person" }, { "background" : "#7fa06e", "color" : "#000000", "tag" : "Software System" } ] }, "terminology" : { } }, "containerViews" : [ { "automaticLayout" : { "edgeSeparation" : 50, "nodeSeparation" : 50, "rankDirection" : "LeftRight", "rankSeparation" : 100, "vertices" : true }, "elements" : [ { "id" : "1", "x" : 0, "y" : 0 }, { "id" : "2", "x" : 0, "y" : 0 }, { "id" : "3", "x" : 0, "y" : 0 }, { "id" : "4", "x" : 0, "y" : 0 }, { "id" : "5", "x" : 0, "y" : 0 }, { "id" : "6", "x" : 0, "y" : 0 }, { "id" : "8", "x" : 0, "y" : 0 }, { "id" : "9", "x" : 0, "y" : 0 }, { "id" : "10", "x" : 0, "y" : 0 }, { "id" : "11", "x" : 0, "y" : 0 }, { "id" : "12", "x" : 0, "y" : 0 }, { "id" : "13", "x" : 0, "y" : 0 }, { "id" : "14", "x" : 0, "y" : 0 }, { "id" : "15", "x" : 0, "y" : 0 }, { "id" : "16", "x" : 0, "y" : 0 }, { "id" : "17", "x" : 0, "y" : 0 }, { "id" : "18", "x" : 0, "y" : 0 }, { "id" : "19", "x" : 0, "y" : 0 }, { "id" : "20", "x" : 0, "y" : 0 }, { "id" : "21", "x" : 0, "y" : 0 }, { "id" : "22", "x" : 0, "y" : 0 } ], "externalSoftwareSystemBoundariesVisible" : false, "key" : "containers", "name" : "Container View: Metrics Platform", "order" : 2, "relationships" : [ { "id" : "23" }, { "id" : "24" }, { "id" : "25" }, { "id" : "26" }, { "id" : "27" }, { "id" : "28" }, { "id" : "29" }, { "id" : "30" }, { "id" : "31" }, { "id" : "33" }, { "id" : "35" }, { "id" : "37" }, { "id" : "39" }, { "id" : "40" }, { "id" : "41" }, { "id" : "42" }, { "id" : "43" }, { "id" : "44" }, { "id" : "45" }, { "id" : "46" }, { "id" : "47" }, { "id" : "48" }, { "id" : "50" } ], "softwareSystemId" : "7", "title" : "Container - Metrics Platform" } ], "dynamicViews" : [ { "elementId" : "7", "elements" : [ { "id" : "8", "x" : 0, "y" : 0 }, { "id" : "9", "x" : 0, "y" : 0 }, { "id" : "10", "x" : 0, "y" : 0 }, { "id" : "11", "x" : 0, "y" : 0 }, { "id" : "12", "x" : 0, "y" : 0 }, { "id" : "13", "x" : 0, "y" : 0 }, { "id" : "18", "x" : 0, "y" : 0 }, { "id" : "19", "x" : 0, "y" : 0 }, { "id" : "20", "x" : 0, "y" : 0 } ], "externalBoundariesVisible" : false, "key" : "ingestion-flow", "name" : "Dynamic View: Metrics Platform", "order" : 3, "relationships" : [ { "description" : "1. Trigger ingestion cycle", "id" : "23", "order" : "1", "response" : false }, { "description" : "2. Pull data", "id" : "25", "order" : "2", "response" : false }, { "description" : "2. Pull data", "id" : "26", "order" : "3", "response" : false }, { "description" : "2. Pull data", "id" : "27", "order" : "4", "response" : false }, { "description" : "2. Pull data", "id" : "28", "order" : "5", "response" : false }, { "description" : "3. Persist raw payloads", "id" : "29", "order" : "6", "response" : false }, { "description" : "4. Map to canonical model", "id" : "24", "order" : "7", "response" : false }, { "description" : "5. Persist domain events", "id" : "30", "order" : "8", "response" : false } ], "title" : "Dynamic - Ingestion and Event Recording" }, { "elementId" : "7", "elements" : [ { "id" : "14", "x" : 0, "y" : 0 }, { "id" : "15", "x" : 0, "y" : 0 }, { "id" : "16", "x" : 0, "y" : 0 }, { "id" : "17", "x" : 0, "y" : 0 }, { "id" : "18", "x" : 0, "y" : 0 }, { "id" : "20", "x" : 0, "y" : 0 }, { "id" : "21", "x" : 0, "y" : 0 }, { "id" : "22", "x" : 0, "y" : 0 } ], "externalBoundariesVisible" : false, "key" : "projection-and-serving-flow", "name" : "Dynamic View: Metrics Platform", "order" : 4, "relationships" : [ { "description" : "1. Read events", "id" : "40", "order" : "1", "response" : false }, { "description" : "2. read projection definitions", "id" : "42", "order" : "2", "response" : false }, { "description" : "3. Apply projection configuration using domain models", "id" : "39", "order" : "3", "response" : false }, { "description" : "4. Write refreshed projections", "id" : "41", "order" : "4", "response" : false }, { "description" : "5. Request predefined dashboards", "id" : "46", "order" : "5", "response" : false }, { "description" : "6. Read projected metrics", "id" : "44", "order" : "6", "response" : false }, { "description" : "7. Request custom views on normalized data", "id" : "47", "order" : "7", "response" : false }, { "description" : "8. Read projected metrics", "id" : "44", "order" : "8", "response" : false } ], "title" : "Dynamic - Projection Rebuild and Dashboard Serving" } ], "systemContextViews" : [ { "automaticLayout" : { "edgeSeparation" : 50, "nodeSeparation" : 50, "rankDirection" : "LeftRight", "rankSeparation" : 100, "vertices" : true }, "elements" : [ { "id" : "1", "x" : 0, "y" : 0 }, { "id" : "2", "x" : 0, "y" : 0 }, { "id" : "3", "x" : 0, "y" : 0 }, { "id" : "4", "x" : 0, "y" : 0 }, { "id" : "5", "x" : 0, "y" : 0 }, { "id" : "6", "x" : 0, "y" : 0 }, { "id" : "7", "x" : 0, "y" : 0 } ], "enterpriseBoundaryVisible" : true, "key" : "context", "name" : "System Context View: Metrics Platform", "order" : 1, "relationships" : [ { "id" : "32" }, { "id" : "34" }, { "id" : "36" }, { "id" : "38" }, { "id" : "49" }, { "id" : "51" } ], "softwareSystemId" : "7", "title" : "System Context - Metrics Platform" } ] } }