Giter VIP home page Giter VIP logo

sbmanager's Introduction

SbManager Build status Gitter chat license

Installable web ui for managing Azure Service Bus (ASB) and Service Bus for Windows Server (SBWS)

Overview

SbManager is an app that is installable as a Windows Service (using Topshelf) that allows a level of visibility and maintenence on top of ASB and SBWS. It started life as a project internal to GlobalX (http://www.globalx.com.au), but is was open-sourced as there was a general feeling that such a tool would be beneficial to the community at large.

While there is already a pretty good tool for doing the things SbManager does, SbManager was created due to the following deficiencies in that existing software:

  1. GUI Windows app. This causes issues with remote access to different windows domains requiring RDP access.
  2. Usability isn't the best
  3. Not properly open-source
  4. Some defects (e.g. replaying binary-serialized message bodies). This is resolvable due to the source being available, but see point 3.

Additionally, SBWS has pretty poor monitoring capabilities, so SbManager allows us to expose REST endpoints for monitoring from tools such as PRTG

Screenshots

(Ignore the temporary logo. In related news: got a good logo?) SbManager Overview SbManager Subscription

Installing/Running

Local dev/play

  1. Open solution in Visual Studio
  2. In project 'SbManager' app.config, edit 'connectionStrings'. This can be your connectionstring, or you can point it at a file that contains the connection string (as the app config defaults to)
  3. Build. You can run from VS, or run SbManager.exe in the bin folder. This exe uses topshelf so can be installed (see below)

Packaging and Deploying

//todo There's a lot that can be done here.

At its simplest, build the app (as per above) and run

SbManager install

See: http://topshelf.readthedocs.org/en/latest/overview/commandline.html

Using

SbManager has a Web UI and REST endpoints

Web

The web UI is available by accessing the URL you configured in Installing/Running. This UI should be intuitive to use. If you find anything confusing/clunky, be sure to create an issue and let us know. The best way to keep user guides up to date is to not need them.

REST

The web UI is powered by the same REST API that you can access for monitoring/integration. No documentation exists yet, but you can see what's available by opening Fiddler/Firebug/etc. while navigating the site and looking at what requests are made. While not ideal, there is some precedent set for this method of 'documentation' (see Discourse @ https://meta.discourse.org/t/about-the-rest-api/3285/3)

Some software can't adequately set HTTP Headers. When consuming the API using such tools, you can control the format of returned data by setting the 'Content-Type' instead of the 'Accept' header. Currently supported overrides are 'application/json' and 'text/xml'

Security

There are currently NO security features. This is something required, inevitably, for proper use in production scenarios, but for now it does not exist. If you have great ideas on achieving this cleanly, start the discussion.

Windows Service Bus and Azure Service Bus Support

Please note that Windows Service Bus is dead and that support for it is deprecated. It will be removed in a future version.

Contributing

We'd love everyone and anyone to contribute!

  1. Check the issue list for outstanding tasks or create new ones.
  2. Send a pull request with completed code and unit/integration tests.
  3. Need help? Or support getting your change through? Start a discussion in the issue and if needs be, we can take it offline from there.

UI Design Tenets

  1. Consistent. Although we deal with different messaging entities, things should work the same across all
  2. Obvious. It should be clear what everything is and how to use everything. Nothing hidden behind right-clicks or mystery meat
  3. Minimal. Don't show things that aren't needed, and don't show things in a complicated way.
  4. Responsive. Although desktop is the primary target platform, it should work well on small devices.

sbmanager's People

Contributors

0xced avatar amosc avatar arthurs avatar brucem avatar crejb avatar dependabot[bot] avatar drewfreyling avatar jafin avatar jonyeezs avatar lukeschafer avatar mitchellcash avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sbmanager's Issues

Tags

I'm thinking we should probably start tagging releases. Thoughts?

Enable messages to be requeued with alterations

At the moment, under the message body when peeking, you can click a button to requeue the message with whatever changes are in that textarea. This needs to be extended to take into account changes to message properties. It also makes sense to not do it 'inline', as it could get confusing with the little 'breakout dialogues'.

I envisage that this feature would instead be called 'Modify and Requeue' which would popup or navigate to a screen with all the properties editable, and the ability to add and remove custom properties. It's worth thinking also about letting the user change which messaging entity it sends to (change queue/topic). With a this new screen, we could also re-purpose it to allow the user to send a totally new adhoc message.

Public CI

For GlobalX staff to provision/setup.

Sometimes after requeuing, peeking another msg refreshes page

Could be a timing issue. Use case (doesn't happen all the time, but is quite regular):

  1. peek multiple messages.
  2. choose one
  3. edit and requeue (should happen with a plain requeue)
  4. choose another message
  5. sometimes at step 4, it reloads the model again

Disable/Enable Topic

Is this even possible or desired?

toggle-button or the like on the bottom toolbar.

also, a way to denote disabled topics (strikethrough?) when listing them, and on the topic screen itself

Nuget package isn't in the shape that's probably required

I basically put a wildcard include on the bin/Release dir so the package has everything required to run, but there is some extra junk in there that's not required, and it's not really in a shape that could, say, be referenced from a project file (not that I'm sure you'd want to, just sayin')

Probably needs a bit of a cleanup...

Browser Support

We should list on the readme the exact list of browsers we support.

Support Multiple SB Connections strings

Ability to select from multiple ServiceBus connection strings (dropdown?) to support multiple configs via the one interface.

Will require a change to the configuration to support this. json array? or something.

PoC UI Tests

Proof-of-concept some UI tests for review - what style of UI tests? what tech? etc

Rationalise AngularJS Directives

The angular controllers/directives can be componentised better, with more thought put towards correct scope. It may also be worthwhile breaking out of the single epic directives.js file.

NullReferenceException in DeadLetterQueue

While trying to peak at the dead letter queue we occassionaly get a 500, I'm assuming because Value is null.

Nancy.RequestExecutionException: Oh noes! ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at GSF.BusManager.Models.ViewModelBuilders.QueueMessagesBuilder.b__1(KeyValuePair`2 kvp) in c:\Builds\5\GlobalX\GSF.BusManager.CI\src\src\GSF.BusManager\Models\ViewModelBuilders\QueueMessagesBuilder.cs:line 61
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
   at GSF.BusManager.Models.ViewModelBuilders.QueueMessagesBuilder.Build(FindQueuedMessages criteria) in c:\Builds\5\GlobalX\GSF.BusManager.CI\src\src\GSF.BusManager\Models\ViewModelBuilders\QueueMessagesBuilder.cs:line 61
   at GSF.BusManager.CQRS.ModelBuilders.ModelCreator.Build[TModel,TCriteria](TCriteria criteria) in c:\Builds\5\GlobalX\GSF.BusManager.CI\src\src\GSF.BusManager\CQRS\ModelBuilders\ModelCreator.cs:line 34
   at GSF.BusManager.Modules.V1.BusManagerModule.<.ctor>b__3a(Object _) in c:\Builds\5\GlobalX\GSF.BusManager.CI\src\src\GSF.BusManager\HttpModules\V1\BusManagerModule.cs:line 41
   at CallSite.Target(Closure , CallSite , Func`2 , Object )
   at Nancy.Routing.Route.<>c__DisplayClass4.b__3(Object parameters, CancellationToken context)
   --- End of inner exception stack trace ---
   at Nancy.NancyEngine.InvokeOnErrorHook(NancyContext context, ErrorPipeline pipeline, Exception ex)

Fix appveyor

I believe it's red because of the assemblyversion

On appveyor, in settings under 'General', scroll down and make it look like this:

image

API Keys

Need to create and maintain API keys.

The REST API is shared but the UI, so it will need to support 2 kinds of auth - cookies and keys. Some tools don't support HTTP headers, so there needs to be a way to specify the key as a route param or query string parameter (likely the latter)

Bundling

I'm pretty sure splitting out the directives from #1 will mean we need to look at reducing our http requests.

Create/Edit Subscription

A fair bit of UX/Design will go into this. It probably makes sense to open an 'edit screen' (shared with create) rather than edit in-line due to the downtime required to update a messaging entity

Needs to be able to set all messaging entity properties.

Create/Edit Queue

A fair bit of UX/Design will go into this. It probably makes sense to open an 'edit screen' (shared with create) rather than edit in-line due to the downtime required to update a messaging entity

Needs to be able to set all messaging entity properties.

Live updating of UI with SignalR

BusMonitor should publish changes.

It's probably not intelligent to update view models for things like active/dead letters being peeked (because of the cost of continually checking those messages for changes), but certainly messaging entity properties and message counts should be propagated to connected clients.

Create/Edit Topic

A fair bit of UX/Design will go into this. It probably makes sense to open an 'edit screen' (shared with create) rather than edit in-line due to the downtime required to update a messaging entity

Needs to be able to set all messaging entity properties.

Display "Scheduled Count" in 'Overview" view

Currently only the "Active Messages" and "Dead Letters" are displayed in the 'Overview'.
It would be a nice feature to also have the "Scheduled Count" displayed, as it is displayed when you drill down on individual queues.

Toast notifications

After #6 Live updating of UI with SignalR

There are some things that might be important as a notification/toast message. E.g.

  • new deadletters
  • exceptions (e.g. bus connection lost)

Something causes ActiveMessageCount to get stuck when nothing can be peeked.

Not sure yet if there are actually messages in there, or if they're peek-locked for a mega long time, or what have you.

This was observed some time ago, but not for a while, so I'm not sure if it's an issue at all. We've had occasional problems with SBWS falling over, so this might be related to that, and hence not a huge issue (since there's much bigger problems to worry about when that's happening)

Azure Worker Role

SbManager can be run as a console app or windows service thanks to Topshelf. That said, it would be awesome if we could also run it as an Azure Worker Role.

Sometimes requeueing doesn't work

In the RequeueAndRemove::RequeueOne() method, the messages are iterated through to find the one to requeue with a matching messageId. However, it uses the QueueClient::ReceiveBatch() method which may return fewer messages than the number requested, consequently it can happen that the message to requeue is not found in the returned list and so nothing happens.

Integration Test suite

We have an integration test suite. This is designed to be run against a running instance of SbManager in a CI scenario (e.g. deployed to a vanilla machine and run, then the integration tests run against it)

It doesn't have to be comprehensive, mostly to make sure it's running properly. However, this might be a good way to run automated UI tests (then again, the CI server can probably run a more fit-for-purpose UI test)

Plugins?

We thought it might be a good idea for SbManager to integrate information about business-related stuff and perhaps auditing.

There would be 2 parts to a plugin - 1) how to make it actually run in the app and be installable/uninstallable etc, and 2) how would it integrate into the UI.

Some thoughts:
MEF?
No server-side components and just use a HTTP widget-style plugin?
Many abstractions (Nimbus, NServiceBus) have the concept of 'audit messages' and it would be useful to show these. This 'plugin' would have first-class auditing knowledge built into SbManager, and the plugins would simply be to collect and transform the audit messages.

ServiceBus API Facade

We can't unit test a bunch of stuff.

Hide the SB API behind some proxies and unit test the things that can now be tested

Disable/Enable Queue

toggle-button or the like on the bottom toolbar.

also, a way to denote disabled queues (strikethrough?) when listing them, and on the queue screen itself

Create/Edit Filter/Rule

A fair bit of UX/Design will go into this. It probably makes sense to open an 'edit screen' (shared with create) rather than edit in-line due to the downtime required to update a messaging entity

Needs to be able to set all messaging entity properties.

Disable/Enable Subscription

toggle-button or the like on the bottom toolbar.

also, a way to denote disabled subscriptions (strikethrough?) when listing them, and on the subscription screen itself

'Find in Message' when peeking

when peeking a bunch of messages, have a filter field at the top of the peek table that allows the user to filter the current set of messages to only those that contain that text. Might need a flag as to whether or not to search the body or just the headers, but not sure at this point

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.