elmah.io Technology Stack
We often get this question:
Which technologies, tools and frameworks do you use to develop and host elmah.io?
We already revealed some of the "secrets" in the post Danish service provides maximum scaling and secures data on Azure. This post is a thorough walkthrough of the technologies in play in order to keep the elmah.io engine running.
elmah.io runs entirely on Windows Azure. We use a combination of web apps, virtual machines, service bus and storage to host everything in the cloud.
elmah.io is pretty much a single page application. All of the static HTML seen in the UI is served by ASP.NET MVC. We actually started out with simple HTML files, but quickly found out that MVC offers so much more than Razor (which we don't use).
ASP.NET Web API
Both our internal API for feeding the UI, as well as our public API are hosted by ASP.NET Web API. Web API may not be the coolest kid on the block, but it works great and actually got some nice features from v2.
If you ever wondered how elmah.io is able to provide instant search results when executing full text queries from the UI, Elasticsearch is the answer. This perfect NoSQL database is the foundation for most of the data access on elmah.io.
Everyone needs caching in order to provide a responsive product. Redis has turned out as the perfect choice for not only cache DB data, but also persist temporary statistics about which mails have been send etc.
Couldn't really develop without it. Everything from the website to all of the backend code is developed in Visual Studio.
We'd love to tell you that we type fast enough to code without ReSharper. Unfortunately this is not that case. ReSharper provides us with so many nice features to speed up development time.
Developing a product in 2015 without a build server is wack. We use TeamCity to build and test our internal code. For the open source parts of elmah.io, we use a combination of TeamCity provided by CodeBetter and Appveyor.
One of the goals for elmah.io, is to be able to work as a cloud logging platform for ... well elmah.io. We eat our own dog food and use all of the features in elmah.io ourselves. In parallel, we use Serilog and Elasticsearch to log a copy of all messages. If elmah.io goes down, we always have an external log telling us what went wrong.
We send a lot of transactional mails. Various features for sending emails from elmah.io are available and for that we use Mandrill. Mandrill provides some nice templating features that we blogged about as well: Sending transactional emails using Mandrill and .NET.
We want to provide the best performing .NET cloud logging platform out there. To keep an eye on performance and to debug when something starts performing poorly, we monitor every web request with New Relic.
We wouldn't be anywhere if we weren't able to accept payments from our users. Paymill handles all of our transactions.
We recently switched from Wordpress to MkDocs on all of our static stuff like documentation and blog. MkDocs is a nice little documentation tool written in Python. Every article and blog post are now written in Markdown and available on GitHub.
Besides all of the larger products and SaaS services, we use a large range of .NET frameworks for implementing and testing the various elmah.io features. NUnit, Moq and Autofixture for unit testing. Autofac for dependency injection. A range of client side libraries for building the crisp elmah.io UI like Knockout, Bootstrap, jQuery and d3. For integrating with social providers, we use SimpleAuthentication, a lightweight framework for hooking up with Facebook etc. Topshelf runs a bunch of Windows Services, hosting different consumers of our service bus, sending out emails etc.
That's it. Or maybe we forgot something :) Please use the comments below to tell us what you think about our stack or maybe even share your own stack.
This post was brought to you by the elmah.io team. elmah.io is the best error management system for .NET web applications. We monitor your website, alert you when errors start happening and help you fix errors fast.