A web-based UI for managing and exploring Azure Service Bus Emulator instances. This tool provides an intuitive interface to interact with queues, topics, subscriptions, and messages in the Azure Service Bus Emulator.
- List and Create Queues: View all queues with runtime properties (active/dead-letter message counts, size)
- Send Messages: Send messages to queues with custom properties and content
- Peek Messages: Preview messages in queues without consuming them
- Delete Queues: Remove queues from the emulator
- Dead Letter Queue Management: Bulk delete dead-letter messages
- List and Create Topics: Manage topics with real-time statistics
- Send Messages to Topics: Publish messages to topics for distribution to subscriptions
- Subscription Management: Create and manage subscriptions on topics
- Peek Subscription Messages: Preview messages in subscriptions
- Delete Topics/Subscriptions: Clean up resources
- Message Peeking: View message content and properties without consuming
- Dead Letter Queue Support: View and manage dead-letter messages for both queues and subscriptions
- Bulk Operations: Bulk delete operations for dead-letter messages
- Message Editor: In-browser editor for message content with syntax highlighting
- Modern React UI: Built with React 19, Vite, and Fluent UI/Mantine components
- Real-time Updates: Automatic refresh of entity statistics
- API Documentation: OpenAPI/Scalar API documentation available
- Monaco Editor: In-browser code editor for message content
- Observability: Built-in OpenTelemetry support
- Docker and Docker Compose
- .NET 10.0 SDK (for local development)
- Node.js 18+ and npm/yarn (for frontend development)
-
Clone the repository
git clone <repository-url> cd Service-Bus-Emulator-Explorer
-
Set environment variables
Create a
.envfile in the root directory:ACCEPT_EULA=Y SQL_PASSWORD=YourStrongPassword123!
-
Start the services
docker-compose up
This will start:
- Service Bus Emulator on ports
5672(AMQP) and5300(Admin) - SQL Server (required by the emulator)
- Service Bus Explorer UI on port
8080
- Service Bus Emulator on ports
-
Access the application
- Web UI: http://localhost:8080
- API: http://localhost:8080/api
- API Documentation: http://localhost:8080/scalar/v1
-
Navigate to the backend directory
cd src/ServiceBusEmulatorExplorer -
Configure connection strings
Update
appsettings.Development.json:{ "ServiceBus": { "ConnectionString": "Endpoint=sb://localhost;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;", "AdministrationConnectionString": "Endpoint=sb://localhost:5300;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;", "RefreshIntervalMs": 5000 } } -
Run the backend
dotnet run
The API will be available at http://localhost:5123
-
Navigate to the frontend directory
cd app/sb-explorer-ui -
Install dependencies
npm install
-
Run the development server
npm run dev
The UI will be available at http://localhost:5173
-
Build for production
npm run build
{
"ServiceBus": {
"ConnectionString": "Endpoint=sb://localhost;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;",
"AdministrationConnectionString": "Endpoint=sb://localhost:5300;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;",
"RefreshIntervalMs": 5000,
"EmulatorConfigFilePath": "service-bus-config.json"
},
"Otlp": {
"Endpoint": "https://your-otel-endpoint",
"Headers": ""
}
}Otlp:Endpoint: OTLP collector endpoint for OpenTelemetryOtlp:Headers: Additional headers for OTLP exporterOtlp:EnableConsoleExporter: Enable console exporter for debugging
Environment variables for the frontend (via .env or build scripts):
VITE_API_BASE_URL: Backend API base URL (default:/api)VITE_USE_MOCK: Enable/disable mock data (for development)
GET /api/queues- List all queuesPOST /api/queues- Create a new queueDELETE /api/queues/{name}- Delete a queueGET /api/queues/{name}/messages- Peek messages in a queuePOST /api/queues/{name}/messages- Send message to a queue
GET /api/topics- List all topicsPOST /api/topics- Create a new topicDELETE /api/topics/{name}- Delete a topicPOST /api/topics/{topic}/messages- Send message to a topic
GET /api/topics/{topic}/subscriptions- List subscriptionsPOST /api/topics/{topic}/subscriptions- Create a subscriptionDELETE /api/topics/{topic}/subscriptions/{sub}- Delete a subscriptionGET /api/topics/{topic}/subscriptions/{sub}/messages- Peek subscription messages
POST /api/deadletter/queue/{name}/delete- Bulk delete queue DLQ messagesPOST /api/deadletter/subscription/{topic}/{sub}/delete- Bulk delete subscription DLQ messages
Run the test suite:
cd test/ServiceBusEmulatorExplorer.Tests
dotnet testService-Bus-Emulator-Explorer/
βββ app/
β βββ sb-explorer-ui/ # React frontend
β βββ src/
β β βββ api/ # API client and hooks
β β βββ components/ # React components
β β βββ routes/ # Page components
β βββ package.json
βββ src/
β βββ ServiceBusEmulatorExplorer/ # .NET backend
β βββ Endpoints/ # API endpoints
β βββ Extensions/ # Service extensions
β βββ Program.cs # Application entry point
βββ test/
β βββ ServiceBusEmulatorExplorer.Tests/ # Unit tests
βββ compose.yaml # Docker Compose configuration
βββ sb-explorer.slnx # .NET solution file
docker build -t sb-explorer:local -f src/ServiceBusEmulatorExplorer/Dockerfile .Update compose.yaml to use your local image:
services:
sb-explorer:
image: sb-explorer:local
# ... rest of configuration- Ensure Docker is running
- Check that ports 5672 and 5300 are not in use
- Verify SQL password meets complexity requirements (uppercase, lowercase, numbers, special characters)
- Set
ACCEPT_EULA=Yin your environment
- Verify the Service Bus emulator is running:
docker ps - Check connection strings in
appsettings.json - Ensure the emulator is accessible on the configured ports
- Verify backend is running on the expected port
- Check
VITE_API_BASE_URLenvironment variable - Review CORS configuration in
Program.cs
The frontend and backend code are licensed under the MIT License. See the LICENSE file for details.
The majority of the frontend code was written by OpenAI's ChatGPT codex model.
The administration client for the emulator does not expose all of the properties in some of the models, so some parts of the application may not show all available properties or invalid information.
