diff --git a/Snippets/ServiceControl/ServiceControl_All/powershell-error.ps1 b/Snippets/ServiceControl/ServiceControl_All/powershell-error.ps1 index 197ec251e94..10526aa46d6 100644 --- a/Snippets/ServiceControl/ServiceControl_All/powershell-error.ps1 +++ b/Snippets/ServiceControl/ServiceControl_All/powershell-error.ps1 @@ -7,6 +7,7 @@ $serviceControlInstance = New-ServiceControlInstance ` -Port 33334 ` -DatabaseMaintenancePort 33335 ` -Transport MSMQ ` + -EnableIntegratedServicePulse ` -ErrorQueue error1 ` -ErrorRetentionPeriod 10:00:00:00 # endcode diff --git a/menu/menu.yaml b/menu/menu.yaml index 5e937047c2d..2cb2571f9bd 100644 --- a/menu/menu.yaml +++ b/menu/menu.yaml @@ -1576,6 +1576,8 @@ Articles: - Title: ServiceControl Error instances Url: servicecontrol/servicecontrol-instances + - Title: Integrated ServicePulse + Url: servicecontrol/servicecontrol-instances/integrated-servicepulse - Title: Deployment Url: servicecontrol/servicecontrol-instances/deployment Articles: diff --git a/platform/installation.md b/platform/installation.md index 9e7ddf5ba56..87773b296dc 100644 --- a/platform/installation.md +++ b/platform/installation.md @@ -52,17 +52,25 @@ ServiceControl, along with ServicePulse, can be hosted in Visual Studio, with no ServicePulse is a single page application which can be deployed in multiple ways: -#### Windows service +#### Integrated in ServiceControl + +ServiceControl version 6.13 and above includes [integrated ServicePulse](/servicecontrol/servicecontrol-instances/integrated-servicepulse.md) and can host ServicePulse from a ServiceControl [Error instance](/servicecontrol/servicecontrol-instances/) host. + +#### Separate from ServiceControl + +ServicePulse can be installed as a separate application from ServiceControl, although it still must be connected to a ServiceControl Error instance to function. + +##### Windows service ServicePulse can be installed using a dedicated [installation package](https://particular.net/downloads), which deploys ServicePulse as a Windows service host. ServicePulse can be installed more than once on a single machine, with each instance listening on its own port. This is done by [specifying appropriate arguments during installation](/servicepulse/installation.md#installation-available-installation-parameters). -#### Container (Linux only) +##### Container (Linux only) A container image for ServicePulse is pushed to [Docker Hub](https://hub.docker.com/u/particular) creating the ability to deploy ServicePulse on a Linux and [OCI compatible](https://opencontainers.org/) container host, e.g. Docker or Kubernetes. -#### Extracted +##### Extracted Using the [installation package](https://particular.net/downloads), ServicePulse can be [extracted as a set of HTML, JavaScript, and CSS files](/servicepulse/install-servicepulse-in-iis.md#basic-setup-detailed-steps) and subsequently deployed to any web server. diff --git a/servicecontrol/index.md b/servicecontrol/index.md index d0bc1b0efec..a43f81c4883 100644 --- a/servicecontrol/index.md +++ b/servicecontrol/index.md @@ -15,7 +15,7 @@ For more information on how ServiceControl and ServicePulse work together, refer There are three types of instances that can be created: - [Error instances](/servicecontrol/servicecontrol-instances/) - This is the most commonly used ServiceControl instance and indispensable to ensure the smooth operation of an NServiceBus system. Together with ServicePulse, it provides the ability to visualize and retry failed messages. + This is the most commonly used ServiceControl instance and is indispensable to ensure the smooth operation of an NServiceBus system. Together with ServicePulse (which can be [hosted by the ServiceControl Error instance](/servicecontrol/servicecontrol-instances/integrated-servicepulse.md)), it provides the ability to visualize and retry failed messages. - [Audit instances](/servicecontrol/audit-instances/) Audit instances provide valuable information about the message flow through a system. Among other things, this is used by ServicePulse to help visualize a distributed system. - [Monitoring instances](/servicecontrol/monitoring-instances/) diff --git a/servicecontrol/security/configuration/cors.md b/servicecontrol/security/configuration/cors.md index 044399bd6ac..89d38d6e62d 100644 --- a/servicecontrol/security/configuration/cors.md +++ b/servicecontrol/security/configuration/cors.md @@ -24,6 +24,11 @@ CORS configuration is required when: - ServicePulse is hosted on a different domain than ServiceControl - ServiceControl is accessed through a reverse proxy with a different domain +CORS configuration is *not* required when: + +- ServicePulse is [hosted by ServiceControl](/servicecontrol/servicecontrol-instances/integrated-servicepulse.md) +- ServicePulse is using the [internal reverse proxy](/servicepulse/containerization/#settings-enable-reverse-proxy). + ## Configuration examples To restrict access to only your ServicePulse domain, using the primary ServiceControl instance: diff --git a/servicecontrol/servicecontrol-instances/configuration.md b/servicecontrol/servicecontrol-instances/configuration.md index c5d40d01517..91e6ca748f0 100644 --- a/servicecontrol/servicecontrol-instances/configuration.md +++ b/servicecontrol/servicecontrol-instances/configuration.md @@ -175,6 +175,22 @@ Run [ServiceControl error instance in maintenance mode](/servicecontrol/ravendb/ | --- | --- | | bool | False | +### ServiceControl/EnableIntegratedServicePulse + +_Added in version 6.13.0_ + +Set to `true` to enable [integrated ServicePulse](/servicecontrol/servicecontrol-instances/integrated-servicepulse.md) included in ServiceControl versions 6.13 and above. + +| Context | Name | +| --- | --- | +| **Environment variable** | `SERVICECONTROL_ENABLEINTEGRATEDSERVICEPULSE` | +| **App config key** | `ServiceControl/EnableIntegratedServicePulse` | +| **SCMU field** | `Enable integrated ServicePulse` | + +| Type | Default value | +| --- | --- | +| bool | `false` | + ## [Authentication](/servicecontrol/security/configuration/authentication.md) These settings configure [authentication using OAuth 2.0 and OpenID Connect](/servicecontrol/security/). Refer to the [hosting and security guide](/servicecontrol/security/hosting-guide.md) or [authentication configuration examples](/servicecontrol/security/configuration/authentication.md#identity-provider-setup-configuration-examples) for additional information. diff --git a/servicecontrol/servicecontrol-instances/deployment/containers.md b/servicecontrol/servicecontrol-instances/deployment/containers.md index 060a485b3d7..58611f6f603 100644 --- a/servicecontrol/servicecontrol-instances/deployment/containers.md +++ b/servicecontrol/servicecontrol-instances/deployment/containers.md @@ -17,6 +17,7 @@ docker run -d --name servicecontrol -p 33333:33333 \ -e CONNECTIONSTRING="host=rabbitmq" \ -e RAVENDB_CONNECTIONSTRING="http://servicecontrol-db:8080" \ -e REMOTEINSTANCES='[{"api_uri":"http://audit:44444/api"}]' \ + -e ENABLE_INTEGRATED_SERVICEPULSE="true" \ particular/servicecontrol:latest ``` @@ -65,6 +66,12 @@ _Environment variable:_ `REMOTEINSTANCES` A JSON structure that provides URLs for the Error instance to access any [remote audit instances](/servicecontrol/servicecontrol-instances/remotes.md). When requesting audit data via the ServiceControl API, the Error instance will communicate to each of the remote audit instances in a scatter-gather pattern and then return the combined results. The URLs must be accessible by the Error instance directly, not constructed to be accessible from an external browser. +### Enable integrated ServicePulse + +_Environment variable:_ `ENABLE_INTEGRATED_SERVICEPULSE` + +A boolean value specifying whether to enable the [integrated ServicePulse](/servicecontrol/servicecontrol-instances/integrated-servicepulse.md) for this Error instance. + include: servicecontrol-container-license ## Ports diff --git a/servicecontrol/servicecontrol-instances/deployment/scmu.md b/servicecontrol/servicecontrol-instances/deployment/scmu.md index fba1a3cebf9..fe3dfc5b853 100644 --- a/servicecontrol/servicecontrol-instances/deployment/scmu.md +++ b/servicecontrol/servicecontrol-instances/deployment/scmu.md @@ -48,6 +48,7 @@ There are [three types](/servicecontrol/#servicecontrol-instance-types) of Servi This queue is important to endpoints that send error and audit messages to these ServiceControl instances, as well as [plugins](/servicecontrol/servicecontrol-instances/configuration.md#host-settings-servicecontrolinstancename). 6. If needed, configure [forwarding queues](/servicecontrol/errorlog-auditlog-behavior.md). 7. Full-text search can be turned off for [performance reasons](/servicecontrol/capacity-and-planning.md#storage-performance) if it's not needed. + 8. Disable [integrated ServicePulse](/servicecontrol/servicecontrol-instances/integrated-servicepulse.md) if it is not needed. A monitoring instance differs from error and audit instances in its configuration: diff --git a/servicecontrol/servicecontrol-instances/integrated-servicepulse.md b/servicecontrol/servicecontrol-instances/integrated-servicepulse.md new file mode 100644 index 00000000000..45d88ef1627 --- /dev/null +++ b/servicecontrol/servicecontrol-instances/integrated-servicepulse.md @@ -0,0 +1,47 @@ +--- +title: Integrated ServicePulse +summary: A guide to hosting ServicePulse and ServiceControl within the same host process. +reviewed: 2026-02-16 +component: ServiceControl +--- + +Version 6.13 of ServiceControl and above include integrated ServicePulse. Integrated ServicePulse is hosted in the same host process as the ServiceControl Error instance, and is automatically configured to use it. + +Benefits: +- No need for a standalone ServicePulse installation. Install and manage ServiceControl and ServicePulse in one place. +- No need to configure ServicePulse with the ServiceControl Error instance url. Integrated ServicePulse is preconfigured to connect to the ServiceControl installation it runs in. +- No need to upgrade ServicePulse. Each new version of ServiceControl includes the latest ServicePulse. Every time ServiceControl is upgraded, integrated ServicePulse is upgraded as well. + +Drawbacks: +- Can not use built-in ServicePulse reverse proxy. Enable [security features of ServiceControl](/servicecontrol/security/) to secure access to ServiceControl data. +- Can not use a single ServicePulse instance to control multiple ServiceControl installations. Each ServiceControl Error instance can be configured with a dedicated integrated ServicePulse. + +> [!NOTE] +> Standalone ServicePulse installations continue to function normally and can be used in conjunction with integrated ServicePulse. + +## Enable integrated ServicePulse + +Integrated ServicePulse can be [enabled in the ServiceControl Error instance configuration](/servicecontrol/servicecontrol-instances/configuration.md#host-settings-servicecontrolenableintegratedservicepulse). + +When upgrading an existing ServiceControl Error instance via ServiceControl Management, the user is prompted to enable integrated ServicePulse. + +![ServiceControl Management Error instance upgrade screen](/servicecontrol/servicecontrol-instances/upgrade-enable-integrated-servicepulse.png) + +When upgrading an existing ServiceControl Error instance via Powershell or docker, update the configuration manually to enable integrated ServicePulse. + +> [!NOTE] +> Once integrated ServicePulse is enabled, standalone ServicePulse installations are no longer needed and can be removed. + +## Configuring integrated ServicePulse + +Integrated ServicePulse shares settings with the ServiceControl Error instance it is hosted by (the hosting instance). + +- All host settings (such as [host name](/servicecontrol/servicecontrol-instances/configuration.md#host-settings-servicecontrolhostname) and [port number](/servicecontrol/servicecontrol-instances/configuration.md#host-settings-servicecontrolport)) are shared with the hosting instance. Integrated ServicePulse is available at the root url (`http://localhost:33333/` in a default installation). +- Most security settings are shared with the hosting instance. There is no need to enable [header forwarding](/servicepulse/security/configuration/forward-headers.md) for ServicePulse specifically, and [CORS](/servicecontrol/security/configuration/cors.md) is no longer required +- [ServicePulse specific authorization configuration](/servicecontrol/servicecontrol-instances/configuration.md#authentication-servicecontrolauthentication-servicepulse-clientid) is still required. +- Integrated ServicePulse is automatically configured to connect to the hosting instance. This configuration is read-only and cannot be changed. +- Connection to a ServiceControl Monitoring instance can be [configured via the ServicePulse UI](/servicepulse/host-config.md#configuring-connections-via-the-servicepulse-ui). + +## Upgrade integrated ServicePulse + +There is no need to upgrade integrated ServicePulse separately. Each release of ServiceControl contains the latest version of ServicePulse, and each new release of ServicePulse will trigger a release of ServiceControl. Upgrading the ServiceControl Error instance will upgrade integrated ServicePulse automatically. \ No newline at end of file diff --git a/servicecontrol/servicecontrol-instances/upgrade-enable-integrated-servicepulse.png b/servicecontrol/servicecontrol-instances/upgrade-enable-integrated-servicepulse.png new file mode 100644 index 00000000000..01d5929ca90 Binary files /dev/null and b/servicecontrol/servicecontrol-instances/upgrade-enable-integrated-servicepulse.png differ diff --git a/servicepulse/index.md b/servicepulse/index.md index a985a77b81f..d0b4fc5059f 100644 --- a/servicepulse/index.md +++ b/servicepulse/index.md @@ -20,6 +20,8 @@ ServicePulse uses information provided by ServiceControl. To use ServicePulse, f - For message flow visualisation and viewing successful messages, one or more [audit instances](/servicecontrol/audit-instances/) are required. - For monitoring throughput and other metrics, a [monitoring instance](/servicecontrol/monitoring-instances/) is required. +[ServiceControl version 6.13 and above include integrated ServicePulse](/servicecontrol/servicecontrol-instances/integrated-servicepulse.md). + #### Relationship between ServicePulse, ServiceControl, Monitoring, and Endpoints ```mermaid diff --git a/servicepulse/installation.md b/servicepulse/installation.md index 9e95ea3c096..8122d34f236 100644 --- a/servicepulse/installation.md +++ b/servicepulse/installation.md @@ -8,7 +8,7 @@ related: --- > [!NOTE] -> It is also possible to run ServicePulse in a [container](containerization). +> This guide explains how to install ServicePulse using the standalone installer package. It is also possible to run ServicePulse [in ServiceControl](/servicecontrol/servicecontrol-instances/integrated-servicepulse.md) or in a [container](containerization). ## Prerequisites diff --git a/servicepulse/security/configuration/forward-headers.md b/servicepulse/security/configuration/forward-headers.md index e55b538f28d..ac069fedd58 100644 --- a/servicepulse/security/configuration/forward-headers.md +++ b/servicepulse/security/configuration/forward-headers.md @@ -9,7 +9,9 @@ related: --- > [!NOTE] -> This page is **not** relevant if the [ServicePulse static files have been extracted](/servicepulse/install-servicepulse-in-iis.md), and is being hosted in anything other than the [Container](/servicepulse/containerization/) or [Windows Service](/servicepulse/installation.md) hosting options provided. Forward header configuration is only required if using a reverse proxy. +> This page is **not** relevant if: +> - [integrated ServicePulse](/servicecontrol/servicecontrol-instances/integrated-servicepulse.md) is used. Integrated ServicePulse uses [the forward header configuration of the ServiceControl Error instance](/servicecontrol/security/configuration/forward-headers.md) that hosts it. +> - the [ServicePulse static files have been extracted](/servicepulse/install-servicepulse-in-iis.md), and is being hosted in anything other than the [Container](/servicepulse/containerization/) or [Windows Service](/servicepulse/installation.md) hosting options provided. Forward header configuration is only required if using a reverse proxy. When ServicePulse is deployed behind a reverse proxy that terminates SSL/TLS (like nginx, Traefik, or a cloud load balancer), you need to configure forwarded headers so ServicePulse correctly understands the original client request. diff --git a/servicepulse/security/configuration/tls.md b/servicepulse/security/configuration/tls.md index f15fc3aa484..f5d092bb38d 100644 --- a/servicepulse/security/configuration/tls.md +++ b/servicepulse/security/configuration/tls.md @@ -9,7 +9,9 @@ related: --- > [!NOTE] -> This page is **not** relevant if the [ServicePulse static files have been extracted](/servicepulse/install-servicepulse-in-iis.md), and is being hosted in anything other than the [Container](/servicepulse/containerization/) or [Windows Service](/servicepulse/installation.md) hosting options provided. If using [authentication](/servicepulse/security/configuration/authentication.md), it is recommended to use TLS encryption. +> This page is **not** relevant if: +> - [integrated ServicePulse](/servicecontrol/servicecontrol-instances/integrated-servicepulse.md) is used. Integrated ServicePulse will use [the TLS configuration of the ServiceControl Error instance](/servicecontrol/security/configuration/tls.md) that hosts it. +> - the [ServicePulse static files have been extracted](/servicepulse/install-servicepulse-in-iis.md), and is being hosted in anything other than the [Container](/servicepulse/containerization/) or [Windows Service](/servicepulse/installation.md) hosting options provided. If using [authentication](/servicepulse/security/configuration/authentication.md), it is recommended to use TLS encryption. ServicePulse can be configured to use HTTPS directly, enabling encrypted connections without relying on a reverse proxy for SSL termination.