Posts by Adam Wiggins

Routing and Web Performance on Heroku: a FAQ

Hi. I'm Adam Wiggins, cofounder and CTO of Heroku.

Heroku has been my life’s work. Millions of apps depend on us, and I take that responsibility very personally.

Recently, Heroku has faced criticism from the hacker community about how our HTTP router works, and about web performance on the platform in general. I’ve read all the public discussions, and have spent a lot of time over the past month talking with our customers about this subject.

The concerns I've heard from you span past, present, and future.

The past: some customers have hit serious problems with poor web performance and insufficient visibility on their apps, and have been left very frustrated as a result. What...

Continue reading »

log2viz: Logs as Data for Performance Visibility

** THIS FEATURE IS NOW DEFUNCT **

If you’re building a customer-facing web app or mobile back-end, performance is a critical part of user experience. Fast is a feature, and affects everything from conversion rates to your site’s search ranking.

The first step in performance tuning is getting visibility into the app’s web performance in production. For this, we turn to the app’s logs.

Logs as data

There are many ways to collect metrics, the most common being direct instrumentation into the app. New Relic, Librato, and Hosted Graphite are cloud services that use this approach, and there are numerous roll-your-own options like StatsD and Metrics.

Another approach is to send metrics to the...

Continue reading »

The Heroku Toolbelt

The Heroku Toolbelt is a package of the Heroku CLI, Foreman, and Git — all the tools you need to get started using Heroku at the command line. The Toolbelt is available as a native installer for OS X, Windows, and Debian/Ubuntu Linux.

The Toolbelt has been available since last fall as part of our polyglot platform. Since then it's matured substantially with a huge amount of user testing, and now even has a shiny new landing page. Ruby developers can continue to use gem install heroku, but developers in other languages (Python, Java, Clojure, etc) will probably prefer not to have to install Ruby and RubyGems to use Heroku.

The installer won't trample your existing install of Git...

Continue reading »

InfoWorld Names Heroku a 2012 Technology of the Year

InfoWorld has named Heroku as a 2012 Technology of the Year. While we're not normally much for industry awards, we feel honored to be included alongside past winners such as the iPad, Android, Visual Studio, and Eclipse; and this year's winners, including Amazon Web Services, Node.js, Hadoop, CloudBees, and Heroku add-on provider Rhomobile.

InfoWorld is a venerable publication in the technology world, and this is the first time they've given awards in the cloud space. We see this as another major point of validation for platform-as-a-service, and cloud technologies more generally. 2011 was the year that PaaS came into the greater collective consciousness of the technology...

Continue reading »

Scala on Heroku

The sixth official language on the Heroku polyglot platform is Scala, available in public beta on the Cedar stack starting today.

Scala deftly blends object-oriented programming with functional programming. It offers an approachable syntax for Java and C developers, the power of a functional language like Erlang or Clojure, and the conciseness and programmer-friendliness normally found in scripting languages such as Ruby or Python. It has found traction with big-scale companies like Twitter and Foursquare, plus many others. Perhaps most notably, Scala offers a path forward for Java developers who seek a more modern programming language.

More on those points in a moment. But first,...

Continue reading »

Python and Django on Heroku

Python has joined the growing ranks of officially-supported languages on Heroku's polyglot platform, going into public beta as of today. Python is the most-requested language for Heroku, and it brings with it the top-notch Django web framework.

As a language, Python has much in common with Ruby, Heroku's origin language. But the Python community has its own unique character. Python has a culture which finds an ideal balance between fast-moving innovation and diligent caution. It emphasizes readability, minimizes "magic," treats documentation as a first-class concern, and has a traditon of well-tested, backward-compatible releases in both the core language and its...

Continue reading »

Facebook and Heroku

We're delighted to announce that Facebook and Heroku have teamed up to bring you the fastest and easiest way to get your own Facebook app up and running in the cloud.

Facebook apps have long been a major segment on the Heroku platform. From scrappy startups like Cardinal Blue to Hollywood giants like Warner Brothers, Heroku's scale-out capabilities and friction-free workflow enables these innovative companies to easily deliver great social experiences. Now, Facebook has created a fantastic new way to start building a live Facebook app instantly, powered by Heroku.

A Quick Tour

Start by going to Facebook Developers. Click Create New App and then Cloud Services → Get Started...

Continue reading »

Heroku for Java

We're pleased to announce the public beta of Heroku for Java. Java is the fourth official language available on the Cedar stack.

Java is, by many measures, the world's most popular programming language. In addition to its large and diverse developer base, it offers a huge ecosystem of libraries and tools, an extremely well-tuned VM for fast and reliable runtime performance, and an accessible C-like syntax.

But there are also many criticisms commonly leveled against the language. We'll take a closer look at Java's strengths and weaknesses in a moment, but first:

Heroku for Java in 2 minutes

Create a project with three files:

pom.xml

<?xml version="1.0"...

Continue reading »

Polyglot Platform

Programming languages are silos. The libraries, development tools, deployment practices, and even naming schemes associated with one language — say, Ruby — rarely have much carry-over to another language — say, Python, Erlang, Java, or C++.

Professional programmers dedicate their careers to becoming experts in a particular language, making extensive personal investment in learning not only their chosen language's syntax and libraries, but also the ecosystem of tools and practices from that language's community. Similarly, companies build up codebases, deployment infrastructure, policies, and tacit knowledge in their engineering staff around a single language.

Deep investment in a...

Continue reading »

Clojure on Heroku

We're very excited to announce official support for Clojure, going into public beta as of today. Clojure is the third official language supported by Heroku, and is available on the Cedar stack.

Clojure is a Lisp-like functional programming language which runs on the Java Virtual Machine (JVM). It offers powerful concurrency primitives based on immutable data structures, with emphasis on composability and correctness. The Clojure community is vibrant and growing quickly.

More about Clojure in a moment, but first:

Clojure on Heroku in 2 minutes

Create a project with three files:

project.clj

(defproject hello-world "0.0.1" :dependencies [[org.clojure/clojure...

Continue reading »

The New Heroku (Part 4 of 4): Erosion-resistance & Explicit Contracts

In 2006, I wrote Catapult: a Quicksilver-inspired command-line for the web. I deployed it to a VPS (Slicehost), then gave the URL out to a few friends. At some point I stopped using it, but some of my friends remained heavy users. Two years later, I got an email: the site was down.

Logging into the server with ssh, I discovered many small bits of breakage:

  • The app's Mongrel process had crashed and not restarted.
  • Disk usage was at 100%, due to growth of logfiles and temporary session data.
  • The kernel, ssh, OpenSSL, and Apache needed critical security updates.

The Linux distro had just reached end-of-life, so the security fixes were not available via apt-get. I tried to migrate to a...

Continue reading »

The New Heroku (Part 3 of 4): Visibility & Introspection

Visibility and introspection capabilities are critical for managing and debugging real-world applications. But cloud platforms are often lacking when it comes to visibility. The magical black box is great when it "just works," but not so great when your app breaks and you can't look inside the box.

Standard introspection tools used in server-based deployments — such as ssh, ps aux, top, tail -f logfile, iostat — aren't valid in a multi-tenant cloud environment. We need new tools, new approaches. Heroku's new runtime stack, Celadon Cedar, includes three powerful tools for visibility and introspection: heroku ps, heroku logs, and heroku releases. This post will examine...

Continue reading »

The New Heroku (Part 2 of 4): Node.js & New HTTP Capabilities

Node.js has gotten its share of press in the past year, achieving a level of attention some might call hype. Among its touted benefits are performance, high concurrency via a single-threaded event loop, and a parity between client-side and sever-side programming languages which offers the Promethean opportunity of making server-side programming accessible to front-end developers.

But what is Node.js, exactly? It's not a programming language - it's simply Javascript. It's not a VM: it uses the V8 Javascript engine, the same one used by the Chrome web browser. Nor is it simply a set of libraries for Javascript. Nor is it a web framework, though the way it is sweeping the...

Continue reading »

The New Heroku (Part 1 of 4): The Process Model & Procfile

In the beginning was the command line. The command line is a direct and immediate channel for communicating with and controlling a computer. GUIs and menus are like pointing and gesturing to communicate; whereas the command line is akin to having a written conversation, with all the nuance and expressiveness of language.

This is not lost on developers, for whom the command prompt and blinking cursor represents the potential to run anything, to do anything. Developers use the command line for everything from starting a new project (rails new) to managing revisions (git commit) to launching secondary, more specialized command lines (psql, mysql, irb, node).

With Celadon Cedar, Heroku's...

Continue reading »

Ruby 1.9.2 Is Now The Default

Ruby 1.9.2 on Bamboo is now the default for new apps created on Heroku.

As we said back in April: Ruby 1.9.2 as the new gold standard for production Ruby apps. In 2011, we’ve seen more and more developers move to 1.9.2. It’s fast, stable, and sees excellent support throughout the community.

You can always list available stacks with the heroku stack command; and if you want your new app on Ruby 1.8.7 you can run heroku create --stack bamboo-ree-1.8.7 to explicitly ask for the older stack.

Continue reading »

New Logging Now in General Availability

In December, we rolled out the public beta of a sweet new logging system for Heroku. The new system combines log output from your app’s processes and Heroku’s system components (such as the HTTP router). With all of your logs collated into a single, time-ordered stream, you get an integrated view of everything happening in your app.

Here’s a sample:

 $ heroku logs 2010-10-21T14:11:16-07:00 app[web.2]: Processing PostController#list (for 208.16.84.131 at 2010-10-21 14:11:16) [GET] 2010-10-21T14:11:16-07:00 app[web.2]: Rendering template within layouts/application 2010-10-21T14:11:16-07:00 app[web.2]: Rendering post/list 2010-10-21T14:11:16-07:00 app[web.2]: Rendered includes/_header...

Continue reading »

Improved Maintenance Mode for All Apps

The improved maintenance mode we described last month is now standard for all existing and new apps.

This new maintenance mode is faster and much more scalable, particularly for apps with more than fifty dynos. It handles maintenance mode at the HTTP router, providing an instantaneous response for turning maintenance mode on or off regardless of the size of your app.

It uses a standard page which serves with an HTTP 503 code. You can use the Custom Error Pages add-on to provide your own maintenance page to the router.

(If you preferred the old maintenance mode, you can manually add it to your app by installing this middleware and setting a MAINTENANCE config var.)

Read the docs for usage...

Continue reading »

A New Approach to Errors

When your app is crashed, out of resources, or misbehaving in some other way, Heroku serves error pages to describe the problem. We also have a single page for platform errors, once known as the ouchie guy (pictured right).

While the approach of showing error information directly via the web has worked well enough, there was room for improvement on both developer visibility and professionalism of presentation to end users. With that in mind, we’ve reworked our approach on error handling, making improvements that should make it much easier for you, the developer, to diagnose and correct errors in your app.

This new approach can be broken down into four features:

  1. Consolidated error...

Continue reading »

Heroku Gets Sweet Logging

Access to application logs on Heroku has historically been one of the least usable functions of the platform. The “heroku logs” command was nothing more than a broadcast fetch of the logfiles for every web and worker dyno in your app. This worked ok for small apps, but the user experience became very poor once you got past five or ten dynos.

I’m incredibly excited to announce that today we’re rolling out the public beta of our new logging add-on. This is a whole new way of capturing and collating logs, based on a syslog routing layer we’ve dubbed Logplex. Logplex routes syslog traffic the same way that our HTTP routing mesh routes HTTP traffic. Not...

Continue reading »

Release Management on Heroku

When a team of developers uses continous deployment to deploy to their Heroku staging and production apps multiple times per day, having a record of what was deployed and when can be very valuable. This is especially true when bad code gets deployed: being able to recover quickly from failure is a key part of any agile process.

Today, Heroku is announcing our release management add-on. When installed on an app, every code deploy is recorded in a ledger with information about who deployed, when, and what commit hash. And it’s not just code: anything that changes the app environment, such as adding or removing add-ons or changing config vars, creates an entry in the release ledger....

Continue reading »

NoSQL, Heroku, and You

Why NoSQL Matters

“NoSQL” is a label which encompasses a wave of innovation now happening in the database space. The NoSQL movement has sparked a whirlwind of discussion, debate, and excitement in the technical community. Why is NoSQL generating so much buzz? What does it mean for you, the application developer? And what place does NoSQL have for apps running on the Heroku platform?

SQL (the language) and SQL RDBMS implementations (MySQL, PostgreSQL, Oracle, etc) have been the one-size-fits-all solution for data persistence and retrieval for decades. The rise of the web and the LAMP stack cemented the role of the relational database. But in 2010 we see a variety of application...

Continue reading »

Background Jobs with DJ on Heroku

Our goal for the Heroku platform has been to create a totally smooth and seamless experience for getting your Ruby web application online. Web apps revolve around one or more dynamic web processes: what Rubyists often call a mongrel, and what we call a dyno. When it comes to dynos, we think we’ve really nailed it, and nothing makes that more tangible than the ease of scaling your app with the dyno slider.

But most serious web apps have a second aspect: one that gets less attention, but one that is often just as important as the web process. Like the dark side of the moon, this second half of your application is not directly visible to users, but without it the app would not be...

Continue reading »

Pimp Your Cart: Shopify Apps on Heroku

Shopify_bag

Our good friends at Shopify recently released a developer platform which makes it crazy easy to build custom functionality into an e-commerce store using a standalone Rails app. There are already some great apps available in their app store, many of which are running on Heroku. (The shopify.com homepage also now lives here.)

Check out the excellent getting started video by James MacAulay. It shows just how slick the Shopify API is – these guys are really taking e-commerce to the next level. (And bonus points for use of config
vars
to store API keys!)

Continue reading »

Config Vars for Deploy-Specific Settings

Say you’re working on a Rails app, and you want to publish your code on Github. Most apps have some deploy-specific private config values – for example, if you’re using the S3 storage back-end for Paperclip, and your S3 keys are saved in config/amazon_keys.yml. You certainly don’t want to push those up to Github – what to do?

You could maintain a separate deploy branch, and commit your deploy config only to that. You can then work on the main branch, and rebase the deploy branch whenever you go for a deploy. That’s a bit of extra work you could do without, though – and you know sooner or later, you’re going to accidentally push the wrong...

Continue reading »

Fork Our Docs

Heroku is now sporting an updated docs layout at docs.heroku.com. These new docs should be much easier to navigate and link to.

We built this as a standalone Sinatra app serving Markdown files, partially inspired by Assaf Arkin’s approach to Buildr. It uses Cache-Control with a long max-age, to take advantage of the Varnish http cache which fronts all Heroku apps. This makes it as snappy as staticly rendered pages, while retaining the flexibility of a dynamic app on the backend.

The docs app is deployed as a regular app on Heroku (just like this blog). Nothing special-case here: we deploy with git push, just like any other Heroku user. Dogfooding is good for you.

The app’s...

Continue reading »

Deploy Merb, Sinatra, or any Rack App to Heroku

The past eighteen months have seen an explosion of Rails-inspired Ruby web frameworks. Merb and Sinatra are the best known; plus many others such as Ramaze, Camping, and Waves.

That’s why we’re so pleased to announce the ability to deploy any Rack-compatible web app to Heroku.

Assuming you have a Heroku account, here’s how you can deploy a Sinatra app in about 30 seconds. Make a new directory, and inside create hello.rb:

 require 'rubygems' require 'sinatra' get '/' do "Hello from Sinatra on Heroku!" end 

Then create a config.ru file in the same directory (the location follows the Passenger convention):

 require './hello' run Sinatra::Application 

Now let’s put our...

Continue reading »

The Future of Deployment

Application deployment is changing. In relatively short order I’ve gone from buying hardware, to monthly hosting, to metered CPU time, and from building my open-source software manually, to package managers, to fancy config tools and recipes to pre-build whole machine images. What’s next?

The Old Way

I can deploy Rails apps in a traditional hosting environment pretty quickly. For a small app, I might make a new unix user and database on a personal Slicehost slice and do a quick code checkout. After setting up a few permissions and twiddling my Nginx config, in a matter of fifteen minutes or so my app is online. Not bad at all.

For a bigger app, it takes more time. In days of...

Continue reading »

How-To: Heroku + Hoptoad

Hoptoad is a great service by Thoughtbot for collecting exceptions. Like exception_notifier, but without clogging your inbox, and much prettier.

Using Hoptoad with Heroku is a cinch. First, sign up for a free Hoptoad account.

Now install their notifier plugin. If you’re working locally and deploying to Heroku with Git, install with script/plugin:

 script/plugin install git://github.com/thoughtbot/hoptoad_notifier.git 

Or if you’re using the Heroku web editor, open the vendor folder and click Gems & Plugins, then enter the plugin URL in the “Install from URL” box at the bottom.

Next, create a new file config/initializers/hoptoad.rb containing:

...

Continue reading »

Heroku API Update

The Heroku API gets a major update today; you can now view and manage all of your application’s settings straight from the command line. New in this version:

  • Manage sharing (add/remove/list collaborators)
  • Manage multiple ssh keys for your user (add/remove/list keys)
  • Update settings (public true/false, mode production/development)
  • Rename an app
  • Run rake tasks remotely

A taste of the new command-line goodness:

adam@kvasir:~$ heroku create gagetron Created http://gagetron.heroku.com/ | git@heroku.com:gagetron.git
adam@kvasir:~$ heroku info gagetron === gagetron Web URL: http://gagetron.heroku.com/ Git Repo: git@heroku.com:gagetron.git Mode: development Public: false Collaborators:...

Continue reading »

API and External Git Access

Heroku now has an API (accessible from the command line, a Ruby library, or REST calls), revision control on all apps with Git, and remote access to the Git repository.

The combination of these new features means that you can now work on your apps using the local tools you love – like TextMate, vi, or emacs – and still get the benefit of zero-configuration deployment to Heroku.

How does it work? Grab the Heroku gem with “gem install heroku”. A sample work session looks like this:

heroku clone myapp cd myapp ruby script/server …edit locally… git add . git commit -m “local changes” git push

The final step will deploy the app to Heroku,...

Continue reading »

We're Huge in Japan

Last night we noticed a flood of .jp email addresses appearing on the waiting list – several hundred over the course of just a few hours. Turns out someone posted a comprehensive and flattering review of Heroku in Japanese (translation). I just couldn’t resist using the opportunity to post this image:

Actually, it’s not just Japan: the international response to Heroku has astonished us. Denmark, New Zealand, France, Russia, Brazil – over half of our users are from outside the US. We chalk this up more to the universal appeal of Ruby and Rails than anything we’ve done, but either way it’s pretty cool.

By the way, we know news on the Heroku front...

Continue reading »

Easy Authentication

Backstory: A Fiery Debate

Writing a user model and the standard login authentication code seems like busywork to a lot of coders. In fact, many people expected a next-generation app framework such as Rails to handle this for you. After all, Django does. Initially the login engine for Rails seemed to fill this slot, but following a fair amount of controversy over best practices, the login engine was killed by its creator.

With our BDfL having forever cursed prebuilt login systems, the Rails community mostly stopped trying to make them. Yet, this puts us back at square one: developers are annoyed at the amount of boilerplate busywork that is necessary for almost every web app they write.

...

Continue reading »

Rails Hosting: Easy as Pie

Yesterday, DHH said:

“I’d love for Rails to be easy as pie to run in a shared hosting environment, though. I’d love for Rails to be easy as pie to run in any environment. In that ‘more people could have fun learning Rails and deploying their first hobby application’ kind of way.”

We humbly suggest that Heroku is one possible solution to the latter part of statement. Our vision for the long term is much grander than just a learning/hobby tool; but our beta product, as it stands today, can already fill this need quite nicely.

Continue reading »

Heroku Loves RSpec

RSpec 1.1 is now a part of the default plugin kit for Heroku apps.

We’ve been fans of RSpec for a while now, and feel that it represents the future of TDD/BDD for the Rails world. If you’re not familiar with RSpec, read up and then give it a try.

You don’t need to install anything to use RSpec in your Heroku app, but you do need to initialize the spec/ and stories/ directories by running the rspec generator. Just open the Generate dialog, type in rspec, and click Run.

Once you’ve written some specs, you can run them the usual way: open a rake console and type spec. You can still run your Test::Unit tests with the test command, or you can run tests followed by...

Continue reading »

Goodbye Rails 1.2

Rails 1.2 is now officially deprecated for Heroku apps. Starting January 3 (that’s tomorrow), new features we are developing will not be available on apps still configured to use Rails 1.2. Then, on January 21, we will automatically upgrade any remaining 1.2 apps.

We know it’s only been a month since Rails 2 came out, so we hope this doesn’t come across as overly harsh. By taking this approach we can spend less time backporting, which means more time for new features. Since Heroku is still in early beta we feel that this is reasonable. Rest assured that when the next major Rails release comes around, we’ll be committed to supporting 2.0 for a much longer time...

Continue reading »

View-Only Users

There are now two access levels for collaborators on Heroku apps:

  • Full edit access, which allows access to everything: editing code, importing or exporting the database, changing the settings, etc.
  • View-only access, which allows the user to view the app only. That is, they can visit the app url (myapp.heroku.com) but not any of the settings pages or the edit url (edit.myapp.heroku.com).

For example, a client who wants to use the app but neither needs nor wants access to the code could be set as a view-only user.

If your app sharing is set to public, the view-only access level has no use.

Do note that these settings have no effect on users changing your app’s data through the...

Continue reading »

Gems & Plugins Manager

Behold: the Heroku gems/plugins manager.

This has been one of our most requested features to date, and we’re glad to finally get this released. Although you could manually upload plugins previously, this will make the process a lot smoother. (You can still manually manipulate the files in your vendor directory if you prefer.)

To get to the manager, open your vendor directory in the lefthand filenav, and click the link that appears at the top:

You can search by name, or browse the list of 2500+ gems and 1000+ plugins. Once you find what you’re looking for, click on Install in the righthand column to install it into your app. Click Remove to remove it if it’s no longer...

Continue reading »

Rails 2

Rails 2 is now the default for all newly created Heroku apps.

Existing apps will continue to run on 1.2 unless you edit config/environment.rb and change the version number manually. Importing an app will try to guess the Rails version from your environment.rb, but you should double-check after the import to make sure the version is set to what you wanted.

We’ll leave a 1.2 gem available for a while, but we’re going to take advantage of our beta status here and keep the time window on this relatively short – perhaps a month or two. (Don’t worry, by the time the next major Rails release goes around, we’ll have a plan for longer-term support of legacy versions...

Continue reading »

It's the Little Things

Sometimes, it’s the little things. A few niceties deployed recently:

  • The code editor UI now has a liquid layout. If you’re a life hacking / GTD type like me, you’ll especially enjoy this in combination with Firefox’s fullscreen mode. (FF for OS X doesn’t have fullscreen, unfortunately; try this instead.)
  • Download files from the context menu. You can use this in conjunction with upload to edit in your local editor, load an image into your photopaint program, etc.
  • Speaking of images, if you click on an image, it will display it in the editor pane.
  • There’s a link to update your account password on the My Apps page. (Shocked this wasn’t there before?...

Continue reading »

Handling a Failed Mongrel Start

We’ve been working our tails off over the past few weeks to process all the feedback you guys have been sending (or that we’ve gleaned from the system logs). I think that this photo of the trashcan under Orion’s desk tells the story pretty well:

He bought that case of Rockstar at Costco last week, and consumed it all as part of our mad dash to squash bugs exposed by our sudden surge of users. Bad for Orion’s health, but good for Heroku’s backend stability. :)

One major area we’ve been dealing with in this past week is the issue of failed mongrel starts. That is, exceptions that occur while the Rails framework is booting, rather than on a page request....

Continue reading »

YamlDb for Database-Independent Data Dumps

One of the many benefits of Rails is database independence. Migrations are particularly nice in this regard; and the easy-to-read / Rubyified display of your schema (via rake db:schema:dump) in schema.rb is icing on the cake.

But what about data? For import and export of the actual data, we’re stuck with mysqldump (or pg_dump, if you’re so inclined). Further, these dump formats are not terribly readable, contain lots of information you may or may not want to copy (like permissions, schema settings, views, triggers…you know, database features that Rails users are supposed to avoid).

Worst of all, ddata dumps are vendor specific, so you can’t move data between...

Continue reading »

The Big Kickoff

Unless you’re a big company with lots of marketing dollars, rarely does a product launch start with a bang. It’s a gradual process – first you show a few close friends and family members, then some coworkers from your previous job, then some friends of friends. The word starts to spread as you and your partners furiously hack away, trying to make the product stable enough to stand up to a pummeling from the general public. So there’s no big kickoff; just a quiet emergence. And if your product offers something of real value, awareness in your target market will grow steadily and strongly over time.

So it is with Heroku. James, Orion, and I have spent the last...

Continue reading »


Browse the blog archives, subscribe to the full-text feed, or visit the engineering blog.