Event Integrations Structurizr POC (#6141)

- Event Integrations Structurizr POC

- Diagram updates with PR suggestions

- Removed architecture documents and references to them

- Added RabbitME detailed view

- Added Events component view

- Reworked the main server view into two filtered views: Cloud and Self-Hosted.

- Added tags "Cloud-Only" and "Self-Hosted-Only" to remove models / relationships that don't apply

- Refactored how we build the dynamic views to be more extensible

* Re-home event integrations to Dirt; Address Claude feedback / typos

* Update diagrams (models/views/relationships) to reflect current state of Event Integrations

* Fixed typos and suggestions from Claude

* Fixed a few more minor notes from Claude

---------

Co-authored-by: Matt Gibson <mgibson@bitwarden.com>
Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com>
Co-authored-by: Matt Bishop <mbishop@bitwarden.com>
This commit is contained in:
Brant DeBow
2025-12-29 17:22:25 -05:00
committed by GitHub
parent 94ad2d29cc
commit e096056258
10 changed files with 4223 additions and 491 deletions

View File

@@ -15,6 +15,7 @@ workspace "Bitwarden Server System" {
!include "admin_console/models.dsl"
!include "auth/models.dsl"
!include "billing/models.dsl"
!include "dirt/models.dsl"
!include "key_management/models.dsl"
!include "platform/models.dsl"
!include "tools/models.dsl"
@@ -23,10 +24,10 @@ workspace "Bitwarden Server System" {
# Include shared level relationships
!include "shared.relationships.dsl"
!include "admin_console/relationships.dsl"
!include "auth/relationships.dsl"
!include "billing/relationships.dsl"
!include "dirt/relationships.dsl"
!include "key_management/relationships.dsl"
!include "platform/relationships.dsl"
!include "tools/relationships.dsl"
@@ -37,6 +38,7 @@ workspace "Bitwarden Server System" {
!include "admin_console/views.dsl"
!include "auth/views.dsl"
!include "billing/views.dsl"
!include "dirt/views.dsl"
!include "key_management/views.dsl"
!include "platform/views.dsl"
!include "tools/views.dsl"
@@ -50,6 +52,9 @@ workspace "Bitwarden Server System" {
include *
}
filtered Bitwarden_Server exclude "Self-Hosted-Only" "Cloud"
filtered Bitwarden_Server exclude "Cloud-Only" "Self-Hosted"
// This is last to override team styles with common styles
!include "shared.views.dsl"
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,294 @@
!element server {
azure_service_bus = container "Azure Service Bus" {
description "AMQP service used for pub/sub architecture for Events and Integrations"
tags "Events", "Azure", "ASB", "Cloud-Only"
event_topic = component "Event Topic" {
description "The main entry point for all events in the system. When an event occurs, it is published to this topic."
tags "Events", "ASB", "Event Tier"
}
integration_topic = component "Integration Topic" {
description "Events that have integrations configured are processed and put on the integration topic with a routing key for their specific integration handler to process."
tags "Events", "ASB", "Integrations", "Integration Tier"
}
eventsWriteSub = component "events-write-subscription" {
description "Subscription for EventRepositoryHandler to write all events into azure table storage."
tags "ASB", "Subscription", "Event Tier"
}
eventsSlackSub = component "events-slack-subscription" {
description "Subscription for slack-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Slack integration configured."
tags "ASB", "Subscription", "Event Tier", "Slack"
}
eventsWebhookSub = component "events-webhook-subscription" {
description "Subscription for webhook-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a webhook integration configured."
tags "ASB", "Subscription", "Event Tier", "Webhook"
}
eventsHecSub = component "events-hec-subscription" {
description "Subscription for HEC-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a HEC integration configured."
tags "ASB", "Subscription", "Event Tier", "HEC"
}
eventsDatadogSub = component "events-datadog-subscription" {
description "Subscription for Datadog-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Datadog integration configured."
tags "ASB", "Subscription", "Event Tier", "Datadog"
}
eventsTeamsSub = component "events-teams-subscription" {
description "Subscription for Microsoft Teams-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Teams integration configured."
tags "ASB", "Subscription", "Event Tier", "Teams"
}
integrationSlackSub = component "integration-slack-subscription" {
description "Integration-level subscription for Slack IntegrationMessages. Correlation filter: Label = 'slack'."
tags "ASB", "Subscription", "Integration Tier", "Slack"
}
integrationWebhookSub = component "integration-webhook-subscription" {
description "Integration-level subscription for Webhook IntegrationMessages. Correlation filter: Label = 'webhook'."
tags "ASB", "Subscription", "Integration Tier", "Webhook"
}
integrationHecSub = component "integration-hec-subscription" {
description "Integration-level subscription for HEC IntegrationMessages. Correlation filter: Label = 'hec'."
tags "ASB", "Subscription", "Integration Tier", "HEC"
}
integrationDatadogSub = component "integration-datadog-subscription" {
description "Integration-level subscription for Datadog IntegrationMessages. Correlation filter: Label = 'datadog'."
tags "ASB", "Subscription", "Integration Tier", "Datadog"
}
integrationTeamsSub = component "integration-teams-subscription" {
description "Integration-level subscription for Microsoft Teams IntegrationMessages. Correlation filter: Label = 'teams'."
tags "ASB", "Subscription", "Integration Tier", "Teams"
}
}
rabbit_mq = container "RabbitMQ" {
tags "Events"
tags "RabbitMQ"
tags "Self-Hosted-Only"
event_exchange = component "Event Exchange" {
tags "Events", "Event Tier"
}
integration_exchange = component "Integration Exchange" {
tags "Events", "Integrations", "Integration Tier"
}
eventsWriteQueue = component "events-write-queue" {
description "Queue for EventRepositoryHandler to write all events into the database."
tags "RabbitMQ", "Queue", "Event Tier"
}
eventsSlackQueue = component "events-slack-queue" {
description "Queue for slack-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Slack integration configured."
tags "RabbitMQ", "Queue", "Event Tier", "Slack"
}
eventsWebhookQueue = component "events-webhook-queue" {
description "Queue for webhook-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a webhook integration configured."
tags "RabbitMQ", "Queue", "Event Tier", "Webhook"
}
eventsHecQueue = component "events-hec-queue" {
description "Queue for HEC-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a HEC integration configured."
tags "RabbitMQ", "Queue", "Event Tier", "HEC"
}
eventsDatadogQueue = component "events-datadog-queue" {
description "Queue for Datadog-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Datadog integration configured."
tags "RabbitMQ", "Queue", "Event Tier", "Datadog"
}
eventsTeamsQueue = component "events-teams-queue" {
description "Queue for Microsoft Teams-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Teams integration configured."
tags "RabbitMQ", "Queue", "Event Tier", "Teams"
}
integrationSlackQueue = component "integration-slack-queue" {
description "Integration-level queue for Slack IntegrationMessages. Routing key = 'slack'."
tags "RabbitMQ", "Queue", "Integration Tier", "Slack"
}
integrationWebhookQueue = component "integration-webhook-queue" {
description "Integration-level queue for Webhook IntegrationMessages. Routing key = 'webhook'."
tags "RabbitMQ", "Queue", "Integration Tier", "Webhook"
}
integrationHecQueue = component "integration-hec-queue" {
description "Integration-level queue for HEC IntegrationMessages. Routing key = 'hec'."
tags "RabbitMQ", "Queue", "Integration Tier", "HEC"
}
integrationDatadogQueue = component "integration-datadog-queue" {
description "Integration-level queue for Datadog IntegrationMessages. Routing key = 'datadog'."
tags "RabbitMQ", "Queue", "Integration Tier", "Datadog"
}
integrationTeamsQueue = component "integration-teams-queue" {
description "Integration-level queue for Teams IntegrationMessages. Routing key = 'teams'."
tags "RabbitMQ", "Queue", "Integration Tier", "Teams"
}
integrationSlackRetryQueue = component "integration-slack-retry-queue" {
description "Integration-level retry queue for Slack IntegrationMessages. Routing key = 'slack-retry'."
tags "RabbitMQ", "Queue", "Integration Tier", "Slack"
}
integrationWebhookRetryQueue = component "integration-webhook-retry-queue" {
description "Integration-level retry queue for Webhook IntegrationMessages. Routing key = 'webhook-retry'."
tags "RabbitMQ", "Queue", "Integration Tier", "Webhook"
}
integrationHecRetryQueue = component "integration-hec-retry-queue" {
description "Integration-level retry queue for HEC IntegrationMessages. Routing key = 'hec-retry'."
tags "RabbitMQ", "Queue", "Integration Tier", "HEC"
}
integrationDatadogRetryQueue = component "integration-datadog-retry-queue" {
description "Integration-level retry queue for Datadog IntegrationMessages. Routing key = 'datadog-retry'."
tags "RabbitMQ", "Queue", "Integration Tier", "Datadog"
}
integrationTeamsRetryQueue = component "integration-teams-retry-queue" {
description "Integration-level retry queue for Teams IntegrationMessages. Routing key = 'teams-retry'."
tags "RabbitMQ", "Queue", "Integration Tier", "Teams"
}
}
}
!element server.events_processor {
tags "Cloud-Only"
event_repository_handler = component "EventRepositoryHandler" {
description "Handles all events, passing them off to the IEventWriteService with the `persistent` key for long term storage."
}
event_listener = component "AzureServiceBusEventListenerService" {
description "Listens to a specific subscription and passes off to a handler to handle events"
}
integration_listener = component "AzureServiceBusIntegrationListenerService" {
description "Listens to a specific subscription and passes off to a handler to handle IntegrationMessages"
}
event_integration_handler = component "EventIntegrationHandler" {
description "Fetches the relevant configurations when an event comes in and hands the event to its paired integration handler for processing."
}
slack_integration_handler = component "SlackIntegrationHandler" {
description "Processes Slack IntegrationMessages, posting them to the configured channels."
}
teams_integration_handler = component "TeamsIntegrationHandler" {
description "Processes Teams IntegrationMessages, posting them to the configured channels."
}
datadog_integration_handler = component "DatadogIntegrationHandler" {
description "Processes Datadog IntegrationMessages, posting them to the configured URI."
}
webhook_integration_handler = component "WebhookIntegrationHandler" {
description "Processes Webhook and HEC IntegrationMessages, posting them to the configured URI."
}
event_integrations_extended_cache = component "EventIntegrationsExtendedCache" {
description "Caches all configurations for integrations so that events can be handled without adding database load."
}
slack_service = component "SlackService" {
description "Handles all API interaction with Slack."
}
teams_service = component "TeamsService" {
description "Handles all API interaction with Teams."
}
http_client = component "HttpClient" {
description "Performs any HTTP functions for Datadog / Webhooks / HEC."
}
integration_filter_service = component "IntegrationFilterService" {
description "Processes filters from configurations to determine if an event should be processed out to the integration."
}
}
!element server.events {
event_listener = component "RabbitMqEventListenerService" {
tags "Self-Hosted-Only"
description "Listens to a specific queue and passes off to a handler to handle events"
}
integration_listener = component "RabbitMqIntegrationListenerService" {
tags "Self-Hosted-Only"
description "Listens to a specific queue and passes off to a handler to handle IntegrationMessages"
}
event_repository_handler = component "EventRepositoryHandler" {
tags "Self-Hosted-Only"
description "Handles all events, passing them off to the IEventWriteService with the `persistent` key for long term storage."
}
event_integration_handler = component "EventIntegrationHandler" {
tags "Self-Hosted-Only"
description "Fetches the relevant configurations when an event comes in and hands the event to its paired integration handler for processing."
}
slack_integration_handler = component "SlackIntegrationHandler" {
tags "Self-Hosted-Only"
description "Processes Slack IntegrationMessages, posting them to the configured channels."
}
teams_integration_handler = component "TeamsIntegrationHandler" {
tags "Self-Hosted-Only"
description "Processes Teams IntegrationMessages, posting them to the configured channels."
}
datadog_integration_handler = component "DatadogIntegrationHandler" {
tags "Self-Hosted-Only"
description "Processes Datadog IntegrationMessages, posting them to the configured URI."
}
webhook_integration_handler = component "WebhookIntegrationHandler" {
tags "Self-Hosted-Only"
description "Processes Webhook and HEC IntegrationMessages, posting them to the configured URI."
}
event_integrations_extended_cache = component "EventIntegrationsExtendedCache" {
tags "Self-Hosted-Only"
description "Caches all configurations for integrations so that events can be handled without adding database load."
}
slack_service = component "SlackService" {
tags "Self-Hosted-Only"
description "Handles all API interaction with Slack."
}
teams_service = component "TeamsService" {
tags "Self-Hosted-Only"
description "Handles all API interaction with Teams."
}
http_client = component "HttpClient" {
tags "Self-Hosted-Only"
description "Performs any HTTP functions for Datadog / Webhooks / HEC."
}
integration_filter_service = component "IntegrationFilterService" {
tags "Self-Hosted-Only"
description "Processes filters from configurations to determine if an event should be processed out to the integration."
}
}
external_services = softwareSystem "External Services" {
tags "External", "Events", "Integrations"
description "External services (e.g. SIEM, Slack, et al) that consume events via integrations"
slack = container "Slack" {
tags "External", "Events", "Integrations", "Slack"
description "Slack messaging service. Receives messages via configured event integrations."
}
teams = container "Teams" {
tags "External", "Events", "Integrations", "Teams"
description "Microsoft Teams messaging service. Receives messages via configured event integrations."
}
splunk = container "Splunk" {
tags "External", "Events", "Integrations", "Splunk"
description "Splunk SIEM service. Receives events via configured event integrations."
}
datadog = container "Datadog" {
tags "External", "Events", "Integrations", "Datadog"
description "Datadog SIEM service. Receives events via configured event integrations."
}
crowdstrike = container "Crowdstrike Falcon" {
tags "External", "Events", "Integrations", "CrowdStrike Falcon", "CrowdStrike"
description "CrowdStrike Falcon SIEM service. Receives events via configured event integrations."
}
}

View File

@@ -0,0 +1,115 @@
# Top Level event publishing
server.api -> server.azure_service_bus.event_topic "Sends events to"
server.events -> server.azure_service_bus.event_topic "Sends events to"
server.identity -> server.azure_service_bus.event_topic "Sends events to"
server.sso -> server.azure_service_bus.event_topic "Sends events to"
server.scim -> server.azure_service_bus.event_topic "Sends events to"
server.api -> server.rabbit_mq.event_exchange "Sends events to"
server.events -> server.rabbit_mq.event_exchange "Sends events to"
server.identity -> server.rabbit_mq.event_exchange "Sends events to"
server.sso -> server.rabbit_mq.event_exchange "Sends events to"
server.scim -> server.rabbit_mq.event_exchange "Sends events to"
# Azure Service Bus topics, subscriptions, and routing
eventsWriteSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsWriteSub "Subscribes via fan-out"
eventsDatadogSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsDatadogSub "Subscribes via fan-out"
eventsHecSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsHecSub "Subscribes via fan-out"
eventsSlackSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsSlackSub "Subscribes via fan-out"
eventsTeamsSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsTeamsSub "Subscribes via fan-out"
eventsWebhookSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsWebhookSub "Subscribes via fan-out"
integrationDatadogSub = server.azure_service_bus.integration_topic -> server.azure_service_bus.integrationDatadogSub "Subscribes via filter on Datadog key"
integrationHecSub = server.azure_service_bus.integration_topic -> server.azure_service_bus.integrationHecSub "Subscribes via filter on HEC key"
integrationSlackSub = server.azure_service_bus.integration_topic -> server.azure_service_bus.integrationSlackSub "Subscribes via filter on Slack key"
integrationTeamsSub = server.azure_service_bus.integration_topic -> server.azure_service_bus.integrationTeamsSub "Subscribes via filter on Teams key"
integrationWebhookSub = server.azure_service_bus.integration_topic -> server.azure_service_bus.integrationWebhookSub "Subscribes via filter on Webhook key"
eventsWriteListener = server.events_processor.event_listener -> server.azure_service_bus.eventsWriteSub "Listens to"
eventsWriteDelegate = server.events_processor.event_listener -> server.events_processor.event_repository_handler "Delegates to"
eventsDatadogListener = server.events_processor.event_listener -> server.azure_service_bus.eventsDatadogSub "Listens to"
eventsHecListener = server.events_processor.event_listener -> server.azure_service_bus.eventsHecSub "Listens to"
eventsSlackListener = server.events_processor.event_listener -> server.azure_service_bus.eventsSlackSub "Listens to"
eventsTeamsListener = server.events_processor.event_listener -> server.azure_service_bus.eventsTeamsSub "Listens to"
eventsWebhookListener = server.events_processor.event_listener -> server.azure_service_bus.eventsWebhookSub "Listens to"
eventsIntegrationHandlerDelegate = server.events_processor.event_listener -> server.events_processor.event_integration_handler "Delegates to"
eventIntegrationHandlerPublish = server.events_processor.event_integration_handler -> server.azure_service_bus.integration_topic "Publishes To"
eventIntegrationHandlerCache = server.events_processor.event_integration_handler -> server.events_processor.event_integrations_extended_cache "Fetches configurations from"
eventIntegrationHandlerDatabase = server.events_processor.event_integration_handler -> server.database "Fetches template details from"
cacheDatabaseFetch = server.events_processor.event_integrations_extended_cache -> server.database "Fetches configurations from"
eventIntegrationHandlerFilter = server.events_processor.event_integration_handler -> server.events_processor.integration_filter_service "Runs filters"
eventRepositoryDatabase = server.events_processor.event_repository_handler -> server.database "Writes events to"
integrationSlackListener = server.events_processor.integration_listener -> server.azure_service_bus.integrationSlackSub "Listens to"
integrationSlackDelegate = server.events_processor.integration_listener -> server.events_processor.slack_integration_handler "Delegates to"
integrationWebhookListener = server.events_processor.integration_listener -> server.azure_service_bus.integrationWebhookSub "Listens to"
integrationWebhookDelegate = server.events_processor.integration_listener -> server.events_processor.webhook_integration_handler "Delegates to"
integrationHecListener = server.events_processor.integration_listener -> server.azure_service_bus.integrationHecSub "Listens to"
integrationDatadogListener = server.events_processor.integration_listener -> server.azure_service_bus.integrationDatadogSub "Listens to"
integrationDatadogDelegate = server.events_processor.integration_listener -> server.events_processor.datadog_integration_handler "Delegates to"
integrationTeamsListener = server.events_processor.integration_listener -> server.azure_service_bus.integrationTeamsSub "Listens to"
integrationTeamsDelegate = server.events_processor.integration_listener -> server.events_processor.teams_integration_handler "Delegates to"
# RabbitMQ exchanges, queues, and routing
eventsWriteQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsWriteQueue "Subscribes via fan-out"
eventsDatadogQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsDatadogQueue "Subscribes via fan-out"
eventsHecQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsHecQueue "Subscribes via fan-out"
eventsSlackQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsSlackQueue "Subscribes via fan-out"
eventsTeamsQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsTeamsQueue "Subscribes via fan-out"
eventsWebhookQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsWebhookQueue "Subscribes via fan-out"
integrationDatadogQueue = server.rabbit_mq.integration_exchange -> server.rabbit_mq.integrationDatadogQueue "Subscribes via filter on Datadog key"
integrationHecQueue = server.rabbit_mq.integration_exchange -> server.rabbit_mq.integrationHecQueue "Subscribes via filter on HEC key"
integrationSlackQueue = server.rabbit_mq.integration_exchange -> server.rabbit_mq.integrationSlackQueue "Subscribes via filter on Slack key"
integrationTeamsQueue = server.rabbit_mq.integration_exchange -> server.rabbit_mq.integrationTeamsQueue "Subscribes via filter on Teams key"
integrationWebhookQueue = server.rabbit_mq.integration_exchange -> server.rabbit_mq.integrationWebhookQueue "Subscribes via filter on Webhook key"
integrationDatadogRetryQueue = server.rabbit_mq.integrationDatadogRetryQueue -> server.rabbit_mq.integrationDatadogQueue "DLQ after configured retry timing"
integrationHecRetryQueue = server.rabbit_mq.integrationHecRetryQueue -> server.rabbit_mq.integrationHecQueue "DLQ after configured retry timing"
integrationSlackRetryQueue = server.rabbit_mq.integrationSlackRetryQueue -> server.rabbit_mq.integrationSlackQueue "DLQ after configured retry timing"
integrationTeamsRetryQueue = server.rabbit_mq.integrationTeamsRetryQueue -> server.rabbit_mq.integrationTeamsQueue "DLQ after configured retry timing"
integrationWebhookRetryQueue = server.rabbit_mq.integrationWebhookRetryQueue -> server.rabbit_mq.integrationWebhookQueue "DLQ after configured retry timing"
eventsWriteListener_events = server.events.event_listener -> server.rabbit_mq.eventsWriteQueue "Listens to"
eventsDatadogListener_events = server.events.event_listener -> server.rabbit_mq.eventsDatadogQueue "Listens to"
eventsHecListener_events = server.events.event_listener -> server.rabbit_mq.eventsHecQueue "Listens to"
eventsSlackListener_events = server.events.event_listener -> server.rabbit_mq.eventsSlackQueue "Listens to"
eventsTeamsListener_events = server.events.event_listener -> server.rabbit_mq.eventsTeamsQueue "Listens to"
eventsWebhookListener_events = server.events.event_listener -> server.rabbit_mq.eventsWebhookQueue "Listens to"
eventsWriteDelegate_events = server.events.event_listener -> server.events.event_repository_handler "Delegates to"
eventRepositoryDatabase_events = server.events.event_repository_handler -> server.database "Writes events to" tags "Self-Hosted-Only"
eventsIntegrationHandlerDelegate_events = server.events.event_listener -> server.events.event_integration_handler "Delegates to"
eventIntegrationHandlerDatabase_events = server.events.event_integration_handler -> server.database "Fetches template details from"
cacheDatabaseFetch_events = server.events.event_integrations_extended_cache -> server.database "Fetches configurations from" tags "Self-Hosted-Only"
eventIntegrationHandlerCache_events = server.events.event_integration_handler -> server.events.event_integrations_extended_cache "Fetches configurations from"
eventIntegrationHandlerFilter_events = server.events.event_integration_handler -> server.events.integration_filter_service "Runs filters"
eventIntegrationHandlerPublish_events = server.events.event_integration_handler -> server.rabbit_mq.integration_exchange "Publishes To"
integrationSlackListener_events = server.events.integration_listener -> server.rabbit_mq.integrationSlackQueue "Listens to"
integrationWebhookListener_events = server.events.integration_listener -> server.rabbit_mq.integrationWebhookQueue "Listens to"
integrationHecListener_events = server.events.integration_listener -> server.rabbit_mq.integrationHecQueue "Listens to"
integrationDatadogListener_events = server.events.integration_listener -> server.rabbit_mq.integrationDatadogQueue "Listens to"
integrationTeamsListener_events = server.events.integration_listener -> server.rabbit_mq.integrationTeamsQueue "Listens to"
integrationSlackDelegate_events = server.events.integration_listener -> server.events.slack_integration_handler "Delegates to"
integrationTeamsDelegate_events = server.events.integration_listener -> server.events.teams_integration_handler "Delegates to"
integrationDatadogDelegate_events = server.events.integration_listener -> server.events.datadog_integration_handler "Delegates to"
integrationWebhookDelegate_events = server.events.integration_listener -> server.events.webhook_integration_handler "Delegates to"
# External Services
slackToSlackService = server.events_processor.slack_integration_handler -> server.events_processor.slack_service "Uses"
slackServiceToSlack = server.events_processor.slack_service -> external_services.slack "Publishes configured events to"
teamsToTeamsService = server.events_processor.teams_integration_handler -> server.events_processor.teams_service "Uses"
teamsServiceToTeams = server.events_processor.teams_service -> external_services.teams "Publishes configured events to"
webhookHandlerHttpClient = server.events_processor.webhook_integration_handler -> server.events_processor.http_client "Uses"
datadogHandlerHttpClient = server.events_processor.datadog_integration_handler -> server.events_processor.http_client "Uses"
httpToCrowdstrike = server.events_processor.http_client -> external_services.crowdstrike "Publishes configured events to"
httpToDatadog = server.events_processor.http_client -> external_services.datadog "Publishes configured events to"
httpToSplunk = server.events_processor.http_client -> external_services.splunk "Publishes configured events to"
slackToSlackService_events = server.events.slack_integration_handler -> server.events.slack_service "Uses" tags "Self-Hosted-Only"
slackServiceToSlack_events = server.events.slack_service -> external_services.slack "Publishes configured events to" tags "Self-Hosted-Only"
teamsToTeamsService_events = server.events.teams_integration_handler -> server.events.teams_service "Uses" tags "Self-Hosted-Only"
teamsServiceToTeams_events = server.events.teams_service -> external_services.teams "Publishes configured events to" tags "Self-Hosted-Only"
webhookHandlerHttpClient_events = server.events.webhook_integration_handler -> server.events.http_client "Uses" tags "Self-Hosted-Only"
datadogHandlerHttpClient_events = server.events.datadog_integration_handler -> server.events.http_client "Uses" tags "Self-Hosted-Only"
httpToCrowdstrike_events = server.events.http_client -> external_services.crowdstrike "Publishes configured events to" tags "Self-Hosted-Only"
httpToDatadog_events = server.events.http_client -> external_services.datadog "Publishes configured events to" tags "Self-Hosted-Only"
httpToSplunk_events = server.events.http_client -> external_services.splunk "Publishes configured events to" tags "Self-Hosted-Only"

View File

@@ -0,0 +1,99 @@
component server.azure_service_bus "Azure_Service_Bus" {
include *
}
component server.rabbit_mq "RabbitMQ" {
include *
}
component server.events_processor "Events_Processor" {
include *
}
component server.events "Events" {
include *
}
dynamic server.events_processor "Events_Processor_Azure_Service_Bus" "Event Integrations / ASB Detail" {
eventsWriteSub
eventsHecSub
eventsSlackSub
eventsWebhookSub
eventsWriteListener
eventsHecListener
eventsSlackListener
eventsWebhookListener
eventsWriteDelegate
eventRepositoryDatabase
eventsIntegrationHandlerDelegate
eventIntegrationHandlerDatabase
eventIntegrationHandlerCache
cacheDatabaseFetch
eventIntegrationHandlerFilter
eventIntegrationHandlerPublish
integrationSlackSub
integrationTeamsSub
integrationDatadogSub
integrationWebhookSub
integrationHecSub
integrationSlackListener
integrationTeamsListener
integrationDatadogListener
integrationWebhookListener
integrationHecListener
integrationSlackDelegate
integrationTeamsDelegate
integrationDatadogDelegate
integrationWebhookDelegate
slackToSlackService
slackServiceToSlack
teamsToTeamsService
teamsServiceToTeams
datadogHandlerHttpClient
webhookHandlerHttpClient
httpToDatadog
httpToCrowdstrike
httpToSplunk
}
dynamic server.events "Events_RabbitMQ" "Event Integrations / RabbitMQ Detail" {
eventsWriteQueue
eventsHecQueue
eventsSlackQueue
eventsWebhookQueue
eventsWriteListener_events
eventsHecListener_events
eventsSlackListener_events
eventsWebhookListener_events
eventsWriteDelegate_events
eventRepositoryDatabase_events
eventsIntegrationHandlerDelegate_events
eventIntegrationHandlerDatabase_events
eventIntegrationHandlerCache_events
cacheDatabaseFetch_events
eventIntegrationHandlerFilter_events
eventIntegrationHandlerPublish_events
integrationSlackQueue
integrationWebhookQueue
integrationHecQueue
integrationTeamsQueue
integrationDatadogQueue
integrationSlackListener_events
integrationTeamsListener_events
integrationDatadogListener_events
integrationWebhookListener_events
integrationHecListener_events
integrationSlackDelegate_events
integrationTeamsDelegate_events
integrationDatadogDelegate_events
integrationWebhookDelegate_events
slackToSlackService_events
slackServiceToSlack_events
teamsToTeamsService_events
teamsServiceToTeams_events
webhookHandlerHttpClient_events
datadogHandlerHttpClient_events
httpToDatadog_events
httpToCrowdstrike_events
httpToSplunk_events
}

1
docs/dirt/models.dsl Normal file
View File

@@ -0,0 +1 @@
!include "event_integrations/models.dsl"

View File

@@ -0,0 +1 @@
!include "event_integrations/relationships.dsl"

1
docs/dirt/views.dsl Normal file
View File

@@ -0,0 +1 @@
!include "event_integrations/views.dsl"

View File

@@ -10,7 +10,6 @@ bw_controlled = group "Bitwarden Controlled" {
customer_success = person "Customer Success" "A customer success engineer. Inspects bitwarden state through the admin portal and internal tools" {
tags "Bitwarden Employee"
}
# Root systems
server = softwareSystem "Bitwarden Server" {
api = container "API" {
@@ -28,16 +27,13 @@ bw_controlled = group "Bitwarden Controlled" {
}
events_processor = container "Events Processor" {
tags "Events"
tags "Cloud-Only"
}
# Data stores
database = container "Database" {
tags "Database"
}
events_queue = container "Events Queue" {
tags "Queue"
tags "Azure"
}
mail_queue = container "Mail Queue" {
tags "Queue"
tags "Azure"
@@ -72,7 +68,7 @@ bw_controlled = group "Bitwarden Controlled" {
tags "LDAP"
tags "Self-Hosted"
}
key_connector = softwareSystem "Key Connector"
key_connector = softwareSystem "Key Connector"
}
self_hosted_instances = softwareSystem "Self-Hosted Instances" {

View File

@@ -35,12 +35,9 @@ server.api -> server.database "Queries"
server.portal -> server.database "Queries"
# queue Relationships
server.api -> server.events_queue "Sends events to"
server.events -> server.events_queue "Sends events to"
server.api -> server.mail_queue "Sends emails to"
server.api -> server.notifications_queue "Sends notifications to"
server.notifications -> server.notifications_queue "Sends notifications to"
server.events_queue -> server.events_processor "Processes events from"
server.mail_queue -> server.portal "Processes emails from"
# self host phone home