<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Rollbar]]></title><description><![CDATA[Rollbar provides real-time error alerting & debugging tools for developers.  Ruby, Python, PHP, Node.js, JavaScript, Android, iOS & more languages supported.]]></description><link>https://rollbar.com</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 May 2018 17:24:08 GMT</lastBuildDate><item><title><![CDATA[Ruby Exception Handling - Primer for Dealing with Errors in Ruby]]></title><description><![CDATA[Ruby is a popular open source programming language that is highly flexible, and used for everything from basic "hello world" apps to…]]></description><link>https://rollbar.com/blog/ruby-exception-handling-guide/</link><guid isPermaLink="false">https://rollbar.com/blog/ruby-exception-handling-guide/</guid><content:encoded>&lt;p&gt;Ruby is a popular open source programming language that is highly flexible, and used for everything from basic &quot;hello world&quot; apps to sophisticated, dynamic programs. Whether you&apos;ve been programming in Ruby for years or you&apos;re a complete beginner, tracking down errors in your Ruby app is simple and easy. Let&apos;s go through some basic &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/error-tracking/ruby/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ruby error handling&lt;/a&gt;&lt;/strong&gt;, and discover how easy it can be to integrate Rollbar into your Ruby app to automatically log and report your exceptions.&lt;/p&gt;
&lt;h2 id=&quot;raise-and-rescue-exceptions&quot;&gt;&lt;a href=&quot;#raise-and-rescue-exceptions&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Raise and Rescue Exceptions&lt;/h2&gt;
&lt;p&gt;Ruby&apos;s default exception handling is to terminate the program in the event of an exception. That&apos;s not really useful when you&apos;re trying to build a complex web application for multiple users. Luckily there&apos;s a way around this - declaring exception handlers. Exception handlers are blocks of code that are called if an exception occurs in the execution of another block of code in your program. For the most basic Ruby exception handling, you need to know how to &lt;strong&gt;Raise&lt;/strong&gt; and &lt;strong&gt;Rescue&lt;/strong&gt; an exception. &lt;/p&gt;
&lt;p&gt;When you &lt;strong&gt;Raise&lt;/strong&gt; an exception, you stop the normal flow of the program, and execute the code that deals with handling an error. This code can either deal with the error in some way, or terminate the program. If you provide a &lt;strong&gt;Rescue&lt;/strong&gt; clause in your error handler, you can choose how to deal with the exception; without it, the program will simply terminate.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;ruby-exception-hierarchy&quot;&gt;&lt;a href=&quot;#ruby-exception-hierarchy&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ruby Exception Hierarchy&lt;/h2&gt;
&lt;p&gt;Ruby has a predefined Exception class, with quite a few subclasses that can be used for basic error handling. The hierarchy of these subclasses is as follows (with commentary):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Fatal&lt;/code&gt;: used internally by Ruby when it must exit due to a fatal error. Errors of this class can&apos;t be rescued.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NoMemoryError&lt;/code&gt;: raised when memory allocation fails.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ScriptError&lt;/code&gt;: used when a script is unable to be executed. This can be due to errors in any of the subclasses of &lt;code&gt;ScriptError&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LoadError&lt;/code&gt;: raised if a required file doesn&apos;t load.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NotImplementedError&lt;/code&gt;: raised when a feature isn&apos;t implemented on the current platform (i.e., trying to call a method that isn&apos;t supported by the operating system). &lt;/li&gt;
&lt;li&gt;&lt;code&gt;SyntaxError&lt;/code&gt;: occurs when trying to execute code with invalid syntax.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SecurityError&lt;/code&gt;: raised when a potentially unsafe operation is attempted.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;SignalException&lt;/code&gt;: used when a signal is received on a process.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Interrupt&lt;/code&gt;: raised if the interrupt signal is received (i.e., a user pressed Ctrl-C).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;StandardError&lt;/code&gt;: used for the most common types of exceptions. Usually the subclasses will be raised rather than &lt;code&gt;StandardError&lt;/code&gt; itself. However, when a rescue clause without a specific &lt;code&gt;StandardError&lt;/code&gt; subclass is executed, &lt;code&gt;StandardError&lt;/code&gt; will be raised. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ArgumentError&lt;/code&gt;: occurs when arguments are incorrect (i.e., the wrong number of arguments).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FiberError&lt;/code&gt;: raised if an invalid operation is being attempted on a Fiber (i.e., trying to call a dead Fiber).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IndexError&lt;/code&gt;: used when the index is invalid.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KeyError&lt;/code&gt;: occurs if a specified key is not found.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StopIteration&lt;/code&gt;: raised to stop the iteration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IOError&lt;/code&gt;: raised during an input/output operation failure.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EOFError&lt;/code&gt;: occurs when reaching the end of the file by some IO operations.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LocalJumpError&lt;/code&gt;: raised if Ruby cannot yield as requested in the code.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NameError&lt;/code&gt;: raised if a name is undefined or invalid.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NoMethodError&lt;/code&gt;: used when a method is called on a receiver that doesn&apos;t have the method defined, and the receiver doesn&apos;t respond with &lt;code&gt;method_missing&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RangeError&lt;/code&gt;: raised if a numerical value is out of range.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FloatDomainError&lt;/code&gt;: occurs when attempting to convert certain float values to unsupported classes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RegexpError&lt;/code&gt;: raised if a given regular expression is invalid. &lt;/li&gt;
&lt;li&gt;&lt;code&gt;RuntimeError&lt;/code&gt;: used when given an invalid operation. This is a generic error class. &lt;/li&gt;
&lt;li&gt;&lt;code&gt;SystemCallError&lt;/code&gt;: raised for low-level, platform-dependent errors. These exceptions look like &lt;code&gt;Errno:xxx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ThreadError&lt;/code&gt;: occurs if an invalid operation is being attempted on a Thread.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TypeError&lt;/code&gt;: raised when an object is not of the expected type.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ZeroDivisionError&lt;/code&gt;: used if attempting to divide an integer by 0.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SystemExit&lt;/code&gt;: raised if the &lt;code&gt;exit&lt;/code&gt; method is called to terminate the script.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SystemStackError&lt;/code&gt;: occurs during a stack overflow (i.e., in the case of an accidental infinite loop). &lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;basic-ruby-error-handling&quot;&gt;&lt;a href=&quot;#basic-ruby-error-handling&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Basic Ruby Error Handling&lt;/h2&gt;
&lt;p&gt;Okay, so now we know what Ruby&apos;s exception hierarchy looks like, and why we need to &lt;strong&gt;Raise&lt;/strong&gt; and &lt;strong&gt;Rescue&lt;/strong&gt; our application&apos;s exceptions. But how do you actually do this? If you&apos;re a beginner or just new to Ruby, this might all sound fantastic in theory, but you need to see some code to actually understand what you&apos;re supposed to do. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here&apos;s an example program that handles an exception&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; handle_exception
    puts &lt;span class=&quot;token string&quot;&gt;&apos;Lalala, our app is running without errors.&apos;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Oh no, a error has occurred.&apos;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;rescue&lt;/span&gt;
    puts &lt;span class=&quot;token string&quot;&gt;&apos;Hooray the error has been rescued instead of terminating the program.&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

handle_exception
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;br&gt;
&lt;h2 id=&quot;level-up-ruby--rollbar--️&quot;&gt;&lt;a href=&quot;#level-up-ruby--rollbar--%EF%B8%8F&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Level Up: Ruby + Rollbar = ❤️&lt;/h2&gt;
&lt;p&gt;So far, so good. We&apos;ve got our Ruby error handling down, and we&apos;re feeling like old pros. :-) But let&apos;s say you want to keep track of the errors that are occurring in your application, maybe even get some alerts when a certain number of exceptions are raised. What do you do? You &lt;em&gt;could&lt;/em&gt; write some custom code and try to do this all yourself...or you could simply &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;integrate your application with Rollbar and set your error handling, logging, and alerting on auto-pilot&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Getting Started with Rollbar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To get started, you&apos;ll need to &lt;a href=&quot;https://rollbar.com/signup&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;sign up for a Rollbar account&lt;/a&gt; and name and create the new Ruby &apos;project&apos; you will be monitoring with Rollbar. You get two weeks free when you sign up, so you can see if Rollbar is right for you.&lt;/p&gt;
&lt;p&gt;Once you&apos;ve signed up for an account you&apos;ll receive a &lt;code&gt;server-side access&lt;/code&gt; token which you&apos;ll need to save for later. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Installing the Gem&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Installing the Gem is super easy! First, add this line to your application&apos;s Gemfile:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;gem &lt;span class=&quot;token string&quot;&gt;&apos;rollbar&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;And then execute:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;$ bundle install
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;If you don&apos;t use bundler, execute this instead:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;$ gem install rollbar
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Unless you are using JRuby, we suggest also installing &lt;strong&gt;&lt;a href=&quot;https://github.com/ohler55/oj&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Oj&lt;/a&gt;&lt;/strong&gt; for JSON serialization. Add this line to your Gemfile:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;gem &lt;span class=&quot;token string&quot;&gt;&apos;oj&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;~&gt; 2.12.14&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;and then run &lt;code&gt;bundle install&lt;/code&gt; again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Basic Ruby Integration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rollbar isn&apos;t dependent on Rack or Rails for most of its functionality, but if you&apos;re using Rack or Rails, there is more info on using both of these Ruby frameworks below. In a plain Ruby project, assuming you&apos;ve installed the Rollbar gem, you just need to do these three easy steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Require Rollbar&lt;/li&gt;
&lt;li&gt;Configure Rollbar&lt;/li&gt;
&lt;li&gt;Send Rollbar data&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rollbar&apos;&lt;/span&gt;

&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;configure &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;config&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;access_token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;POST_SERVER_ITEM_ACCESS_TOKEN&quot;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# Any other configuration settings you might wish to have&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Running Script&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;begin&lt;/span&gt;
  run_script &lt;span class=&quot;token constant&quot;&gt;ARGV&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; e &lt;span class=&quot;token comment&quot;&gt;# Never rescue Exception *unless* you reraise in rescue body&lt;/span&gt;
  &lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt; e
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Script ran successfully&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;See the &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar-gem/blob/master/docs/configuration.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;configuration reference guide&lt;/a&gt;&lt;/strong&gt; on GitHub for further information on more advanced settings and granular configuration settings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Using Rails&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Run the following command from your Rails root:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;$ rails generate rollbar &lt;span class=&quot;token constant&quot;&gt;POST_SERVER_ITEM_ACCESS_TOKEN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Be sure to replace &lt;code&gt;POST_SERVER_ITEM_ACCESS_TOKEN&lt;/code&gt; with your project&apos;s &lt;code&gt;post_server_item&lt;/code&gt; access token, which you can find in the Rollbar.com interface.&lt;/p&gt;
&lt;p&gt;That will create the file &lt;code&gt;config/initializers/rollbar.rb&lt;/code&gt;, which initializes Rollbar and holds your access token and other configuration values.&lt;/p&gt;
&lt;p&gt;If you want to store your access token outside of your repo, run the same command without arguments and create an environment variable &lt;code&gt;ROLLBAR_ACCESS_TOKEN&lt;/code&gt; that holds your server-side access token:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;$ rails generate rollbar
$ export &lt;span class=&quot;token constant&quot;&gt;ROLLBAR_ACCESS_TOKEN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;POST_SERVER_ITEM_ACCESS_TOKEN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;For Heroku users&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;If you&apos;re on Heroku, you can store the access token in your Heroku config:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;$ heroku config:add ROLLBAR_ACCESS_TOKEN&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;POST_SERVER_ITEM_ACCESS_TOKEN
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Using Sinatra&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Initialize Rollbar with your access token somewhere during startup:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;configure &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;config&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;access_token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;POST_SERVER_ITEM_ACCESS_TOKEN&apos;&lt;/span&gt;
  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;disable_rack_monkey_patch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# other configuration settings&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Then mount the middleware in your app, like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rollbar/middleware/sinatra&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyApp&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;Sinatra&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:Base&lt;/span&gt;
  use &lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:Middleware&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:Sinatra&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# other middleware/etc&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Using Other Rack Frameworks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Initialize Rollbar with your access token somewhere during startup:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;configure &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;config&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;access_token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;POST_SERVER_ITEM_ACCESS_TOKEN&apos;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# other configuration settings&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Be sure to replace &lt;code&gt;POST_SERVER_ITEM_ACCESS_TOKEN&lt;/code&gt; with your project&apos;s &lt;code&gt;post_server_item&lt;/code&gt; access token, which you can find in the Rollbar.com interface.&lt;/p&gt;
&lt;p&gt;The gem monkey patches &lt;code&gt;Rack::Builder&lt;/code&gt; so Rollbar reports will be sent automatically without any other action. If you prefer to disable the monkey patch, apply this change to your config::&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;configure &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;config&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;disable_rack_monkey_patch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# other configuration settings&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;If you disabled the &lt;code&gt;Rack::Builder&lt;/code&gt; monkey patch or it doesn&apos;t work for the Rack framework you are using, then add our Rack middleware to your app:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rollbar/middleware/rack&apos;&lt;/span&gt;

use &lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:Middleware&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:Rack&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Test Your Installation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you&apos;re not using Rails, you may first need to add the following to your Rakefile:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rollbar/rake_tasks&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You may also need to add an :environment task to your Rakefile if you haven&apos;t already defined one. At minimum, this task should call Rollbar.configure() and set your access token.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;task &lt;span class=&quot;token symbol&quot;&gt;:environment&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;configure &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;config &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
    config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;access_token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;...&apos;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;To confirm that it worked, run:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;$ rake rollbar&lt;span class=&quot;token symbol&quot;&gt;:test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;This will raise an exception within a test request; if it works, you&apos;ll see a stacktrace in the console, and the exception will appear in the Rollbar dashboard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integration with Rollbar.js&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The gem has a cool feature - you can configure the gem to enable &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar.js&lt;/a&gt;&lt;/strong&gt; on your site to report your JavaScript errors using &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar.js&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;configure &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;config&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# common gem configuration&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;
  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;js_enabled &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;true&lt;/span&gt;
  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;js_options &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    accessToken&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;POST_CLIENT_ITEM_ACCESS_TOKEN&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    captureUncaught&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    payload&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      environment&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;production&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The &lt;code&gt;Hash&lt;/code&gt; passed to &lt;code&gt;#js_options=&lt;/code&gt; should have the same available options that &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.js/configuration/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;you can find in Rollbar.js&lt;/a&gt;&lt;/strong&gt;, using symbols or strings for the keys.&lt;/p&gt;
&lt;p&gt;For further information, you&apos;ll want to check out &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar-gem/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;the gem docs&lt;/a&gt;&lt;/strong&gt; for advanced ways to use the gem. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagnosing and debugging Ruby errors with Rollbar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now that you have Rollbar integrated into your Ruby application, any errors that occur will be automatically captured and viewable from your dashboard and errors page within Rollbar (screenshot below). You&apos;ll be able to easily see what errors are occurring, how often they occur and the full context and analytics into your Ruby applications errors. Rollbar provides a detailed stack trace of every ruby exception allowing you to see exactly what&apos;s happening in your application when an error occurs. You can also view the user&apos;s browser and OS where the error occurred.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 35.91836734693877%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAABPUlEQVQoz4VRy07DMBDM//8E/AVFggM9cOETiiqgDyd1Xn7bm6bD2mkRByQOo43t7OzMbPX2MdD96yfdMdablkKa6DzPBICctTSOI8mTLHUYBur7nlJK5X06z2R9KlDaknOOquA9+AM+EiJNcFxDCJjn+V/wABhjEGMsPZfLBZWUEtvtFl+rB5xTgnYJoWuway32nYUYPA6dQ6sDtCeYQDx0QqhrNE0Na20h69t2IWQrqIXA/vkJViloG+HbhfDYOyazOHAVg4PiYT5NRV2QJ9T1QpgVtnzO99U08TS2rd43y4/ckIzCyM0Z2qdCdEM+G0YqdjViij8RFIWeybqug1i/lEuVFXanYjcryyqz3XBVdoOvxd8KeWNQbHX3uMLManOGrm9w5NwEk0kVijJzzS/naHlxw68MLS/mluE3qGcYKaAwDIUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;ruby exception handling with rollbar&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-ruby-exception-handling-c775f8f96f6d9efb49b882deeeeb04c6-e9535.png&quot;
        srcset=&quot;/static/rollbar-ruby-exception-handling-c775f8f96f6d9efb49b882deeeeb04c6-d32c5.png 216w,
/static/rollbar-ruby-exception-handling-c775f8f96f6d9efb49b882deeeeb04c6-06f31.png 432w,
/static/rollbar-ruby-exception-handling-c775f8f96f6d9efb49b882deeeeb04c6-e9535.png 864w,
/static/rollbar-ruby-exception-handling-c775f8f96f6d9efb49b882deeeeb04c6-8b3e2.png 1225w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Errors are grouped by cause and frequency so that you can prioritize which ones to work on first. You&apos;ll be able to view trends over time. If a certain error spikes in frequency, you&apos;ll know about it right away. Below are more features worth noting: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Errors automatically get grouped by root cause.&lt;/li&gt;
&lt;li&gt;Tons of context data like stack traces, request params, URL and environment.&lt;/li&gt;
&lt;li&gt;Integrate your favorite tools like Slack, GitHub, JIRA, Pivotal Tracker, Trello, PagerDuty.&lt;/li&gt;
&lt;li&gt;Tons of context data like stack traces, request params, URL and environment.&lt;/li&gt;
&lt;li&gt;View trends by type of error, browser, code deployment, OS, location, users, host.&lt;/li&gt;
&lt;li&gt;Mark an item as Resolved, Mute or Assign errors to others on your team to fix. &lt;/li&gt;
&lt;li&gt;Keep track of code deployments and correlate them them to new error occurrences. &lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;With Rollbar, you can rest assured that you&apos;ll know about any bugs that might make their way into your Ruby projects. If you run into any issues, we&apos;re always available to help at &lt;strong&gt;&lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt;&lt;/strong&gt;. Happy hacking!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Better workflows for managing errors]]></title><description><![CDATA[Happy Holidays Rollbar users! 🎁 We're gifting you a handful of updates to a key feature in Rollbar, the Live Error Feed. We recently rolled…]]></description><link>https://rollbar.com/blog/improvements-to-managing-errors-in-rollbar/</link><guid isPermaLink="false">https://rollbar.com/blog/improvements-to-managing-errors-in-rollbar/</guid><content:encoded>&lt;p&gt;Happy Holidays Rollbar users! 🎁 We&apos;re gifting you a handful of updates to a key feature in Rollbar, the Live Error Feed. We recently rolled out some improved fucntionality to the Live Error Feed, most notably the ability to quickly view and assign ownership of errors with your team. Instantly know who&apos;s working on what and ensure that urgent production issues don&apos;t get overlooked.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/assignments-78da8425f50420f2b536a85ee096915a.gif&quot; alt=&quot;rollbar error live feed gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here&apos;s an overview of how these updates will help you and your team members better manage errors in Rollbar:&lt;/p&gt;
&lt;!--more--&gt;
&lt;h3 id=&quot;assign-individual-errors-directly-within-the-feed&quot;&gt;&lt;a href=&quot;#assign-individual-errors-directly-within-the-feed&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Assign individual errors directly within the feed&lt;/h3&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50.814332247557005%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABsElEQVQoz5VSyW4bMQyd//+FnAv01uViIECBuqcUtYt0MdDAcTr1ktFMZl+0jvxCauICRptDBDyIIsXHJ5FRmte426XYJQ/YbAWyosafQ4aYkGQl9iLHNsnR9z2GYQj7OI54bkXGGNR1DSkl4jzG29s3WNwv0LYt8jxHVVWB4Hg8/gPnHLIsQ9d14S7fi6y1MMbBjR7Btg7WPdlUjMG21hpKqTNCJmAyJj4VjaTSqJoOvTwlOyKdCGvyN+2UwIQMTrJ0HqTGPm1w8WqOi/ffQm4gZEVKG2hjz/6Cg1xMUoyX956dfwkVkRujEW/WQSUTcjxiqY4gKgltR+StQjMYeAryE2dfYxg34uOPHZErbEQzvUS18KbG6/kKl8tbzL7c4FB0iLhyLEpc32VYrAU+3yRYrhNSdETTK7y72mAVZ5gtf+Pq14FiAp4EDH0LZyU+fN9j/nOHT6sDyk5PTWElgx5JoQ8qB/Vkm3Hym8nHfyvprOjMO/tGf955aopFWUtUhIae25GqUwNeCm5exAbP2r14wHaf0l5A0EAnaUF2jjTNUJZluFOUTeg8D/j/wH/7CE1S/s0FFhRdAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar error live feed&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-assignment-815d5a7701ddd93f09632296503c2d4b-e9535.png&quot;
        srcset=&quot;/static/rollbar-assignment-815d5a7701ddd93f09632296503c2d4b-d32c5.png 216w,
/static/rollbar-assignment-815d5a7701ddd93f09632296503c2d4b-06f31.png 432w,
/static/rollbar-assignment-815d5a7701ddd93f09632296503c2d4b-e9535.png 864w,
/static/rollbar-assignment-815d5a7701ddd93f09632296503c2d4b-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;multi-select-and-assign-errors&quot;&gt;&lt;a href=&quot;#multi-select-and-assign-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Multi-select and assign errors&lt;/h3&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50.814332247557005%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABhElEQVQoz62Su0/kMBDG9+9GQlcCzTVXUyMq4K7g2a+Qlg0IIR7LHhFZkmzesWPnne/GA5ygQVtg6cvMZOyfxx6PQGMYBta73/f9J/89t8oYmU9RFLBtG2EYIU0TTKcWHu4fEEUR5vM558qyWh3YNA2UUiwpJUFT5HnOG5lYCEHAcjWgOU5VVUjiGFmWQVMlvuchCAJ0Xceq6xqqUDzPXMFXGvUEzKRiiOu6KLWG9+xAa8UwM4mBIkEuNaqGNvigpiXbvtq2I2DTDbD9DJZlsW6efKz93MbGn0tsncywefqIPWuBXthIZIUwL7HMNfxUs/+SKAQUm1yQaYzqdsDcl9SIKet6tsDO72P8OrvFj4MrrO9fYvf8LzrnjhcawCIuGOZEBV7Id+nfcygRifIN6AmMx2NMJhPkjzM4R4fQScyNiUQFWTboFwb4WhGDyJqcEyt4VK1LWuZvQF/0aNuWld7fIZxe8N2Zzi7pGELXVOEtLVQcm4qMjG+O7pH/vykfH/B36B/es/uTZWnlmwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar error live feed&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-multi-select-assign-owner-b582199a8426d822428c142b6eb1af9a-e9535.png&quot;
        srcset=&quot;/static/rollbar-multi-select-assign-owner-b582199a8426d822428c142b6eb1af9a-d32c5.png 216w,
/static/rollbar-multi-select-assign-owner-b582199a8426d822428c142b6eb1af9a-06f31.png 432w,
/static/rollbar-multi-select-assign-owner-b582199a8426d822428c142b6eb1af9a-e9535.png 864w,
/static/rollbar-multi-select-assign-owner-b582199a8426d822428c142b6eb1af9a-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;filter-to-view-all-assigned-or-unassigned-errors&quot;&gt;&lt;a href=&quot;#filter-to-view-all-assigned-or-unassigned-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Filter to view all assigned &lt;em&gt;or&lt;/em&gt; unassigned errors&lt;/h3&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 45.60260586319218%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAABaklEQVQoz62SXW7CMBCEc91eoufhAD1F3wpFghYogQAxSfBPYpz/6e7S8lDxWEujTVb2aPazIzxYfd9Da42maWCtFfF/nucoSwfnHLquu+8fhhG6qlGUAdEjw2EYcCkudLiEMUYMiyJHkiTIskzkvb/vH8dRzrCinFybtheD3+YjnfZ7xJuNpG7bVsT9uq6hUiXp8yxHZK8NfN3BqwRnG6DMFYbic81doDFqqe/LD8zmMxmdE4th36FM9pS+EGNGEZmqQU0J7W6Fk/ZixDXVV/m+/BiutmtM528ytrCtghja9RpKKYQQBE+UUaoqtNDxCnFWYpM6HC8eG+XE2PhGTGOlMf864mgCDoYxUUK6GL1cYLuNJTmzjRyNHJoO1WlHBrdUGSU6W6o2CIYz9SavOzy/LPA0mYoORYmqusKuPinhmTA4QRFZfxu5VAfhVZAZPwEek9nyDbKYT5qmMhqLn40w3P9hON4W/kvfnTOyDz0LuYgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar error live feed&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-assign-to-nobody-a0c650990a256362143a8792efe19bb0-e9535.png&quot;
        srcset=&quot;/static/rollbar-assign-to-nobody-a0c650990a256362143a8792efe19bb0-d32c5.png 216w,
/static/rollbar-assign-to-nobody-a0c650990a256362143a8792efe19bb0-06f31.png 432w,
/static/rollbar-assign-to-nobody-a0c650990a256362143a8792efe19bb0-e9535.png 864w,
/static/rollbar-assign-to-nobody-a0c650990a256362143a8792efe19bb0-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;filter-by-owner&quot;&gt;&lt;a href=&quot;#filter-by-owner&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Filter by owner&lt;/h3&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 33.387622149837135%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAABRklEQVQoz21R2UrEMBSd/38XfFDwWxTUt/qiYGUYx+m+pdmTLnPMTRkRtHC4SducLbubxyOuHz5xdX+An1doN+PytG0LwTmapkGVn+Lsug7TNMXvfl4gjAfXDqNQkFJixxiDchPstMRpjMH5fP6D59c97p6OuA0GaD/PM+gskXjvYa2N73dJkqB6ScCqCg03sGONrFfIA06dQsU0ikHj/Vjio+iRM4N1XaGKAlU4I4SAFBzZId0I0zRFHyBDFLI/yRGjciGGBwuT1iOtuYDWGta5GNW0DXiog5w5YzHU2UZI1lWdxl46YWHLoDwaSDttAqFX+pFcXUB7nX+hLDeHKiDbv22EyxK6Y3XshJx4zdByi14GVel+3P4GCbm+wTAM0TVFrvOt211UtQOI2IWLWSYD4+cIivbfBREWa2JcSuasg1U8uv8GYLMYXDsU8NAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar error live feed&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-assign-by-owner-69c978f61ac0d028d23a425a9be1d791-e9535.png&quot;
        srcset=&quot;/static/rollbar-assign-by-owner-69c978f61ac0d028d23a425a9be1d791-d32c5.png 216w,
/static/rollbar-assign-by-owner-69c978f61ac0d028d23a425a9be1d791-06f31.png 432w,
/static/rollbar-assign-by-owner-69c978f61ac0d028d23a425a9be1d791-e9535.png 864w,
/static/rollbar-assign-by-owner-69c978f61ac0d028d23a425a9be1d791-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;quickly-resolve-and-mute-errors&quot;&gt;&lt;a href=&quot;#quickly-resolve-and-mute-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Quickly Resolve and Mute errors&lt;/h3&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 47.63843648208469%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABbklEQVQoz3VSi3LiMAzM///i9Si9AiHEdhw/EicEtlpBgGunmdlZTWyttLIqvHzWGKSUYIR952GtRYxROQlfr1e9d14u8Kk8ETKi5PGreGlFKQXjOP7Kl8tF75FfMU2TnqugNRY2FvR5gpNqXbrFZH/nMMwKiqW2xWaz0a6JU71H7/2jWBXEigmjwhLxJmrucduPIjZhuSeEjy2cc9pV13Wwu3d0toUX0TIXEQwRp36Q5PGBToQonsb5h71U1yrIMQzDAH86oHNWYxapTGvwaRL2NmMnoPhqnYjjjNc558931CLKmTVNgxCCPuRaUAQdDi6j8YMyBVfLhItPcVr3b3/QHBsVpFjz8RfH+oBlWVDOYrkzXhOZoJbDzXKU5O92iWKOjxn2fY/ddqvz4xlFK2ecdkewOz4CC5yEGbNQLueH5XTc6Z5yhrS6//csMJ1lhjkNuiZ8AFpiHGVFcpl1bdZ1WMFuaJX/c87/nTP+ApagBFf5PmAXAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar error live feed&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-mute-resolve-ef73b3c64a4664d985ba9aa03f4c69ed-e9535.png&quot;
        srcset=&quot;/static/rollbar-mute-resolve-ef73b3c64a4664d985ba9aa03f4c69ed-d32c5.png 216w,
/static/rollbar-mute-resolve-ef73b3c64a4664d985ba9aa03f4c69ed-06f31.png 432w,
/static/rollbar-mute-resolve-ef73b3c64a4664d985ba9aa03f4c69ed-e9535.png 864w,
/static/rollbar-mute-resolve-ef73b3c64a4664d985ba9aa03f4c69ed-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;easily-change-severity-of-errors&quot;&gt;&lt;a href=&quot;#easily-change-severity-of-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Easily change severity of errors&lt;/h3&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 49.267100977198695%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABlklEQVQoz11S7XKbMBDkxfsGfZH+zFN0pn/TzMR1YhOME/EhEEIgCYS3p8OmrjWzc6ev1d2uEtyNZVlQFAWstRBCwBjDMc7LsoRzbjs7ugnd4KCMQxvRKkzThORyueCGSBgvPcLfovf/nb1H3J/nGcmgBCo1oOkdo9aWXvb8quzdFv0cmGhSCjVVm6YpV621xmH3gnEceT9ZdL0RxcsxxrkeParOYiKi+0psITCQFJEokoQQINId51OglidVQeqRq5QdxW5Yc1qrKY9oOB9hRoexLNATWdM0cKRtbFNkb+j7Hn7ySFy+x/tni/25YbxRnleaSA1qQtkaIrKsX0T/8Y5SfOHX7z/4/uMnvj0945RlZEoL6y213NXcZtRJXnW811PqdV2Rrsp4dHnOLUty9fWwRyYkPo+7fxqGqrpetPwVHt17xKwkEyoy5yTWr7R/WU1hl0N+RFr2Gw6FRi4NPqoep9rgLAc2aw4LV6C/csi6YoelJPJhQHY8o+s6Nii5EGuglzeEtZKYR5JwJboh6vhY9f3f/Aup6ADpl3BT7gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar error live feed&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-change-severity-c70a9b17fb198a5c2c7cc515a44ee704-e9535.png&quot;
        srcset=&quot;/static/rollbar-change-severity-c70a9b17fb198a5c2c7cc515a44ee704-d32c5.png 216w,
/static/rollbar-change-severity-c70a9b17fb198a5c2c7cc515a44ee704-06f31.png 432w,
/static/rollbar-change-severity-c70a9b17fb198a5c2c7cc515a44ee704-e9535.png 864w,
/static/rollbar-change-severity-c70a9b17fb198a5c2c7cc515a44ee704-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;improved-look-and-feel&quot;&gt;&lt;a href=&quot;#improved-look-and-feel&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Improved look and feel&lt;/h3&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50.732899022801305%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABjUlEQVQoz4WS3WrcMBCF9/0fJw/QQG4KpbQ0ZEsKvdtk12vZlmzZ+rHlPZkzGycsFGqYC4/lT98ZaffnGHH33eLbXw83LRhC0eKTUkLbtmiaBl3Xoa5rWGsxDIN+X9cLQipavQ/S99jxp3EcEaaEeVkRc0EMAZfL5b9FcJC1OSfEGLW3Y/NwOOB4/wVJmn6aMdVnnLsE48Swz2hcxhQXrSQbruuK0+mkxpRZlkV7CiSZcc77J5ScMYYFoa4U0ghMgVLWzxpxs3P2CGMInMQwo66MgnfzPKtut9/rLlHmkV2HYZzViMbcROvdkuus7eC91zmXUj4N+cId3POzNgcBxNaoYW2vkbfiN91E4K/H6sPwJjKH2vc9+seHd+A1MmGM2ospzbbTnKT4/vLyGZkpjcyTthqZ6u3jLwUyWmwb2OEKczI7hUo/z0VsVl3H68QrRKGbyGxUlRzCzx+qricp87FDUChjOgESthV/5t28AuMtkPMzxsD//qqz/IjcTRp5K0KXsv7zlCni5KYw7RurBwPTB3dXPAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar error live feed&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-itemsfeed-9d2ef84b136d4d79ae97e6e9c6abe74e-e9535.png&quot;
        srcset=&quot;/static/rollbar-itemsfeed-9d2ef84b136d4d79ae97e6e9c6abe74e-d32c5.png 216w,
/static/rollbar-itemsfeed-9d2ef84b136d4d79ae97e6e9c6abe74e-06f31.png 432w,
/static/rollbar-itemsfeed-9d2ef84b136d4d79ae97e6e9c6abe74e-e9535.png 864w,
/static/rollbar-itemsfeed-9d2ef84b136d4d79ae97e6e9c6abe74e-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;By streamlining the live error feed, we hope that you and your team will save more time in your day-to-day debugging efforts. We appreciate your feedback. Email &lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt; and let us know if there&apos;s anything you think we could do better. &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, signup for a 14-day free trial of Rollbar and let us help you defeat annoying errors in your applications. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introducing Error Merging ⎌]]></title><description><![CDATA[We're excited to introduce merging (and un-merging) of errors! Merging errors lets you combine multiple errors into one 'group' for easier…]]></description><link>https://rollbar.com/blog/introducing-error-merging-and-unmerging/</link><guid isPermaLink="false">https://rollbar.com/blog/introducing-error-merging-and-unmerging/</guid><content:encoded>&lt;p&gt;We&apos;re excited to introduce merging (and un-merging) of errors! Merging errors lets you combine multiple errors into one &apos;group&apos; for easier management and more accurate metrics. All past and future occurrences of any merged errors will automatically be combined and grouped. Today&apos;s merged errors are tomorrow&apos;s error groupings. :-)&lt;/p&gt;
&lt;h3 id=&quot;merge-errors&quot;&gt;&lt;a href=&quot;#merge-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Merge errors&lt;/h3&gt;
&lt;p&gt;When you encounter a duplicated error, you&apos;ll want to create a new &apos;group&apos;. Select one or more errors from the same environment in the error Items feed. Slide the toggle in the box above to &apos;Merge&apos;, set appropriate Level, Status, Owner, and Source values, enter a name for the new item, and click &apos;Merge&apos;. Done, error merge success! &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/emails/merge-errors-rollbar.png&quot; alt=&quot;rollbar merge errors&quot;&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;h3 id=&quot;un-merge-errors&quot;&gt;&lt;a href=&quot;#un-merge-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Un-merge errors&lt;/h3&gt;
&lt;p&gt;Merged the wrong error by mistake? No problem! You can easily un-merge errors in Rollbar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/emails/merged-errors-rollbar.png&quot; alt=&quot;rollbar merge errors&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;search-for-merged-errors&quot;&gt;&lt;a href=&quot;#search-for-merged-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Search for merged errors&lt;/h3&gt;
&lt;p&gt;By default, errors which have been merged into a group will no longer appear. To view these errors, you can search for &lt;code&gt;is:member&lt;/code&gt;. To only show grouped errors, you can search for &lt;code&gt;is:group&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We hope that you and your team will save more time in your day-to-day debugging efforts with Error Merging. Check out the error merging &lt;strong&gt;&lt;a href=&quot;/docs/merge-items/&quot;&gt;documentation&lt;/a&gt;&lt;/strong&gt; for more details. We appreciate your feedback. Email &lt;strong&gt;&lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt;&lt;/strong&gt; and let us know your thoughts.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, signup for a 14-day free trial of Rollbar and let us help you defeat annoying errors in your applications. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Monitoring Errors in Android Apps]]></title><description><![CDATA[When developing mobile apps it’s important to monitor errors so that you can understand your user’s experience. You need deeper insight than…]]></description><link>https://rollbar.com/blog/android-error-monitoring/</link><guid isPermaLink="false">https://rollbar.com/blog/android-error-monitoring/</guid><pubDate>Wed, 09 May 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When developing mobile apps it’s important to monitor errors so that you can understand your user’s experience. You need deeper insight than just a crash report because errors could cause a degraded user experience or a drop in key behavioral metrics. Your team needs to know quickly when there are production problems either with the app itself or with your backend services so you can fix the issue before more customers are impacted.&lt;/p&gt;
&lt;p&gt;Rollbar’s &lt;a href=&quot;https://docs.rollbar.com/docs/java&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Android SDK&lt;/a&gt; lets you track and analyze errors that happen in your Android native applications, and even trace problems to backend services and third party APIs. It provides you with a live error feed from your application, including complete stack traces and contextual data to debug errors quickly. We also track the environment the error is coming from (prod or staging), the server that generated the error, and even the user’s session data. You can then quickly assign ownership of errors to your team and track when they are fixed. Learn more about Rollbar’s &lt;a href=&quot;https://rollbar.com/error-tracking/android/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;product features for Android&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below, you can see that we&apos;ve created an example app that triggers an exception when the user clicks on a button. The error message is tracked in Rollbar, including a stack trace where you can see the line of code that caused the error. Rollbar captures errors that occur anywhere in the app. You can follow along with our example using the source code on &lt;a href=&quot;https://github.com/RollbarExample/RollbarAndroidExample&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/rollbar-android-example-ebd6351e56d6cb8facc164ad9e3b5c29.gif&quot; alt=&quot;Gif of Rollbar android example&quot;&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;adding-rollbar-in-your-code&quot;&gt;&lt;a href=&quot;#adding-rollbar-in-your-code&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Adding Rollbar in your code&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Visit &lt;a href=&quot;https://rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://rollbar.com&lt;/a&gt; and sign up for an account if you haven’t done so yet. Next, create your project and select Other from the list of notifiers. Select the client side access token that is generated for you. You’ll need this to configure Rollbar in the steps below.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the &lt;code&gt;app.gradle&lt;/code&gt; of your project, and add the following dependencies.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-java&quot;&gt;&lt;code&gt;&lt;span class=&quot;token function&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;com.rollbar:rollbar-java:1.1.0&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;com.rollbar:rollbar-android:1.1.0@aar&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Add the project access token from step 1 in your app manifest file under the application section. You can find the manifest file in your project directory.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta-data&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;com.rollbar.android.ACCESS_TOKEN&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ACCESS_TOKEN&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The app does not provide you the meta-data section by default, so you need explicitly to add the Rollbar access token. The manifest file looks like this after adding the meta-data section.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;manifest&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;android&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://schemas.android.com/apk/res/android&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;token attr-name&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;rollbar.com.rollbarexample&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

   &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;application&lt;/span&gt;
       &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;allowBackup&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
       &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;icon&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;@mipmap/ic_launcher&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
       &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;@string/app_name&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
       &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;roundIcon&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;@mipmap/ic_launcher_round&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
       &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;supportsRtl&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
       &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;theme&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;@style/AppTheme&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
       &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;activity&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;.MainActivity&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
           &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;intent-filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
               &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;action&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;android.intent.action.MAIN&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
               &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;category&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;android.intent.category.LAUNCHER&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
           &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;intent-filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
       &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;activity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

       &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta-data&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;com.rollbar.android.ACCESS_TOKEN&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;YOUR_ACCESS TOKEN&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;application&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;manifest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Open the code for your launcher activity, and then initialize Rollbar  in the &lt;code&gt;onCreate&lt;/code&gt; method.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-java&quot;&gt;&lt;code&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onCreate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Bundle savedInstanceState&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;onCreate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;savedInstanceState&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setContentView&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;R&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;layout&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;activity_main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    Rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;   
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;test-rollbar-with-an-example-android-app&quot;&gt;&lt;a href=&quot;#test-rollbar-with-an-example-android-app&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Test Rollbar with an example Android app&lt;/h2&gt;
&lt;p&gt;To test that it’s working, let’s create an activity that will generate an error message. In the example below, you’ll be able to generate an error by clicking the &quot;Generate an error&quot; button.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;RelativeLayout&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;android&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://schemas.android.com/apk/res/android&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;app&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://schemas.android.com/apk/res-auto&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;tools&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://schemas.android.com/tools&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;layout_width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;match_parent&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;layout_height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;match_parent&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;tools:&lt;/span&gt;context&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;rollbar.com.rollbarexample.MainActivity&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;Button&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;layout_margin&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;30dp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;layout_centerInParent&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;text&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Generate an error&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;@+id/clickMe&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;layout_width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;match_parent&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;layout_height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;50dp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;RelativeLayout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-java&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MainActivity&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AppCompatActivity&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; Button button&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; Rollbar rollbar&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onCreate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Bundle savedInstanceState&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;onCreate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;savedInstanceState&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;setContentView&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;R&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;layout&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;activity_main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

       button&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Button&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findViewById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;R&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;clickMe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       Rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setOnClickListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;View&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;OnClickListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
           &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
           &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;View view&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
             &lt;span class=&quot;token function&quot;&gt;throwError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
           &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

   &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;generateError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       String test&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       test&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// This will throw null pointer exception&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;When you click the &quot;Generate an error&quot; button, it will trigger the &lt;code&gt;GenerateError&lt;/code&gt; method. In this method, we have added a bug which is throwing a null pointer exception.&lt;/p&gt;
&lt;h2 id=&quot;viewing-errors-in-rollbar&quot;&gt;&lt;a href=&quot;#viewing-errors-in-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Viewing errors in Rollbar&lt;/h2&gt;
&lt;p&gt;Open Rollbar to see what these errors look like in your account’s item page. The error we just generated should be called &lt;code&gt;java.lang.NullPointerException: Attempt to invoke virtual method &apos;java.lang.String java.lang.String.toString()&apos;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 36.65644171779142%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAABA0lEQVQoz62QPU4DMRCFfSIkBCFATUeF+EmAS1Ag2IRcIbTQcwUqaBCXgIoupGHXP1mvvbu2Hx5HrBANTUb69MZPHut52NHFFP3hGLvnE2wcXyfdGo7QG4zQPx1j++wGmydZ6tcPr7B2cNnRG2TY38vSzE6EPPb+McMqYXVdQwgBziWEKpHnObjSMMb8S1ku7xMPL5/w3oOFELBK2OubxP3zHNPHWVLi7mmO23gWusXvoiRFUUT96pJxzpOnlFom1FrHL0s0zsP5EM2QlPy/RQloqKqq9F0T1VoLtVgkPyV0zoH2aJuoTQtTE7GXAqVpO7RtUVnqJbQRaYc052IQeuznwW+5/vJIufbLGQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Rollbar android error item&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-error-item-fbeb27b3567c1baf6ba53f96ee9631e0-e9535.png&quot;
        srcset=&quot;/static/rollbar-error-item-fbeb27b3567c1baf6ba53f96ee9631e0-d32c5.png 216w,
/static/rollbar-error-item-fbeb27b3567c1baf6ba53f96ee9631e0-06f31.png 432w,
/static/rollbar-error-item-fbeb27b3567c1baf6ba53f96ee9631e0-e9535.png 864w,
/static/rollbar-error-item-fbeb27b3567c1baf6ba53f96ee9631e0-ab1f5.png 1296w,
/static/rollbar-error-item-fbeb27b3567c1baf6ba53f96ee9631e0-3e0da.png 1304w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Get more details by clicking on the item. You can now see a traceback showing you the exact source code file, method, and line number that generated the error.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 42.979719188767554%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAABDklEQVQoz4VRi26DMBDL/38kouVR3oy8CEmKdwlNtY52QzL22ZfTKWH9+IWWsFmHfd+fmBeJYeKYFvHip6yfFnChThkLv0/ff9n9Tc64MpCrfTFT7b0/HUiZc+5txrjeIH4NFH8M7Bb9MQvnmF4NuFSQSkEQr1Sb7RgopSRPRp8LYoKxx2aWNnQ0VOmVtI/a+TuYtTaKBO93bO5gG/j+4Eed+oIOOD2KMcdGq7GRt4cOr64Dbwf/7Ek6INxlQrgGxpsGY3XBWBfo6ivyKkfZlhFFU6BqKhS3IuqyKTGOY8QwDJjnGdM0PT0hBFgwy56ahwp5lyNrM+Rtjmt/jchuVHcXFNRTDzUU3fUnaK3xDeB7vQ7njPDCAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Rollbar android error detail&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-error-detail-eab69ddf07e16159242d08127950b76d-e9535.png&quot;
        srcset=&quot;/static/rollbar-error-detail-eab69ddf07e16159242d08127950b76d-d32c5.png 216w,
/static/rollbar-error-detail-eab69ddf07e16159242d08127950b76d-06f31.png 432w,
/static/rollbar-error-detail-eab69ddf07e16159242d08127950b76d-e9535.png 864w,
/static/rollbar-error-detail-eab69ddf07e16159242d08127950b76d-776be.png 1282w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Rollbar also provides a lot of other contextual information that will help you troubleshoot and debug problems faster. Along the row of sub-tabs above you can get extra drill-down information on each individual occurrence and how many times it occurred, the people affected in client-side apps and how many people were impacted, and much more. You can use this to keep an eye on the error rate and drill down to troubleshoot high-impact errors.&lt;/p&gt;
&lt;p&gt;It’s pretty easy to get error tracking across your entire app thanks to &lt;a href=&quot;https://docs.rollbar.com/docs/java/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar’s Android SDK&lt;/a&gt;. It only takes a few minutes to set up, and you will have way more context to track and debug problems faster in the future. You’ll know about errors right away so your users can experience your app the way it was meant to be.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the Rollbar Team - Jesse Gibbs (Head of Product)]]></title><description><![CDATA[We're happy to introduce Jesse Gibbs, our Head of Product, who has been with Rollbar two years this May .  In addition to leading the…]]></description><link>https://rollbar.com/blog/meet-the-team-jesse/</link><guid isPermaLink="false">https://rollbar.com/blog/meet-the-team-jesse/</guid><pubDate>Thu, 26 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;re happy to introduce Jesse Gibbs, our Head of Product, who has been with Rollbar two years this May .  In addition to leading the product team, Jesse is the day-to-day product owner for new feature development in the Rollbar web app.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 256px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAECBAP/xAAVAQEBAAAAAAAAAAAAAAAAAAACAP/aAAwDAQACEAMQAAABw9KyVC6ssDAFf//EABoQAAMBAQEBAAAAAAAAAAAAAAECEgAxERP/2gAIAQEAAQUCCt7DUVODTvqLrNjxef/EABURAQEAAAAAAAAAAAAAAAAAABAB/9oACAEDAQE/ASn/xAAXEQADAQAAAAAAAAAAAAAAAAAAARAx/9oACAECAQE/AYsGf//EABgQAAMBAQAAAAAAAAAAAAAAAAEQMQAR/9oACAEBAAY/Atw1xkr/xAAZEAEAAwEBAAAAAAAAAAAAAAABABEhUWH/2gAIAQEAAT8hVgZQixuMG6MwPIsm1dm9sZlA5B7Ljn//2gAMAwEAAgADAAAAEKgHgP/EABkRAAIDAQAAAAAAAAAAAAAAAAABESExQf/aAAgBAwEBPxCUulmhYf/EABcRAQADAAAAAAAAAAAAAAAAAAEAEDH/2gAIAQIBAT8QBbtT/8QAGxABAAMBAQEBAAAAAAAAAAAAAQARITFBUWH/2gAIAQEAAT8QECRqv1i8tGAclIEzqRdA7crwUrBj8zyPEB4whShgdroV5G9PZ//Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;jesse&quot;
        title=&quot;&quot;
        src=&quot;/static/jesse-e93eafbee7b806acd2a8059c609cfa14-983fe.jpg&quot;
        srcset=&quot;/static/jesse-e93eafbee7b806acd2a8059c609cfa14-17276.jpg 216w,
/static/jesse-e93eafbee7b806acd2a8059c609cfa14-983fe.jpg 256w&quot;
        sizes=&quot;(max-width: 256px) 100vw, 256px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;After growing up in Tahoe, Jesse studied Computer Science at UC Davis. Originally majoring in Physics, he took an Intro to CS course because it was a requirement and soon realized he preferred programming to physics. In addition to his BS, Jesse has an MBA from UC Berkeley, which makes him a great fit to lead Rollbar&apos;s product development. &lt;/p&gt;
&lt;p&gt;After graduation, Jesse worked as a developer on issue-tracking and test automation software and ended up as the Product Manager because no one else was doing it. At first, he was informally making decisions about what to make and how to do it. As the team grew and roles were formalized, he was asked to be the PM. He found he really enjoyed doing product management; he Likes the fact that you get a full sense of what it takes to build a product and sell it. As he said, &quot;You’re talking to customers, engineers, sales people, marketers, and customer support. I like getting the big picture. It uses a lot of different parts of your brain, and scratches the problem solving itch. If you enjoy talking with people then you get a lot of that too. It brings a lot of new challenges.&quot;&lt;/p&gt;
&lt;p&gt;Jesse enjoys working in companies where developers are the end users, because he can relate to them and likes solving their problems. He also loves that developers will take pieces of a product and build off of it. After a few years of working on products that weren&apos;t developer-focused, Jesse was excited to come to Rollbar since he would get to move back into working on products for developers. In addition to being a developer-focused company, Jesse liked the company culture, which he describes as pragmatic, laid back, and friendly. For the future, Jesse is really excited to both improve the product for our core use cases and to expand it to help both our current as well as new types of users to use Rollbar for critical day-to-day work.&lt;/p&gt;
&lt;p&gt;Outside of work, Jesse enjoys cycling and spending time with his wife and their dog Charlie(&lt;a href=&quot;https://www.instagram.com/charlie_the_chiyorkiepom/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;@charlie&lt;em&gt;the&lt;/em&gt;chiyorkiepm on Instagram&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;We are excited that Jesse decided to join us in our mission of making software development easy!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Top 10 errors from 1000+ Ruby on Rails projects (and how to avoid them)]]></title><description><![CDATA[To give back to our community of developers, we looked at our database of thousands of projects and found the top 10 errors in Ruby on Rails…]]></description><link>https://rollbar.com/blog/top-10-ruby-on-rails-errors/</link><guid isPermaLink="false">https://rollbar.com/blog/top-10-ruby-on-rails-errors/</guid><pubDate>Wed, 18 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;To give back to our community of developers, we looked at our database of thousands of projects and found the top 10 errors in Ruby on Rails projects. We’re going to show you what causes them and how to prevent them from happening. If you avoid these &quot;gotchas,&quot; it&apos;ll make you a better developer.&lt;/p&gt;
&lt;p&gt;Because data is king, we collected, analyzed, and ranked the top 10 &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/error-tracking/ruby/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ruby errors&lt;/a&gt;&lt;/strong&gt; from Ruby on Rails applications. &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt; collects all the errors for each project and summarizes how many times each one occurred. We do this by grouping errors according to &lt;strong&gt;&lt;a href=&quot;https://docs.rollbar.com/docs/grouping-algorithm/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;fingerprinting&lt;/a&gt;&lt;/strong&gt;. Basically, we group two errors if the second one is just a repeat of the first. This gives users a nice overview instead of an overwhelmingly big dump like you’d see in a log file.&lt;/p&gt;
&lt;p&gt;We focused on the errors most likely to affect you and your users. To do this, we ranked errors by the number of projects experiencing them across different companies. We intentionally looked at the number of projects so that high-volume customers wouldn&apos;t overwhelm the data set with errors that are not relevant to most readers.&lt;/p&gt;
&lt;h2 id=&quot;here-are-the-top-10-rails-errors&quot;&gt;&lt;a href=&quot;#here-are-the-top-10-rails-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Here are the top 10 Rails errors:&lt;/h2&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 53.37837837837838%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsSAAALEgHS3X78AAABMUlEQVQoz3WSS0vEMBSF5y+LDIJL97MQFF8rt6IbN7pxoRtRcCEoKPNQLLW1zaPJ9N3aesjtRJmph0t6m94vuT3JoGma74Vs3hgVZf30Fq/G1E3xtW3bQRzHQRAwxqIoQiKE4JxLKTG6HhvuTyk2DmcH5+7lPb+4Y7fPqoOzLJNGSilhhBwLaa39QK7tjCmGe5OrBwGAsA5ujeq61kZoZL5QKPTm0Yxi6/jdF/kyjCIwNFqYZpjQoxMHsX3mfLLiL9bBeZ5Tk2maonOCkyRBEnJlYTmvemCUWsBuTmuFXJNbp9fBEvbrtnWLWiDPMOOHkmCY3A9jT1TjqCwPkf/el4DP67vjm0fZD+NRG9mrYl+zvHh10pePxGMJSnGoGOERkLIsq6rqjmpVXBX4IyzR/q8fyQpiIh1hQiQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Rails Error Statistics&quot;
        title=&quot;&quot;
        src=&quot;/static/rails-error-stat-1-d10fce70047361819ed77b431df956d2-e9535.png&quot;
        srcset=&quot;/static/rails-error-stat-1-d10fce70047361819ed77b431df956d2-d32c5.png 216w,
/static/rails-error-stat-1-d10fce70047361819ed77b431df956d2-06f31.png 432w,
/static/rails-error-stat-1-d10fce70047361819ed77b431df956d2-e9535.png 864w,
/static/rails-error-stat-1-d10fce70047361819ed77b431df956d2-ab1f5.png 1296w,
/static/rails-error-stat-1-d10fce70047361819ed77b431df956d2-7539a.png 1728w,
/static/rails-error-stat-1-d10fce70047361819ed77b431df956d2-32430.png 1776w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;You’ve probably noticed some familiar faces in there already. Let’s dig in and take a look at the errors in a bit more detail to see what might cause them in your production application.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;We&apos;ll provide example solutions based on Rails 5, but if you’re still using Rails 4 they should point you in the right direction.&lt;/p&gt;
&lt;h2 id=&quot;1-actioncontrollerroutingerror&quot;&gt;&lt;a href=&quot;#1-actioncontrollerroutingerror&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. ActionController::RoutingError&lt;/h2&gt;
&lt;p&gt;We start with a classic of any web application, the Rails version of the 404 error. An &lt;code&gt;ActionController::RoutingError&lt;/code&gt; means that a user has requested a URL that doesn’t exist within your application. Rails will log this and it will look like an error, but for the most part it is not the fault of your application.&lt;/p&gt;
&lt;p&gt;It may be caused by incorrect links pointing at or from within your application. It may also be a malicious user or bot testing your application for common weaknesses. If that’s the case, you might find something like this in your logs:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;ActionController&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:RoutingError&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;No&lt;/span&gt; route matches &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/wp-admin&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;There is one common reason you might get an &lt;code&gt;ActionController::RoutingError&lt;/code&gt; that is caused by your application and not by errant users: if you deploy your application to Heroku, or any platform that doesn’t allow you to serve static files, then you might find that your CSS and JavaScript doesn’t load. If this is the case, the errors will look like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;ActionController&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:RoutingError&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;No&lt;/span&gt; route matches &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/assets/application-eff78fd93759795a7be3aa21209b0bd2.css&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;To fix this and allow Rails to serve static assets you need to add a line to your application’s &lt;code&gt;config/environments/production.rb&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;Rails&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;application&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;configure &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# other config&lt;/span&gt;
  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;public_file_server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enabled &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;If you aren’t interested in logging 404 errors caused by &lt;code&gt;ActionController::RoutingError&lt;/code&gt; then you can avoid them by setting a catch all route and serving the 404 yourself. &lt;strong&gt;&lt;a href=&quot;https://github.com/roidrage/lograge#handle-actioncontrollerroutingerror&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;This method is suggested by the lograge project&lt;/a&gt;&lt;/strong&gt;. To do so, add the following at the bottom of your &lt;code&gt;config/routes.rb&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;Rails&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;application&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;routes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;draw &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# all your other routes&lt;/span&gt;
  match &lt;span class=&quot;token string&quot;&gt;&apos;*unmatched&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; to&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;application#route_not_found&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; via&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:all&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Then add the &lt;code&gt;route_not_found&lt;/code&gt; method to your &lt;code&gt;ApplicationController&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ApplicationController&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ActionController&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:Base&lt;/span&gt;
  protect_from_forgery with&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:exception&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; route_not_found
    render file&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;Rails&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;public_path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;404.html&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; status&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:not_found&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; layout&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Before implementing this, you should consider whether knowing about 404 errors is important to you. You should also keep in mind that any &lt;strong&gt;&lt;a href=&quot;https://github.com/ankane/ahoy/issues/29&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;route or engine that is mounted after the application loads won’t be reachable&lt;/a&gt;&lt;/strong&gt; as they will be caught by the catch all route.&lt;/p&gt;
&lt;h2 id=&quot;2-nomethoderror-undefined-method--for-nilnilclass&quot;&gt;&lt;a href=&quot;#2-nomethoderror-undefined-method--for-nilnilclass&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. NoMethodError: undefined method &apos;[]&apos; for nil:NilClass&lt;/h2&gt;
&lt;p&gt;This means that you are using square bracket notation to read a property from an object, but the object is missing, or &lt;code&gt;nil&lt;/code&gt;, and thus it does not support this method. Since we are working with square brackets, it’s likely that we’re digging through hashes or arrays to access properties and something along the way was missing. This could happen when you’re parsing and extracting data from a JSON API or a CSV file, or just getting data from nested parameters in a controller action.&lt;/p&gt;
&lt;p&gt;Consider a user submitting address details through a form. You might expect your parameters to look like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; street&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;123 Fake Street&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; town&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Faketon&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; postcode&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;12345&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You might then access the street by calling &lt;code&gt;params[:user][:address][:street]&lt;/code&gt;. If no address was passed then &lt;code&gt;params[:user][:address]&lt;/code&gt; would be &lt;code&gt;nil&lt;/code&gt; and calling for &lt;code&gt;[:street]&lt;/code&gt; would raise a &lt;code&gt;NoMethodError&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You could perform a nil check on each parameter and return early using the &lt;code&gt;&amp;#x26;&amp;#x26;&lt;/code&gt; operator, like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;street &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:address&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:address&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:street&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;While that will do the job, thankfully there is now a better way to access nested elements in hashes, arrays and event objects like &lt;code&gt;ActionController::Parameters&lt;/code&gt;. Since Ruby 2.3, hashes, arrays and &lt;code&gt;ActionController::Parameters&lt;/code&gt; have the &lt;strong&gt;&lt;a href=&quot;http://ruby-doc.org/core-2.3.0_preview1/Hash.html#method-i-dig&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;code&gt;dig&lt;/code&gt; method&lt;/a&gt;&lt;/strong&gt;. &lt;code&gt;dig&lt;/code&gt; allows you to provide a path to the object you want to retrieve. If at any stage &lt;code&gt;nil&lt;/code&gt; is returned, then &lt;code&gt;dig&lt;/code&gt; returns &lt;code&gt;nil&lt;/code&gt; without throwing a &lt;code&gt;NoMethodError&lt;/code&gt;. To get the street from the parameters above you can call:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;street &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;dig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:address&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:street&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You won&apos;t get any errors from this, though you do need to be aware that &lt;code&gt;street&lt;/code&gt; may still be &lt;code&gt;nil&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;As an aside, if you are also digging through nested objects using dot notation, you can do this safely in Ruby 2.3 too, using the safe navigation operator. So, rather than calling&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;street &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;street
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;and getting a &lt;code&gt;NoMethodError: undefined method street&lt;/code&gt; for &lt;code&gt;nil:NilClass&lt;/code&gt;, you can now call.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;street &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; user&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;street
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The above will now act the same as using &lt;code&gt;dig&lt;/code&gt;. If the address is &lt;code&gt;nil&lt;/code&gt; then &lt;code&gt;street&lt;/code&gt; will be &lt;code&gt;nil&lt;/code&gt; and you will need to handle the &lt;code&gt;nil&lt;/code&gt; when you later refer to the &lt;code&gt;street&lt;/code&gt;. If all the objects are present, &lt;code&gt;street&lt;/code&gt; will be assigned correctly.&lt;/p&gt;
&lt;p&gt;While this suppresses errors from being shown to the user, if it still impacts user experience, you might want to create an internal error to track either in your logs or in an error tracking system like Rollbar so you have visibility to fix the problem.&lt;/p&gt;
&lt;p&gt;If you are not using Ruby 2.3 or above you can achieve the same as above using the &lt;strong&gt;&lt;a href=&quot;https://github.com/Invoca/ruby_dig&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;ruby_dig gem&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;http://api.rubyonrails.org/classes/Object.html#method-i-try&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;ActiveSupport&apos;s &lt;code&gt;try&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; to achieve similar results.&lt;/p&gt;
&lt;h2 id=&quot;3-actioncontrollerinvalidauthenticitytoken&quot;&gt;&lt;a href=&quot;#3-actioncontrollerinvalidauthenticitytoken&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. ActionController::InvalidAuthenticityToken&lt;/h2&gt;
&lt;p&gt;Number 3 on our list requires careful consideration as it is related to our application&apos;s security. &lt;code&gt;ActionController::InvalidAuthenticityToken&lt;/code&gt; will be raised when a POST, PUT, PATCH, or DELETE request is missing or has an incorrect CSRF (Cross Site Request Forgery) token.&lt;/p&gt;
&lt;p&gt;CSRF is a potential vulnerability in web applications in which a malicious site makes a request to your application on behalf of an unaware user. If the user is logged in their session cookies will be sent along with the request and the attacker can execute commands as the user.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rails mitigates CSRF attacks&lt;/a&gt;&lt;/strong&gt; by including a secure token in all forms that is known and verified by the site, but can&apos;t be known by a third party. This is performed by the familiar &lt;code&gt;ApplicationController&lt;/code&gt; line&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ApplicationController&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ActionController&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:Base&lt;/span&gt;
  protect_from_forgery with&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:exception&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;So, if your production application is raising &lt;code&gt;ActionController::InvalidAuthenticityToken&lt;/code&gt; errors it could mean that an attacker is targeting the users of your site, but the Rails security measures are keeping you safe.&lt;/p&gt;
&lt;p&gt;There are other reasons you may be unintentionally receiving this error though.&lt;/p&gt;
&lt;h3 id=&quot;ajax&quot;&gt;&lt;a href=&quot;#ajax&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ajax&lt;/h3&gt;
&lt;p&gt;For example, if you are making Ajax requests from your front end, you need to ensure you are including the CSRF token within the request. If you are using jQuery and the built in &lt;strong&gt;&lt;a href=&quot;https://github.com/rails/rails/tree/master/actionview/app/assets/javascripts&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rails unobtrusive scripting adapter&lt;/a&gt;&lt;/strong&gt; then this is already handled for you. If you want to handle Ajax another way, say using the &lt;strong&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Fetch API&lt;/a&gt;&lt;/strong&gt;, you&apos;ll need to ensure you include the CSRF token. For either approach, you need to make sure your application layout includes the CSRF meta tag in the &lt;code&gt;&amp;#x3C;head&gt;&lt;/code&gt; of the document:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; csrf_meta_tags &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;This prints out a meta tag that looks like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;meta name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;csrf-token&apos;&lt;/span&gt; content&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;THE-TOKEN&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;When making an Ajax request, read the meta tag content and add it to the headers as the &lt;code&gt;X-CSRF-Token&lt;/code&gt; header.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;const csrfToken &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;[name=&quot;csrf-token&quot;]&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/posts&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  method&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;POST&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  body&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  headers&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Content-Type&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;application/json&apos;&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;X-CSRF-Token&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; csrfToken
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; handle response
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h3 id=&quot;webhooksapis&quot;&gt;&lt;a href=&quot;#webhooksapis&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Webhooks/APIs&lt;/h3&gt;
&lt;p&gt;Sometimes there are valid reasons to turn off the CSRF protection. If you expect to receive incoming POST requests to certain URLs in your application from third parties, you won’t want to block them on the basis of CSRF. You might be in this position if you are building an API for third party developers or if you expect to receive incoming webhooks from a service.&lt;/p&gt;
&lt;p&gt;You can turn off CSRF protection, but make sure you are whitelisting the endpoints you know don&apos;t need this kind of protection. You can do so in a controller by skipping the authentication:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ApiController&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ApplicationController&lt;/span&gt;
  skip_before_action &lt;span class=&quot;token symbol&quot;&gt;:verify_authenticity_token&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;If you are accepting incoming webhooks, you should be able to verify that the request came from a trusted source in place of verifying the CSRF token.&lt;/p&gt;
&lt;h2 id=&quot;4-netreadtimeout&quot;&gt;&lt;a href=&quot;#4-netreadtimeout&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Net::ReadTimeout&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;Net::ReadTimeout&lt;/code&gt; is raised when it takes Ruby longer to read data from a socket than the &lt;code&gt;read_timeout&lt;/code&gt; value, which is 60 seconds by default. This error can be raised if you are using &lt;code&gt;Net::HTTP&lt;/code&gt;, &lt;code&gt;open-uri&lt;/code&gt; or &lt;strong&gt;&lt;a href=&quot;https://github.com/jnunemaker/httparty&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;code&gt;HTTParty&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; to make HTTP requests.&lt;/p&gt;
&lt;p&gt;Notably, this doesn&apos;t mean that an error will be thrown if the request itself takes longer than the &lt;code&gt;read_timeout&lt;/code&gt; value, just that if a particular read takes longer than the &lt;code&gt;read_timeout&lt;/code&gt;. You can read more about &lt;strong&gt;&lt;a href=&quot;https://felipeelias.github.io/ruby/2017/08/20/net-http-timeouts.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;code&gt;Net::HTTP&lt;/code&gt; and timeouts from Felipe Philipp&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;There are a couple of things we can do to stop getting &lt;code&gt;Net::ReadTimeout&lt;/code&gt; errors. Once you understand the HTTP requests that are throwing the error you can try to adjust the &lt;code&gt;read_timeout&lt;/code&gt; value to something more sensible. As in the article above, if the server you are making the request to takes a long time to put together a response before sending it all at once, you will want a longer &lt;code&gt;read_timeout&lt;/code&gt; value. If the server returns the response in chunks then you will want a shorter &lt;code&gt;read_timeout&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can set &lt;code&gt;read_timeout&lt;/code&gt; by setting a value in seconds on the respective HTTP client you are using:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;with Net::HTTP&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;http &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;Net&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:HTTP&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;host&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; port&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; read_timout&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;with open-uri&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; read_timeout&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;with HTTParty&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;HTTParty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; read_timeout&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You can&apos;t always trust another server to respond within your expected timeouts. If you can run the HTTP request in a background job with retries, like &lt;strong&gt;&lt;a href=&quot;https://github.com/mperham/sidekiq&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Sidekiq&lt;/a&gt;&lt;/strong&gt;, that can mitigate the errors from the other server. You will need to handle the case where the server never responds in time though.&lt;/p&gt;
&lt;p&gt;If you need to run the HTTP request within a controller action, then you should be rescuing the &lt;code&gt;Net::ReadTimeout&lt;/code&gt; error and providing your user with an alternative experience and tracking it in your error monitoring solution. For example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; show
  &lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;begin&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;@comments&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;HTTParty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;COMMENTS_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; read_timeout&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;Net&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:ReadTimeout&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; e
    &lt;span class=&quot;token variable&quot;&gt;@comments&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;@error_message&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Comments couldn&apos;t be retrieved, please try again later.&quot;&lt;/span&gt;
    &lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;5-activerecordrecordnotunique-pguniqueviolation&quot;&gt;&lt;a href=&quot;#5-activerecordrecordnotunique-pguniqueviolation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. ActiveRecord::RecordNotUnique: PG::UniqueViolation&lt;/h2&gt;
&lt;p&gt;This error message is specifically for PostgreSQL databases, but the ActiveRecord adapters for MySQL and SQLite will throw similar errors. The issue here is that a database table in your application has a unique index on one or more fields and a transaction has been sent to the database that violates that index. This is a hard problem to solve completely, but let&apos;s look at the low hanging fruit first.&lt;/p&gt;
&lt;p&gt;Imagine you&apos;ve created a &lt;code&gt;User&lt;/code&gt; model and, in the migration, ensured that the user&apos;s email address is unique. The migration might look like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CreateUsers&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:Migration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; change
    create_table &lt;span class=&quot;token symbol&quot;&gt;:users&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;t&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
      t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;string &lt;span class=&quot;token symbol&quot;&gt;:email&lt;/span&gt;
      t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timestamps
    &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
    add_index &lt;span class=&quot;token symbol&quot;&gt;:users&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:email&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; unique&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;To avoid most instances of &lt;code&gt;ActiveRecord::RecordNotUnique&lt;/code&gt; you should add a uniqueness validation to your &lt;code&gt;User&lt;/code&gt; model too.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ApplicationRecord&lt;/span&gt;
  validates_uniqueness_of &lt;span class=&quot;token symbol&quot;&gt;:email&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Without this validation, all email addresses will be sent to the database when calling &lt;code&gt;User#save&lt;/code&gt; and will raise an error if they aren&apos;t unique. However, the validation can&apos;t guarantee that this won&apos;t happen. For a full explanation you should read the &lt;strong&gt;&lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#method-i-validates_uniqueness_of&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;concurrency and integrity section of the &lt;code&gt;validates_uniqueness_of&lt;/code&gt; documentation&lt;/a&gt;&lt;/strong&gt;. The quick description is that the Rails uniqueness check is prone to race conditions based on the order of operation for multiple requests. Being a race condition, this also makes this error hard to reproduce locally.&lt;/p&gt;
&lt;p&gt;To deal with this error requires some context. If the errors are caused by a race condition, that may be because a user has submitted a form twice by mistake. We can try to mitigate that issue with a bit of JavaScript to disable the submit button after the first click. Something a bit like this is a start:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;const forms &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;form&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;forms&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;form&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;submit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    const buttons &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;button, input[type=submit]&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;buttons&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;disabled&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;disabled&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://coderwall.com/p/e8zu7q/using-retry-to-rescue-activerecord-recordnotunique&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;This tip on Coderwall to use ActiveRecord&apos;s &lt;code&gt;first_or_create!&lt;/code&gt; along with a rescue and retry&lt;/a&gt;&lt;/strong&gt; when the error is raised is a neat workaround. You should continue to log the error with your error monitoring solution so that you maintain visibility on it.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;set_flag&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; flag &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# Making sure we only retry 2 times&lt;/span&gt;
  tries &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
  flag &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;UserResourceFlag&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:user_id&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; user_id &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:flag&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; flag&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;first_or_create&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:RecordNotUnique&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; e
  &lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;retry&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;unless&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tries &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;zero&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;code&gt;ActiveRecord::RecordNotUnique&lt;/code&gt; might seem like an edge case, but it&apos;s here at number 5 in this top 10, so it is definitely worth considering with regard to your user experience.&lt;/p&gt;
&lt;h2 id=&quot;6-nomethoderror-undefined-method-id-for-nilnilclass&quot;&gt;&lt;a href=&quot;#6-nomethoderror-undefined-method-id-for-nilnilclass&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;6. NoMethodError: undefined method &apos;id&apos; for nil:NilClass&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;NoMethodError&lt;/code&gt; appears again, though this time with a different explanatory message. This error usually sneaks up around the create action for an object with a relation. The happy path—creating the object successfully—usually works, but this error pops up when validations fail. Let&apos;s take a look at an example.&lt;/p&gt;
&lt;p&gt;Here&apos;s a controller with actions to create an application for a course.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CourseApplicationsController&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ApplicationController&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;@course_application&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CourseApplication&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;@course&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;Course&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:course_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; create
    &lt;span class=&quot;token variable&quot;&gt;@course_application&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CourseApplication&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;course_application_params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@course_application&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;save
      redirect_to &lt;span class=&quot;token variable&quot;&gt;@course_application&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; notice&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Application submitted&apos;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
      render &lt;span class=&quot;token symbol&quot;&gt;:new&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
  private
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; course_application_params
    params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:course_application&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;permit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:email&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:course_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The form in the new template looks a bit like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; form_for &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@course&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@course_application&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;ca&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;%&gt;
  &amp;lt;%# rest of the form %&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The problem here is when you call &lt;code&gt;render :new&lt;/code&gt; from the &lt;code&gt;create&lt;/code&gt; action, the &lt;code&gt;@course&lt;/code&gt; instance variable wasn&apos;t set. You need to ensure that all the objects the &lt;code&gt;new&lt;/code&gt; template needs are initialised in the &lt;code&gt;create&lt;/code&gt; action as well. To fix this error, we&apos;d update the &lt;code&gt;create&lt;/code&gt; action to look like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; create
    &lt;span class=&quot;token variable&quot;&gt;@course_application&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CourseApplication&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;course_application_params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@course_application&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;save
      redirect_to &lt;span class=&quot;token variable&quot;&gt;@course_application&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; notice&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Application submitted&apos;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
      &lt;span class=&quot;token variable&quot;&gt;@course&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;Course&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:course_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      render &lt;span class=&quot;token symbol&quot;&gt;:new&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Check out this article if you are interested in learning more about &lt;strong&gt;&lt;a href=&quot;https://blog.ragnarson.com/2015/05/06/problems-with-nil.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;the problems with &lt;code&gt;nil&lt;/code&gt; in Rails and how to avoid them&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&quot;7-actioncontrollerparametermissing&quot;&gt;&lt;a href=&quot;#7-actioncontrollerparametermissing&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;7. ActionController::ParameterMissing&lt;/h1&gt;
&lt;p&gt;This error is part of the Rails &lt;strong&gt;&lt;a href=&quot;http://edgeguides.rubyonrails.org/action_controller_overview.html#strong-parameters&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;strong parameters&lt;/a&gt;&lt;/strong&gt; implementation. It does not manifest as a 500 error though—it is rescued by &lt;code&gt;ActionController::Base&lt;/code&gt; and returned as a 400 Bad Request.&lt;/p&gt;
&lt;p&gt;The full error might look like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;ActionController::ParameterMissing: param is missing or the value is empty: user&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;This will be accompanied by a controller that might look a bit like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UsersController&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ApplicationController&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; create
    &lt;span class=&quot;token variable&quot;&gt;@user&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user_params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;save
      redirect_to &lt;span class=&quot;token variable&quot;&gt;@user&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
      render &lt;span class=&quot;token symbol&quot;&gt;:new&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
  private
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; user_params
    params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;permit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:email&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The &lt;code&gt;params.require(:user)&lt;/code&gt; means that if &lt;code&gt;user_params&lt;/code&gt; is called and &lt;code&gt;params&lt;/code&gt; does not have a &lt;code&gt;:user&lt;/code&gt; key or &lt;code&gt;params[:user]&lt;/code&gt; is empty, &lt;code&gt;ActionController::ParameterMissing&lt;/code&gt; will be raised.&lt;/p&gt;
&lt;p&gt;If you are building an application to be used via a web front end and you have built a form to correctly post the &lt;code&gt;user&lt;/code&gt; parameters to this action, then a missing &lt;code&gt;user&lt;/code&gt; parameter probably means someone is messing with your application. If that is the case, a 400 Bad Request response is likely the best response as you don&apos;t need to cater to potentially malicious users.&lt;/p&gt;
&lt;p&gt;If your application is providing an API, then 400 Bad Request is also an appropriate response to a missing parameter.&lt;/p&gt;
&lt;h1 id=&quot;8-actionviewtemplateerror-undefined-local-variable-or-method&quot;&gt;&lt;a href=&quot;#8-actionviewtemplateerror-undefined-local-variable-or-method&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;8. ActionView::Template::Error: undefined local variable or method&lt;/h1&gt;
&lt;p&gt;This is our only &lt;code&gt;ActionView&lt;/code&gt; error in the top 10 and that&apos;s a good sign. The less work the views have to do to render templates the better. Less work leads to fewer errors. We’re still left with this error though, in which a variable or method you expect to exist simply doesn&apos;t.&lt;/p&gt;
&lt;p&gt;This crops up most commonly in partials, probably due to the many different ways you can include a partial with local variables on a page. If you have a partial called &lt;code&gt;_post.html.erb&lt;/code&gt; that contains a blog post template and an instance variable &lt;code&gt;@post&lt;/code&gt; set in your controller, then you can render the partial like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; render &lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; render &lt;span class=&quot;token string&quot;&gt;&apos;post&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; post&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; render partial&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;post&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; locals&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; post&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Rails likes to give us plenty of options to work with, but the second and third options here are where confusion can creep in. Trying to render a partial like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; render &lt;span class=&quot;token string&quot;&gt;&apos;post&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; locals&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; post&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; render partial&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;post&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; post&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;will leave you with an undefined local variable or method. To avoid this, stay consistent and always render partials with the explicit partial syntax, expressing the local variables in a locals hash:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; render partial&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;post&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; locals&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; post&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;There is one other place you can slip up with local variables in partials. If you only sometimes pass a variable to a partial, testing for that variable is different within a partial to regular Ruby code. If, for example, you update the post partial above to take a local variable that tells you whether to show a header image in the partial, you would render the partial like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; render partial&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;post&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; locals&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; post&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; show_header_image&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Then the partial itself might look like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;%= @post.title %&gt;&amp;lt;/h1&gt;
&amp;lt;%=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;image_tag&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;header_image&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; show_header_image &lt;span class=&quot;token string&quot;&gt;%&gt;
&amp;lt;!-- and so on --&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;This will work fine when you pass the &lt;code&gt;show_header_image&lt;/code&gt; local variable, but when you call&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; render partial&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;post&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; locals&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; post&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;it will fail with an undefined local variable. To test for the existence of a local variable inside a partial, you should check whether it is defined before you use it.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;image_tag&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;header_image&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;defined&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;show_header_image&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; show_header_image &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Even better though, there is a hash called &lt;code&gt;local_assigns&lt;/code&gt; within a partial that we can use instead.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;image_tag&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;header_image&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; local_assigns&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:show_header_image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;For variables that aren&apos;t booleans, we can use other hash methods like &lt;code&gt;fetch&lt;/code&gt; to handle this gracefully. Using &lt;code&gt;show_header_image&lt;/code&gt; as an example, this scenario would also work:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;image_tag&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;header_image&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; local_assigns&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:show_header_image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Overall, watch out when you are passing variables to partials!&lt;/p&gt;
&lt;h2 id=&quot;9-actioncontrollerunknownformat&quot;&gt;&lt;a href=&quot;#9-actioncontrollerunknownformat&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;9. ActionController::UnknownFormat&lt;/h2&gt;
&lt;p&gt;This error, like the &lt;code&gt;ActionController::InvalidAuthenticityToken&lt;/code&gt;, is one that could be caused by careless or malicious users rather than your application. If you&apos;ve built an application in which the actions respond with HTML templates and someone requests the JSON version of the page, you will find this error in your logs, looking a bit like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;ActionController&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:UnknownFormat&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;BlogPostsController&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;#index is missing a template for this request format and variant.&lt;/span&gt;
request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;formats&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;variant&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The user will receive a 406 Not Acceptable response. In this case they’ll see this error because you haven&apos;t defined a template for this response. This is a reasonable response, since if you don&apos;t want to return JSON, their request was not acceptable.&lt;/p&gt;
&lt;p&gt;You may, however, have built your Rails application to respond to regular HTML requests and more API-like JSON requests in the same controller. Once you start doing this, you define the formats you &lt;em&gt;do&lt;/em&gt; want to respond to and any formats that fall outside of that will also cause an &lt;code&gt;ActionController::UnknownFormat&lt;/code&gt;, returning a 406 status. Let’s say you have a blog posts index that looks like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;BlogPostsController&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ApplicationController&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; index
    respond_to &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;format&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
      format&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;html &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; render &lt;span class=&quot;token symbol&quot;&gt;:index&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Making a request for the JSON would result in the 406 response and your logs would show this less expressive error:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;ActionController&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:UnknownFormat&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ActionController&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:UnknownFormat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The error this time doesn&apos;t complain about a lack of a template—it’s an intentional error because you have defined the only format to respond to is HTML. What if this is unintentional though?&lt;/p&gt;
&lt;p&gt;It’s common to miss a format in a response that you intend to support. Consider an action in which you want to respond to HTML and JSON requests when creating a blog post, so that your page can support an Ajax request. It might look like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;BlogPostsController&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ApplicationController&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; create
    &lt;span class=&quot;token variable&quot;&gt;@blog_post&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;BlogPost&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;blog_post_params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    respond_to &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;format&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@blog_post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;save
        format&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;html &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; redirect &lt;span class=&quot;token function&quot;&gt;blog_post_path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@blog_post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        format&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; render json&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@blog_post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_json &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
        render &lt;span class=&quot;token symbol&quot;&gt;:new&lt;/span&gt;
      &lt;span class=&quot;token class-name&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The error here is raised in the case of the blog post failing validations and not saving. Within the &lt;code&gt;respond_to&lt;/code&gt; block, you need to call &lt;code&gt;render&lt;/code&gt; within the scope of the format blocks. Rewriting this to accommodate for failure would look like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;BlogPostsController&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ApplicationController&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; create
    &lt;span class=&quot;token variable&quot;&gt;@blog_post&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;BlogPost&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;blog_post_params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    respond_to &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;format&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@blog_post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;save
        format&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;html &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; redirect &lt;span class=&quot;token function&quot;&gt;blog_post_path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@blog_post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        format&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; render json&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@blog_post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_json &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
        format&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;html &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; render &lt;span class=&quot;token symbol&quot;&gt;:new&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        format&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; render json&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@blog_post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errors&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_json &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Now all of the formats are covered and there won&apos;t be any more unintentional &lt;code&gt;ActionController::UnknownFormat&lt;/code&gt; exceptions.&lt;/p&gt;
&lt;h2 id=&quot;10-standarderror-an-error-has-occurred-this-and-all-later-migrations-canceled&quot;&gt;&lt;a href=&quot;#10-standarderror-an-error-has-occurred-this-and-all-later-migrations-canceled&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;10. StandardError: An error has occurred, this and all later migrations canceled&lt;/h2&gt;
&lt;p&gt;This last item on our top 10 disappoints me slightly. &lt;strong&gt;&lt;a href=&quot;https://ruby-doc.org/core-2.5.0/StandardError.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;code&gt;StandardError&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; is the base error class that all other errors should inherit from, so using it here makes the error feel very generic, when in reality it is an error that has happened during a database migration. I would prefer to see this error as a descendent of the &lt;code&gt;ActiveRecord::MigrationError&lt;/code&gt;. But I digress…&lt;/p&gt;
&lt;p&gt;There are a number of things that can cause a migration to fail. Your migrations may have gotten out of sync with your actual production database, for example. In that case, you&apos;re going to have to go digging around to find out what has happened and fix it.&lt;/p&gt;
&lt;p&gt;There is one thing that should be covered here though: data migrations.&lt;/p&gt;
&lt;p&gt;If you need to add or calculate some data for all the objects in a table you might think that a data migration is a good idea. As an example, if you wanted to add a full name field to a user model that included their first and last name (not a likely change, but good enough for a simple example), you might write a migration like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AddFullNameToUser&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:Migration&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; up
    add_column &lt;span class=&quot;token symbol&quot;&gt;:users&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:full_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:string&lt;/span&gt;
    &lt;span class=&quot;token constant&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;find_each &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;user&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
      user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;full_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token delimiter tag&quot;&gt;#{&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;first_name&lt;span class=&quot;token delimiter tag&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token delimiter tag&quot;&gt;#{&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_name&lt;span class=&quot;token delimiter tag&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
      user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;save&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; down
    remove_column &lt;span class=&quot;token symbol&quot;&gt;:users&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:full_name&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;There are a lot of problems with this scenario. If there is a user with corrupt data in y x xour set, the &lt;code&gt;user.save!&lt;/code&gt; command will throw an error and cancel the migration. Secondly, in production you may have a lot of users, which means the database would take a long time to migrate, possibly keeping your application offline for the entire time. Finally, as your application changes over time, you might remove or rename the &lt;code&gt;User&lt;/code&gt; model, which would cause this migration to fail. Some advice suggests that you define a &lt;code&gt;User&lt;/code&gt; model within the migration to avoid this. For even greater safety, Elle Meredith advises us to &lt;strong&gt;&lt;a href=&quot;https://robots.thoughtbot.com/data-migrations-in-rails&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;avoid data migrations within ActiveRecord migrations&lt;/a&gt;&lt;/strong&gt; completely and build out temporary data migration tasks instead.&lt;/p&gt;
&lt;p&gt;Changing data outside of the migration ensures you do a few things. Most importantly, it makes you consider how your model works if the data is not present. In our full name example, you would likely define an accessor for the &lt;code&gt;full_name&lt;/code&gt; property that could respond if the data was available. If it’s not, then build the full name by concatenating the constituent parts.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ApplicationRecord&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; full_name
    &lt;span class=&quot;token variable&quot;&gt;@full_name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token delimiter tag&quot;&gt;#{&lt;/span&gt;first_name&lt;span class=&quot;token delimiter tag&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token delimiter tag&quot;&gt;#{&lt;/span&gt;last_name&lt;span class=&quot;token delimiter tag&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Running a data migration as a separate task also means the deploy no longer relies on this data changing across the production database. &lt;a href=&quot;https://robots.thoughtbot.com/data-migrations-in-rails&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Elle&apos;s article&lt;/a&gt; has more reasons why this works better and includes best practices on writing the task as well.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;The most popular Rails errors can come from anywhere within the application. In this article we&apos;ve seen common errors manifested in the model, the view, and the controller. Some of the errors aren&apos;t necessarily anything to worry about and are just protecting your application. Others should be caught as soon as possible and stamped out.&lt;/p&gt;
&lt;p&gt;Nevertheless, it’s good to track how often these errors happen. This leads to better visibility into problems that are affecting your users or application security, so you can fix them quickly. Otherwise, these error messages will be shown to the user, but the engineering and product management teams will have no idea until users complain to support.&lt;/p&gt;
&lt;p&gt;We hope you learned something new and are better equipped to avoid these errors in the future. However, even with the best practices, unexpected errors do pop up in production. It&apos;s important to have visibility into errors that affect your users, and to have good tools to solve them quickly.&lt;/p&gt;
&lt;p&gt;Rollbar gives you visibility to production Ruby errors, which offers more context to solve them quickly, including form validation errors, person tracking, boot errors and more. Check out &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/features/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar’s full list of features&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://docs.rollbar.com/docs/ruby&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ruby SDK documentation&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;sign up for a 14-day free trial&lt;/a&gt;&lt;/strong&gt; of Rollbar and let us help you take control of impactful Rails errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[5 Surprising and Sneaky Ways Errors Impact Your Business]]></title><description><![CDATA[Every app is imperfect and generates errors, but do you know how errors affect your users and business? When you look at logs for a large…]]></description><link>https://rollbar.com/blog/5-ways-errors-affect-business/</link><guid isPermaLink="false">https://rollbar.com/blog/5-ways-errors-affect-business/</guid><pubDate>Mon, 16 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every app is imperfect and generates errors, but do you know how errors affect your users and business? When you look at logs for a large application, you might see thousands of errors per day and not know where to start. Even worse are errors that are not tracked by your application. They could be buttons that stop working, input that isn’t saved, or any number of other issues. Without proper error tracking, you are flying blind to these user experience problems.&lt;/p&gt;
&lt;p&gt;Unfortunately, developers who are deep in the code are not expected to understand how these errors impact users, and ultimately, their company’s finances. Even if they know of an error that should be fixed, it can be difficult to articulate why they should be fixed instead of developing a new feature. Here are five ways developers can advocate to management about the importance of fixing errors.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 67.578125%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAABJ0AAASdAHeZh94AAABK0lEQVQoz2MwWzONbMSAR85/w9zwbYtdNs0lWXPDtM7vEuJ/GRje6Wr7rZ1JgmartTN+GRr+ERb+y8nxj5HxQEIUCZq9tyz8rar6S1n5p5nZD3u7PfkZJGi2WDt9X1r8PwYGIPrDw9M0qYWAZt2+Gv3pzXCu/fpZiyvydkUH1UxtJxxgRvO6lHQ09dvKIFzLNdOq1/bnLW4jNqo0Az3dYsOcN8wL3rZy17aJ73f17dkxiWjNjYWZjc2zrt6Zc+P+7RPLHuyZkL2J+ESyeppVgM/EMxeKjh+yWjfTckkvaSlMIyPGzMFGtyxVvzRFvzhJvyBBLz/OYFozUZqBwcbKyy0lIyqtICGlLC2lKieloSCkoaTbX4tFs+2aqZjIBkxar5lmDSLhDDgJZQAAhxmPvsoNImgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;error graphic&quot;
        title=&quot;&quot;
        src=&quot;/static/error-screen-2-bbebeef8c859a4d9201474bb2d4e25b0-e9535.png&quot;
        srcset=&quot;/static/error-screen-2-bbebeef8c859a4d9201474bb2d4e25b0-d32c5.png 216w,
/static/error-screen-2-bbebeef8c859a4d9201474bb2d4e25b0-06f31.png 432w,
/static/error-screen-2-bbebeef8c859a4d9201474bb2d4e25b0-e9535.png 864w,
/static/error-screen-2-bbebeef8c859a4d9201474bb2d4e25b0-2e6af.png 1280w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;user-experience&quot;&gt;&lt;a href=&quot;#user-experience&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;User Experience&lt;/h2&gt;
&lt;p&gt;Customers don&apos;t report the vast majority of errors they encounter in your product or website. That means you could miss a large percentage of problems if you aren’t tracking and addressing them proactively. If a customer experiences a critical error during a trial period or onboarding you might lose that customer before they even get started. Established customers may be more understanding, but repeated errors over time can lead to death from a thousand cuts. Knowing who was affected by a problem and proactively reaching out can turn a frustrated user into a devoted one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/customers/clubhouse/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Clubhouse&lt;/a&gt;&lt;/strong&gt; co-founder and CTO Andrew Childs explains, &quot;We not only fix the error, but we contact the user directly and say, ‘We noticed that you’re trying to do this one thing... It’s fixed now.’ It lets us be proactive.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We not only fix the error, but we contact the user directly and say, ‘We noticed that you’re trying to do this one thing... It’s fixed now.’ It lets us be proactive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;nps--cac&quot;&gt;&lt;a href=&quot;#nps--cac&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;NPS &amp;#x26; CAC&lt;/h2&gt;
&lt;p&gt;Customer satisfaction as measured by Net Promoter Score &lt;strong&gt;(&lt;a href=&quot;https://en.wikipedia.org/wiki/Net_Promoter&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;NPS&lt;/a&gt;)&lt;/strong&gt; lets you know whether customers or prospects are happy with your apps and likely to refer friends. Word of mouth from people that customers trust is the best way for them to learn about your product.&lt;/p&gt;
&lt;p&gt;A low score could be due to repeated frustrations with your product. Tools like &lt;strong&gt;&lt;a href=&quot;https://www.wootric.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Wootric&lt;/a&gt;&lt;/strong&gt; can survey your users to determine your score and collect feedback on why they scored you that way. If technical difficulties or their downstream effects are lowering your score, you may benefit from an error monitoring solution like Rollbar.&lt;/p&gt;
&lt;p&gt;Furthermore, your net promoter score (NPS) can affect your customer acquisition cost (CAC) and even impact your ability to raise capital. If the cost of acquiring customers is too high because they are frustrated with your product, your business may have a harder time raising capital to grow. It&apos;s better to invest in a great user experience early on so that you can grow your business more profitably.&lt;/p&gt;
&lt;h2 id=&quot;revenue-loss-or-churn&quot;&gt;&lt;a href=&quot;#revenue-loss-or-churn&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Revenue Loss or Churn&lt;/h2&gt;
&lt;p&gt;In transactional businesses like online stores, errors directly impact your revenue because you don’t get paid for failed transactions or purchases. In subscription businesses, repeated dissatisfaction and problems can result in downgrades or even cancellation.&lt;/p&gt;
&lt;p&gt;According to &lt;strong&gt;&lt;a href=&quot;https://baymard.com/lists/cart-abandonment-rate&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Baymard Institute&lt;/a&gt;&lt;/strong&gt;, visitors abandon shopping cards 20% of the time because of website errors or crashes. In the worst cases, these errors aren’t obvious to the customer and it appears as if everything worked as expected. A customer would later check on their order to find it never even went through. Similarly, errors in order entry or processing can result in the customer getting billed incorrectly or being shipped the incorrect products. Customer Support has to step in to fix the problem, and you may have to go an extra mile to win that customer back.&lt;/p&gt;
&lt;p&gt;An error monitoring solution can give you an early indicator that something is wrong so your team can fix it before more customers are impacted. It&apos;s especially important to keep an eye on revenue impact after deployments and infrastructure changes.&lt;/p&gt;
&lt;h2 id=&quot;development-velocity&quot;&gt;&lt;a href=&quot;#development-velocity&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Development Velocity&lt;/h2&gt;
&lt;p&gt;If your application is brittle, the team may not feel comfortable deploying frequently, let alone continuously. This means you aren’t able to ship fixes or new features as quickly. Rob Zuber, CTO of &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/customers/circleci/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CircleCI&lt;/a&gt;&lt;/strong&gt; explains, &quot;Without Rollbar giving us visibility into exceptions in production, we just wouldn’t be confident and we’d ship more slowly.&quot;&lt;/p&gt;
&lt;script charset=&quot;ISO-8859-1&quot; src=&quot;//fast.wistia.com/assets/external/E-v1.js&quot; async&gt;
&lt;/script&gt;
&lt;div class=&quot;wistia_responsive_padding&quot; style=&quot;padding:56.25% 0 28px 0;position:relative;&quot;&gt;
&lt;div class=&quot;wistia_responsive_wrapper&quot; style=&quot;height:100%;left:0;position:absolute;top:0;width:100%;&quot;&gt;
&lt;div class=&quot;wistia_embed wistia_async_8h3zv3ssx4 videoFoam=true&quot; style=&quot;height:100%;width:100%&quot;&gt;&amp;nbsp;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Additionally, if errors are too difficult or time consuming to investigate, your team may not want to devote engineering time and effort to address them quickly. If errors go ignored for too long, they can result in technical debt, which must be paid when you add new features, slowing your ability to react to the market changes.&lt;/p&gt;
&lt;p&gt;While it may be counterintuitive, the best way to help your team develop features faster is to reduce the time they spend fixing problems. If these errors are fixed when the feature is first created, there will be fewer problems to deal with down the road for both your customers and your engineering team.&lt;/p&gt;
&lt;h2 id=&quot;employee-morale-and-turnover&quot;&gt;&lt;a href=&quot;#employee-morale-and-turnover&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Employee Morale and Turnover&lt;/h2&gt;
&lt;p&gt;Repeated errors can affect employee morale when engineers have to work extra hours to fix problems. A few after hours work sessions may not cause any long term damage, but time away from home and family can mount up and make the work less enticing. When errors are difficult to diagnose and resolve, employees and their managers can feel unappreciated because they aren’t being successful in their jobs and the results eventually show in performance reviews and employee turnover.&lt;/p&gt;
&lt;p&gt;Software developer &lt;strong&gt;&lt;a href=&quot;https://mtlynch.io/why-i-quit-google/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Michael Lynch&lt;/a&gt;&lt;/strong&gt; left his job at Google after being continuously disappointed by doing important work that didn’t gain him recognition he was promised, saying, &quot;The problem, as I discovered at promotion time, was that none of this was quantifiable. I couldn’t prove that anything I did had a positive impact on Google.&quot; Recruiting new employees can cost employers tens of thousands of dollars, plus months of onboarding before they’re fully up to speed. Investing in a good development process is a cost-effective way to attract and retain great developers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The problem, as I discovered at promotion time, was that none of this was quantifiable. I couldn’t prove that anything I did had a positive impact on Google.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As Rob Zuber, CTO of &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/customers/circleci/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CircleCI&lt;/a&gt;&lt;/strong&gt; explains, &quot;There are so many emotional pains that developers and operators have from all kinds of hideous errors they have shipped. What if you could make that go away? That’s what Rollbar does.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There are so many emotional pains that developers and operators have from all kinds of hideous errors they have shipped. What if you could make that go away? That’s what Rollbar does.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;using-the-right-tools&quot;&gt;&lt;a href=&quot;#using-the-right-tools&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Using The Right Tools&lt;/h2&gt;
&lt;p&gt;Each of the situations above can be addressed by having a good understanding of how errors impact your customers. It’s then necessary to deliver those insights to engineering teams quickly and with enough detail so they can address them with minimum guesswork.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt; presents a clear overview of the errors impacting your customers so you can quickly prioritize fixes and retain those customers. In the screenshot below, you can see a list of the top errors from your app, how many times each happened, how many users are affected, and more. Your engineering team will be able to identify and focus efforts on the most important errors first.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rollbar.com/product/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 51.151315789473685%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAAB1ElEQVQoz22SS2/TQBDH/cUQQiDUA4ceOYEEVJW4cOQK4ik+AB+Aa+BjADck2kJTK3GbJnFsrx/r92Pt/JmZKLQRrPTTzO7szvzHY2vv8B3uPf2AW49egf07T15veHxl7x68xY0HL3a4+fAlblNs//AN7j97L3fpfGTV3QCVdTvo0oBX13UYhkHsFmMM+r6XeGsGVE0vGNNjvV6PLF93+GZn+HqW4budi/29qORBmSskSYI0TZFlmfhsy7LkxztorbnQyCqKApPJFOH0HGXdIslJYRgiK2rklUHZGBS1QdP1onZLqj2EUUSJUuR5LmeisGkaOI6DZHkqSvyQmM+xDDRWSiNKSJkm0is0EfhT+H5wPdkmIX+PkBRdLBUmlx6cuU9+IHsv1Ji5SvZuEEucz7dtcvvbhH8VckJWVlWVWL5w6o3xxf6Mo9WR7JVSiKi9sijFZwHcGcfquv43YRAoCVR1g4ImVrdUpGpRtYZU5PLwf3CROI5FKYuhYf3ghM9pep9anaCJQgkwfJGL8GSn4184n83hegF8FUFFMTzFyRKJMzz5mgRZvEjqflEW8AMfx84xzmZjnDgn4tszGyt3gYvFCpdugKUf0ffcQMP5Sf/lx+v8ARFo0LdLxbghAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Rollbar dashboard&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-dashboard-a2fe2453c62c39fcb02bcb823908a1da-e9535.png&quot;
        srcset=&quot;/static/rollbar-dashboard-a2fe2453c62c39fcb02bcb823908a1da-d32c5.png 216w,
/static/rollbar-dashboard-a2fe2453c62c39fcb02bcb823908a1da-06f31.png 432w,
/static/rollbar-dashboard-a2fe2453c62c39fcb02bcb823908a1da-e9535.png 864w,
/static/rollbar-dashboard-a2fe2453c62c39fcb02bcb823908a1da-46cb9.png 1216w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It also gives you extra context to identify what caused each error so you can fix it fast. When your engineering team spends less time fixing problems, they have more time to develop new features.&lt;/p&gt;
&lt;script charset=&quot;ISO-8859-1&quot; src=&quot;//fast.wistia.com/assets/external/E-v1.js&quot; async&gt;
&lt;/script&gt;
&lt;div class=&quot;wistia_responsive_padding&quot; style=&quot;padding:56.25% 0 28px 0;position:relative;&quot;&gt;
&lt;div class=&quot;wistia_responsive_wrapper&quot; style=&quot;height:100%;left:0;position:absolute;top:0;width:100%;&quot;&gt;
&lt;div class=&quot;wistia_embed wistia_async_80ekxe3s7a videoFoam=true&quot; style=&quot;height:100%;width:100%&quot;&gt;&amp;nbsp;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Rollbar allows us to go from alerting to impact analysis and resolution in a matter of minutes. Without it, we would be flying blind&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Arnaud Ferreri, Director of Engineering &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/customers/instacart/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Instacart&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;With Rollbar, you’ll have better visibility into customer experience which can help you satisfy and retain more customers. Your engineering team will be able to fix problems faster, leaving more time to enhance your product and accelerate your business.&lt;/p&gt;
&lt;p&gt;Take a deeper look at how &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/product/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&apos;s product&lt;/a&gt;&lt;/strong&gt; helps developers and what its &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/customers/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;customers&lt;/a&gt;&lt;/strong&gt; have to say about the product. Then, &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/signup/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;sign up for a free trial&lt;/a&gt;&lt;/strong&gt; and get started in minutes. You owe it to your customers, your team, and your business.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and stop flying blind in production.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://try.rollbar.com/low-risk-continuous-delivery-guide/?utm_source=blog-cta&amp;#x26;utm_medium=blog-cta&amp;#x26;utm_campaign=ebook-cd&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/728x90FIXFAST-Gen.153113.o.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the Rollbar Team - David Karapetyan (Engineering)]]></title><description><![CDATA[Originally from Armenia, David Karapetyan is a software engineer who enjoys improving and streamlining systems. Since joining Rollbar in…]]></description><link>https://rollbar.com/blog/meet-the-team-david/</link><guid isPermaLink="false">https://rollbar.com/blog/meet-the-team-david/</guid><pubDate>Sun, 15 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Originally from Armenia, David Karapetyan is a software engineer who enjoys improving and streamlining systems. Since joining Rollbar in January of this year, David has been working to make things simpler, faster, and cheaper for our backend systems.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 256px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUEAQL/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAdU6hLarOJJOI3PYP//EABwQAAIBBQEAAAAAAAAAAAAAAAECAAMREhMhMf/aAAgBAQABBQLrwXVrARmFN2qDPMCM7bD7sef/xAAVEQEBAAAAAAAAAAAAAAAAAAABIP/aAAgBAwEBPwEj/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHRAAAgEEAwAAAAAAAAAAAAAAAAERAhAhMjFRcf/aAAgBAQAGPwLaDFTduMNGEd+EOpxbZn//xAAcEAEAAgMBAQEAAAAAAAAAAAABABEhMUFRkfH/2gAIAQEAAT8hM5pLXyUblNLuGIPyOE8XpK6swBmaiKN8RqYp1uLafsT/2gAMAwEAAgADAAAAEDDvff/EABYRAQEBAAAAAAAAAAAAAAAAABEgIf/aAAgBAwEBPxAGx//EABgRAAIDAAAAAAAAAAAAAAAAAAABEBEh/9oACAECAQE/ENKFH//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQWFxgf/aAAgBAQABPxBYdZWaEKB8sgELQhfDERyOu2wN/WaK9FY9ZccUkDLpXMpeYU/DuMMNI2MU3Z6n/9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;davidk&quot;
        title=&quot;&quot;
        src=&quot;/static/davidk-9abf27de5693b260ab7c60df3d6499e3-983fe.jpg&quot;
        srcset=&quot;/static/davidk-9abf27de5693b260ab7c60df3d6499e3-17276.jpg 216w,
/static/davidk-9abf27de5693b260ab7c60df3d6499e3-983fe.jpg 256w&quot;
        sizes=&quot;(max-width: 256px) 100vw, 256px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;David was born in Yerevan, Armenia, and moved to Burbank, California when he was 12. After high school, he went to UC Davis, where he majored in Math. He continued on to get his M.A. in Math at USC, and was working on a Ph.D. in Math as well, but decided to leave the program. As he puts it, he &quot;realized the economics didn&apos;t make sense&quot; and decided to become a programmer.&lt;/p&gt;
&lt;p&gt;He is a self-taught programmer, and learned how to program with Ruby and Smalltalk. David&apos;s first job in tech was writing test software for a solar power plant. Starting with that job and every job since, David has gravitated towards working in DevOps. At Rollbar, his main focus is DevOps, working to instrument and simplify things in a way as to make them accessible to everyone in the company so that he&apos;s not a bottleneck. One of the things he&apos;s looking forward to working on here is making some of the backend servers dynamically scalable based on load patterns like incoming event rates and CPU load. Ultimately, he says, the goal is to automate himself out of work.&lt;/p&gt;
&lt;p&gt;David describes the culture here at Rollbar as &quot;friendly and mature at the same time, which is a rare combination. People in general also seem to have lives outside of work and programming which is always nice.&quot;&lt;/p&gt;
&lt;p&gt;We&apos;re glad to have David on the Rollbar team!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Under-the-hood with Scout: a look at a New Relic alternative]]></title><description><![CDATA[This is a guest post by Derek Haynes from  Scout , an APM that integrates with Rollbar. When New Relic launched ten years ago, web…]]></description><link>https://rollbar.com/blog/scout-new-relic-alternative/</link><guid isPermaLink="false">https://rollbar.com/blog/scout-new-relic-alternative/</guid><pubDate>Thu, 05 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;This is a guest post by Derek Haynes from &lt;a href=&quot;http://scoutapp.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Scout&lt;/a&gt;, an APM that integrates with Rollbar.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When New Relic launched ten years ago, web applications had a tendency to fail hard and in more obvious ways:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDBP/EABUBAQEAAAAAAAAAAAAAAAAAAAAC/9oADAMBAAIQAxAAAAGLrW4zFA//xAAZEAADAAMAAAAAAAAAAAAAAAAAAQIQESH/2gAIAQEAAQUCQ+YRVOjR/8QAFhEAAwAAAAAAAAAAAAAAAAAAAAES/9oACAEDAQE/AYZDP//EABYRAQEBAAAAAAAAAAAAAAAAAAASAf/aAAgBAgEBPwG14//EABgQAAIDAAAAAAAAAAAAAAAAAAAQASEx/9oACAEBAAY/AjHcr//EABgQAQEBAQEAAAAAAAAAAAAAAAEAESFx/9oACAEBAAE/IT3kXhx6SQxE42fs2L//2gAMAwEAAgADAAAAEGsv/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxAr/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQIBAT8QgP/EABoQAQADAQEBAAAAAAAAAAAAAAEAESExQaH/2gAIAQEAAT8QyAteFXM1P0pYFwLmDYi5Ahc9v2uTdz7P/9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;twitter fail&quot;
        title=&quot;&quot;
        src=&quot;/static/twitter-eb23791774e7d080b58effa165d3eb1f-c69aa.jpg&quot;
        srcset=&quot;/static/twitter-eb23791774e7d080b58effa165d3eb1f-2c497.jpg 216w,
/static/twitter-eb23791774e7d080b58effa165d3eb1f-ec3f2.jpg 432w,
/static/twitter-eb23791774e7d080b58effa165d3eb1f-c69aa.jpg 864w,
/static/twitter-eb23791774e7d080b58effa165d3eb1f-d4e2e.jpg 1200w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Today, it&apos;s easier to build resilient apps, but they fail in more complex, unique, and subtle ways. These issues are time-consuming to track down. While several niche New Relic alternatives have appeared, they&apos;ve focused on a lighter feature set versus solving these increasingly hard performance problems.&lt;/p&gt;
&lt;p&gt;Unlike existing &quot;New Relic Lite&quot; alternatives, &lt;a href=&quot;https://scoutapp.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Scout&lt;/a&gt; approaches performance monitoring much like Rollbar&apos;s best-of-breed error monitoring. Scout is designed to drastically reducing the investigation time for these complex performance issues.&lt;/p&gt;
&lt;p&gt;Let&apos;s investigate a modern-day performance issue with Scout and compare the experience to New Relic.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;a-sudden-increase-in-response-time&quot;&gt;&lt;a href=&quot;#a-sudden-increase-in-response-time&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A sudden increase in response time&lt;/h2&gt;
&lt;p&gt;You hop into Scout and see this chart:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50.259067357512954%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAABYlAAAWJQFJUiTwAAABwElEQVQoz42RzU8aQRjG90/ryYttL8aEAydPtiaSHpY0XIgHk0brwaRC9Gb8amklkViQD0Gh0hXxWzGm0RqK4LrLzu7sMMPMLkvHrTFNPOgvz+E9vM8zz5sRRt6LgUAgGAyKouj3+z0eT98z8Hq9A0PvhL3C4Xa2XK/XZflWMfC1qssAWZZFXWwXQkj3EXxHaN4ALucp/rcxxjDGPFpwno1JWjrSz5UqQOCgcWEgXeCtHoI1+br4fW4n/Xk7E5Xis1JiLr86D2pnXZt1nU66Uh6KzkyufO1fmgjnYsnfx3dmft8/M27jh25uaOduchy7uvXrJNbzVnzdM9z7ytf/wtf70hee+SZc1qvThUT0Z+bH0e6XUj53IC1vZRM7hXSpGJHWZzfXMvulxVxiYTn+YfDT2OAU1/ibEFdqcfP+ZoIAhJBZlmoChlU+mCaBBFDGKFSZgSmhGkZtyiAwaUt3CzkCpaxaazQ1ne/dqprSBJZlGxDJitZxc3eL2WRkOjn/cSE0Gl+aSkdCqUi4Ut7gfoH/4dVVTb5RWghrTV1VAX8EGkhVAG1Tbv5zUTmRUmfS2l4udppfaVxWcIuYENl25y+nau/pYfhxHAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;scout overview&quot;
        title=&quot;&quot;
        src=&quot;/static/scout_overview-0b23905f6e971c95919d101c17363d02-e9535.png&quot;
        srcset=&quot;/static/scout_overview-0b23905f6e971c95919d101c17363d02-d32c5.png 216w,
/static/scout_overview-0b23905f6e971c95919d101c17363d02-06f31.png 432w,
/static/scout_overview-0b23905f6e971c95919d101c17363d02-e9535.png 864w,
/static/scout_overview-0b23905f6e971c95919d101c17363d02-ab1f5.png 1296w,
/static/scout_overview-0b23905f6e971c95919d101c17363d02-7539a.png 1728w,
/static/scout_overview-0b23905f6e971c95919d101c17363d02-d2544.png 2316w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;There&apos;s a clear increase in overall response time for this Rails app, largely from time spent in the &lt;code&gt;Controller&lt;/code&gt; layer. To understand the incident, we need to answer the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Is this isolated to a single web endpoint or across the app?&lt;/li&gt;
&lt;li&gt;What triggered this problem?&lt;/li&gt;
&lt;li&gt;What area of code is responsible for this bottleneck?&lt;/li&gt;
&lt;li&gt;Which developer on our team is best equipped to fix this?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let&apos;s start with the first question.&lt;/p&gt;
&lt;h2 id=&quot;is-this-isolated-to-a-single-web-endpoint-or-across-the-app&quot;&gt;&lt;a href=&quot;#is-this-isolated-to-a-single-web-endpoint-or-across-the-app&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Is this isolated to a single web endpoint or across the app?&lt;/h2&gt;
&lt;p&gt;Around 60 endpoints received traffic during this incident. Are response times increasing across many endpoints or just one? In New Relic, you&apos;d need to navigate to the &quot;transactions&quot; area, click on each transaction, and identify which endpoints match the trend. This can be a laborious process.&lt;/p&gt;
&lt;p&gt;With Scout there&apos;s no need to manually click on dozens - or sometimes hundreds - of different endpoints and inspect charts.&lt;/p&gt;
&lt;p&gt;Click-and-drag over the spike in response time to reveal additional details:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/assets/zoom-f20be2c379f35a4cbdaca2944e400998.gif&quot;&gt;&lt;img src=&quot;/assets/zoom-f20be2c379f35a4cbdaca2944e400998.gif&quot; alt=&quot;Zoom video&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scout analyzes the response time of each endpoint for you, identifying those with the greatest latency over the highlighted timeframe&lt;/strong&gt;. There&apos;s only one endpoint that mirrors the overall response time trend - &lt;code&gt;AlertsController#list&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We&apos;ve dramatically reduced the time to identify the scope of the impact with Scout. This issue is limited to one endpoint.&lt;/p&gt;
&lt;h2 id=&quot;what-triggered-this-problem&quot;&gt;&lt;a href=&quot;#what-triggered-this-problem&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What triggered this problem?&lt;/h2&gt;
&lt;p&gt;Clicking on the &lt;code&gt;AlertsController#list&lt;/code&gt; link, we can see that there&apos;s a large spread in the response time of transaction traces collected by Scout:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 122.68041237113403%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAADqUlEQVQ4y3VUS3PcRBDWj+JncOLIFW5w5MIBKO5wIFCUgYIbh1AUiZOYIgkBnNiOifOyN9au7X1kd6VdPUavGUkzoxlJfKO1EzskXX34ptWPb3q6ZUmp9g96tt3vPbOfHvQeP9kPwwjGN2meF0mSQYuCW0rpqqrquta6fjPQrwPqNLht26ZpXgX16Sd4G6DLWkbnLRbSl5wjDWJgajoxoFZNFV+wyMBoleCojGgTjEOrWSvDppYGoDaASluVNbpoO2kUbSsSsWnLnbaKcx7ByQRzFioeNnzeCK/LnTWKNeVzgwEQpjKaO3tOf/3u9tXe9p3DvW82b0qlVpV1i1I1bxVr4apL5G5V0lZho/O2K24/G3/+0bcfvPPpJ+9/+d7bH7/71ofHo7kJLrio0LZOM5YjJfIllCnT2IoyiuvNjt17v+08uPFwb+PR1tX7D/94zLLCBLen16qlFEXJCcnzktehU2RJwfkJJSU3dm/sA8iu292jtBb6jPhO9QqgToNvF/XM55yb1paUFRdivvCHU2fpk5Sy1UuSJJu63nwZ0NzcuXsb5ZPY8QKWF8BmSDhChZi5y8Oj0cILyrLkJYc3eB6Npv2TiRAV3lLiSkK4XjB3Pcpy3oVZcKYpoymFplEaLkiWZKrSklee64Z+6CKxuxwe9UdH4+FgeGKf2PsHAIzmCBaExHGcRlGCWR/m4aSIclZgPXau/7R15bvNX77avfb9zvoPexs/3vv10vaVtZ3ff95dX0vjyGIMHZXYFUpzJALJ/2+SMY7+lrHzit1CQbs/GAyOJ5Pnh/aARDGIZBn1/SCOE3QFXUifXHbszSkBIWSXL9SCn+M4rJPlcpmmKTuT2WzmeX5xfCu9/dns0Q1CCIyTyWQ6nc7mc2ALCZI0xaXR/aKqSVFBmdBo+C3v4Fr49HDrX+b3/vS3tpxB5IGOWbXV5lpoEngGAcHNs6JaptxLeZxjkLQT+sso4oVg/Y0wpxlawiU8ZYU9N4rKFYwYSBxgLaUqheJSY8B3k/H9+fFyNF7Yl+/S4d5iRLywKEq0Cl+hZsKKTjB1QtWZUFRorgyxf+LB7cm+/9eam01vZvaK9srzJe0gjHwfKXmay0VaLpKSUIH00/kMRrXzhecHeVcQGpz7PZohieIEIwH+jCufioCJuJAY/ZAQNb6jH3xNKUNfV/sQRfGLJTE/wOai1GcgTuO6jBqtkjSpX5rP3Ooz2p6hLQztpETDV7SH49Fq4BzXfS3t/wDornruPNXXIAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;scout traces&quot;
        title=&quot;&quot;
        src=&quot;/static/scout_traces-555539aec8596669827c76763e8211e0-e9535.png&quot;
        srcset=&quot;/static/scout_traces-555539aec8596669827c76763e8211e0-d32c5.png 216w,
/static/scout_traces-555539aec8596669827c76763e8211e0-06f31.png 432w,
/static/scout_traces-555539aec8596669827c76763e8211e0-e9535.png 864w,
/static/scout_traces-555539aec8596669827c76763e8211e0-ab1f5.png 1296w,
/static/scout_traces-555539aec8596669827c76763e8211e0-270a9.png 1552w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;It&apos;s harder to identify the dramatic spread in response time with New Relic as only traces for slow requests are captured:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 36.29893238434164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAABYlAAAWJQFJUiTwAAABIElEQVQY022QX0+DMBTF+b5+MV+nyebTMlyWTYfLnA5RYEMoLbQFRrFk/J0XdIlL/OXmPPSm5/RUESLzfZ8QTCkjhFBKTz2B82aspp75sn0c268P5mZubzVrs9jrmr4c7/VlWRZKHMcY4zAMgyDolARgUdc1cYzZ6FrX1PX97Wo6fJ6NjMVQm9ys1QHo02SQyy+FMQbJ6R/AYtfjeZ5l25xHvwtTFdgAa4QQ5GVZpkgpk57DGRanHk0IPyCaeGF8LMrmTHV31aB5WVZFWbVtqwghIByqRlEEmVAeikAFxn6OWZ7npzNNIRvhR6nkqRTy2F2mlyAS7lDg4k5tl8CbxH+AqcI5d3ugOajjOFDVeP8wLcu0bBj4x/QS8DU/cciTb4TyeyqPQprQAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;scout traces&quot;
        title=&quot;&quot;
        src=&quot;/static/nr_traces-86f992318eadd27fe481dfa92b5305d9-e9535.png&quot;
        srcset=&quot;/static/nr_traces-86f992318eadd27fe481dfa92b5305d9-d32c5.png 216w,
/static/nr_traces-86f992318eadd27fe481dfa92b5305d9-06f31.png 432w,
/static/nr_traces-86f992318eadd27fe481dfa92b5305d9-e9535.png 864w,
/static/nr_traces-86f992318eadd27fe481dfa92b5305d9-76dcc.png 1124w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Do these very slow requests share something in common?&lt;/p&gt;
&lt;p&gt;We can explore the transaction traces collected by Scout via the Crossfilter feature. This lets us dynamically filter transaction traces across many dimensions (ex: the session&apos;s user email, IP, request path, etc). Let&apos;s inspect just the slowest &lt;code&gt;AlertsController#list&lt;/code&gt; transaction traces:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/assets/crossfilter-64ff0e0cf96c0e7ec1184d3d61e3279f.gif&quot;&gt;&lt;img src=&quot;/assets/crossfilter-64ff0e0cf96c0e7ec1184d3d61e3279f.gif&quot; alt=&quot;Cross filter video&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We can see all of the slow requests are coming from the same request path and user email. We&apos;ve identified the needle-in-the-haystack conditions triggering the incident.&lt;/strong&gt; This quick inspection of trace data isn&apos;t possible with New Relic.&lt;/p&gt;
&lt;p&gt;Now that we know the triggers, what section of the code is the root cause?&lt;/p&gt;
&lt;h2 id=&quot;what-area-of-code-is-responsible-for-this-bottleneck&quot;&gt;&lt;a href=&quot;#what-area-of-code-is-responsible-for-this-bottleneck&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What area of code is responsible for this bottleneck?&lt;/h2&gt;
&lt;p&gt;When you inspect a transaction trace with New Relic, you see this:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 67.5550405561993%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAABYlAAAWJQFJUiTwAAABkElEQVQoz6VTy07CQBSdL/ILXLnwH1y48aPcuDAaYzAqpCpqakI0GgMGRMSgvKmUls50WvriUaB4oIkxEaPEk5uT05t7O7e9Z4jnea7r2rbt+75pmn2Asi6i2538BtLv94IggAIPBoPRaIS3QEz+ANI2nIHvW5aFw3u9nmEY0OgP/gAy+QfIxvLSorG2srq0fjptPtvZWjRie/tbQmnaXC3ki7ms1JAzBTVf4WBdseSiQuu62m5K7LXSegY3WTn8o5+MtZDXyDaiLBw9HQsvwlkhfy3lhEYmVk9HH96Lm7lsst0wu5rd53O++XsqexvP3p4nxYN0IppOxJLi4dNdPCUePFwd3otHKTGSuth9vDmZNlPGMAOWRCnVdZ0xNhwOv28F+0dNOK3H5aB6iTLS6XTG4zFS5gwdyxr/AFSD4QLHcXyXu65HNE3DA7yhqqoyA9zizINtT9voDBA4lXDO4Sc4GQPj5NBec4HpwBg+rMGNIGXpXeVGU6NvtTp0qSGBZcoUnSP/NZAMRU1ugdtM/wAolt4NpkBKygAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;nr trace&quot;
        title=&quot;&quot;
        src=&quot;/static/nr_trace-d533f8f86445afb28fa6d924296a5065-e9535.png&quot;
        srcset=&quot;/static/nr_trace-d533f8f86445afb28fa6d924296a5065-d32c5.png 216w,
/static/nr_trace-d533f8f86445afb28fa6d924296a5065-06f31.png 432w,
/static/nr_trace-d533f8f86445afb28fa6d924296a5065-e9535.png 864w,
/static/nr_trace-d533f8f86445afb28fa6d924296a5065-ab1f5.png 1296w,
/static/nr_trace-d533f8f86445afb28fa6d924296a5065-88ac5.png 1726w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Almost all of the time is spent in your custom code. You could guess where to add custom instrumentation, but that&apos;s a long process with a slow feedback loop. Local profiling may not help if you don&apos;t have the ability to reproduce the production dataset.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With Scout, you gain visibility into your application code without custom instrumentation&lt;/strong&gt;. ScoutProf, a production-safe profiler, automatically analyzes your custom code:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 26.973684210526315%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA6klEQVQY003O3W6CQBAFYN7/SXrZ0qQSI9RUEVyyuEshrArVNloowkpZlv+LYonGk+9yzswIQU6TknFesJwX2dkBCnx7sRZjrEqG8mTOJKyOgfy4mo3i8Ng0bdt2N0JC6SmOq6oO81w/uDBLe2lddV2nBkePs/aaoiyb//aQfkDgvDx9f13uvIpoLtm6DKfPSJPNqZj3uXyU7SLr3plF/ZKewBj/ieIdwe5qsQaTDdK274Znww8HYm0SHD4jGs7XDwPgi3Xd3ghpmtG9n4CR75hbGxK8JAgQpBO0tE3dcy1CDLxXMv57Xxv8AVh4CTu1mnntAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;scoutprof&quot;
        title=&quot;&quot;
        src=&quot;/static/scoutprofv2-6abdaf117c06cbdfa9d62fbc581fb1c1-e9535.png&quot;
        srcset=&quot;/static/scoutprofv2-6abdaf117c06cbdfa9d62fbc581fb1c1-d32c5.png 216w,
/static/scoutprofv2-6abdaf117c06cbdfa9d62fbc581fb1c1-06f31.png 432w,
/static/scoutprofv2-6abdaf117c06cbdfa9d62fbc581fb1c1-e9535.png 864w,
/static/scoutprofv2-6abdaf117c06cbdfa9d62fbc581fb1c1-ab1f5.png 1296w,
/static/scoutprofv2-6abdaf117c06cbdfa9d62fbc581fb1c1-a9b78.png 1520w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;ScoutProf identified two Ruby bottlenecks. Additionally, Scout identified a database query that returned nearly 21k rows (this information isn&apos;t available in New Relic).&lt;/p&gt;
&lt;p&gt;We&apos;re almost there. Your team is composed of several developers. You aren&apos;t familiar with this code and are unlikely to be efficient at addressing this issue.&lt;/p&gt;
&lt;h2 id=&quot;which-developer-on-our-team-is-best-equipped-to-fix-this&quot;&gt;&lt;a href=&quot;#which-developer-on-our-team-is-best-equipped-to-fix-this&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Which developer on our team is best equipped to fix this?&lt;/h2&gt;
&lt;p&gt;Scout integrates with GitHub, overlaying &lt;code&gt;git blame&lt;/code&gt; output on top of application code. With that, &lt;strong&gt;we can identify the developer who most likely knows about this bottleneck&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50.39028620988726%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAABYlAAAWJQFJUiTwAAABkUlEQVQoz4WR207CQBCGeUXlQiOi8TGM72DijQ9gYrjQC/XGKBIPIAgqigYUxYhQ2m7pYU9st6WlTsEYNUb/fNlMZvZPJv8khHAR6jsO8bzhVxjl0KSUq/32ycPGhHJrp2s2maCTPwkpfYSMbldRlB7Q7YyrXk9VNU3TLcvuqK9XT4fVlyPgoVMhhE5gjIPZUztt0NgQyzAM0zQt08J/CvwJz/M5cQZ8EPp+FEWm2q6d7dwVD+5LB41KrlE5qldyzVpp9F3wMwzD2BwMh66g1O4TbFNNJc1Tgk3XQa6lU8dwLA3bOnEQp6bgNrzAKBCBL8bmWEPJmSTYY1RKF2pBiRxwibFHPzqBlFE0+iQMg9gsOMvtbp7vZ0qHW5fHe4X9zEV2u149L2e3YW2Greg3xWu7rgeR1su5x2rh6abQuso+30KRf7zO14rZeIqNhlLggv24ZXwqcOo6gpARnNvos1aeWAiyBCByGPX0NwW9TjpfoZQl1lfX0nOpheRMej69mJxZmp9Np1LTU9NT/7G8vPIOTsEC0NUztS0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;git&quot;
        title=&quot;&quot;
        src=&quot;/static/scout_git-a356971e557b02e69dd3f8d775ce19ef-e9535.png&quot;
        srcset=&quot;/static/scout_git-a356971e557b02e69dd3f8d775ce19ef-d32c5.png 216w,
/static/scout_git-a356971e557b02e69dd3f8d775ce19ef-06f31.png 432w,
/static/scout_git-a356971e557b02e69dd3f8d775ce19ef-e9535.png 864w,
/static/scout_git-a356971e557b02e69dd3f8d775ce19ef-ab1f5.png 1296w,
/static/scout_git-a356971e557b02e69dd3f8d775ce19ef-7539a.png 1728w,
/static/scout_git-a356971e557b02e69dd3f8d775ce19ef-4af4f.png 2306w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;It looks like we&apos;re seeing these very slow request because &lt;code&gt;current_app&lt;/code&gt; has far more alerts than other apps. Since we&apos;re using Ruby to filter database rows, this is slow. The solution? Move the filtering conditions to the SQL query.&lt;/p&gt;
&lt;h2 id=&quot;language-support&quot;&gt;&lt;a href=&quot;#language-support&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Language support?&lt;/h2&gt;
&lt;p&gt;Scout supports a growing number of languages. Today, Scout has performance monitoring agents for &lt;a href=&quot;http://scoutapp.com/ruby-monitoring&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ruby / Rails&lt;/a&gt;, &lt;a href=&quot;http://scoutapp.com/python-monitoring&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Python&lt;/a&gt;, and &lt;a href=&quot;http://scoutapp.com/elixir-monitoring&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Elixir&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;pricing&quot;&gt;&lt;a href=&quot;#pricing&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pricing?&lt;/h2&gt;
&lt;p&gt;In most cases, Scout is more affordable than New Relic. You can easily tune the volume of data you send to Scout for analysis by sampling or ignoring some transactions.&lt;/p&gt;
&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;New Relic was built in the time of large-scale, major outages. &lt;a href=&quot;https://scoutapp.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Scout&lt;/a&gt; takes Rollbar&apos;s best-of-breed approach to today&apos;s softer, but harder to investigate performance issues.&lt;/p&gt;
&lt;h2 id=&quot;resources&quot;&gt;&lt;a href=&quot;#resources&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://scoutapp.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Scout Homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.apm.scoutapp.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Scout Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://help.apm.scoutapp.com/#rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Scout+Rollbar Integration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and stop flying blind in production.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the Rollbar Team - Ivan Gomez (Sales)]]></title><description><![CDATA[Ivan Gomez is a people person. Since he joined us in May of 2016, Ivan has been an integral part of the team, and loves helping our users…]]></description><link>https://rollbar.com/blog/meet-the-team-ivan/</link><guid isPermaLink="false">https://rollbar.com/blog/meet-the-team-ivan/</guid><pubDate>Thu, 22 Mar 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ivan Gomez is a people person. Since he joined us in May of 2016, Ivan has been an integral part of the team, and loves helping our users get the most value out of Rollbar as possible. &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQDAf/EABcBAQEBAQAAAAAAAAAAAAAAAAECAwT/2gAMAwEAAhADEAAAAcZ6JxtdVGcob3i+f//EABoQAQEBAQADAAAAAAAAAAAAAAECAxEAEjH/2gAIAQEAAQUC9qnPug1vxpUK63IuulRX2jz/xAAYEQACAwAAAAAAAAAAAAAAAAABEAIiUf/aAAgBAwEBPwEDVMVX/8QAFREBAQAAAAAAAAAAAAAAAAAAASD/2gAIAQIBAT8BY//EAB8QAAIABQUAAAAAAAAAAAAAAAABAhESITEQMkFhof/aAAgBAQAGPwL1Fbjn0bSywSZgsyrl6f/EABsQAQACAwEBAAAAAAAAAAAAAAEAESExQWGh/9oACAEBAAE/Ifjgkc1ZuBqeJQtICEFDbTRLC8cIdN3hEytmYmts/9oADAMBAAIAAwAAABBP/wCD/8QAFhEBAQEAAAAAAAAAAAAAAAAAARAR/9oACAEDAQE/EAxgAoT/xAAZEQEAAgMAAAAAAAAAAAAAAAABABEQITH/2gAIAQIBAT8QTZU3DuP/xAAeEAEBAQEAAQUBAAAAAAAAAAABEQAhUTFBYZGx0f/aAAgBAQABPxBfFaAAiroN9idHyTDGrCxntgzliO98v1hOST6Be4UJYKqYKsFbb81VGJgA78G/v2//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;ivan&quot;
        title=&quot;&quot;
        src=&quot;/static/ivan-7ceb41cbf92a90451d0d5384820f02b3-c69aa.jpg&quot;
        srcset=&quot;/static/ivan-7ceb41cbf92a90451d0d5384820f02b3-2c497.jpg 216w,
/static/ivan-7ceb41cbf92a90451d0d5384820f02b3-ec3f2.jpg 432w,
/static/ivan-7ceb41cbf92a90451d0d5384820f02b3-c69aa.jpg 864w,
/static/ivan-7ceb41cbf92a90451d0d5384820f02b3-d53dc.jpg 1296w,
/static/ivan-7ceb41cbf92a90451d0d5384820f02b3-e353d.jpg 1365w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Ivan was born in Ventura, CA, and lived most of his life in Silverdale, WA. He actually went to the same high school as one of Rollbar&apos;s cofounders, Brian Rue, although they didn&apos;t know each other. After high school, Ivan went to the University of San Francisco and studied Economics. Upon graduation, Ivan worked in Seattle, WA, at Avalara, a tax SaaS company. This got him interested in selling software. Eventually, Ivan ended up in Boston, interviewing for other sales positions, when he saw that Rollbar was hiring. &lt;/p&gt;
&lt;p&gt;Ivan joined Rollbar because &quot;we operate in an exciting space that is growing really fast, and we have an opportunity to define how people make software. It’s not overly saturated.&quot; He really enjoys educating as part of the sales process, and says it feels better than just transactional sales. Ivan has learned a lot from customer questions about Rollbar, as well as going to developer conferences. &lt;/p&gt;
&lt;p&gt;Since Ivan joined Rollbar, he’s taken a coding course in HTML/CSS, JavaScript, and Ruby, which he has said has been very interesting and helpful.
He’s always been techy, and he also loves talking to people and focusing on the growth side of things. For him, sales at Rollbar is a great cross-section of all of these areas. Ivan says he &quot;gets to talk to smart people every day and help them solve problems. Sales is similar to engineering in that way.&quot; He really enjoys communicating with people, and feels that the only way we can help engineers is by adding value for them. In the next few months, Ivan is looking forward to creating new content to help people get more value from Rollbar. &lt;/p&gt;
&lt;p&gt;We&apos;re very glad Ivan is on the team here at Rollbar!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Error monitoring in ASP.NET MVC]]></title><description><![CDATA[ASP.NET MVC is a modern web development framework that combines the features of MVC (Model-View-Controller) architecture for better…]]></description><link>https://rollbar.com/blog/error-monitoring-asp-net-mvc/</link><guid isPermaLink="false">https://rollbar.com/blog/error-monitoring-asp-net-mvc/</guid><pubDate>Wed, 07 Mar 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ASP.NET MVC is a modern web development framework that combines the features of MVC (Model-View-Controller) architecture for better separation of concerns and the best parts of the ASP.NET platform.&lt;/p&gt;
&lt;p&gt;We’ll show you an example of how to catch errors and exceptions in ASP.NET MVC using a global action filter. We’ll also show you how to track them in &lt;a href=&quot;https://rollbar.com/features/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar’s error monitoring service&lt;/a&gt;. This will give you real time visibility into your errors in production. It also captures person data and other context from your app so you can solve errors faster.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/asp-net-mvc-example-2d2162f06ebee4f1075989e20dbf4266.gif&quot; alt=&quot;Screenshot of Rollbar .NET MVC Example&quot;&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Above, you can see that we&apos;ve created an example app that triggers an an exception when the user clicks on a button. The error message is tracked in Rollbar, including a stack trace where you can see the line of code that caused the error.&lt;/p&gt;
&lt;h2 id=&quot;create-a-global-action-filter&quot;&gt;&lt;a href=&quot;#create-a-global-action-filter&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create a global action filter&lt;/h2&gt;
&lt;p&gt;To track all of our exceptions, we have &lt;a href=&quot;https://www.youtube.com/watch?v=M6kJv9Cppoc&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;multiple approaches&lt;/a&gt; in .NET. Using a global action filter is the easiest way to catch all the exceptions. It receives uncaught exceptions for your whole application, not just an individual controller. We’ll show you how to override it to create your own global action filter with exception tracking. Here are some simple steps to create global action filter in your application.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open up your own ASP.NET MVC project or use our open source example on GitHub at &lt;a href=&quot;https://github.com/RollbarExample/Rollbar-NET-Example&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar-Dotnet-Example&lt;/a&gt;. You can use this filter to add any error monitoring solution, but we will show an example of how to set up Rollbar in the next section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next, let’s create our own exception filter to catch exceptions. In your &lt;code&gt;App_Start&lt;/code&gt; folder, and add a &lt;code&gt;.cs&lt;/code&gt; file by extending &lt;code&gt;IExceptionFilter&lt;/code&gt;. You need to override the &lt;code&gt;OnException&lt;/code&gt; method, allowing you to catch the exception that is going to occur throughout the project. You can find the &lt;code&gt;App_Start&lt;/code&gt; folder inside your application directory.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;namespace&lt;/span&gt; RollBar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;App_Start
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RollbarExceptionFilter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; IExceptionFilter
 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;OnException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ExceptionContext filterContext&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterContext&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ExceptionHandled&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
     &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now we need to add a &lt;code&gt;FilterConfig&lt;/code&gt; to add our custom filter to the &lt;code&gt;GlobalFilterCollection&lt;/code&gt;. You can find the &lt;code&gt;FilterConfig.cs&lt;/code&gt; file inside the &lt;code&gt;App_Start&lt;/code&gt; folder.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;namespace&lt;/span&gt; RollBar
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FilterConfig&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;RegisterGlobalFilters&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;GlobalFilterCollection filters&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
     filters&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RollbarExceptionFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, register it in the &lt;code&gt;GlobalFilters&lt;/code&gt; in the &lt;code&gt;Application_Start&lt;/code&gt; method. You can find the &lt;code&gt;Application_Start&lt;/code&gt; method in &lt;code&gt;Global.asax&lt;/code&gt;, which is in the root application directory.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Application_Start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 FilterConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;RegisterGlobalFilters&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;GlobalFilters&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Filters&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;add-rollbar-error-monitoring&quot;&gt;&lt;a href=&quot;#add-rollbar-error-monitoring&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Add Rollbar error monitoring&lt;/h2&gt;
&lt;p&gt;Now that we have our global action filter wired up, we’re going to show you how to integrate &lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.net/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar’s .NET SDK&lt;/a&gt; in your code.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Visit &lt;a href=&quot;https://rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://rollbar.com&lt;/a&gt; and sign up for an account if you haven’t yet. Next, create your project and select .NET from the list of SDKs. Save the server side access token that is generated for you. You’ll need this to configure Rollbar in the steps below.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the Rollbar using NuGet Package Manager. You can install Rollbar using the Package Manager Console or in Manage NuGet Package for Solution. You can find both options in Visual Studio under Tools-&gt;NuGet Package Manager. Alternatively, to install from the console, run the command below:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;Install-Package Rollbar&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure the Rollbar SDK with the access token you received earlier. Add it in the &lt;code&gt;Global.asax&lt;/code&gt; file and inside the &lt;code&gt;Application_Start&lt;/code&gt; method.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Application_Start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt; postServerItemAccessToken &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Your Post Server Access Token&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

 RollbarLocator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RollbarInstance&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
 &lt;span class=&quot;token function&quot;&gt;Configure&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RollbarConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;postServerItemAccessToken&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   Environment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;production&quot;&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now add the Rollbar error tracking inside the global action filter we created earlier. Add it to the &lt;code&gt;OnException&lt;/code&gt; method to send the crash log to Rollbar.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;RollbarLocator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RollbarInstance&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterContext&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Exception&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can also use Rollbar to track caught exceptions and other items using the same Rollbar instance. Learn more about the full API in our &lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.net/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;.NET documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;test-with-an-example-app&quot;&gt;&lt;a href=&quot;#test-with-an-example-app&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Test with an Example App&lt;/h2&gt;
&lt;p&gt;To test that it’s working, lets create a page that will generate an error message. In the example below, you’ll be able to generate an error by clicking the &quot;Throw an error&quot; button.&lt;/p&gt;
&lt;p&gt;First, we’ll create a new form with a button to call &lt;code&gt;CreateErrorController&lt;/code&gt; action on the server.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;@&lt;span class=&quot;token keyword&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Html&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;BeginForm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;GenerateError&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;CreateError&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; FormMethod&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Post&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;input style&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;height:50px;width:200px&quot;&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;submit&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Generate an error&quot;&lt;/span&gt;   name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;When you click the &quot;Generate an error&quot; button, it will trigger the &lt;code&gt;GenerateError&lt;/code&gt; method. In this method, we have added a bug which is throwing an exception with the text “This is test exception.”&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;namespace&lt;/span&gt; RollbarDotnetExample&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Controllers
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CreateErrorController&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Controller
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// GET: CreateError&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; ActionResult &lt;span class=&quot;token function&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;View&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;HttpPost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; ActionResult &lt;span class=&quot;token function&quot;&gt;GenerateError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;This is test exception.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Since we wired up our global action filter to report the error to Rollbar, we should see the error show up on Rollbar’s item page. Below, you can see that this error last occurred 2 minutes ago.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 29.977628635346754%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA4ElEQVQY06WOS07DMBCGfStEgVa9ACxBkIoL9AQtoWtOBlcAla5KBYs2fsSOE9v5yQwKsKi66Uiff897xOX0CReTRwzvFxh1nGU5++eTnH1SposP7h5wcjP75fR2jqvrBcbZX61IKSHGeDRb7VHVEeKrcHj/KLD6LLFc71iNqxFCQFVVcM7BWsvqvWet6588QTHKrzYK2jYQrxuHlzeN539sTQBZP0xrjbIs+W+M4UH7rG1bCNompcROajQhwfoIqySf75vEhJi4uId8pRRDS4k+J+g5ZHQZNdKV1HjIaNY3Ls6votkD8twAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Rollbar .NET MVC Dashbord&quot;
        title=&quot;&quot;
        src=&quot;/static/dotnet-error-dashboard-5169866c658120bac7eba4a863a4a584-e9535.png&quot;
        srcset=&quot;/static/dotnet-error-dashboard-5169866c658120bac7eba4a863a4a584-d32c5.png 216w,
/static/dotnet-error-dashboard-5169866c658120bac7eba4a863a4a584-06f31.png 432w,
/static/dotnet-error-dashboard-5169866c658120bac7eba4a863a4a584-e9535.png 864w,
/static/dotnet-error-dashboard-5169866c658120bac7eba4a863a4a584-ab1f5.png 1296w,
/static/dotnet-error-dashboard-5169866c658120bac7eba4a863a4a584-a7b9a.png 1341w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;The item page shows us a full stack trace including the line number where the error occurred. Using the tabs above the track back, you can see more contextual data to help determine the cause of the problem. For example, you can get extra information on which people were affected, which browsers they were using, which IP address they have and more.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 40.85778781038375%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAABE0lEQVQoz21Ri3KDMAzj/z+RXssotNfRF7C8nARUOxkbdPOdTljGtjCFtg6354jrfQD5gHmefyD67cE6+Y2utOXagFGZjS4owDFNE9bhY87fdYk4zZlj3ORL/DuwG8ymaR3K+cRElHg0hBCn7UDyHj5ELjCYr0P+lPid+xWUzQOtc2lQ12t88VDH54psrJBG2SYIIaR7hfB7MyIHx83GGFhr4b3H0iMs+frGhbiQl8lH3hJhKYLCBEOSLxyhHTMFKHZD7NS4rP35KY5vcn8qPAR9htI6LXmHZl2bXFt4DXFbiPVh6LH72KE8lCirMj0fjgfs633iqqlQHSscmwbnzxNO3RntpWG0uNwuqLsabdfCWIMXLqVvjbUNyQcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Rollbar .NET Error Detail&quot;
        title=&quot;&quot;
        src=&quot;/static/Rollbar-dotnet-error-detail-c7c2647f2bc61f9257da13a118338a9a-e9535.png&quot;
        srcset=&quot;/static/Rollbar-dotnet-error-detail-c7c2647f2bc61f9257da13a118338a9a-d32c5.png 216w,
/static/Rollbar-dotnet-error-detail-c7c2647f2bc61f9257da13a118338a9a-06f31.png 432w,
/static/Rollbar-dotnet-error-detail-c7c2647f2bc61f9257da13a118338a9a-e9535.png 864w,
/static/Rollbar-dotnet-error-detail-c7c2647f2bc61f9257da13a118338a9a-ab1f5.png 1296w,
/static/Rollbar-dotnet-error-detail-c7c2647f2bc61f9257da13a118338a9a-8f118.png 1329w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Now you know how to catch exceptions in ASP.NET MVC applications! You also saw how easy it is to set up Rollbar for error monitoring. Learn more in our &lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.net/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;documentation for .NET&lt;/a&gt;, and sign up for a free trial today!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and stop flying blind in production.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the Rollbar Team - Megan Anderson (Engineering)]]></title><description><![CDATA[Megan Anderson is a software engineer who enjoys helping developers solve technical problems. That's what led her to join Rollbar in May of…]]></description><link>https://rollbar.com/blog/meet-the-team-megan/</link><guid isPermaLink="false">https://rollbar.com/blog/meet-the-team-megan/</guid><pubDate>Mon, 05 Mar 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Megan Anderson is a software engineer who enjoys helping developers solve technical problems. That&apos;s what led her to join Rollbar in May of 2017 as a support engineer, and pushed her into moving into a core engineer role a few months ago.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 133.33333333333331%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAbCAYAAAB836/YAAAACXBIWXMAAAsSAAALEgHS3X78AAAHYElEQVRIxx2U+VeTZx7F8wfUzmmrFhdwAcSlhF0WA4IBwg4h7EsIYBbCkiCEBATEIEEEEcWFpjoz0IraarVTT923um/VuqFD2xHUUadnjq1aq2L7mcf54Tnv+/7w3Pd77/feK2mtT8NmTMHW0ITZZKREncOKlaupNCjJToskSxlGWkog1iY99W0d6CuLMFdlsaqrjM7VFdTZ9JiXFNBgUdHeLEeSmz2P/PQFFBbmUbPUgUmfQ1VZDgXZMZjLVOh1OURHh6HR5aHRl1BZbUa7WIW5bjEGXSTNS7PpWKVHVxqHvigUyYIgd1RJoQQHfUS7vRprjZ68LDnpySGYjBkYdSnkq7Mp0otLS+oo0qkpKlJhqtNTUhSGKjmIgiwZaQofzIYoJIbKGuSLopg7/X0S5PNZ39eD2awjKkxKmb6QxmXL6HX+nba1m1lcWUtFXQNqdSYVgkmjTUtpwSKK8wWDvAiyUoKR7D41xMX7T1CmJRHg7YbGpKGpaxnSOTMwmJfQ2tWLpbGd3HwtuWotRmMxVouBkjwF5YZMctKDUaYGUyiAlRlhSBJzArA5DDQvL+SjGROIjIugvsvExs96sJjzSFfK8Zo5gzAvD7xcp7Byw2biYoMoyQ8nUxVASkIwcrkvcYpA/PxmIJkvm0xC6kxabWnIfKaxuqsGY2MOtuZstu3cgN2azaT338WWHssmUzEBvu4kxs+lZekCltsDkYXNZo7XVKTz3PD3cUPi6TWBmNhZVJviiAqdxTrnBo4d2s7Fi7to7TDSYG/BdeJ4muPmM2jRMWmyCxGpChpbVKRlehKrmItSLHBhhCeagoVIpNJpBPm70lCZQKz4W2lFBVfv3mXfhZMUqhOY7jmDaVOnEOk5kT59Aj7+3syNjWaBMp4qbSJlmihhu1Ay4n2pKhY+rCkMx5gZiirGj/CgWUTIgghXa1jc3kFrq5WQ5HjGT3Jh2oS/0CZMHhMvJ0QeTHXWQm7t6eP2/i2c3tXDYGcVfUIeya4eAw6Lhr9119LdYiBXlYKurgZdo40TXw0IgEVM8pjJhGmuxEXLkKUlYqkpo0Ujx66WY8sNx1YiY0lpADWlwtiKJDUr2teJBNhZat8kEtDO5so8zn7u5LSzlf4NG5EGh+ARIGWmdDa+UQuwO1ZTW9eMqaqWMmOhCIOWVe1qOhqEhp/vPsz+vXu5eGIv3589yMo1m9h+4AgHdw7g7N/K0YP/YKLQ8L0pLrhJ5xFbkMvog8cc/fYSazYMkJlTJBbUSU93D4cG7EiGf7jLzeu3uHHlHD+eceIQyXB0bOTTwa+ptbbT3baciRNdcPeW4uLuzvyQcF68eMHTZ884eeo8eWoj2fkGjh45yKvn95Ds6bVgF3mtEoLvaNPQ1+VAp61gTdd6URRGTOosZntISVSocJvqjkKeRnlFI9WWdlJVQvNCM5WmBga39vPm9SMkWXnlhMpSCF+YysLIVLIzCqnUVxLgLxMeyyYuPou5Xr7oik2oxSRxsSpKS6tZuCiNhsaVqDXlmKuXcv36TcZeP0eiLrWgNTZitrSRnKbBamsjPaOYuIQsEsQxm+txc52JvqRKlIGDeXMC8fD0RuoTRGJSNt7SIJqXOXj+9Al//vkGiTxWSUZ2KTl5OhRxSlFNegICwogIlxPoP5+wkAjGvTNOmD8Ec3kDkyfPZLq7lMAQBcrMUuGOFnp6+/nXj0P88cdrJEmp+Wh1JvILDELwKHz8Qpnq5iVa20nT8l60BgvTXN2Y8MEEEmLTeXfce3zoMp053iLLbZsor6pnzVon2/o/5vff/oskVBYjtOhgdbcTc20LKUo1kVHx2KzLqKqyikmj8Zf64DppEtPdPBg37h1mz/ElMFROQ3MrvRv7WLf+Y+wtjVy7fFxoWFxF+yonLa291Dd20t6+lrXrBxgY/EZ8dxE4PxJDmQlfqZ+Y8kP8vOeJHjSQmVWIo7mez/o3sWKFnYyMDL7Z3Y+kVNA1L2miqbkT55bt1FntOFauY3Dblxw+fIQjB/ex54ttgq6CiR+Mp3ZxBhubtCTLfIgVuV9h1WI1lZKcnIRWk4tkx44vabavo9zUyOaB3YyM/MTtW2+Nfpkr505y6/whPu22Er0gjOmu7nzxSSu/3DvDiV1rWWm3kp6eQkJSIgkpqSSmKZH8NHSNO0M3ufLdJUbvjTB0/RzDF/dx/8YBfr65l18fXKCtVk1BbjEx0SoO7Blk7OVj3rx5xstn97n53RGKSwqJjk8kKiYGyb2hSwzfuMqFU8e4fP4Ex0UlDZ/eyrNHN/hl9Aqjt88Io4tFyYLZ0ufkxdPHPPvP7f+DvhZn7OVDrl7Yj6XWSKR8EZKfR75n+Opxhq8cE5fPMXTlqCiJvVw/+zVH9jixmktQiELtdNTzYOQHXglrjP1+n7FXDwXgQ968ff42yuid06IHTEiundvHzr92sn+nk68G13P9wgHu/fM854/vRr84D7mgscSk49HoVX59Miri9URM9W/GXoyI7ArA12/f7/LqyTUe3PmW/wGZuPlGbXKY+gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;image&quot;
        title=&quot;&quot;
        src=&quot;/static/image-504d30efdbc6abcd8f4a46c1930013fa-e9535.png&quot;
        srcset=&quot;/static/image-504d30efdbc6abcd8f4a46c1930013fa-d32c5.png 216w,
/static/image-504d30efdbc6abcd8f4a46c1930013fa-06f31.png 432w,
/static/image-504d30efdbc6abcd8f4a46c1930013fa-e9535.png 864w,
/static/image-504d30efdbc6abcd8f4a46c1930013fa-ab1f5.png 1296w,
/static/image-504d30efdbc6abcd8f4a46c1930013fa-b2492.png 1536w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;One of the rare Bay Area natives, Megan went to UCLA and majored in Physiology. She then worked in a genetics lab doing organ transplant matching research for awhile, handling more human spleens than 99% of people on the planet. She decided to apply for a graduate degree in Physical Therapy, and realized that wasn&apos;t the career path for her after all. A friend of hers went to a coding bootcamp and taught Megan to code. She liked coding so much that she decided to go to a programming bootcamp as well, and after eight years in LA, Megan moved back to the Bay.&lt;/p&gt;
&lt;p&gt;Megan originally joined Rollbar as a support engineer, drawn to the role because she got to &quot;help developers that have interesting questions and problems with a technical product.&quot; Megan found the engineering work here at Rollbar especially engaging. She really enjoys solving and debugging engineering problems, and this lead to her moving into the core software engineer role she is in now.&lt;/p&gt;
&lt;p&gt;In the next few months, Megan would like to use her knowledge of how users use the product and her engineering skills to add value to Rollbar for our users. She&apos;s looking forward to making it clear and easy to use, not just technically interesting. She&apos;s especially looking forward to getting to improve things that frustrate her.&lt;/p&gt;
&lt;p&gt;Megan describes the culture here at Rollbar as supportive. &quot;When you have questions, people are happy to answer. People are very intelligent, and they assume that you’ll keep up. People want to help you develop professionally while the company succeeds. Our CEO cares about everyone’s opinions.&quot;&lt;/p&gt;
&lt;p&gt;We&apos;re excited to have Megan on the team here at Rollbar!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Send Rollbar Error Alerts to Cisco Spark]]></title><description><![CDATA[Cisco Spark   is a enterprise collaboration platform from Cisco that includes messaging, video conferencing, desk phones, and digital…]]></description><link>https://rollbar.com/blog/integrate-rollbar-with-cisco-spark/</link><guid isPermaLink="false">https://rollbar.com/blog/integrate-rollbar-with-cisco-spark/</guid><pubDate>Thu, 01 Mar 2018 00:00:00 GMT</pubDate><content:encoded>&lt;script charset=&quot;ISO-8859-1&quot; src=&quot;//fast.wistia.com/assets/external/E-v1.js&quot; async&gt;
&lt;/script&gt;
&lt;div class=&quot;wistia_responsive_padding&quot; style=&quot;padding:56.25% 0 28px 0;position:relative;&quot;&gt;
&lt;div class=&quot;wistia_responsive_wrapper&quot; style=&quot;height:100%;left:0;position:absolute;top:0;width:100%;&quot;&gt;
&lt;div class=&quot;wistia_embed wistia_async_vuyi1mq4s1 videoFoam=true&quot; style=&quot;height:100%;width:100%&quot;&gt;&amp;nbsp;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.ciscospark.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Cisco Spark&lt;/a&gt;&lt;/strong&gt; is a enterprise collaboration platform from Cisco that includes messaging, video conferencing, desk phones, and digital whiteboards to mention a few.   &lt;/p&gt;
&lt;p&gt;If your organization uses Cisco Spark, using Rollbar with it has just got easier. Depending on your setup, you can now receive Rollbar alerts not just in your messaging apps but also on that giant screen in the meeting room.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;As a Cisco Spark customer you&apos;ve invested a lot in enabling enterprise collaboration. With this new Rollbar integration, you can further extend the value of the platform for your engineering teams.&lt;/p&gt;
&lt;p&gt;You can now get notified directly in Cisco Spark when certain situations occur, such as when a new error is detected by Rollbar, or when an error occurs at a very high volume within a specified time period. &lt;/p&gt;
&lt;p&gt;If you&apos;ve enabled deploy tracking in Rollbar, you can also notify Cisco Spark of deploys.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rollbar alerts in Cisco Spark:&lt;/strong&gt;

  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 86.27777777777777%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsSAAALEgHS3X78AAAB4klEQVQ4y41T226bQBT0H1f5hf5DHypVitQf6B/0uarkRIqqVGoSuzYYWPbK3oDl4g4QO9jhoaMVe4CdPXNmz66OIciCKMGttX3fH/8Pbdti8cp3Pa1CVVV1XYcQ+hFN1yN2Rhlj8Kt/B2tsCM2q6zrQ0iTRWiNoRoBwZ1spJRfCl+ViciwbyFj6sP7JOYPycoST0kcRe3oSz88+jo+cvw0hLsjeu8e7H5zR8gSf55UxCczgImU8ZUIpBSEgDPwzeZqi/Y7SCzKMFJLnXFCpfAhvcq/IMOolpVmaUPqqfCKrIs8LkxWGKI3AOde07TtyHX495FlGsiyDvDOZ54ckSfCxUAWY3vt2gVxV9+s1FlHG5rI96m46HTo8LU5v6oIrMvaD2jAHLEVmsk8OQ2bYwRgTQixkDk1DyKC5OMERMmSu/TzzsmHolSiKxHaDwibZJk2HzOl2yoxDciMWMt+b6uvjy5e/+W0sPyca41vMWULkfsejgybUEGoJXWgSTN9V+enP/uZ3fLNVH8bxcad2dZfnVGtjrZusuro2Z9mBUVRNYMtrzc7hO3wCn3OBtp/fOVyBC3K82eBIwUd5w1LnjC+lL21ZuapeHOiOFfbDDHFmwhAMTYYQu2glNN5PRs6BzP8Ad+XLrdxPZewAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Rollbar error alerts in a Cisco Spark space&quot;
        title=&quot;&quot;
        src=&quot;/static/spark-01-099c311caf247133316e645d143f3315-e9535.png&quot;
        srcset=&quot;/static/spark-01-099c311caf247133316e645d143f3315-d32c5.png 216w,
/static/spark-01-099c311caf247133316e645d143f3315-06f31.png 432w,
/static/spark-01-099c311caf247133316e645d143f3315-e9535.png 864w,
/static/spark-01-099c311caf247133316e645d143f3315-ab1f5.png 1296w,
/static/spark-01-099c311caf247133316e645d143f3315-7539a.png 1728w,
/static/spark-01-099c311caf247133316e645d143f3315-69d58.png 1800w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;As always, you can customize what alert notifications Rollbar should send. You can also configure which space in Cisco Spark the alerts should go to. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cisco Spark integration settings in Rollbar:&lt;/strong&gt;

  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 85%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsSAAALEgHS3X78AAAB4UlEQVQ4y52TS2/TQBSF8/eRqGhBLJAQkJYNGwSEFkFViQWBLvpIVMoGQRCO69jxjOfpedrm+qG6NKEgrq68Ot/cc8+MBydfvj94tn93Z2/j8eje0zd3hq+3dvbgu7m9uznc3XgyuvXwxWVvDUf3t1+C7PajV+dffw6CKD04PHs3njY9efthsv9xelOPO8E8Wg6qqsqNF8rn2kvlMKFcqVwZbVx1pYwxnHEp86NvOELCWOucq2HC5CLBQjloVzhMRZxmCFMAtNZFUYDGe28bYBYLIrRrqoGFTakBUirf6oQQGcZJsmSMwxHVuurhYKkws8BXf6uY6OH7H+cB7WAu7SIVLWysQxlz3v8JLsFaUZRlebmzChaZyGvb3tWeGWOUUtvU88PgJtswOcGyhSEUpW31D9XBDGwjwaUBWBuLKceEwxWs8VyW4CibzdincR9YQrq0YXIYJfOLOEkxIhzOugZzzmkQiJPjfnJKciBbeB7FKSaM5zCfcnkNhjgIwNPTDqbCXSDNZDPZ+ThByxSHUQwOQQqiqzDEycOwn1yWfXtfpCjjAvJTxtjVnaWUAPPjow7+LUPvkxTBAwcWPIN6defa9uR0DQyPBNJCGc2ogJ1XJ9eBhaH8fFbD7Vv5j4If5hcFmL2RLs/1CQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Rollbar settings page to configure alerts to send to Cisco Spark&quot;
        title=&quot;&quot;
        src=&quot;/static/spark-02-57ee5278b1f6a89f119f93658c4a18ca-e9535.png&quot;
        srcset=&quot;/static/spark-02-57ee5278b1f6a89f119f93658c4a18ca-d32c5.png 216w,
/static/spark-02-57ee5278b1f6a89f119f93658c4a18ca-06f31.png 432w,
/static/spark-02-57ee5278b1f6a89f119f93658c4a18ca-e9535.png 864w,
/static/spark-02-57ee5278b1f6a89f119f93658c4a18ca-ab1f5.png 1296w,
/static/spark-02-57ee5278b1f6a89f119f93658c4a18ca-7539a.png 1728w,
/static/spark-02-57ee5278b1f6a89f119f93658c4a18ca-69d58.png 1800w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;For more instructions on how to enable this integration for your account, check out our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/ciscospark/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Docs page&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Please feel free to reach out if you have any questions!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and reduce production issue resolution times.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the Rollbar Team - Francesco Crippa (Director of Engineering)]]></title><description><![CDATA[Our Director of Engineering, Francesco Crippa, has been making waves since he joined us in January. Originally from the north of Italy…]]></description><link>https://rollbar.com/blog/meet-the-team-francesco/</link><guid isPermaLink="false">https://rollbar.com/blog/meet-the-team-francesco/</guid><pubDate>Tue, 27 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Our Director of Engineering, Francesco Crippa, has been making waves since he joined us in January. Originally from the north of Italy, Francesco worked in Ireland before coming to San Francisco almost five years ago. In addition to programming, he also builds light installations and dabbles in photography.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 133.33333333333331%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAIDBAUB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQID/9oADAMBAAIQAxAAAAFJ4GjTQKRWebInUumYD//EABwQAAIDAQADAAAAAAAAAAAAAAECAAMSESIjMf/aAAgBAQABBQIAwn2I/RrjYxFPA5MZi1ddlOPqt4pP/8QAGBEAAgMAAAAAAAAAAAAAAAAAARACEUH/2gAIAQMBAT8BEVeL/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREP/aAAgBAgEBPwFvLCn/xAAdEAACAQQDAAAAAAAAAAAAAAAAAREQITFxAiJB/9oACAEBAAY/AtEvEUyXdeMneUx7Le0//8QAHRAAAgMAAwEBAAAAAAAAAAAAAREAIUExUWEQsf/aAAgBAQABPyE4sDgzHe0qXo7hNiJWO4tykDuUg4hQGTUgKcKBg6rfZqwPyeFr5//aAAwDAQACAAMAAAAQRNYP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQBRMf/aAAgBAwEBPxAUHZ7DF2QX/8QAGREBAQEAAwAAAAAAAAAAAAAAAREAECFB/9oACAECAQE/EI9cIQz3NN3/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMVFBcfBh/9oACAEBAAE/EEnhhe16gdFXpfEsbAVkuDi2ynmnuKK5AW1HghWiBzYzii2nv64iUb4vIHmEumg2U4+dRKG8X5eoMMke0OJ//9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;francesco&quot;
        title=&quot;&quot;
        src=&quot;/static/francesco-54b7d297edc211809324d1d940d13884-c69aa.jpg&quot;
        srcset=&quot;/static/francesco-54b7d297edc211809324d1d940d13884-2c497.jpg 216w,
/static/francesco-54b7d297edc211809324d1d940d13884-ec3f2.jpg 432w,
/static/francesco-54b7d297edc211809324d1d940d13884-c69aa.jpg 864w,
/static/francesco-54b7d297edc211809324d1d940d13884-d53dc.jpg 1296w,
/static/francesco-54b7d297edc211809324d1d940d13884-25865.jpg 1728w,
/static/francesco-54b7d297edc211809324d1d940d13884-98e27.jpg 2592w,
/static/francesco-54b7d297edc211809324d1d940d13884-6bff7.jpg 3024w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Francesco began working professionally as a programmer after his first year of studying software engineering in college; first at small startups, and then he founded his own. This eventually led to working in Rome at the National Bank of Italy. The day he moved to Rome is the first day he ever even visited Rome. It took three and a half years there before Francesco realized he simply didn&apos;t fit in Italy and decided to seek adventure outside his home country. He didn&apos;t speak English well, so he did freelance consulting around the world, traveling constantly to many different places (including some unusual countries like Saudi Arabia, Lichtenstein, and Albania, to name a few).&lt;/p&gt;
&lt;p&gt;Eventually, Francesco figured it was time to leave Italy for good, and began working for EMC in Ireland, living in Cork. Because of cultural and linguistic barriers, Francesco describes that first year in Ireland as one of the toughest years of his life (and the Irish weather didn&apos;t help either). After three years he was ready to move on and almost accepted an offer for a job in Finland. But at that point Michelle, an Irish woman he met in Cork, entered the picture. The day before he was supposed to fly to Finland, Francesco got a call from a recruiter for Cisco, in Galway. It took less than 24 hours for him to accept the job with Cisco in order to stay in Ireland, and they eventually ended up getting married.&lt;/p&gt;
&lt;p&gt;Francesco moved out to San Francisco to help Cisco build its own new cloud collaboration platform (Cisco Spark) from the ground up. After many years spent working in the enterprise market (along with a brief adventure in the consumer space with Zillow) he decided it was time to look for a small, fast growing and thoughtful company, where he could get back to one of his passions: building products to help every engineer to get better and be more effective every day. This led him to Rollbar, and the rest is history.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;I can&apos;t believe we have tools, devices and apps that make our life so easy and smooth, but when it comes to debugging the software that powers almost every aspect of our life we&apos;re left with old debug tools and log files... The tech industry empowered so many people in getting better and reinventing the way we work. It&apos;s time we help our engineers and the industry itself do the same.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We&apos;re very excited to have Francesco on the team here at Rollbar!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Announcing Our New .NET Error Monitoring SDK]]></title><description><![CDATA[Rollbar is happy to announce our official  .NET error monitoring SDK . This new .NET SDK is more rreliable, supports all of the popular .NET…]]></description><link>https://rollbar.com/blog/net-notifier-sdk/</link><guid isPermaLink="false">https://rollbar.com/blog/net-notifier-sdk/</guid><pubDate>Mon, 12 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Rollbar is happy to announce our official &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.net/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;.NET error monitoring SDK&lt;/a&gt;&lt;/strong&gt;. This new .NET SDK is more rreliable, supports all of the popular .NET platforms (NET Standard, .NET Framework, .NET Core, ASP.NET MVC, UWP, Mono, Xamarin), easy to configure, multithreading friendly, and more.&lt;/p&gt;
&lt;p&gt;Rollbar helps you monitor errors in production applications. It provides you with a live error feed from your applications, including complete stack traces and contextual data to debug errors quickly. It also lets you easily understand your user experience by tracking who is affected by each error. Check out our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/features/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;features&lt;/a&gt;&lt;/strong&gt; page to learn more about how it can help you.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 28.17777777777778%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABXUlEQVQY012QMU7DMBSGMzBzCQYk7sAVuAZcgY0rgDogRhYWhGCAIlSEVcFSCYSq0qFQmnbANGmSJnbsxHb68xqkImHp1y8/P33v9/NGgebvXPGl+6QwNXyxWHDnHFdKcWPMypcqy3LlVVXVvcZWXBWW69Jxr/ka4/olxi35XTdBb5JjeaxzGH7HaA9DPPRGmEURJlGG894XEiGRpikIWvcSdCVPKIPCOBAdxlgopesHaSpsNTrYa42xdtBCc1pi9zHE9sUnTPUH0FpjnsyR53k9wIv8Z1B0UOQaFlKKRBg0nsbYOOwg0g7rx13s3EywSQPOBvMVrLAOmVQIg6AGW2vhuekvsKSUrtDQmUCuLY7uB7jsz6Bp0OlbhP2rPk7aH/Xg5btzFQytRRclpJT0O0M1B8/3fUZ0loqcCSHYLE7ZLJEsIsVzSXfJZK7qnv8SVE/SjAVBwLIsY7RX9gNYObf3FNSrugAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;.NET errors screenshot&quot;
        title=&quot;&quot;
        src=&quot;/static/dotnet-30b8b09dfcb807f9a57382f284b5daee-e9535.png&quot;
        srcset=&quot;/static/dotnet-30b8b09dfcb807f9a57382f284b5daee-d32c5.png 216w,
/static/dotnet-30b8b09dfcb807f9a57382f284b5daee-06f31.png 432w,
/static/dotnet-30b8b09dfcb807f9a57382f284b5daee-e9535.png 864w,
/static/dotnet-30b8b09dfcb807f9a57382f284b5daee-ab1f5.png 1296w,
/static/dotnet-30b8b09dfcb807f9a57382f284b5daee-7539a.png 1728w,
/static/dotnet-30b8b09dfcb807f9a57382f284b5daee-ddd13.png 2592w,
/static/dotnet-30b8b09dfcb807f9a57382f284b5daee-53ddd.png 3375w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
.NET error monitoring, as seen in Rollbar&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;improvements&quot;&gt;&lt;a href=&quot;#improvements&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Improvements&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Multi-target support including .NET Standard 2.0 and up, .NET Framework (or Full Framework) 4.5 and up, and .NET Core 2.0 and up. It also supports UWP, Mono, and Xamarin.&lt;/li&gt;
&lt;li&gt;Native asynchronous (“fire-and-forget”) implementation.  Due to its async nature the SDK has very little impact on its host at runtime. A blocking (synchronous) implementation of the same methods is also available.&lt;/li&gt;
&lt;li&gt;Rate limiting and buffering of all messages.&lt;/li&gt;
&lt;li&gt;Automatic retries in case of network failure.&lt;/li&gt;
&lt;li&gt;Person information is now a part of a notifier configuration object, including field scrubbing for privacy.&lt;/li&gt;
&lt;li&gt;Improved interface by separately defining ILogger and IRollbar. ILogger also now supports chaining calls.&lt;/li&gt;
&lt;li&gt;Multiple instances of the notifier can be separately and differently configured, including different access tokens.&lt;/li&gt;
&lt;li&gt;Easier configuration including support for app.config and appsettings.json files.&lt;/li&gt;
&lt;li&gt;Subscribe to receive any internal operational/communication event or an error happening within the notifier.&lt;/li&gt;
&lt;li&gt;More usage samples and sample apps.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;upgrading&quot;&gt;&lt;a href=&quot;#upgrading&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Upgrading&lt;/h2&gt;
&lt;p&gt;The public API of our notifier v1 is not backward compatible with the pre-v1 releases. However, the conversion/upgrade process is very straightforward by using find-and-replace tools across your code base.&lt;/p&gt;
&lt;p&gt;You should change your config from the old version:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;Rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RollbarConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;POST_SERVER_ITEM_ACCESS_TOKEN&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;to&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;RollbarLocator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RollbarInstance
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Configure&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RollbarConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;POST_SERVER_ITEM_ACCESS_TOKEN&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Environment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Additionally, anywhere in your code that you were sending error reports via&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;Rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Report&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;trying out an error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;NullReferenceException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
Rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Report&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;basic info log example.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Will need to be replaced with something like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;RollbarLocator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RollbarInstance&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;trying out an error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;NullReferenceException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
RollbarLocator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RollbarInstance&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;basic info log example.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Learn more in our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.net/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;documentation for .NET&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and stop flying blind in production.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the Rollbar Team - Ali Shakiba (Software Engineer)]]></title><description><![CDATA[Ali Shakiba is an invaluable asset to our engineering team. Originally from Ahvaz, Iran, Ali came to America for graduate school and then…]]></description><link>https://rollbar.com/blog/meet-the-team-ali/</link><guid isPermaLink="false">https://rollbar.com/blog/meet-the-team-ali/</guid><pubDate>Sat, 10 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ali Shakiba is an invaluable asset to our engineering team. Originally from Ahvaz, Iran, Ali came to America for graduate school and then joined us here at Rollbar last November.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 256px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMEBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIDAf/aAAwDAQACEAMQAAAB6cbwO6gswzLT0Ca//8QAGxABAAICAwAAAAAAAAAAAAAAAgESAAMQETH/2gAIAQEAAQUCaqTsdsXhrfFMzwVPX//EABURAQEAAAAAAAAAAAAAAAAAAAEg/9oACAEDAQE/ASP/xAAXEQADAQAAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/AXMGf//EABwQAAEDBQAAAAAAAAAAAAAAAAEAAiEQESBBUf/aAAgBAQAGPwK6AeBPKStY/wD/xAAbEAEAAgIDAAAAAAAAAAAAAAABABEQMSFBYf/aAAgBAQABPyGzraaISpeIvAF9IUCgmsKNstXc9Sf/2gAMAwEAAgADAAAAEA/P/wD/xAAYEQEBAAMAAAAAAAAAAAAAAAABABARIf/aAAgBAwEBPxACLjbDy//EABgRAQADAQAAAAAAAAAAAAAAAAEAEBEh/9oACAECAQE/EEiFYw5AbP/EABwQAAICAwEBAAAAAAAAAAAAAAERADEQIUFRYf/aAAgBAQABPxBFJF6ElCM2zYEeMeYBadb+RiqtL1zAGInQqACSWqgaE6Gzc//Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;ali&quot;
        title=&quot;&quot;
        src=&quot;/static/ali-d8757ba6fb3cc617135087fd1665c3d2-983fe.jpg&quot;
        srcset=&quot;/static/ali-d8757ba6fb3cc617135087fd1665c3d2-17276.jpg 216w,
/static/ali-d8757ba6fb3cc617135087fd1665c3d2-983fe.jpg 256w&quot;
        sizes=&quot;(max-width: 256px) 100vw, 256px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Ali taught himself how to program in high school, learning BASIC to create his own video games. This led to him majoring in Software Engineering at Isfahan University of Technology in Isfahan, Iran. After college, he decided to get his Master&apos;s in Computer Science in America. After graduation, Ali came to San Francisco and eventually joined Rollbar.&lt;/p&gt;
&lt;p&gt;Ali loves that here at Rollbar he gets to build a tool that helps other developers build things. Prior to joining Rollbar, Ali had been working on some &lt;a href=&quot;https://github.com/shakiba/planck.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;open source developer-focused tools&lt;/a&gt; &lt;a href=&quot;https://github.com/shakiba/stage.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;of his own&lt;/a&gt;, and he&apos;s excited to continue getting to work on helping developers build their products. He decided to join Rollbar because &quot;it is very exciting that we are at center of the developer community and closely connected to them&quot;, and because it feels almost like you get to &quot;be a member of all engineering teams that use Rollbar to make better and more reliable products.&quot;&lt;/p&gt;
&lt;p&gt;In the future, Ali plans to work with engineering, product, and design to extend Rollbar&apos;s reporting and analytics functionality in order to provide users deeper and wider insight into the data that they report to Rollbar.&lt;/p&gt;
&lt;p&gt;We&apos;re delighted to have Ali on the team here at Rollbar!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[New Integration - Auto-create Clubhouse stories with error data from Rollbar]]></title><description><![CDATA[At Rollbar, we use  Clubhouse   to manage our software projects.  One of the many ways we use it is for tracking issues in product releases…]]></description><link>https://rollbar.com/blog/clubhouse-integration/</link><guid isPermaLink="false">https://rollbar.com/blog/clubhouse-integration/</guid><pubDate>Fri, 09 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At Rollbar, we use &lt;strong&gt;&lt;a href=&quot;https://clubhouse.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Clubhouse&lt;/a&gt;&lt;/strong&gt; to manage our software projects.  One of the many ways we use it is for tracking issues in product releases. We&apos;d have an epic in Clubhouse for each release, and create stories for bugs associated with the release that we need to fix.  This is especially useful when we&apos;re working on service packs.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p class=&quot;highlightbox&quot;&gt;
If you&apos;re not familiar, Clubhouse is a project and product management software designed for agile software teams.  We&apos;ve written about &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/customers/clubhouse/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;how Clubhouse uses Rollbar&lt;/a&gt;&lt;/strong&gt; and published &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/how-clubhouse-does-javascript-error-logging-and-monitoring/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;an interview with Andrew Childs&lt;/a&gt;&lt;/strong&gt;, their CTO and Co-founder, on our blog. 🚀&lt;/p&gt;
&lt;p&gt;With this integration, you can now automatically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a story in Clubhouse for a Rollbar error, based on rules you set&lt;/li&gt;
&lt;li&gt;Include in the story the stack trace and a link to the error details data in Rollbar&lt;/li&gt;
&lt;li&gt;Mark the story resolved in Clubhouse when it&apos;s resolved in Rollbar&lt;/li&gt;
&lt;li&gt;Change the status of a Clubhouse story when an error is re-activated&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Clubhouse integration settings in Rollbar:&lt;/strong&gt;

  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 108.38888888888889%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAYAAADAQbwGAAAACXBIWXMAAAsSAAALEgHS3X78AAACQklEQVQ4y5VV2W7UQBDMf/PAVyDBByAE4g945A3yCIQoWfbwfay9vtdn0dWJHUeElT1SacdjT3VXdc/sVd/3wxq0bTshr5rBjcshLeqhaZqh67rhih+Vd7+wObi42Zi43VqomxbDMLyIMAzheR5c18X1XYD3X/f4dusiSRIIKZSQHwo70jRFWZa6KYoixHGsz3zXn8//DTKHEkJGVVU4nU76SxJZn8BAXZZhyVBCZkAypk2yPM9xloyIkXwVISdZmilhURST5JGcAVuR38h6dTigMk1Fuduhk/f/EFJ7XddKQgLf95WM8vnMAGOGImfaPJ8/I6Qkx3ZgWZZKPzALIRsJWdXVkjmKvFDJtm3Dk7ZgG1CuShY7FhPGSSa91+gCs5WmVdCKSZ6sLybMJTMWhO1BcJ6JRM5ZLNpAf+cBLhJSmuM46tWSTfPx/T7Cqw8/8Prjz3lRBpHYTd2+ZugpY58+WqKEYZTADWIUZTUVYUQjge7dbHGARw9z9Ww8LbH80gYiSgu8+7LRotRSebZPJ51Q7feoDAOVtFpzjJ4T1toe/aLDP0cr5C9eDklWIBe5cw+XeHmWE6XWSIvVtoVeTpcSBscYW8PG9mDDtF1sdib2pqOeXhpsK9p0DAKEnz+h2v55Korh+DBsH15whOkEsNxAm/ySZPVbLo3A8+G+fYPy980DYSse8iURyEXAqIzOC+OihyJViyfflbut3jxPkkWuYXvYi/SdIJDKccNqyfxz4UXKS4Fg+7CNiuLh+mKWa/AXmAaxxhyPelkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Rollbar setttings page for Clubhouse integration&quot;
        title=&quot;&quot;
        src=&quot;/static/ch-1-9356d86ea624d4221c68cbaf4c57ea1f-e9535.png&quot;
        srcset=&quot;/static/ch-1-9356d86ea624d4221c68cbaf4c57ea1f-d32c5.png 216w,
/static/ch-1-9356d86ea624d4221c68cbaf4c57ea1f-06f31.png 432w,
/static/ch-1-9356d86ea624d4221c68cbaf4c57ea1f-e9535.png 864w,
/static/ch-1-9356d86ea624d4221c68cbaf4c57ea1f-ab1f5.png 1296w,
/static/ch-1-9356d86ea624d4221c68cbaf4c57ea1f-7539a.png 1728w,
/static/ch-1-9356d86ea624d4221c68cbaf4c57ea1f-69d58.png 1800w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clubhouse story from a Rollbar error:&lt;/strong&gt;

  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 70.22222222222221%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsSAAALEgHS3X78AAAB8klEQVQ4y42TWZOiQBCE+f8/S2c35tAVQgHFA7lBUE5FX6itLIXZCWN29yGjD+XrrOxq5Xa7dZfLpbter10Lta2ssY89CHPst495/03TNF+U53mnVEnc/RqPaToa0eznK83eNPr4MaW3lym9jt95nNDsXSNrMiFbN8iaTqkKAirDkAIez+ez6Hg80ul06pS2KLp4t6N4u31oRwmvM8eRjwpWGUXUlCXVRSG6VJWsI95/gGTM86JTYD9JEjJNk+bzOS0WOhmGQbqu03q9Js/zaMcHbDYbsnm0bVsAcKV6I8qyjOq6FpVl+QkEbLlcCqSXZVnkuq6UBrDHc9/32UkuQGMfDuuKXQ8OD4cDWasVqaoqYDiEI8BChmHc7/fkOHuZ9w59cyGlPjmM41hKBExVNQFuOU+U53CWgAEkLlmAAOj699+egGmaDrkB2rvE2mDBre8HhIMhlAegaW8kmicgcgAAF6NpmoAwX3EM2EeW+E/Ktwog96AAEVXIXYAMvwBxU3CJP3IDf6ua86wZ0D4cAtbfclWVVHALKngBOIFfBDH8r7o2DbX88e3S3oFJMPTh4BBAx3Nk81/APwVgdIgILYdM+endgXiraZZKHrD/30AGIGO8Fi71E8gndWgP1/WGHL8TysLBcATh5gNcCgMZJhn+BpI2F5PStBVuAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Clubhouse story showing Rollbar data&quot;
        title=&quot;&quot;
        src=&quot;/static/ch-2-b950cbe8fb8cd3d216f16fefa84022b6-e9535.png&quot;
        srcset=&quot;/static/ch-2-b950cbe8fb8cd3d216f16fefa84022b6-d32c5.png 216w,
/static/ch-2-b950cbe8fb8cd3d216f16fefa84022b6-06f31.png 432w,
/static/ch-2-b950cbe8fb8cd3d216f16fefa84022b6-e9535.png 864w,
/static/ch-2-b950cbe8fb8cd3d216f16fefa84022b6-ab1f5.png 1296w,
/static/ch-2-b950cbe8fb8cd3d216f16fefa84022b6-7539a.png 1728w,
/static/ch-2-b950cbe8fb8cd3d216f16fefa84022b6-69d58.png 1800w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;To get started, check out this &lt;strong&gt;&lt;a href=&quot;https://help.clubhouse.io/hc/en-us/articles/360000102963-Setting-Up-the-Rollbar-Integration&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;integration guide&lt;/a&gt;&lt;/strong&gt; from Clubhouse.&lt;/p&gt;
&lt;p&gt;Let us know if you have any questions, or tell us what you think!  &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and stop flying blind in production.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introducing the Account Dashboard 📉]]></title><description><![CDATA[We are excited to release our new Account Dashboard! The Account Dashboard gives your engineering team insight into errors across multiple…]]></description><link>https://rollbar.com/blog/announcing-account-dashboard/</link><guid isPermaLink="false">https://rollbar.com/blog/announcing-account-dashboard/</guid><pubDate>Wed, 07 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are excited to release our new Account Dashboard! The Account Dashboard gives your engineering team insight into errors across multiple Rollbar projects. This insight provides an overview of how each application and service is performing, so you can quickly identify and drill down into problem areas and error trends.&lt;/p&gt;
&lt;video controls autoplay loop width=&quot;100%&quot;&gt;
&lt;source src=&quot;/assets/rollbar-account-dashboard.mp4&quot; type=&quot;video/mp4&quot;&gt;
Your browser does not support the video tag.
&lt;/video&gt;
&lt;!--more--&gt;
&lt;br&gt;
&lt;p&gt;In today’s microservices world, applications consist of multiple services that interact together to deliver the full user experience. There is the client side of the application that the user typically sees, which may be a webpage or mobile app. Behind that, there may be an application server and multiple API services, often owned by separate development teams. This makes the job of monitoring more complex because you need to monitor all the services at once. Errors or a loss of availability in any one service can result in cascading failures to downstream services, and ultimately the user.&lt;/p&gt;
&lt;p&gt;Check out what Jason Kozemczak, Tech Lead at &lt;strong&gt;&lt;a href=&quot;/customers/instacart/&quot;&gt;Instacart&lt;/a&gt;&lt;/strong&gt; had to say about the Account Dashboard.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Account Dashboard makes it even easier than before to understand the overall health of the Instacart product as well as individual teams/systems that make up Instacart. It also makes it dead simple to know where our engineering time has the highest leverage regarding issues affecting our customers and shoppers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Account Dashboard displays the number of error occurrences over time for each project. This allows you to see if problems are primarily affecting a single Rollbar project or multiple projects. If two projects display a correlated pattern, they may be related to the same root issue. You can also compare each project to the previous 24 hours to see if there was a recent change, such as after a recent code deployment.&lt;/p&gt;
&lt;p&gt;You can narrow down problems by filtering on specific &lt;code&gt;Frameworks&lt;/code&gt;, &lt;code&gt;Environments&lt;/code&gt;, or error &lt;code&gt;Levels&lt;/code&gt;. You can also see more detail on the total number of &lt;code&gt;Occurrences&lt;/code&gt;, &lt;code&gt;Activations&lt;/code&gt; of new errors, as well as the number of code &lt;code&gt;Deploys&lt;/code&gt; made.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 57.073340285019114%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABMElEQVQoz5VSzUoDMRDug/WwF3vp6/QuiIgILajoM3gRPQi+RdmbSikUCl5kd6v5m59kdTZJV7H14DAZ5icfM/kmg8//CzM7IHEGciyGl1e70VjXtY0CAHUUrXXylVIpX1VV8jOYmJEoWm7/EL+VEEKf7MAOwAE6Y0V/AgLzLpiVkrEFlcGE6LUOAN5ab4xXqrPGrJfL57J8ms/Fiq4XC0mG95W8gr3PYETMreJI/WAnR4ejg9FwOByPx0VRTCYTSSoLm6ZJd3Lnlm3LLqAWJ1nRx4e7q4vZ9Oz4+nJ2Pj29v73pqh4T51swUWrF8ZEUaeu5SdVfd74JM8bs0iv5RnO50m8flFoBBUehW60w4n1eFcRF7f0PxhEA9iFS2labwkyYbH8vuGkaqfZh+hu9fAG0l3Lnv0tmnAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Dashboard link&quot;
        title=&quot;&quot;
        src=&quot;/static/dashboard-link-8749119f44c214d63c1821b5c2823f8f-e9535.png&quot;
        srcset=&quot;/static/dashboard-link-8749119f44c214d63c1821b5c2823f8f-d32c5.png 216w,
/static/dashboard-link-8749119f44c214d63c1821b5c2823f8f-06f31.png 432w,
/static/dashboard-link-8749119f44c214d63c1821b5c2823f8f-e9535.png 864w,
/static/dashboard-link-8749119f44c214d63c1821b5c2823f8f-ab1f5.png 1296w,
/static/dashboard-link-8749119f44c214d63c1821b5c2823f8f-7539a.png 1728w,
/static/dashboard-link-8749119f44c214d63c1821b5c2823f8f-ddd13.png 2592w,
/static/dashboard-link-8749119f44c214d63c1821b5c2823f8f-41460.png 2877w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Account Dashboard, as seen in Rollbar&lt;/p&gt;
&lt;p&gt;Account Dashboard is available on the &lt;strong&gt;&lt;a href=&quot;/pricing/&quot;&gt;Growth&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;/pricing/&quot;&gt;Premium&lt;/a&gt;&lt;/strong&gt; plans. We hope that you and your team will save time in your day-to-day debugging efforts with the new Account Dashboard. We appreciate your feedback. &lt;strong&gt;&lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Email us&lt;/a&gt;&lt;/strong&gt; and let us know what you think.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you
take control of your software application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Debugging JavaScript with Source Maps]]></title><description><![CDATA[One of the frustrating situations I often encounter when debugging JavaScript, is tracking down  JavaScript errors  to  line 23 col 6347…]]></description><link>https://rollbar.com/blog/source-maps-in-production/</link><guid isPermaLink="false">https://rollbar.com/blog/source-maps-in-production/</guid><pubDate>Tue, 06 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of the frustrating situations I often encounter when debugging JavaScript, is tracking down &lt;strong&gt;&lt;a href=&quot;/error-tracking/javascript/&quot;&gt;JavaScript errors&lt;/a&gt;&lt;/strong&gt; to &lt;strong&gt;&lt;em&gt;line 23 col 63475&lt;/em&gt;&lt;/strong&gt;. I felt as though I was right on the edge of seeing the offending code and being able to fix it. And then, reality came crashing down. I realized that I’ve managed to debug myself right into the middle of a minified JavaScript file 😞.&lt;/p&gt;
&lt;p&gt;There is a better way - Source Maps. JavaScript source maps are the key to taking what you’ve narrowed down in the minified code, and then being able to map them back to the source code so that you can view and resolve the problem without having to figure it out in the minified code.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.html5rocks.com/en/tutorials/developertools/sourcemaps/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Source maps&lt;/a&gt;&lt;/strong&gt; are generated when JavaScript code is minified. By using the source map in production, you can trace your problems back to the exact line of source code. It also allows you to use your browser&apos;s developer console to step through the source code when debugging problems. We’ll look at how to generate a source map, and then we’ll look at how they work, and how we can use them to make our lives easier.&lt;/p&gt;
&lt;p&gt;You can download or clone the source for the following demo from &lt;strong&gt;&lt;a href=&quot;https://github.com/echovue/javascript-calculator&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://github.com/echovue/javascript-calculator&lt;/a&gt;&lt;/strong&gt;. The source includes the original JavaScript file, the minified JavaScript file, and the source map. If you already know how to generate a source map or just want to use the generated file, you can skip down to &lt;strong&gt;&lt;a href=&quot;#how-do-source-maps-work&quot;&gt;How Do Source Maps Work?&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;generating-a-source-map&quot;&gt;&lt;a href=&quot;#generating-a-source-map&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Generating a Source Map&lt;/h2&gt;
&lt;p&gt;For this example, I’m going to be using a simple JavaScript application. Keeping it simple will help keep the demo manageable, and the concepts apply to any application, no matter the size.&lt;/p&gt;
&lt;p&gt;The first thing that we’ll need is a tool to minify the code. I’m going to use &lt;code&gt;UglifyJS&lt;/code&gt;, but most tools should support the ability to generate a production source map as part of the minification process. You can install &lt;code&gt;UglifyJS&lt;/code&gt; with npm if you have that installed on your workstation.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;$ &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; uglify-js -g
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You can then validate installation by executing the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;$ uglifyjs --version
uglify-js 3.2.0
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;In some cases, you may have to add the installation folder to your path.&lt;/p&gt;
&lt;p&gt;Now that we have &lt;code&gt;uglifyjs&lt;/code&gt; installed and we’ve verified that it works, let’s minify our code. If you’re using the example project, this command will overwrite the existing minified file and source map.&lt;/p&gt;
&lt;p&gt;From the JS folder of the demo project, enter the following command.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;$ uglifyjs calculator.js --compress --mangle --source-map --output calculator.min.js
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;This command takes our JavaScript file &lt;code&gt;calculator.js&lt;/code&gt; and converts it to a minified version &lt;code&gt;calculator.min.js&lt;/code&gt;, along with a source map &lt;code&gt;calculator.min.js.map&lt;/code&gt;. Even with this small file, the minification process reduces the size of the file from 4KB to 1KB.&lt;/p&gt;
&lt;h2 id=&quot;how-do-source-maps-work&quot;&gt;&lt;a href=&quot;#how-do-source-maps-work&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How do Source Maps Work?&lt;/h2&gt;
&lt;p&gt;Let’s open up the source map file to see what it has in it. I used a JSON parser to format it for easy reading, and shortened some of the lines with ellipses as well.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-json&quot;&gt;&lt;code&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;version&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;sources&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;calculator.js&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;names&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;resultNum&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;operator&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;el&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;charAt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;querySelector&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;...&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;mappings&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; CAAC&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;WACC&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;aAyGA&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;IAAK&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;IAvFHA&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;EACAC&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;EAhBEC&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;EAAK&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;SAASC&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;GAChB&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;MAA0B&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;MAAtBA&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The file specifies the mapping version used and identifies the source files and names of parameters. The useful part is the mappings, although unfortunately since they are in Base 64 VLQ, they’re not very useful for the human brain.&lt;/p&gt;
&lt;p&gt;If you’d like to understand more about how the mappings work, and how they translate the minified code back to the source, I’d recommend reading &lt;strong&gt;&lt;a href=&quot;http://www.mattzeunert.com/2016/02/14/how-do-source-maps-work.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;How do source maps work&lt;/a&gt;&lt;/strong&gt;. For now, let’s look at how to leverage the source map in production to make debugging easier.&lt;/p&gt;
&lt;p&gt;If you open the &lt;code&gt;index.html&lt;/code&gt; in Chrome or your browser of choice, you’ll notice that there is a JavaScript error which is thrown on the first line of our minified file. Let’s make it easier to identify and resolve this.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 12.02020202020202%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAXklEQVQI142MQQqAIBREu//dhHCToSYtDC0FDyC8vgWtWzz+MDN/pu48aA1KgRc9z2At7Ds4ByG8engxQmsPWbJBlfyUv3F7rUxPISX6spCN4ZDxsq4UKVzb9g385QYMBpX5pQCJgwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Uncought TypeError: can not set property&quot;
        title=&quot;&quot;
        src=&quot;/static/can-not-set-property-6de98beaf35115ac0c7953ec1382f1eb-e9535.png&quot;
        srcset=&quot;/static/can-not-set-property-6de98beaf35115ac0c7953ec1382f1eb-d32c5.png 216w,
/static/can-not-set-property-6de98beaf35115ac0c7953ec1382f1eb-06f31.png 432w,
/static/can-not-set-property-6de98beaf35115ac0c7953ec1382f1eb-e9535.png 864w,
/static/can-not-set-property-6de98beaf35115ac0c7953ec1382f1eb-075ee.png 990w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Figure 1. Error within the minified JavaScript file&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; To complete the next set of steps, you will need to have the JavaScript-calculator web application running on a publicly accessible web server. For this demo, I created an AWS instance, installed an Apache Web Server, and served the web application from there.&lt;/p&gt;
&lt;h2 id=&quot;working-with-source-maps-in-production&quot;&gt;&lt;a href=&quot;#working-with-source-maps-in-production&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Working with Source Maps in Production&lt;/h2&gt;
&lt;p&gt;When you’re debugging a production application, it gets trickier since production servers often don’t serve source maps. Do you want to make it easier for people you don’t know to see your raw source code? Fortunately, Rollbar supports using source maps to get meaningful stack traces while still using minified JavaScript in production.&lt;/p&gt;
&lt;p&gt;Rollbar provides real-time &lt;strong&gt;&lt;a href=&quot;/features/&quot;&gt;production error monitoring&lt;/a&gt;&lt;/strong&gt; with support for most programming languages and frameworks, including &lt;strong&gt;&lt;a href=&quot;/error-tracking/javascript&quot;&gt;JavaScript&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;/error-tracking/angular&quot;&gt;Angular&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;/error-tracking/node.js&quot;&gt;Node&lt;/a&gt;&lt;/strong&gt;, React, etc. Because &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;code&gt;rollbar,js&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; supports source maps, you can see the line of exact code where each error originated along with the stack trace. Let’s dive into an example of how it works.&lt;/p&gt;
&lt;p&gt;Once you have &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;created an account&lt;/a&gt;&lt;/strong&gt; and your first project, you’ll be given a client-side access tokens. Add the script included under the &lt;strong&gt;Quick start browser&lt;/strong&gt; section inside the &lt;code&gt;&amp;#x3C;HEAD&gt;&lt;/code&gt; tag in &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can upload your source maps via the &lt;strong&gt;&lt;a href=&quot;/docs/&quot;&gt;API&lt;/a&gt;&lt;/strong&gt;. Usually, we would use a script do this automatically at deployment time, but we will do it manually for this tutorial. From the root folder of the web application project, execute the following curl command after updating the access token and the minified_url to your token and URL:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;$ curl https://api.rollbar.com/api/1/sourcemap \
-F access_token&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;8888888888888888888888888 \
-F version&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;0.0.1 \
-F minified_url&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;http://ec2-52-43-138-168.us-west-2.compute.amazonaws.com/javascript-calculator/js/calculator.min.js \
-F source_map&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;@js/calculator.min.js.map \
-F calculator.js&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;@js/calculator.js
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Once that is done, clicking on an error should take you to a page with the stack trace. Here we can see the proper source code with files and line numbers.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 30.544896392939368%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAs0lEQVQY06VRXQ+DIAzk///LZcqHE42CAhW9UXUPJpsva3K0vbbXJogYI8ZxBFGGDxmRVkwxg5YVbl4wx4MbS0z54Bhc98XzzLZt+JjYC+FoYqF/TVBKSOVKvjRxfCKeXAjhwt+BiCDCMMArBSUVaiPx0E9UxSvmtIYusF0Hay2apsFQ+qdp+gpeLvhxzu3NLFi9JOpGwpScRY0xaNt2r7PoL7GLICf8MTzQ9z2897eDd4Jv8erQ3qrqHY8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Uncaught TypeError : Can not set property onClick null&quot;
        title=&quot;&quot;
        src=&quot;/static/Can-not-set-property-onClick-null-a56043a18aaa80d6ce30bce9190a4b07-e9535.png&quot;
        srcset=&quot;/static/Can-not-set-property-onClick-null-a56043a18aaa80d6ce30bce9190a4b07-d32c5.png 216w,
/static/Can-not-set-property-onClick-null-a56043a18aaa80d6ce30bce9190a4b07-06f31.png 432w,
/static/Can-not-set-property-onClick-null-a56043a18aaa80d6ce30bce9190a4b07-e9535.png 864w,
/static/Can-not-set-property-onClick-null-a56043a18aaa80d6ce30bce9190a4b07-ab1f5.png 1296w,
/static/Can-not-set-property-onClick-null-a56043a18aaa80d6ce30bce9190a4b07-2997c.png 1303w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Figure 2. Stack trace showing the original source code&lt;/p&gt;
&lt;p&gt;When you click the source file link, it will open to the file and line number in &lt;strong&gt;&lt;a href=&quot;/docs/source-control&quot;&gt;GitHub, BitBucket, or Gitlab&lt;/a&gt;&lt;/strong&gt;. There, you can use the tools to see what changes were made and when. To learn more, check out the &lt;strong&gt;&lt;a href=&quot;/docs/source-maps/&quot;&gt;source maps documentation&lt;/a&gt;&lt;/strong&gt; for additional details and config options.&lt;/p&gt;
&lt;h3 id=&quot;tips-for-using-source-maps-in-production-and-debugging-with-rollbar&quot;&gt;&lt;a href=&quot;#tips-for-using-source-maps-in-production-and-debugging-with-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tips for using source maps in production and debugging with Rollbar&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Don&apos;t forget to update the version number when you update your JavaScript. If you don&apos;t, the filename, line and column numbers will be incorrect. &lt;/li&gt;
&lt;li&gt;The value of &lt;code&gt;minified_url&lt;/code&gt; must be the full URL of the minified file. This should start with &lt;code&gt;http:&lt;/code&gt; or &lt;code&gt;https:&lt;/code&gt;, which we&apos;ll strip off.&lt;/li&gt;
&lt;li&gt;Make sure you&apos;re not missing one or both of the config params in the on-page JavaScript snippet. Set both &lt;code&gt;payload.client.javascript.source_map_enabled&lt;/code&gt; and &lt;code&gt;payload.client.javascript.code_version&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you&apos;re using the upload method, check to be sure that the &lt;code&gt;code_version&lt;/code&gt; used in the on-page snippet matches the version provided in the upload call.&lt;/li&gt;
&lt;li&gt;If you&apos;re using the download method, make sure your source map file or minified JavaScript source files are on a host that&apos;s reachable from the public internet and are not gated behind an authorization wall.&lt;/li&gt;
&lt;li&gt;If the JavaScript error that you are expecting to be un-minified does not have column numbers, and you haven&apos;t enabled &lt;code&gt;guess_uncaught_frames&lt;/code&gt;, we won&apos;t be able to apply the source map. We need column numbers to be able to apply the source map without guessing.&lt;/li&gt;
&lt;li&gt;If your source map file combines multiple sub-maps into &quot;sections&quot; within the top level map, we, unfortunately, don&apos;t yet support this source map format (but we are planning to soon).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;In conclusion, source maps help you debug production code right in your browser&apos;s developer console. They tell you the exact file and line number when there is an error, and make it natural to use the debugging feature within your browser to step through the code. This makes it much easier to find the root cause of problems and fix them quickly. When monitoring production systems, make sure to choose solutions like Rollbar that support source maps and make debugging production super easy.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of impactful JavaScript errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the Rollbar Team - Zachary Collins (Software Engineer)]]></title><description><![CDATA[We're happy to introduce software engineer Zachary Collins, who joined Rollbar in January. Originally from Conway, Arkansas, Zachary lived…]]></description><link>https://rollbar.com/blog/meet-the-team-zachary/</link><guid isPermaLink="false">https://rollbar.com/blog/meet-the-team-zachary/</guid><pubDate>Mon, 05 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;re happy to introduce software engineer Zachary Collins, who joined Rollbar in January. Originally from Conway, Arkansas, Zachary lived in Japan for two years before making his way back to San Francisco and eventually joining Rollbar.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 74.64788732394366%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDBP/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHPdkjcSF//xAAaEAEAAgMBAAAAAAAAAAAAAAABAgMAERMz/9oACAEBAAEFAj1olo6RCytnnByIh//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EAB0QAAIBBAMAAAAAAAAAAAAAAAABIQIRMqExUWH/2gAIAQEABj8C8RWnKYptBlHRno50f//EABsQAAICAwEAAAAAAAAAAAAAAAERACExQVGB/9oACAEBAAE/IQGYINcEyYiMVQjTkU1AcSgKoLUJl/E//9oADAMBAAIAAwAAABB/z//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPxCNf//EABcRAQADAAAAAAAAAAAAAAAAAAABESH/2gAIAQIBAT8QxUP/xAAcEAEBAAMAAwEAAAAAAAAAAAABEQAhMUFhkdH/2gAIAQEAAT8QsNHxyHXAxG0IgXXfNMivJuK+jkZRUqH24zWInC/ct+rz+g5//9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;zachary&quot;
        title=&quot;&quot;
        src=&quot;/static/zachary-90803e4ab2443e742936685786742a88-c69aa.jpg&quot;
        srcset=&quot;/static/zachary-90803e4ab2443e742936685786742a88-2c497.jpg 216w,
/static/zachary-90803e4ab2443e742936685786742a88-ec3f2.jpg 432w,
/static/zachary-90803e4ab2443e742936685786742a88-c69aa.jpg 864w,
/static/zachary-90803e4ab2443e742936685786742a88-edd89.jpg 1136w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Zachary taught himself how to program at the age of 10, in BASIC, in order to create his own video games. Finding he was quite adept at programming, he took the GED at 14 and began studying computer science and music at Hendrix College. He&apos;s a talented percussionist as well as programmer, focusing mainly on keyboards such as the marimba or vibraphone. Zachary still composes music for the piano occasionally, although software engineering is his main focus now.&lt;/p&gt;
&lt;p&gt;After college, Zachary moved to Palo Alto, California, and began working for Entity MCL. There, he was mostly writing in Python, programming an interface for wireless access for Windows XP.&lt;/p&gt;
&lt;p&gt;Zachary also has a deep interest in Japan, and followed that interest to work at a small software company in Japan. He is fascinated by Japanese art and food, stating &quot;everything comes with an old world presentation element that is fun and magical.&quot; While living in Japan, he also built the authentication systems for the G8 Summit in Hokkaido in 2008.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 66.640625%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBBAX/xAAVAQEBAAAAAAAAAAAAAAAAAAACAP/aAAwDAQACEAMQAAABltRKg2BD/8QAGhAAAwEAAwAAAAAAAAAAAAAAAQIDEQASIf/aAAgBAQABBQJymPgDH1sE5qacSa9P/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAECERL/2gAIAQMBAT8BcVSMn//EABYRAQEBAAAAAAAAAAAAAAAAAAASIf/aAAgBAgEBPwGtW//EABwQAAICAgMAAAAAAAAAAAAAAAABAhEhMTJBUf/aAAgBAQAGPwKpGzApu2cuxYWvD//EABgQAQADAQAAAAAAAAAAAAAAAAEAESEx/9oACAEBAAE/Ia4LzIjXDcioD5K5dQHUGJu3aax//9oADAMBAAIAAwAAABAYz//EABYRAQEBAAAAAAAAAAAAAAAAAAARAf/aAAgBAwEBPxCWxD//xAAVEQEBAAAAAAAAAAAAAAAAAAABAP/aAAgBAgEBPxAQ5v8A/8QAGxABAAMBAAMAAAAAAAAAAAAAAQARIVExQZH/2gAIAQEAAT8QIrukHgewSIwC4pNge41N0pVzkQuCwLzfsWrJEFuT/9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;drums&quot;
        title=&quot;&quot;
        src=&quot;/static/drums-3980656e87a9ce9cef9caba157bc56fd-c69aa.jpeg&quot;
        srcset=&quot;/static/drums-3980656e87a9ce9cef9caba157bc56fd-2c497.jpeg 216w,
/static/drums-3980656e87a9ce9cef9caba157bc56fd-ec3f2.jpeg 432w,
/static/drums-3980656e87a9ce9cef9caba157bc56fd-c69aa.jpeg 864w,
/static/drums-3980656e87a9ce9cef9caba157bc56fd-a23f8.jpeg 1280w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Zachary decided to join Rollbar due to the mature and relaxed culture, as well as the ability to mentor more junior software engineers. Both of his parents are teachers, and he also enjoys passing on his knowledge. He&apos;s looking forward to optimizing Rollbar&apos;s ETL pipeline, and dreams of reaching Rollbar &quot;zero&quot; (no exception occurrences) for our backend systems someday soon.&lt;/p&gt;
&lt;p&gt;We&apos;re excited to welcome Zachary and glad he decided to join us at Rollbar!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the Rollbar Team - Jaee Apte (Product Designer)]]></title><description><![CDATA[We're excited to introduce  Jaee Apte , one of the newer members of our team. Jaee (pronounced "Zaa-ee") started at Rollbar as a Product…]]></description><link>https://rollbar.com/blog/meet-the-team-jaee/</link><guid isPermaLink="false">https://rollbar.com/blog/meet-the-team-jaee/</guid><pubDate>Wed, 31 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;re excited to introduce &lt;a href=&quot;http://jaeeapte.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Jaee Apte&lt;/a&gt;, one of the newer members of our team. Jaee (pronounced &quot;Zaa-ee&quot;) started at Rollbar as a Product Designer in October, and we are very happy to have her. She is also a talented visual artist, and enjoys product design because &quot;it&apos;s a good bridge between being completely analytical and a crazy artist.&quot; &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 114.82843137254903%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAXABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAMFAQIE/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAECA//aAAwDAQACEAMQAAABlj7aiS3VKnnQ0iMI/8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIDEgAEERP/2gAIAQEAAQUCRiAmyxlsDjTIoCVaYmRo+2YN3ybP/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREP/aAAgBAwEBPwErLn//xAAYEQACAwAAAAAAAAAAAAAAAAAAEQEQEv/aAAgBAgEBPwHIoFX/xAAhEAACAAUEAwAAAAAAAAAAAAAAAQIREiExAzNB4WFxgf/aAAgBAQAGPwLD+MlFhm5T7KNPoriiuifgukNTV+Ds/8QAGxABAQEAAwEBAAAAAAAAAAAAAREAITFBcVH/2gAIAQEAAT8hGfK6HcXTPMxKeHSmlEVZXpmVFeE9xf5b8smskTQY8aZ//9oADAMBAAIAAwAAABCvCH3/xAAYEQADAQEAAAAAAAAAAAAAAAAAAREhMf/aAAgBAwEBPxDhDIU2Vn//xAAZEQEBAAMBAAAAAAAAAAAAAAABABEhQVH/2gAIAQIBAT8QDyPaQGrBf//EABwQAQACAwEBAQAAAAAAAAAAAAERIQAxUUFxgf/aAAgBAQABPxAWuX4EXOgefcCAO7JhcPcOnUEx0RMMcxRA4W3quTVCS1akxvwwJ61Pn7jEGpA+91gylgCELXm8j6fLzn//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;jaee&quot;
        title=&quot;&quot;
        src=&quot;/static/jaee-82ec46e03061abf35973ad514ecd186d-c69aa.jpg&quot;
        srcset=&quot;/static/jaee-82ec46e03061abf35973ad514ecd186d-2c497.jpg 216w,
/static/jaee-82ec46e03061abf35973ad514ecd186d-ec3f2.jpg 432w,
/static/jaee-82ec46e03061abf35973ad514ecd186d-c69aa.jpg 864w,
/static/jaee-82ec46e03061abf35973ad514ecd186d-d53dc.jpg 1296w,
/static/jaee-82ec46e03061abf35973ad514ecd186d-25865.jpg 1728w,
/static/jaee-82ec46e03061abf35973ad514ecd186d-203ce.jpg 2448w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Jaee is originally from Mumbai, India, although she moved around a lot growing up. After completing her Bachelor&apos;s in Computer Science at the University of Pune, India, she worked at Microsoft doing product research and development. At Microsoft, she was on a small team working on cloud services for Visual Studio Team Services, working on building infrastructure for product development. Jaee was working mostly as a software developer, although she got to do a bit of product research and product management. This led her to realize that, while she wanted to stay in tech, she wanted a more creative role.&lt;/p&gt;
&lt;p&gt;Jaee paints a lot and wanted to be able to bring that passion for creativity into her daily work. This desire to blend technology and design brought her to the University of Michigan, where she completed her Master&apos;s in Human-Computer Interaction (HCI). Armed with a newfound knowledge and a desire to build meaningful products for the user, she moved to San Francisco in search of the next opportunity. That&apos;s when she found Rollbar.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 640px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIDBAX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABK7ok5rEv/8QAGhAAAgMBAQAAAAAAAAAAAAAAAQIAAwQSEf/aAAgBAQABBQLW3tykwDqWZrHYY7Yo5T//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPwFJ/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQIQ/9oACAECAQE/ASjP/8QAGhAAAwADAQAAAAAAAAAAAAAAAAECETFRkf/aAAgBAQAGPwKUuG36ZqsCaaNz6TPEf//EABsQAAMAAwEBAAAAAAAAAAAAAAABESExYUGR/9oACAEBAAE/IaA5gpv7RVeDFyIaBxTLE9AtzylM/9oADAMBAAIAAwAAABC//wD/xAAXEQEBAQEAAAAAAAAAAAAAAAABABEh/9oACAEDAQE/EEXjZf/EABYRAQEBAAAAAAAAAAAAAAAAAAEAIf/aAAgBAgEBPxAhpLf/xAAdEAEAAgICAwAAAAAAAAAAAAABABEhMUFxUWHR/9oACAEBAAE/EGVSy2VWW8nWoi1k4VxV+eoWmnDeSGu4QMEKDt9TICxW3yVBKsasKZ//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;jaee painting&quot;
        title=&quot;&quot;
        src=&quot;/static/jaee_painting-20f5c03c36fb48994c8ddcb0e0a9d148-ffaba.jpg&quot;
        srcset=&quot;/static/jaee_painting-20f5c03c36fb48994c8ddcb0e0a9d148-3a7f4.jpg 216w,
/static/jaee_painting-20f5c03c36fb48994c8ddcb0e0a9d148-c9752.jpg 432w,
/static/jaee_painting-20f5c03c36fb48994c8ddcb0e0a9d148-ffaba.jpg 640w&quot;
        sizes=&quot;(max-width: 640px) 100vw, 640px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
Aurora Borealis - Northern Lights by Jaee Apte&lt;/p&gt;
&lt;p&gt;Jaee joined Rollbar because of the domain and the users. Since she comes from an engineering background, she knows what a niche set of users Rollbar serves. In her own words, &quot;I&apos;m excited about tapping into their brain and designing a product that makes their lives easier.&quot; She&apos;s made waves so far here at Rollbar, helping to design upcoming features around user onboarding and the dashboard, as well as helping to put a design system in place to enable better communication and transparency between engineering and design. In the future, she&apos;s looking forward to setting up a user-centered design process in place and improve the Rollbar experience through regular user feedback.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 640px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIBAwX/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAYLEy0hyv//EABoQAQACAwEAAAAAAAAAAAAAAAIBAwAREhP/2gAIAQEAAQUCTUOWspnqtUqX4PVI4r//xAAVEQEBAAAAAAAAAAAAAAAAAAAAAf/aAAgBAwEBPwGo/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAECIf/aAAgBAgEBPwGVoz//xAAcEAADAAEFAAAAAAAAAAAAAAAAAREhIjJhcYH/2gAIAQEABj8CaTFqavJR46Zt9pD/xAAbEAEAAwADAQAAAAAAAAAAAAABABEhMUGBof/aAAgBAQABPyHxIwKNSwYqFfLzE0peg7FaXV7DPsQH0z//2gAMAwEAAgADAAAAEH/f/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERMf/aAAgBAwEBPxB3JDB//8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAIf/aAAgBAgEBPxAurgVm/8QAHBABAQACAwEBAAAAAAAAAAAAAREAITFBUWFx/9oACAEBAAE/ENv+wlZgSYG6J2L1jOkvIrz7k7hIIH7vEzalcfU2wkkpKll+Z//Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;jaee painting 2&quot;
        title=&quot;&quot;
        src=&quot;/static/jaee_painting_2-d47cd99e3e928c406276643cca672e79-ffaba.jpg&quot;
        srcset=&quot;/static/jaee_painting_2-d47cd99e3e928c406276643cca672e79-3a7f4.jpg 216w,
/static/jaee_painting_2-d47cd99e3e928c406276643cca672e79-c9752.jpg 432w,
/static/jaee_painting_2-d47cd99e3e928c406276643cca672e79-ffaba.jpg 640w&quot;
        sizes=&quot;(max-width: 640px) 100vw, 640px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
Starry Sunflowers by Jaee Apte&lt;/p&gt;
&lt;p&gt;Jaee googles her name from time to time to make sure it&apos;s still unique. So far the only other Jaee on the web is a super talented Jazz musician and a fast-food restaurant in Rio di Janeiro. &lt;/p&gt;
&lt;p&gt;We are excited that Jaee decided to join us in our mission of making software development easy!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Top 10 JavaScript errors from 1000+ projects (and how to avoid them)]]></title><description><![CDATA[To give back to our community of developers, we looked at our database of thousands of projects and found the top 10 errors in JavaScript…]]></description><link>https://rollbar.com/blog/top-10-javascript-errors/</link><guid isPermaLink="false">https://rollbar.com/blog/top-10-javascript-errors/</guid><pubDate>Wed, 24 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;To give back to our community of developers, we looked at our database of thousands of projects and found the top 10 errors in JavaScript. We’re going to show you what causes them and how to prevent them from happening. If you avoid these &quot;gotchas,&quot; it&apos;ll make you a better developer.&lt;/p&gt;
&lt;p&gt;Because data is king, we collected, analyzed, and ranked the top 10 &lt;strong&gt;&lt;a href=&quot;/error-tracking/javascript/&quot;&gt;JavaScript errors&lt;/a&gt;&lt;/strong&gt;. Rollbar collects all the errors for each project and summarizes how many times each one occurred. We do this by grouping errors according to their &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/grouping-algorithm/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;fingerprints&lt;/a&gt;&lt;/strong&gt;. Basically, we group two errors if the second one is just a repeat of the first. This gives users a nice overview instead of an overwhelming big dump like you’d see in a log file.&lt;/p&gt;
&lt;p&gt;We focused on the errors most likely to affect you and your users. To do this, we ranked errors by the number of projects experiencing them across different companies. If we looked only at the total number of times each error occurred, then high-volume customers could overwhelm the data set with errors that are not relevant to most readers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here are the top 10 JavaScript errors&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 61.91756272401434%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAABdUlEQVQoz42SzUsDMRDF+z97Eiz4cfIiqCCK9qBipZ6liuBd8OpBbaXdlYKClf3Idtf9yDMv7ZS0teDAYxI2+e3LzNQwCa31UqkkR5QUCNU4x0aRKvAd5VbD8Ad5UdmztaqqkKYpwjBEFEVWSinEcTzdt+58bDXesNnoYuOki7XDjtVOsz9RD/5HCrJqWZbZSwQEQWBzkiTTNb9dtPsWUDdaP+5ir+Vh/8rDfFggF2VZWgjhdEuHruPmjYf6UQcru894eAocgLYqzH0+1wK5IFCU5/nUseTLWx+rB684aw8wNqBNzcoZZzMOi6Kwl8UVM0F0Kg63z3tsHUrjyIUsBbqOpDHSHALvH4fm3KKrpUC6ktoR4u6bNz5ePGWeWv0PyIUA3LERMGvYeU/sOdbchUgzFoDsMEeFErCM0ul1H2lWzrgS8J8O5YB0mh8ka13h80vZM5wAisExEwhHjTEajcZA92/z0RsoJMp03ADomvWef7Jbhl+KKZUQDBVDeAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of javascript error graph&quot;
        title=&quot;&quot;
        src=&quot;/static/javascript-error-graph-aced7330c2844069d95dfb92a87a3c82-e9535.png&quot;
        srcset=&quot;/static/javascript-error-graph-aced7330c2844069d95dfb92a87a3c82-d32c5.png 216w,
/static/javascript-error-graph-aced7330c2844069d95dfb92a87a3c82-06f31.png 432w,
/static/javascript-error-graph-aced7330c2844069d95dfb92a87a3c82-e9535.png 864w,
/static/javascript-error-graph-aced7330c2844069d95dfb92a87a3c82-da028.png 1116w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Each error has been shortened for easier readability. Let’s dive deeper into each one to determine what can cause it and how you can avoid creating it.&lt;/p&gt;
&lt;h2 id=&quot;1-uncaught-typeerror-cannot-read-property&quot;&gt;&lt;a href=&quot;#1-uncaught-typeerror-cannot-read-property&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Uncaught TypeError: Cannot read property&lt;/h2&gt;
&lt;p&gt;If you’re a JavaScript developer, you’ve probably seen this error more than you care to admit. This one occurs in Chrome when you read a property or call a method on an undefined object. You can test this very easily in the Chrome Developer Console.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 15.846994535519125%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsSAAALEgHS3X78AAAAZ0lEQVQI162MbQuAIAyE/f8/MxKiMN91hXLNRCL62uBhx+12ghJh3yxSyvhjRFgW2HlG0RpVG1TvUQ1vazvNc+7xW47oTc6IfDtjhDgNP60ripQo03TrqlQvGwVNj8JGCB8S/xycuwB3v+mX4jZeYQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Uncaught TypeError: Cannot read property&quot;
        title=&quot;&quot;
        src=&quot;/static/cannot-read-property-2c381f8bb28ef3b048e83f322b70d051-e9535.png&quot;
        srcset=&quot;/static/cannot-read-property-2c381f8bb28ef3b048e83f322b70d051-d32c5.png 216w,
/static/cannot-read-property-2c381f8bb28ef3b048e83f322b70d051-06f31.png 432w,
/static/cannot-read-property-2c381f8bb28ef3b048e83f322b70d051-e9535.png 864w,
/static/cannot-read-property-2c381f8bb28ef3b048e83f322b70d051-02501.png 915w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;This can occur for many reasons, but a common one is improper initialization of state while rendering the UI components. Let’s look at an example of how this can occur in a real-world app. We’ll pick React, but the same principles of improper initialization also apply to Angular, Vue or any other framework.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Quiz&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;componentWillMount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    axios&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/thedata&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
          &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;li key&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;li&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;ul&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;There are two important things realize here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A component’s state (e.g. &lt;code&gt;this.state&lt;/code&gt;) begins life as &lt;code&gt;undefined&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When you fetch data asynchronously, the component will render at least once before the data is loaded – regardless of whether it’s fetched in the constructor, &lt;code&gt;componentWillMount&lt;/code&gt; or &lt;code&gt;componentDidMount&lt;/code&gt;. When Quiz first renders, &lt;code&gt;this.state.items&lt;/code&gt; is undefined. This, in turn, means &lt;code&gt;ItemList&lt;/code&gt; gets items as undefined, and &lt;em&gt;you&lt;/em&gt; get an error – &quot;Uncaught TypeError: Cannot read property ‘map’ of undefined&quot; in the console.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is easy to fix. The simplest way: Initialize state with reasonable default values in the constructor.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Quiz&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Added this:&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Assign state itself, and a default value for items&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      items&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;componentWillMount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    axios&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/thedata&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
          &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;li key&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;li&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;ul&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The exact code in your app might be different, but we hope we’ve given you enough of a clue to either fix or avoid this problem in your app. If not, keep reading because we’ll cover more examples for related errors below.&lt;/p&gt;
&lt;h2 id=&quot;2-typeerror-undefined-is-not-an-object-evaluating&quot;&gt;&lt;a href=&quot;#2-typeerror-undefined-is-not-an-object-evaluating&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. TypeError: ‘undefined’ is not an object (evaluating&lt;/h2&gt;
&lt;p&gt;This is an error that occurs in Safari when you read a property or call a method on an undefined object. You can test this very easily in the Safari Developer Console. This is essentially the same as the above error for Chrome, but Safari uses a different error message.&lt;/p&gt;
&lt;p&gt;![Screenshot of TypeError: ‘undefined’ is not an object (undefined-is-not-an-object.png)&lt;/p&gt;
&lt;h2 id=&quot;3-typeerror-null-is-not-an-object-evaluating&quot;&gt;&lt;a href=&quot;#3-typeerror-null-is-not-an-object-evaluating&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. TypeError: null is not an object (evaluating&lt;/h2&gt;
&lt;p&gt;This is an error that occurs in Safari when you read a property or call a method on a null object. You can test this very easily in the Safari Developer Console.&lt;/p&gt;
&lt;p&gt;![Screenshot of TypeError: null is not an object (null-is-not-an-object.png)&lt;/p&gt;
&lt;p&gt;Interestingly, in JavaScript, null and undefined are not the same, which is why we see two different error messages. Undefined is usually a variable that has not been assigned, while null means the value is blank. To verify they are not equal, try using the strict equality operator:&lt;/p&gt;
&lt;p&gt;![Screenshot of TypeError: null is not an object (null-is-not-an-object1.png)&lt;/p&gt;
&lt;p&gt;One way this error might occur in a real world example is if you try using a DOM element in your JavaScript before the element is loaded. That’s because the DOM API returns null for object references that are blank.&lt;/p&gt;
&lt;p&gt;Any JS code that executes and deals with DOM elements should execute after the DOM elements have been created. JS code is interpreted from top to down as laid out in the HTML. So, if there is a tag before the DOM elements, the JS code within script tag will execute as the browser parses the HTML page. You will get this error if the DOM elements have not been created before loading the script.&lt;/p&gt;
&lt;p&gt;In this example, we can resolve the issue by adding an event listener that will notify us when the page is ready. Once the &lt;code&gt;addEventListener&lt;/code&gt; is fired, the &lt;code&gt;init()&lt;/code&gt; method can make use of the DOM elements.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; myButton &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;myButton&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; myTextfield &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;myTextfield&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    myButton&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onclick&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; userName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; myTextfield&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;readystatechange&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;readyState &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;complete&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;input type&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;text&quot;&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;myTextfield&quot;&lt;/span&gt; placeholder&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Type your name&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;input type&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;button&quot;&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;myButton&quot;&lt;/span&gt; value&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Go&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;form&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;4-unknown-script-error&quot;&gt;&lt;a href=&quot;#4-unknown-script-error&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. (unknown): Script error&lt;/h2&gt;
&lt;p&gt;The Script error occurs when an uncaught JavaScript error crosses domain boundaries in violation of the cross-origin policy. For example, if you host your JavaScript code on a CDN, any uncaught errors (errors that bubble up to the window.onerror handler, instead of being caught in try-catch) will get reported as simply &quot;Script error&quot; instead of containing useful information. This is a browser security measure intended to prevent passing data across domains that otherwise wouldn’t be allowed to communicate.&lt;/p&gt;
&lt;p&gt;To get the real error messages, do the following:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Send the Access-Control-Allow-Origin header&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Setting the &lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt; header to * signifies that the resource can be accessed properly from any domain. You can replace * with your domain if necessary: for example, &lt;code&gt;Access-Control-Allow-Origin: www.example.com&lt;/code&gt;. However, handling multiple domains gets tricky, and may not be worth the effort if you’re using a CDN due to caching issues that may arise. See more &lt;strong&gt;&lt;a href=&quot;http://stackoverflow.com/questions/1653308/access-control-allow-origin-multiple-origin-domains&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here are some examples on how to set this header in various environments:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Apache&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the folders where your JavaScript files will be served from, create an &lt;code&gt;.htaccess&lt;/code&gt; file with the following contents:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;Header add Access-Control-Allow-Origin &quot;*&quot;&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Nginx&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Add the add_header directive to the location block that serves your JavaScript files:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;location ~ ^/assets/ {
    add_header Access-Control-Allow-Origin *;
}&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;HAProxy&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Add the following to your asset backend where JavaScript files are served from:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;rspadd Access-Control-Allow-Origin:\ *&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2. Set crossorigin=&quot;anonymous&quot; on the script tag&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In your HTML source, for each of the scripts that you’ve set the &lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt; header for, set &lt;code&gt;crossorigin=&quot;anonymous&quot;&lt;/code&gt; on the SCRIPT tag. Make sure you verify that the header is being sent for the script file before adding the &lt;code&gt;crossorigin&lt;/code&gt; property on the script tag. In Firefox, if the &lt;code&gt;crossorigin&lt;/code&gt; attribute is present but the &lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt; header is not, the script won’t be executed.&lt;/p&gt;
&lt;h2 id=&quot;5-typeerror-object-doesnt-support-property&quot;&gt;&lt;a href=&quot;#5-typeerror-object-doesnt-support-property&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. TypeError: Object doesn’t support property&lt;/h2&gt;
&lt;p&gt;This is an error that occurs in IE when you call an undefined method. You can test this in the IE Developer Console.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 23.444444444444443%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAAAqklEQVQY062PTwuCQBTE9+t2CzRMa9vsoB+vLh0yKKho1/yzCrlmi0wP61yXHvwYZoZ3GDaeBJhxgdF0ic12h+vxDLVPIIRAHMfwPA9RFGEuFuCcw3GcAd/3EYYhXNclXZEPBs9O6olDIrG+WOjGIq07GGPQ9/1XrLWoqgpaVyiKAmWp6a8FM7cMRqVocgqkwuCz/K2fzkjq2wfR/YThz8fq+o5/kNIqSYte3/Zqjm3fnBYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of TypeError: Object doesn’t support property&quot;
        title=&quot;&quot;
        src=&quot;/static/Object-doesnot-support-property-8c3392abdee2261b96a61cd615a34a30-e9535.png&quot;
        srcset=&quot;/static/Object-doesnot-support-property-8c3392abdee2261b96a61cd615a34a30-d32c5.png 216w,
/static/Object-doesnot-support-property-8c3392abdee2261b96a61cd615a34a30-06f31.png 432w,
/static/Object-doesnot-support-property-8c3392abdee2261b96a61cd615a34a30-e9535.png 864w,
/static/Object-doesnot-support-property-8c3392abdee2261b96a61cd615a34a30-e17e3.png 900w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;This is equivalent to the error &quot;TypeError: ‘undefined’ is not a function&quot; in Chrome. Yes, different browsers can have different error messages for the same logical error.&lt;/p&gt;
&lt;p&gt;This is a common problem for IE in web applications that employ JavaScript namespacing. When this is the case, the problem 99.9% of the time is IE’s inability to bind methods within the current namespace to the &lt;code&gt;this&lt;/code&gt; keyword. For example, if you have the JS namespace &lt;code&gt;Rollbar&lt;/code&gt; with the method &lt;code&gt;isAwesome.&lt;/code&gt; Normally, if you are within the &lt;code&gt;Rollbar&lt;/code&gt; namespace you can invoke the &lt;code&gt;isAwesome&lt;/code&gt; method with the following syntax:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isAwesome&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Chrome, Firefox and Opera will happily accept this syntax. IE, on the other hand, will not. Thus, the safest bet when using JS namespacing is to always prefix with the actual namespace.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;Rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isAwesome&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;6-typeerror-undefined-is-not-a-function&quot;&gt;&lt;a href=&quot;#6-typeerror-undefined-is-not-a-function&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;6. TypeError: ‘undefined’ is not a function&lt;/h2&gt;
&lt;p&gt;This is an error that occurs in Chrome when you call an undefined function. You can test this in the Chrome Developer Console and Mozilla Firefox Developer Console.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 20.277481323372466%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsSAAALEgHS3X78AAAAnUlEQVQY052OyQ7DIAxE+f9fbFNFUbOwpKRAAijgKXDIoYceengaazyWh0kpwTmHEAJ17p8Sw6iat64r5nluuiwLBBdQSrVcpXp19y7+pnXz2PbScMbiPE8QUdMQQiPnfBFjhLUWzrkr+40xBmzvB4T7A+F2R+o6pHFEKq1S+Z5K66bThFzCv9Dlzpf2LPoAKt/pOED7DvIeVBv8yQdVejQo38wiWwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of undefined is not a function&quot;
        title=&quot;&quot;
        src=&quot;/static/undefined-is-nota-function-56ea3a7bc5c3706febe7c45b4d0aa353-e9535.png&quot;
        srcset=&quot;/static/undefined-is-nota-function-56ea3a7bc5c3706febe7c45b4d0aa353-d32c5.png 216w,
/static/undefined-is-nota-function-56ea3a7bc5c3706febe7c45b4d0aa353-06f31.png 432w,
/static/undefined-is-nota-function-56ea3a7bc5c3706febe7c45b4d0aa353-e9535.png 864w,
/static/undefined-is-nota-function-56ea3a7bc5c3706febe7c45b4d0aa353-9a11e.png 937w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;As JavaScript coding techniques and design patterns have become increasingly sophisticated over the years, there’s been a corresponding increase in the proliferation of self-referencing scopes within callbacks and closures, which are a fairly common source of this/that confusion.&lt;/p&gt;
&lt;p&gt;Consider this example code snippet:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;clearBoard&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Cleared&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearBoard&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// what is “this” ?&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;If you execute the above code and then click on the page, it results in the following error &quot;Uncaught TypeError: this.clearBoard is not a function&quot;. The reason is that the anonymous function being executed is in the context of the document, whereas &lt;code&gt;clearBoard&lt;/code&gt; is defined on the window.&lt;/p&gt;
&lt;p&gt;A traditional, old-browser-compliant solution is to simply save your reference to &lt;code&gt;this&lt;/code&gt; in a variable that can then be inherited by the closure. For example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; self&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// save reference to &apos;this&apos;, while it&apos;s still this!&lt;/span&gt;
document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearBoard&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Alternatively, in the newer browsers, you can use the &lt;code&gt;bind()&lt;/code&gt; method to pass the proper reference:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;clearBoard&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;7-uncaught-rangeerror-maximum-call-stack&quot;&gt;&lt;a href=&quot;#7-uncaught-rangeerror-maximum-call-stack&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;7. Uncaught RangeError: Maximum call stack&lt;/h2&gt;
&lt;p&gt;This is an error that occurs in Chrome under a couple of circumstances. One is when you call a recursive function that does not terminate. You can test this in the Chrome Developer Console.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 645px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 44.49612403100775%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAABEklEQVQoz5WSC2+CMBSF+f//bJnZw8fYnGBEqDoKSqUKTPvtMrZEE2O0yUnT3t4vpyfXi+dzKm2xaYlWBQul2e0q2uWc45b1/85ai6eU4ng8opKUfJnztdBS2Mvd4WboGTBJEuq6pmmaX/A9zi4C434fG83Yvw05TAOYTXFJDOEE4gixLpLzQsF8BlrDtsQZA6Imz9FRJLHJz4pCHAYCWa9BgAxeYDSA3gM8PcJkDIXp6q02m4tyfzWTZSdAf9QB/WEHe+5B8Ckutldhp8BIWJ4Kw65h/N5Bxz70BTx8hTYCY+4D7iSDM+CH3zlt1eZ4r8PtxvBdlpBnOJ1CJqGvlpCuJD9pkAmgqq7KtXtdsZQR/AEeKLNyVhzHZwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Uncaught RangeError: Maximum call stack&quot;
        title=&quot;&quot;
        src=&quot;/static/maximum-call-stack-141a12b7eac187de88bce298cf0fe942-59412.png&quot;
        srcset=&quot;/static/maximum-call-stack-141a12b7eac187de88bce298cf0fe942-3c4b8.png 216w,
/static/maximum-call-stack-141a12b7eac187de88bce298cf0fe942-7098e.png 432w,
/static/maximum-call-stack-141a12b7eac187de88bce298cf0fe942-59412.png 645w&quot;
        sizes=&quot;(max-width: 645px) 100vw, 645px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;It may also happen if you pass a value to a function that is out of range. Many functions accept only a specific range of numbers for their input values. For example, &lt;code&gt;Number.toExponential(digits)&lt;/code&gt; and N&lt;code&gt;umber.toFixed(digits)&lt;/code&gt; accept digits from 0 to 20, and &lt;code&gt;Number.toPrecision(digits)&lt;/code&gt; accepts digits from 1 to 21.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4294967295&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;//OK&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//range error&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; num &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.555555&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeln&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toExponential&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;//OK&lt;/span&gt;
document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeln&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toExponential&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//range error!&lt;/span&gt;

num &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.9999&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeln&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;//OK&lt;/span&gt;
document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeln&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;//range error!&lt;/span&gt;

num &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.3456&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeln&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toPrecision&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;//OK&lt;/span&gt;
document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeln&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toPrecision&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;//range error!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;8-typeerror-cannot-read-property-length&quot;&gt;&lt;a href=&quot;#8-typeerror-cannot-read-property-length&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;8. TypeError: Cannot read property ‘length’&lt;/h2&gt;
&lt;p&gt;This is an error that occurs in Chrome because of reading length property for an undefined variable. You can test this in the Chrome Developer Console.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 24.54642475987193%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAAAwElEQVQY052PwW7DIBBE+f8vbKW0hyqxiW1sCsQLZZfpkqpVpeQQ5TDSzNOAdoxzDtM0YVkWdP8xOBxHh3mesW0brLVY1/Xa6az7325nPUfln95fmfGr15BAVMGVQYFAlx05Z4jIn0opiDEipYRaK1prNwohwGTKeknQIoG/9NPCEJa7Dx6R8W/v8C+viIcDkorPZ/DpBNY5PNqfPI6QaQZb9cMA0Xmi1/6X1w7pfFMuhLbvkE1LCppOaqRMJz6jb2fqgqjMrDcqAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of TypeError: Cannot read property ‘length’&quot;
        title=&quot;&quot;
        src=&quot;/static/cannot-read-property-length-5fc5c16c37dc769e5559a472c21bff53-e9535.png&quot;
        srcset=&quot;/static/cannot-read-property-length-5fc5c16c37dc769e5559a472c21bff53-d32c5.png 216w,
/static/cannot-read-property-length-5fc5c16c37dc769e5559a472c21bff53-06f31.png 432w,
/static/cannot-read-property-length-5fc5c16c37dc769e5559a472c21bff53-e9535.png 864w,
/static/cannot-read-property-length-5fc5c16c37dc769e5559a472c21bff53-9a11e.png 937w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;You normally find length defined on an array, but you might run into this error if the array is not initialized or if the variable name is hidden in another context. Let’s understand this error with the following example.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; testArray&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Test&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;testFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;testArray&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; testArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;testArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;testFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;When you declare a function with parameters, these parameters become local ones. This means that even if you have variables with names &lt;code&gt;testArray&lt;/code&gt;, parameters with the same names within a function will still be treated as &lt;strong&gt;local.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You have two ways to resolve your issue:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Remove parameters in the function declaration statement (it turns out you want to access those variables that are declared outside of the function, so you don’t need parameters for your function):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; testArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Test&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* Precondition: defined testArray outside of a function */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;testFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;/* No params */&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; testArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
     console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;testArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;testFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Invoke the function passing it the array that we declared:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; testArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Test&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;testFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;testArray&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; testArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
     console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;testArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;testFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;testArray&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;9-uncaught-typeerror-cannot-set-property&quot;&gt;&lt;a href=&quot;#9-uncaught-typeerror-cannot-set-property&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;9. Uncaught TypeError: Cannot set property&lt;/h2&gt;
&lt;p&gt;When we try to access an undefined variable it always returns &lt;code&gt;undefined&lt;/code&gt; and we cannot get or set any property of &lt;code&gt;undefined&lt;/code&gt;. In that case, an application will throw “Uncaught TypeError cannot set property of undefined.”&lt;/p&gt;
&lt;p&gt;For example, in the Chrome browser:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 24.70713525026624%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAAAvElEQVQY052QyQ7CMAxE8/9/WKkcgLZR16RLViUenApxAA6Iw5PtyRxmIuZ5xjiOKLPQyAV3OWOaJmit0fc9lFIYhuH0lb34lmU5teLZ+d5YL5pYlYZWO2KICKtHMB7eezjnkHN+EULAtm04jgMxRhDRB8YYCO88Vr3CWocUMyjTV/OviON6g61rmKpCrC9InURqGiSuk7ruOSUyf0FqWyTJOyd9R/GbZY8I1oO4InFc2ncQJyWuR6XWHzwAxQiDKUz2hf0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Uncaught TypeError: Cannot set property&quot;
        title=&quot;&quot;
        src=&quot;/static/cannot-set-property-7b906e3fde43489bc50d8d7155125398-e9535.png&quot;
        srcset=&quot;/static/cannot-set-property-7b906e3fde43489bc50d8d7155125398-d32c5.png 216w,
/static/cannot-set-property-7b906e3fde43489bc50d8d7155125398-06f31.png 432w,
/static/cannot-set-property-7b906e3fde43489bc50d8d7155125398-e9535.png 864w,
/static/cannot-set-property-7b906e3fde43489bc50d8d7155125398-0f853.png 939w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;If the &lt;code&gt;test&lt;/code&gt; object does not exist, error will throw “Uncaught TypeError cannot set property of undefined.”&lt;/p&gt;
&lt;h2 id=&quot;10-referenceerror-event-is-not-defined&quot;&gt;&lt;a href=&quot;#10-referenceerror-event-is-not-defined&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;10. ReferenceError: event is not defined&lt;/h2&gt;
&lt;p&gt;This error is thrown when you try to access a variable that is undefined or is outside the current scope. You can test it very easily in Chrome browser.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 25.133120340788075%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAAAsUlEQVQY052Q2w6DIBBE+f9fNCZaKyDWSylosCzThabpQ5M+SHKy7DCQHYSUEkopDMNQaDpTyPtpmpDPczXGYBxHLMtS+nmei7auKx7cW9azJoweoDuF7iLRtgpN05fHPuZs2rYNIQRYa+Gcw3EcSCn94L2HiDEiuMCXDhAlxEhcCWeXcN0Va1Xhzti6RtQaxBGIJ6Tx9u15sn9MfQ/PPvHcw1vkaMR/RBwz7TsSRzzDC4LfgYP0LE0ZAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of ReferenceError: event is not defined&quot;
        title=&quot;&quot;
        src=&quot;/static/event-is-not-defined-814627566cf30e8ce9f2ce1dbeabe3c7-e9535.png&quot;
        srcset=&quot;/static/event-is-not-defined-814627566cf30e8ce9f2ce1dbeabe3c7-d32c5.png 216w,
/static/event-is-not-defined-814627566cf30e8ce9f2ce1dbeabe3c7-06f31.png 432w,
/static/event-is-not-defined-814627566cf30e8ce9f2ce1dbeabe3c7-e9535.png 864w,
/static/event-is-not-defined-814627566cf30e8ce9f2ce1dbeabe3c7-0f853.png 939w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;If you’re getting this error when using the event handling system, make sure you use the event object passed in as a parameter. Older browsers like IE offer a global variable event, and Chrome automatically attaches the event variable to the handler. Firefox will not automatically add it. Libraries like jQuery attempt to normalize this behavior. Nevertheless, it’s best practice to use the one passed into your event handler function.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mousemove&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;It turns out a lot of these are null or undefined errors. A good static type checking system like &lt;a href=&quot;https://www.typescriptlang.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Typescript&lt;/a&gt; could help you avoid them if you use the strict compiler option. It can warn you if a type is expected but has not been defined. Even without Typescript, it helps to use guard clauses to check whether objects are undefined before using them.&lt;/p&gt;
&lt;p&gt;We hope you learned something new and can avoid errors in the future, or that this guide helped you solve a head scratcher. Nevertheless, even with the best practices, unexpected errors do pop up in production. It&apos;s important to have visibility into errors that affect your users, and to have good tools to solve them quickly.&lt;/p&gt;
&lt;p&gt;Rollbar gives you visibility to production JavaScript errors and gives you more context to solve them quickly. For example, it offers additional debugging features like &lt;strong&gt;&lt;a href=&quot;/blog/introducing-javascript-telemetry/&quot;&gt;telemetry&lt;/a&gt;&lt;/strong&gt; which tells you what happened on the user’s browser leading up to the error. That’s insight you don’t have outside of your local developer console. Learn more in Rollbar’s full list of &lt;strong&gt;&lt;a href=&quot;/error-tracking/javascript/&quot;&gt;features for JavaScript applications&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;signup for a 14-day free trial&lt;/a&gt;&lt;/strong&gt; of Rollbar and let us help you take control of impactful JavaScript errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Continuous Delivery with Jenkins and Rollbar]]></title><description><![CDATA[Continuous delivery (CD) helps reduce the cost, time and risk of delivering changes by allowing for fast  incremental updates to…]]></description><link>https://rollbar.com/blog/continuous-delivery-with-jenkins/</link><guid isPermaLink="false">https://rollbar.com/blog/continuous-delivery-with-jenkins/</guid><pubDate>Tue, 09 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Continuous delivery (CD) helps reduce the cost, time and risk of delivering changes by allowing for fast  incremental updates to applications in production. However, it’s essential to monitor your application after each deployment. You need to be notified immediately if something is wrong or users are having a poor experience.&lt;/p&gt;
&lt;p&gt;Rollbar is a leading solution for error monitoring in production. It alerts you when new errors occur after a deployment. It can also tell you which deployment the error was first seen in, and which code changes were likely responsible. This can dramatically speed up your troubleshooting time and help you fix problems faster.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 41.314031180400896%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAABGUlEQVQoz4VRi26EMAzj/79xr9ttugNaWkrf0HppYJq2ia2S5SZpTGK6rVT4uCGvBSFtWLdC8YqUd2551+KQYIcedhyQrPvqIWZQb60VXUqZipkEViocnEiA4HyiXOJ8tB5Ba2TnsC4Li2308cZ53cVZ0IcIqQzEpDE2SE3xTPHMucb9OEHogMV4lBi58QydlApPzxcsNvBk15dXvD08or9cYakWSJyhDdf/Q2dpBaXnfWxroQaaZo48kST+hFAeSYhjvXN0IQRo8iamxCNbKWD6O4pdvmMxqKX8uS6vbOiPvd9GCPKuFwp38us2SLLAo50awyFqUdyBdqdczQk/TxfJZKUU4onZUU4w2vHde89wZFPbpJj51/sP3MNuRL9+GGcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Jenkins Rollbar error&quot;
        title=&quot;&quot;
        src=&quot;/static/jenkins-rollbar-error-5d5c4bdfca10a16001f83a1b5d8201be-e9535.png&quot;
        srcset=&quot;/static/jenkins-rollbar-error-5d5c4bdfca10a16001f83a1b5d8201be-d32c5.png 216w,
/static/jenkins-rollbar-error-5d5c4bdfca10a16001f83a1b5d8201be-06f31.png 432w,
/static/jenkins-rollbar-error-5d5c4bdfca10a16001f83a1b5d8201be-e9535.png 864w,
/static/jenkins-rollbar-error-5d5c4bdfca10a16001f83a1b5d8201be-ab1f5.png 1296w,
/static/jenkins-rollbar-error-5d5c4bdfca10a16001f83a1b5d8201be-7539a.png 1728w,
/static/jenkins-rollbar-error-5d5c4bdfca10a16001f83a1b5d8201be-b6747.png 1796w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;In the screenshot above, you can see that Rollbar has automatically identified the suspected deployment where the error was first seen (indicated by the second red circle). Additionally, it has identified the code change where the error was introduced (indicated by the third red circle). You can click on these links to go straight to the code change in GitHub or Bitbucket.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-ci.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;Jenkins&lt;/strong&gt;&lt;/a&gt; is a popular open source server to automate continuous integration and continuous delivery. We&apos;ll show you how to configure Jenkins to notify Rollbar when a new version is deployed. Then, Rollbar will tell you the suspected deployment for each error.&lt;/p&gt;
&lt;h2 id=&quot;our-pet-clinic-example&quot;&gt;&lt;a href=&quot;#our-pet-clinic-example&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Our pet clinic example&lt;/h2&gt;
&lt;p&gt;Rollbar and Jenkins should work with pretty much all applications but we chose the Java pet clinic project to demonstrate the integration capabilities. It is freely available and simple to run or modify. The source code is available on the &lt;a href=&quot;https://github.com/spring-petclinic/spring-petclinic-angularjs&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;spring-petclinic-angularjs&lt;/strong&gt;&lt;/a&gt; repository on Github. Once you understand the example, you should try setting up your own application.&lt;/p&gt;
&lt;p&gt;The pet clinic application is a Java and open source Spring Boot application. It depicts the functionality of a pet clinic with simple REST resources or entities like Pet, Owner, Visits, etc. The application consists of an AngularJS front-end UI module and a back-end REST API module. You need to have basic Java knowledge and don’t need to know AngularJS or Spring Boot technologies to complete this tutorial.&lt;/p&gt;
&lt;p&gt;To demonstrate error monitoring, we will add a URL to the pet clinic that throws an error. We&apos;ll then show you how to trigger the error, view it in Rollbar, and identify the suspected change.&lt;/p&gt;
&lt;h1 id=&quot;integrate-jenkins-with-rollbar&quot;&gt;&lt;a href=&quot;#integrate-jenkins-with-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Integrate Jenkins with Rollbar&lt;/h1&gt;
&lt;p&gt;First, we are going to show you how to set up Jenkins for our pet clinic application. Then we are going to send deployment notifications to Rollbar so it can track when deployments are made.&lt;/p&gt;
&lt;h2 id=&quot;set-up-the-jenkins-application&quot;&gt;&lt;a href=&quot;#set-up-the-jenkins-application&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Set up the Jenkins application&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Create a Jenkins job for a project of your choice (we&apos;ll pick freestyle project for our example).&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 41.78403755868545%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAAA5ElEQVQoz52Qy2rCQBSG8+7Vug0K0pJN8T3cKqIroSSFVEyDuZNbO5eQxS8zdJpJGhc68HFm4Mw3/xlj9Wbh1XrBdDbB9PnpLtbLBba7DfaHncScmzDwu+q6huM4sG0bRVHI85AkSZCm6U0IIZ2QUobzlw/f91FV1UMwxjohIT9wP94RhiHKspSIpGovEJdUWrWnlKJpGknbtlpCxvHpnhBF0d8IWZbJqkbN87z3wPChnpDxBifvgjiOZYNq1NEFeo+oo0Lxh57nIQiCm0lU5Zz/oycs628cjrYcbShQiBRjIl14BW4PTeN3fAcYAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of free style project&quot;
        title=&quot;&quot;
        src=&quot;/static/free-style-project-40e0440c4ce409bd22f8e979acb68a2f-e9535.png&quot;
        srcset=&quot;/static/free-style-project-40e0440c4ce409bd22f8e979acb68a2f-d32c5.png 216w,
/static/free-style-project-40e0440c4ce409bd22f8e979acb68a2f-06f31.png 432w,
/static/free-style-project-40e0440c4ce409bd22f8e979acb68a2f-e9535.png 864w,
/static/free-style-project-40e0440c4ce409bd22f8e979acb68a2f-ab1f5.png 1296w,
/static/free-style-project-40e0440c4ce409bd22f8e979acb68a2f-40f15.png 1704w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Configure your source code repository such as git or Bitbucket so that Jenkins has credentials to pull the code and build the project. Add the URL where Jenkins can pull the latest code.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 41.735537190082646%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAAAqUlEQVQoz62SSw+CMBCE+/9/nt4V6YNSWiiE121kSoxogono4csme5id3VlRliW01lBKJYZhwDRNhxExRoQQ0Pc95nn+GeFCRF3XGMfxL4imaeCcAytXN8agKMxbLZahAV3X7dK2LYytIB4NCnrvF6rDUONFkA4ZEtlOl1Kl3p4QN7hl2SrIUHhDsjr8njzPcTmfnoJMmdChlDK9j7X248220IzOrqh8wB0AMGCvPwGhdwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of source code repository&quot;
        title=&quot;&quot;
        src=&quot;/static/source-code-repository-19c21cdf9e15b016a1c281d8a11ff0b3-e9535.png&quot;
        srcset=&quot;/static/source-code-repository-19c21cdf9e15b016a1c281d8a11ff0b3-d32c5.png 216w,
/static/source-code-repository-19c21cdf9e15b016a1c281d8a11ff0b3-06f31.png 432w,
/static/source-code-repository-19c21cdf9e15b016a1c281d8a11ff0b3-e9535.png 864w,
/static/source-code-repository-19c21cdf9e15b016a1c281d8a11ff0b3-ab1f5.png 1296w,
/static/source-code-repository-19c21cdf9e15b016a1c281d8a11ff0b3-e0ab3.png 1452w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Add the following scripts to build and deploy the service into the Jenkins server.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;mvn clean package
sudo chmod 777 spring-petclinic-server/target
cd  spring-petclinic-server/target
java -jar petclinic-*.jar  &amp; echo $! &gt; ./pid.file &amp;&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The script will build the repository and package the jar file with Maven, then deploy it to the Jenkins server. (Advanced users: You can also deploy it to your choice of server but change the APIs in the scripts accordingly.) The successful deployment writes the process ID into the &lt;code&gt;pid.file&lt;/code&gt; which can be used later to stop the process.&lt;/p&gt;
&lt;h2 id=&quot;send-deployment-notifications-to-rollbar&quot;&gt;&lt;a href=&quot;#send-deployment-notifications-to-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Send deployment notifications to Rollbar&lt;/h2&gt;
&lt;p&gt;Once the application build and deployment is successful, it is time to notify Rollbar of the successful deployment along with the deployed version. Rollbar can distinguish the code changes between the revisions of the deployments, and in the case of errors, it points to the newly introduced code for error resolution. It also points to the suspected deployment revision under the error.&lt;/p&gt;
&lt;p&gt;Rollbar provides a &lt;a href=&quot;/docs/api/deploys/&quot;&gt;&lt;strong&gt;RESTful deploy notification API&lt;/strong&gt;&lt;/a&gt; to notify the deployments to Rollbar from any source using a simple REST service call. Please refer to the documentation to know more about this deploy API.&lt;/p&gt;
&lt;p&gt;Add another build step to notify Rollbar after deployment of the service. Refer to the description on the input parameters below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;access_token:&lt;/strong&gt; The destination project token on Rollbar. This token gets generated when a project is created on Rollbar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;environment:&lt;/strong&gt; The deployment environment where the service is deployed. We can configure different environments such as development, staging and production.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;revision:&lt;/strong&gt; The deployed application version. This can be the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-belowJenkinsSetEnvironmentVariables&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;jenkins BUILD_NUMBER&lt;/strong&gt;&lt;/a&gt;, Maven project artifact version, or repository commit ID. Rollbar will create a link to the repository commit source code if the supplied version is the commit ID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;local_username:&lt;/strong&gt; The user who deployed the build to server.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;echo &apos;Notifying Rollbar of deployment and build version&apos;
curl https://api.rollbar.com/api/1/deploy/ \
  -F access_token=obce2f27e4b84332b7873ce78ecb8f86 \
  -F environment=production \
  -F revision=${GIT_COMMIT} \
  -F local_username=jenkins_user&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 34.104046242774565%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAAAz0lEQVQoz62R226DMBBE+f//q1q1hAA2sS3wBRApTUxOcaIgtcpDpHak8zDe1ci7m+V5TlEUWGsZx/HPZEIItNbIasAZQyclXdPQihpTlnRrzR4OmLXPKsXkHJ99z9F7zqcTMcYfZCl1GAZ8f6ZsFl53Cy8fX+wKydu7QClzrYcQ6NegxDRNLMvCI22B0zFi/QXVXpA6otsZbQI+DMzzzLPaAv9L18A0TlUL6kZTSc2+VpRCUYmbT+/3cf26u3TAu//N9sOwms76hzgXnr7yNwHXGZwB4gefAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of curl execute shell&quot;
        title=&quot;&quot;
        src=&quot;/static/curl-execute-shell-6106db95e7c38e91a189bafea79712f8-e9535.png&quot;
        srcset=&quot;/static/curl-execute-shell-6106db95e7c38e91a189bafea79712f8-d32c5.png 216w,
/static/curl-execute-shell-6106db95e7c38e91a189bafea79712f8-06f31.png 432w,
/static/curl-execute-shell-6106db95e7c38e91a189bafea79712f8-e9535.png 864w,
/static/curl-execute-shell-6106db95e7c38e91a189bafea79712f8-ab1f5.png 1296w,
/static/curl-execute-shell-6106db95e7c38e91a189bafea79712f8-4c8b0.png 1384w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Rollbar now shows the deployment version history.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50.50377833753149%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABZ0lEQVQoz6VSy0rDQBTtl7kQrVIEce9CfBb0DwStpqJ7F/UD3Ln2L1woCEVoSUJr07xn0qRJZ5IcZ4aKSov4GDicOzOHwz13prKweYx6o4Wl7VOsH14q1PY1LG6dYOPoCrUDDat751ie3ld3z7BWv0B1pyG4iRWxlzrpI1HRWne4vr2H5KaA9g2an/Dl/OajrkCsbMKQ5wXyogBjHP9ZyrDd7eHhuYOOaeHpxcBjWwfP878bJkmCLMuQpulcUVmWcIISNC5/ZkgTBscLYFkWhsMhHMeBbduwBhY8z4PZJ/BIgp49EVqO0ZgrDkcM6SSfNeRifpRSEEIQxzGiKFI1YwyFmGtAxWx5AZ8Uqtt3FFOeMRyNGXSzh063C13XYRgGuqIeiI5934f5ShGnHJaXq85kHQkmMZ/foRT5AVUxXddV8FxPjUBGNnohAhGv7/CvkWOG8TzDUsSSEQmhKq5EGIbiK+W/fpQ3WWTSIeSo/bYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Rollbar jenkin deplyment version history&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-jenkin-deplyment-version-history-3568e564729fc7093cc3f82c59f7f8a5-e9535.png&quot;
        srcset=&quot;/static/rollbar-jenkin-deplyment-version-history-3568e564729fc7093cc3f82c59f7f8a5-d32c5.png 216w,
/static/rollbar-jenkin-deplyment-version-history-3568e564729fc7093cc3f82c59f7f8a5-06f31.png 432w,
/static/rollbar-jenkin-deplyment-version-history-3568e564729fc7093cc3f82c59f7f8a5-e9535.png 864w,
/static/rollbar-jenkin-deplyment-version-history-3568e564729fc7093cc3f82c59f7f8a5-ab1f5.png 1296w,
/static/rollbar-jenkin-deplyment-version-history-3568e564729fc7093cc3f82c59f7f8a5-902b5.png 1588w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;The revision number will be a link to repository source code pointing to the commit revision, as shown in the picture below. The revision is circled in blue.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 47.760000000000005%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABAklEQVQoz42RYW/CIBCG+/9/0T7sLxjjB+M0TpuoaYGDHhyllK5sp41LtnXGlzeX48iT46CoX14lNApQN+G9hIto89MqmBSq8W0H6NG13VVxHMenYGXcRVqDhC1JUYMhHwY2tTeHwd0TdhrG353PlWKii9HdREQcLS+O1rq7iHyDDi058tZSjLGopa6l4WszXQnZ9z1XPREn6aemo29xpVAa+bX8ddiotZZRlqY8uROMoLN+YJcddzZTZ4YR8ZiOu363MquFWKz9ehu3vD3kw19XuSoYm8wwT8jw/mPP8FItmdyEzVs3z/8LMzbb7REMACEFYYRC/kEDFnzv02ea9ZCHL6hvNuqeyXnfAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Rollbar deployed notification&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-deployed-notification-a634abaff158ae1aa5a2b72c2ec4ae43-e9535.png&quot;
        srcset=&quot;/static/rollbar-deployed-notification-a634abaff158ae1aa5a2b72c2ec4ae43-d32c5.png 216w,
/static/rollbar-deployed-notification-a634abaff158ae1aa5a2b72c2ec4ae43-06f31.png 432w,
/static/rollbar-deployed-notification-a634abaff158ae1aa5a2b72c2ec4ae43-e9535.png 864w,
/static/rollbar-deployed-notification-a634abaff158ae1aa5a2b72c2ec4ae43-ab1f5.png 1296w,
/static/rollbar-deployed-notification-a634abaff158ae1aa5a2b72c2ec4ae43-7539a.png 1728w,
/static/rollbar-deployed-notification-a634abaff158ae1aa5a2b72c2ec4ae43-e3a7e.png 2500w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;We have successfully set up continuous delivery with Jenkins and are now sending deploy notifications to Rollbar.&lt;/p&gt;
&lt;h1 id=&quot;integrate-your-app-with-rollbar&quot;&gt;&lt;a href=&quot;#integrate-your-app-with-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Integrate your app with Rollbar&lt;/h1&gt;
&lt;p&gt;In previous sections, we learned how to set up the continuous delivery job and integrate with Rollbar. Now we will learn how to integrate the pet clinic application with Rollbar to monitor application errors. If handled or unhandled exceptions are thrown in the application, we will catch them and notify Rollbar with details about the error.&lt;/p&gt;
&lt;h2 id=&quot;add-the-rollbar-notifier-sdk&quot;&gt;&lt;a href=&quot;#add-the-rollbar-notifier-sdk&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Add the Rollbar notifier SDK&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Prerequisites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create an account with Rollbar &lt;a href=&quot;https://rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;https://rollbar.com&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create your project and select Java from the list of notifiers.&lt;/li&gt;
&lt;li&gt;Select the server side access token that is generated when the project is created.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Add a Maven dependency in the &lt;code&gt;pom.xml&lt;/code&gt; file for the &lt;code&gt;Rollbar-web&lt;/code&gt; notifier in the project.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dependencies&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dependency&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;groupId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;com.rollbar&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;groupId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;artifactId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;rollbar-web&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;artifactId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;1.0.0&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dependency&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dependencies&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;For Java based applications, Rollbar provides various other modes of integration inlz. For more information please visit Rollbar’s &lt;a href=&quot;/docs/notifier/rollbar-java/&quot;&gt;&lt;strong&gt;Java documentation&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We will create a custom utility class called &lt;code&gt;ServerProvider&lt;/code&gt; which extends a Provider interface from the Rollbar library. The &lt;code&gt;ServerProvider&lt;/code&gt; class provides a Rollbar ecosystem to look up and link classes with errors, including the source branch and version that caused the error and the base package of the source code. In the code snippet below, the root is the base package path where the source code is located.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source Code:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-java&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServerProvider&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Provider&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Server&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; Server &lt;span class=&quot;token function&quot;&gt;provide&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Builder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;master&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;org.springframework.samples.petclinic&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; When the root is provided, Rollbar will give a link on the class name in the error traceback to the class in your source code repository. This will save you time because you don’t have to navigate your source code to find the location yourself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We will be using the &lt;code&gt;rollbar-web&lt;/code&gt; package to notify Rollbar of errors. Let’s start with the &lt;a href=&quot;https://github.com/spring-petclinic/spring-petclinic-angularjs/blob/master/spring-petclinic-server/src/main/java/org/springframework/samples/petclinic/web/OwnerResource.java&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;OwnerResource&lt;/a&gt; which creates a REST interface for managing a pet owner. To track errors in Rollbar we need to configure it with our access token and the &lt;code&gt;ServerProvider&lt;/code&gt; we just created. To test it, we can trigger an error with a method &lt;code&gt;throwError()&lt;/code&gt; method as shown below. When the arithmetic exception is thrown, the catch block will handle the exception and notify Rollbar with a &lt;code&gt;rollbar.error(e)&lt;/code&gt; method call.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-java&quot;&gt;&lt;code&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@RestController&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;OwnerResource&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AbstractResourceController&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; Rollbar rollbar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; null&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    ConfigBuilder configBuilder &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;withAccessToken&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ROLLBAR_SERVER_ACCESS_TOKEN&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    Config config &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;configBuilder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;production&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;handleUncaughtErrors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServerProvider&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    rollbar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;


  &lt;span class=&quot;token annotation punctuation&quot;&gt;@GetMapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/throwerror&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; String &lt;span class=&quot;token function&quot;&gt;throwError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    System&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Introducing an error code here...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      Int sum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; avg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1234&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; sum&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      System&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Error Thrown notifying to rollbar...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;error-thrown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;add-source-control-integration&quot;&gt;&lt;a href=&quot;#add-source-control-integration&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Add source control integration&lt;/h2&gt;
&lt;p&gt;Now, we would like Rollbar to integrate with our source control repository so that when an error occurs, it can automatically link us to the proper line of code. It can also tell us when there are code changes that break the deployment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Make sure to have the project root configured in Rollbar as shown below during the project integration with SCM; it’s the source code location where the Java root packages are placed. If this is not configured properly, Rollbar will not be able link the source code to an error. In this example, the project root is &lt;code&gt;/spring-petclinic-server/src/main/java&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 70.28901734104046%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsSAAALEgHS3X78AAABr0lEQVQ4y62TzU7cMBSF82LdFEFBhX0XbUGgdsO+C6DQVuqSNU8AG3bwAnTTdYXEA8C0MwnEsePEP4knc/A1E5hOGESlXunoWIn95f440ebeAV6+3cLKh69Y9pp/v42F1R2sfPyGuXdbWFrfw6u1z953g9O7Rb9e8OvXG1/w4s2nvxQdnf7A4cnZf1OEcQyHI0hVo9AOSltkWQaWMoxGI/xLRG7YoHZdEegmy8G4xA3LkaQ8eD9hfi3Qv2YolIbWGsaY+w9Hpa5w2Rvg6neM3p8YojBQxoUNQpZgohi79K6CE5Q+po2FtXeaANboxXmATIo2FIWHCQGZ58HzsZPoXS4enpOklIjocMxM6N80kMI5B845qqq6h7UAKrfTQzo8SDX6Xtfc+L7UHSCpaRqUZRmANDDKsN2j7BClH+a4ZIfLWOEqUSHTaaBSKoDqug5ZEXhSnQy1P8x4gcyL+jldcgtqS6Y+UXbkj5fspzyIUwySFLK0HWAbTeOvkTBB2rrZ97AdSirso0NpgxcW3w9/Yf/4HD8v4tnA9tokqS9FVTOBz/5T6HCS+VL40xk+N24BtegPITDbtaYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Rollbar source control integration&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-source-control-integration-712d13df210de04360979443bfddec02-e9535.png&quot;
        srcset=&quot;/static/rollbar-source-control-integration-712d13df210de04360979443bfddec02-d32c5.png 216w,
/static/rollbar-source-control-integration-712d13df210de04360979443bfddec02-06f31.png 432w,
/static/rollbar-source-control-integration-712d13df210de04360979443bfddec02-e9535.png 864w,
/static/rollbar-source-control-integration-712d13df210de04360979443bfddec02-ab1f5.png 1296w,
/static/rollbar-source-control-integration-712d13df210de04360979443bfddec02-7539a.png 1728w,
/static/rollbar-source-control-integration-712d13df210de04360979443bfddec02-22662.png 1730w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Enable the Rollbar integration plugin or add-on in your source repository. For Bitbucket, it will be under account -&gt; integrations -&gt; rollbar -&gt; add.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 26.799714896650034%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAAA50lEQVQY03WPTU7DMBCFc6Cu2HKRrthxmZykCxZcgqwQqtpVhWhoCw12nD97TPFP8nBcZYFaRvpkPc/M83Pysno1b++5zw87vwt8bHPPOfd1XXulVE9EaNsWQQ9VVRlRCiNEZaSUJvT/wMJ9cnv/iKdlDqm+I855TDUMA9I0xX5/AOci6v8wxsI6h+Tm7gGfRRm5ZphlGYSowQOaNChC8Ry1UoTT6Qd930eS2XwRzARK0Yav0YXh83qJgoXHwvK1ZFORPoeJhqyUKHiHplEXhs12A8Y4jscvaD0lPCez1saZMVnXjbsOv5eLeItWr8PZAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Rollbar integration plugin&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-integration-plugin-7e28a164ed95fc43affac02a374147d2-e9535.png&quot;
        srcset=&quot;/static/rollbar-integration-plugin-7e28a164ed95fc43affac02a374147d2-d32c5.png 216w,
/static/rollbar-integration-plugin-7e28a164ed95fc43affac02a374147d2-06f31.png 432w,
/static/rollbar-integration-plugin-7e28a164ed95fc43affac02a374147d2-e9535.png 864w,
/static/rollbar-integration-plugin-7e28a164ed95fc43affac02a374147d2-ab1f5.png 1296w,
/static/rollbar-integration-plugin-7e28a164ed95fc43affac02a374147d2-2fe4b.png 1403w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 7:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Make sure the pet clinic project is built locally and tests are running. Then, commit changes to the source repository to begin the CD process.&lt;/p&gt;
&lt;h2 id=&quot;run-the-test-cases-to-generate-errors&quot;&gt;&lt;a href=&quot;#run-the-test-cases-to-generate-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Run the test cases to generate errors&lt;/h2&gt;
&lt;p&gt;Now we will test all the pieces that we just put together. We will execute our build on Jenkins, run the application, then generate a test error.&lt;/p&gt;
&lt;p&gt;Log in to the Jenkins server or the server where you deployed the application and stop the Spring Boot process. In the earlier steps we started the pet clinic service using Jenkins, which needs to be stopped before re-deploying the new revision of the code. Otherwise, the service will not be able to start when another process is already using the same port (8080).&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;pkill -f ‘java -jar petclinic*’&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;After the application restarts, you can generate the error using the curl command from your terminal:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;curl http://localhost:8080/throwerror&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;That’s it! You just generated your first error.&lt;/p&gt;
&lt;h1 id=&quot;quickly-find-the-root-cause-of-errors&quot;&gt;&lt;a href=&quot;#quickly-find-the-root-cause-of-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Quickly find the root cause of errors&lt;/h1&gt;
&lt;p&gt;Check the Rollbar dashboard for the error logging on the &lt;strong&gt;Items&lt;/strong&gt; menu tab which will show the error details along with the link to the source code file that caused the error. The error will show the suspected deployment version along with the piece of code causing the error as well as the code checked-in user and a hyperlink to source code on the Bitbucket.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 60.3629417382999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAABxUlEQVQoz61S227VMBDMJyFUQVVRPoC3CkFBhT/gqYhy6Q/wc4g+lD5VPag9tD2Jc3PsOIntM+yuSVGhL0isNPJa2V3PzCbbefMZD3cP8GjvE7ZefsTGs3fYfnWIB88PBI9f/843d9/Lt/tP3+Lezv4tbL74gO0n+8gWyxX+JzJrLcqyRFk1qGoNpRRUbeCc+2e0bYvs9KrH0fcOXxcdvpxpHNHJ9+tmBIf3HsYY9H0PrbXk3MxExjHVcLgxwA6eJOcOJxcW3y4Mjs+NnCdLC6UnKQwhyMvzQGuNDJ0Hz7FerwUZF1VVhVVRyyuqHWFUAW0GdL0XGOdhCTGubxpnhBCR5znZVoldWU80tZ3uRNlYnP/IcbkqsaosrhlKI28Gyh0qPf7Vk8UYxadYLcB5PwT4jrwiZgWx5ebLIqlg6XVdC3RnhD0zZD/nxWTs0ewTD3QjFRlNxbdf5m93wXtaxq+lMbLZC76kgQHRWdlYrS2WV7n4WxDTlgYbO5Cfk/g6TiH1ELNhGAQimRlOU2LBEiJZ4APL9zdMi0KJ1KZp5L9lRW6YpN4Hj1mpDGSGXdclpszQdsIgbTekk7zl/M8Q30mdc4nhT9XVeEcpbw+4AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of Rollbar error logging dashboard&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-error-logging-dashboard-bf03ccd6bbc0ebdc1a716958d499de18-e9535.png&quot;
        srcset=&quot;/static/rollbar-error-logging-dashboard-bf03ccd6bbc0ebdc1a716958d499de18-d32c5.png 216w,
/static/rollbar-error-logging-dashboard-bf03ccd6bbc0ebdc1a716958d499de18-06f31.png 432w,
/static/rollbar-error-logging-dashboard-bf03ccd6bbc0ebdc1a716958d499de18-e9535.png 864w,
/static/rollbar-error-logging-dashboard-bf03ccd6bbc0ebdc1a716958d499de18-ab1f5.png 1296w,
/static/rollbar-error-logging-dashboard-bf03ccd6bbc0ebdc1a716958d499de18-7539a.png 1728w,
/static/rollbar-error-logging-dashboard-bf03ccd6bbc0ebdc1a716958d499de18-b8172.png 2094w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Clicking on an error item in the list, we see the item detail page. Next to the trace back, we can see a link to the source code causing the error.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 65.72916666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsSAAALEgHS3X78AAAByklEQVQ4y5VTWW7cMAz1/W+Rr+YmPUCBzl/QTCbxJku2ZO32vJKcpQ2SFq2AN+Q80FyeqMauAT4ksF1DhDIWelmhZ4fZehjyVx/F55hSK/52GkfB7agFL53CMM2CThnBaz9RAYdezVRsQYgJ5/P5j2hijDDGwDmHZVlwaA/4cnjEw7cH6GlCKQX/eiQh/+z7LmB/2zfEEpFqunP/g4Y7m6kzFypyLpioKx8L1ljhV9JSa2gzy/+QN1iK5Rieiu04jqh1g1KKJrRoWOiB9RoNcvkoeCGuI31Zv0IffnaUXiQmpoyGCR6NDyd0dOOZdMtlI/+iX73peN5piiz2Ktq1aJFx5ZZ/TzivEc+9wexW8hOeByt8CEFsomSGRj7vl07rdYVSSvccktD7IN2N1PppIG1mi55Wpzf+ntDTjjL39fsRg3GyPu20SGfcIcvBWr675W3b3vm3m7tx3BHzN3y2BQ1nt9Yi5k1umi1j8UWsJc6nSq+owl45jkvlYplL+VfxJpNeoR8EvuvF8kpogvf+A/qRoIKgHTytXBBJbmhYUH4h7dDi2B4Fp/6EXve0Kop0avGmWgx6QDd1eHqZ8XSy+PHqcHyjd2/eF/wJXfvw4C4aERIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of error detail&quot;
        title=&quot;&quot;
        src=&quot;/static/error-detail-f4d055e8ac4f177f5ec1e9e2a5876d6e-e9535.png&quot;
        srcset=&quot;/static/error-detail-f4d055e8ac4f177f5ec1e9e2a5876d6e-d32c5.png 216w,
/static/error-detail-f4d055e8ac4f177f5ec1e9e2a5876d6e-06f31.png 432w,
/static/error-detail-f4d055e8ac4f177f5ec1e9e2a5876d6e-e9535.png 864w,
/static/error-detail-f4d055e8ac4f177f5ec1e9e2a5876d6e-ab1f5.png 1296w,
/static/error-detail-f4d055e8ac4f177f5ec1e9e2a5876d6e-7539a.png 1728w,
/static/error-detail-f4d055e8ac4f177f5ec1e9e2a5876d6e-66d41.png 1920w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;When you click on the link it will directly open the class in the bitbucket repository and highlight the suspected piece of the code, depicted in the next screenshot:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 22.52%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsSAAALEgHS3X78AAAAuUlEQVQY031POw7CMAzt/S/CxkXYEBsCCVDbpElqN4mdT1OVlC4MiKcnD7bex83zcFQaBwU4eQCQUmuDzgfniDkQhTrnuay/0HRyVAatY08RAetKSF3ZSiWElL0YAKszwGgt4KgnMBRCTPkjHvD2VAbs5AhxE/dCta/WiI7JlxTKnEqOS/kR3gxmUltPJo61dpqXmJfLFU/n/nyHR8fWMlN9gUPK9frNrfarlSPaXbxbek/euZDS+hdvRtEeKshQXrIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of source control repository&quot;
        title=&quot;&quot;
        src=&quot;/static/source-control-repository-5d5d6d930f9f575b78f0f7f19ab2157d-e9535.png&quot;
        srcset=&quot;/static/source-control-repository-5d5d6d930f9f575b78f0f7f19ab2157d-d32c5.png 216w,
/static/source-control-repository-5d5d6d930f9f575b78f0f7f19ab2157d-06f31.png 432w,
/static/source-control-repository-5d5d6d930f9f575b78f0f7f19ab2157d-e9535.png 864w,
/static/source-control-repository-5d5d6d930f9f575b78f0f7f19ab2157d-ab1f5.png 1296w,
/static/source-control-repository-5d5d6d930f9f575b78f0f7f19ab2157d-7539a.png 1728w,
/static/source-control-repository-5d5d6d930f9f575b78f0f7f19ab2157d-e3a7e.png 2500w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;A second way to find the root cause of errors is by using the &lt;a href=&quot;/docs/deploy-tracking/#suspect-deploy&quot;&gt;&lt;strong&gt;Suspect Deploy&lt;/strong&gt;&lt;/a&gt; tab. It shows the revision where the error was first observed, along with changes that were made to the code since the previous deployment. We can see the commit message indicating that an error code was introduced.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 41.314031180400896%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAABGUlEQVQoz4VRi26EMAzj/79xr9ttugNaWkrf0HppYJq2ia2S5SZpTGK6rVT4uCGvBSFtWLdC8YqUd2551+KQYIcedhyQrPvqIWZQb60VXUqZipkEViocnEiA4HyiXOJ8tB5Ba2TnsC4Li2308cZ53cVZ0IcIqQzEpDE2SE3xTPHMucb9OEHogMV4lBi58QydlApPzxcsNvBk15dXvD08or9cYakWSJyhDdf/Q2dpBaXnfWxroQaaZo48kST+hFAeSYhjvXN0IQRo8iamxCNbKWD6O4pdvmMxqKX8uS6vbOiPvd9GCPKuFwp38us2SLLAo50awyFqUdyBdqdczQk/TxfJZKUU4onZUU4w2vHde89wZFPbpJj51/sP3MNuRL9+GGcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of alternate way of source control repository&quot;
        title=&quot;&quot;
        src=&quot;/static/alternate-way-source-control-repository-5d5c4bdfca10a16001f83a1b5d8201be-e9535.png&quot;
        srcset=&quot;/static/alternate-way-source-control-repository-5d5c4bdfca10a16001f83a1b5d8201be-d32c5.png 216w,
/static/alternate-way-source-control-repository-5d5c4bdfca10a16001f83a1b5d8201be-06f31.png 432w,
/static/alternate-way-source-control-repository-5d5c4bdfca10a16001f83a1b5d8201be-e9535.png 864w,
/static/alternate-way-source-control-repository-5d5c4bdfca10a16001f83a1b5d8201be-ab1f5.png 1296w,
/static/alternate-way-source-control-repository-5d5c4bdfca10a16001f83a1b5d8201be-7539a.png 1728w,
/static/alternate-way-source-control-repository-5d5c4bdfca10a16001f83a1b5d8201be-b6747.png 1796w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Clicking on the link with the revision signature shows us a diff where we can see an additional error was introduced. Both versions result in a divide by zero error. In a real-world scenario, this would tell us what change caused the error, who made it and when.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 42.34875444839857%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAABPklEQVQoz4WR227DIAyG8/4PuYulazoOJpwhkP4zrK0q7WKKPtkY/zZ2Fus8bkLictmgyeI87//S/5zPyfCX3BNCJhTnYFyCpAS9Jyjza4WOM/ZkxMWbP5Ams7Yi5oal5ILt9g0hJZRSIK1BpF9WazUhRik5mTHOlVJMzb4btnqypJSwfm1cUKEeB0KM8CGAzA5jDHZr4TnmvEfk3MG4Tzmj1Do1A+sDxvpmwdGViHDni8LJgYvRt4BmDBN4gszJNcTJ8I+Y0EuZGhwNaH2yVO6iNUFy0VB2pMMh1h0+G1zFJy7bB5RcYaNGbn5Sz/DwHedbzrdTM1gKdxl7ELyP9viOO49eItbriqvkdRgF4w038XDJgxzNe5ccF82s6C+W3jtG0YOffuff/uTsJ1prbDs6jzLOww4aj9jf4u+6H3kTaXxg5VwKAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of revision signature&quot;
        title=&quot;&quot;
        src=&quot;/static/revision-signature-d0084f3888a678ddfffe36f6b889e94a-e9535.png&quot;
        srcset=&quot;/static/revision-signature-d0084f3888a678ddfffe36f6b889e94a-d32c5.png 216w,
/static/revision-signature-d0084f3888a678ddfffe36f6b889e94a-06f31.png 432w,
/static/revision-signature-d0084f3888a678ddfffe36f6b889e94a-e9535.png 864w,
/static/revision-signature-d0084f3888a678ddfffe36f6b889e94a-ab1f5.png 1296w,
/static/revision-signature-d0084f3888a678ddfffe36f6b889e94a-69b5c.png 1686w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;We have successfully generated an error, tracked the error with Rollbar, and identified the root cause of the problem quickly with Rollbar.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Rollbar helps you monitor production deployments and notifies you when new errors occur. It can trace errors, then pinpoint the suspected deployment and code version. This will help you troubleshoot errors faster because you can quickly see what change caused it, when, and by whom. This will help you quickly identify and fix errors before they affect more customers.&lt;/p&gt;
&lt;p&gt;Now that you understand how to configure Jenkins with Rollbar, try setting up your own application. To learn more about how Rollbar helps power continuous delivery, check out our ebook &lt;a href=&quot;https://try.rollbar.com/low-risk-continuous-delivery-guide/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;Low-Risk Continuous Delivery&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;</content:encoded></item><item><title><![CDATA[Monitoring tools for serverless environments and AWS Lambda]]></title><description><![CDATA[Serverless computing platforms like AWS Lambda represent a new computing paradigm. Over the past decade, we’ve been trying to abstract the…]]></description><link>https://rollbar.com/blog/monitoring-serverless-lambda/</link><guid isPermaLink="false">https://rollbar.com/blog/monitoring-serverless-lambda/</guid><pubDate>Mon, 08 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Serverless computing platforms like AWS Lambda represent a new computing paradigm. Over the past decade, we’ve been trying to abstract the application layer from the infrastructure layer. VMs started this by virtualizing hardware servers, and Docker containers extended this by packaging just the application code separate from the host system.&lt;/p&gt;
&lt;p&gt;The next step in this process is to completely remove the host from the equation, and simply focus on the application code—which is what serverless computing is all about. But as with most things new, serverless forces you to change how you used to do things, including the way you monitor functions.&lt;/p&gt;
&lt;p&gt;Below, I explain how monitoring changes in a serverless environment. I focus on Lambda in particular, although most of these observations apply to any type of modern serverless platform.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 355px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 109.57746478873239%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAIAAABPIytRAAAACXBIWXMAAAsSAAALEgHS3X78AAACbElEQVQ4y42TOW8aURCA+REUiI4KCRpEQUvHL6CiiJIIKQ1lShSkVBSRHCkp4gIUKc6hUMUIQgzEwhzmWgMOlxOckJhFwuZYFi+7b6+XMTgEWwt4iqfRvPnezJtDhdeKLMuSLHMITSYTnuclSVq+Va2Hm81mMBTai8e/JpORaCwUDne73XWwPDshSOYwc3h0zPd/cvnXqH/KYcwgFI3H6/U6ZLQCnl2ARzqTBgW1c+xLK/f5Cc8xvIwFLIcikdFopADPycFgUCCIIU2LosBjzLYOJm8fsN2qgDEvin2KSqVSgiAowyRJZgt5EWPwYGU8PtgePbPQlV1ekgVJnPJ8fH8f6qcMdzqdXLEIGoRiWmnq/aPxzkMq6OHoHlg4QYith7O5LLQFUSTz7j6d3KZHF/Sbe2zqFT/sAByNxRFCyjDDMIVivn0xlhtB9tNjbvAbSj398nT6wopPws3Wj8rxN2jHymqfnXVSmfTlkMQCK2EZspWoP/iS7PTOI3tRjmWVWyX9k91gcOfDx++nv877AySKZH9Yqp8k0+ler6fcZ7BChUGp1WrPt7ZisWij0TgqlUuVSrlSLpWI0XCoPGGLD2ezWb/fn0gk5nYYiXa7DfZltxvwwhQIBIxGo8fjgRSuFmNpGUBfuN2A506FQsFgMGi1Wq/XezWbCM3fXWZuw/M72BibzabRaBwOx3g8Xry4SlQLEjbW5XKp1Wqr1VqtVsEiiuL6hf0f2efzQUyTyQR/xrOpxpvkGiYIQqfT6fV6t9t9R/IahgW0WCwA2+12SPVWSTfAHMc5nU6z2Qz7sLFICmlDS2Dolrt9F/kLhCO2KkJS68sAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot of serverless environment&quot;
        title=&quot;&quot;
        src=&quot;/static/serverless-environment-592e467534fe84ddef9db67fac2b59f2-fbe42.png&quot;
        srcset=&quot;/static/serverless-environment-592e467534fe84ddef9db67fac2b59f2-6f698.png 216w,
/static/serverless-environment-592e467534fe84ddef9db67fac2b59f2-fbe42.png 355w&quot;
        sizes=&quot;(max-width: 355px) 100vw, 355px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;how-monitoring-is-different-with-serverless&quot;&gt;&lt;a href=&quot;#how-monitoring-is-different-with-serverless&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How monitoring is different with serverless&lt;/h2&gt;
&lt;p&gt;In traditional client-server apps, you typically monitor the performance of your servers, network latency, and more. However, with serverless platforms like Lambda, these metrics are irrelevant. This is because the vendor manages the underlying servers and plumbing, leaving you to focus exclusively on your application code.&lt;/p&gt;
&lt;p&gt;This means you don’t need to worry about how much compute power your servers have available to execute your code. Lambda automatically scales the available compute capacity to ensure your code is executed (there’s a caveat, but more on that later). You don’t have to worry about load balancing across multiple servers, or optimizing network latency. AWS takes care of this, too.&lt;/p&gt;
&lt;h2 id=&quot;serverless-metrics-to-monitor&quot;&gt;&lt;a href=&quot;#serverless-metrics-to-monitor&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Serverless metrics to monitor&lt;/h2&gt;
&lt;p&gt;Yet while all this is hidden from you, and handled by AWS, there are other metrics you should monitor.&lt;/p&gt;
&lt;p&gt;The most important element within your control is your application code. With Lambda, you upload your application code as a function, and AWS handles the execution of this code. Errors in any line of your code will result in the function not executing as expected.&lt;/p&gt;
&lt;p&gt;Although Lambda handles provisioning of resources to execute your functions, it has &lt;a href=&quot;http://docs.aws.amazon.com/lambda/latest/dg/limits.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;limits&lt;/strong&gt;&lt;/a&gt; to the amount of memory and &lt;a href=&quot;http://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;concurrent executions&lt;/strong&gt;&lt;/a&gt; it can allocate to functions. The maximum allocated memory is 1536MB, and the maximum number of concurrent executions varies by region—some can run 500 events per minute, while others like US West can run 3,000 events.&lt;/p&gt;
&lt;p&gt;If a function exceeds the limits on memory and concurrency, Lambda stops executing the function and throws an exception. If, for example, you experience latency with any of your functions, you should check the memory and concurrency rate. This is different from monitoring traditional server performance, and takes some getting used to. You may need to remove some functions, or make some functions smaller and more simple. However, this is still much easier than having to manage the infrastructure yourself and keep scaling resources according to demand.&lt;/p&gt;
&lt;p&gt;Another common cause of errors in Lambda is access and permissions. If your Lambda function is supposed to access data stored in another AWS service, but doesn’t have the necessary permissions set in AWS IAM, your code will not execute.&lt;/p&gt;
&lt;h2 id=&quot;amazons-built-in-monitoring-for-lambda&quot;&gt;&lt;a href=&quot;#amazons-built-in-monitoring-for-lambda&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Amazon’s built-in monitoring for Lambda&lt;/h2&gt;
&lt;p&gt;AWS primarily uses &lt;a href=&quot;http://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;CloudWatch&lt;/strong&gt;&lt;/a&gt; to monitor Lambda performance. CloudWatch tracks metrics like the number of functions executed, latency in execution, and errors during execution. By default, these metrics are recorded in one-minute intervals. If you want to go beyond these, you can setup &lt;a href=&quot;http://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;custom metrics&lt;/strong&gt;&lt;/a&gt; in CloudWatch using the AWS CLI or API. Custom metrics are more powerful as they can be recorded in intervals as low as one second. However, these high-resolution metrics come with a fee, unlike the default metrics which are free of charge.&lt;/p&gt;
&lt;p&gt;CloudWatch also records errors to logs. The errors in CloudWatch logs are another crucial source of insight when troubleshooting serverless application problems.&lt;/p&gt;
&lt;p&gt;Additionally, AWS provides scanning for application performance on Lambda using &lt;a href=&quot;http://docs.aws.amazon.com/lambda/latest/dg/lambda-x-ray.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;X-Ray&lt;/strong&gt;&lt;/a&gt;. This service tracks the progress of a request in an application across various AWS services. So, if a Lambda function is triggered by an API Gateway, and during execution accesses data from an S3 bucket, X-Ray can trace the progress of this function and display it visually. This helps with root cause analysis.&lt;/p&gt;
&lt;p&gt;Once you’ve identified the root cause and you’d like to dig deeper, you can look into &lt;a href=&quot;http://docs.aws.amazon.com/lambda/latest/dg/logging-using-cloudtrail.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;CloudTrail&lt;/strong&gt;&lt;/a&gt; logs to get additional details on errors. CloudTrail logs all API calls within Lambda. It includes details such as the source IP address, time, frequency of occurrence, and more.&lt;/p&gt;
&lt;h2 id=&quot;error-monitoring-for-lambda&quot;&gt;&lt;a href=&quot;#error-monitoring-for-lambda&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Error Monitoring for Lambda&lt;/h2&gt;
&lt;p&gt;While AWS has provided many options to monitor Lambda performance, you still need to monitor your application logic for errors. Logical errors can cause your service to give failure responses to clients in the best case, or fail silently in the worst case. If you use a tool like Rollbar for end-to-end monitoring of your system, you can &lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.js/#lambda&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;send your application errors and uncaught exceptions to Rollbar&lt;/strong&gt;&lt;/a&gt; for holistic analysis. You can also leverage Rollbar’s unique monitoring features, like de-duping of alerts, viewing of detailed stack traces, and gauging the impact of errors with user tracking to fix errors sooner.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;As you work with Lambda, there’s a lot to adapt to. Monitoring Lambda is different from monitoring traditional applications. There isn’t much lower-level infrastructure to monitor, but there’s a new way to monitor application performance at the upper layers of the stack. You need to leverage AWS’ built-in monitoring services and features like CloudWatch, X-Ray, and custom metrics. Your monitoring can also be more effective by adding on error monitoring tools like Rollbar which give you a deeper view into logical errors.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;signup for a 14-day free trial&lt;/a&gt;&lt;/strong&gt; of Rollbar and let us help you take control of impactful production errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[What We Shipped in 2017 📦]]></title><description><![CDATA[At Rollbar, 2017 has been a year of exciting growth and development for the product and the team. We've grown the total number of users to…]]></description><link>https://rollbar.com/blog/what-we-shipped-in-2017/</link><guid isPermaLink="false">https://rollbar.com/blog/what-we-shipped-in-2017/</guid><pubDate>Thu, 28 Dec 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At Rollbar, 2017 has been a year of exciting growth and development for the product and the team. We&apos;ve grown the total number of users to over 100,000, processing billions of events per week, and the team has more than doubled in size. I know it&apos;s cliche, but, it genuinely does feel like we&apos;re just getting started. ;-)&lt;/p&gt;
&lt;p&gt;Before we put this year behind us and speed into 2018, I thought we&apos;d look back, and share some of the highlights of what we shipped in 2017.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;error-notifier-sdks&quot;&gt;&lt;a href=&quot;#error-notifier-sdks&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Error Notifier SDKs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/rollbar-php-update/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;PHP SDK 1.0+&lt;/a&gt;&lt;/strong&gt; [IMPROVEMENT]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/rollbar-javascript-error-monitoring-update/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JavaScript SDK 2.0+&lt;/a&gt;&lt;/strong&gt; [IMPROVEMENT]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/lambda-support-for-nodejs-python/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Lambda support for Python and Node&lt;/a&gt;&lt;/strong&gt; [NEW]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/automated-laravel-error-reporting/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Laravel SDK&lt;/a&gt;&lt;/strong&gt; [NEW]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/official-java-notifier-sdk/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Java and Android SDK 1.0+&lt;/a&gt;&lt;/strong&gt; [IMPROVEMENT]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar-react-native&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;React Native SDK (Alpha)&lt;/a&gt;&lt;/strong&gt; [NEW]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar-ios&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;iOS SDK 1.0+&lt;/a&gt;&lt;/strong&gt; [IMPROVEMENT]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;product-features&quot;&gt;&lt;a href=&quot;#product-features&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Product Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/introducing-javascript-telemetry/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JavaScript Telemetry&lt;/a&gt;&lt;/strong&gt; [NEW]&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JavaScript Source Maps&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/javascript-source-map-update/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Major JavaScript source map updates&lt;/a&gt;&lt;/strong&gt; [IMPROVEMENT]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://changelog.rollbar.com/un-minify-js-method-names-27541&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Un-minify JavaScript method names&lt;/a&gt;&lt;/strong&gt; [IMPROVEMENT]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://changelog.rollbar.com/automatic-js-source-map-processing-23183&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Automatic JavaScript source map processing&lt;/a&gt;&lt;/strong&gt; [IMPROVEMENT]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Error Merging and Grouping&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/introducing-error-merging-and-unmerging/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Error merging and unmerging&lt;/a&gt;&lt;/strong&gt; [NEW]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/merge-many-items-at-once/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Edit and merge multiple errors at once&lt;/a&gt;&lt;/strong&gt; [NEW]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://changelog.rollbar.com/export-rql-results-as-csv-16391&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Export RQL results as CSV&lt;/a&gt;&lt;/strong&gt; [IMPROVEMENT]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://changelog.rollbar.com/view-errors-in-each-deploy-21998&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;View errors in each deploy&lt;/a&gt;&lt;/strong&gt; [NEW]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;security-and-compliance&quot;&gt;&lt;a href=&quot;#security-and-compliance&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Security and Compliance&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compliance&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/introducing-compliant-saas-error-monitoring/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Compliant SaaS (HIPAA and ISO 27001)&lt;/a&gt;&lt;/strong&gt; [NEW]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/encryption-at-rest/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Encryption at rest&lt;/a&gt;&lt;/strong&gt; [NEW]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;integrations&quot;&gt;&lt;a href=&quot;#integrations&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Integrations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/rollbar-integration-for-gitlab/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitLab source control and issues&lt;/a&gt;&lt;/strong&gt; [NEW]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/marketplace/rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub Marketplace&lt;/a&gt;&lt;/strong&gt; [NEW]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Love and use Rollbar? We value your feedback. What do you think of our new features and improvements in 2017? What sort of things would you like to see shipped in 2018? Please leave a comment below this post or connect with us at &lt;strong&gt;&lt;a href=&quot;mailto:hi@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;hi@rollbar.com&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;signup for a 14-day free trial&lt;/a&gt;&lt;/strong&gt; of Rollbar and let us help you take control of impactful production errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Most Popular Java Web Frameworks]]></title><description><![CDATA[As Java has evolved over the years, multiple attempts have been made to simplify development for various use cases. From official standards…]]></description><link>https://rollbar.com/blog/most-popular-java-web-frameworks/</link><guid isPermaLink="false">https://rollbar.com/blog/most-popular-java-web-frameworks/</guid><pubDate>Tue, 19 Dec 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As Java has evolved over the years, multiple attempts have been made to simplify development for various use cases. From official standards like Java Enterprise Edition, to community-driven frameworks, &lt;strong&gt;&lt;a href=&quot;/error-tracking/java&quot;&gt;Java&lt;/a&gt;&lt;/strong&gt; is continuing to prove itself to be adaptable and viable.&lt;/p&gt;
&lt;p&gt;Our top list is based on usage from &lt;strong&gt;&lt;a href=&quot;https://hotframeworks.com/languages/java&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Hotframework.com&apos;s Java ranking&lt;/a&gt;&lt;/strong&gt; and several other sources including blog posts and GitHub download numbers.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;The top three are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#heading=h.qaipnglsiwak&quot;&gt;Spring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#heading=h.6dgqr98c66ae&quot;&gt;JSF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#heading=h.rv2iqe963fr&quot;&gt;GWT&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other notable Java Web Frameworks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.playframework.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Play!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://struts.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Struts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vaadin.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Vaadin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://grails.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Grails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Java Frameworks that are popular but not for the Web (We don’t want to forget them):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://hibernate.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Hibernate&lt;/a&gt; (Data-focused)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://maven.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Maven&lt;/a&gt; (Build-focused)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ant.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Apache Ant&lt;/a&gt; with &lt;a href=&quot;https://ant.apache.org/ivy/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ivy&lt;/a&gt; (Build-focused)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;spring&quot;&gt;&lt;a href=&quot;#spring&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Spring&lt;/h2&gt;
&lt;p&gt;Project Site: &lt;a href=&quot;https://spring.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://spring.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Primary Sponsor: &lt;a href=&quot;https://pivotal.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Pivotal Software&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Spring is more than just a web framework. It is a complete programming model that is built on and with Java, starting with Spring Boot, which is a way to get a spring application up and running with minimal configuration and no application server required. At the other end of the spectrum is Spring Cloud, which is a combination of components that allows developers to build resilient and reliable cloud-native applications that leverage the latest distributed patterns like a microservices architecture — two examples include application &lt;a href=&quot;https://projects.spring.io/spring-security/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;security&lt;/a&gt; and &lt;a href=&quot;https://projects.spring.io/spring-batch/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;batch&lt;/a&gt; processing.&lt;/p&gt;
&lt;p&gt;There are many use cases for Spring, and with the introduction of Spring Boot, it is a great solution for companies that are moving towards containers as it greatly simplifies the components required to support the running application.&lt;/p&gt;
&lt;p&gt;Getting started with Spring is as simple as going to &lt;a href=&quot;https://start.spring.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Spring Initializr&lt;/a&gt; and selecting the build framework you desire and any and all the Spring projects you want included in the initial application. It will create the Maven or Gradle configuration and all the basic spring configuration required to start.&lt;/p&gt;
&lt;p&gt;Creating a simple web application starting with Initializr (Figure 1):&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 48.12%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABQElEQVQoz42OS0vDQBSF50+5VUQUfLRFRP9Am1ZasBsftLVW6+M/uBPqxq2KOxdu3LSupIIiGKdNTJO0nU4ySYx5eJsiCE2gH4fDcLnnzkHrG7HVtcV4YiGemF+JzS0tz07PTE0oVK2UT6uHx0cVeJydgJUO9ovlUmHkxb2dwu52lJAfQAhpB2iapuu6LMswMQxDEASMMc/ziqJYluW6ruM4/h9IFEVYBYc9z/P8f0AY5lKAHwaCJKUU7nlj6Mz4FL4+cLuj9pQ+6VO9S+iAGd+OZzvDb5CqqoyxnzGgJGEmlhTcUTtEUylTKOsxi5g2qGvYw7BGNTsCaYDvXmq3zYt66z68dui0/v5w3ajdNC6vHs+brSc/AgSdmR5YgGkzEC+/vbafR+pSOTK8FZDP59PZVCbHbebSXDbJZZKpCfgFFVvTEGVyxbIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Spring Initializr&quot;
        title=&quot;&quot;
        src=&quot;/static/image_0-c7bd32fee7bef7bfb9e5650b867657df-e9535.png&quot;
        srcset=&quot;/static/image_0-c7bd32fee7bef7bfb9e5650b867657df-d32c5.png 216w,
/static/image_0-c7bd32fee7bef7bfb9e5650b867657df-06f31.png 432w,
/static/image_0-c7bd32fee7bef7bfb9e5650b867657df-e9535.png 864w,
/static/image_0-c7bd32fee7bef7bfb9e5650b867657df-ab1f5.png 1296w,
/static/image_0-c7bd32fee7bef7bfb9e5650b867657df-7539a.png 1728w,
/static/image_0-c7bd32fee7bef7bfb9e5650b867657df-e3a7e.png 2500w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;… which will create a Zip file with the following files in it:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;./mvnw.cmd
./pom.xml
./.gitignore
./.mvn/wrapper/maven-wrapper.properties
./.mvn/wrapper/maven-wrapper.jar
./mvnw
./src/test/java/com/example/demo/DemoApplicationTests.java
./src/main/resources/application.properties
./src/main/java/com/example/demo/DemoApplication.java&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You need a Controller — &lt;code&gt;src/main/java/com/example/demo/DemoController.java&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-java&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; com&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;demo&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;springframework&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stereotype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Controller&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;springframework&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;web&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bind&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;annotation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RequestMapping&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token annotation punctuation&quot;&gt;@Controller&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DemoController&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; String &lt;span class=&quot;token function&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;And a template file — &lt;code&gt;src/main/resources/templates/hello.html&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-html&quot;&gt;&lt;code&gt;&lt;span class=&quot;token doctype&quot;&gt;&amp;lt;!DOCTYPE HTML&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Hello World&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;http-equiv&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Content-Type&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/html; charset=UTF-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Hello World&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;jsf-java-server-faces&quot;&gt;&lt;a href=&quot;#jsf-java-server-faces&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JSF (Java Server Faces)&lt;/h2&gt;
&lt;p&gt;Project Site: &lt;strong&gt;&lt;a href=&quot;http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Primary Sponsor: &lt;strong&gt;&lt;a href=&quot;https://www.oracle.com/index.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Oracle&lt;/a&gt; (&lt;a href=&quot;https://blogs.oracle.com/theaquarium/opening-up-java-ee&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;soon to be a separate foundation&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;JSF is a specification for displaying web user interfaces that is defined as part of the Java Platform, Enterprise Edition (JEE). JSF 1 was released in 2004, incorporated into JEE 5 and uses Java Server Pages (.jsp) as its templates. JSF 2 was released in 2009 as part of JEE 6, and leverages Facelets for templating and supports AJAX calls with a browser to allow modern web application lifecycles. JSF is component-based, allowing it to be expanded with additional components. &lt;strong&gt;&lt;a href=&quot;https://www.icesoft.com/icefaces/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;IceFaces&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://myfaces.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;MyFaces&lt;/a&gt;&lt;/strong&gt; are examples of popular add-on components.&lt;/p&gt;
&lt;p&gt;As JSF is part of the Java standard, it is popular with development teams that want to stick to published standards for increased portability across platforms. JSF also allows existing backend Java code to be extended with a web interface without having to refactor the base application by introducing a new framework.&lt;/p&gt;
&lt;p&gt;A simple JSF application requires a Managed Bean, Facelet, and mapping the servlet.&lt;/p&gt;
&lt;p&gt;helloworld.java&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-java&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; helloworld&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; javax&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;faces&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bean&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ManagedBean&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token annotation punctuation&quot;&gt;@ManagedBean&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HelloWorld&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; String world &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; String &lt;span class=&quot;token function&quot;&gt;getworld&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; world&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;helloworld.xhtml&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-html&quot;&gt;&lt;code&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;xmlns&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://www.w3.org/1999/xhtml&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;h&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://java.sun.com/jsf/html&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;h:&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Facelets Hello World&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;h:&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;h:&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        #{hello.world}
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;h:&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;web.xml&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;servlet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;servlet-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Faces Servlet&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;servlet-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;servlet-class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;javax.faces.webapp.FacesServlet&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;servlet-class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;load-on-startup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;1&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;load-on-startup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;servlet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;servlet-mapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;servlet-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Faces Servlet&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;servlet-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;url-pattern&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;/faces/*&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;url-pattern&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;servlet-mapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;gwt-google-web-toolkit&quot;&gt;&lt;a href=&quot;#gwt-google-web-toolkit&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;GWT (Google Web Toolkit)&lt;/h2&gt;
&lt;p&gt;Project Site: &lt;strong&gt;&lt;a href=&quot;http://www.gwtproject.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.gwtproject.org/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Primary Sponsor: Google&lt;/p&gt;
&lt;p&gt;GWT is much like JSF in that it is strictly focused on building web interfaces. It is more popular than native JSF as it makes it easy to maintain complex JavaScript user interfaces with Java code. GWT has lost some of its popularity over the last couple of years as more development teams are pushing Java to the backend and having it expose REST APIs which are consumed by both native mobile apps and user interfaces built in Node.js, using frameworks like &lt;strong&gt;&lt;a href=&quot;https://angular.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Angular&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A tutorial on how to build a simple GWT application can be found on its project site: &lt;strong&gt;&lt;a href=&quot;http://www.gwtproject.org/doc/latest/tutorial/gettingstarted.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Getting Started building a GWT app&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In summary, there are many viable Java Web Frameworks that can be used to address your needs. None of the top three are bad choices—It comes down to personal preference. Just be aware that once you commit to a framework and start to leverage its features, switching to another framework is not an insignificant amount of work.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;signup for a 14-day free trial&lt;/a&gt;&lt;/strong&gt; of Rollbar and let us help you take control of impactful Java errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Spring MVC Exception Handling and Monitoring]]></title><description><![CDATA[The  Spring Famework   is the most popular framework for Java according to  hotframeworks.com  . It provides a model view controller (MVC…]]></description><link>https://rollbar.com/blog/spring-mvc-exception-handling/</link><guid isPermaLink="false">https://rollbar.com/blog/spring-mvc-exception-handling/</guid><pubDate>Mon, 27 Nov 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;strong&gt;&lt;a href=&quot;https://spring.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Spring Famework&lt;/a&gt;&lt;/strong&gt; is the most popular framework for Java according to &lt;strong&gt;&lt;a href=&quot;http://hotframeworks.com/languages/java&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;hotframeworks.com&lt;/a&gt;&lt;/strong&gt;. It provides a model view controller (MVC) architecture and readily available components to develop flexible and loosely coupled web applications.&lt;/p&gt;
&lt;p&gt;If you are new to Rollbar, it helps you monitor errors in real-world applications. It provides you with a live error feed from the application, including complete stack traces and request data from the browser to debug errors quickly. It lets you easily understand user experience by tracking who is affected by each error. Learn more about our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/error-tracking/java/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Java error monitoring product features&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;While Rollbar’s notifier works with any Java application, we’re going to show you how to set it up with Spring and how to try it out yourself with a working example app.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;create-a-global-exception-handler&quot;&gt;&lt;a href=&quot;#create-a-global-exception-handler&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create a global exception handler&lt;/h2&gt;
&lt;p&gt;To track all of our exceptions in Spring, we’ll be making use of a global exception handler. This receives uncaught exceptions for your whole application, not just an individual controller. Spring offers two main approaches:&lt;/p&gt;
&lt;h3 id=&quot;1-controlleradvice&quot;&gt;&lt;a href=&quot;#1-controlleradvice&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. ControllerAdvice&lt;/h3&gt;
&lt;p&gt;When you create a class annotated with &lt;strong&gt;&lt;a href=&quot;https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;@ControllerAdvice&lt;/a&gt;&lt;/strong&gt;, it will handle exceptions created by all your controllers. Each controller advice defines a method with a &lt;code&gt;@ExceptionHandler&lt;/code&gt; annotation which becomes the default handler. You can insert your custom code to print or track errors there.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ControllerAdvice&lt;/code&gt; is only available in Spring 3.2 and above. We won’t be covering this approach in detail but you can see our working &lt;strong&gt;&lt;a href=&quot;https://github.com/RollbarExample/Rollbar-Java-Example/blob/master/src/main/java/com/in28minutes/controller/GlobalExceptionHandlerController.java&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;example on GitHub&lt;/a&gt;&lt;/strong&gt;. You will need to uncomment the annotation at the top to run it.&lt;/p&gt;
&lt;h3 id=&quot;2-handlerexceptionresolver&quot;&gt;&lt;a href=&quot;#2-handlerexceptionresolver&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. HandlerExceptionResolver&lt;/h3&gt;
&lt;p&gt;Spring Framework also provides a &lt;code&gt;HandlerExceptionResolver&lt;/code&gt; interface that you can implement to create a global exception handler. Since it has been around since early releases, it should be compatible with both old and new code. The Spring Framework makes it easy to set up by providing a &lt;code&gt;SimpleMappingExceptionResolver&lt;/code&gt;. We’ll show you how to override it to create your own global handler which will track exceptions.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Warning:&lt;/em&gt; Be careful about mixing both approaches in the same application. Most applications use one approach, and using two may result in unexpected behavior.&lt;/p&gt;
&lt;p&gt;The example below shows you how to override the &lt;code&gt;SimpleMappingExceptionResolver&lt;/code&gt;. It allows you to create a custom method to build a log message and to return a view to the user with a more friendly error page. If you want to run this example yourself, check out our project &lt;strong&gt;&lt;a href=&quot;https://github.com/RollbarExample/Rollbar-Java-Example&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar-Example-Java&lt;/a&gt;&lt;/strong&gt; on GitHub.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-java&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyMappingExceptionResolver&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SimpleMappingExceptionResolver&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    String accessToken &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;8e194f5f31db4ff1b4e3e0951a40c936&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    Rollbar rollbar&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;MyMappingExceptionResolver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

        &lt;span class=&quot;token function&quot;&gt;setWarnLogCategory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;MyMappingExceptionResolver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; String &lt;span class=&quot;token function&quot;&gt;buildLogMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Exception e&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; HttpServletRequest req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

        System&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Exception : &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        RequestProvider requestProvider &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RequestProvider&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Builder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;userIpHeaderName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRemoteAddr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        rollbar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;withAccessToken&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;accessToken&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requestProvider&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MVC exception: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getLocalizedMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; ModelAndView &lt;span class=&quot;token function&quot;&gt;doResolveException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;HttpServletRequest req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; HttpServletResponse resp&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Object handler&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;Exception ex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

        ModelAndView mav &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doResolveException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resp&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handler&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        mav&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addObject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRequestURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; mav&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;In order to make use of this class, you must configure it in your bean configuration file. Here we map in a default error page called &quot;error&quot;. We also pass in the exception attribute, which will give our view access to the exception object for reporting.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;bean&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;simpleMappingExceptionResolver&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;com.in28minutes.controller.MyMappingExceptionResolver&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;property&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;exceptionMappings&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;props&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;prop&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;java.lang.Exception&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;error&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;props&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;property&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;property&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;defaultErrorView&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;property&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;exceptionAttribute&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ex&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;bean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;adding-rollbars-java-error-monitoring-sdk&quot;&gt;&lt;a href=&quot;#adding-rollbars-java-error-monitoring-sdk&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Adding Rollbar&apos;s Java error monitoring SDK&lt;/h2&gt;
&lt;p&gt;Now that we have a simple exception handler wired up, we’re going to show you how to integrate &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar-java/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar’s Java error logging SDK&lt;/a&gt;&lt;/strong&gt; in your code.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Visit &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/signup/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://rollbar.com/signup/&lt;/a&gt;&lt;/strong&gt; and sign up for an account if you haven’t done so yet. Next, create your project and select Java  from the list of notifiers. Select the server side access token that is generated for you. You’ll need this to configure Rollbar in the steps below.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a dependency for the &lt;code&gt;rollbar-web&lt;/code&gt; notifier in your chosen package management system. For Maven, add the dependency below in your &lt;code&gt;pom.xml&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dependencies&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dependency&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
       &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;groupId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;com.rollbar&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;groupId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
       &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;artifactId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;rollbar-web&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;artifactId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
       &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;1.0.0&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dependency&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dependencies&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;For Gradle:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-java&quot;&gt;&lt;code&gt;&lt;span class=&quot;token function&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;com.rollbar:rollbar-web:1.0.0&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now we will add Rollbar tracking inside the &lt;code&gt;MyMappingExceptionResolver&lt;/code&gt; that we created earlier. It should go in the &lt;code&gt;buildLogMessage&lt;/code&gt; method. Add the access token that we got in step one. We are also creating a request provider object to give us more context for debugging problems later.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-java&quot;&gt;&lt;code&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; String &lt;span class=&quot;token function&quot;&gt;buildLogMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Exception e&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; HttpServletRequest req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

   RequestProvider requestProvider &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;  &lt;span class=&quot;token class-name&quot;&gt;RequestProvider&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Builder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;userIpHeaderName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRemoteAddr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   rollbar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;withAccessToken&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;accessToken&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requestProvider&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MVC exception: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getLocalizedMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can also use Rollbar to track caught exceptions, warnings, and other items using the same &lt;code&gt;rollbar&lt;/code&gt; object. Learn more about the full API in our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar-java/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Java documentation&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;test-with-an-example-app&quot;&gt;&lt;a href=&quot;#test-with-an-example-app&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Test with an example app&lt;/h2&gt;
&lt;p&gt;To test that it’s working, let’s create a page that will generate an error message. In the example below, you can generate an error by clicking the &quot;Throw an error&quot; button. To run the code, just check out &lt;strong&gt;&lt;a href=&quot;https://github.com/RollbarExample/Rollbar-Java-Example&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar-Example-Java&lt;/a&gt;&lt;/strong&gt; on GitHub. Clone the project and replace the access token with your own access token in the &lt;code&gt;MyMappingExceptionResolver&lt;/code&gt; class.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 39.29961089494164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAIABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAECBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHXgS4X/8QAFxAAAwEAAAAAAAAAAAAAAAAAAAITA//aAAgBAQABBQKSEkJZn//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABgQAAMBAQAAAAAAAAAAAAAAAAACkTIz/9oACAEBAAY/AsLDCw5rD//EABkQAAIDAQAAAAAAAAAAAAAAAAABQZHh8f/aAAgBAQABPyFx1zlxZM//2gAMAwEAAgADAAAAEPwv/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8Qqv/EABoQAAIDAQEAAAAAAAAAAAAAAAARASHwUWH/2gAIAQEAAT8QktLXCGWgkbweH//Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Spring example screenshot&quot;
        title=&quot;&quot;
        src=&quot;/static/spring-example-d88c4156db3cfcac54a9018848011473-c69aa.jpg&quot;
        srcset=&quot;/static/spring-example-d88c4156db3cfcac54a9018848011473-2c497.jpg 216w,
/static/spring-example-d88c4156db3cfcac54a9018848011473-ec3f2.jpg 432w,
/static/spring-example-d88c4156db3cfcac54a9018848011473-c69aa.jpg 864w,
/static/spring-example-d88c4156db3cfcac54a9018848011473-12f85.jpg 1285w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;This form adds a button which will post to the URL &lt;code&gt;/spring-mvc/createException&lt;/code&gt; when you click it.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-html&quot;&gt;&lt;code&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/spring-mvc/createException&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;center&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt;&lt;span class=&quot;token style-attr language-css&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt; &lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&quot;&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;50px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;200px&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;submit&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;  &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Throw an error&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;center&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;It will then trigger the &lt;code&gt;throwException&lt;/code&gt; method. In this method, we have added a bug which attempts to call a method on a null object.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-java&quot;&gt;&lt;code&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/createException&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; method &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; RequestMethod&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; String &lt;span class=&quot;token function&quot;&gt;throwException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ModelMap model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    System&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Error : here....&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    String exception &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; null&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    exception&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toCharArray&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Since we wired up our &lt;code&gt;MyMappingExceptionResolver&lt;/code&gt; to report the error to Rollbar, we should see the error show up on the Rollbar’s demo &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/demo/demo/items/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;error live feed&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 52.76476101218369%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABJ0AAASdAHeZh94AAABYklEQVQoz61RS07DQAzNpZCKqLgDn/JZsGTDFpXSE3AgVoUbIAEr1kiwgIQ0k2kmk/kkfYxNU4WqEkhg6cmfsT3PdtTbG2L37Arbx2NsH42xObhge+tghP7h5RLk9/aH2Ng5Z1Dd4OQUfc4bLePR+4fAfyFOBaLZbAYZUCiNPM8xKzSMMb9CVVVck2UCk/sEJNH1XYqbhwy3jxnrScDTi4K1FkIISCm5iKCUYu2cQ103MK6GsTUq4ziPG76+ZZhKA6E8ZOmRq/BYVGiaBt77UFgvdWvTZzRZWZbst5obUpIQEs7XsOFHax1MYKKNZ1TWc/MuiCGNS4278fl8joiMJEm+En1AZaDSKfLCQQTIwJjGouQWtD8aUWv9Lc4NeYTsGU3t4MNevCOGxd8YxnG8wjBlhvmCoTa0+AXoCCGHDraWYWt0pfWJCRURm+7iV/O7EpXahmM0ax/pYDQWNSZN/k/yCWPxMfGN5A6kAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Spring items screenshot&quot;
        title=&quot;&quot;
        src=&quot;/static/spring-items-6171249075e69e157b593c8f4270b868-e9535.png&quot;
        srcset=&quot;/static/spring-items-6171249075e69e157b593c8f4270b868-d32c5.png 216w,
/static/spring-items-6171249075e69e157b593c8f4270b868-06f31.png 432w,
/static/spring-items-6171249075e69e157b593c8f4270b868-e9535.png 864w,
/static/spring-items-6171249075e69e157b593c8f4270b868-ab1f5.png 1296w,
/static/spring-items-6171249075e69e157b593c8f4270b868-7539a.png 1728w,
/static/spring-items-6171249075e69e157b593c8f4270b868-6bdbd.png 2134w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Grouped Spring MVC exceptions, as seen in Rollbar&lt;/p&gt;
&lt;p&gt;Click on that item to see extra detail on the error. This provides more context to help you find the cause of the error. The Occurrences tab will show the request object that we provided, including the IP address of the client, which browser and operating system they were using, and more. The People tab will show which user was affected and how many times.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 64.11369917094355%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsSAAALEgHS3X78AAABjElEQVQ4y6WSyU7DMBCGeToWsYgjnNgK4sgdsXPkdegTcIk48ABIlC5p0ixNs9V2k/Znxm2qhhYQYOnL2H/GfzIeLy3vXWL37AEblVtsHt9h7fAGWyf3WD+6xTpps3H14BqcX7Cyf4Wd03NsVy50DmtL+OcYDoeIogjV6iOUUmPDIEpguwFM20fL9mA5Xb3muRpkv/qANsyyDGmaot/v46X9DKP1pNej0ehbOD9JEv2HKc1Z04ZSSgihyDhHGIdIpdDJXAJvYH2RIZc7y9RQSIWQypZqUNrAehSnyPJ8Tg9JL0xm+XNTeHMxsnxYPkMuLY5j9Ho9TRiGpZILrdCLcouRiEHZ8KfDX4QQEjn9maJj4qPKZ8+Qu8wvlKI4yClhHBkhJ3PWCEF8bsZcUyRdEd8yYZs1WHYdtt+G5ZmT2NLR7XbQ7fkIwq6+UosoXRvHc9B03lGzXlG33zQtp46224TtkWHgUMejL82mhvQwyNBwfccgA43pNomG0ejUjKbWGhpec/QDz6BmzcFeH2x2zlSWkE7YAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Spring exception screenshot&quot;
        title=&quot;&quot;
        src=&quot;/static/spring-exception-612a5aee9d25d46b2420989d8fb19e4f-e9535.png&quot;
        srcset=&quot;/static/spring-exception-612a5aee9d25d46b2420989d8fb19e4f-d32c5.png 216w,
/static/spring-exception-612a5aee9d25d46b2420989d8fb19e4f-06f31.png 432w,
/static/spring-exception-612a5aee9d25d46b2420989d8fb19e4f-e9535.png 864w,
/static/spring-exception-612a5aee9d25d46b2420989d8fb19e4f-ab1f5.png 1296w,
/static/spring-exception-612a5aee9d25d46b2420989d8fb19e4f-7539a.png 1728w,
/static/spring-exception-612a5aee9d25d46b2420989d8fb19e4f-4f32f.png 2533w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Spring MVC error and stack trace, as seen in Rollbar&lt;/p&gt;
&lt;p&gt;It’s pretty easy to get error tracking across your entire application thanks to Rollbar and Spring’s global exception handlers. It only takes a few minutes to set up, and you will have way more context to track and debug problems faster in the future.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;signup for a 14-day free trial&lt;/a&gt;&lt;/strong&gt; of Rollbar and let us help you take control of impactful Java errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Announcing Our New Java Error Monitoring SDK]]></title><description><![CDATA[Rollbar is proud to announce the first  official 1.0 release  of our  Java notifier SDK  for error monitoring. Java continues to be one of…]]></description><link>https://rollbar.com/blog/official-java-notifier-sdk/</link><guid isPermaLink="false">https://rollbar.com/blog/official-java-notifier-sdk/</guid><pubDate>Fri, 17 Nov 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Rollbar is proud to announce the first &lt;strong&gt;official 1.0 release&lt;/strong&gt; of our &lt;strong&gt;&lt;a href=&quot;/docs/notifier/rollbar-java/&quot;&gt;Java notifier SDK&lt;/a&gt;&lt;/strong&gt; for error monitoring. Java continues to be one of the world’s most popular programming languages. It’s the most sought-after language for employers and has the second most pushes on GitHub according to &lt;strong&gt;&lt;a href=&quot;https://stackify.com/trendiest-programming-languages-hottest-sought-programming-languages-2017/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Stackify’s 2017 rankings&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Rollbar helps you monitor errors in real-world applications. It provides you with a live error feed, along with stack traces and contextual data to debug errors quickly. It&apos;s important to select an error monitoring solution that supports all the languages your company uses for a clear picture across your whole stack from the front end to the back end. Some competing solutions just don&apos;t give you that full visibility. Learn more about our product features for &lt;strong&gt;&lt;a href=&quot;/error-tracking/java/&quot;&gt;Java&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This new version of our Java notifier SDK supports many frameworks including web apps, &lt;strong&gt;Android&lt;/strong&gt;, &lt;strong&gt;Scala&lt;/strong&gt;, &lt;strong&gt;Kotlin&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;/blog/spring-mvc-exception-handling/&quot;&gt;Spring MVC&lt;/a&gt;&lt;/strong&gt;, and more. In web applications, it captures data about the request including the user&apos;s IP address and browser so you can narrow the problem down. It helps you identify root cause quickly, by giving you contextual data on what changed and when from your source control and deployment systems. You can also react proactively by seeing which users were affected and prioritize fixes.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 55.01101321585903%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABpElEQVQoz5WS627UMBCF8/6vZAkELwCCtiBV1SIEZTeXJr4lsZ3sYc4ku10Ef4h05EnsfDNzxlUfCz5+C3j4Mapu46fjhMuTUsI8z6oQA6ZpUuWcdC2l6LnqV5/w5vOA9w8W7+4t3t69xh8O4Qqcphld18Fai6Zu4JzD6XRCjBFN0yhUgczcti2sixjTgnFe4KciFWV473E+n/9LFTMcDgc8Pz6ivb/Duq7ofUbse3THBnU/oxkSji8zThJzj0knST6LbmElF1TLsmj/dV1r2QS6sWC0DrYVqEsKaW1SMN+5RoGm/CcwEUgAoWyPhjMO0nKWyn0v0JBhY8YQkq5OxH/+pVx2IBVC0EkyZkvrPMIPG9BLxaya8XBNsH3fkmx7WmHOWVsOz5+wdl8UyIPJDuohvbv1kDFVD6/vChRwlkFWhPEKjKevV2CUltfRYxAP6d2LyyJZdy8vMf3kHqtdlnWrkG2yymx/YrHf1UMFTvHaMkXIsLfs95bp52WfIoceGoEaubBGhmJkWkYmaM5TMDJl07ls+pBNK2u3i2fkDv+lUhbzG+6/TRdzUaBgAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Java items screenshot&quot;
        title=&quot;&quot;
        src=&quot;/static/items-java-969ebde04cea0f86486a58e9b15eb2a7-e9535.png&quot;
        srcset=&quot;/static/items-java-969ebde04cea0f86486a58e9b15eb2a7-d32c5.png 216w,
/static/items-java-969ebde04cea0f86486a58e9b15eb2a7-06f31.png 432w,
/static/items-java-969ebde04cea0f86486a58e9b15eb2a7-e9535.png 864w,
/static/items-java-969ebde04cea0f86486a58e9b15eb2a7-ab1f5.png 1296w,
/static/items-java-969ebde04cea0f86486a58e9b15eb2a7-7539a.png 1728w,
/static/items-java-969ebde04cea0f86486a58e9b15eb2a7-19a73.png 1816w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Grouped Java exceptions, as seen in Rollbar&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;strong&gt;Additional improvements in our 1.0 release include&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for both &lt;strong&gt;Gradle&lt;/strong&gt; and &lt;strong&gt;Maven&lt;/strong&gt; build systems.&lt;/li&gt;
&lt;li&gt;Synchronous and asynchronous senders, so that your application does not block sending events to Rollbar.&lt;/li&gt;
&lt;li&gt;A disk buffer queue so that you do not lose events even during network outages.&lt;/li&gt;
&lt;li&gt;A new listener API so that you have the option of monitoring payloads.&lt;/li&gt;
&lt;li&gt;The Android notifier has been unified with the main Java notifier.&lt;/li&gt;
&lt;li&gt;An API that allows you to provide the notifier more custom information.&lt;/li&gt;
&lt;li&gt;A GitHub &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar-java/tree/master/examples&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;examples&lt;/a&gt;&lt;/strong&gt; folder for different integrations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are upgrading from our previous 0.5.4 release of the Java notifier, see this &lt;strong&gt;&lt;a href=&quot;/docs/notifier/rollbar-java/#upgrading-from-054-or-earlier-to-100&quot;&gt;guide for upgrading to 1.0&lt;/a&gt;&lt;/strong&gt;. Since this is a major version release with new features, it will require some adjustments to your code to maximize all of the new functionality.&lt;/p&gt;
&lt;p&gt;You can learn more in our &lt;strong&gt;&lt;a href=&quot;/docs/notifier/rollbar-java/&quot;&gt;Java notifier SDK documentation&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;signup for a 14-day free trial&lt;/a&gt;&lt;/strong&gt; of Rollbar and let us help you take control of impactful Java errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Laravel error reporting now available]]></title><description><![CDATA[We're happy to introduce our latest error reporting SDK, for  Laravel , which tracks and reports errors that happen in your Laravel…]]></description><link>https://rollbar.com/blog/automated-laravel-error-reporting/</link><guid isPermaLink="false">https://rollbar.com/blog/automated-laravel-error-reporting/</guid><pubDate>Mon, 30 Oct 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;re happy to introduce our latest error reporting SDK, for &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar-php-laravel/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Laravel&lt;/a&gt;&lt;/strong&gt;, which tracks and reports errors that happen in your Laravel applications. &lt;strong&gt;&lt;a href=&quot;https://laravel.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Laravel&lt;/a&gt;&lt;/strong&gt; is a popular and powerful MVC framework for PHP, designed for developers who need a simple and elegant toolkit to create full-featured PHP web applications.&lt;/p&gt;
&lt;p&gt;In real-world production applications, it’s important to monitor errors so you understand your user’s experience and can fix issues before more are impacted. Rollbar helps by providing you with a live error feed from your application, including complete stack traces for instant visibility. To give you more context to debug problems, we also track the environment the error is coming from (prod or staging), the server that generated the error, and even the user’s session. Learn more about &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/features/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar’s product features&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Below, we&apos;ll show you how to add Rollbar error reporting to your Laravel apps and even give you a code example that you can try yourself.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;laravel-error-reporting-with-rollbar&quot;&gt;&lt;a href=&quot;#laravel-error-reporting-with-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Laravel error reporting with Rollbar&lt;/h2&gt;
&lt;p&gt;Here are some simple steps describing how to integrate Laravel SDK in your code. You can find more details in the &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar-php-laravel/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Laravel Documentation&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Sign up for a Rollbar account if you haven’t done so yet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create your project and select Other from the list of notifiers. Copy the server side access token that is generated for you. You’ll need this to configure Rollbar in the steps below.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open command prompt in your project directory and type following command to install the Laravel notifier SDK.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;composer require rollbar/rollbar-laravel&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the project access token from step 1 in your .env file. You can find .env file in your project directory.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;ROLLBAR_TOKEN=[your Rollbar project access token]&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the Rollbar service provider in the providers array &lt;code&gt;config/app.php&lt;/code&gt;. You can find the config directory under your project.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;Rollbar\Laravel\RollbarServiceProvider::class,&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you only want to enable Rollbar reporting for certain environments you can conditionally load the service provider in your &lt;code&gt;AppServiceProvider&lt;/code&gt;. You can find it in the &lt;code&gt;app/providers&lt;/code&gt; folder under project directory.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;public function register()
{
    if ($this-&gt;app-&gt;environment(&apos;production&apos;)) {
        $this-&gt;app-&gt;register(\Rollbar\Laravel\RollbarServiceProvider::class);
    }
}&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the following snippet in the &lt;code&gt;config/services.php&lt;/code&gt;. You can find the config directory under the main project directory.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;&apos;rollbar&apos; =&gt; [
        &apos;access_token&apos; =&gt; env(&apos;ROLLBAR_TOKEN&apos;),
        &apos;level&apos; =&gt; env(&apos;ROLLBAR_LEVEL&apos;),
    ],&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The level variable defines the minimum log level at which log messages are sent to Rollbar. If not specified, the default is debug. For development, you could set this either to debug to send all log messages, or to none to send no messages at all. For production, you could set this to error or warn so that info and debug messages are ignored.&lt;/p&gt;
&lt;h2 id=&quot;testing-rollbar-with-an-example-laravel-application&quot;&gt;&lt;a href=&quot;#testing-rollbar-with-an-example-laravel-application&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Testing Rollbar with an example Laravel application&lt;/h2&gt;
&lt;p&gt;To test that it’s working, let’s create a page that will generate an error message. In the example below, you will be able to generate an error by clicking the “Create an error” button.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/RollbarExample/Rollbar-Laravel-Example&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 31.625183016105417%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAAAoUlEQVQY062MsQrCMBRF8/9f4qSDi4KLdVIQBV3UgtRqY5O8l7S0qNM1KQgOFlpwODzu4d0rbscElyRFLhU20xT7ienFdpwhGpwwH+6wHq0g2FpoYlilQdbBsAW5Asb7kCWV0N6xdyGHX/5c78q6RlHVsI6brqieL/wiUwa5L90NYRlLLA5XSE1Nltqgrdc6+E10ZsxiQpffToN9CIOPf/IGEoDFYk7nUo4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Laravel example screenshot&quot;
        title=&quot;&quot;
        src=&quot;/static/laravel-example-error-6e0d0ec448b5858edae53c54c7bd7557-e9535.png&quot;
        srcset=&quot;/static/laravel-example-error-6e0d0ec448b5858edae53c54c7bd7557-d32c5.png 216w,
/static/laravel-example-error-6e0d0ec448b5858edae53c54c7bd7557-06f31.png 432w,
/static/laravel-example-error-6e0d0ec448b5858edae53c54c7bd7557-e9535.png 864w,
/static/laravel-example-error-6e0d0ec448b5858edae53c54c7bd7557-ab1f5.png 1296w,
/static/laravel-example-error-6e0d0ec448b5858edae53c54c7bd7557-e829b.png 1366w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Laravel example application&lt;/p&gt;
&lt;p&gt;Check out our project on GitHub called  &lt;strong&gt;&lt;a href=&quot;https://github.com/RollbarExample/Rollbar-Laravel-Example&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar-Laravel-Example&lt;/a&gt;&lt;/strong&gt;. To run it, clone the project and replace the access token with your project access token. You can find the access token inside .env file under your project directory.&lt;/p&gt;
&lt;p&gt;When you click the “Create an error” button it will generate an error message. It triggers the &lt;code&gt;MessagesController@submit&lt;/code&gt; action which has mapped to the home/submit url. In the submit method of &lt;code&gt;MessagesController&lt;/code&gt;, we attempt to access the foo field on x, which is empty. This results in the error “ErrorException: Create default object from empty value”.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-php&quot;&gt;&lt;code&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;token package&quot;&gt;App&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Http&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Controllers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token package&quot;&gt;Illuminate&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Http&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Request&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MessagesController&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Controller&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
           &lt;span class=&quot;token variable&quot;&gt;$x&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
           &lt;span class=&quot;token variable&quot;&gt;$x&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Null field access&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Exception &lt;span class=&quot;token variable&quot;&gt;$ex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
           &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Caught exception&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
       &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SUCCESS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;viewing-and-reporting-laravel-errors-in-rollbar&quot;&gt;&lt;a href=&quot;#viewing-and-reporting-laravel-errors-in-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Viewing and reporting Laravel errors in Rollbar&lt;/h2&gt;
&lt;p&gt;Next open Rollbar to see what these Laravel errors look like in your account’s error occurrences page. The error we just generated should be called “ErrorException: Create default object from empty value”.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 45.461309523809526%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAABR0lEQVQoz6VRy07DMBDsvyGV55kLBw6I55UvQFDgxo8hQY8ceEktEmrTJrGTtR0nw65dB3ECiZVGY6+9s7P2YO3gArvnd9g6ucb26Q02jkc9J2yueHh0BbmfsM77vf0Rds5uMTy8DLkBOKy1qKoKVW2gqxrGOjRN8yfUdQ2tK7x+1iIVBeelxWROAR8ZYcrw3ocCYwyICGQoNJa95OWcjENNNhiZ5RQFu67D00Th/rnA45vGmPHwUobDtvVQSrMDHSdYIQkmThP2glKQLXKQbaDJgZTi7jwOQ9g1nsXbABERLgoVnZM4NxCdXlDGyLIsdDMsaoslcmWRa4ulMmFd8rrxbS88m+WBpVb4h6BzDtViCu8oumKHBQuIW2M9O4wF32iRFe/8ftFhyvef4pz8WIsU6VBCHJRlGZ5FfvS3GMTH7wL+G2LkC3rVnl5k8ILjAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Laravel items page&quot;
        title=&quot;&quot;
        src=&quot;/static/laravel-errors-in-rollbar-3c0c332ac6f8c3493ac31e6e1f9668fd-e9535.png&quot;
        srcset=&quot;/static/laravel-errors-in-rollbar-3c0c332ac6f8c3493ac31e6e1f9668fd-d32c5.png 216w,
/static/laravel-errors-in-rollbar-3c0c332ac6f8c3493ac31e6e1f9668fd-06f31.png 432w,
/static/laravel-errors-in-rollbar-3c0c332ac6f8c3493ac31e6e1f9668fd-e9535.png 864w,
/static/laravel-errors-in-rollbar-3c0c332ac6f8c3493ac31e6e1f9668fd-ab1f5.png 1296w,
/static/laravel-errors-in-rollbar-3c0c332ac6f8c3493ac31e6e1f9668fd-4bd05.png 1344w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Laravel errors as, seen in Rollbar&lt;/p&gt;
&lt;p&gt;Get more details by clicking on the error. You can now see a traceback showing you the exact source code file, method, and line number that generated the error.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 49.62797619047619%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABTklEQVQoz4WSbXKEIAyG9/4H4Rr7Z++xu/V7dUFUUEF9G+Jonda2zGQCITyQl1xAo246ZKVE9nojzitUSuMjK5EUb4pJpK91r6gU58m6xbIsp3YJQOccuq6DMR1u0Q3X55XXvx3azBiDpmmgtd7zGWitRT+MGEZHSRbOz2jblg9Ya6AbDe/9vxfswAALZQfgcTPEddthmqbz+DyfA8Pk+9gSBud/7G0XHMfoJ/YMHIaBtVBKQUmJuq653HCo7gb4ad5te5Un6DGuzfgF/EsT7x1/WtBw81x232NeZl4fJVl/eRw5wfYj62PYOzZj13nYs/26DpAz24EDlafLF9IiRZqn1G8F8rKgfqwgtYSqFcugpIIkSXZPEoWWCfKEtplJjgAU9DpRVZV45A+yu7izf5C/s39mTxHnsYiTWCRJIqIoEnleiEY3gmBsBBQEFJ8GGALlOT+wAQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Laravel item page&quot;
        title=&quot;&quot;
        src=&quot;/static/laravel-error-d58b02622a0ff514a91d56dfba6e2c3c-e9535.png&quot;
        srcset=&quot;/static/laravel-error-d58b02622a0ff514a91d56dfba6e2c3c-d32c5.png 216w,
/static/laravel-error-d58b02622a0ff514a91d56dfba6e2c3c-06f31.png 432w,
/static/laravel-error-d58b02622a0ff514a91d56dfba6e2c3c-e9535.png 864w,
/static/laravel-error-d58b02622a0ff514a91d56dfba6e2c3c-ab1f5.png 1296w,
/static/laravel-error-d58b02622a0ff514a91d56dfba6e2c3c-4bd05.png 1344w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Laravel error stack trace, as seen in Rollbar&lt;/p&gt;
&lt;p&gt;For errors that impact many customers or are difficult to troubleshoot, Rollbar gives you additional context to solve them faster. With source code integration, you can click on the file to view in GitHub and see what changes were recently made. You can also see when the problem started, which deployment is suspected, and even which browsers and people are affected. I can also set alerts when the problem happens again. This will help you quickly determine the business impact, fix the problem, and proactively respond in the future.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;signup for a 14-day free trial&lt;/a&gt;&lt;/strong&gt; of Rollbar and let us help you take control of Laravel errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Custom error handling for Angular]]></title><description><![CDATA[Angular 2+  and  AngularJS  (version 1) are popular open-source JavaScript MVC frameworks that let you build highly structured, testable and…]]></description><link>https://rollbar.com/blog/client-side-angular-error-handling/</link><guid isPermaLink="false">https://rollbar.com/blog/client-side-angular-error-handling/</guid><pubDate>Tue, 24 Oct 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://angular.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;Angular 2+&lt;/strong&gt;&lt;/a&gt; and &lt;a href=&quot;https://angularjs.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;AngularJS&lt;/strong&gt;&lt;/a&gt; (version 1) are popular open-source JavaScript MVC frameworks that let you build highly structured, testable and maintainable front-end applications. Angular is most commonly used on single-page applications. Stable and reliable single-page applications depend on solid client-side error monitoring tools and techniques. But getting the right exception data and context isn’t always easy. We’re going to dive into how to capture, handle and debug &lt;a href=&quot;https://rollbar.com/error-tracking/angular/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;Angular errors&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Error handling in vanilla JavaScript consists of using &lt;a href=&quot;https://www.w3schools.com/js/js_errors.asp&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;try, catch and finally&lt;/strong&gt;&lt;/a&gt; statements. You can also use these statements in Angular modules. However, Angular has a special logic to handle uncaught exceptions. We’ll show you how to create custom error handlers for Angular that you can override to add your own functionality.&lt;/p&gt;
&lt;h2 id=&quot;error-logging-in-angular&quot;&gt;&lt;a href=&quot;#error-logging-in-angular&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Error logging in Angular&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://angular.io/api/core/ErrorHandler&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;ErrorHandler&lt;/strong&gt;&lt;/a&gt; class in Angular 2+ provides a hook for centralized exception handling. The default implementation of &lt;code&gt;ErrorHandler&lt;/code&gt; prints error messages to the console. This service is very simple by design. To intercept the error handling we need to write a custom handler.&lt;/p&gt;
&lt;p&gt;On the other hand, uncaught exceptions in AngularJS are all funneled through the &lt;a href=&quot;https://docs.angularjs.org/api/ng/service/$exceptionHandler&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;$exceptionHandler&lt;/strong&gt;&lt;/a&gt; service. When unmodified, &lt;code&gt;$exceptionHandler&lt;/code&gt; sends all uncaught exceptions to the &lt;code&gt;$log.error&lt;/code&gt; service. The &lt;code&gt;$log.error&lt;/code&gt; service passes the error through to the client’s console.&lt;/p&gt;
&lt;p&gt;Here’s how you can create your own error handler:&lt;/p&gt;
&lt;ul class=&quot;blog nav nav-tabs&quot;&gt;
  &lt;li role=&quot;presentation&quot;&gt;
    &lt;a href=&quot;#angular2-1&quot; aria-controls=&quot;panel-1-1&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;Angular 2+&lt;/a&gt;
  &lt;/li&gt;
  &lt;li role=&quot;presentation&quot;&gt;
    &lt;a href=&quot;#angular1-1&quot; aria-controls=&quot;panel-1-2&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;AngularJS 1.X&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-1-1&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ts&quot;&gt;&lt;code&gt;class ErrorHandler {
  constructor() {}
  handleError(error: any): void;
}&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-1-2&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token function&quot;&gt;$exceptionHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;exception&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;cause&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;In Angular 2+ the &lt;code&gt;handleError(error: any): void&lt;/code&gt; method allows you to implement your own code to do something with the exception, such as recover your app gracefully or report it to an error monitoring service.&lt;/p&gt;
&lt;p&gt;In AngularJS 1.X, when we call &lt;code&gt;$exceptionHandler&lt;/code&gt;, we can pass two arguments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;exception&lt;/code&gt;: the exception associated with the error the application encountered.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cause&lt;/code&gt;: additional context about the cause of the exception.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second argument, &lt;code&gt;cause&lt;/code&gt;, is entirely optional. It can be helpful when you’re writing exception handlers or adding external handling functionality. &lt;code&gt;$exceptionHandler&lt;/code&gt; will simply run on its own, and logging uncaught exceptions to the console in production isn’t very useful. Fortunately, Angular has a handful of ways to extend &lt;code&gt;$exceptionHandler&lt;/code&gt; to take more action and gather more context when errors occur.&lt;/p&gt;
&lt;h2 id=&quot;basic-configuration-for-handling-the-error-in-angular&quot;&gt;&lt;a href=&quot;#basic-configuration-for-handling-the-error-in-angular&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Basic configuration for handling the error in Angular&lt;/h2&gt;
&lt;p&gt;Let’s understand how error handlers work in both frameworks. In Angular 2+, error handling can be done by creating a &lt;code&gt;CustomErrorHandler&lt;/code&gt; which implements &lt;code&gt;ErrorHandler&lt;/code&gt;. In AngularJS 1.X we can extend &lt;code&gt;$exceptionHandler&lt;/code&gt; to take more action and gather context when errors occur.&lt;/p&gt;
&lt;ul class=&quot;blog nav nav-tabs&quot;&gt;
  &lt;li role=&quot;presentation&quot;&gt;
    &lt;a href=&quot;#&quot; aria-controls=&quot;panel-2-1&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;Angular 2+&lt;/a&gt;
  &lt;/li&gt;
  &lt;li role=&quot;presentation&quot;&gt;
    &lt;a href=&quot;#&quot; aria-controls=&quot;panel-2-2&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;AngularJS 1.X&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-2-1&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ts&quot;&gt;&lt;code&gt;import {ErrorHandler} from &apos;@angular/core&apos;;

@Injectable()
export class CustomErrorHandler implements ErrorHandler {
  constructor() {}
  handleError(error) {
    // your custom error handling logic
    console.log(error);
  }
}&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-2-2&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;angular
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;exceptionOverride&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;factory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;$exceptionHandler&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Now in our &lt;code&gt;AppModule&lt;/code&gt; we have to add our &lt;code&gt;CustomErrorHandler&lt;/code&gt; as a provider. In AngularJS can extend the module by using &lt;code&gt;.factory()&lt;/code&gt;. This is an alternative to &lt;code&gt;$provider.factory()&lt;/code&gt; inside a chained &lt;code&gt;.config()&lt;/code&gt; on the module.&lt;/p&gt;
&lt;ul class=&quot;blog nav nav-tabs&quot;&gt;
  &lt;li role=&quot;presentation&quot; class=&quot;active&quot;&gt;
    &lt;a href=&quot;#&quot; aria-controls=&quot;panel-3-1&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;Angular 2+&lt;/a&gt;
  &lt;/li&gt;
  &lt;li role=&quot;presentation&quot;&gt;
    &lt;a href=&quot;#&quot; aria-controls=&quot;panel-3-2&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;AngularJS 1.X&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-3-1&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ts&quot;&gt;&lt;code&gt;import {NgModule, ApplicationRef, ErrorHandler} from &apos;@angular/core&apos;;
import {BrowserModule} from &apos;@angular/platform-browser&apos;;
import {CustomErrorHandler} from &apos;./custom-error-handler&apos;;
import {AppComponent} from &apos;./app.component&apos;;

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule],
  bootstrap: [AppComponent],
  providers: [
    {
      provide: ErrorHandler,
      useClass: CustomErrorHandler,
    },
  ],
})
export class AppModule {}&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-3-2&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;angular
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;exceptionOverride&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;factory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;$exceptionHandler&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;exception&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cause&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      exception&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Angular Exception: &quot;&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; cause &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&quot;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; exception&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Now any exception in our application will be caught in our custom error handler.&lt;/p&gt;
&lt;h2 id=&quot;production-error-monitoring-with-rollbar&quot;&gt;&lt;a href=&quot;#production-error-monitoring-with-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Production error monitoring with Rollbar&lt;/h2&gt;
&lt;p&gt;In real-world production applications, it’s important to monitor errors so you understand your user’s experience. It’s best to monitor errors so you’re the first to know and can fix the issue before more customers are affected.&lt;/p&gt;
&lt;p&gt;Rollbar tracks and analyzes what’s broken and why by using rich contextual data, including detailed stack traces, request params, telemetry on user behavior, affected users and more. This helps developers to quickly identify and fix errors. Learn more about &lt;a href=&quot;https://rollbar.com/error-tracking/javascript/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;Rollbar’s JavaScript features&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By including the official &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js&quot;&gt;Rollbar&lt;/a&gt;{:target=&quot;_blank&quot;}&lt;/strong&gt; notifier SDK for Angular 2+ or the popular community notifier &lt;a href=&quot;https://github.com/tandibar/ng-rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;ng-rollbar&lt;/strong&gt;&lt;/a&gt; for AngularJS 1.X in your Angular application, errors are automatically captured, grouped and reported—and with much more contextual data than the console provides.&lt;/p&gt;
&lt;p&gt;The first thing you’ll want to do is &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/signup/&quot;&gt;sign up for a Rollbar account&lt;/a&gt;&lt;/strong&gt;. Once you’re signed up, you’ll create a new project and select your Rollbar SDK.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 77.32997481108312%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsSAAALEgHS3X78AAAB7klEQVQ4y32TTW/UQAyG95/1/4HgSBFHfgQS0EvhxIETcECqWqm7m4/N98wkk0kmebG9mzTNLo30aCYZ+7XHdjZ1XcMY8wxtapTGotB2XpdUdXuOacVvwwJlWc4kZQJrLUxjsQsPiJMMj0GMh22AIE6wjw4Yx/EMYAQnt1FKoaqqWfBQHESw73syeMraNg0agp2W8Dc+Z1ER1Fojz3NkWSYkZSqCbdvO39M0fbafbFmAbZ1z4EcEi6JAEARCFEVQyohR13WoKTJnr7muFFipCorfac9ZsRAH5nXOcF1DLoFc2XspMl99CmDdEUc0cgsn58wsONVwgqMfBXqJ7Ek4Kw06cjItYY8C3LRxGE4NwZPgushTXQYy/nP3iL+xxccfGVzvUWkjmReVFrFtmIjd1On5ymumLv/8fYeHtMWnXzll6JGXlWQcxqms99twznBuyksZLp+B/Ho/ECNc5+EXxyzK9v8V5NmSOaQ68TU1MbSaoHnrGlImXI1Kabq+klof5/YFQe4qjwR38z7WePV5h7c3O1zfhnjzdY/XX3ZQhgadbB3ZypidBP0aEvQUkcrEeL8vrH93G/n33yL/4Xvkr2nld9cdz9mWYd/Npf9yzUAF5C633Qna8/slW+7y1SVoHmfon74aXH2GWdgw7PcPAsh0L2wSs8oAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Angular 2&quot;
        title=&quot;&quot;
        src=&quot;/static/custom-angular-2-exceptions-f5ca21f6bc0cc05cb0702cb8f727c443-e9535.png&quot;
        srcset=&quot;/static/custom-angular-2-exceptions-f5ca21f6bc0cc05cb0702cb8f727c443-d32c5.png 216w,
/static/custom-angular-2-exceptions-f5ca21f6bc0cc05cb0702cb8f727c443-06f31.png 432w,
/static/custom-angular-2-exceptions-f5ca21f6bc0cc05cb0702cb8f727c443-e9535.png 864w,
/static/custom-angular-2-exceptions-f5ca21f6bc0cc05cb0702cb8f727c443-ab1f5.png 1296w,
/static/custom-angular-2-exceptions-f5ca21f6bc0cc05cb0702cb8f727c443-902b5.png 1588w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Creating an Angular 2+ Project, as seen in Rollbar&lt;/p&gt;
&lt;p&gt;Next, you&apos;ll see installation instructions and a &lt;strong&gt;client-side access token&lt;/strong&gt; which you’ll need to use to send events to Rollbar.&lt;/p&gt;
&lt;h2 id=&quot;installing-rollbar&quot;&gt;&lt;a href=&quot;#installing-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installing Rollbar&lt;/h2&gt;
&lt;p&gt;To install Rollbar in Angular 2+, simply run the command given in the Angular 2+ tab example below. In Angular JS 1.X, you need to follow some simple steps, shown in the AngularJS 1.X tab example.&lt;/p&gt;
&lt;ul class=&quot;blog nav nav-tabs&quot;&gt;
  &lt;li role=&quot;presentation&quot; class=&quot;active&quot;&gt;
    &lt;a href=&quot;#angular2-4&quot; aria-controls=&quot;panel-4-1&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;Angular 2+&lt;/a&gt;
  &lt;/li&gt;
  &lt;li role=&quot;presentation&quot;&gt;
    &lt;a href=&quot;#angular1-4&quot; aria-controls=&quot;panel-4-2&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;AngularJS 1.X&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-4-1&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-base&quot;&gt;&lt;code&gt;npm install rollbar --save&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-4-2&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;bower install ng&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;rollbar &lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;save

&lt;span class=&quot;token comment&quot;&gt;// Then, include the SDK in your application with this script tag:&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;script type&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt; src&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bower_components/ng-rollbar/ng-rollbar.min.js&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;configuring-rollbar-with-your-angular-app&quot;&gt;&lt;a href=&quot;#configuring-rollbar-with-your-angular-app&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configuring Rollbar with your Angular app&lt;/h2&gt;
&lt;p&gt;In Angular 2+, you’ll need to update your application’s &lt;code&gt;CustomErrorHandler&lt;/code&gt;; we will rename it to &lt;code&gt;RollbarErrorHandler&lt;/code&gt;. Remember to add your own access token which you received earlier! You’ll also notice that we added a function called &lt;code&gt;rollbarFactory&lt;/code&gt; in the example. This creates a named factory that is necessary when using ahead-of-time (AOT) compilation. If you want to follow along yourself, you can find our working example project on &lt;strong&gt;&lt;a href=&quot;&quot;&gt;GitHub&lt;/a&gt;{:target=&quot;_blank&quot;}&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In AngularJS 1.X, you’ll need to inject the library into your app and then add the &lt;code&gt;RollbarProvider&lt;/code&gt; to your config. Remember to add your own access token, which you received earlier, as well as your environment name.&lt;/p&gt;
&lt;ul class=&quot;blog nav nav-tabs&quot;&gt;
  &lt;li role=&quot;presentation&quot; class=&quot;active&quot;&gt;
    &lt;a href=&quot;#&quot; aria-controls=&quot;panel-5-1&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;Angular 2+&lt;/a&gt;
  &lt;/li&gt;
  &lt;li role=&quot;presentation&quot;&gt;
    &lt;a href=&quot;#&quot; aria-controls=&quot;panel-5-2&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;AngularJS 1.X&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-5-1&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ts&quot;&gt;&lt;code&gt;import * as Rollbar from &apos;rollbar&apos;;
import {BrowserModule} from &apos;@angular/platform-browser&apos;;
import {
  Injectable,
  Injector,
  InjectionToken,
  NgModule,
  ErrorHandler,
} from &apos;@angular/core&apos;;
import {AppComponent} from &apos;./app.component&apos;;

const rollbarConfig = {
  accessToken: &apos;YOUR_ACCESS_TOKEN&apos;,
  captureUncaught: true,
  captureUnhandledRejections: true,
};

@Injectable()
export class RollbarErrorHandler implements ErrorHandler {
  constructor(private injector: Injector) {}

  handleError(err: any): void {
    var rollbar = this.injector.get(RollbarService);
    rollbar.error(err.originalError || err);
  }
}

export function rollbarFactory() {
  return new Rollbar(rollbarConfig);
}

export const RollbarService = new InjectionToken&lt;Rollbar&gt;(&apos;rollbar&apos;);

@NgModule({
  imports: [BrowserModule],
  declarations: [AppComponent],
  bootstrap: [AppComponent],
  providers: [
    {provide: ErrorHandler, useClass: RollbarErrorHandler},
    {provide: RollbarService, useFactory: rollbarFactory},
  ],
})
export class AppModule {}&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-5-2&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; app &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; angular&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;myApp&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;tandibar/ng-rollbar&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RollbarProvider&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  RollbarProvider&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    accessToken&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;YOUR_ACCESS_TOKEN&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    captureUncaught&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    payload&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      environment&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;YOUR_ENVIRONMENT&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;testing-the-sample-application&quot;&gt;&lt;a href=&quot;#testing-the-sample-application&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Testing the sample application&lt;/h2&gt;
&lt;p&gt;You can test if everything was set up correctly by opening a console window and entering:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;onerror&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&apos;TestRollbarError: testing window.onerror&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;or throwing an error in an application like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Hello World, Error Message&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Once everything is installed correctly, you should see the &lt;code&gt;TestRollbarError&lt;/code&gt; in the Rollbar dashboard as shown below.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 48.75259875259875%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABTElEQVQoz41S2WrEMBDL//+bv6ALpbC75PAR32eiTtyFfUhTGhCy47Gi0WSYpg8s8w0H8+WGVX4imK+OEu9o6fF/lBWDFCOUnBCDggse1nukZOGIj32M73VJM128X2KrGoNYDZR2kKslsYi/Hudch1IK87zQh9OpZpBS0uGMKCYIZWF8gYsVNhRs23ZCzRLrYUBbqjfdyGGq0VkXtC5A0QuvVwgdsCjamwifGnLZTg5a9WitYd/3cwexYFi4ABfUwsJxiLtAYiH1C1c4BCuhNXJMaC/YQzDGCM45qniC64xJ5c4zccrtJJbjo2c+k4lxFhgXScyRc0atlTJc31lwYi51523bL4dz1XIqDcM4jt2hnp40kPwzlHAMpSKSw9NQiu78m6ChQQ7GGEa/AtvcynxszPjK3Iup5oRaFKO8mDGWUY7Mh8iMdX1NebJvhl0FtlGJTOkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Rollbar dashboard for Angular exception handling&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-for-angular-2-1b9929ae8b6b290c585f57a4b602fecb-e9535.png&quot;
        srcset=&quot;/static/rollbar-for-angular-2-1b9929ae8b6b290c585f57a4b602fecb-d32c5.png 216w,
/static/rollbar-for-angular-2-1b9929ae8b6b290c585f57a4b602fecb-06f31.png 432w,
/static/rollbar-for-angular-2-1b9929ae8b6b290c585f57a4b602fecb-e9535.png 864w,
/static/rollbar-for-angular-2-1b9929ae8b6b290c585f57a4b602fecb-ab1f5.png 1296w,
/static/rollbar-for-angular-2-1b9929ae8b6b290c585f57a4b602fecb-7539a.png 1728w,
/static/rollbar-for-angular-2-1b9929ae8b6b290c585f57a4b602fecb-47ae7.png 1924w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Dashboard for Angular errors, as seen in Rollbar&lt;/p&gt;
&lt;h2 id=&quot;manually-handling-errors-with-rollbar&quot;&gt;&lt;a href=&quot;#manually-handling-errors-with-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Manually handling errors with Rollbar&lt;/h2&gt;
&lt;p&gt;You may decide to manually handle errors. This gives you extra control over the information passed to Rollbar. Just inject Rollbar into the corresponding Angular component. The code looks something like this:&lt;/p&gt;
&lt;ul class=&quot;blog nav nav-tabs&quot;&gt;
  &lt;li role=&quot;presentation&quot; class=&quot;active&quot;&gt;
    &lt;a href=&quot;#&quot; aria-controls=&quot;panel-6-1&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;Angular 2+&lt;/a&gt;
  &lt;/li&gt;
  &lt;li role=&quot;presentation&quot;&gt;
    &lt;a href=&quot;#&quot; aria-controls=&quot;panel-6-2&quot; role=&quot;tab&quot; data-toggle=&quot;tab&quot;&gt;AngularJS 1.X&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-6-1&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ts&quot;&gt;&lt;code&gt;@Component()
export class MyComponent {
  constructor(private rollbar: Rollbar) {}
  manualHandle() {
    this.rollbar.error(this.errorMessage);
  }
}&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;div class=&quot;tab-panel&quot; id=&quot;panel-6-2&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;myApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;controller&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;MainCtrl&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$scope&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Rollbar&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onSomeEvent&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    Rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;this is an error with special handling&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You may flag errors by severity in both frameworks so that the most critical errors are seen and handled first. You can also pass extra data to help with debugging.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token comment&quot;&gt;// Rollbar severities&lt;/span&gt;
rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;critical&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;some critical error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// most severe&lt;/span&gt;
rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;some error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;warning&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;some warning&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;some info&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;some debug message&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// least severe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;debugging-angular-errors-with-rollbar&quot;&gt;&lt;a href=&quot;#debugging-angular-errors-with-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Debugging Angular errors with Rollbar&lt;/h2&gt;
&lt;p&gt;Now that you have Rollbar integrated into your Angular app, any errors that occur automatically get captured, grouped and reported to your new project in Rollbar. You’ll be able to quickly and easily see which errors are occurring and how often they occur, as well as the full context and analytics into all of your exceptions. You can set alert notifications on any of the errors and have them delivered to your email. Rollbar collects a wide variety of context data for each error, including detailed stack traces, request params, URL, environment, affected users, browser, location, host and &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/error-tracking/angular/&quot;&gt;much more&lt;/a&gt;&lt;/strong&gt;. I hope this was a helpful introduction to error handling in Angular that shows how easy it is to get started.&lt;/p&gt;
&lt;p&gt;[6]: &lt;a href=&quot;https://github.com/mostlyjason/angular4-rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://github.com/mostlyjason/angular4-rollbar&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/signup/&quot;&gt;14-day free trial&lt;/a&gt;&lt;/strong&gt; of Rollbar and let us help you take control of pesky Angular errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Error Boundaries in React 16]]></title><description><![CDATA[React recently announced the release of version 16 with long standing feature requests including error boundaries, fragments, improved…]]></description><link>https://rollbar.com/blog/react-error-boundaries/</link><guid isPermaLink="false">https://rollbar.com/blog/react-error-boundaries/</guid><pubDate>Wed, 11 Oct 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;React recently announced the release of version 16 with long standing feature requests including error boundaries, fragments, improved server-side rendering and more. Error boundaries are especially useful so that an error in one small part of the UI doesn’t break your entire application. Instead, it’s better to contain those errors to the affected components and recover gracefully.&lt;/p&gt;
&lt;p&gt;You can try using error boundaries yourself in our working &lt;strong&gt;&lt;a href=&quot;https://codepen.io/rollbar_example/pen/JrMGQq?editors=1011&quot; target=&quot;_blank&quot;&gt;Codepen example&lt;/a&gt;&lt;/strong&gt;. We forked it from Facebook&apos;s initial version to show how to add Rollbar&apos;s &lt;strong&gt;&lt;a href=&quot;/error-tracking/javascript/&quot;&gt;JavaScript error logging&lt;/a&gt;&lt;/strong&gt;. When you open this page, you can activate an error boundary by clicking at least five times on the counter. You will then see the error message “Something went wrong.” Let&apos;s dive deeper into this example to learn how error boundaries work.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 53.426713356678334%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABeUlEQVQoz53SyU4CQRAG4L7BRR9AcHZ69qUHvYm74hafax6LaHgJPcBBORGWIGAI8FszMaiIEe3kS1c6038q1cO2CgVsbGwil8st5PN5yLIMRVG+4ZxDCIHzahWV/X2cnZ3TfoC9vUp2zmRVxTZd/oxbNh4fHtBoNNBsNtGkvdfrYTAYYDgcvnvBdDrF8mLcMrEtKShK8kLJNPH89IR2u41Op4PJZILZbPar+XwOZpQMGNyEXuIUZGV12mGr1cJoNPpiPB5/1K+vqwM5deO4Llzfh+16sKhOA7vdLv6zmO044LYN03Yyqm6gRF32+/3/BXq+iyAM4Xg+vCCA5wewKLhWq+Hu7n5t9Xo9wzzPhGnq9LrKQjrHW8vFlazhStJwXJRwVJBQ2Sr+6JC+OSAsCH2IWCASEcIoIGE2zxtFx3VRxiW5oLBVTinoZAnTDQ2arkHV1IxC/2X64uk8007/ikVCJKk4LifiXVzeSco7u2uLRJyEkUjKdO8NRoL+uzQ1KU8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Error boundaries Codepen example&quot;
        title=&quot;&quot;
        src=&quot;/static/image3-a1e8ff6e67d6390b208b7c916ca10cc7-e9535.png&quot;
        srcset=&quot;/static/image3-a1e8ff6e67d6390b208b7c916ca10cc7-d32c5.png 216w,
/static/image3-a1e8ff6e67d6390b208b7c916ca10cc7-06f31.png 432w,
/static/image3-a1e8ff6e67d6390b208b7c916ca10cc7-e9535.png 864w,
/static/image3-a1e8ff6e67d6390b208b7c916ca10cc7-ab1f5.png 1296w,
/static/image3-a1e8ff6e67d6390b208b7c916ca10cc7-7539a.png 1728w,
/static/image3-a1e8ff6e67d6390b208b7c916ca10cc7-a4b01.png 1999w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
&lt;strong&gt;&lt;a href=&quot;https://codepen.io/rollbar_example/pen/JrMGQq?editors=1011&quot; target=&quot;_blank&quot;&gt;Codepen example, React error boundaries&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;what-are-error-boundaries&quot;&gt;&lt;a href=&quot;#what-are-error-boundaries&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What are error boundaries?&lt;/h2&gt;
&lt;p&gt;Error boundaries are React components that catch JavaScript errors anywhere in their child component tree. They can log errors and display a fallback UI to replace the component tree that has crashed. They are similar to try-catch statements in your code, but surround page elements instead.&lt;/p&gt;
&lt;p&gt;An error boundary is a React component with a &lt;code&gt;componentDidCatch(err, info)&lt;/code&gt; method. Any errors occurring in a component tree get reported up to the nearest error boundary’s &lt;code&gt;componentDidCatch&lt;/code&gt; function. Note that error boundaries only catch errors in the components below them in the tree. For simple apps, you can declare an error boundary component once and use it for your whole application. For more complex applications with multiple components, you can have independent error boundaries to gracefully recover each part.&lt;/p&gt;
&lt;p&gt;You can also report these errors to an error monitoring service like Rollbar. This will give you the ability to track how many users are affected by errors, find what caused them, and ultimately improve your user experience. We’ll show you a working example of how to do this at the end.&lt;/p&gt;
&lt;h2 id=&quot;how-to-implement-react-error-boundaries&quot;&gt;&lt;a href=&quot;#how-to-implement-react-error-boundaries&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to implement React error boundaries&lt;/h2&gt;
&lt;p&gt;Here are some simple steps describing how to implement them in your code:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a component class that extends a React Component and passes the props.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a &lt;code&gt;componentDidCatch&lt;/code&gt; and &lt;code&gt;render&lt;/code&gt; method as shown in the below example. The &lt;code&gt;componentDidCatch&lt;/code&gt; method allows you to catch the error, and change how the component is rendered. For example, you can display an error message like “Something went wrong!”&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ErrorBoundary&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;React&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Component&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; error&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; errorInfo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

 &lt;span class=&quot;token function&quot;&gt;componentDidCatch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; errorInfo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token comment&quot;&gt;// Catch errors in any components below and re-render with error message&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
     error&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; error&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     errorInfo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; errorInfo      
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

 &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errorInfo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
       &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Something went wrong&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;children&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add your new component in HTML, surrounding the parts you would like to include in your error boundary. In this example, we are adding an error boundary around a buggy counter component.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ErrorBoundary&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
 &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;BuggyCounter&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;ErrorBoundary&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;adding-rollbar-to-react-error-boundaries&quot;&gt;&lt;a href=&quot;#adding-rollbar-to-react-error-boundaries&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Adding Rollbar to React error boundaries&lt;/h2&gt;
&lt;p&gt;For real-world production applications, it’s important to monitor errors so you understand your user’s experience. If your application is breaking, you don’t want to lose customers or have them complain on app reviews or social media. It’s much better to monitor those production errors so that you’re the first to know, and can fix the issue before more customers are impacted.&lt;/p&gt;
&lt;p&gt;Thankfully, it’s pretty easy to add Rollbar tracking to your React error boundaries. We will show you how:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open our previous &lt;strong&gt;&lt;a href=&quot;https://codepen.io/rollbar_example/pen/JrMGQq?editors=1011&quot; target=&quot;_blank&quot;&gt;Codepen example&lt;/a&gt;&lt;/strong&gt; which has error boundaries configured.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Notice the first part of our JavaScript code, which configures and loads Rollbar. You can find the full details on how it works in our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JavaScript documentation&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; _rollbarConfig &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  accessToken&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3cda8fbafbfe4a6599d1954b1f1a246e&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  captureUncaught&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  captureUnhandledRejections&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  payload&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    environment&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;production&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add Rollbar error tracking to the error boundary’s &lt;code&gt;componentDidCatch&lt;/code&gt; method.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token function&quot;&gt;componentDidCatch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; errorInfo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;    
 Rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Send it to Rollbar!&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Load the page and trigger the error by clicking 5 times. Then, see what these errors look like in our public demo account’s &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/demo/demo/items/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Items page&lt;/a&gt;&lt;/strong&gt;. You don’t need to sign up since this account is open to everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 53.02651325662831%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABQElEQVQoz62SW07EMAxFu/9lsAbYxiwB/kDMjNqmceK8OndslxQBlfiASFdOnfr65DFQZFCIf9L7SJg9I3LGUEoBESHIh5fIqaDWaso5/5D+b2sSQ0yYncfzq8NMBTqG04vH42nEk6jHkJotzvMM7z2WZbG5xhCCrd1uN6zralIgbWaG+nG5jqCYwbkhikFMStBQ6mqF39WKx+V8hnNup9a8GWqC3BWJJiQxrCQ0PtsWnEjnGgNXa6hK8YxpmsDMO+VuqMlCF9QwClFDI2fFXRS3qNS7IV9t60p2aKjbZrltI1wmoSpYhErNNJc+jLjPgxCO4zGhdtHDjtJRC6qbti2LqVJ1cf4k5PBml3Vo2Fqzg7Wn0uTmEn+hibyZVTmOXtQqQeu0puf6GFIuSGXF0dAie6NCr1FJfhuDdHj4T90BVbZTp/v2mgAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Items screenshot&quot;
        title=&quot;&quot;
        src=&quot;/static/image1-13a75000e367e7d11f9ebc5b8bc1bec6-e9535.png&quot;
        srcset=&quot;/static/image1-13a75000e367e7d11f9ebc5b8bc1bec6-d32c5.png 216w,
/static/image1-13a75000e367e7d11f9ebc5b8bc1bec6-06f31.png 432w,
/static/image1-13a75000e367e7d11f9ebc5b8bc1bec6-e9535.png 864w,
/static/image1-13a75000e367e7d11f9ebc5b8bc1bec6-ab1f5.png 1296w,
/static/image1-13a75000e367e7d11f9ebc5b8bc1bec6-7539a.png 1728w,
/static/image1-13a75000e367e7d11f9ebc5b8bc1bec6-a4b01.png 1999w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Live error feed, as seen in Rollbar&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Get more details by clicking on the item near the top of the list that says “Uncaught Error: I crashed!” You can now see a traceback and &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/introducing-javascript-telemetry/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;telemetry&lt;/a&gt;&lt;/strong&gt; recording what happened before the error occurred. This provides more context to help you find the root cause of errors.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 102.0686175580222%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAB6ElEQVQ4y61U227bMAz1/3/ZMKAPfd7QoVkTR5Kv8kWSZeeMpKO0ddI1QyfghJJFHlGHVLLGDvgKyqqAqRp8+/6A3/sc2TRFvOQFjqbGXpVQZOu2Q64r6KLBZyNGj2ma8LzbYRgGZKfTCfM8Y1kW+Mnjpd3BuoYc4wXscwsct/XLmGgcR3jvUXcVHvMH7OudfLPWyqkfEXJM3/fiw3ZhQj6Fg8O0wDkHHyJCmMQh0FW6rhPwwR8Rv4Vk2HaDYDu6gbLsx6vvzgfx59jtEA3f6pCQdHWU8bKcrgLXjF8JTbseLBmyFulqDJaAK8fE3eAwOk9SBJEiZRUjSUUSRTp4Ir+i6V8zlOB5eY+4UJa0J3YFzxmfauioAFwEznQL59I8rGtCkGyvwVxSZW6PozaEShpbGp0bu2xhSouyrAmlQCkFrbW0yhYs0YVQGSIrLL0Oi4NuiczKOuc57RljoIksz3O0bfsPhOWZpFznR7MSarqB0gqHw0FIldK3CVNRVo3IUiXd2V7mZ/1WTZ2AY7YQDbnH7Bgx+hn/Y0iGzPwVjNT86QFk6ZHzxi/VSFOzro6svG0Cr++B9CH/cCATPqlaxBVC+sa9dS/ZO8LUBsXPH1LxVXgv2QpckMLcKkTCpbHTn8PfnO8Fc/0BrXsY9LLfRW4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Item detail screenshot&quot;
        title=&quot;&quot;
        src=&quot;/static/image2-a118cf6993a4c8a22524d04632702ff9-e9535.png&quot;
        srcset=&quot;/static/image2-a118cf6993a4c8a22524d04632702ff9-d32c5.png 216w,
/static/image2-a118cf6993a4c8a22524d04632702ff9-06f31.png 432w,
/static/image2-a118cf6993a4c8a22524d04632702ff9-e9535.png 864w,
/static/image2-a118cf6993a4c8a22524d04632702ff9-ab1f5.png 1296w,
/static/image2-a118cf6993a4c8a22524d04632702ff9-7539a.png 1728w,
/static/image2-a118cf6993a4c8a22524d04632702ff9-db3c3.png 1982w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Error details page, as seen in Rollbar&lt;/p&gt;
&lt;p&gt;We highly recommend you add error boundaries to your React applications. They are very easy to use, and not only help you provide a graceful recovery, but also report those errors to Rollbar so you can quickly fix errors before they impact more users.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;signup for a 14-day free trial&lt;/a&gt;&lt;/strong&gt; of Rollbar and let us help you take control of React errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Quickly edit and merge many error items at once]]></title><description><![CDATA[Rollbar just added a new feature that allows you to quickly edit and  merge  hundreds or thousands of items at once. In the past, you could…]]></description><link>https://rollbar.com/blog/merge-many-items-at-once/</link><guid isPermaLink="false">https://rollbar.com/blog/merge-many-items-at-once/</guid><pubDate>Wed, 20 Sep 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Rollbar just added a new feature that allows you to quickly edit and &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/merge-items/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;merge&lt;/a&gt;&lt;/strong&gt; hundreds or thousands of items at once. In the past, you could only edit or merge items on a single page, which is limited to 30 items at a time. We added a new link that allows you to apply the change to all items in your view or matching a search. This feature provides a similar user experience to how Gmail lets you select all conversions, and then update or delete them.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 57.310924369747895%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAABJ0AAASdAHeZh94AAABlElEQVQoz2VR7Y7bIBD0+7/V6R6gla5V0kp3cRJXVeoPvgzLwgIdnPvVrkZ4B7Ps7DC01kop67pqrdU0reM0XyY1TuZ6Bezt9pmcTvTlK51/0Pkc39/bEcOzuNY6z7PZNno8FI7e7+Z+Xy+jnSZQfbu5x+8P/XExF8OWhWOOwGdxjPHb29vp9J0iKa03pdzulnVFDszLonb9Mr68Xl9HPc56fmJA1xDIe5+l5doip5Qycz6SJDmL5CJYcivo06p0Jn1bBorJOW+MJbuSfRBLkuJJolEUWUrNuXRISRm/UNLz1iow4PpaQRqpKc4/I1EtlZMkp30UY4P1CXA+7SG7kABPECc404tz1ybKOGM9M4uUEIXN5ikbFwKXPRasxNhHItAFakMeUPZ0myMBSMCwxxRcyDuJ0nZTZlnVvKwbiN21gZfw0fXO5Qhjd+v2bkbFeCX/WVzXmQNcScx4D9zOsStNCQTJgM+z+b798st4jFAwLRn7LOZckkBQ+z+GQ+cRUdcwl2MG+Cm0wmROqOyrHKP9E38BWbN4uxLunckAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Merge all items screenshot&quot;
        title=&quot;&quot;
        src=&quot;/static/all-items-123a5656af7984f77a9cc1ec49f490c9-e9535.png&quot;
        srcset=&quot;/static/all-items-123a5656af7984f77a9cc1ec49f490c9-d32c5.png 216w,
/static/all-items-123a5656af7984f77a9cc1ec49f490c9-06f31.png 432w,
/static/all-items-123a5656af7984f77a9cc1ec49f490c9-e9535.png 864w,
/static/all-items-123a5656af7984f77a9cc1ec49f490c9-45844.png 1190w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;This is useful to perform bulk updates, such as assigning many items from a single component to a developer to fix. You might want to merge multiple errors that are similar but come from different parts of your application. You could also resolve all your errors before doing a deployment so that you have a fresh view with the new version.&lt;/p&gt;
&lt;p&gt;Thanks to our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/grouping-algorithm/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;intelligent fingerprinting rules&lt;/a&gt;&lt;/strong&gt; you only need to merge items once. New occurrences will remain in the merged item. This makes it much easier to manage the items in your account by keeping your view clutter free, and giving you accurate metrics on how often errors occur. As a result, you can focus your attention on new and high-impact errors.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, signup for a 14-day free trial of Rollbar and let us help you take control of impactful production errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introducing AWS Lambda Support for Node.js and Python]]></title><description><![CDATA[We’ve just updated our Rollbar.js and Python libraries, making it easy for you to monitor errors on AWS Lambda. If you’ve been considering…]]></description><link>https://rollbar.com/blog/lambda-support-for-nodejs-python/</link><guid isPermaLink="false">https://rollbar.com/blog/lambda-support-for-nodejs-python/</guid><pubDate>Thu, 07 Sep 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’ve just updated our Rollbar.js and Python libraries, making it easy for you to monitor errors on AWS Lambda. If you’ve been considering building apps with serverless architectures on Lambda, we’ve got the exception tracking covered so you can rest easy.&lt;/p&gt;
&lt;h2 id=&quot;serverless-architectures&quot;&gt;&lt;a href=&quot;#serverless-architectures&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Serverless architectures&lt;/h2&gt;
&lt;p&gt;Serverless architectures have taken resource abstraction to the next level. &lt;/p&gt;
&lt;p&gt;We&apos;ve now gone from having servers hosted and managed in the cloud, to having servers that require zero touch and are ephemeral in nature - they&apos;re spun up automatically only when certain events are triggered. &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;They also scale out automatically with usage, and whereas before you paid for compute resources you &lt;em&gt;allocated&lt;/em&gt;, now you only pay the resources your app actually &lt;em&gt;uses&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;aws-lambda&quot;&gt;&lt;a href=&quot;#aws-lambda&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;AWS Lambda&lt;/h2&gt;
&lt;p&gt;In &lt;strong&gt;&lt;a href=&quot;https://aws.amazon.com/lambda/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;AWS Lambda&lt;/a&gt;&lt;/strong&gt;, currently the most popular service for building serverless apps, how much you use is based on how many times you trigger functions and how long it takes for those functions to execute.&lt;/p&gt;
&lt;p&gt;Lambda functions come with limits, such as the concurrency execution limits. This is set at account-level and when you hit those limits, throttling kicks in. As a result, your functions don’t get executed and you get errors. This is just one of many things to consider and monitor when architecting your app to run on Lambda.&lt;/p&gt;
&lt;h2 id=&quot;monitoring-errors-in-lambda&quot;&gt;&lt;a href=&quot;#monitoring-errors-in-lambda&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Monitoring errors in Lambda&lt;/h2&gt;
&lt;p&gt;Lambda uses &lt;strong&gt;&lt;a href=&quot;https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions-metrics.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Cloudwatch&lt;/a&gt;&lt;/strong&gt; for monitoring and logging, providing metrics such as number of invocations, execution duration times, throttles, logs, and number of errors from failed invocations.&lt;/p&gt;
&lt;p&gt;For richer and more granular information on errors that helps you debug them quickly, we recommend you use a dedicated error monitoring tool like Rollbar. &lt;/p&gt;
&lt;p&gt;With Rollbar, you get complete stack traces, replay requests, track events by browser, IP address, affected users tracking, and much more.&lt;/p&gt;
&lt;h2 id=&quot;rollbar-support-for-nodejs-and-python-on-lambda&quot;&gt;&lt;a href=&quot;#rollbar-support-for-nodejs-and-python-on-lambda&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Rollbar support for Node.js and Python on Lambda&lt;/h2&gt;
&lt;p&gt;Our &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar.js&lt;/a&gt;&lt;/strong&gt; library now includes a new &lt;code&gt;lambdaHandler&lt;/code&gt; function. Check out the docs &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.js/#lambda&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;&lt;/strong&gt; for more details, and get the latest version of Rollbar.js &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;For Python, our &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/pyrollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;pyrollbar&lt;/a&gt;&lt;/strong&gt; library has been updated to support Lambda as well. You can read the docs &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/pyrollbar/#aws-lambda&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;&lt;/strong&gt; for more details, and get the latest library &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/pyrollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Give it a try and let us know what you think!&lt;/p&gt;
&lt;p class=&quot;highlightbox&quot;&gt;
If you encounter any problems or have improvement requests, we welcome you to open an issue in Github. Since the notifier is open source, we always welcome your contributions.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and start monitoring for errors in your Node.js app on Lambda.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introducing JavaScript Telemetry]]></title><description><![CDATA[We're excited to introduce JavaScript telemetry, which provides a timeline of events in the browser leading up to when an error occurred…]]></description><link>https://rollbar.com/blog/introducing-javascript-telemetry/</link><guid isPermaLink="false">https://rollbar.com/blog/introducing-javascript-telemetry/</guid><pubDate>Wed, 16 Aug 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;re excited to introduce JavaScript telemetry, which provides a timeline of events in the browser leading up to when an error occurred. This helps you find the root cause of &lt;strong&gt;&lt;a href=&quot;/error-tracking/javascript/&quot;&gt;JavaScript errors&lt;/a&gt;&lt;/strong&gt; faster by providing critical information on user behavior, network activity, and more. You might also think of this timeline of events as a trail of breadcrumbs or a black box recorder which tells you what happened just before a crash or error.&lt;/p&gt;
&lt;p&gt;In the screenshot below, we see a timeline showing a complete story of how the user encountered an error. First they loaded the page, typed their email address into the sign up form, validated the email, navigated to an onboarding page, and then the error occurred. This gives clear context on what caused the error and which component needs to be fixed.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 53.93258426966292%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABCElEQVQoz62SXWrDMBCEfcieIOfMOUqb5CFQXJxAY/1LK8neatbEL02hJn0YVl6kb2cHdz7m/UWlo/b5OE3T0+pqrTjwM4pU2MbMVCp3oI7jyA3Mr/2NjTFMmVhpYucK33RovcpaV7Y+Sk2pcCk/BbgA53nmu7TWTERSQwgy6K9agXeH6v2NY4wcG+j8ceb+2jc3aTvQOSeNz9GxUkrsK6PYJ785TwFiRaxrInJb4FgZQqZw/SizXzPEymiY62ld0VrH3nsRsrTWrmdUDMYgDEQPEiB+GzgEkFJYKi1OUbcIbwU4DIM4+DocJMPQJlufpKe1ETiEb+m51O7Qw7W7nPNL0+4/1IC7b3BETC0CFdUNAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;JavaScript telemetry screenshot&quot;
        title=&quot;&quot;
        src=&quot;/static/telemetry-fa7501071da224bd3a65a2cbdcdde5a7-e9535.png&quot;
        srcset=&quot;/static/telemetry-fa7501071da224bd3a65a2cbdcdde5a7-d32c5.png 216w,
/static/telemetry-fa7501071da224bd3a65a2cbdcdde5a7-06f31.png 432w,
/static/telemetry-fa7501071da224bd3a65a2cbdcdde5a7-e9535.png 864w,
/static/telemetry-fa7501071da224bd3a65a2cbdcdde5a7-9b43e.png 1246w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
JavaScript telemetry data, as seen in Rollbar &lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;troubleshooting-can-be-difficult-and-time-consuming&quot;&gt;&lt;a href=&quot;#troubleshooting-can-be-difficult-and-time-consuming&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Troubleshooting can be difficult and time-consuming&lt;/h2&gt;
&lt;p&gt;If you’re a web developer, you know it can be difficult to reproduce unusual errors and problems reported by users. There are many variables including inconsistent browser environments, unexpected user behaviors, network calls, state changes in the application, and more. Reproducing problems costs your team time in development, QA and support. Unfortunately, if your team cannot reproduce the problem it’s often put on the back burner which can leave users hanging with no resolution.&lt;/p&gt;
&lt;p&gt;Having enough contextual information can save you time because you can quickly see the cause of the problem without having to manually test different scenarios or debug your code. It also improves time to resolution because you don’t have to ask for the user for clarification about what they were doing, the complete context will be tracked automatically and available instantly.&lt;/p&gt;
&lt;h2 id=&quot;how-telemetry-helps-you-fix-impactful-issues-faster&quot;&gt;&lt;a href=&quot;#how-telemetry-helps-you-fix-impactful-issues-faster&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How telemetry helps you fix impactful issues, faster&lt;/h2&gt;
&lt;p&gt;Rollbar helps you fix impactful issues faster by giving you additional context, including the following data:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Item&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Page load events&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tells you when the DOM content loaded and the full page  loaded, to help distinguish errors before and after page load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User behavior&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What users clicked on, typed into input boxes, or navigated routes in single page apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Console messages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Log events and error messages that occurred just before the error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network activity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;XHR and fetch calls to APIs on own server or a third party’s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rollbar exceptions and messages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;If other exceptions or messages occurred leading up to this one, we&apos;ll include links to them in the telemetry timeline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;An example of how to use custom Rollbar messages is to you can track is the full response data from API calls. This is particularly useful for seeing the status code from the server, which could indicate a problem processing the request due to rate limiting, authentication problems, and more.&lt;/p&gt;
&lt;p&gt;Additionally, if you track a unique identifier such as a transaction ID you will be able to trace the error to a specific request on the server side. This provides you additional information to debug server-side problems with database connections, business logic, etc.&lt;/p&gt;
&lt;p&gt;Unlike with logs, you don’t have to worry about having too much debug information tracked through breadcrumbs because the information is only sent in the case of an error. Providing enough debug information may help you fix edge cases even if you can’t easily reproduce it in your own browser.&lt;/p&gt;
&lt;h2 id=&quot;getting-started-with-javascript-telemetry&quot;&gt;&lt;a href=&quot;#getting-started-with-javascript-telemetry&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Getting started with JavaScript telemetry&lt;/h2&gt;
&lt;p&gt;The first step to getting telemetry data is to make sure you’re using the latest version of the JavaScript SDK, &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;rollbar.js&lt;/a&gt;&lt;/strong&gt;. Version &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;2.2.0&lt;/a&gt;&lt;/strong&gt; or higher sends telemetry data back to Rollbar. It’s backwards compatible so you should be able to just drop the new version in. At this time, we only support telemetry data for client-side JavaScript so you only need to update your client-side code. If you’re using our client-side snippet or CDN library, it should update automatically. If you’re using bower or npm you will need to run the update command and then deploy the new version.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npm update --save rollbar&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You can see the telemetry data in the Rollbar application on the error item view. The first tab is the Traceback tab, and the telemetry data will be shown at the bottom when data is available for the error item. You will be able to see more by clicking on the Occurrences tab. Seeing commonalities between multiple occurrences can help you identify what common conditions could be associated with the root cause.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 51.273344651952456%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAAA4ElEQVQoz62SS24DIRBEuf+ZfIjs2WRlZyYaBhh+za9C4yTywpvEg/QoEK1SqwsRQrgQkWRyzi8jeHPOYRjDxwLrM1KuOEKBTwWG71Sn8vtPDavjc8igWZ8RUoVIKUl/u8FtG5blA9tQpRS8939meGF2WErBGdQ6OiTKkkpDbR2ldry6BI0OF01YDUEd9/m11v5F7507JIkT1zT0I2UOgtN2h8V2lXPInDzDw2ZijL/nZ4w87oZsxOmymv0Ty/sb1nWddzbWR8SuLbQ2MFoP/cZY7DZCGY/hM4MRjx/7DL4ANT0HTriaGNcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;JavaScript telemetry screenshot 2&quot;
        title=&quot;&quot;
        src=&quot;/static/telemetry-where-5b16ef71eafcfc80ca0ca18b6a922d25-e9535.png&quot;
        srcset=&quot;/static/telemetry-where-5b16ef71eafcfc80ca0ca18b6a922d25-d32c5.png 216w,
/static/telemetry-where-5b16ef71eafcfc80ca0ca18b6a922d25-06f31.png 432w,
/static/telemetry-where-5b16ef71eafcfc80ca0ca18b6a922d25-e9535.png 864w,
/static/telemetry-where-5b16ef71eafcfc80ca0ca18b6a922d25-3b572.png 1178w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
JavaScript Telemetry, available within the Traceback tab, in Rollbar&lt;/p&gt;
&lt;p&gt;To learn more about it please see the &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/telemetry/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;telemetry documentation&lt;/a&gt;&lt;/strong&gt;. We also provide options to fine tune which types of telemetry data are sent in the &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.js/#telemetry&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;rollbar.js documentation&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, signup for a 14-day free trial of Rollbar and let us help you take control of impactful JavaScript errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Purpose-Built Error Monitoring Alternative to New Relic]]></title><description><![CDATA[One of the more frequently asked questions we hear is: "Doesn't my existing Application Performance Management (APM) solution, such as New…]]></description><link>https://rollbar.com/blog/new-relic-alternative-error-monitoring/</link><guid isPermaLink="false">https://rollbar.com/blog/new-relic-alternative-error-monitoring/</guid><pubDate>Tue, 08 Aug 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of the more frequently asked questions we hear is: &quot;Doesn&apos;t my existing Application Performance Management (APM) solution, such as New Relic, monitor and track errors in our application?&quot;&lt;/p&gt;
&lt;p&gt;The short answer is - it’s not enough. They are very complementary and most &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt; users use both (&lt;em&gt;we do&lt;/em&gt;) for various debugging scenarios. APM tools are great at telling you &lt;strong&gt;what&apos;s slow&lt;/strong&gt;, &lt;strong&gt;when&lt;/strong&gt; and &lt;strong&gt;where exceptions occur&lt;/strong&gt;. Rollbar provides a lot more contextual information to help you determine &lt;strong&gt;what&apos;s broken&lt;/strong&gt;, &lt;strong&gt;why they occur&lt;/strong&gt;, &lt;strong&gt;who is affected&lt;/strong&gt;, and &lt;strong&gt;how to fix them&lt;/strong&gt;. It saves you a substantial amount of time dealing with errors and leaves more time for resolving issues and improving your product experiences.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/why-rollbar/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 34.62286158631415%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAABNUlEQVQoz2M4e+e52vtPX6+D8NHLd2WuXr/Jgw0Xz9luUjhrmyUuXDp3u/HVazdYGD58/vb2x4+f/0H487cfXxas3Wm4fO0WB2X3aHkglgFiRSBmCOlc+yxt2tb/GdO3gXFo19r/kT3r/mfN2A7mR/et/zVx3UEZhidvPia9/vClHYSfvflYfeL8FT5sLjx1/orwkTOX+IDywieg7P41B6RANAifBOm7doOJARlcvXaTF5eXgXJKQFry6vUbYkCNQiD1oZ1reQILEj0t3cL8gNgLiGVQDHz0+InY3LnzhOfMmSMCxJJALA3EjCC5M2fOKgLZokAsBsSCILHOtcfErNzC5IBYGoiVgFiUAR0AFcsDsTYQKwMxL5I4yCINIFZAFrcPSgUZqgnEWiCDGSgFUAM1oFgBAORE6pXfAEGcAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;error monitoring diagram&quot;
        title=&quot;&quot;
        src=&quot;/static/error-monitoring-diagram-2b2e1f4d336ad8fbff26e7fa0b38517e-e9535.png&quot;
        srcset=&quot;/static/error-monitoring-diagram-2b2e1f4d336ad8fbff26e7fa0b38517e-d32c5.png 216w,
/static/error-monitoring-diagram-2b2e1f4d336ad8fbff26e7fa0b38517e-06f31.png 432w,
/static/error-monitoring-diagram-2b2e1f4d336ad8fbff26e7fa0b38517e-e9535.png 864w,
/static/error-monitoring-diagram-2b2e1f4d336ad8fbff26e7fa0b38517e-ab1f5.png 1296w,
/static/error-monitoring-diagram-2b2e1f4d336ad8fbff26e7fa0b38517e-7539a.png 1728w,
/static/error-monitoring-diagram-2b2e1f4d336ad8fbff26e7fa0b38517e-ddd13.png 2592w,
/static/error-monitoring-diagram-2b2e1f4d336ad8fbff26e7fa0b38517e-31ab5.png 5144w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let’s see how New Relic and Rollbar compare when it comes to monitoring and managing application errors.&lt;/p&gt;
&lt;!--more--&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;&lt;strong&gt;Rollbar&lt;/strong&gt;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;&lt;strong&gt;New Relic&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Error tracking&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error analytics&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stack traces&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error frequency heatmap&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure monitoring&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transaction tracing&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notifications and alerting&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issue tracker integration&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Filter by host&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data retention &gt; 8 days&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓ (180 days)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom rate limits&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕ (100 events per minute)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live error view&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git repo integration&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Map errors to deployments&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw payload per error&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replay requests&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;People affected&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telemetry&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local variable values&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom error grouping rules&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✓&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;✕&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;h2 id=&quot;overview-of-new-relics-error-analytics&quot;&gt;&lt;a href=&quot;#overview-of-new-relics-error-analytics&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Overview of New Relic&apos;s Error Analytics&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/vs/new-relic/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;New Relic&lt;/a&gt;&lt;/strong&gt; APM and Browser products offer a high-level view of performance issues over time and where they are coming from. Error Analytics allows you to see when there is an increase in errors, and which transactions are generating them.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 47.65465669612508%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABjklEQVQoz42QS0+DQBDH96Pp0cRWi6+78aoHz3rRqDV+Av0MXj0YFWKI+MBHfGEiVhqstCxFhF12gQJ1KDEx8aC/zGF3Mv+Z/wwaXq4PLdWHl+qVsbFKpTL6i2q1KgjCeK1gujoi1GoTE5OQHBWmkSRKiqLIsnxwJEqSJIri8b9Bjmu7nkOoH30Tx3Gv18v+ATJNE2McBEEpKwFxmmX9v0C6rnc6HRCnaZr/4OqDYJ6IOLj16N0nu/LCa4/KXfIYMMUlBuU64ajVapWTQfCz687z04KqzCri/Jm0cavOXZyPKzezp4eLqjxzcjx1dr11r6JGo2FZFogJIYwxMM8HtI1dT1vFj2uutmbcb9nahqVtug8r8HC09e7DSvdlG9m2XUz2PwlWvXeFOpeOq++ZeN/62HvDXpSAi+IEaXECOEdpEGYUO7fbbd8PIEspZQPCMIT1s7yf5v0kzyHgGL1BRFnxLr9QgN4tq9x5YDaCxkkC9Xkn5CaLX/ywGcZNwpo0eiXMILxJ+SvhBo1Myr8AwbP5lx52Ky4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar new relic 3&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-new-relic-3-aa9f1bf64fa799400c42ee6666dbde0d-e9535.png&quot;
        srcset=&quot;/static/rollbar-new-relic-3-aa9f1bf64fa799400c42ee6666dbde0d-d32c5.png 216w,
/static/rollbar-new-relic-3-aa9f1bf64fa799400c42ee6666dbde0d-06f31.png 432w,
/static/rollbar-new-relic-3-aa9f1bf64fa799400c42ee6666dbde0d-e9535.png 864w,
/static/rollbar-new-relic-3-aa9f1bf64fa799400c42ee6666dbde0d-ab1f5.png 1296w,
/static/rollbar-new-relic-3-aa9f1bf64fa799400c42ee6666dbde0d-66ef0.png 1471w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Error Analytics, as seen in New Relic&lt;/p&gt;
&lt;p&gt;You can then drill down into the details for each error to see the exception message, stack trace, details about the request, and which host the error was generated on. These clues may be enough to determine the root cause, but more complex problems require more information to debug.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 46.56301145662848%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsSAAALEgHS3X78AAAA7ElEQVQoz52Q6WrDMBCE9f4PWXCpqWPH1S3rctNPkgkE+qcdkNCxM7Oz4oi51PP7XxDee+dcSunxilqL1lopVUo5O2qtbT8vNPLtvn98rm/vs7TehmhDMj562illWZZ7x7ZtqGAQYzyOI6YG+ALCTdqcMx2wP/4CgQMcjIje0p+/56eELwISE9srs7VWSqm0ltp8KU1XXaor5iFbSBtCoP9pmuZ5Xtd133cqBXqj4oknh69xxQQ3JHByzhpjOLTMLN+BEvJj+K2otRe5UooEZNfxkhk9HwJOY5j4pJz6SOPg8MwqvXsIoRVfc/0BYMENeqD+Eb0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar new relic 4&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-new-relic-4-aec75636ac73f58f8020ebd0365b71d3-e9535.png&quot;
        srcset=&quot;/static/rollbar-new-relic-4-aec75636ac73f58f8020ebd0365b71d3-d32c5.png 216w,
/static/rollbar-new-relic-4-aec75636ac73f58f8020ebd0365b71d3-06f31.png 432w,
/static/rollbar-new-relic-4-aec75636ac73f58f8020ebd0365b71d3-e9535.png 864w,
/static/rollbar-new-relic-4-aec75636ac73f58f8020ebd0365b71d3-1b0bb.png 1222w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Error stack trace, as seen in New Relic&lt;/p&gt;
&lt;p&gt;Furthermore, New Relic is good at monitoring leading indicators in your infrastructure or application performance that &quot;may&quot; eventually lead to an error. This can help you be more proactive in addressing issues before they affect your customers. For example, if a server has a high CPU or memory load it may eventually lead to errors in your application. Performance problems in your code can also lead to errors as timeouts. This is where the strength of APM really shines.&lt;/p&gt;
&lt;p&gt;However, there are a few shortcomings when it comes to monitoring errors in large production environments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;New Relic’s Error Analytics only supports &lt;strong&gt;&lt;a href=&quot;https://docs.newrelic.com/docs/accounts-partnerships/accounts/account-billing-usage/data-retention&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;7 days of retention&lt;/a&gt;&lt;/strong&gt; of trace data. This severely limits the ability for your developers to troubleshoot problems that happened in the past, such as waiting for a new sprint to address them, bugs that were on the backlog, and more. Fortunately, &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/pricing/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar offers 180 days of retention&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New Relic caps your data at &lt;strong&gt;&lt;a href=&quot;https://docs.newrelic.com/docs/apm/applications-menu/error-analytics/error-analytics-explore-events-behind-errors#reporting_cap&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;100 events per minute per agent instance&lt;/a&gt;&lt;/strong&gt;. The fact is that today&apos;s production services can process hundreds or thousands of transactions per minute. A single repeated error could drown out key events with clues to the root cause of the problem. That&apos;s why Rollbar allows you to &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/rate-limits/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;customize your data caps&lt;/a&gt;&lt;/strong&gt; for each service, and we store each occurrence without sampling.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-rollbar-takes-error-monitoring-a-step-further&quot;&gt;&lt;a href=&quot;#how-rollbar-takes-error-monitoring-a-step-further&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How Rollbar takes error monitoring a step further&lt;/h2&gt;
&lt;p&gt;Rollbar gives you a live view of your errors up to the last few seconds, helps you debug problems faster, automatically tracks whether those problems are resolved, and helps you follow up with your customers to ensure amazing product experiences.&lt;/p&gt;
&lt;p&gt;That’s why it’s become an essential part of the DevOps tool belt. A modern DevOps organization functions best when it has a solution for application performance management, error tracking, and log analysis. This extra context is especially important when using &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/how-circleci-does-production-error-monitoring/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Continuous Development&lt;/a&gt;&lt;/strong&gt;. Since you may be deploying changes many times per day, you need to be able to monitor for errors continuously, and quickly determine which change caused them.&lt;/p&gt;
&lt;p&gt;Rollbar doesn’t just help developers. It also tells you who was affected so your product management team can prioritize fixes for issues that impact many customers or high-value customers. It also helps your customer support team proactively reach out to improve customer relationships.&lt;/p&gt;
&lt;h3 id=&quot;✓--monitor-application-errors-live-in-real-time&quot;&gt;&lt;a href=&quot;#%E2%9C%93--monitor-application-errors-live-in-real-time&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✓  Monitor application errors live, in real-time&lt;/h3&gt;
&lt;p&gt;When critical errors occur in production you need to know quickly so you can solve them before more customers are impacted. Rollbar’s live error view will show you errors occurring in real time. Below, we can see the last error occurred only 37 seconds ago. This is a great page to watch during and immediately after deploys to see if the latest changes broke anything. It&apos;s also useful when interactively debugging an issue or verifying that it’s been fixed. For example, you may want to replay the command to see if they error occurs, and you can watch to see if it shows up in real time on this page.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 32.54747871643746%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsSAAALEgHS3X78AAABAklEQVQY041QTUvFMBDs//83goIHb157UBFBfOVp63uhMds2X002afuctih4cxiW3c3OTpKibVulSKpOyi9JvfkHiEgpdXN/LK6fzuDts7h6ON29tMsGTIQQuq6z1gEoU0r7kQ8MusDW2uLtTDX5uvOI71JfNuSc01+gg/7oV8QYEdEsmqah6uitMyNnNGNaGVLg/JtzmuDJwzCOI3PCpbRqV3FZltXhgE3ac+8DmeACNFBm6OdlufzANY3WGrYQSyGmaSqEEKZ6xRqMhkHD327Eip3TPO+vjaTgjEnoP08NYsHMrnpk7OOcHA0uKhN6F2mLKHGjXZxIGrM64//qjx7JN9VmjgYAGdkkAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar new relic&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-new-relic-95a9637bfea8d7872e442b878f12fcc1-e9535.png&quot;
        srcset=&quot;/static/rollbar-new-relic-95a9637bfea8d7872e442b878f12fcc1-d32c5.png 216w,
/static/rollbar-new-relic-95a9637bfea8d7872e442b878f12fcc1-06f31.png 432w,
/static/rollbar-new-relic-95a9637bfea8d7872e442b878f12fcc1-e9535.png 864w,
/static/rollbar-new-relic-95a9637bfea8d7872e442b878f12fcc1-ab1f5.png 1296w,
/static/rollbar-new-relic-95a9637bfea8d7872e442b878f12fcc1-41f26.png 1527w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Live error feed, as seen in Rollbar &lt;/p&gt;
&lt;p&gt;We also give you a high-level summary of the top errors in the last day. This table is sorted to show critical errors at the top ranked by how often they occur, followed by less serious levels of errors below. What’s unique on this page is that we automatically recognize which errors are new or have reactivated. this lets you know whether the error was caused by recent code change, or whether it’s a regression on a previously resolved issue.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 56.8241469816273%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsSAAALEgHS3X78AAABrUlEQVQoz21Sy04UQRTtryM+YScf4EIjIBvcq4kPIBKJXyFLDR+gYWGQBFF8JKKTYabNMN1dj75d767G0zNNNBlOTjqVqjr3nrqnk4XVzcUH21fvPbu19vLmysaN5XV8F+5vXl9ex9GVu0/n7jz5n9eWns/f3p5f2cAiCd5LKcsJvPfnl0Fr7ZzjnONmjLFpmul+goN+v8+HA82ZLKvKeG2Dst64YF1oLuCk5EJwdCEquAix1SeohIao6kUhyDCyrd4F0LTirrmn8vBk9OLNp1e7X7beHn0dsFZsrU3TlE4OnZakXakm1C3lZO1D3TTRjkcZp8+/z45+jUBR2VYcQhBC4MGWmDIOu51YOdSC/842L/KCCSEZ3Mty6igxxvR6vTzPWUmMDLpBAML2dDYtYjRZ9uHb6eOdg4evPz7aOdj/edZ1xiSJCP5JmVKZSwcedXU6Yu+Ph++OB3vf/6Ss+jft8XCYZRmSUErVdd3MIFgLv1PAbBcVruLBJv1h87EodS4Npj0TVfSsgEEIjKtjvMgZtqFHVEFXiIpX1kxymo2qUioTipMeS02m/Z3+AjE8U1/cXAr4AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar new relic 9&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-new-relic-9-96461e46b11f2b78a8e4b36b849bf7a6-e9535.png&quot;
        srcset=&quot;/static/rollbar-new-relic-9-96461e46b11f2b78a8e4b36b849bf7a6-d32c5.png 216w,
/static/rollbar-new-relic-9-96461e46b11f2b78a8e4b36b849bf7a6-06f31.png 432w,
/static/rollbar-new-relic-9-96461e46b11f2b78a8e4b36b849bf7a6-e9535.png 864w,
/static/rollbar-new-relic-9-96461e46b11f2b78a8e4b36b849bf7a6-ab1f5.png 1296w,
/static/rollbar-new-relic-9-96461e46b11f2b78a8e4b36b849bf7a6-fd861.png 1524w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Dashboard view, as seen in Rollbar &lt;/p&gt;
&lt;h3 id=&quot;✓--debug-production-errors-faster&quot;&gt;&lt;a href=&quot;#%E2%9C%93--debug-production-errors-faster&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✓  Debug production errors faster&lt;/h3&gt;
&lt;p&gt;Rollbar also gives you access to a variety of features that help you debug problems faster. Let’s start by looking at the detailed view of the same error message we were just looking at earlier in New Relic. You can see how often it happens over time, see a detailed traceback, a history showing when they error began, and what changes have been made since then. You can correlate the errors to browsers, operating systems, users, IPs, and more. It also integrates with your issue tracking system so you can create a new bug report or resolve an existing one. With compatible notifier SDKs, you also get access to local variables and telemetry, which we will describe in more detail below.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 57.3814295257181%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQoz41RTW/UMBD1nwd64wT/gFsXQQ/0DAdalZZCi6hWlbYrrbOb3fU6sePxZ5zwklCEyoWn8ciZzDy/mWHbEUVR7PY7vuargm82m7IsOedCiGJdSClDCDHGnHPf913X/fEspWSJ8LtU5fn6vFBF8MEY45zr/wFqpBBI1k3jQ2Dga9sMnoEl+NS2uLQ548SUYPgaTwtM9RNy7lgzwCDbOet8iCl7742hLiM1921Afp8TGTKNfiKEQZ6stSKfcu9SnqKlqM/u+Nl8+2NVfV2In7zCQ9/v+ezz/fuL5cmX5buLh+vFniF1Uao5lw+lWu30Wgz0hdCvT2+PZpevPty8PPn25uMcwU83y2fHVy9mV8+PL4/eXoOCoZODtrC9tpXx+9qmtvOx3UoSym4rOmgnjcdU0JSm0LioKBiXfMwsEkUP7S74AfCNIWvHSAhuBBFhHpjsMKVHjzkzb61SSsj6IOuqVkP/QK2qR2iNvTSE7RHcX0bE8NrI7rWhiB6wJGwoDtcJvxcz7OYpmB0lQiFZP40amlDc/wd+AYpscQB+Y7LXAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar new relic 5&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-new-relic-5-9554b64046b65f114af1fa1603dbffdb-e9535.png&quot;
        srcset=&quot;/static/rollbar-new-relic-5-9554b64046b65f114af1fa1603dbffdb-d32c5.png 216w,
/static/rollbar-new-relic-5-9554b64046b65f114af1fa1603dbffdb-06f31.png 432w,
/static/rollbar-new-relic-5-9554b64046b65f114af1fa1603dbffdb-e9535.png 864w,
/static/rollbar-new-relic-5-9554b64046b65f114af1fa1603dbffdb-ab1f5.png 1296w,
/static/rollbar-new-relic-5-9554b64046b65f114af1fa1603dbffdb-ce725.png 1497w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
JavaScript telemetry data, as seen in Rollbar &lt;/p&gt;
&lt;h3 id=&quot;✓--see-local-variables-when-your-exception-was-thrown&quot;&gt;&lt;a href=&quot;#%E2%9C%93--see-local-variables-when-your-exception-was-thrown&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✓  See local variables when your exception was thrown&lt;/h3&gt;
&lt;p&gt;When you&apos;re debugging an exception, you can use our &lt;strong&gt;&lt;a href=&quot;/blog/local-variable-values-in-stack-traces/&quot;&gt;local variables&lt;/a&gt;&lt;/strong&gt; feature for insight into their values when the exception was thrown. In the past, you&apos;d have to reproduce locally in your debugger, or add an additional rollbar.report_message() to log each variable in production. But now you can just press &quot;locals&quot; for the stack frame and see it instantly. This feature is available for compatible notifier SDKs like Python.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 683px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 101.02489019033676%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsSAAALEgHS3X78AAABfUlEQVQ4y51Ui26DMAzs/38m62ggsfPm1RZ2DlRbJaqVWihKAmef7yxOIQTd6pZcdaFK8ZfidT039iwrX7Qldo1qEN91rVRzVqZuSWk+5Zyv1+v8iJSSc847H0IkQ+M4zq9jAxORtS53Xd/33gOLp+RYI3gk3QffbrdlngFblmUYBtTE98ZQSRIkh7VEHGNanmOrbEuAJJDAz+/FBgYAYJzXDVoIMbZt+z8YBaVn52KMOWXLDM2QgJmN1khkjFmPaAcbJCXm38pd11mWyiuY2WptkBE9A5lSJAnGfoe2aOv8OE5QdeV/oGdxyHmchYK1qICbd8H3+z3lPBfDQLofBqwYPvCHEIUzRoZyl3GPAlprjNHehHmPS7SBjwAW2UQwFg8g5OMGdggYFUQNlnef+AwY8BjOT8CFIf+1CuMpRGRON6tauLdrFVoFArKhhcNWQUqAc+6GojM8j2U8p2l6CwwtUT+UOFZ5/QcU2gcFA0OlVFV9qefAJNR1nV/HD9YKg5cu2bZbAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Screenshot 2014 06 04 151644 134010 o&quot;
        title=&quot;&quot;
        src=&quot;/static/Screenshot-2014-06-04-151644.134010.o-a937e487e71877255c7a1d8c0c645d0f-b6246.png&quot;
        srcset=&quot;/static/Screenshot-2014-06-04-151644.134010.o-a937e487e71877255c7a1d8c0c645d0f-b7f65.png 216w,
/static/Screenshot-2014-06-04-151644.134010.o-a937e487e71877255c7a1d8c0c645d0f-f6fa7.png 432w,
/static/Screenshot-2014-06-04-151644.134010.o-a937e487e71877255c7a1d8c0c645d0f-b6246.png 683w&quot;
        sizes=&quot;(max-width: 683px) 100vw, 683px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Local variables in the stack trace, as seen in Rollbar&lt;/p&gt;
&lt;h3 id=&quot;✓--telemetry-to-send-events-that-occurred-prior-to-your-error&quot;&gt;&lt;a href=&quot;#%E2%9C%93--telemetry-to-send-events-that-occurred-prior-to-your-error&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✓  Telemetry to send events that occurred prior to your error&lt;/h3&gt;
&lt;p&gt;Our &lt;strong&gt;&lt;a href=&quot;/blog/introducing-javascript-telemetry/&quot;&gt;JavaScript telemetry&lt;/a&gt;&lt;/strong&gt; provides a timeline of events in the browser leading up to when an error occurred. This helps you find the root cause of errors faster by providing critical information on user behavior, network activity, and more. You might also think of this timeline of events as a trail of breadcrumbs or a black box recorder which tells you what happened just before a crash or error.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 53.93258426966292%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABCElEQVQoz62SXWrDMBCEfcieIOfMOUqb5CFQXJxAY/1LK8neatbEL02hJn0YVl6kb2cHdz7m/UWlo/b5OE3T0+pqrTjwM4pU2MbMVCp3oI7jyA3Mr/2NjTFMmVhpYucK33RovcpaV7Y+Sk2pcCk/BbgA53nmu7TWTERSQwgy6K9agXeH6v2NY4wcG+j8ceb+2jc3aTvQOSeNz9GxUkrsK6PYJ785TwFiRaxrInJb4FgZQqZw/SizXzPEymiY62ld0VrH3nsRsrTWrmdUDMYgDEQPEiB+GzgEkFJYKi1OUbcIbwU4DIM4+DocJMPQJlufpKe1ETiEb+m51O7Qw7W7nPNL0+4/1IC7b3BETC0CFdUNAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;telemetry&quot;
        title=&quot;&quot;
        src=&quot;/static/telemetry-fa7501071da224bd3a65a2cbdcdde5a7-e9535.png&quot;
        srcset=&quot;/static/telemetry-fa7501071da224bd3a65a2cbdcdde5a7-d32c5.png 216w,
/static/telemetry-fa7501071da224bd3a65a2cbdcdde5a7-06f31.png 432w,
/static/telemetry-fa7501071da224bd3a65a2cbdcdde5a7-e9535.png 864w,
/static/telemetry-fa7501071da224bd3a65a2cbdcdde5a7-9b43e.png 1246w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
JavaScript Telemetry data, as seen in Rollbar &lt;/p&gt;
&lt;h3 id=&quot;✓--connect-git-repos-and-link-stack-traces-to-broken-code&quot;&gt;&lt;a href=&quot;#%E2%9C%93--connect-git-repos-and-link-stack-traces-to-broken-code&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✓  Connect Git repos and link stack traces to broken code&lt;/h3&gt;
&lt;p&gt;Rollbar helps you find the root cause of issues faster by letting you drill down into the code where this error was generated. It works because &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/source-control/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar integrates with your source repository&lt;/a&gt;&lt;/strong&gt;. By clicking on the link in the traceback, it opens the code in &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/github/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/bitbucket/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Bitbucket&lt;/a&gt;&lt;/strong&gt;, or &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/gitlab/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitLab&lt;/a&gt;&lt;/strong&gt; and highlights the line where the error occurred. This helps you see the root cause almost immediately. New Relic doesn’t offer this kind of deep linking of error stack traces to Git repositories.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 51.14006514657981%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAAB9ElEQVQoz1WSy4/SUBTG+S+NlD6AQlwRJbNwoSYEqF2YOLNQhzBEd8boyszEWbnxfzBxZQwMr77pg9IO/Tzn4pSxyZd772nuL9/5zq20Wq2C1WjqRbvdLqXrevHo8dPi+fgaZx+/YzD5BuP9NXrjS/THV+iNvuLk9Wc8efUJJ6df8Oz8Ei9GV6gQDFq9gQc1FU1dh0p7rjWbTRimiR+/FrAsC8FmgyRJYNs2ttsEaZrSmiLPc9z/KuQEDbpMDglC+8a/lWS8NDGbr+F6AeI4LoGx7yH2XLEmcYh8t0WepbglVRigaY1S7OxOpnkALtcewjASQNd1YTu2AAdBgCzdorjvkC8qioKH1VopSVYhKyoGgyFmN3NEUSTEQG7fdz04jgPbsmEROKQ48jw7AlVVJZBUqkqSJAm9Xg+//8ywthzhjB0xiMHLxQK+75MCynIrxPUjUJJLh1Xa12QF/cEA05sVHNenlkORI4M35Min/LLdDjtSlh203++PwFrtAOFWVVWDqmkwDENkuJj+LIciJk7OPM9HRLWQogijmKa+w+2+OAA7nQ7enF/gLendaIKLyQfIsox+v4/pfAXP34gMuWWbs3NoMAReLZcCHtO/jJ7PAVivo0VPp9vt/icGDodDrCi/YBOWQ2HoXV6cIZ/5TfKZ638BQnhxUprqcVwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;stacktrace bitbucket linked&quot;
        title=&quot;&quot;
        src=&quot;/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-e9535.png&quot;
        srcset=&quot;/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-d32c5.png 216w,
/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-06f31.png 432w,
/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-e9535.png 864w,
/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Linked stack traces to git repos, as seen in Rollbar &lt;/p&gt;
&lt;h3 id=&quot;✓--see-which-code-deployment-caused-your-error&quot;&gt;&lt;a href=&quot;#%E2%9C%93--see-which-code-deployment-caused-your-error&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✓  See which code deployment caused your error&lt;/h3&gt;
&lt;p&gt;Rollbar also shows you the &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/deploy-tracking/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;deployment that we suspect&lt;/a&gt;&lt;/strong&gt; has caused this error to occur, and the changes that have been made since the previous deploy. This is especially important to see who made the changes and whether there is a potential interaction when multiple changes happen together. If you need to roll back your deployment your product management, it links you directly to the pages where you can do so quickly.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 29.47019867549669%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsSAAALEgHS3X78AAAAjElEQVQY042QyQ7EIAxD+f8/7cZSggMhpQ2HOY0003dKHMmx7LperSu33vrVZA5VdCq1ighql35hXvX+wqWUjsPHmNZ1XZbFex9sQbtf4EopAMYYPmZCKyzE9lDGCxwR2XNmDiHknFV1vMad55kyUcG2bfu+xxBMAcNc/se2zFWstTHrASwCUPjDb4sHZAJgPlP/F0wAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar new relic 7&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-new-relic-7-0673ce5c6faed27923c6b9116ac3cd96-e9535.png&quot;
        srcset=&quot;/static/rollbar-new-relic-7-0673ce5c6faed27923c6b9116ac3cd96-d32c5.png 216w,
/static/rollbar-new-relic-7-0673ce5c6faed27923c6b9116ac3cd96-06f31.png 432w,
/static/rollbar-new-relic-7-0673ce5c6faed27923c6b9116ac3cd96-e9535.png 864w,
/static/rollbar-new-relic-7-0673ce5c6faed27923c6b9116ac3cd96-ab1f5.png 1296w,
/static/rollbar-new-relic-7-0673ce5c6faed27923c6b9116ac3cd96-66807.png 1510w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Deployment tracking, as seen in Rollbar &lt;/p&gt;
&lt;p&gt;Clicking on one of the changes will open up the diff view in your source repository. Here we can see the exact commit where the error was added into the code.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 40.92088197146563%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAABBklEQVQoz5WR3W7DMAiF8/5v2as2TRz/xAaT2JzhSp22Kb0Y6JMlQAcDU4hOk/eIKb1IaQcxg7n+CyLWnItOLAdqPSDHaTScrV9ynIbVfMq/mXrOkJBAPqJs3t6A02LW5RutjNQTQvHwFODyhsABpRXwDxcVE+wdzTofcr5+oF3x11T1xWnTjJrBlY2aqbdmYmIjtRG5ZBS23my3FV079IOP3NSdgywrytOBHzP4fofY6IfFZJ5RxwpixNxmLPTEg1bc6g2rbHCnx2JszY5qnjWb4L6jeLuwCcTVQ4lgZ/uFMsG3gKVsmNMKxxF04VUrpsKiVAV7ZkRjXPoTmRh7MUgu87Y2/QIhxHCcYk0DHAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar new relic 1&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-new-relic-1-3c6c5e26b0e87309fb13dc2b44fd4355-e9535.png&quot;
        srcset=&quot;/static/rollbar-new-relic-1-3c6c5e26b0e87309fb13dc2b44fd4355-d32c5.png 216w,
/static/rollbar-new-relic-1-3c6c5e26b0e87309fb13dc2b44fd4355-06f31.png 432w,
/static/rollbar-new-relic-1-3c6c5e26b0e87309fb13dc2b44fd4355-e9535.png 864w,
/static/rollbar-new-relic-1-3c6c5e26b0e87309fb13dc2b44fd4355-ab1f5.png 1296w,
/static/rollbar-new-relic-1-3c6c5e26b0e87309fb13dc2b44fd4355-eafcd.png 1542w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Deployment tracking, as seen in Rollbar  &lt;/p&gt;
&lt;h3 id=&quot;✓--drill-down-into-the-raw-payload-for-each-error-occurrence&quot;&gt;&lt;a href=&quot;#%E2%9C%93--drill-down-into-the-raw-payload-for-each-error-occurrence&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✓  Drill down into the raw payload for each error occurrence&lt;/h3&gt;
&lt;p&gt;For more complex errors, you may need to see the raw payload to see what additional information was passed to Rollbar when reporting the error. This is really useful because you can attach additional debug information in your code, or even entire objects or request payloads. This can help you debug issues where there are unusual request parameters or processing sequences. Rollbar also stores every individual instance of the error and payload, whereas New Relic will only provide you a sampled summary. If you are debugging a problem that only happens occasionally or with specific parameters, it’s important to have every instance recorded.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 31.770145310435932%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsSAAALEgHS3X78AAAAaElEQVQY05WNSQ6AIBAE+f8jXULEsM7I4EjiRdziTaVTh75Ut4AASqmc81ofwQt3uieiuTLMLMqnQyu1jN5H5wgxxbhT5lL6lmECE/Sj3fx6DugHpwjgAMvK2d/9S7Zg2rFBY3YNK+QNUQJXVeI93T0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar new relic 6&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-new-relic-6-314b25107cdd92a972c6b4b8a602a886-e9535.png&quot;
        srcset=&quot;/static/rollbar-new-relic-6-314b25107cdd92a972c6b4b8a602a886-d32c5.png 216w,
/static/rollbar-new-relic-6-314b25107cdd92a972c6b4b8a602a886-06f31.png 432w,
/static/rollbar-new-relic-6-314b25107cdd92a972c6b4b8a602a886-e9535.png 864w,
/static/rollbar-new-relic-6-314b25107cdd92a972c6b4b8a602a886-ab1f5.png 1296w,
/static/rollbar-new-relic-6-314b25107cdd92a972c6b4b8a602a886-5cd86.png 1514w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Raw JSON error payload, as seen in Rollbar &lt;/p&gt;
&lt;h3 id=&quot;✓--replay-the-curl-command-and-quickly-reproduce-errors&quot;&gt;&lt;a href=&quot;#%E2%9C%93--replay-the-curl-command-and-quickly-reproduce-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✓  Replay the cURL command and quickly reproduce errors&lt;/h3&gt;
&lt;p&gt;If you want to reproduce the error, you can also replay the occurrence by issuing a new HTTP request with the same parameters and header information.  This is useful when debugging the problem because you can repeat it and then analyze what happens interactively, especially when there are multiple interconnected services that are difficult to track on a single box. It’s also useful after you’ve patched the problem and want to verify that it’s working correctly.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 31.17569352708058%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsSAAALEgHS3X78AAAAfklEQVQY05WOSw4CIRBEuf819B669Qjuhn8YvhEUwmYsR1xq8K2qk37dRS5Xfzwvh9NSa22t1Q/IvfftJ8R7zzmnlDrnMri9yHnEx37lGwRLUkohhLU2pRRjDCGUUu4TDJkx9vYntSGjG9/RWq+rwfiHjM9KKTw3xqAwms/LT6sNVQLLa7cxAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar new relic 10&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-new-relic-10-b7dc86cc990512bc7a5788738d92b870-e9535.png&quot;
        srcset=&quot;/static/rollbar-new-relic-10-b7dc86cc990512bc7a5788738d92b870-d32c5.png 216w,
/static/rollbar-new-relic-10-b7dc86cc990512bc7a5788738d92b870-06f31.png 432w,
/static/rollbar-new-relic-10-b7dc86cc990512bc7a5788738d92b870-e9535.png 864w,
/static/rollbar-new-relic-10-b7dc86cc990512bc7a5788738d92b870-ab1f5.png 1296w,
/static/rollbar-new-relic-10-b7dc86cc990512bc7a5788738d92b870-5cd86.png 1514w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
cURL replay, as seen in Rollbar &lt;/p&gt;
&lt;h3 id=&quot;✓--resolve-errors-track-regressions-and-affected-users&quot;&gt;&lt;a href=&quot;#%E2%9C%93--resolve-errors-track-regressions-and-affected-users&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✓  Resolve errors, track regressions and affected users&lt;/h3&gt;
&lt;p&gt;Rollbar automatically resolves errors and give you the peace of mind that it will be tracked and reopened if your fix does not work. You can be automatically notified of regressions. You can also track which customers are affected by errors, which empowers your customer support and product management teams to deliver a good customer experience.&lt;/p&gt;
&lt;p&gt;After you’ve fixed an error, you’ll want to make sure that the error is resolved in production. Also, you&apos;ll want to make sure that it doesn’t come back again. &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/resolved-in-version/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar can automatically mark errors as resolved through its integration with your source control and deployment systems&lt;/a&gt;&lt;/strong&gt;.  Just include a reference or link to the error in your commit message, then we will track when it’s been deployed and reactivate the error if it reoccurs.&lt;/p&gt;
&lt;p&gt;Below, you can see the dashboard page which displays the top 5 new and reactivated errors. This saves you time because you don’t have to make a reminder to manually go back and check for each individual error after your code is deployed. Rollbar will automatically reactivate errors if they are not fixed after the deployment.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 29.6969696969697%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAAAzUlEQVQY032QW4uDMBSE8/9/3L7pw4JbKYS4bdXEGHP1TGOkt4V1YJhADpMvh+l5hlIS4zhCyhHDMJQzER267/e5zVprPMSEEOBtixvn0NcbjAtIaT0s80rBO1cKtA205bpSSfYfYYjxsNQ6TxdpshdyPtBPp4j3mljTNPiuKlzaE+ZMONsAs9m97Hz8Qyjzl3tM04Sdbi2ZMgSr6xpt/QXze8bSCQyThTL+mE5wWGt358fexVJK5SKEvLvFFKIlD5V0r8w7ehbG+FnyrjsqlNLfoaXvyQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar new relic 2&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-new-relic-2-83210f4f79a3a8a8cab0b3ad6b2b4806-e9535.png&quot;
        srcset=&quot;/static/rollbar-new-relic-2-83210f4f79a3a8a8cab0b3ad6b2b4806-d32c5.png 216w,
/static/rollbar-new-relic-2-83210f4f79a3a8a8cab0b3ad6b2b4806-06f31.png 432w,
/static/rollbar-new-relic-2-83210f4f79a3a8a8cab0b3ad6b2b4806-e9535.png 864w,
/static/rollbar-new-relic-2-83210f4f79a3a8a8cab0b3ad6b2b4806-ab1f5.png 1296w,
/static/rollbar-new-relic-2-83210f4f79a3a8a8cab0b3ad6b2b4806-38c32.png 1485w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Workflows, as seen in Rollbar &lt;/p&gt;
&lt;h3 id=&quot;✓--see-who-is-affected-how-many-times-by-what-errors&quot;&gt;&lt;a href=&quot;#%E2%9C%93--see-who-is-affected-how-many-times-by-what-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✓  See who is affected, how many times, by what errors&lt;/h3&gt;
&lt;p&gt;Customer support and operations teams may want to &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/person-tracking/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;know which customers were affected by production issues&lt;/a&gt;&lt;/strong&gt;. This can help them communicate proactively and offer additional support. It also lets them see how many different issues each customer has been impacted by, to get a good idea of the customer’s experience over their lifetime with the company.&lt;/p&gt;
&lt;p&gt;This can also help your product management team prioritize which bugs to fix, either by the number of people affected, or by prioritizing errors that affect high-value customers. It’s better to rely on analytics than on customer support tickets or social media complaints. The data is more complete because only a small percent of customers will complain. Also, support and social media channels create extra delay identifying and fixing the problem. Rollbar will help you find the root cause and fix it proactively before more customers are impacted.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 32.848645076007934%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsSAAALEgHS3X78AAAAhklEQVQY052QywoDIQxF/f8PlaKOGqN5tJY243RVGGjnLMIlcMglznufc35dwiFiKUVErshjjBgjAFiYc/4nh7hhJ2E23yo8f6CZQGTHHJIQK5aYFqVW2/be5zmsd124BKMihVvYtnRog/b5OMeK0sL14zJAa63CB8v2SOw7zPwls6g9WFTfZrKZf4fNw4cAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar new relic 11&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-new-relic-11-183dced83b26a72827a69c6bedf47dd3-e9535.png&quot;
        srcset=&quot;/static/rollbar-new-relic-11-183dced83b26a72827a69c6bedf47dd3-d32c5.png 216w,
/static/rollbar-new-relic-11-183dced83b26a72827a69c6bedf47dd3-06f31.png 432w,
/static/rollbar-new-relic-11-183dced83b26a72827a69c6bedf47dd3-e9535.png 864w,
/static/rollbar-new-relic-11-183dced83b26a72827a69c6bedf47dd3-ab1f5.png 1296w,
/static/rollbar-new-relic-11-183dced83b26a72827a69c6bedf47dd3-8b6cb.png 1513w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
People tracking, as seen in Rollbar &lt;/p&gt;
&lt;h3 id=&quot;✓-custom-error-grouping-rules&quot;&gt;&lt;a href=&quot;#%E2%9C%93-custom-error-grouping-rules&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✓ Custom error grouping rules&lt;/h3&gt;
&lt;p&gt;Grouping allows you to see a summary of the errors in your application instead of being overwhelmed by each individual occurrence. This makes it easier to see when new errors pop up, how often they happen, and when they reactivate after being resolved. Most APM&apos;s have default rules for grouping errors, but they offer you limited flexibility in changing them. This can create problems because if the groups are too coarse-grained, you will lack visibility needed to solve the errors.  Conversely, if they are too fine-grained, you can be overwhelmed with data while lacking insight. Fortunately, Rollbar allows you to customize your grouping rules so they are perfectly tailored for your application’s needs. You can create these custom rules using a simple JSON configuration.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 23.015873015873016%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAAAX0lEQVQY062OQQ6AIAwE+f8f1agNaGitaOG6Kr5A4mF29zRZl3PGnziKhNH32NcViRmHMMysXSjK4JtXJkgx1rbzbBP2S4fBd5DFY5smKBH2EGorzdB7f3nsniil/MYFygqAQFiwR8EAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar custom grouping&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-custom-grouping-17b47a13d5a494cb21d235a2908226ab-e9535.png&quot;
        srcset=&quot;/static/rollbar-custom-grouping-17b47a13d5a494cb21d235a2908226ab-d32c5.png 216w,
/static/rollbar-custom-grouping-17b47a13d5a494cb21d235a2908226ab-06f31.png 432w,
/static/rollbar-custom-grouping-17b47a13d5a494cb21d235a2908226ab-e9535.png 864w,
/static/rollbar-custom-grouping-17b47a13d5a494cb21d235a2908226ab-ac8a4.png 1134w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Custom error grouping rules, as seen in Rollbar &lt;/p&gt;
&lt;p&gt;We both have our unique strengths, which is why we encourage our customers to use both tools together. New Relic is a great infrastructure and performance monitoring solution, which can tell you when and where problems have occurred. Rollbar gives you the extra context to determine why the problem happened, who is affected, and make sure that it’s resolved.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take your application error monitoring a step further. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Security matters: Rollbar now offers advanced encryption at rest]]></title><description><![CDATA[Are your services secure? In today’s world, you can hardly go a week without reading in the news about security breaches, malware, and more…]]></description><link>https://rollbar.com/blog/encryption-at-rest/</link><guid isPermaLink="false">https://rollbar.com/blog/encryption-at-rest/</guid><pubDate>Wed, 19 Jul 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h3 id=&quot;are-your-services-secure&quot;&gt;&lt;a href=&quot;#are-your-services-secure&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Are your services secure?&lt;/h3&gt;
&lt;p&gt;In today’s world, you can hardly go a week without reading in the news about security breaches, malware, and more. We’ve already had headline news this year for &lt;strong&gt;&lt;a href=&quot;http://www.cnn.com/2017/05/14/opinions/wannacrypt-attack-should-make-us-wanna-cry-about-vulnerability-urbelis/index.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Wanna Cry&lt;/a&gt;&lt;/strong&gt;, and now there are dozens of copycat malware programs taking advantage of out-of-date systems. Think of all the services that your company uses from error monitoring to logging and APM. Some of them may be delivered by vendors and others set up by internal teams. Did your IT team evaluate these services to determine how secure they are? If not, you might want to reconsider the services you use or who can best deliver them.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Unfortunately, many companies only do the bare minimum due to time constraints, limited budget, lack of expertise, etc. Real security is hard because threats are constantly evolving, and they target the weakest link across all layers of your organization. Companies make good targets because they concentrate data from potentially billions of customers in one place. Their infrastructure can have millions of lines of code that no one person fully understands. They often rely on a complex and poorly monitored network of third-party service providers, offshore contractors, platforms, modules, etc. These all present opportunities to attack.&lt;/p&gt;
&lt;p&gt;Sophisticated companies evaluate the security of their service providers when making a purchase, and they hold internal services to the same standards. They typically have a checklist of security requirements covering certifications, security audits, data management processes, etc. Companies in the EU or US-regulated industries like finance and healthcare may have additional legal requirements like PCI-DSS and HIPAA. They require their service providers to be complaint, particularly when sensitive customer data is being handled. Even if your company is not regulated in this way, these certifications can signal that a company takes security seriously.&lt;/p&gt;
&lt;h3 id=&quot;rollbars-advanced-encryption-at-rest&quot;&gt;&lt;a href=&quot;#rollbars-advanced-encryption-at-rest&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Rollbar&apos;s advanced encryption at rest&lt;/h3&gt;
&lt;p&gt;Rollbar provides strong security to all our accounts through encrypted data transmission, secure authentication, regular penetration testing, and more. Additionally, we deliver a higher level of security to customers to who sign up for our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/compliance/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Compliant SaaS&lt;/a&gt;&lt;/strong&gt; solution. This solution complies with security and privacy standards like &lt;strong&gt;&lt;a href=&quot;https://www.iso.org/isoiec-27001-information-security.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;ISO 27001&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://cloudsecurityalliance.org/star-registrant/rollbar-inc/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CSA STAR&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://www.privacyshield.gov/participant?id=a2zt0000000TNcNAAW&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;US-EU Privacy Shield&lt;/a&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;a href=&quot;https://www.hhs.gov/hipaa/for-professionals/index.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;HIPAA &lt;/a&gt;&lt;/strong&gt; for healthcare data. Our data center meets the stringent &lt;strong&gt;&lt;a href=&quot;http://www.aicpa.org/InterestAreas/FRC/AssuranceAdvisoryServices/Pages/AICPASOC2Report.aspx&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;SOC 2 Type 2&lt;/a&gt;&lt;/strong&gt; standard, among others. We also implement a number of procedures for risk management and communication with our customers. Compliance is important because you don’t need to take our word for it, we have passed rigorous audits to prove it.&lt;/p&gt;
&lt;p&gt;One key feature that lets us deliver better security is our encryption at rest. This means the data is encrypted when it’s stored inside our data center. Many other services do not offer encryption at rest, and store customer data in plaintext. This allows hackers to download the data if they are able to get access to one of the servers. This is how hackers were able to access millions of customers’ data in the &lt;strong&gt;&lt;a href=&quot;http://www.csoonline.com/article/2130877/data-protection/data-protection-the-15-worst-data-security-breaches-of-the-21st-century.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Sony&lt;/a&gt;&lt;/strong&gt; data breach.&lt;/p&gt;
&lt;p&gt;Some companies often confuse encryption at rest with disk-based encryption. This encrypts the hard disk so that if someone were to physically steal the hard disk they would not be able to access the contents. However, most attacks target computers while they are running and the disks are unlocked. That means malicious code or hackers could gain privileges using a vulnerable service on the computer and then read files in plaintext while the computer is running. Also, a breach could compromise all customers whose data on is on the disk.&lt;/p&gt;
&lt;p&gt;Rollbar goes above and beyond to offer a more advanced form of encryption at rest. We encrypt in the application layer and use unique keys for each customer project. This prevents attackers from reading files in plaintext while the computer is running. It also separates customers and projects to limit the scope of an attack. We encrypt using the AES-256 GCM algorithm, the same one used by Amazon Web Services (AWS). Furthermore, we encrypt our customers’ historical data, in addition to data that’s newly coming in.&lt;/p&gt;
&lt;h3 id=&quot;see-it-in-action&quot;&gt;&lt;a href=&quot;#see-it-in-action&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;See it in action&lt;/h3&gt;
&lt;p&gt;You can see the status of encryption at rest under Account Settings –&gt; Encryption. You can see when the encryption was activated and when the historical data encryption is complete.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Encryption at rest as seen in Rollbar&lt;/p&gt;
&lt;p&gt;Encryption at rest is currently available to customers of our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/compliance/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Compliant SaaS&lt;/a&gt;&lt;/strong&gt; solution. For more information, &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/compliance/#contact-us&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;contact us&lt;/a&gt;&lt;/strong&gt; to talk to a sales representative.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Merging versus Custom Fingerprinting]]></title><description><![CDATA[With the  recent announcement  of support for  manual merging , there are now multiple ways to combine occurrences of errors into a single…]]></description><link>https://rollbar.com/blog/merging-vs-fingerprinting/</link><guid isPermaLink="false">https://rollbar.com/blog/merging-vs-fingerprinting/</guid><pubDate>Fri, 23 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With the &lt;strong&gt;&lt;a href=&quot;/blog/introducing-error-merging-and-unmerging/&quot;&gt;recent announcement&lt;/a&gt;&lt;/strong&gt; of support for &lt;strong&gt;&lt;a href=&quot;/docs/merge-items/&quot;&gt;manual merging&lt;/a&gt;&lt;/strong&gt;, there are now multiple ways to combine occurrences of errors into a single item.  &lt;/p&gt;
&lt;p&gt;Before merging was an option, if the &lt;strong&gt;&lt;a href=&quot;/docs/grouping-algorithm/&quot;&gt;default fingerprinting algorithm&lt;/a&gt;&lt;/strong&gt; didn’t combine occurrences the way you wanted, then you needed to define &lt;strong&gt;&lt;a href=&quot;/docs/custom-grouping&quot;&gt;custom fingerprinting rules&lt;/a&gt;&lt;/strong&gt;.  Custom fingerprinting rules require you to learn our JSON-based rule syntax, and that could be a deterrent against setting them up.&lt;/p&gt;
&lt;p&gt;Now that you can easily merge errors via the UI, is there still value in setting up custom fingerprinting rules?  Absolutely, and this blog post will explain why!&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;rollbars-default-fingerprinting-algorithm&quot;&gt;&lt;a href=&quot;#rollbars-default-fingerprinting-algorithm&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Rollbar’s Default Fingerprinting Algorithm&lt;/h2&gt;
&lt;p&gt;To understand merging vs. custom fingerprinting rules, it helps to first look at how Rollbar combines occurrences of errors.  &lt;/p&gt;
&lt;p&gt;Minus a few tweaks we’ve made over the years to optimize results, our default algorithm works as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Combine the filenames and method names from all of the stack frames&lt;/li&gt;
&lt;li&gt;Append the exception class name&lt;/li&gt;
&lt;li&gt;Take the SHA1 hash of the result&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The resulting SHA1 hash is what we call the ‘fingerprint’ of the error.  All occurrences that have the same fingerprint will be combined into a single item.&lt;/p&gt;
&lt;p&gt;The default behavior can be changed to include the exception message, or any other occurrence data, when calculating the fingerprint too.  This will result in more unique errors in your Rollbar projects, so use it carefully.&lt;/p&gt;
&lt;h2 id=&quot;custom-fingerprinting-rules&quot;&gt;&lt;a href=&quot;#custom-fingerprinting-rules&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Custom Fingerprinting Rules&lt;/h2&gt;
&lt;p&gt;The default fingerprinting algorithm is a good start and may be sufficient for many projects, but often you’ll want to tweak the behavior.  Some of the most common reasons for creating custom fingerprinting rules include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You want to combine all occurrences of a certain exception class into one item, regardless of the stack trace.&lt;/li&gt;
&lt;li&gt;For some (but not all) types of errors, you want to have more unique items created (e.g. include the exception message or the server hostname).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Custom fingerprinting rules allow you to specify precise logic for combining occurrences and generating fingerprints using a JSON-based syntax:&lt;/p&gt;
&lt;p&gt;{% assign body = site.data.docs.custom-grouping.body %}&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-json&quot;&gt;&lt;code&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;condition&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;body.trace.exception.class&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;eq&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;TimeoutError&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;fingerprint&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;timeout-error&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;condition&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;body.trace.exception.class&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;eq&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;IndexError&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;fingerprint&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;index-error-{{body.trace.exception.message}}&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;In the example above, all occurrences of &lt;code&gt;TimeoutError&lt;/code&gt; will be combined into a single item while occurrences of &lt;code&gt;IndexError&lt;/code&gt; will be combined only if they have the same exception message.&lt;/p&gt;
&lt;p&gt;Custom fingerprinting rules allow for very sophisticated fingerprinting behavior, but also require a bit of learning to work with the JSON syntax.  In addition to the learning curve, custom fingerprinting rules have the following limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Custom fingerprinting rules only apply to future occurrences, not those which already exist in your project.&lt;/li&gt;
&lt;li&gt;Once occurrences are combined by a custom fingerprinting rule, they cannot be split into separate items.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;merging&quot;&gt;&lt;a href=&quot;#merging&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Merging&lt;/h2&gt;
&lt;p&gt;If there are errors in your project that were not combined by the default fingerprinting algorithm nor your custom fingerprinting rules, then you can manually merge them together.&lt;/p&gt;

&lt;p&gt;In addition to the simplicity of merging via the UI, it also has the advantage of allowing you to un-merge in case you made a mistake or change your mind about how to organize your errors.&lt;/p&gt;
&lt;p&gt;For more information about merging, check out our &lt;strong&gt;&lt;a href=&quot;../introducing-error-merging-and-unmerging/&quot;&gt;announcement blog post&lt;/a&gt;&lt;/strong&gt; and our &lt;strong&gt;&lt;a href=&quot;/docs/merge-items/&quot;&gt;merging docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;when-to-use-custom-fingerprinting-rules-vs-when-to-merge&quot;&gt;&lt;a href=&quot;#when-to-use-custom-fingerprinting-rules-vs-when-to-merge&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;When to use custom fingerprinting rules vs. when to merge&lt;/h2&gt;
&lt;p&gt;Now that you can merge errors in the UI, why go to the trouble of creating custom fingerprinting rules?&lt;/p&gt;
&lt;p&gt;When errors are merged via the UI, all past and future occurrences that have the same fingerprint as one of the member items will be added to the resulting group item.&lt;/p&gt;
&lt;p&gt;Suppose that you want all occurrences of &lt;code&gt;OperationalError&lt;/code&gt; to be tracked as a single item.  If you just merge all the existing OperationalError items, then any future OperationalError that has a different stack trace is going to be treated as a different error because the default algorithm assigns a different fingerprint, and you’ll need to continually merge every new OperationalError with the old ones.&lt;/p&gt;
&lt;p&gt;If you create a custom merging rule to assign the same fingerprint to all OperationalError occurrences, then you will not have to have to merge any future occurrences because the system will do it automatically.&lt;/p&gt;
&lt;p&gt;Suppose you’ve already got several different OperationalErrors, and you want to track all past and future occurrences as a single item.  The steps to do this are:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Merge all your existing OperationalErrors into one merge item.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Create a custom fingerprinting rule to combine the OperationalErrors and use the fingerprint of the group item (In this case &lt;code&gt;#311&lt;/code&gt;) created in the previous step.&lt;/p&gt;

&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-json&quot;&gt;&lt;code&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;condition&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;body.trace.exception.class&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;eq&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;OperationalError&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;fingerprint&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;group-item-311&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Once this custom fingerprinting rule is saved, every occurrence of an &lt;code&gt;OperationalError&lt;/code&gt; will be added to item &lt;code&gt;#311&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is just one among many use cases that illustrate why custom fingerprinting rules continue to be useful along with merging.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, signup for a 14-day free trial of Rollbar and let us help you take control of your application error monitoring. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Technical details and challenges of building Error Merging]]></title><description><![CDATA[Hopefully you've had the chance to try out our latest feature,  error merging . We've heard a lot of positive feedback from our users. They…]]></description><link>https://rollbar.com/blog/error-merging-technical-details/</link><guid isPermaLink="false">https://rollbar.com/blog/error-merging-technical-details/</guid><pubDate>Mon, 19 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hopefully you&apos;ve had the chance to try out our latest feature, &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/introducing-error-merging-and-unmerging/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;error merging&lt;/a&gt;&lt;/strong&gt;. We&apos;ve heard a lot of positive feedback from our users. They&apos;re especially excited to be able to easily merge and un-merge related errors. We thought it would be useful to share how the Rollbar team made this happen from a technical standpoint. If you&apos;re interested in the nitty-gritty of how we implemented error merging, read on.&lt;/p&gt;
&lt;p&gt;I interviewed &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/meet-the-team-todd/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Todd Dampier&lt;/a&gt;&lt;/strong&gt;, one of the engineers here at Rollbar who was instrumental in making error merging possible, about what was involved in engineering this feature. &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;First, let&apos;s start with why we created error merging in the first place. Our users were asking for the ability to merge (and unmerge) their errors via our UI, as opposed to having to create &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/custom-grouping/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;custom fingerprinting&lt;/a&gt;&lt;/strong&gt; rules. Prior to creating error merging, if you wanted to merge two items together, you created a custom fingerprinting rule, which doesn&apos;t apply retroactively. You also could never unmerge items that had been merged together. As Todd explains it, &quot;custom fingerprinting is extremely static and only applies when the rule is in existence. You can look at an occurrence of an item and extract the fingerprint, and it is always associated with the item. Item merging is very dynamic. You never change the fingerprint of a given occurrence, and that fingerprint could even come from custom fingerprinting. You can change your mind over and over. Merging is a tool for managing complexity. You can take your dashboard from a zillion items to a tenth of that.&quot; &lt;/p&gt;
&lt;p&gt;In order to delve into the details of how our engineering team implemented error merging, let&apos;s define some terminology we&apos;ll be using:&lt;/p&gt;
&lt;p&gt;|-------------------|-------------|
| &lt;em&gt;Occurrence&lt;/em&gt; | An instance of an error item. |
| &lt;em&gt;Native Item&lt;/em&gt; | An aggregation of occurrences that all share a distinct fingerprint. This fingerprint is computed by either custom fingerprint rules or Rollbar&apos;s default fingerprinting algorithm. |
| &lt;em&gt;Group Item&lt;/em&gt; | An item comprising one or more Native Items that have been merged together under user direction. |
| &lt;em&gt;Item&lt;/em&gt; | Either a Native Item or a Group Item. |
| &lt;em&gt;Merge&lt;/em&gt; | The process of creating or altering a group item by adding one or more Native Items to its constituents. |
| &lt;em&gt;Un-merge&lt;/em&gt; | The process of altering (or altogether destroying) a Group Item by removing one or more Native Items from its constituents.|
| &lt;em&gt;Merge Transaction&lt;/em&gt; | A unique identifier created whenever a user merges or un-merges items. |&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;Implementing error merging was tricky, since we needed to be able to merge and un-merge every &lt;code&gt;Group Item&lt;/code&gt; without changing any behaviors of the &lt;code&gt;Native Items&lt;/code&gt;. To do this, the team created dual identities for items: &lt;code&gt;Native Items&lt;/code&gt; and their associated fingerprints, and other aspects that are merged into an umbrella item (the &lt;code&gt;Group Item&lt;/code&gt;). A &lt;code&gt;Group Item&lt;/code&gt;, under the hood, &quot;both is and isn’t an item in its own right,&quot; according to Todd. It is a single point of visibility of the constituent &lt;code&gt;Native Items&lt;/code&gt;, where they can be managed and controlled. All the &lt;code&gt;Native Items&lt;/code&gt; in a &lt;code&gt;Group Item&lt;/code&gt; can become activated, muted, and resolved together. In order to do this, we needed to tease apart every aspect of item behavior and decide whether to approach this in a top-down (the property is defined by the &lt;code&gt;Group Item&lt;/code&gt;) or bottom-up (it is defined by the Native Item) fashion. For example, the team needed to decide if you should be able to search for a Native Item&apos;s original title and find the &lt;code&gt;Group Item&lt;/code&gt; or not (we decided you should). &lt;/p&gt;
&lt;p&gt;The team implemented error merging as a logical view on top of &lt;code&gt;Native Items&lt;/code&gt;. All &lt;code&gt;Native Items&lt;/code&gt; are still captured using the current fingerprinting algorithm, as they were previously.  We now also store a mapping from a &lt;code&gt;Group Item&lt;/code&gt; to each merged Native Item it comprises in our database. This allows constituent &lt;code&gt;Native Items&lt;/code&gt; to be un-merged at any time, and their original item counts will still be accurate. One interesting thing to note about &lt;code&gt;Group Items&lt;/code&gt; is that they can be merged with other &lt;code&gt;Group Items&lt;/code&gt;, yet the data structure we maintain is flat. We discard the intermediate &lt;code&gt;Group Items&lt;/code&gt; in such cases, keeping only the final resulting &lt;code&gt;Group Item&lt;/code&gt;. What this means is if two different &lt;code&gt;Group Items&lt;/code&gt; are merged, the &lt;code&gt;Native Items&lt;/code&gt; forming those two original &lt;code&gt;Group Items&lt;/code&gt; will now constitute one new &lt;code&gt;Group Item&lt;/code&gt;. One of the two previous &lt;code&gt;Group Items&lt;/code&gt; will be &apos;archived&apos; — that is, no longer exist as an active object. &lt;/p&gt;
&lt;p&gt;In order to track these &lt;code&gt;Native Items&lt;/code&gt; to &lt;code&gt;Group Items&lt;/code&gt; mappings, the team created an entirely new table in our database. In this table there is a unique transaction ID associated with every merge and un-merge action, so there is a complete historical record of every merge or un-merge a Native Item undergoes. Since items are the meat of what Rollbar deals with, error merging touches a lot of the tables in our database. We added some new columns into our item table to delineate whether or not a given item is a &lt;code&gt;Group Item&lt;/code&gt; or a Native Item. If a Native Item, the status column notes if the item is active, resolved, muted, or part of a &lt;code&gt;Group Item&lt;/code&gt;. If the Native Item is part of a &lt;code&gt;Group Item&lt;/code&gt;, the status of the item is determined by the status of the &lt;code&gt;Group Item&lt;/code&gt;. When two items are merged, a new &lt;code&gt;Group Item&lt;/code&gt; is created in our item table and the constituent &lt;code&gt;Native Items&lt;/code&gt; are updated (but we do not notify you of a new item according to your New Item notification settings). When we update all the tables that are effected when a &lt;code&gt;Group Item&lt;/code&gt; is created or changed, we lock the &lt;code&gt;Group Items&lt;/code&gt; and &lt;code&gt;Native Items&lt;/code&gt; respectively to isolate the calculation and database updates and avoid race conditions. &lt;/p&gt;
&lt;p&gt;There are top-down properties and bottom-up properties that are associated with an item. Top-down properties of a &lt;code&gt;Group Item&lt;/code&gt; are set on the &lt;code&gt;Group Item&lt;/code&gt; and affect the &lt;code&gt;Native Items&lt;/code&gt; that constitute the &lt;code&gt;Group Item&lt;/code&gt;. These include the level of the item, the status, the assigned user, timestamps denoting when the item&apos;s status was last set to active/muted/resolved, and the users who are subscribed to the item. Bottom-up properties of a &lt;code&gt;Group Item&lt;/code&gt; are determined by the &lt;code&gt;Native Items&lt;/code&gt; in the &lt;code&gt;Group Item&lt;/code&gt;. Some bottom-up properties of a &lt;code&gt;Group Item&lt;/code&gt; include the IDs and timestamps for the first occurrence, last occurrence, and activating occurrence, as well as the total number of occurrences. When a Native Item is un-merged from a &lt;code&gt;Group Item&lt;/code&gt;, all of the properties that were top-down now must be set on the Native Item. This includes users who were subscribed to the &lt;code&gt;Group Item&lt;/code&gt;; all subscribers are thus subscribed to the &lt;code&gt;Native Items&lt;/code&gt; that once constituted the &lt;code&gt;Group Item&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;Let&apos;s walk through what all of this means in practice. What happens when an item hits our pipeline? For any occurrence, we first store it in our database, generate a fingerprint, and find a row associated with that fingerprint in our item table. If it&apos;s an occurrence of an unmerged item, that row correlates to a &lt;code&gt;Native Item&lt;/code&gt;. The code then checks if that &lt;code&gt;Native Item&lt;/code&gt; is associated with a &lt;code&gt;Group Item&lt;/code&gt; or not. Since this is an unmerged item, it isn&apos;t associated, and we continue down our processing pipeline as normal. For an occurrence of a merged item, we will find a reference to a &lt;code&gt;Group Item&lt;/code&gt; ID. We then increment the total occurrences for both the Native and &lt;code&gt;Group Items&lt;/code&gt;, and update other tables as needed. &lt;/p&gt;
&lt;p&gt;While we have been discussing the back end of how error merging works, it&apos;s important to note that implementing the user experience side of this was no easy feat either. We needed to create new views for &lt;code&gt;Group Items&lt;/code&gt;, including all of the associated functionality that a user would expect, such as the ability to comment on the item. Additionally the team implemented restrictions on a user&apos;s ability to edit a &lt;code&gt;Native Item&lt;/code&gt; once it has been merged into a &lt;code&gt;Group Item&lt;/code&gt;. A wide variety of user interface considerations were discussed, including how to delineate visually the difference between a &lt;code&gt;Native Item&lt;/code&gt; and a &lt;code&gt;Group Item&lt;/code&gt; on a user&apos;s items view page. Some new user interface components specific to error merging were created, such as a popup that allows you to toggle between editing and merging items. &lt;/p&gt;
&lt;p&gt;Given how complex implementing all of this was, I asked Todd what his favorite part of working on error merging was. &quot;The relational database aspect of it. You can always go to the database and cut through the layers of code. The database ultimately offered a way out of the stickiest corners of the functionality.&quot;  &lt;/p&gt;
&lt;p&gt;To learn more about how to merge your items, check out the docs &lt;strong&gt;&lt;a href=&quot;/docs/merge-items/&quot;&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, signup for a 14-day free trial of Rollbar and let us help you take control of your application error monitoring. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How Clubhouse uses Rollbar to monitor JavaScript errors]]></title><description><![CDATA[I'm eager to share an insightful interview our friends at Changelog recently did with Andrew Childs, CTO at  Clubhouse  and  Rollbar  power…]]></description><link>https://rollbar.com/blog/how-clubhouse-does-javascript-error-logging-and-monitoring/</link><guid isPermaLink="false">https://rollbar.com/blog/how-clubhouse-does-javascript-error-logging-and-monitoring/</guid><pubDate>Wed, 14 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;m eager to share an insightful interview our friends at Changelog recently did with Andrew Childs, CTO at &lt;strong&gt;&lt;a href=&quot;https://clubhouse.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Clubhouse&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt; power-user. We&apos;re big supporters of the &lt;strong&gt;&lt;a href=&quot;https://changelog.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Changelog&lt;/a&gt;&lt;/strong&gt; podcast and we asked them, to help us produce a handful of interviews with our customers. It&apos;s a fun project that lets us pull back the curtain and learn more about our customers processes for handling errors and deploying code. Read. Listen. Enjoy!&lt;/p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;136&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/328118381%3Fsecret_token%3Ds-tzQAn&amp;amp;color=848484&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&quot;&gt;&lt;/iframe&gt;
&lt;p class=&quot;highlightbox&quot;&gt;
&lt;strong&gt;Featured in this interview:&lt;/strong&gt; Adam Stacoviak, Founder &amp;#x26; Chief Editor at &lt;strong&gt;&lt;a href=&quot;https://changelog.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Changelog&lt;/a&gt;&lt;/strong&gt;, a podcast on software development and open source. Andrew Childs, CTO of &lt;strong&gt;&lt;a href=&quot;https://clubhouse.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Clubhouse&lt;/a&gt;&lt;/strong&gt;, an easy-to-use project management tool for software teams.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; Andrew, let&apos;s start off with you telling me a bit about Clubhouse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; Clubhouse is a software company based in New York, building project management software, specifically for software teams that are looking for something simple and flexible but gives them a little bit more visibility into what the whole team is doing and where the team is going at a high level.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; How important is error tracking to Clubhouse?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; It&apos;s really important, because our software isn&apos;t perfect. You could see if you looked at our Rollbar, we have a constant stream of errors coming in that need to be fixed. People are leaving these windows open for weeks and they&apos;ve got all these third-party extensions loaded, and those extensions are doing things to the page, rewriting things and rewriting stuff on DOM and it&apos;s like you&apos;re in a very hostile environment and you can only do so much to guard against that locally when you&apos;re testing things yourself.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can only do so much to guard against errors locally when you&apos;re testing things yourself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/features/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 55.68000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABrUlEQVQoz61Sy27bMBDU/wP9iJ7ae36gQFGgAYIW6IPNxQEcRLEk0+JTfEre7q5sxwFyzGGwEpcczsyy+fdobj5+6cTNnRSDiuJgkpA6ilqrmKZJ7HY7Rt/3on1qxTAMYhxH7qdchPVJGMReKqG1/tPEEIS1FmKeodSFa0oJjscjY1mWN0E9YwzgpZBz5jPzPC8NLortdgv9t68QcIMPFZLsYVAJpM4w2gwHkyGkmZHLzGRd1wGqBe/95QKsSxNQoZQS1MMGCjZDqpBHyUTKZdCucLVTeaXQGtwzjqxw8gHUqABjWBqUKpAU1GYDcylMWIwC4wuTWKzn7ylW7hOh1ihCKYgxXl+0ElIG4+9fvOim1fIe7RKkWS2TYhcq2/ZI/NQ+v20ZF4RzDtz9d1ZIStK+O2WYWB3lSurOIML2eQc4eSZMqJLso7g1Q/pR4i/fFFHB2TIdJDICTf86QzpDQk7TfbFMhG3bgvz5Awo2yVZSEtWFy5QlT3nN70xMdq8tvyKkhru/5fdkTxn2h4mzIxChRsV1Xi7vU6uXDDMK8c5CKWVpcEofkOjzO+HTfyAmRP65k+HoAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar itemsfeed&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-itemsfeed-6ffab5ff39e1f931735019aaf3d07d13-e9535.png&quot;
        srcset=&quot;/static/rollbar-itemsfeed-6ffab5ff39e1f931735019aaf3d07d13-d32c5.png 216w,
/static/rollbar-itemsfeed-6ffab5ff39e1f931735019aaf3d07d13-06f31.png 432w,
/static/rollbar-itemsfeed-6ffab5ff39e1f931735019aaf3d07d13-e9535.png 864w,
/static/rollbar-itemsfeed-6ffab5ff39e1f931735019aaf3d07d13-cf65f.png 1250w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Live Error Feed as seen in Rollbar &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; What&apos;s your policy on errors? Do you have a no-error policy?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; Not really. The front-end team here is a small team and we don&apos;t have a lot of formal processes in place yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; Does Rollbar help you organize that better then? Since you have a small team, Rollbar&apos;s awesome because it helps you visualize those things and categorize things and keep track of those errors better than maybe having a slightly larger team where you can squash bugs faster?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; Yeah, absolutely. It does a good job of &lt;a href=&quot;/error-tracking/javascript/&quot;&gt;combining similar JavScript errors&lt;/a&gt;. Like, if multiple people are having the same issue, it will combine all those. There&apos;s a good overview of how many people an error is affecting. If it&apos;s just one single who&apos;s on Linux, running an old version of Firefox, then we know; or if it&apos;s something that&apos;s affecting everybody.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/docs/person-tracking/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 48.72%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAAA60lEQVQoz62RS26DMBRFWW2X03m30PUw6yRKCMQEf/EfxM2zGylSqTqhlo7twfN5Hzdskm033FtlbLssyyFCCO+Nnh0KKS/Ytu0QOefPxloLzjmMMTi6qtB7D8ZYJaV8XHi0zV3LbOTwIUJJgXEcIYQADRcxRqo4wfkMS6zrusP7QG8TjNZF9i283h16PuPrfEZ36XChs7TvnEMZxzPwV2ZLhcwR0zTV5FU4Cg+lZvDrCcMwgN1ukFJRVvOnrGBdhDSB4uWrwiKU0kB0J/R9T0JGCRQ0tVF+vtyV0nUEe2HCJH8Iafv4L2hMbw9MxP8ogIACrAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar person&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-person-ad9e79b9f676fb370676026378564dc8-e9535.png&quot;
        srcset=&quot;/static/rollbar-person-ad9e79b9f676fb370676026378564dc8-d32c5.png 216w,
/static/rollbar-person-ad9e79b9f676fb370676026378564dc8-06f31.png 432w,
/static/rollbar-person-ad9e79b9f676fb370676026378564dc8-e9535.png 864w,
/static/rollbar-person-ad9e79b9f676fb370676026378564dc8-cf65f.png 1250w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Person Error Tracking as seen in Rollbar&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; It helps you power test too, I assume, which is important at your stage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; Yeah, absolutely. Whenever we get a new error that comes in, it goes to our Slack channel so we&apos;re notified right away whenever we have a new issue. The page on Rollbar that has the error information is nicely laid out. Since they&apos;ve got source-map support, we can actually see exactly where in the code - even though our code is minified, we can see exactly which line is causing the issue.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Whenever we get a new error that comes in, it goes to our Slack channel so we&apos;re notified right away whenever we have a new issue.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/docs/slack/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 39.45908460471567%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAAA7UlEQVQoz61S7U7DMAzc8/EAPC3vgVDKBH9GvuzJSaukLGDsZCtCE9KQiORec3XP5zi7dV0fEI/meb830zSZnLOZ59nUWk1r7c+x08fTyyO/euDD4Y1DCOycYwDoGCMIFwVHeO/ZS46i5mi+8pfVBfXlWN/ZUeGYK8O8chD0qfa9Fb6eGt+yNsETRLbWnd2MypRSr46InVMMsl+W5QZBhN6GlTYp5e5OXcazW3Wpzi8d6Pf28fm7IBb84VDPiYikSOicFpPhbWcJgJtjGeS1IFX6dkhpE4owhmKt7SJDbHQj/147lCtyV0q5/6/4AlrPWCCfIUR+AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar slack alert error&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-slack-alert-error-5f04e6aabbc469cfef4e7c7012a2ed69-e9535.png&quot;
        srcset=&quot;/static/rollbar-slack-alert-error-5f04e6aabbc469cfef4e7c7012a2ed69-d32c5.png 216w,
/static/rollbar-slack-alert-error-5f04e6aabbc469cfef4e7c7012a2ed69-06f31.png 432w,
/static/rollbar-slack-alert-error-5f04e6aabbc469cfef4e7c7012a2ed69-e9535.png 864w,
/static/rollbar-slack-alert-error-5f04e6aabbc469cfef4e7c7012a2ed69-ab1f5.png 1296w,
/static/rollbar-slack-alert-error-5f04e6aabbc469cfef4e7c7012a2ed69-5b1bd.png 1442w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Rollbar Notifications in Slack (Deploy, New Error, Resolved Error) &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; Does it deminify your code then?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; It does. It&apos;s great! Rollbar&apos;s &lt;strong&gt;&lt;a href=&quot;/docs/source-maps/&quot;&gt;source-map feature&lt;/a&gt;&lt;/strong&gt; takes the minified JavaScript code, it goes line by line and says. Yeah, it basically deminifies the code for really accurate error detection and mapping.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/docs/source-maps/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 37.25099601593625%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAAA6ElEQVQoz62Qy07DMBRE/f8LFvwCS5ZsUdUPCCG0Uk3UEodHUGlJndjxI8/BttQNoqJCXOlIs5mj0SWMZVcPi0UUx3Gg67o/o7W+IcaY6K2UuJg94XLOMF9/4pwbhgFCCDgJxnFEVVWQUuakbduoURrPewm2k3g/KNSNBZcGB0etbCj8hJce6fse1tqc+KlOCumKpTCBo8znth9OCr8ThH6hm4o9b5B/CORbgVe31me2rZ3cYpqms94QhJrzaEcpXpYpaExB7yjS+0dskhTFao16k0Flv8OTBLIocqKEuNZlufoPGs5vvwAJdA78RodwogAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;sourcemap&quot;
        title=&quot;&quot;
        src=&quot;/static/sourcemap-c9f49a5f05d06744554dce7d060a7d31-e9535.png&quot;
        srcset=&quot;/static/sourcemap-c9f49a5f05d06744554dce7d060a7d31-d32c5.png 216w,
/static/sourcemap-c9f49a5f05d06744554dce7d060a7d31-06f31.png 432w,
/static/sourcemap-c9f49a5f05d06744554dce7d060a7d31-e9535.png 864w,
/static/sourcemap-c9f49a5f05d06744554dce7d060a7d31-d2463.png 1004w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Source Maps as seen in Rollbar&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; The help of Rollbar is obviously in tracking errors, wondering what&apos;s going on; having an application that actually works is the entire point, right? So what was the process like for monitoring, tracking, fixing bugs before you started to work with Rollbar? Did you use something else? What were the tools that you might have used?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; We started out using actually Google Analytics to basically track bugs, but Google Analytics isn&apos;t built for error tracking at all, really; it&apos;s built for counting pageviews and unique visitors, conversions and things like that. That didn&apos;t work, so we were looking around, we found a tool called Sentry which did a little bit better. It gave us some stack traces and it gave us a little bit more information, but it was not exactly working very well for us. So we started looking around and we found Rollbar, switched over to that in probably about an hour.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; What were some of the challenges you faced in general and how did it just not work right for you, and ultimately what was the thing that made you feel like &quot;I need to find another solution because this isn&apos;t working&quot;?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; Previous tools provided some information about the exact error that we were getting, but we weren&apos;t able to really drill down and see who it was affecting and how often, and there were just some usability issues around the other products we tried.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; It sounds like there was a lack of visibility to the details. You need access to specifics, &quot;Hey, if you&apos;re gonna tell me my application is broken in this area, then give me on this information. Who else has had this issue? Is this issue reoccurring? What code is tied to it?&quot;, things like that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; Actually I just found the story that I had from November of 2014 to switch over from Sentry to Rollbar. You can basically send anything to Rollbar, you can send arbitrary data, and I think at the time at the other tools where lacking and not as robust.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; Right. So not only just tracking the error, but tracking things like customer name, location in the world, things that matter to you when you track errors. Kind of like customizability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; Yeah, I mean the thing is that we could not only send errors, but also track user interactions and start looking at a specific person to see what chain of interactions lead up to this specific error happening.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; What were some of the challenges you were facing related to error tracking? You said you&apos;ve got a small team, so those are the ones that are kind of tracking errors, it seems, unless I&apos;m wrong. But talk to me about some of the challenges faced in general when trying to track errors and trying to monitor for errors, and ultimately trying to build a better product.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; It&apos;s a small team working on the web app, and on the client-side we don&apos;t have a QA team, so it&apos;s us doing all the QA and all the firefighting when errors happen. There is definitely a tension between having a rigorous integration test suite and having test-run everything, and then on the hand having a barebones integration test suite and the fixing things quickly in production. Obviously, you don&apos;t want errors to be happening all the time, you don&apos;t want errors to be happening... Basically, every error that happens, you lose credibility in the face of your customer, and what Rollbar let us do is to very quickly react when a error actually happens, and keep errors from becoming huge issues for us as a company.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Basically, every error that happens, you lose credibility in the face of your customer, and what Rollbar let us do is to very quickly react when a error actually happens, and keep errors from becoming huge issues for us as a company.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; No matter how good your engineers are, no matter how many cups of coffee you drink that day, no matter how alert you are, you&apos;re gonna have errors. Everyone writes errors, so it&apos;s important to not only find errors and fix them fast, but be able to really understand why the error came about. Can you talk a bit about the Rollbar interface, how you can look at an error, see different customers it might have interacted with, maybe actually unfurl the actual code there - can you talk to me about that piece there?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; Let&apos;s see I&apos;m looking at a specific error - I can see the exact stack trace for that error; because we had source-maps enable, we can see exactly what line caused the issue, not just line 6000, column 20. We can actually look at the stack traced and know exactly what the problem is, which is great. On top of that, we can see who it has affected, how often it&apos;s happened over the last 60 days (which is great) and with any alert we can pass in arbitrary data, so we can pass in basically a list of interactions that lead up to that point in time. User clicked on story, open story, update the owner, and if that was the last thing in the action, then we know it&apos;s possible that it was related to that.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Because we had source-maps enable, we can see exactly what line caused the issue, not just line 6000, column 20. We can actually look at the stack trace and know exactly what the problem is, which is great.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; So it&apos;s definitely given you a trail of breadcrumbs to follow, much better than obviously just knowing an error occurred and the piece of code it touched. You actually have some other information that you&apos;re able to send to Rollbar through the way you interface with it as you see fit. It&apos;s something that is customizable to your needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; Right. And error reporting in JavaScript can be extremely difficult and extremely opaque. You&apos;ll see a lot of random type errors and unknown script errors that if you were just looking at the name that JavaScript gave you, it&apos;s basically useless. And without source-maps enabled, the stack traces also can be useless as well, because it&apos;s just showing you some minified and concatenated file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; You&apos;ve got a small team, right? Speed matters, so being able to reduce the amount of time it takes for you to investigate an error, maybe even fix the error that day and ship out to production and solve the problem once and for all... Talk to me a bit about examples of reduced time and how important that is. Do you have any particular examples where because of Rollbar you were able to track the error and then see the code quickly and fix the error that day, potentially?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; Absolutely. It actually just happened last week, we did a deploy and a couple minutes later everybody got a new alert in Slack, and because we had source-maps enabled, I knew exactly what the problem was and we had it fixed and deployed within five minutes. It&apos;s not like that every time, but it happens often enough that it&apos;s a huge benefit for us.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Last week, we did a deploy and a couple minutes later everybody got a new alert in Slack, and because we had source-maps enabled, I knew exactly what the problem was and we had it fixed and deployed within five minutes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; Talk to me about how important it is to have a tool like that available to you. Like you said, it doesn&apos;t happen every time, but it&apos;s a possibility that it can not only track the error, but it can also give you the insight to be able to use your own brain as an engineer - look at the code, figure it out and actually within five minutes solve a potentially big problem. How important is that to you?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; It&apos;s really important. Actually we not only fix the error, but we can contact the user directly and say, &quot;We noticed that you&apos;re trying to do this one thing... It&apos;s fixed now.&quot; Rollbar lets us be proactive and fix impactful issues that could be a disaster for us in terms of how people perceive us and the quality of our product. It basically guards us against that.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rollbar lets us be proactive and fix impactful issues that could be a disaster for us in terms of how people perceive us and the quality of our product.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; I imagine a small team like your is pretty customer-focused because you&apos;re a startup. You&apos;re obviously counting every user experience you get, wanting that user experience to be positive. How has that specific thing where, since you&apos;re able to send arbitrary data to Rollbar and actually which customer interfaced with this error, had this error, got hit with this error - how has that changed how you interface with customers on a support level, even if they haven&apos;t said, &quot;Hey, I have this error&quot; because Rollbar told you, they didn&apos;t tell you through support, or something like that. How has that changed how you focus on and deliver customer happiness?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; Yes, it can be really difficult to investigate and figure out what is going on on a customer&apos;s screen, and pretty much the first thing that we do is actually going to Rollbar and take a look at the error feed. Since Rollbar lets us drill down and see specific people, we can see what if anything that user&apos;s been doing to kind of give us an idea of what possibly could have gone wrong. So it&apos;s definitely helped with the initial conversation that we have, where we don&apos;t have to say &quot;What browser are you using?&quot; - we know that already. We know exactly what version of the code they&apos;re looking at, which is great, because we can do a deploy, but a user might have that tab open for two weeks and is running two-week-old code.&lt;/p&gt;
&lt;p&gt;I hate to admit how many errors we&apos;ve had to fix, but there&apos;ve been many cases where we&apos;ve been able to fix whatever issue the user reported within minutes, if not before the report of the error, because they were still looking at the old version of the page, so all we had to do was say &quot;Just refresh your page, it&apos;s already been fixed.&quot; Their response is almost always like, &quot;Wow, you guys are amazing.&quot;&lt;/p&gt;
&lt;p&gt;It&apos;s pretty great to be able to take what should be a crappy situation where we have a error and turn it into a success story where the customer is actually really happy about us.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; Now be honest with me... Don&apos;t say this because I&apos;m asking you to, but based on this entire conversation, could you build a successful version of Clubhouse, keep customers happy, do all the things we&apos;ve talked about in this conversation without Rollbar?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew:&lt;/strong&gt; It&apos;s very safe to say that we wouldn&apos;t be where we are right now if we weren&apos;t using Rollbar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; That&apos;s awesome. Thanks so much for your time today, Andrew, I appreciate it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Thank you to Andrew and the team at &lt;strong&gt;&lt;a href=&quot;https://clubhouse.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Clubhouse&lt;/a&gt;&lt;/strong&gt; for sharing this level of insight and for leading by example when it comes to error tracking and working to maintain error-free experiences for their users.&lt;/p&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you
take control of your client-side and server-side application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Turning Errors Into Action: How and Why Resolving Errors Matters]]></title><description><![CDATA[Why resolving errors matters? After fixing a bug, who is responsible for making sure if it really resolves the customer's problem? A lot of…]]></description><link>https://rollbar.com/blog/resolving-errors-faster/</link><guid isPermaLink="false">https://rollbar.com/blog/resolving-errors-faster/</guid><pubDate>Tue, 30 May 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;why-resolving-errors-matters&quot;&gt;&lt;a href=&quot;#why-resolving-errors-matters&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why resolving errors matters?&lt;/h2&gt;
&lt;p&gt;After fixing a bug, who is responsible for making sure if it really resolves the customer&apos;s problem? A lot of companies take a fire-and-forget mentality where the developer makes a code change, and they never think of the problem again until someone complains. Developers often assume that the fix will be deployed with the next release, that the fix will behave the same in production as it does in their development environment, and that it resolves every case uniformly. Only for the most urgent problems will they wait for the fix to hit production and then verify the improvement on the customer&apos;s side. &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Let&apos;s face it, verifying the resolution of issues in production is a chore and takes away from developer productivity. Often, the developer has already moved on to other problems by the time fixes are deployed. In many companies that don&apos;t have continuous deployment, developers have little control over when releases get shipped.  If you&apos;re using an issue tracking system, the developer&apos;s job usually ends when the code is written and merged. Even if developers wanted to go back and verify the fix works, they may not have the proper tracking tools to do so.&lt;/p&gt;
&lt;p&gt;Who is accountable for ensuring that bugs are fixed on the customer side? The support or product management teams will complain if it doesn&apos;t work as expected, but why should they be responsible? They have better things to do than follow up on dozens of bugs that are filed every week.&lt;/p&gt;
&lt;p&gt;You&apos;re forcing customers to report unresolved problems if no one else is checking. This results in more support tickets, bad experiences and lower satisfaction scores, which is only the tip of the iceberg. Only a small percentage will bother filing a support ticket and most suffer in silence. If problems happen consistently, your customers will be less likely to recommend your product to others, and may eventually churn out. While checking costs you time, making your customers do it can cost way more.&lt;/p&gt;
&lt;p&gt;Resolving issues doesn&apos;t have to be painful or take a lot of time. &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt; has created a better way which automatically monitors production code changes and can track each error to resolution. It can save you time and lets you deliver a better customer experience.&lt;/p&gt;
&lt;h2 id=&quot;heres-6-ways-to-quickly-resolve-errors-in-rollbar&quot;&gt;&lt;a href=&quot;#heres-6-ways-to-quickly-resolve-errors-in-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Here&apos;s 6 ways to quickly resolve errors in Rollbar:&lt;/h2&gt;
&lt;h3 id=&quot;1-resolve-errors-and-automatically-track-regressions-in-the-app&quot;&gt;&lt;a href=&quot;#1-resolve-errors-and-automatically-track-regressions-in-the-app&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Resolve errors and automatically track regressions in the app&lt;/h3&gt;
&lt;p&gt;Rollbar allows you to mark errors as resolved several different ways, but the simplest is by clicking the resolve button in the web app. You can see the resolve button in the screenshot below, which is colored green. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The real intelligence behind this feature is that it will continue to track this item in the background to ensure that it is really resolved in production. If this item occurs again, Rollbar will reactivate it and can notify you immediately. errors can become reactivated if you thought you had fixed the error in production, but failed to deploy the change, you missed a use case in your code, or there was a later regression that caused it reactivate.&lt;/p&gt;
&lt;p&gt;The saves your team time because you don&apos;t have to go back and monitor whether your code change really works in production. You just have to deploy it, resolve the item, and trust Rollbar to notify you if the error returns.&lt;/p&gt;
&lt;h3 id=&quot;2-resolve-errors-in-a-code-version&quot;&gt;&lt;a href=&quot;#2-resolve-errors-in-a-code-version&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Resolve errors in a code version&lt;/h3&gt;
&lt;p&gt;What if you&apos;ve made a code change to fix an error, but it hasn&apos;t been rolled out yet? If you resolve that item now, it will just reactivate. Instead, you want to resolve that item when the change is live.&lt;/p&gt;
&lt;p&gt;If your application is a mobile app or single page application, this feature is a must-have because different clients could be running different versions at the same time. Without it, the item will keep getting reactivated when the error happens to users who haven&apos;t updated to the latest version of the app. This also applies to large server-side systems, where it&apos;s common for deployments to gradually roll out across multiple nodes or environments, so you may be running two versions in parallel. &lt;/p&gt;
&lt;p&gt;Rollbar has a little bit of magic that allows you to &lt;a href=&quot;https://rollbar.com/docs/resolved-in-version/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;resolve an error in a code version&lt;/strong&gt;&lt;/a&gt;. It will wait for the fixed version to go live before notifying you again. To use this feature, just enter the version that contains the fix when you resolve an item in the web app. This will prevent the item from becoming reactivated in earlier versions.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Rollbar will know when your fixed version is live by looking at the &lt;code&gt;code_version&lt;/code&gt; parameter that you pass when you set up your notifier. Here is an example of JavaScript code passing the version. It happens to use the SHA from the GitHub commit.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;var _rollbarConfig = {
    # ... other configuration
    payload: {
        environment: &quot;production&quot;,
        version: &quot;3da541559918a808c2402bba5012f6c60b27661c&quot;
    }
};&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;This saves you more time because you don&apos;t have to keep track of when a code change goes live in order to monitor whether it&apos;s been fixed. Rollbar will automatically track these changes and notify you if the error occurs again when the new code version is live.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rollbar.com/docs/resolved-in-version/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;Learn more in the resolve-in-version docs&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;3-resolve-in-a-commit-message&quot;&gt;&lt;a href=&quot;#3-resolve-in-a-commit-message&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Resolve in a commit message&lt;/h3&gt;
&lt;p&gt;An even easier way is to resolve the item &lt;a href=&quot;https://rollbar.com/docs/resolve-via-commits/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;when you commit code&lt;/strong&gt;&lt;/a&gt; that fixes the issue. This way, you don&apos;t have to manually resolve or paste the version number in Rollbar&apos;s webapp. Rollbar  can integrate with your &lt;a href=&quot;https://rollbar.com/docs/resolve-via-commits/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;source control system&lt;/strong&gt;&lt;/a&gt; to get all the commits when you deploy. For example, in your commit message, just add the “resolve” keyword and then paste the link to the item:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;resolve https://Rollbar.com/demo/demo/errors/315/ &lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;When you do a deployment, make a call to Rollbar&apos;s REST API to notify it of the revision that you are deploying. The revision should be the git SHA for the latest commit. Rollbar will get a list of all the commits that have been made prior to your latest revision. It will then resolve any errors that have been referenced in the commit messages. For example, if you deploy using bash scripts, you could add the following commands to notify Rollbar:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;ACCESS_TOKEN=POST_SERVER_ITEM_ACCESS_TOKEN
ENVIRONMENT=production
LOCAL_USERNAME=`whoami`
REVISION=`git log -n 1 --pretty=format:&quot;%H&quot;`

curl https://api.rollbar.com/api/1/deploy/ \
  -F access_token=$ACCESS_TOKEN \
  -F environment=$ENVIRONMENT \
  -F revision=$REVISION \
  -F local_username=$LOCAL_USERNAME&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You only have to set up this bash script once, and from then on, you can easily resolve in commit messages. Similar to resolving errors in the web app, Rollbar will not reactivate errors for clients using an older code version. This way, you know that if an item reactivates in your Rollbar dashboard, it is a real regression and is worthy of your attention.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rollbar.com/docs/resolve-via-commits/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;Learn more in the resolve-via-commit docs&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;4-merge-errors-that-are-duplicates&quot;&gt;&lt;a href=&quot;#4-merge-errors-that-are-duplicates&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Merge errors that are duplicates&lt;/h3&gt;
&lt;p&gt;If an error or item in your item screen is a duplicate of another, you should merge them. You can even merge errors that have different messages but the same root cause. This prevents overload on your dashboard page and alerts. By default, rollbar will automatically merge or group occurrences of errors that have the same fingerprint. You can &lt;a href=&quot;https://rollbar.com/docs/custom-grouping/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;change the algorithm&lt;/strong&gt;&lt;/a&gt; used to group these occurrences. Alternatively, you can manually merge them on the errors screen. Just select the duplicates and then click on the merge button as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rollbar.com/docs/custom-grouping/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;Learn more in the grouping docs&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;5-mute-errors-that-you-can-safely-ignore&quot;&gt;&lt;a href=&quot;#5-mute-errors-that-you-can-safely-ignore&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. Mute errors that you can safely ignore&lt;/h3&gt;
&lt;p&gt;I know what you&apos;re thinking, “It&apos;s great to be notified about errors I care about, but what about all the other noise?” We know you don&apos;t want to be distracted by unimportant information. That&apos;s why we added the ability to mute errors you don&apos;t care about. You can see the mute button in the screenshot above to the right of the resolve button. &lt;/p&gt;
&lt;p&gt;Muting errors will hide them from your dashboard and item view, and Rollbar will not send you notifications.  Furthermore, thanks to our grouping rules you only have to mute one occurrence of an error and all future occurrences will also be muted. Just remember to use this power wisely! People tend to fix what they see, so if you intend to fix it, keep it visible!&lt;/p&gt;
&lt;h3 id=&quot;6-auto-resolve-old-errors-for-a-clean-view&quot;&gt;&lt;a href=&quot;#6-auto-resolve-old-errors-for-a-clean-view&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;6. Auto-resolve old errors for a clean view&lt;/h3&gt;
&lt;p&gt;We always want to prioritize and focus our efforts on the most critical issues. What about all the one-off errors that build up over time? These could be rare edge cases, operational issues that have since gone away, or errors that were fixed but the team forgot to mark them as resolved. We don&apos;t want to distract our team or spend a lot of time clearing them out, so we can ask Rollbar to automatically resolve them.&lt;/p&gt;
&lt;p&gt;Rollbar can automatically resolve errors under two conditions. The first is automatically resolving errors that have not been seen for several days:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The second is automatically resolving errors when a deploy is made. This is useful when you only want to track issues that are happening in your latest production build.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Rollbar still tracks the history of each of these errors so if they come back in the future, you&apos;ll still have a record. This prevents less important errors from distracting your team, so they can focus on the most critical issues.&lt;/p&gt;
&lt;h2 id=&quot;reactivation-notifications-and-dashboard-give-confidence&quot;&gt;&lt;a href=&quot;#reactivation-notifications-and-dashboard-give-confidence&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Reactivation notifications and dashboard give confidence&lt;/h2&gt;
&lt;p&gt;When you resolve an item, you want to have confidence that it is fixed and will not return. Unfortunately, not all of us have psychic abilities to know what problems will happen in the future. Fortunately, Rollbar can monitor each resolved item and notify you if it is reactivated. This saves you a lot of time because you don&apos;t have to go back and check whether the problem is fixed, you can just rely on Rollbar to notify you.&lt;/p&gt;
&lt;p&gt;Rollbar offers &lt;a href=&quot;https://rollbar.com/docs/tools/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;strong&gt;many channels for notification&lt;/strong&gt;&lt;/a&gt; including email, Slack, HipChat, and PagerDuty. Additionally, you can see all the new and reactivated errors on your dashboard. It&apos;s broken down into errors from the last day and the last week. If you just did a deployment earlier today, check the last day category. If you do weekly sprints, you can see errors from the last sprint in the last week category.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;follow-up-with-affected-customers-to-build-trust&quot;&gt;&lt;a href=&quot;#follow-up-with-affected-customers-to-build-trust&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Follow up with affected customers to build trust&lt;/h2&gt;
&lt;p&gt;Following up with customers is probably one of the most valuable and most overlooked parts of resolving problems. It&apos;s particularly important for high-value customers who took the time to report a problem, or for large problems that affect many customers.  Customers understand that companies have problems from time to time, and they are willing to forgive if you show that you listen and take them seriously. Also, if you develop a good relationship where you have an open door, they will be more willing to share feedback because they see a return on the investment of their time, and they may even become an advocate or spokesperson for your product.&lt;/p&gt;
&lt;p&gt;Of course, following up takes time, but it&apos;s much easier now than it used to be. Without Rollbar, you might see a bunch of errors in your logs, or a dip in your New Relic or business metrics dashboard. That&apos;s because the sources don&apos;t record the customer&apos;s information, and may sample the data so you don&apos;t have a complete picture.&lt;/p&gt;
&lt;p&gt;Rollbar gives you a complete record of every customer affected by each error. You can quickly query and export a list of all affected customers, and then copy them into your email automation tool. If it was a particularly disruptive problem, your marketing team can even offer something special to turn it from a negative to a positive experience. You&apos;ll know you did a good job when you see the “thank you” responses come in.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;get-to-rollbar-zero&quot;&gt;&lt;a href=&quot;#get-to-rollbar-zero&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Get to “Rollbar zero”&lt;/h2&gt;
&lt;p&gt;Some of our best customers make it a point to review and resolve all the errors in their Rollbar dashboard on a regular basis. The reason is because when new errors pop up, they want to have instant visibility so they can react quickly and resolve them before more customers are affected. They don&apos;t want to have unimportant errors clogging their view, nor do they want to automatically resolve and potentially miss issues. One customer makes it fun by throwing a “Rollbar party”. They get their developers in a room and knock out errors together. &lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The net is that Rollbar helps you keep your customers and make them happy. You&apos;ll have better visibility into errors affecting customers, and you&apos;ll be able to track that they are actually resolved in production. It also streamlines the workflow for your development team because Rollbar will automatically track resolution without requiring anyone to remember and follow up later. When you mark a critical item resolved in Rollbar, you can trust that it improves customer experience. &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, signup for a 14-day free trial of Rollbar and let us help you take control of impactful production errors. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[New and improved JavaScript notifier SDK - rollbar.js 2.0]]></title><description><![CDATA[We are excited to announce a major update to our  JavaScript notifier SDK in version 2.0 . This new version adds support for isomorphic or…]]></description><link>https://rollbar.com/blog/rollbar-javascript-error-monitoring-update/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-javascript-error-monitoring-update/</guid><pubDate>Sat, 20 May 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are excited to announce a major update to our &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JavaScript notifier SDK in version 2.0&lt;/a&gt;&lt;/strong&gt;. This new version adds support for isomorphic or universal applications, which can run on both the client and the server. It standardizes the configuration and logging across environments, and makes it consistent with notifiers for other languages. Here are the big changes:&lt;/p&gt;
&lt;h3 id=&quot;single-library-for-both-client-and-server-side&quot;&gt;&lt;a href=&quot;#single-library-for-both-client-and-server-side&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Single library for both client and server side&lt;/h3&gt;
&lt;!--more--&gt;
&lt;p&gt;The JavaScript ecosystem has evolved a tremendous amount over the past several years. During that time, server side JavaScript usage has grown to the point where it is quite common to be using JavaScript throughout an application&apos;s stack. Applications now are often designed to run both in the client browser and on the server side using Node. These are commonly referred to as &quot;isomorphic&quot; or &quot;universal&quot; applications. The benefits of isomorphic applications include faster loading times, better support for legacy or mobile browsers, and easier search engine indexing.&lt;/p&gt;
&lt;p&gt;With the line between client and server blurring, it is desirable to have a unified view of exceptions across both environments. To make this possible, we unified the separate notifier libraries so that exceptions are logged uniformly. One require to rule them all.&lt;/p&gt;
&lt;h3 id=&quot;consistent-interface-for-configuration-and-logging-across-multiple-environments&quot;&gt;&lt;a href=&quot;#consistent-interface-for-configuration-and-logging-across-multiple-environments&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Consistent interface for configuration and logging across multiple environments&lt;/h3&gt;
&lt;p&gt;We now offer a consistent interface for configuration and logging for both client and server side. Furthermore, it is consistent with our &lt;strong&gt;&lt;a href=&quot;/docs/notifier/&quot;&gt;notifier libraries for other languages&lt;/a&gt;&lt;/strong&gt;. This will make it much easier for developers since they only need to use one pattern. &lt;/p&gt;
&lt;p&gt;The new way to configure Rollbar is to create a configuration object. Regardless of where you’re running, the schema for the configuration object is exactly the same in both environments. You can choose to initialize Rollbar based on what’s most convenient in your environment. If you’re running within a browser environment, Rollbar can automatically read from the &lt;code&gt;_rollbarConfig&lt;/code&gt; variable on the window when loading.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; _rollbarConfig &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    accessToken&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;POST_CLIENT_ITEM_ACCESS_TOKEN&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    captureUncaught&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    captureUnhandledRejections&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    payload&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        environment&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;production&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Load Rollbar snippet or library&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// log a generic message and send to Rollbar&lt;/span&gt;
rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Hello world!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;If you’re using a module loader or running in a server environment, you can pass this configuration block to the constructor. &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; Rollbar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;rollbar&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; rollbar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  accessToken&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;POST_SERVER_ITEM_ACCESS_TOKEN&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  handleUncaughtExceptions&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  handleUnhandledRejections&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// log a generic message and send to Rollbar&lt;/span&gt;
rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Hello world!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Additionally, we have configuration examples for frameworks like &lt;strong&gt;&lt;a href=&quot;/docs/notifier/rollbar.js/#angular-2&quot;&gt;Angular&lt;/a&gt;&lt;/strong&gt;, Express, Hapi, and more. You can see these examples in the &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.js/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JavaScript SDK documentation&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;multiple-rollbar-instances&quot;&gt;&lt;a href=&quot;#multiple-rollbar-instances&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Multiple Rollbar instances&lt;/h3&gt;
&lt;p&gt;Rollbar is no longer treated as a singleton, but can have multiple instances. The benefit of instances is that you can have different loggers with different configuration options in your application. This is helpful, for example, in pages with components tracked in separate Rollbar projects.  For convenience and backwards compatibility, we still instantiate a &lt;code&gt;window.Rollbar&lt;/code&gt; object.&lt;/p&gt;
&lt;h3 id=&quot;upgrading-from-the-old-node_rollbar-library&quot;&gt;&lt;a href=&quot;#upgrading-from-the-old-node_rollbar-library&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Upgrading from the old &lt;code&gt;node_rollbar&lt;/code&gt; library&lt;/h3&gt;
&lt;p&gt;The upgrade path from &lt;code&gt;node_rollbar&lt;/code&gt; version 0.6.4 to version 2.0.0 of this library is not automatic, but it should be straightforward. While it is backwards compatible, we encourage you to update to the new syntax to take advantage of future functionality. The main changes are to library initialization and usage.&lt;/p&gt;
&lt;p&gt;When you’re initializing the library, we now offer instances with a constructor instead of just a singleton as mentioned previously. Also, when using the library, methods like &lt;code&gt;reportMessage/reportError/…&lt;/code&gt; have been deprecated in favor of &lt;code&gt;log/warning/error/…&lt;/code&gt; These methods are more consistent with our notifier interface in other languages. They can accept a variety of parameters, including strings, errors, callbacks, and more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Old&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; rollbar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rollbar&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;POST_SERVER_ITEM_ACCESS_TOKEN&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reportMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello world!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; Rollbar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rollbar&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; rollbar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  accessToken&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;POST_SERVER_ITEM_ACCESS_TOKEN&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello world!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Additionally, you now enable logging of unhandled exceptions and rejections through the configuration object instead of making a separate method call. More details are available in the &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.js/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JavaScript SDK documentation&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To make the library backwards compatible and make migrating easier, we provided a variety of helper functions. For example, the old style was to always pass the access token as the first parameter. We permit this style for convenience when no other options are necessary, but for new code one should use an object as the only argument. Furthermore, the &lt;code&gt;reportMessage/reportError/…&lt;/code&gt; methods are deprecated, but they are still in the code and just delegate to the &lt;code&gt;log/warning/error/…&lt;/code&gt; methods. We encourage you to update to the newest logging methods.&lt;/p&gt;
&lt;p&gt;If you have any issues or requests, we welcome you to file them in &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;. Since the notifier is open source, we welcome your contributions and help improving the library.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you &lt;strong&gt;[take control of annoying JavaScript errors](/error-tracking/javascript/]&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Instacart, leader in grocery delivery, relies on Rollbar for production error monitoring]]></title><description><![CDATA[Instacart , a leader in the on-demand marketplace, provides one-hour grocery delivery to users of their app and employs thousands of…]]></description><link>https://rollbar.com/blog/how-instacart-does-production-error-monitoring/</link><guid isPermaLink="false">https://rollbar.com/blog/how-instacart-does-production-error-monitoring/</guid><pubDate>Mon, 15 May 2017 00:00:00 GMT</pubDate><content:encoded>&lt;script charset=&quot;ISO-8859-1&quot; src=&quot;//fast.wistia.com/assets/external/E-v1.js&quot; async&gt;
&lt;/script&gt;
&lt;div class=&quot;wistia_responsive_padding&quot; style=&quot;padding:56.25% 0 28px 0;position:relative;&quot;&gt;
&lt;div class=&quot;wistia_responsive_wrapper&quot; style=&quot;height:100%;left:0;position:absolute;top:0;width:100%;&quot;&gt;
&lt;div class=&quot;wistia_embed wistia_async_80ekxe3s7a videoFoam=true&quot; style=&quot;height:100%;width:100%&quot;&gt;&amp;nbsp;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.instacart.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Instacart&lt;/a&gt;&lt;/strong&gt;, a leader in the on-demand marketplace, provides one-hour grocery delivery to users of their app and employs thousands of shoppers across the US to support order fulfillment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Of the one trillion dollar grocery industry, only 1% of market share currently comes from online grocery sales. As Instacart increasingly captures more of this market, they turn to &lt;strong&gt;&lt;a href=&quot;https://rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt; for continuous monitoring of their service’s health.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With a promise of one-hour delivery, and a shopper workforce relying on their apps, Instacart’s services must be up at all times. Rollbar’s proactive alerting and granular error forensics facilitates the continuous integration and deployment pipeline at the heart of Instacart’s service.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Rollbar allows us to go from alerting to impact analysis and resolution in a matter of minutes. It&apos;s fully ingrained into our development cycle and monitoring. Without it we would be flying blind. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.linkedin.com/in/arnaudferreri/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Arnaud Ferreri&lt;/a&gt;&lt;/strong&gt;, Engineering Lead for the Consumer Team at Instacart.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h3 id=&quot;the-challenge&quot;&gt;&lt;a href=&quot;#the-challenge&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Challenge&lt;/h3&gt;
&lt;p&gt;While many industries have worked out how to participate in the on-demand marketplace, the one trillion dollar grocery industry is one of the last holdouts. Tight margins may be making some investors skittish. Retraining customer perception about grocery quality and freshness with app-ordered deliveries might be at play. Building and scaling the technology layer that acts as the on-demand engine has been a daunting challenge. It’s this last barrier to entry that Instacart has already dismantled.&lt;/p&gt;
&lt;p&gt;Since its inception in 2012, Instacart has been wooing grocery shoppers away from retail spaces and onto smartphones, to place grocery orders through their app. Instacart currently has presences in about 26 markets, partnering with large chains such as Whole Foods, Costco, and Safeway to offer users of the app in-store prices on groceries. The only extra cost to the app user is a simple delivery charge. The big selling point though is the promise of one-hour delivery. Instacart employs thousands of shoppers across the U.S. to fulfill orders, and processes upwards of 20,000 requests per minute.&lt;/p&gt;
&lt;p&gt;At this magnitude and pace, Instacart finds itself publishing new code releases around 30 times a day. Tests happen along several layers and stages in the production process before release but the final and most important test is “actually having real customers use our product and use our API endpoints,” says &lt;strong&gt;&lt;a href=&quot;https://www.linkedin.com/in/arnaudferreri/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Arnaud Ferreri&lt;/a&gt;&lt;/strong&gt;, Engineering Lead for the Consumer Team at Instacart. “At our stage, if anything goes wrong, we have to be alerted very, very quickly, and that’s what Rollbar has solved for us.”&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At our stage, if anything goes wrong, we have to be alerted very, very quickly, and that’s what Rollbar has solved for us.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;the-solution&quot;&gt;&lt;a href=&quot;#the-solution&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Solution&lt;/h3&gt;
&lt;p&gt;At its current scale (and still scaling), Instacart does a lot of meta level monitoring. They are hosted by &lt;strong&gt;&lt;a href=&quot;https://aws.amazon.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;AWS&lt;/a&gt;&lt;/strong&gt; so they use &lt;strong&gt;&lt;a href=&quot;https://aws.amazon.com/cloudwatch/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CloudWatch&lt;/a&gt;&lt;/strong&gt;; they view full logs in &lt;strong&gt;&lt;a href=&quot;https://papertrailapp.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;PaperTrail&lt;/a&gt;&lt;/strong&gt;; they run build tests on their staging servers through &lt;strong&gt;&lt;a href=&quot;https://circleci.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CircleCI&lt;/a&gt;&lt;/strong&gt;; and they use &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/vs/new-relic/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;New Relic&lt;/a&gt;&lt;/strong&gt; to track performance. But for proactive alerting and for granularity on error forensics, they turn to &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/features&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;“The fact that you get the exact stack trace that links into your code base; the fact that you have all parameters of a given request so you can easily reproduce the issue; the fact that you have information about the customer who triggered the error so you can easily see if it’s the same customer repeating the same error again… All of these make it very easy to understand the scale and complexity of a given problem at a given time,” says Arnaud.&lt;/p&gt;
&lt;p&gt;Growing along with the popularity of the app, the Instacart engineering team has scaled pretty rapidly over the past two years, going from five engineers to 70. Working in &lt;strong&gt;&lt;a href=&quot;/docs/notifier/rollbar-gem/&quot;&gt;Rails&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;/docs/notifier/rollbar.js/&quot;&gt;JavaScript&lt;/a&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;a href=&quot;/docs/notifier/pyrollbar/&quot;&gt;Python&lt;/a&gt;&lt;/strong&gt;, the team has appreciated the way Rollbar integrates seamlessly with these languages, as well as with other tools they use such as &lt;strong&gt;&lt;a href=&quot;/docs/github/&quot;&gt;Github&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;/docs/pagerduty/&quot;&gt;PagerDuty&lt;/a&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;a href=&quot;/docs/slack/&quot;&gt;Slack&lt;/a&gt;&lt;/strong&gt;. At this point they are in a continuous deployment cycle for a lot of their services, with any new commits in their code base going live to production. “Because of that, we can’t have engineers looking at production every minute to see if everything is going right. We need to be proactively alerted when something goes wrong,” says Arnaud.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We can’t have engineers looking at production every minute to see if everything is going right. We need to be proactively alerted when something goes wrong.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Instacart engineers work in their own branches, and those branches get merged back to the master project. With each merge a new build release gets pushed to their staging servers, then to their beta servers and finally the release hits production. At all stages of this process, the team gets pinged proactively by Rollbar about any new errors that come in.&lt;/p&gt;
&lt;p&gt;For a time, the Instacart engineering teams adopted an ambitious, power user goal called ‘&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/features&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar Zero&lt;/a&gt;&lt;/strong&gt;’, shooting for zero Rollbar errors at any given time on any open project. As Arnaud explains it, this involved getting to “a level of health that we were not seeing errors that we were unaware of, or that we were able to control.&quot; This exercise not only boosted coding performance but also helped to brilliantly clarify workflows for the teams.&lt;/p&gt;
&lt;p&gt;For Instacart, power usage of Rollbar isn’t limited to their consumer app. Since thousands of shoppers across the U.S. rely on their shopper apps for work, Instacart carefully goes with staged releases of these apps. First they release to a subset of beta shoppers, then to one city, then more cities, until finally they release across the board. The engineering teams have recently added Rollbar into these shopper apps to get the same centralized information they utilize for their web projects.&lt;/p&gt;
&lt;h3 id=&quot;the-results&quot;&gt;&lt;a href=&quot;#the-results&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Results&lt;/h3&gt;
&lt;p&gt;It’s an exciting time for the grocery industry, and Instacart is poised to change grocery shopping habits permanently. Of course, none of this would be possible without the continuous integration and deployment pipeline driving Instacart’s code ever forward. “The fact that we’re ramping up continuous deployment for a lot of our services - I think that’s only doable because we have Rollbar integrated into our alerting system,” says Arnaud. &lt;/p&gt;
&lt;p&gt;Since code errors can potentially affect thousands of real customers and working shoppers, the ability for Instacart to prioritize error resolution according to the size of the problem is vital. “We’re using Rollbar to its maximum to make sure that we get alerted for the right reasons, and that we alert the right people for the right severity of problem,” says Arnaud. One designated person is pinged if a new error pops up, whereas, if a known error is happening multiple times a minute, a team gets pinged. So instant reaction to issues is guaranteed, in proportion to the size of the issue.&lt;/p&gt;
&lt;p&gt;Arnaud says that Rollbar has helped his engineering teams “dramatically improve the way we do our detective work, understanding when there’s an actual issue, where it’s coming from, at what volume, how many customers it’s affecting, and what action needs to be taken.” Without Rollbar, they wouldn’t be able to solve issues as quickly as they need to since they depend on the fine, granular context on errors that Rollbar provides.&lt;/p&gt;
&lt;p&gt;Rollbar is so ingrained into Instacart’s development cycle that Arnaud admits he and his team don’t even see it as a third-party tool: “Rollbar’s so tightly coupled into the way we work, it seems part of our system as a whole.”&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rollbar’s so tightly coupled into the way we work, it seems part of our system as a whole.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Thank you to Arnuad and the team at &lt;strong&gt;&lt;a href=&quot;https://www.instacart.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Instacart&lt;/a&gt;&lt;/strong&gt; for sharing this level of insight and for leading by example when it comes to continuous delivery and working to maintain error-free experiences for their users.&lt;/p&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you
take control of your application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Improved PHP error reporting with our latest rollbar-php 1.0 updates]]></title><description><![CDATA[We are excited to announce a significant upgrade to our  PHP notifier SDK . This new version will make it much easier for customers to…]]></description><link>https://rollbar.com/blog/rollbar-php-update/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-php-update/</guid><pubDate>Thu, 04 May 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are excited to announce a significant upgrade to our &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar-php&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;PHP notifier SDK&lt;/a&gt;&lt;/strong&gt;. This new version will make it much easier for customers to integrate their PHP apps with Rollbar. It uses the latest standards like &lt;strong&gt;&lt;a href=&quot;https://getcomposer.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Composer&lt;/a&gt;&lt;/strong&gt;, proper namespaces, and is more reliable. Here are some of the highlights:&lt;/p&gt;
&lt;!--more--&gt;
&lt;h3 id=&quot;our-first-major-10-release&quot;&gt;&lt;a href=&quot;#our-first-major-10-release&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Our first major 1.0 release&lt;/h3&gt;
&lt;p&gt;This major release of our PHP SDK represents a significant update in architecture, style, and quality for our PHP notifier. In addition, many outstanding issues were fixed so 1.0 is more reliable and better tested than our prior versions.&lt;/p&gt;
&lt;p&gt;Our prior version, 0.18.2, was written in an old style of PHP with most of the code living in a single file. This was due to our desire to support the oldest version of PHP possible. Due to the changing landscape over the past couple years, it became reasonable to drop support for PHP 5.2 and this opened the door for many language features which benefit both our code and yours.&lt;/p&gt;
&lt;p&gt;While the interface has undergone a redesign, it is still backward compatible with 0.18.2 via convenience functions.&lt;/p&gt;
&lt;h3 id=&quot;support-for-composer&quot;&gt;&lt;a href=&quot;#support-for-composer&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Support for Composer&lt;/h3&gt;
&lt;p&gt;Our SDK is now properly supportive of composer which has become the de facto dependency management tool in PHP. Just add the following configuration to your composer.json file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-php&quot;&gt;&lt;code&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;require&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;rollbar/rollbar&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;~1.0&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h3 id=&quot;standardized-namespace&quot;&gt;&lt;a href=&quot;#standardized-namespace&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Standardized namespace&lt;/h3&gt;
&lt;p&gt;We are now using PHP namespaces, a feature introduced in 5.3. At the top of your file, you can delete &lt;code&gt;require_once &apos;rollbar.php&apos;;&lt;/code&gt; and instead add the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-php&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token package&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Rollbar&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h3 id=&quot;standardized-logging-method&quot;&gt;&lt;a href=&quot;#standardized-logging-method&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Standardized logging method&lt;/h3&gt;
&lt;p&gt;You can now call a single &lt;code&gt;log&lt;/code&gt; method with the ability to set the level and include all of the same data as before, instead of different method calls for &lt;code&gt;report_exception&lt;/code&gt;, &lt;code&gt;report_message&lt;/code&gt;, etc. This makes it consistent with our notifier libraries for other popular languages. &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-php&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token package&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Rollbar&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Payload&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Level&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Message at level &apos;info&apos;&lt;/span&gt;
Rollbar&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Level&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;testing info level&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Current users of the PHP notifier can quickly update to the new version because it’s backwards compatible. Just remove the old PHP notifier file, and add the new dependency in composer. While it is optional, we do recommend that you use the new logging interface, since it lays the groundwork for future improvements.&lt;/p&gt;
&lt;p&gt;If you previously tried our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar-php/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;PHP error tracking&lt;/a&gt;&lt;/strong&gt; library, but found it difficult to use, give the new one a try since it is much easier to set up and is more reliable.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your PHP errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the Rollbar Team - Todd Dampier]]></title><description><![CDATA[Meet  Todd Dampier , another member of the Rollbar team! Todd started in late 2016 and we are more than thrilled to have him. Todd came from…]]></description><link>https://rollbar.com/blog/meet-the-team-todd/</link><guid isPermaLink="false">https://rollbar.com/blog/meet-the-team-todd/</guid><pubDate>Mon, 01 May 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Meet &lt;strong&gt;&lt;a href=&quot;https://github.com/dampier&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Todd Dampier&lt;/a&gt;&lt;/strong&gt;, another member of the Rollbar team! Todd started in late 2016 and we are more than thrilled to have him. Todd came from &lt;strong&gt;&lt;a href=&quot;https://mlab.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;mLab&lt;/a&gt;&lt;/strong&gt; where he was the founding CTO and has years of experience in his field as a Software Architect and CTO. Todd spent time at MIT, where he completed his undergrad and Masters in Computer Science.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 256px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsSAAALEgHS3X78AAAEz0lEQVQ4ywHEBDv7AMR8UMV9U8V9V8mBV8yEW9OJXdWLXdqPZd+TZ92SZdqPZdeMYOCTYuiaaemaauydaPGicO6hbu+icOeccQC1gW+2gG+5gG63eWm0dV2zblWza1CvZUaiXkCTXEaHV0h6RDCiXzvPfk3ZhE/ei1ThjFXmkFbnkVjmjlUAvI6AwJGDu4p7v418w5F/wo59om9gbjosajcriFlPmnJrpn5whllJnGJK1Ixk3pVm3JFk2Y5f2Y5e3ZJiALuNgbSKg7uRib+VkMCXkaJ3cXhPRlQmHKB0b/rUzf7e1vze0dSqmqdvV6xsTNeOZOSXaeKTZOeXZ+qbaACxeF+DU1CveWfAkH+2inxxT0lzTUSRZVjjvrj829P95uH96+D/9OPZrI+VWD+4dVLglWzimG/kl2zjlGgAsX9qiVpXs3plw4xxn29eUDIvclZRtpmU+tfQ/eDa/+vm/u/l++7g//rhvI95pGZK1pR33pd54Zx845x4ALR3ZLBrVq5sWLx8YW5BMSQKCmRIRM+1sO7Qyu/Nxvjc0//u5P7x5P/v2O3Ms71+YteTeOWdfOuoiPCtiwCzaE21aE3AcVOuZkw8GhYOAAJsTkrRt7LIp6DFlIHXppT72szpw7DuxK3ktZnCelTZhlrnlWjok2XsmWsAxo1wyo9zzJB1uHpjaj45Wj9DmoF/3sK70ame2KmZ1q6k787D36OR6a+W2aSJyHpW5Yte6ZBh545f549eAMeNdcqPeMuOd8+QecqRgrGTlbKbmuvPyfrW0PPPzOrMzPfe2v3e0f/iy+e7n9qOcOubdvOkfPSiefWmfgDFk4XJlYbMlYPOlIHPmYe8m5ivmJfkwb7/2db82NPktbTvxb//6tf/9+Huw6jtpITxpILzo3/5qIH7r4cAtYN3wJCGypiK0JyN0JmJrIB5nYaI3bm188fB8c/Lx6GczJJ/+c23//bg8sGj66GC7KWJ8aWC9amC+KuEALiNfr+TisebksuakNGcka6AeIFoZ82sqM2knLiQicybl9qcjOOkjfrRuPCzjtqTddmYgu6tk++ojPOohQCzeGm3d2m7emy6d2m+em61dWmSamWihIO+nJO4kYreqKX4vrTts5zlponklGjaiV7ek27sonvxpHz0pXcAu4V2voZ2xIl6w4l7w4d6xIl7tIyEknNxn4GAsZaTvJaPzJqL36eP2JBw3Yxm6Zlx8KF586R79KZ99ql8AL2NgsWXhsuZh8ycitKhjcuZibuZlrCPiIxqaaCKj76em8qXi+Wvl9uXcduOZ+qhffCoh/ati/mxjPqxigCvfWy2hYOocHybX3eCPmeAQGa9n6DPrqezioS5jX7SoIvqrZLywKHMiG/VhmTnnnfvpoLyqIbxp4P3rokAdytaaBtaYRFYYRJcVQhTVhBXpXmS48S4zKWe26qX97SU/8Cc+NGwtnV8pk9kr11sz4N5+bKO/7mR/LaRAGkRVl8JUFUATFoJWlsOWksFT3I1Yeaztue7sOW3p+69qfTHst6+ta5tgoktYHwlX3YdWIUvXrFhdfCokAB2IF9sFVdiDVVgEl1lGGFcEFtVFVC2ipr42c/jyMHGlqayZ46tWnqJMFmCKGGILmlkC05vE1hiBk+SO2r26dPL+/WKBQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;todd&quot;
        title=&quot;&quot;
        src=&quot;/static/todd-757a0822c02de634aa0af6db65fd65b3-79114.png&quot;
        srcset=&quot;/static/todd-757a0822c02de634aa0af6db65fd65b3-6f878.png 216w,
/static/todd-757a0822c02de634aa0af6db65fd65b3-79114.png 256w&quot;
        sizes=&quot;(max-width: 256px) 100vw, 256px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;I asked Todd about his thoughts on Rollbar and joining the team. Here are his answers in his own words.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What excited you about Rollbar or attracted you to the company?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When I started looking for what to do next professionally, I cast a fairly broad net.  As a generalist with highly eclectic interests, the only thing I knew for certain was that I was done for a while with the field of MongoDB-as-a-Service.&lt;/p&gt;
&lt;p&gt;From my very first conversation with Rollbar, what struck me most was the caliber of the people.  The recruiting team was flawlessly professional, direct, and no-nonsense, as well as remarkably warm and personable.  Cory and Brian impressed me as founders: their maturity, experience, technical depth, and product perspective gave me tremendous confidence in Rollbar as a team and as a business.  As I met more of the team, that confidence just grew — and I’m happy to say the trend continues unabated today.&lt;/p&gt;
&lt;p&gt;I also love the product.  Coming from mLab, I’m a staunch believer in the value of farming out an annoying-but-necessary piece of functionality to a service backed by people who focus on that problem and do it right.  &lt;/p&gt;
&lt;p&gt;And as a technologist, I enjoy building and delivering services that I would want to use myself.  It&apos;s a special kind of satisfaction that comes with developing products for other developers.  &lt;/p&gt;
&lt;p&gt;At Rollbar, we get to make the error tracking platform that we would — and do! — trust to monitor our own software.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What are you looking forward to working on (technically)?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Even in a seemingly simple service, there are myriad details to consider.  There&apos;s always more to do, and you can always do it better.  &lt;/p&gt;
&lt;p&gt;I’m looking forward to working on features that make our toolset more valuable to our users — ones that afford greater utility and less friction when brought to bear on the problems our users are tackling.&lt;/p&gt;
&lt;p&gt;Building a public service instead of an in-house solution tends to take all the technical design questions to the next level — such as scale, availability, reliability, and security, to name a few.  I’m looking forward to working on these back-end issues as well, to making our service as robust and maintainable as we possibly can.  Most immediately, we’re taking a thorough look at security throughout our platform.  I’m also looking forward to some retooling we’ve been contemplating in our event-processing pipeline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How would you describe the culture?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It probably sounds corny, but I&apos;ve found Rollbar to be full of real, genuinely good people. From the top down, the culture is one of hard work, intellectual honesty, and doing the right thing for the customer — all of which you might reasonably expect in a well run business.  More unusual, I think, is the high degree of mutual respect and human decency that permeates the organization.  People seem to feel safe speaking their minds and appropriately prioritizing their personal lives &amp;#x26; families, while still showing up and delivering what the organization needs.  This comfortable pragmatism dovetails beautifully with a team that is geographically distributed, too:  open and honest communication that’s as synchronous or asynchronous as it needs to be.  People here have healthy sense of humor as well, which is crucial.  Personally, I’m really happy and honored to be part of this team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What&apos;s your vision for your contribution to Rollbar? What would you hope to achieve in the next 6 months?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To summarize what I said above, it basically boils down to some stuff you can see and some stuff you can’t see (unless we mess it up).  At a high level, my vision is simply to make sure Rollbar is hands-down the best service in its category.&lt;/p&gt;
&lt;p&gt;The value of a system that monitors, collects, and tracks errors is obvious to anyone who’s built a distributed software deployment.  &lt;/p&gt;
&lt;p&gt;There’s no rational reason, however, why you should need to develop your own error monitoring system — and if you feel like you want to anyway, you should probably come work at Rollbar!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun fact about yourself that you&apos;re willing to share?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Believe it or not, I didn’t always think computers were going to be the way I made my living. &lt;/p&gt;
&lt;p&gt;My seventh grade class did a career unit, and one component of it was to pick an adult who possessed one of these “career” things and then follow him or her around for a day to see what having a career was all about.  I hardly knew where to start.&lt;/p&gt;
&lt;p&gt;When I was little, I’d spent a lot of time around judges.  They were pretty cool people, and their job seemed kind of cool, too.  So I wrote a letter to the Chief Justice of the Supreme Court of the United States, asking if he would help me with this “career” exercise.  Someone on his staff wrote me a very polite reply, explaining that Chief Justice Burger was much too busy to have a random middle schooler underfoot all day.  I was crushed!  But that disappointment just served to strengthen my bond with my Apple //e.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;We are excited that Todd took an interest in Rollbar and that he decided to join us to help on our mission of making developing software easy!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introducing hassle-free, compliant SaaS error monitoring]]></title><description><![CDATA[I'm very excited to announce that today, Rollbar is launching the first and only  compliant SaaS error monitoring solution  on the market…]]></description><link>https://rollbar.com/blog/introducing-compliant-saas-error-monitoring/</link><guid isPermaLink="false">https://rollbar.com/blog/introducing-compliant-saas-error-monitoring/</guid><pubDate>Wed, 26 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;m very excited to announce that today, Rollbar is launching the first and only &lt;strong&gt;&lt;a href=&quot;/compliance/&quot;&gt;compliant SaaS error monitoring solution&lt;/a&gt;&lt;/strong&gt; on the market. Our compliant solution meets the standards of HIPAA and ISO 27001, thanks to our team&apos;s hard work over the past 6+ months on our infrastructure, application, and policies.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;From the early days of Rollbar, I&apos;ve been motivated to help developers build better software, faster, because I believe that empowering software developers is one of the most impactful (if not always visible) ways to improve all of our lives. We&apos;ve seen customers use Rollbar to build and maintain just about everything you can imagine, from consumer apps to enterprise, healthcare, government, scientific research, and beyond. As we&apos;ve found our way into applications that power more and more critical functions of modern society (like healthcare and finance), we realized that we would need to be able to meet those organizations&apos; security and compliance requirements--somehow.&lt;/p&gt;
&lt;p&gt;Our first iteration was Rollbar On-Premises (which we do still offer)--passing the compliance burden off to customers--and a handful of eager customers signed on. Over time, however, we learned that not only is it difficult for &lt;em&gt;us&lt;/em&gt; to maintain and support a self-hosted product, it&apos;s a huge pain for &lt;em&gt;customers&lt;/em&gt;, too. Forgive me for quoting a competitor who seems to be learning the same thing:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 652px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 55.061349693251536%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABVklEQVQoz61SwUrDQBDtF/pVUujNkx48elNB9NCb4EWo6EGoVqQBaU3bdJNNNslu0t20ec6uNu1FpMWFxw5vZh5vZ7bled4BY6z9HwiC4LAVRdHxmAk8X1/g/WOMfv8FQ8/DYDCA1hq7nCUdJ/jmz3HUaePV5+BJirquG+wluFgswHmMNE0hxDeyLEecJIg4d3xCsRDC5eaMQUrp+Dgmnu6yLDeC9mmzIEAYhqBZYDqdutg2fvo+cSFxM1djOd+fkAHe1EYRhzFmI2jVJ5SwDeukda2UcrBubI3liqJoYDl7r2fdCFqBLM+pUSGne3uGu6ARjGODNJeoqiVGI4XVauUKupfnoG8FoyR6vXtc3XRxdnqCp4ceHu9uyWHxy1LIMk+EE7VbTtIM2lT7O9T0ZK2Nc5bLAqaqaI4VpCp3+jpOkLbUocGyNWgBTP3EtBC2nfsL1Dv7AhPuPF9m65EVAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;tweet&quot;
        title=&quot;&quot;
        src=&quot;/static/tweet-3193f521173bf16d0f1083e9ba604fe6-9999a.png&quot;
        srcset=&quot;/static/tweet-3193f521173bf16d0f1083e9ba604fe6-702f2.png 216w,
/static/tweet-3193f521173bf16d0f1083e9ba604fe6-d925e.png 432w,
/static/tweet-3193f521173bf16d0f1083e9ba604fe6-9999a.png 652w&quot;
        sizes=&quot;(max-width: 652px) 100vw, 652px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;We went back to the drawing board to ask: why do customers need to self-host? And we realized that in almost all cases, they didn&apos;t. What compliance-conscious customers need is compliance, and compliant SaaS can be done.&lt;/p&gt;
&lt;p&gt;The solution we&apos;re announcing today is for every developer who wants to build great software inside an organization that needs strong security or compliance guarantees [1]. If you&apos;re in healthcare, we can sign BAAs; if you&apos;re a large enterprise, we can go through your security review; if you have specialized needs, we&apos;re interested--and you can focus on shipping code, not worrying about how to monitor your error monitoring service.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 49.50065132435954%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABOUlEQVQoz62STU/CUBBF+TEq4FcUUYwrrcatiBJQMG5E4tYggiLiQqtLf6AxRgOUfr1W2tLVdfrEhKYomrg4mUzy5uTO5IVc10Wv1xtJ6vQRq0e3Iwl5j+1mG45l/ShcObzBWLaE8WQJE1tn38KFXU2HbduwSMor4ThOQBhJlzGZqhDniG5/Eh4m1HQDGjOg6gyKxqASth0UxvauEMvWEN+vY57qAvUzu9Wg0CCBpGhg5jsfZqoOuc+gcDZzgaX8NRcl8g0sHzQwtVMJChVJwfNrC5Ks8pU7bRlPL028tWR0+7f1hPF8HRvFe6wXRWyePGAuczn8hiat66X5WtOgvkOJdWb6Ek6nqzzhYq7Oa4KI0j0Dwt/Ab5irQTgWIRTusEZ4SYWC6Fv7T0JvIJIsI0xEBvAl/O+P/QGFHk2w+V7QYwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;compliance burden&quot;
        title=&quot;&quot;
        src=&quot;/static/compliance-burden-de1a6fa0e30d2d1d09a9b64325b8f0e5-e9535.png&quot;
        srcset=&quot;/static/compliance-burden-de1a6fa0e30d2d1d09a9b64325b8f0e5-d32c5.png 216w,
/static/compliance-burden-de1a6fa0e30d2d1d09a9b64325b8f0e5-06f31.png 432w,
/static/compliance-burden-de1a6fa0e30d2d1d09a9b64325b8f0e5-e9535.png 864w,
/static/compliance-burden-de1a6fa0e30d2d1d09a9b64325b8f0e5-ab1f5.png 1296w,
/static/compliance-burden-de1a6fa0e30d2d1d09a9b64325b8f0e5-7539a.png 1728w,
/static/compliance-burden-de1a6fa0e30d2d1d09a9b64325b8f0e5-23a27.png 2303w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Get in touch and we&apos;d love to help you start running Rollbar on your whole stack. You can also learn more by reading the &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/compliance/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Compliance Overview&lt;/a&gt;&lt;/strong&gt; and our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/security/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Security and Compliance&lt;/a&gt;&lt;/strong&gt; docs.&lt;/p&gt;
&lt;p&gt;[1] Rollbar&apos;s compliant SaaS solution meets the standards of &lt;strong&gt;HIPAA&lt;/strong&gt; and &lt;strong&gt;ISO 27001&lt;/strong&gt;. Our facility and operational controls have been evaluated by independent third parties and comply with &lt;strong&gt;&lt;a href=&quot;&quot;&gt;AICPA SOC 2 Type 2&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;/compliance/&quot;&gt;EU-US Privacy Shield&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;/compliance/&quot;&gt;CSA STAR&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Security and Compliance Needs?&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;[Contact us](&lt;a href=&quot;mailto:sales@rollbar.com?subject=Requesting&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;sales@rollbar.com?subject=Requesting&lt;/a&gt; more info)&lt;/strong&gt; for more information regarding our secure, compliant error monitoring solutions. Also, If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of distracting application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Major JavaScript source map updates]]></title><description><![CDATA[We’re excited to introduce a major update to  JavaScript source map  support in Rollbar!  This update introduces several features unique to…]]></description><link>https://rollbar.com/blog/javascript-source-map-update/</link><guid isPermaLink="false">https://rollbar.com/blog/javascript-source-map-update/</guid><pubDate>Thu, 20 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’re excited to introduce a major update to &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/how-to-use-javascript-source-maps-to-debug-errors/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JavaScript source map&lt;/a&gt;&lt;/strong&gt; support in Rollbar!  This update introduces several features unique to Rollbar (source map search, source map failure logs, inline warnings in stack traces) that are critical to anyone using client-side JavaScript in a large-scale, continuous deployment environment.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;why-use-source-maps&quot;&gt;&lt;a href=&quot;#why-use-source-maps&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why Use Source Maps?&lt;/h2&gt;
&lt;p&gt;If your application uses client-side javascript, then you’re probably minifying your code to reduce file sizes and improve page load times.  The benefits of minified Javascript are clear, but minification also introduces the need for source maps in order to debug errors that were detected in minified code.  Without a source map, it&apos;s nearly impossible to determine where an &lt;strong&gt;&lt;a href=&quot;/error-tracking/javascript/&quot;&gt;error occurred in your Javascript code&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Due to the need for source maps, debugging minified code will always be inherently problematic, but we’ve just introduced several improvements to Rollbar’s source map handling that will make troubleshooting much, much easier.&lt;/p&gt;
&lt;h2 id=&quot;something-didnt-work-right&quot;&gt;&lt;a href=&quot;#something-didnt-work-right&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Something didn’t work right…&lt;/h2&gt;
&lt;p&gt;When a Rollbar stack trace includes a minified file that doesn’t have a matching source map, you’ll now see an information message that links you to your project’s source map screen where you can further troubleshoot why the source map wasn’t available.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 18.941798941798943%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsSAAALEgHS3X78AAAAnklEQVQY05WPSw7CMAxEc/87QqFAlY+dRE2TtN0MdpBYIrF4mvHYlmxTSsFaD6Syo/ZzwGvHJqqZUtoxsrafiKI6r1kqHXn77KnXnokxwnsPIhrqnAOFAO/U+6EUCNZaBMmJExyv8FEQrzueeNRWctN7xz+01n72TV4WTLcHpnnBVbg/LS6i88vBUYYVHOfhOQrM34/0G708pYRa6+ANmlUw8QWtg+sAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;traceback message&quot;
        title=&quot;&quot;
        src=&quot;/static/traceback_message-7fea515d34f0b243cb65742f60ac4af1-e9535.png&quot;
        srcset=&quot;/static/traceback_message-7fea515d34f0b243cb65742f60ac4af1-d32c5.png 216w,
/static/traceback_message-7fea515d34f0b243cb65742f60ac4af1-06f31.png 432w,
/static/traceback_message-7fea515d34f0b243cb65742f60ac4af1-e9535.png 864w,
/static/traceback_message-7fea515d34f0b243cb65742f60ac4af1-4cc9a.png 945w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h2 id=&quot;view-failed-source-map-uploads-and-downloads&quot;&gt;&lt;a href=&quot;#view-failed-source-map-uploads-and-downloads&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;View failed source map uploads and downloads&lt;/h2&gt;
&lt;p&gt;More often than not, you look at your source maps because something didn’t work as expected.  You can now see when Rollbar fails to access a source map, including detailed information about what happened.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 24.76832350463353%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAAAvklEQVQY052Qy26DMBBF+f9lv6jf0F1bEQQmvELsGAOxMfjUcaUusqnaKx3NjDQa3blZXdcIIcjznP9q2w/04jDrRmat5eX1lHg7a0IIf8J7z77vCSllPNi2qELQfFTU7yXNZ8U59kMuMFWD73oYhl8JXYcrCrJwHKzzjNGadVkwXcsYFy59/12HEWsdm9twP/g4e47oKjyRPefh1pWyrFKuSimuSjPKW0LeJqSamK6aqZfcpcZpw93M6eWHvgAKOoE5r67E6wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;sourcemap failure&quot;
        title=&quot;&quot;
        src=&quot;/static/sourcemap_failure-9ef018932710dcdbea58f4ea4f3ef1fd-e9535.png&quot;
        srcset=&quot;/static/sourcemap_failure-9ef018932710dcdbea58f4ea4f3ef1fd-d32c5.png 216w,
/static/sourcemap_failure-9ef018932710dcdbea58f4ea4f3ef1fd-06f31.png 432w,
/static/sourcemap_failure-9ef018932710dcdbea58f4ea4f3ef1fd-e9535.png 864w,
/static/sourcemap_failure-9ef018932710dcdbea58f4ea4f3ef1fd-f8698.png 1187w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h2 id=&quot;filter-and-search-your-source-maps&quot;&gt;&lt;a href=&quot;#filter-and-search-your-source-maps&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Filter and search your source maps&lt;/h2&gt;
&lt;p&gt;On large projects with frequent deployments, you may have a lot of source maps generated from a lot of different code versions.  With our new search capability, you can find source maps based on code version or filename.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 28.556375131717598%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAAAwklEQVQY05WQTQ6CMBCFe12P4B28iFv3nsKFCQERhLZBa/+0LbTkWfQCOMmXN2/zJTNkd6ywPZyx2Z9QDC+snWkcIaWEtRYpJWilIIQA8SHgaf2Xh3aQOUVOYTzUK2CKCfM8r4Y49xMJ4zCo91e09Lty8GP8SxZjBNHG4sI0aq5RdBJXblBRhTJz1x4xzavfsJxOdNOClQ1ohmdY1eJR3+D7/i9MUcBRmoW3DqzuwDP95ZdLp3nXPUPgfBXvtkUYBnwAhibK2UBGMZMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;sourcemap search&quot;
        title=&quot;&quot;
        src=&quot;/static/sourcemap_search-cdbc135ef1c9a8a8bcb970e40573bf87-e9535.png&quot;
        srcset=&quot;/static/sourcemap_search-cdbc135ef1c9a8a8bcb970e40573bf87-d32c5.png 216w,
/static/sourcemap_search-cdbc135ef1c9a8a8bcb970e40573bf87-06f31.png 432w,
/static/sourcemap_search-cdbc135ef1c9a8a8bcb970e40573bf87-e9535.png 864w,
/static/sourcemap_search-cdbc135ef1c9a8a8bcb970e40573bf87-13b50.png 949w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h2 id=&quot;easier-pruning-of-old-source-maps&quot;&gt;&lt;a href=&quot;#easier-pruning-of-old-source-maps&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Easier pruning of old source maps&lt;/h2&gt;
&lt;p&gt;Finally, we’ve fixed a bug that many of you told us about - When deleting a source map, you will remain on the same page you were previously viewing.  This makes it much easier to clean out old source maps that are no longer needed in your project.&lt;/p&gt;
&lt;h2 id=&quot;want-to-learn-more-about-source-maps&quot;&gt;&lt;a href=&quot;#want-to-learn-more-about-source-maps&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Want to learn more about source maps?&lt;/h2&gt;
&lt;p&gt;Check out our previous blog post &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/how-to-use-javascript-source-maps-to-debug-errors/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Using JavaScript Source Maps to Debug Errors&lt;/a&gt;&lt;/strong&gt; and our detailed &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/source-maps/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;source map docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your JavaScript errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Upcoming Events - Meet the Rollbar team IRL]]></title><description><![CDATA[Come meet some of the Rollbar team members this Spring! We'll be attending these upcoming events below and we'd love to meet with you in…]]></description><link>https://rollbar.com/blog/upcoming-events-this-spring/</link><guid isPermaLink="false">https://rollbar.com/blog/upcoming-events-this-spring/</guid><pubDate>Tue, 18 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Come meet some of the Rollbar team members this Spring! We&apos;ll be attending these upcoming events below and we&apos;d love to meet with you in person! We&apos;d love to hear your thoughts on Rollbar and answer any questions you may have. You may want to share your projects with us, get to know the team or pickup some Rollbar gear. Please drop by and make sure to say Hi!&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;angular-attack&quot;&gt;&lt;a href=&quot;#angular-attack&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Angular Attack&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: Global Online Hackathon&lt;/strong&gt; / &lt;strong&gt;When: Fri, April 21 to Sun, April 23&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.angularattack.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Angular Attack&lt;/a&gt;&lt;/strong&gt; is a weekend long hackathon featuring &lt;strong&gt;&lt;a href=&quot;https://angularjs.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Angular&lt;/a&gt;&lt;/strong&gt;. It&apos;s an online, virtual competition with contestants worldwide. Compete over two days to build the best Angular app with your team, and win prizes and glory. Hope to see you there! We&apos;re giveing away 6 months of Rollbar for free and a Star Wars BB-8 Droid to the winning team.&lt;/p&gt;
&lt;h2 id=&quot;railsconf&quot;&gt;&lt;a href=&quot;#railsconf&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;RailsConf&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: Phoenix, Arizona  /  When: Tues, April 25 to Thurs, April 27&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://railsconf.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;RailsConf&lt;/a&gt;&lt;/strong&gt; is the largest gathering of Rails developers in the world, not to mention the largest gathering of Rubyists. We&apos;ll be sponsoring and exhibiting, so stop by and say hi, learn about updates to our &lt;strong&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar-gem&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;ruby gem&lt;/a&gt;&lt;/strong&gt; and grab some of our new Rollbar swag.&lt;/p&gt;
&lt;h2 id=&quot;pycon&quot;&gt;&lt;a href=&quot;#pycon&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;PyCon&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: Portland, Oregon  /  When: Thurs, May 18 to Sat, May 20&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://us.pycon.org/2017/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;PyCon&lt;/a&gt;&lt;/strong&gt; is the largest annual gathering for the community using and developing the open-source Python programming language. Organized by the awesome folks in the Python community. We are sponsoring and exhibiting for the first time at PyCon. Please stop by our booth and say hi, talk shop and grab some new Rollbar swag.&lt;/p&gt;
&lt;h2 id=&quot;gluecon&quot;&gt;&lt;a href=&quot;#gluecon&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;GlueCon&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: Broomfield, Colorado&lt;/strong&gt; / &lt;strong&gt;When: Wed, May 24 to Thurs, May 25&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://gluecon.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Gluecon&lt;/a&gt;&lt;/strong&gt; is a developer­ oriented conference that is focused on how Serverless Architectures, Containers, Microservices, APIs, DevOps, Mobile, Analytics, Performance Monitoring, and cutting edge developer platforms and tools are changing the technology landscape. We&apos;re excited to sponsor this event for the first time and our very own &lt;strong&gt;&lt;a href=&quot;http://gluecon.com/#agenda&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Andrew Weiss&lt;/a&gt;&lt;/strong&gt; will be giving a talk on &quot;Exception Handling Across Time and Space&quot;. Sounds like a party! &lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;schedule-an-in-person-meeting&quot;&gt;&lt;a href=&quot;#schedule-an-in-person-meeting&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Schedule an in-person meeting&lt;/h2&gt;
&lt;p&gt;We’re making &lt;strong&gt;[office hours](&lt;a href=&quot;mailto:sales@rollbar.com?subject=I&amp;#x27;d&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;sales@rollbar.com?subject=I&apos;d&lt;/a&gt; like to meet at [add event you are attending here]&quot;)&lt;/strong&gt; available during these events. Schedule some time with us to sit down with a Rollbar expert to show you how you can level-up your app monitoring and error handling. Visit us at our booth or email &lt;strong&gt;[sales@rollbar.com](&lt;a href=&quot;mailto:sales@rollbar.com?subject=I&amp;#x27;d&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;sales@rollbar.com?subject=I&apos;d&lt;/a&gt; like to meet at [add event you are attending here])&lt;/strong&gt; to get something scheduled. 📅&lt;/p&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you defeat annoying errors in your applications. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Error alert notifications + how to use them for better monitoring]]></title><description><![CDATA[Rollbar offers an impressive array of  error alerting and notification options  for you to choose from, which is awesome! But sometimes we…]]></description><link>https://rollbar.com/blog/notification-types-how-to-use-them/</link><guid isPermaLink="false">https://rollbar.com/blog/notification-types-how-to-use-them/</guid><pubDate>Tue, 04 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Rollbar offers an impressive array of &lt;strong&gt;&lt;a href=&quot;docs/notifications/&quot;&gt;error alerting and notification options&lt;/a&gt;&lt;/strong&gt; for you to choose from, which is awesome! But sometimes we hear from our users that they aren&apos;t quite sure how to leverage their notifications to get the best results. What do notifications here at Rollbar do? How do they work? How should you interpret them? And perhaps most importantly, what are the best practices? Let&apos;s explore the answers to all these questions today.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Rollbar supports many different &lt;strong&gt;&lt;a href=&quot;/docs/tools&quot;&gt;messaging and incident management tools&lt;/a&gt;&lt;/strong&gt;, so you and your team can get notified about errors and important events. These notifications can be anything from a message in a &lt;strong&gt;&lt;a href=&quot;/docs/slack/&quot;&gt;Slack&lt;/a&gt;&lt;/strong&gt; channel to an alert in &lt;strong&gt;&lt;a href=&quot;/docs/pagerduty/&quot;&gt;PagerDuty&lt;/a&gt;&lt;/strong&gt;. There are some common notification types that we offer, no matter what tool you&apos;re using to be notified.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Notification Type&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Triggered when...&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;New Item&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;An error/ message is seen for the first time.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Every Occurrence&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Every time an error/ message occurs (
&lt;em&gt;use wisely&lt;/em&gt;
).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;10^th Occurrence&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;10th, 100th, 1,000th, 10,000th, ... occurrence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;High Occurrence Rate&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{x}&lt;/code&gt;
 occurrences seen in 
&lt;code&gt;{y}&lt;/code&gt;
 minutes (
&lt;em&gt;configurable&lt;/em&gt;
).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Item Resolved&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;An error/message is marked 
&lt;code&gt;Resolved&lt;/code&gt;
.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Item Reopened&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;An error/message is marked 
&lt;code&gt;Active&lt;/code&gt;
 by a user.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Item Reactivated&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;An error/message occurs again after being marked 
&lt;code&gt;Resolved&lt;/code&gt;
.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Deploy&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;A new 
&lt;strong&gt;&lt;a href=&quot;/docs/deploy-tracking/&quot;&gt;deploy&lt;/a&gt;&lt;/strong&gt;
 is reported.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Daily Summary&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(Available in email only)&lt;/em&gt;
 Summary of daily error/message activity in a project&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
So now that you know what types of notifications you can get, how about customizing them? You can filter your notifications to adjust the circumstances under which you receive a notification. For instance, you can control what team the notification is sent to, or even which individual users should be notified. You may wish to only receive a notification when the source is a certain notifier, or the title of the item matches a specific string. You can find all of the myriad filters available to you for notifications (and further documentation of how to configure these filters) **[in the docs](/docs/filtering-notifications/)**.
&lt;p&gt;Once you&apos;ve set up the specific conditions under which a notification is triggered, you might want to customize the message that gets sent to you and your team. That&apos;s where the different &lt;strong&gt;&lt;a href=&quot;/docs/notification-variables/&quot;&gt;notification variables&lt;/a&gt;&lt;/strong&gt; Rollbar offers come in handy. You can have your notification alert an entire channel in Slack to a new item in Rollbar, for instance. Check out &lt;strong&gt;&lt;a href=&quot;/docs/notification-variables/&quot;&gt;the docs&lt;/a&gt;&lt;/strong&gt; to see exactly what variables are available, and then come back here for some tips and tricks on how to use filters and variables to get the most out of Rollbar notifications.&lt;/p&gt;
&lt;h3 id=&quot;routing-your-notifications-effectively&quot;&gt;&lt;a href=&quot;#routing-your-notifications-effectively&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Routing your notifications effectively&lt;/h3&gt;
&lt;p&gt;Here at Rollbar, we sometimes hear from users that they aren&apos;t sure exactly how to route their notifications so that the right people see the right ones. The best way to do this is to use our filters! You can customize your notifications so that each one goes to a specific person or team, based on specific criteria. For instance, let&apos;s say you have an &lt;code&gt;Item Reopened&lt;/code&gt; rule, and you want to alert your entire engineering team right away in Slack when an item is reopened, but only if the item&apos;s level is &lt;code&gt;Error&lt;/code&gt;, and it occurred in production. Just use notification filters in your Slack notification rules, and have it post to your &lt;code&gt;#engineering&lt;/code&gt; channel, and voila! All your engineers will see when an item is reopened that matches that criteria. &lt;/p&gt;
&lt;p&gt;In essence, the best way to ensure the right people see the right notifications at the right time is to set filters on the environment, filename, title, or other criteria as needed, and send it to the specific emails, teams, or channels that need to be alerted in a timely manner. The more specific you can get with your matching criteria, the less notification clutter you&apos;ll get. You can set up multiple rules for the same type of notification, so you can customize exactly who sees what notification to reduce the clutter for everyone on your team. Want the Python developers on your team to get all the Python errors and nothing else? Filters are your friend! The best way to get started with filters is to check out the docs on &lt;strong&gt;&lt;a href=&quot;/docs/filtering-notifications/&quot;&gt;notification filters&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;There are two main types of tools that Rollbar users have questions about when it comes to properly setting up their notifications, and maximizing the information included in the notifications: messaging apps, and incident management tools. Let&apos;s take a look at messaging apps first.&lt;/p&gt;
&lt;h3 id=&quot;notifications-for-messaging-apps&quot;&gt;&lt;a href=&quot;#notifications-for-messaging-apps&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Notifications for messaging apps&lt;/h3&gt;
&lt;p&gt;When setting up notifications for messaging apps such as &lt;strong&gt;&lt;a href=&quot;/docs/slack/&quot;&gt;Slack&lt;/a&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;a href=&quot;/docs/hipchat/&quot;&gt;HipChat&lt;/a&gt;&lt;/strong&gt; , you want to make sure the message is succinct but helpful and informative. A basic Slack message is &lt;code&gt;[{{&quot;{{project_slug&quot;}}}}] {{&quot;{{username&quot;}}}} deployed revision {{&quot;{{revision&quot;}}}} to {{&quot;{{environment&quot;}}}} {{&quot;{{link&quot;}}}}&lt;/code&gt;, which gives a good amount of information in one sentence for a deploy notification. Rollbar supports variables in notifications using {{VARIABLE_NAME}} syntax. Different variable values are available depending on the type of event that triggers the notification, which you can check out in the docs &lt;strong&gt;&lt;a href=&quot;/docs/notification-variables/&quot;&gt;here&lt;/a&gt;&lt;/strong&gt;. Any data value sent in the JSON payload of an item or occurrence may be used as a variable, including custom data. Examples of usage are &lt;code&gt;{{&quot;{{body.request.url&quot;}}}}&lt;/code&gt; and &lt;code&gt;{{&quot;{{body.server.host&quot;}}}}&lt;/code&gt;. If your JSON payload includes the custom values &lt;code&gt;{{&quot;{{ handler: { key: process-job, id:100&quot;}}}}&lt;/code&gt; then you can use the variables &lt;code&gt;{{&quot;{{body.handler.key&quot;}}}}&lt;/code&gt; and &lt;code&gt;{{&quot;{{body.handler.id&quot;}}}}&lt;/code&gt; in your notifications. To view the full set of available values, look at the &quot;Params&quot; values of an occurrence in your project. All params besides the ones listed in the above notification variables must be prefaced with &quot;body&quot;.&lt;/p&gt;
&lt;p&gt; Sometimes, our users want to be able to alert everyone in a channel using common Slack syntax such as &lt;code&gt;@channel&lt;/code&gt;, &lt;code&gt;@group&lt;/code&gt;, &lt;code&gt;@here&lt;/code&gt;, or &lt;code&gt;@everyone&lt;/code&gt;. You can do this with notification variables in Rollbar as well! Make sure to use the syntax &lt;code&gt;&amp;#x3C;!channel&gt;&lt;/code&gt;, &lt;code&gt;&amp;#x3C;!group&gt;&lt;/code&gt;, &lt;code&gt;&amp;#x3C;!here&gt;&lt;/code&gt;, or &lt;code&gt;&amp;#x3C;!everyone&gt;&lt;/code&gt;. So, for the earlier example, if you wanted to add &lt;code&gt;@here&lt;/code&gt; to the beginning of the message, you would simply change the message to &lt;code&gt;&amp;#x3C;!here&gt; [{{&quot;{{project_slug&quot;}}}}] {{&quot;{{username&quot;}}}} deployed revision {{&quot;{{revision&quot;}}}} to {{&quot;{{environment&quot;}}}} {{&quot;{{link&quot;}}}}&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt; Here at Rollbar, we have six different notification rules for Slack: &lt;/p&gt;
&lt;p&gt; 
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 61.08165429480382%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABRUlEQVQoz61TXU+DQBDs//8NPmh8MPHBX9M2QPkqTTmglM8HLQXGnU1jrVGsjZds7o67nZ0Z9mZVWSJJEvx1jON4juMRfV3petY0DVzXRRAEWC4WiNYRVquVRlmU2O/3KKVoVVU6fwbknudNtEb28oxx6DFr2xZpmsKYRJM4b7dbHKXqBYsvMQwDiqJAnueofQ/m/g5jL4A83Gw2CMMQjuNo1bqucTgcJgF/CmXoup5KpGzLstSCTgCnBhmyuDIMhOHDiSEPPQGwbVs8XOrMi7vdTv0xxmgSIxNrKJMWkc1348PDLMsUIDkB/CZt2sMo+j8P2Ta+78PEsfrn2A6apkXXdbd5SFRSp2eU3stHXr6Wkd5lztvrmSHlhuEa8/n86ldz0dhhgPTp8czQlZZRueIh12ybBV+NeGtMLOxz/WmUR4Apxu+at5lJFb3v3QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;slack1&quot;
        title=&quot;&quot;
        src=&quot;/static/slack1-87e325c132e2a542e43675346f8b19fb-e9535.png&quot;
        srcset=&quot;/static/slack1-87e325c132e2a542e43675346f8b19fb-d32c5.png 216w,
/static/slack1-87e325c132e2a542e43675346f8b19fb-06f31.png 432w,
/static/slack1-87e325c132e2a542e43675346f8b19fb-e9535.png 864w,
/static/slack1-87e325c132e2a542e43675346f8b19fb-ab1f5.png 1296w,
/static/slack1-87e325c132e2a542e43675346f8b19fb-7539a.png 1728w,
/static/slack1-87e325c132e2a542e43675346f8b19fb-e03cf.png 1886w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt; As you can see, we set a high occurrence rate notification to alert us once there&apos;s been at least 100 occurrences in 5 minutes of an error in production, which ensures that we are notifed when there is a error occurring enough that it&apos;s immediately concerning. We also like to be alerted if an item that we thought we resolved is reopened, if an item is reactivated or resolved, if a deploy has happened, and especially if there is a new error. Here&apos;s how some of Rollbar&apos;s notifications look like in Slack:&lt;/p&gt;
&lt;p&gt; 
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 17.45098039215686%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAiUlEQVQI15WOQQvCMBSD9/9/lQdPgp7moTCLuHUtaF+3Sl/foBC3ogfxZCDwBUJIU0rB7nDEOFq07RlEBGZGSoycM/5VQ2HCqdtj0RrWujpsjFnZYo7xzQ4hBPT9UDNRgHMO3nuIyPfgB0QpaGKYWdA9EkwU3KYMdU+4Bq68uV+99S6e8VzKz8MX2JTllN6ud4AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;slack2&quot;
        title=&quot;&quot;
        src=&quot;/static/slack2-0369f70d72139c6c626fc1540dcdc4e7-e9535.png&quot;
        srcset=&quot;/static/slack2-0369f70d72139c6c626fc1540dcdc4e7-d32c5.png 216w,
/static/slack2-0369f70d72139c6c626fc1540dcdc4e7-06f31.png 432w,
/static/slack2-0369f70d72139c6c626fc1540dcdc4e7-e9535.png 864w,
/static/slack2-0369f70d72139c6c626fc1540dcdc4e7-db364.png 1020w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt; 
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 34.436619718309856%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAAA8klEQVQoz5WS3W7DIAyF8/5vOO1iSqfyD0nIaGgUOMUuyy62SRvoCMuEw2eTodaKt8s7xvECIQRyzqxSCmjQ/n/GQAdfxxfo9QYpJbQxME3WWmit4ZxjWes4r7so9j7wmlI6Lx4+KcK2Qy0b7JrhP+4wMUOTeu4o9U/Ew/Orgmw0hFSwxjKd9x4xRiYgwhAC5yje9/1X825YcfcOVyHZbFlTo81wnVbHjekpJlqij62iUr9TP0tu0yXXeqhg7BfhPM+QSjGV1ob76JzHNE28Ut60io7jOI1Pw3CbIK6CDy3LAtWNyJgeRzVR2babUDt++hMeOxwcO4xnYQ4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar slack alert error&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-slack-alert-error-c88c302bda4e04fcaec3ad9aacc7e7a4-e9535.png&quot;
        srcset=&quot;/static/rollbar-slack-alert-error-c88c302bda4e04fcaec3ad9aacc7e7a4-d32c5.png 216w,
/static/rollbar-slack-alert-error-c88c302bda4e04fcaec3ad9aacc7e7a4-06f31.png 432w,
/static/rollbar-slack-alert-error-c88c302bda4e04fcaec3ad9aacc7e7a4-e9535.png 864w,
/static/rollbar-slack-alert-error-c88c302bda4e04fcaec3ad9aacc7e7a4-ab1f5.png 1296w,
/static/rollbar-slack-alert-error-c88c302bda4e04fcaec3ad9aacc7e7a4-f7649.png 1420w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;notifications-for-incident-management-tools&quot;&gt;&lt;a href=&quot;#notifications-for-incident-management-tools&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Notifications for incident management tools&lt;/h3&gt;
&lt;p&gt;The type of information you want in a notification from &lt;strong&gt;&lt;a href=&quot;blog/victorops-incident-management/&quot;&gt;incident management tools&lt;/a&gt;&lt;/strong&gt; like &lt;strong&gt;&lt;a href=&quot;docs/pagerduty/&quot;&gt;PagerDuty&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;docs/victorops/&quot;&gt;VictorOps&lt;/a&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;a href=&quot;docs/datadog/&quot;&gt;Datadog&lt;/a&gt;&lt;/strong&gt;. is probably slightly different than for a messaging app. Typically, the alerts you&apos;re getting for an incident management tool deal with the possibility of an urgent problem that your team needs to address. You&apos;re not going to want to be alerted with these tools if a simple deploy is reported. You&apos;ll want to know what type of notification was triggered and why, as quickly as possible. Therefore, the basic incident management message we start with is &lt;code&gt;[{{&quot;{{project_slug&quot;}}}}] {{&quot;{{environment&quot;}}}} - {{&quot;{{trigger_description&quot;}}}} {{&quot;{{level&quot;}}}}: {{&quot;{{title&quot;}}}}&lt;/code&gt;. All of the incident management tools we are currently integrated with, aside from Datadog, offer the same amount of customization for your notifications. &lt;strong&gt;&lt;a href=&quot;docs/datadog/&quot;&gt;Datadog&lt;/a&gt;&lt;/strong&gt; has some extra options, which are detailed &lt;strong&gt;&lt;a href=&quot;docs/datadog/&quot;&gt;in the docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 756px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 77.64550264550265%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsSAAALEgHS3X78AAABTElEQVQ4y62U63KCMBCFff+nE1EBwYIWBIJAwv1SPc2m0qk/OuMFZr7sLCGHhN3DAjNfC13XYTsOdH0F73DAcrnE1jBgmiYsy8SH62K/38ORzxCuzA05T9D8ZmvcC16vVxDDMKBtWzRNg+nesyhBGgohsNvtoGkaPM9DzBiSJEEURSrGcQzO+WNHpqHrOoSnEEwKNUWBUi6u61pRVZWKfd8/LliWBfTVCprE9xnqnL9elGmHjmPDkscOE4Gi7l4X/BpHVZDZ2mazXsMPAlwul7dRgqZpqf6igryLEpySLMvAZHucz6nKqXVOYYRjEMI9Bioe/JPC+wyQc6Eq/xclaNs20jSdhTunEOM4QIifN5NrnnHJ7zekhBaTIxiLpaBs7LJ62nZ3ghOFdAlZrLxFLnf7liBBNmv7AbxsIKpWxUzUyG8xySv0w/jvz+EbjyPY+gb16UoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar pagerduty alert&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-pagerduty-alert-83bb51f9f5c802d1e9cc8d2da914478b-9f3db.png&quot;
        srcset=&quot;/static/rollbar-pagerduty-alert-83bb51f9f5c802d1e9cc8d2da914478b-c0cb0.png 216w,
/static/rollbar-pagerduty-alert-83bb51f9f5c802d1e9cc8d2da914478b-29bac.png 432w,
/static/rollbar-pagerduty-alert-83bb51f9f5c802d1e9cc8d2da914478b-9f3db.png 756w&quot;
        sizes=&quot;(max-width: 756px) 100vw, 756px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/rollbar-error-in-datadog.153204.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;notifications-for-email&quot;&gt;&lt;a href=&quot;#notifications-for-email&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Notifications for email&lt;/h3&gt;
&lt;p&gt;Aside from messaging apps and incident management tools, Rollbar also offers email notifications, and automatically sends out a daily summary of each project&apos;s activity via email. This daily summary includes how many occurrences of each type of error occurred in the past day, broken down by error level and environment. You can specify the time it is sent out daily, as well as whether to send it only if there is new data. The summary can be a very helpful overview of what errors are occurring and where, without needing to log into the UI. We recommend using the configurable email notifications for alerting your team to items that aren&apos;t vital to be seen immediately. &lt;/p&gt;
&lt;p&gt;Here at Rollbar, we have 11 email notifications configured:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 71.06986899563319%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABwklEQVQ4y52U226bQBCGef9n6UUfIFKiXkaJ0hpMgjG0OMExLMvJYGMD/rv/RKRpVTVuVhoNMLM73xwWSymFNE3xkXU6nUTGccSQKYzbLaw8z7FYLOC69/B9H57nyXuWZSK0Myg1AxdG60yjbVuUZYmtOYS2/MsVmgcX1uFwQKoyxLrG8XjEfr8Hv03R/yX06/tedBf4OCYbWFVVwXEcQ+iKns1mmDtzRFH0GyW1MoSk3e12knLTNPJc1zWq2R12qx+whmEQwidVSSRSTvocyj/FYsQgCBCGIWzbFrJgGSCOY6Eq8gJaa+T6hZIpTqsoCqGjXX3+hPrmGhY7xOLSqM2GuqpfHd+j4d5JhiLH2DZ/I1xhuVwKoZCxq0ZPJG/X2y7rqws0rgOr6zpok9bUZdb03HrRv9cZOt/7VUOm5y98OO4DvtqukLJWjE5NAj5zGigknd5pa01ny9vrV2qLDkmSIEkVlC4Mvj67wxwbzq0cbH/DYRWZlM2HIPwOL3rGer2Ww0nAUry3pvGib2PS7jjYcm14rZIUm83mv2aOaU9XsLy8QMumcK5Wj08IY4V58IhnXZ39c2ADKXL9zNj0Zmx+AuHKMsbwoErUAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;email1&quot;
        title=&quot;&quot;
        src=&quot;/static/email1-2a0654b542123bd8be051a40aceb1bcf-e9535.png&quot;
        srcset=&quot;/static/email1-2a0654b542123bd8be051a40aceb1bcf-d32c5.png 216w,
/static/email1-2a0654b542123bd8be051a40aceb1bcf-06f31.png 432w,
/static/email1-2a0654b542123bd8be051a40aceb1bcf-e9535.png 864w,
/static/email1-2a0654b542123bd8be051a40aceb1bcf-ab1f5.png 1296w,
/static/email1-2a0654b542123bd8be051a40aceb1bcf-7539a.png 1728w,
/static/email1-2a0654b542123bd8be051a40aceb1bcf-8e4bc.png 1832w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 37.76301218161684%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAnElEQVQoz83RTQ7CIBQE4N7/Ji68gInn4E8gUq2xYMG2krQhjJUTGNn4kpfZfplpTkJASQVjDLTWIITAe49vzlqLEAKcc+j3OwzHAxr78DB2RDfMcGPEsixIKSHn/NM3Sim0rQGldMsLpmlCjLFOePOvIlvXteiqhIJzcC5Kf4zxktXCT3/n/om7n+uFjDFIKbelJfi2eHft/kv4BoM3aY9ZoFWhAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;email2&quot;
        title=&quot;&quot;
        src=&quot;/static/email2-dac44130eaf975309aa4f0903c78d5d0-e9535.png&quot;
        srcset=&quot;/static/email2-dac44130eaf975309aa4f0903c78d5d0-d32c5.png 216w,
/static/email2-dac44130eaf975309aa4f0903c78d5d0-06f31.png 432w,
/static/email2-dac44130eaf975309aa4f0903c78d5d0-e9535.png 864w,
/static/email2-dac44130eaf975309aa4f0903c78d5d0-ab1f5.png 1296w,
/static/email2-dac44130eaf975309aa4f0903c78d5d0-7539a.png 1728w,
/static/email2-dac44130eaf975309aa4f0903c78d5d0-ac65e.png 1806w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;This allows us to get notified via email for every occurrence with certain titles, if an item is resolved, reactivated, or reopened, and when a deploy happens. We also have two different high notification occurrence rates to be notified on, one of which goes solely to one person, so you can see there are quite a few configuration options for who gets alerted and under what circumstances. Here&apos;s how one of these emails looks in our inboxes and in the email itself:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 28.517469310670446%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAABTUlEQVQY0yWQYVOjMBCG+///lnM3tbUgpQQSQkIClPGoo7aO2mvPxy334ZndD9ln383C7kfGjwsv1yvuzzOF7ynDiGoHtsaRC1mpKSpNaSyFNlTWYdtIEyIudHOd+65noUzN2/kfr1/fKBdZpoq0sKy2NcuHjF+rhN/3DyzXCdmuJN0qHvMCJWJdWypZUjduXmJcYDFNE5fLN6fTlRgnGjcSpDq/p7YtWnsq7aS/VRmWwaoyREkTJF0ryULsZrp+EOE48ff9yufpzFN/YAxPdH7ANyJTll4WeBuoJYm9JSorSlXRz8JAaANRpJ0I94MI69xwPLzyfjjS6Ra704KhKQyruyU6LdHbkixJeUwS0s2GzXpN6zxNXf/H2hnvHIu9nHV+eePrdGQwDUGEo5x4Y5CEXmQqy6kK+bc8pxDUbkcXWpHKe+8FR2w9fQz8AIaKr+oO67A3AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;email3&quot;
        title=&quot;&quot;
        src=&quot;/static/email3-f0a5c8d179c2b78394980e2e26ee7a76-e9535.png&quot;
        srcset=&quot;/static/email3-f0a5c8d179c2b78394980e2e26ee7a76-d32c5.png 216w,
/static/email3-f0a5c8d179c2b78394980e2e26ee7a76-06f31.png 432w,
/static/email3-f0a5c8d179c2b78394980e2e26ee7a76-e9535.png 864w,
/static/email3-f0a5c8d179c2b78394980e2e26ee7a76-ab1f5.png 1296w,
/static/email3-f0a5c8d179c2b78394980e2e26ee7a76-7539a.png 1728w,
/static/email3-f0a5c8d179c2b78394980e2e26ee7a76-78716.png 2118w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  

  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 72.29885057471265%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABUUlEQVQ4y6VUy26DMBDk/z+q16jqBalSA4oSlWAe4WUMBgw2mbJWQ9VDm4isNNpFgvHs7hgnTRlOpxMYYwjD0OYsy1CWJYqiAOccSimM44jr9XoXTtM0yPN8IT2AaoIQYiWY59mC6kfC6boOVVUhiiKrip6llODthEJo5PWwQKHtzWOEt9ONMQhSDq31Kn9LOEQ0amPb2jOOl/cIatKoWrWNsO971KLBNE1Q4wTZK1trM28jLKoG50R8o0Fc9MiF3t5y27ZgUYqq7pBziWLJlRggB2PRK2NtQ6ppYTSafwnpxSOr8XbosPMkdvsfvPoS7lEiXJZ1TvhycGJ9Sa4gj1IehuE3IVnF931rmyQX4KJdrUPzpXzDPXUroed5SNPUmvrZcOiaua67qnyakOZAd5gM/RlecAxLsEtj296yaSfJSnwcQvtxEASI4/ihn8Bf+AK2n0QSPps+RwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;email4&quot;
        title=&quot;&quot;
        src=&quot;/static/email4-1c462f522380a7702213d541a5bdff52-e9535.png&quot;
        srcset=&quot;/static/email4-1c462f522380a7702213d541a5bdff52-d32c5.png 216w,
/static/email4-1c462f522380a7702213d541a5bdff52-06f31.png 432w,
/static/email4-1c462f522380a7702213d541a5bdff52-e9535.png 864w,
/static/email4-1c462f522380a7702213d541a5bdff52-ab1f5.png 1296w,
/static/email4-1c462f522380a7702213d541a5bdff52-7539a.png 1728w,
/static/email4-1c462f522380a7702213d541a5bdff52-1a2be.png 1740w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Now that you&apos;ve gotten an overview of Rollbar notification types, give them a spin for your project and you can be sure you&apos;ll never miss an important error again. If you need help setting up notifications for your project, don&apos;t hestitate to contact us at &lt;strong&gt;&lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt;&lt;/strong&gt;. We love hearing from you and we&apos;re happy to help! &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors (and notifcations).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Onboarding remote employees, on the other side of the world 🌎]]></title><description><![CDATA[When I first started full-time here at  Rollbar , I was living in Malaysia for the month, starting a year-long journey around the world that…]]></description><link>https://rollbar.com/blog/remote-onboarding/</link><guid isPermaLink="false">https://rollbar.com/blog/remote-onboarding/</guid><pubDate>Tue, 28 Mar 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When I first started full-time here at &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt;, I was living in Malaysia for the month, starting a year-long journey around the world that I&apos;m currently still on. While it was certainly fun and exciting to explore Kuala Lumpur, it was a bit more difficult to onboard in a new job when I was 15 hours ahead of the rest of the team. Luckily, &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/about/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;everyone here at Rollbar&lt;/a&gt;&lt;/strong&gt; is incredibly flexible and helpful, and we were able to get creative about the onboarding process. If you&apos;re considering onboarding a remote employee in a different time zone as the rest of your team, read on for some tips and tricks that should help speed up the process.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;This is my third job in tech, and my second as a remote employee, so while I can&apos;t say I&apos;ve seen it all in terms of onboarding, I have seen a few different methods. The most obvious (and easiest) method is to have your new team member come in to the office bright-eyed and bushy-tailed and have all the members of the team available to help make their onboarding a success. Unfortunately, if the team member you&apos;re onboarding doesn&apos;t live in the same area, that isn&apos;t really possible. What to do? Some companies get around this by requiring all remote employees come onsite for their onboarding. If you&apos;re an all-remote company, like the second place I worked, you&apos;ve probably got the kinks figured out in terms of onboarding your new employees. In many ways it can be easier to onboard as a remote employee at a place where everyone is remote, rather than as one the few remote employees in an otherwise &quot;traditional&quot; office: you&apos;re all remote, and you all understand the challenges surrounding that, so you&apos;ve worked out methods that get around this for the company as a whole. But how to onboard a remote team member when most people are in the office everyday? Here at Rollbar, we&apos;ve figured out a few key steps. &lt;/p&gt;
&lt;h3 id=&quot;have-a-specific-employee-be-in-charge-of-training-your-newest-team-member&quot;&gt;&lt;a href=&quot;#have-a-specific-employee-be-in-charge-of-training-your-newest-team-member&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Have a specific employee be in charge of training your newest team member&lt;/h3&gt;
&lt;p&gt;It&apos;s easy to have an onboarding document with a few tasks to complete and then start assigning more tasks to your new team member, telling them to feel free to ask anyone for help, but that is actually not necessarily the best way to onboard a remote employee. When your new team member is remote, you have to bear in mind that they aren&apos;t getting face time with all the other members of the company, and they may not be sure of who does what exactly in the company when it comes to more specific questions. Rather than having them individually message each person on Slack, trying to find the right person for each question, give them a specific point of contact on your team to help onboard them. For me, it was the other support engineer here, who also happened to be remote. For pretty much any question that I had, I asked him first, and it made me feel much more comfortable more quickly than I otherwise would have. I always knew that no matter what I needed to know, I had someone to ask who would respond as soon as possible, and was looking out to make sure I wasn&apos;t lost. Feeling comfortable and supported is key for onboarding a new employee, and having someone to act as your new employee&apos;s point of contact enables that.&lt;/p&gt;
&lt;h3 id=&quot;overlap-overlap-overlap&quot;&gt;&lt;a href=&quot;#overlap-overlap-overlap&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Overlap, overlap, overlap&lt;/h3&gt;
&lt;p&gt;Having a specific employee as the point of contact for your newest team member is super helpful, but it can still be quite difficult to onboard someone 15 hours ahead of the rest of your team if there is no overlap in working hours. Here at Rollbar, I specifically worked at least half of the time for the first few weeks during hours that would overlap with the rest of the team. This meant that I was staying up until 2 or 3 in the morning sometimes, but since I knew it was only for the first couple of weeks, it really wasn&apos;t so bad. Plus, I wasn&apos;t languishing for a day waiting for a response to a simple question, which can be very demoralizing when you&apos;re first starting at a new job. &lt;/p&gt;
&lt;h3 id=&quot;set-up-a-document-for-questions&quot;&gt;&lt;a href=&quot;#set-up-a-document-for-questions&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Set up a document for questions&lt;/h3&gt;
&lt;p&gt;It may not always be possible to have significant overlap between your remote employee&apos;s hours and the rest of your team. One of my favorite things we did here at Rollbar to get around this issue was to set up a daily questions document. Previously, I had been leaving my questions in our engineering Slack channel, which would sometimes get drowned out with other chatter, so I wasn&apos;t always getting the answers I needed. During a chat one day with &lt;strong&gt;&lt;a href=&quot;https://github.com/coryvirok&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Cory, our CTO&lt;/a&gt;&lt;/strong&gt;, he came up with the brilliant idea of me having a daily questions document where I could leave any and all questions I needed help with for the other team members to check when they got online. This meant that I could get the answers I needed all in one place, instead of having to scroll through our chats and hope that everyone had seen my questions and answered them. In fact, we set up a great integration with &lt;strong&gt;&lt;a href=&quot;https://quip.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Quip&lt;/a&gt;&lt;/strong&gt;, where every time someone edits my questions doc, it posts to our engineering channel in &lt;strong&gt;&lt;a href=&quot;https://slack.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Slack&lt;/a&gt;&lt;/strong&gt;, so everyone is notified. Cory also came up with the idea of this document having two sections: &lt;strong&gt;unresolved&lt;/strong&gt; and &lt;strong&gt;resolved questions&lt;/strong&gt;. When a question is answered satisfactorily, I just move all the info into the resolved section, so if I ever run into that issue again, I have a quick reference point to check. I actually still use this questions doc, and when we onboarded another support engineer, my daily questions doc was an invaluable resource for getting him started as well. &lt;/p&gt;
&lt;h3 id=&quot;have-a-regular-checkin-with-a-higher-up&quot;&gt;&lt;a href=&quot;#have-a-regular-checkin-with-a-higher-up&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Have a regular checkin with a higher up&lt;/h3&gt;
&lt;p&gt;Having regular checkins with your boss is important for any employee, but for remote employees, it&apos;s crucial. Especially if your employee is in a time zone that is very different from the rest of the team, finding a time for them to be clued in to what&apos;s going on in the company is invaluable. Cory and I meet once a week to discuss what I&apos;m working on, what the rest of the team is working on, and answering any questions I may have. While this seems like something that could be easily overlooked, I credit these meetings the most with making me feel comfortable and valued as a team member here at Rollbar even when across the world from everyone else. It was in one of these meetings, where I was explaining how difficult it was to make sure I always got the answers I needed from other team members in Slack, that Cory came up with the daily questions document that I still use to this day. I look forward to our meetings every week since it keeps me clued in to the rest of the company, no matter where I am in the world.&lt;/p&gt;
&lt;p&gt;If you have a good onboarding process for your remote employees, they&apos;ll be able to provide value to the rest of the team quickly, and they&apos;ll feel like a valued team member as well. Once you get a good remote onboarding process set up, your company can reap the benefits of having employees around the globe, such as support available during hours your team would normally be offline, or engineers who are on-call when the rest of your team is sleeping. While it can seem like an insurmountable challenge to onboard an employee on the other side of the world from the rest of your team, take it from us here at Rollbar - with a little creative thinking and some flexibility, it can be done! &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Building the IoT Rollbar error alarm 🚨]]></title><description><![CDATA[Our friends at Losant wanted to share how they built an actual 'error-alarm' using the Rollbar and Losant API's. Enjoy! When I envision a…]]></description><link>https://rollbar.com/blog/internet-of-things-production-error-alarm/</link><guid isPermaLink="false">https://rollbar.com/blog/internet-of-things-production-error-alarm/</guid><pubDate>Sat, 11 Mar 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Our friends at Losant wanted to share how they built an actual &apos;error-alarm&apos; using the Rollbar and Losant API&apos;s. Enjoy!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When I envision a tech company&apos;s smart office, I see tons of dashboards and indicator lights that monitor everything. Efficient monitoring is a critical piece of today&apos;s technology stack, and there are always ways to improve. Rollbar already does an impeccable job at alerting you when errors are thrown in your application. But, to increase awareness, accountability, and awesomeness in the office, we can connect Rollbar to our smart office. In this tutorial, we are going to build an office error alarm powered by &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://www.losant.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Losant&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/bao-slaps-head-6e26052376cda23d4b9bfc717baf44eb.gif&quot;&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;h3 id=&quot;building-the-alarm&quot;&gt;&lt;a href=&quot;#building-the-alarm&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Building the Alarm&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.sparkfun.com/products/13097&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Intel Edison&lt;/a&gt;&lt;/strong&gt; - This is a small compute module that we will use to control the devices in our office. &lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 400px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 79.5%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAQABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAUD/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAa0mkZ3bCv/EABoQAAIDAQEAAAAAAAAAAAAAAAIDAAEEEBL/2gAIAQEAAQUCY8Fw9R2S2ewdno4rMAc//8QAFREBAQAAAAAAAAAAAAAAAAAAECH/2gAIAQMBAT8Bp//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABwQAAICAgMAAAAAAAAAAAAAAAABElERMQIQIf/aAAgBAQAGPwK3SM6VIlFoktmX7y6//8QAHBABAAIBBQAAAAAAAAAAAAAAAQARIRAxQVGh/9oACAEBAAE/Id5YAawbZCqyPDEaQ8sUrO6sGn//2gAMAwEAAgADAAAAEMTP/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAEDAQE/EDS//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/EBF//8QAHxABAAEEAQUAAAAAAAAAAAAAAREAIUFhEDFxgaHB/9oACAEBAAE/ECIbHcfOCoqNISulzSPOwPZqmqjdG2x3QGfp6HYPvH//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;intel edison&quot;
        title=&quot;&quot;
        src=&quot;/static/intel-edison-6b992c6d55f86296836ea52e62d79dce-f9780.jpg&quot;
        srcset=&quot;/static/intel-edison-6b992c6d55f86296836ea52e62d79dce-9df1c.jpg 216w,
/static/intel-edison-6b992c6d55f86296836ea52e62d79dce-f9780.jpg 400w&quot;
        sizes=&quot;(max-width: 400px) 100vw, 400px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://www.belkin.com/us/p/P-F7C029/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;WeMo Insight Switch&lt;/a&gt;&lt;/strong&gt; - This is a Wifi enabled, smart plug that we can control remotely.  &lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 372px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAEDAgQF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB7dWdZtAQEg//xAAaEAACAgMAAAAAAAAAAAAAAAABAgAQESIx/9oACAEBAAEFAmMXWm6LwK//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAWEAADAAAAAAAAAAAAAAAAAAAAMEH/2gAIAQEABj8CKj//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMRBBcZH/2gAIAQEAAT8hW6Ja2V63DJB9ELm/N3DREHZAujj/2gAMAwEAAgADAAAAEDAAPP/EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8QH//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8QH//EAB4QAQACAQQDAAAAAAAAAAAAAAEAESEQMVFxQWGB/9oACAEBAAE/EC36xEFCuW5fLioeZn20UXBGS9hvBs9vmGi4ILQJ7iVhPWn/2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;wemo insight switch&quot;
        title=&quot;&quot;
        src=&quot;/static/wemo-insight-switch-7b16b7de2281902b64fc23dc9342a41b-ce560.jpeg&quot;
        srcset=&quot;/static/wemo-insight-switch-7b16b7de2281902b64fc23dc9342a41b-6cda1.jpeg 216w,
/static/wemo-insight-switch-7b16b7de2281902b64fc23dc9342a41b-ce560.jpeg 372w&quot;
        sizes=&quot;(max-width: 372px) 100vw, 372px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;**&lt;a href=&quot;https://www.amazon.com/Rotating-Flashing-Beacon-Party-Strobe/dp/B0010W6PL0&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rotating Police Party Light&lt;/a&gt; - This is a regular party light.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 314px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 127.38853503184713%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAAAsSAAALEgHS3X78AAAFqklEQVQ4y2WVDUxVZRjHz73nno97zr3A5Vu4eOHyEVhg4ge5ciaalvOjWc5q00qthjpluhSmpvkBIkMFv1DUNqSpMyvRElc6RXMkYmqrNVCbzhISBMYV+f73P/eG5Dzbs/e9932f3/M/z/u8zxH6+vrQ29sLYzSeDk8b7lRdQs2BfbiYuxE/fLoM5xYuQOXCRTizYrn3v5o9xbh97izamx96fQzPfn/BmBhzY/zjuxPYnZqCzTFO5BnmjsLm+GgUxkZjhzsaBbEubHG7UMTfO/l7d2ICqoq2obuzwwcmQ+gnP25pQXHqi1guS1gdEoitUVHYFeNG3mAn8l1OrI+OxKrnovF5UhyyXIOwNCwQiwPsyBYFNNbVPQtsb2xEXngY3lZlTNQUbIxLQEl8ElZYNWQqEj6RLVjjHIxNScl4064j1SIgRZcxUxDwZ/XlZ4Gtf/+FTEabbpMxh4BCi4z9uh8OB4chw6Zgnl1GgaohV1awTrHiXe5J02RMJfD6yRPof54A79+4jgwuvm9XsU+zo8iqY6cjEKeiopGvqshRZORrOvI0DXtt/tgqWzHFqmASfSr3Fg8A+yc3T32PNVxcadNRrNuRRcAWqjlm9UN1YjJ+SxmOMgbaJMkoCwhECdXPs6peYPna1ejr7h4AGipvHNiPtQZQt2KTomKVaMaRgGBclv3QOP9jeLKyUWMPwtGAEFwNdaLM34HFVitep8/Bj+ai5/HjAWBvTw8ub1iPbaIF2aqCfOboK/9gVIW7cJsQT2kpHp35EfedMbgd6abFosTujyU8wAk8nO2TJ6GrrW0A2NPVicoFGSiWVRTwVHcxf4fsDpz0D0F14CA0zp6Lpg/n41poBCqosMwegLWKgmUssbGSCeuGvoDOlub/ASm3Yvp0bDSJ+MIWgKN+gTjCxFfFJOF28ig0DHajwZWA391JuOAeghLuWcqUrGY+x6siloQGwvPgnwFg1yMPjo8YiT2qjlKbA6cc4bjAPDWnjsW95NGoCo3ET2GD8StftX7kODSPmYxjweHIoYAJVglzWG5Nd+88DTwU4WTeglDI/B3xC8I3nN+NT8a9xGE4FxKJ8oBQXHPGwpOShluxQ5Brs3lVpmsS3uLB3Ll2dQB4r7YWW0URh/0c+MxkQhFzWcQ6+9Lmh6owJ65EuFDJ8SKVVoZEIEfXMFExI80wAo3i/vnroz5gN0/4g2lTkK2IOGgk22xGAW/JXh5MMa3Easclws6GDMJmltNCqwVvaCa8qgoYTeAo1YJ0zme9nIb29nYIXV1dGJ4Qx6pncnUJGYoJG6h2u6QQqGEnr9t+Qot4QxYRMIuwqbqJuRPwikqFPJRUWpTDH62trT5gtNuNcEYfSfmTNQsbgYg1zI9Rl6WKhtPM57dUn8sGkUnIOzYR6bqIYQS5WDr+9LU7HGhpbfEBI6KcEHjNBKqxsfpdvC0v8VrNVK3I5DXMcQRjHaHzWAXp/D9BVxHCfQrXBeZb5GjlIT1kw/UCg8PDITKKpBiLKsHcyNf1jTRdh8DGIDCnRlCBqk2sBjNFiDQL90nc19TUBKGzsxOO0GCYVV8kwyQ6KQRK3OxvsyM2IhIuBrXrNm9QiXssHA2gWZafAB80PoDQ0dEB1W6HTMmi1QBq3tFCM9NJo7oRQ4chOel5BvAFtVChKGuE+aAqy0tgddQ31LNs2HbGvDoOAmtJoRpZ84NEiESF4n9qQkLDERQcCosBJMzCXFoYWGIKZM3m9Y1NSPSdsrcX3ryJ92bPgcC7aSwKFsmbAgNqmJmNQKQZzpJqoyrm1Sz59gpmTJs+A1d/ufZ0g/V4PKipuYrCoh2YMXMWouPiYTJO3us0YMarRrJZjBv/GrKyV+L8+Uqvsqc+Af2fgf7HqPhGfrRqa+tQWXkBx8vLUVFxGtXVV1BXdwv19Q1oY//r6e554tPP+Rf/mCrbJ33lZgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;party alarm&quot;
        title=&quot;&quot;
        src=&quot;/static/party-alarm-ae35d78ff455dbc6091901f2f3c5dfb7-74433.png&quot;
        srcset=&quot;/static/party-alarm-ae35d78ff455dbc6091901f2f3c5dfb7-33d21.png 216w,
/static/party-alarm-ae35d78ff455dbc6091901f2f3c5dfb7-74433.png 314w&quot;
        sizes=&quot;(max-width: 314px) 100vw, 314px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;setting-up-the-light&quot;&gt;&lt;a href=&quot;#setting-up-the-light&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up the Light&lt;/h3&gt;
&lt;p&gt;Connect the WeMo Insight Switch to your office network using the &lt;strong&gt;&lt;a href=&quot;http://www.belkin.com/us/support-article?articleNum=80142&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;WeMo app&lt;/a&gt;&lt;/strong&gt; and plug in the light. You should be able to control the light with the WeMo app.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 400px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 140%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAcCAYAAABh2p9gAAAACXBIWXMAAAsSAAALEgHS3X78AAAC1ElEQVRIx7VUyW7TUBT1/8ECFohJiBkECzZIzGUoLUOR2AFiBaVbRACxhUKFVFRGQZqpiVNnbJp5sh07zuGdV5xmaJpUKlc6snX93rn33MHKTGwKk8HjuB08ihv+g7gXOoWLi7sxHjiC896duLC4C3dDJ4X/NMb8+6Xvuv+ABH23AocwETyGR+olXPHtgcILU0tn5MFeXPPtE9iLO8ETknQ8cBg3BcFGZ6+KcwyiMLuppbPCuaPv0GP1Mp5rk5iJ3cfT6JjEw/C5DQmfaRPyqczl3qITH1ZeYVbgU/aNwGt8XPVgTrz3nuvG+nel1WohnkgguryMZrOJer0OVVUl8vk8wuEwyuUyBplt2zAMA5ZlyftKo9GAz+dHMBhCrVbDVqxarUrCXz++IxpV5bviOA7i8YTIJCKi2HBaTTDrUY1ZUUldJEMuhaydqJhF1BtV9Po3A1VSssyQEeio2RWJql1CycrBdqyh2bFElUpF1tA0TelT+MJGpHQNWTONVTOFFSMhpQ+zUqkk5SaTSWSz2TVC9+PX3HuEK7/xQn0Ao1kfSsZ6Ea5s19qEanURf4pf8FJ7gkD5p5S+mUUiEczPz2N6ehoejwcJMXpdhIatw7QNpGrLqFtVgZrs4CCwCSwXwVq6WbYJY7EY0um0HGgeHtkc0QwjDuhqNyGLy0i6rqNYLMosRuITdWSnOeRdhOwYiQqFAjKZTHuuhsGVzLuS0J0lSqVsPik9Ho/Ld3e+BhlHzuv1YmFhYY3QbT8/8HLn2o2yglTC7FiyLsmUqWma3JqtrB0TiUaj62NDB2VTJqWnUikZkb8sZjgKujaFKRPcR3aYT3fZRzX3TpdkynXrsFVj8L6x2S7bfsK8mQGR0RP4lptFzliB63OhZkKI5dU+/0ZoZ1i2Cviceyf+g05fVHZ8UH05IZ0NXN/lxqr4uSbRcIy+Sxyn2r+i91pBBLKsxv+r4V/RkzXxu9THxgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;wemo app&quot;
        title=&quot;&quot;
        src=&quot;/static/wemo-app-2b6c962e213a93ed1088fee54d11aa28-27ab7.png&quot;
        srcset=&quot;/static/wemo-app-2b6c962e213a93ed1088fee54d11aa28-3bb60.png 216w,
/static/wemo-app-2b6c962e213a93ed1088fee54d11aa28-27ab7.png 400w&quot;
        sizes=&quot;(max-width: 400px) 100vw, 400px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;setting-up-intel-edison&quot;&gt;&lt;a href=&quot;#setting-up-intel-edison&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up Intel Edison&lt;/h3&gt;
&lt;p&gt;The WeMo switch exposes a local API. There is a &lt;strong&gt;&lt;a href=&quot;https://github.com/timonreinhard/wemo-client&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Node.js module&lt;/a&gt;&lt;/strong&gt; that wraps the API so we can control the WeMo switch.&lt;/p&gt;
&lt;p&gt;Since the API is local, the Intel Edison &lt;strong&gt;must be on the same network&lt;/strong&gt; as the WeMo switch to connect to the device. Intel has a &lt;strong&gt;&lt;a href=&quot;https://software.intel.com/en-us/get-started-edison-windows-step2&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;configuration tool&lt;/a&gt;&lt;/strong&gt; we need to use to set up SSH and connect the Edison to Wifi.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 698px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 71.48997134670488%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsSAAALEgHS3X78AAACPElEQVQ4y5WTXW8SQRSG95eof8B7tbH6U7z3yt6YoOmHDXphUm+8AUOiNjbGAoZiBD8iLpEICGkipSxsFxf2o2U/KRCEQnidmbhWMFY7yZM5Z+bdd8+ZneXubXzEzTiPhx9E3H9TxWK8guvPv2IpXIBvs4Db4SJukdn3gsSRIhaj2yy/Ey/jbqIK/2thCu7MAo95/xdce7SDiytZnFtI48JSFldWc5hfzWNuJYe55Rwuk/yqP49Ly1kWn/d9wtkb/B9w4UwVibSKzLaO93kF7z4rWI8KeBarYf1lFU/CNTyNiNiIiWx+vCki8raGV3wVWymKMAVn9VxYhgvbsjEaDQFM4LoWDtsuOh2HcbCvoi7VYBr7sO0WFEWGUNmFYRygc9hGu+38gut1e7AsC91uF3QMj47QMgyYpkUedtBsKijtlFEu70JRNUQiUcRiWygUimg0m7Bsm2k9uO+DAXq9HiaTCTMcjUZkw2QvcV2XGDaRyWSQSqVQr9cRCAQQDAaRTqfRaDSYhmopNjHn8HPMGlKhQwSKoiCRSOLB2hp4nocoikgmkwiFQiiVSnAch2mpGTXlqJEHHePxmJyNAU3TIO3tQRAEyN9k6DSXJHJ2FbIusX26R9dkWWZF/LVCz5C2q+s6q5LGmqpCJdCYrlEN3af5iYZey6xt0tIsrjubn9CyZ+gJTsdvFXqDnqFn+G+8r3sMNyDXxmM4HKLf7/+3Ia2ImhimDY38HC0yc979mRZapzI8MF1ISgu64eAH+/DlXuPU698AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;intel configuration&quot;
        title=&quot;&quot;
        src=&quot;/static/intel-configuration-d70f6398c6d1421fe64dc7d462f9b477-cc5ce.png&quot;
        srcset=&quot;/static/intel-configuration-d70f6398c6d1421fe64dc7d462f9b477-ce257.png 216w,
/static/intel-configuration-d70f6398c6d1421fe64dc7d462f9b477-a38ae.png 432w,
/static/intel-configuration-d70f6398c6d1421fe64dc7d462f9b477-cc5ce.png 698w&quot;
        sizes=&quot;(max-width: 698px) 100vw, 698px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Once the Edison is configured, using the credentials you just set, SSH into the device and download the source code for the alarm:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;$ wget https://github.com/Losant/example-rollbar-alarm/archive/master.zip
$ unzip example-rollbar-alarm-master.zip
$ cd example-rollbar-alarm-master
$ npm install&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Let&apos;s take a look at &lt;code&gt;index.js&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;&apos;use strict&apos;
const Wemo = require(&apos;wemo-client&apos;)
const Device = require(&apos;losant-mqtt&apos;).Device

const LOSANT_DEVICE_ID = &apos;DEVICE_ID&apos;
const LOSANT_DEVICE_KEY = &apos;DEVICE_KEY&apos;
const LOSANT_DEVICE_SECRET = &apos;DEVICE_SECRET&apos;
const WEMO_DEVICE_URL = &quot;http://192.168.86.135:49153/setup.xml&quot;

let wemo = new Wemo()

/**
 * Construct Losant Device
 * @type {Device}
 */
let device = new Device({
    id: LOSANT_DEVICE_ID,
    key: LOSANT_DEVICE_KEY,
    secret: LOSANT_DEVICE_SECRET
})

/**
 * Connect to Losant
 */
device.connect()

wemo.load(WEMO_DEVICE_URL, (deviceInfo) =&gt; {
    console.log(&apos;Device Found: %s&apos;, deviceInfo.friendlyName)
    /**
     * Get the client for the found device
     * @type {Wemo Client}
     */
    var client = wemo.client(deviceInfo)

    /**
     * Listen for commands from Losant
     */
    console.log(&apos;Listening for Losant command...&apos;)
    device.on(&apos;command&apos;, function(command) {
        console.log(&apos;Command from Losant received: %s&apos;, command.name)

        if (command.name == &apos;rollbar-wemo-switch&apos;) {
            console.log(&quot;Setting State to : %s&quot;, command.payload.state )
            client.setBinaryState(command.payload.state)
        }
    })
})&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;In &lt;code&gt;index.js&lt;/code&gt; , we are configuring our app to use a &lt;strong&gt;&lt;a href=&quot;https://docs.losant.com/devices/overview/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;device&lt;/a&gt;&lt;/strong&gt; in Losant. Then, load the WeMo device and listen for a command from Losant called &lt;code&gt;rollbar-wemo-switch&lt;/code&gt;. The &lt;code&gt;rollbar-wemo-switch&lt;/code&gt; command will include a parameter on the payload called &lt;code&gt;state&lt;/code&gt;. &lt;code&gt;state&lt;/code&gt; is a boolean. Lastly,  &lt;code&gt;state&lt;/code&gt; is passed into the &lt;code&gt;client.setBinaryState&lt;/code&gt; function to turn the light on/off.&lt;/p&gt;
&lt;p&gt;To connect to the WeMo device&apos;s API, we need to get its setup URL. In the code, it is represented as &lt;code&gt;WEMO_DEVICE_URL&lt;/code&gt;. WeMo has a discover feature that we can use to find all of the devices on the network and retrieve their setup URL. There is another file in our source called &lt;code&gt;find-devices.js&lt;/code&gt; we can run to do this for us:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 399px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 15.538847117794486%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsSAAALEgHS3X78AAAAsElEQVQI1zWOvQqDQBCE9+zSiChyeudfqgiKRYwaIaCilaCF7/8uk7sNKQZ2Zmc/lm5EoDwH7TtonkF1Ddo20DBAvEfQNOHeNHg9n3iUJfq+R9u2GMy+qiporeE4DshyrCZzcF0X1nXFbIBd17HfDNT64zhwnieWZeHMQtI0RRRFiOMYnufB930IIX7AjxyhtOKC67pcsHMYhpBSsoqi4CwIAv4oSRIopZBlGXub/4FfQ49UfD5LkikAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;find devices cli&quot;
        title=&quot;&quot;
        src=&quot;/static/find-devices-cli-cb208e24e09a97dc9e62cf8d43b50571-c238b.png&quot;
        srcset=&quot;/static/find-devices-cli-cb208e24e09a97dc9e62cf8d43b50571-1977b.png 216w,
/static/find-devices-cli-cb208e24e09a97dc9e62cf8d43b50571-c238b.png 399w&quot;
        sizes=&quot;(max-width: 399px) 100vw, 399px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;After you find your device, update the &lt;code&gt;WEMO_DEVICE_URL&lt;/code&gt; constant. It’s important to note: Because of DHCP, the IP of your WeMo device could change. It’s recommended to set a static IP address on the WeMo device using the DHCP reservation feature of your wireless router. You can also use the serial number of the device, like in &lt;strong&gt;&lt;a href=&quot;https://github.com/Losant/example-raspberry-pi-wemo&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;this example&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Before we can run &lt;code&gt;index.js&lt;/code&gt; , we need to configure the constants: &lt;code&gt;LOSANT_DEVICE_ID&lt;/code&gt;, &lt;code&gt;LOSANT_DEVICE_KEY&lt;/code&gt;, and &lt;code&gt;LOSANT_DEVICE_SECRET&lt;/code&gt;. We get these values from Losant.&lt;/p&gt;
&lt;h3 id=&quot;setting-up-losant&quot;&gt;&lt;a href=&quot;#setting-up-losant&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up Losant&lt;/h3&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 40%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsSAAALEgHS3X78AAABC0lEQVQY04VQ2U7DMBDM/38FTzyCBEg8pS1NQ2lpDttJfKzPXOUzWJdWQlSAtBqN1p6d2U1Adj/KgNBKIJq6vH79XslZQOpIRIvoLDgDgdJhnXmrkf8jDukClaYsqlqCAtu1gnRsXYbtm9XqL7FmZLx/cHmOYuAtWk13j/KdkFqNT8+eUq34aZeIX0SDuIhbFtKl3e99tvGkxpis0XJb+M0roaBUjO2KA6KtSrfboZkr0KY5x/arF+yic01ibKPVmK4+bm41SHvaOSyWhlQOp2cZUKLXOXQXcXOgUnSaxrONvT/Ok4SZdcdhmCLnnBDRNIIxQakQnCPB/8n1GYIzMw5wvXP9NGCF3w72CdOpkwJv9Td1AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;losant diagram&quot;
        title=&quot;&quot;
        src=&quot;/static/losant-diagram-79475c1222cb458051aae709e17dddf8-e9535.png&quot;
        srcset=&quot;/static/losant-diagram-79475c1222cb458051aae709e17dddf8-d32c5.png 216w,
/static/losant-diagram-79475c1222cb458051aae709e17dddf8-06f31.png 432w,
/static/losant-diagram-79475c1222cb458051aae709e17dddf8-e9535.png 864w,
/static/losant-diagram-79475c1222cb458051aae709e17dddf8-ab1f5.png 1296w,
/static/losant-diagram-79475c1222cb458051aae709e17dddf8-39365.png 1500w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Losant makes it simple to interact with hardware. Using the Losant platform and SDK, we can collect data from devices and send commands back to devices.&lt;/p&gt;
&lt;p&gt;First, &lt;strong&gt;&lt;a href=&quot;https://accounts.losant.com/create-account&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;create an account or log into&lt;/a&gt;&lt;/strong&gt; Losant. Next, create an &lt;strong&gt;&lt;a href=&quot;https://docs.losant.com/applications/overview/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;application&lt;/a&gt;&lt;/strong&gt; for this project and create a &lt;strong&gt;&lt;a href=&quot;https://docs.losant.com/devices/overview/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;device&lt;/a&gt;&lt;/strong&gt; to obtain a device ID.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 53.96437303527768%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABJElEQVQoz42STUvEMBCG+xs97YKuUPUgfv0f/4wHYREUD9705B6kbJs2Sb/Sr/R1Jsoi3eB24CEJbZ7MMBMsVnc4Dq+wPL3Eydk11usnPL+84mgR7rP0w3fDi1uszm8QKKUgRIo4TqC1dvB+u40hpURdVQ5janRde5Cg63q0bYemad3KlFWNPC9I0mAcR/R9T99/9lOmEcATLLDWEvRYXzrZX/4Lr7CkErn0YRh+xX5mZ2iVxKjVQWxRzBMWUUQNUZDUMKX0XslMVdewJJ0lrESGRgiMuXYM1O02TXfnHSSdl2FRIqFR4uwYyavOd+eMsucJmN0UFsaxcJKpjEXGGDdmXqGhtKe8bx7w+HaPz80HkiTFV6TckCtqlvunpFHKMvjufgNhPznCep6HewAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;losant create device&quot;
        title=&quot;&quot;
        src=&quot;/static/losant-create-device-573705604fe7cda49484d3e94d5b354f-e9535.png&quot;
        srcset=&quot;/static/losant-create-device-573705604fe7cda49484d3e94d5b354f-d32c5.png 216w,
/static/losant-create-device-573705604fe7cda49484d3e94d5b354f-06f31.png 432w,
/static/losant-create-device-573705604fe7cda49484d3e94d5b354f-e9535.png 864w,
/static/losant-create-device-573705604fe7cda49484d3e94d5b354f-ab1f5.png 1296w,
/static/losant-create-device-573705604fe7cda49484d3e94d5b354f-7539a.png 1728w,
/static/losant-create-device-573705604fe7cda49484d3e94d5b354f-ddd13.png 2592w,
/static/losant-create-device-573705604fe7cda49484d3e94d5b354f-9c366.png 2863w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;From the navigation menu in Losant, we can set up an &lt;strong&gt;&lt;a href=&quot;https://docs.losant.com/applications/access-keys/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;access key/secret&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50.94207955338451%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABL0lEQVQoz53RXUvCUBgH8H2f0HyprKugi75DV10nghIyprSxmyX5wjY2B32o7voCEbSZc266d23/jguEdIZ24McD55znz8M5VK5wgUK5guPSWVrvqlXUGw089SX0BjJU7TnT5dU1jvJl5AqnKJYqKJ6cI08yKIZhwLRaSCvTAk3TeOx08PIa4MOwYZoWxuYE5sSCNbUxsaZwPQ+qqoLj2C0Ux3HYJMsy3t51EuJg7gbwvBBhtFjzgxiapoHn+S1U1ma324MxsmE7PgmMUq4Xr83mERRF2T+wPxBJkw9n5v1iOy4+zRD6ODpsQlEUkSRJpsXyx3A43D9QkiSs1nL5Rd6LfI4+IgwEQYg4jtOzgwJXBEH4066+nYH/RbHsAzbVm7eo3d+gSdfQbreRdWeXb3e8Le18BxnYAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;losant access key secret&quot;
        title=&quot;&quot;
        src=&quot;/static/losant-access-key-secret-197049b674c7f6023ba6f6475882bda3-e9535.png&quot;
        srcset=&quot;/static/losant-access-key-secret-197049b674c7f6023ba6f6475882bda3-d32c5.png 216w,
/static/losant-access-key-secret-197049b674c7f6023ba6f6475882bda3-06f31.png 432w,
/static/losant-access-key-secret-197049b674c7f6023ba6f6475882bda3-e9535.png 864w,
/static/losant-access-key-secret-197049b674c7f6023ba6f6475882bda3-ab1f5.png 1296w,
/static/losant-access-key-secret-197049b674c7f6023ba6f6475882bda3-7539a.png 1728w,
/static/losant-access-key-secret-197049b674c7f6023ba6f6475882bda3-ddd13.png 2592w,
/static/losant-access-key-secret-197049b674c7f6023ba6f6475882bda3-c8b72.png 2866w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Now, you have a device ID, access key, and access secret. &lt;strong&gt;Be sure to update &lt;code&gt;index.js&lt;/code&gt; with these values.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;connecting-rollbar-and-losant&quot;&gt;&lt;a href=&quot;#connecting-rollbar-and-losant&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Connecting Rollbar and Losant&lt;/h3&gt;
&lt;p&gt;To connect Rollbar and Losant, we are going to use webhooks. Rollbar can &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/webhooks/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;send webhooks&lt;/a&gt;&lt;/strong&gt; based on rules, such as the 10^nth occurrence of an error. In our use case, our CTO can define the rules for the alarm within Rollbar based on his specific, per-project, requirements.&lt;/p&gt;
&lt;p&gt;Create a &lt;strong&gt;&lt;a href=&quot;https://docs.losant.com/applications/webhooks/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;webhook&lt;/a&gt;&lt;/strong&gt; in Losant. Then, copy the webhook URL into Rollbar.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 51.02751654475792%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABFklEQVQoz42Sy06DQBSGeUhdqDW10UYXavTtXGq6b1waBRY1rQjNcBvmwgC/MwNNqkEdki+HnMA35zLe8dk9pvNbTM6vbVwun/H4tMDByRyH+0zGOZpeYXZxg9nlHU61w8vSFFmWI7UxAyEESbLF65uPOI7BqgqMMUghoOr6X7ymaWBQSkENUUhpJbX+oOs6m5PD+z5jjzeWLMsSRVFgd1jbtqM4C4nv4zMIEYchIj+wkNUKMvqA0K0bGOfuQqHnyJNkIAaNIgtPdV6LDKZy95Yp7ReUUtBKWIGpqpf1FZr5urecUz3D0i7GxF1VBru8AWehvSZ600rVf/CL0NyvnwTrBV7eH5BsN+BaLgT/jr63Is8x9u8XXQns/+AhXkwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;losant webhook url&quot;
        title=&quot;&quot;
        src=&quot;/static/losant-webhook-url-27c966bd27ee27976393e1e05e27ddc8-e9535.png&quot;
        srcset=&quot;/static/losant-webhook-url-27c966bd27ee27976393e1e05e27ddc8-d32c5.png 216w,
/static/losant-webhook-url-27c966bd27ee27976393e1e05e27ddc8-06f31.png 432w,
/static/losant-webhook-url-27c966bd27ee27976393e1e05e27ddc8-e9535.png 864w,
/static/losant-webhook-url-27c966bd27ee27976393e1e05e27ddc8-ab1f5.png 1296w,
/static/losant-webhook-url-27c966bd27ee27976393e1e05e27ddc8-7539a.png 1728w,
/static/losant-webhook-url-27c966bd27ee27976393e1e05e27ddc8-ddd13.png 2592w,
/static/losant-webhook-url-27c966bd27ee27976393e1e05e27ddc8-d88c0.png 2871w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;In Rollbar, webhooks are configured per-project. In the Rollbar dashboard, pick a project and go to &lt;code&gt;Dashboard -&gt; Settings -&gt; Notifications -&gt; Webhook&lt;/code&gt;. Paste the Losant webhook URL there, like so:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50.670459162941896%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABHklEQVQoz62Sy0rEMBSG+/6vIS7czNaVguC4KbiV0YK0Q+09l6ZJ7/lNjoyLwowoHvgIHNIvf04aKDOg1QOk7iE6hxCY5/lPWGsRZEWFY5qRqOs6TNOE5BAhjmMkSUKbttX3PZqmAeccu+cK+zdGPRI+HT5w9Rjheh9hF767tD2klLBObt26SvGN5Qx2WejDcwRxwfFyrJE3khjGkVIsglPisixR1zVhjQGmEZcqyJzES7XWxOiEfjUujSmKDTm0O+S098TNQ4TbMP5KmG+EwzAgTVNKt67rryCh7Awq0UFpQ4P1j+JlbdvSLJVSlLpkCuFrjZ8q2DYWN/Sqqi4O/uKjbIW+mec54dMxxuj3OCfwt/E3ae7vsLqbBPjn+gTNfwhUfVhcBwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar webhook&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-webhook-3058095d67c2abc9a855335c1f2ef18a-e9535.png&quot;
        srcset=&quot;/static/rollbar-webhook-3058095d67c2abc9a855335c1f2ef18a-d32c5.png 216w,
/static/rollbar-webhook-3058095d67c2abc9a855335c1f2ef18a-06f31.png 432w,
/static/rollbar-webhook-3058095d67c2abc9a855335c1f2ef18a-e9535.png 864w,
/static/rollbar-webhook-3058095d67c2abc9a855335c1f2ef18a-ab1f5.png 1296w,
/static/rollbar-webhook-3058095d67c2abc9a855335c1f2ef18a-7539a.png 1728w,
/static/rollbar-webhook-3058095d67c2abc9a855335c1f2ef18a-185f9.png 2461w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;building-a-workflow&quot;&gt;&lt;a href=&quot;#building-a-workflow&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Building a Workflow&lt;/h3&gt;
&lt;p&gt;In Losant, workflows handle communication and logic between services and devices. All workflows start with a trigger, like a webhook. All workflows end with an output, like a device command. In between, Losant has tons of nodes that can accomplish tasks, like decisions based on &lt;strong&gt;&lt;a href=&quot;https://docs.losant.com/workflows/logic/conditional/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;logic&lt;/a&gt;&lt;/strong&gt; or connect to other services like &lt;strong&gt;&lt;a href=&quot;https://docs.losant.com/workflows/outputs/twilio/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Twilio&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To start, Let’s create a &lt;strong&gt;&lt;a href=&quot;https://docs.losant.com/workflows/overview/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;workflow&lt;/a&gt;&lt;/strong&gt;. Once created, we will start with the &lt;strong&gt;&lt;a href=&quot;https://docs.losant.com/workflows/triggers/webhook/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;webhook node&lt;/a&gt;&lt;/strong&gt; as our trigger. Each node has its configuration in the right panel of the dashboard. For the webhook node, we need to select the webhook we configured for Rollbar.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 53.814002089864154%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAACHUlEQVQoz21Sy2oUQRTtnxPc6ULROOIoJMQIislKgkhAbNy58QfElQtd+QgR4kpBJYMSHUfJzJB59Ew/5t3d9erq463KODNJLLh09a1b555zTzmF6+sortzBUnENtzc2US6X8Xb7Pc6eW8Ll4k1cLKwcxdXTcYHyV27cwvLqXb28toFL11ZdZzgcYjQaIYoieJ2u3YdhhG7XR4f++/0+GEvBOYeSElIKCjkNAaUkxuOxnkwm5q7rGCADahJSKqQsQa31AweH+4h6AbgQyPMcWutjX8aYbU5ghoyOej34vu863/68sUkhOMyKWR/vPj/GzpcnCAY1m8t0ZkEWAVMCDJoNeG0fo/FEc84MjuvslLaoG58VZlmGJEksAyPTrH9nc0ANqTJMvCbCRgPtTk/HSQqWpgbwIcmNkeV0MahAvihA7D6C2n8J8fw8stIz0BFydVy6aWzmaMhQaKsky1xne+8BMZEzBkopyxALlxfD5MxKhgOE9Rq61TqGrZZOfR88DF1n9+N9pH4AHce28OeY4cxeA/d+d5CQLH0C2O6pjpP7IzLCmKanXVS76Trl0iuaRRuyFx1Jm7I0M7Tz+w9DCxj4xLCOvudh4Hk6odeSVn65zlY1QhIns8Kcj6E+PYV4vQ5d+2BzOlOnQDXNz9bvV5B//a5pgMYs19k8CMkdNpdliskALdI50Ik3aMzgpECYeR82EVfrWtDjZ5y5fwFYpSJz/cByqQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;losant workflow webhook&quot;
        title=&quot;&quot;
        src=&quot;/static/losant-workflow-webhook-ff04b8561ba3aab78446c361c14303fb-e9535.png&quot;
        srcset=&quot;/static/losant-workflow-webhook-ff04b8561ba3aab78446c361c14303fb-d32c5.png 216w,
/static/losant-workflow-webhook-ff04b8561ba3aab78446c361c14303fb-06f31.png 432w,
/static/losant-workflow-webhook-ff04b8561ba3aab78446c361c14303fb-e9535.png 864w,
/static/losant-workflow-webhook-ff04b8561ba3aab78446c361c14303fb-ab1f5.png 1296w,
/static/losant-workflow-webhook-ff04b8561ba3aab78446c361c14303fb-7539a.png 1728w,
/static/losant-workflow-webhook-ff04b8561ba3aab78446c361c14303fb-ddd13.png 2592w,
/static/losant-workflow-webhook-ff04b8561ba3aab78446c361c14303fb-d88c0.png 2871w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Once we have received the webhook trigger, we are going to send a &lt;code&gt;rollbar-wemo-switch&lt;/code&gt; command to the device with a &lt;code&gt;state&lt;/code&gt; of &lt;code&gt;1&lt;/code&gt; to turn the alarm on.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 49.23023093072078%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABgElEQVQoz4WRTUsCQRzG5zN2NAItLF8yispvUBeDPoCXbtXNTuWhi3SIrBRU6FSg7qrrrvu+7qyrTzMjKwlqCz/Y/zD8eJ7/kHgyj2T2FInUMfazZ/is1dFsthCLpxFLZBZsc3azK9lLn+DwKI+D3DmIYRgwTROqqkKW++Czqmrsvyfo9wcYjz34vo9JEKxF1w2MRiOQnqzBtCw4joMgmAi6wxa+pXeousRkY8xms5XYts3CzAMNh0MoigJSvqPMrAtRdPH1q4hy9QJtpbpWxjFZG96Ay3RdF+3IT60B13VYpXmS6XQq0lJK4XneRqEtdeEO2EqYMBhpAkIfL2HKMgJ26GoSpNsMevc5OK0n0FIak1JqrdBTBiIVXwsPwiH0uQC908WUpfqbcFOyCHfQF4/BH2whnFQKoh4f+KXemGKn0cVWvYO2528UBhqryV7470do5QqWZS+EUcr/9scJ2c5gW0uQ4OWa7cBfEoYfN/AfcgjfiitF/C5vFYbhYo74BYDT3yuiO6+MAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;losant workflow device command&quot;
        title=&quot;&quot;
        src=&quot;/static/losant-workflow-device-command-fe591e111cd8e904a2952ef96995b21c-e9535.png&quot;
        srcset=&quot;/static/losant-workflow-device-command-fe591e111cd8e904a2952ef96995b21c-d32c5.png 216w,
/static/losant-workflow-device-command-fe591e111cd8e904a2952ef96995b21c-06f31.png 432w,
/static/losant-workflow-device-command-fe591e111cd8e904a2952ef96995b21c-e9535.png 864w,
/static/losant-workflow-device-command-fe591e111cd8e904a2952ef96995b21c-ab1f5.png 1296w,
/static/losant-workflow-device-command-fe591e111cd8e904a2952ef96995b21c-7539a.png 1728w,
/static/losant-workflow-device-command-fe591e111cd8e904a2952ef96995b21c-ddd13.png 2592w,
/static/losant-workflow-device-command-fe591e111cd8e904a2952ef96995b21c-1ba5b.png 2858w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;We do not want the alarm to continue forever; it could get annoying. So, twenty seconds is long enough for someone to see the warning and act upon it. To do this, we can use the &lt;strong&gt;&lt;a href=&quot;https://docs.losant.com/workflows/logic/delay/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;delay node&lt;/a&gt;&lt;/strong&gt; to pause the workflow for twenty seconds. Then, send a &lt;code&gt;rollbar-wemo-switch&lt;/code&gt; command to the device with a &lt;code&gt;state&lt;/code&gt; of &lt;code&gt;0&lt;/code&gt; to turn the alarm off.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50.71553228621292%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABmElEQVQoz4WSyUsDMRjF57+sBzfcKq5Vz4JevIkHb3r3bkXwoCiiVvQguLS4b11mX9rOkslMnknQotjqwCMJvPl97/sSpWdwDgOjOfQNT8n18uoaB4dHyPRm0cWV+VRX32hbdQ+MYyibw9DYLPpHpqG4rgvX9WAYBqo1FbZt872J93IZlUoVmqYjDAMQEoHGcVuFYQjLsuE4DpSa9ioPvh+A0oSL4qV2jodyAW7dAOE/MMZ+KUkSCfA8DyKUCKTrOpRCaR1BEHADbZkLpTXsXSzD9J7bwr6AqqrBME2YpiXl+z6UjfsyGpaFmLcljJTGsgAhBGEQ/AkUvjRNf0hZOSsi5PNiho7UuEe0OQG6PYPkdgdxfhJ0f6kjMNRsUMfjssF460zMcPHJRBRFki6MYm02mx2TfQc21ZqcY73ekAximVAWHg3YjtsC3tp19B7fIHN6J9v+C8h0TaZLPVdKdKnMP/CbJHEL2GqHP4X/EoqPVVSkW7tgbxV5lgmjiEjDl+KTVZD8FJJivi1MFBcFZZtcYhVvVVzSB2AM3YimBxSRAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;losant workflow delay&quot;
        title=&quot;&quot;
        src=&quot;/static/losant-workflow-delay-9dc15138aa4c09c96568680ee89499c7-e9535.png&quot;
        srcset=&quot;/static/losant-workflow-delay-9dc15138aa4c09c96568680ee89499c7-d32c5.png 216w,
/static/losant-workflow-delay-9dc15138aa4c09c96568680ee89499c7-06f31.png 432w,
/static/losant-workflow-delay-9dc15138aa4c09c96568680ee89499c7-e9535.png 864w,
/static/losant-workflow-delay-9dc15138aa4c09c96568680ee89499c7-ab1f5.png 1296w,
/static/losant-workflow-delay-9dc15138aa4c09c96568680ee89499c7-7539a.png 1728w,
/static/losant-workflow-delay-9dc15138aa4c09c96568680ee89499c7-ddd13.png 2592w,
/static/losant-workflow-delay-9dc15138aa4c09c96568680ee89499c7-d32be.png 2865w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;testing-the-light&quot;&gt;&lt;a href=&quot;#testing-the-light&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Testing the Light&lt;/h3&gt;
&lt;p&gt;In your terminal, log into the Edison, go to the directory of your project and run:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;npm start&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You should see your device’s name. You can also use a process monitor, such as &lt;strong&gt;&lt;a href=&quot;https://github.com/Unitech/pm2&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;PM2&lt;/a&gt;&lt;/strong&gt;, to keep the app running forever. Also, Intel has an &lt;strong&gt;&lt;a href=&quot;https://software.intel.com/en-us/intel-xdk&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;IDE&lt;/a&gt;&lt;/strong&gt; that makes it easy to deploy apps to the Edison. &lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 533px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 47.6547842401501%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAAA5klEQVQoz82Ry2qFUAxFfdBeFd8gvlCLoKKoCOJInYhOnPj/X7NLMrMtvVzooINFyD7JPgkR2o93vOUqBEG4YZrmN02SpFuuaRoej8e9LggC+L4Px3Fg2zZHz/Pgui5Db6ST9tXwR87zxL7vmKYJwzBg2zbM88w5sa4r50Qcx0jT9HdDKmjbFlEUYRxHNE2DMAxRliXHvu+R5zmKokDXdaiqClmWcQ/1kn4zrOsaSZJwMRk8XekZy7KAoFXp1+M42Py6Lp5EFMXXDHVd54uqqsoXMwwDiqLAsiy+oizLr04p4I/554af0rriUnmZGL8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;alarm start cli&quot;
        title=&quot;&quot;
        src=&quot;/static/alarm-start-cli-41de5b22dd8b2742281eb5c1e4d08704-b8038.png&quot;
        srcset=&quot;/static/alarm-start-cli-41de5b22dd8b2742281eb5c1e4d08704-94e09.png 216w,
/static/alarm-start-cli-41de5b22dd8b2742281eb5c1e4d08704-6ea9e.png 432w,
/static/alarm-start-cli-41de5b22dd8b2742281eb5c1e4d08704-b8038.png 533w&quot;
        sizes=&quot;(max-width: 533px) 100vw, 533px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;In Rollbar, we can send a test notification. Once pressed, if everything worked, the workflow in Losant will trigger and your light will turn on for twenty seconds. 🚨&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50.678175092478426%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABg0lEQVQoz42SS0sDMRDH88HEgw/04t2bgs+LH0FFrX4ML4IHv4J4EDzoyYsilFK7q23tJm03aR673d3+zWxhEcRH4EcmE2bmP5Owlb0zLG6fYG7jCMu7p1jYOsb8Jtk1LO3USpt2up9Z2//GnL9f3TosY2fXD8DMSKDPW+C9JvpRC8N+iMREcDpCnvaRj4lBSeHtX8kUWJZqSGOhrIVxBrExsImpfNZNbSJPuaf3I0UWg9lkDKmdD3AQygcqBeccsiz7mTRBpkdTrKn8eZ6DUYLXtw6EENBaw3pVPHhHEAQIwxBSSnxbMsYw6kF0O2i8tHD50EN3oJGmKVjzI8bFXQPnt3Vc3TfxFAoYM606mUxQFEUFnUt84ETJKV5l5fcwqS2eAo62iBENJOTIVEKoIuccURSVO6n/azHtZ/cc8lIVQUFJklTn//DS4ri4qaP+PvTfxjrU2wJqpKuENE9S9LXd/8JckvqBKgyVKV+X1FFS5R+LiOO49FH7149tjLPi15Y/AeLm4Ru3bxrIAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar test notification&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-test-notification-008759885ee36af7c5102ba2c7668c33-e9535.png&quot;
        srcset=&quot;/static/rollbar-test-notification-008759885ee36af7c5102ba2c7668c33-d32c5.png 216w,
/static/rollbar-test-notification-008759885ee36af7c5102ba2c7668c33-06f31.png 432w,
/static/rollbar-test-notification-008759885ee36af7c5102ba2c7668c33-e9535.png 864w,
/static/rollbar-test-notification-008759885ee36af7c5102ba2c7668c33-ab1f5.png 1296w,
/static/rollbar-test-notification-008759885ee36af7c5102ba2c7668c33-7539a.png 1728w,
/static/rollbar-test-notification-008759885ee36af7c5102ba2c7668c33-04651.png 2433w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h3 id=&quot;whats-next&quot;&gt;&lt;a href=&quot;#whats-next&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What&apos;s Next?&lt;/h3&gt;
&lt;p&gt;There is no limit to building a smart office, only your imagination. Here are some ways to extend this project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attach a button to serve as an “ack” to turn off the button.&lt;/li&gt;
&lt;li&gt;Attach a speaker for a sounding alarm.&lt;/li&gt;
&lt;li&gt;Connect multiple lights to control each by a different Rollbar trigger.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To create and learn more, Losant has compiled a list of great &lt;strong&gt;&lt;a href=&quot;https://docs.losant.com/getting-started/tutorials/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;tutorials and projects&lt;/a&gt;&lt;/strong&gt; you can use for inspiration for more projects. Any feedback or questions? Let us know in the comments!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Thank you to Taron and the team at &lt;a href=&quot;https://losant.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Losant&lt;/a&gt; for sharing this awesome tutorial and literally and physically :-) leading by example when it comes to being alerted to errors and exceptions. Bravo!&lt;/p&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you take control of your application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Women at Rollbar]]></title><description><![CDATA[Happy International Women's Day from all of us at Rollbar! To commemorate the day, the women of Rollbar thought it would be great to discuss…]]></description><link>https://rollbar.com/blog/women-at-rollbar/</link><guid isPermaLink="false">https://rollbar.com/blog/women-at-rollbar/</guid><pubDate>Wed, 08 Mar 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Happy International Women&apos;s Day from all of us at Rollbar! To commemorate the day, the women of Rollbar thought it would be great to discuss some of the experiences we have had as women in tech. &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 800px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHPclw54yj/xAAbEAABBAMAAAAAAAAAAAAAAAAAAQIDEQQTIv/aAAgBAQABBQLGrZJHxQhG5XMP/8QAFhEBAQEAAAAAAAAAAAAAAAAAIQEQ/9oACAEDAQE/AYmf/8QAFhEBAQEAAAAAAAAAAAAAAAAAIQIQ/9oACAECAQE/AaHP/8QAGxABAAICAwAAAAAAAAAAAAAAARARAAISITH/2gAIAQEABj8C7M5BVMur5H//xAAbEAEAAgIDAAAAAAAAAAAAAAABABEQITFRkf/aAAgBAQABPyG1lwnkPdrZbdjw4NFqMTfWM//aAAwDAQACAAMAAAAQH/8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAARAR/9oACAEDAQE/EGrc/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERIf/aAAgBAgEBPxBIkw//xAAZEAEAAwEBAAAAAAAAAAAAAAABABExUSH/2gAIAQEAAT8QoGTLS4Mw4KIY0czIhfXOMUFSxKvZNT//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rosie&quot;
        title=&quot;&quot;
        src=&quot;/static/rosie-124023499eb0189e33c70905190a45f8-5ca2a.jpg&quot;
        srcset=&quot;/static/rosie-124023499eb0189e33c70905190a45f8-0f39a.jpg 216w,
/static/rosie-124023499eb0189e33c70905190a45f8-5717a.jpg 432w,
/static/rosie-124023499eb0189e33c70905190a45f8-5ca2a.jpg 800w&quot;
        sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
&lt;sub&gt;Image via &lt;a href=&quot;http://www.recode.net/2015/4/19/11561636/code-documentary-maker-this-is-a-rosie-the-riveter-moment&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Recode&lt;/a&gt;&lt;/sub&gt;&lt;/p&gt;
&lt;p&gt;Currently &lt;strong&gt;&lt;a href=&quot;mailto:nellie@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Nellie&lt;/a&gt;&lt;/strong&gt;, who handles all office- and employee-related matters, is the only woman in the Rollbar office full-time. Aside from her, there is one other woman who works full-time, &lt;strong&gt;&lt;a href=&quot;mailto:rivkah@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rivkah&lt;/a&gt;&lt;/strong&gt;, our Support Engineer/Developer Advocate. We recently just met for the first time at our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/rollbar-all-together/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;quarterly on-site&lt;/a&gt;&lt;/strong&gt;, despite working together for six months. We have a unique distributed team at Rollbar, which is why the two of us hadn&apos;t met in person yet. We are definitely outnumbered by men in our workplace.&lt;/p&gt;
&lt;p&gt;There has been a lot of attention in the media recently about Susan Fowler, the woman who &lt;strong&gt;&lt;a href=&quot;https://www.susanjfowler.com/blog/2017/2/19/reflecting-on-one-very-strange-year-at-uber&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;wrote a blog post&lt;/a&gt;&lt;/strong&gt; on her time at Uber. We both found it disturbing, and yet sadly familiar. We have also experienced similar situations as Susan Fowler in previous workplaces. &lt;/p&gt;
&lt;p&gt;We recently discussed potential topics for blog posts, and the topic of women in the workplace came up. We both discovered we had experienced being the only female or one of a small percentage (&amp;#x3C; 3%) at multiple companies. We both also had encountered similar situations as Susan Fowler: unwelcome and highly inappropriate behavior which was reported to HR and not appropriately resolved. Reading Susan&apos;s story, we were both surprised and unsurprised, as the double standard of disbelieving women and questioning whether certain behavior was warranted has been a long-standing hot topic of debate and is unfortunately extremely common in our industry. &lt;/p&gt;
&lt;p&gt;Rollbar having mostly men (aside from the two of us) is the most extreme ratio of men to women in both of our experiences, especially since Rivkah is remote and Nellie is in the office daily. Interestingly enough, at Rollbar, the vibe is one of the warmest and most welcoming we have experienced, and the team is one of the smartest and kindest we have known. We believe that begins from the top. At Rollbar, the founders are both responsible for this, along with creating core values that mirror the kind of culture they want to build and the values they believe in.&lt;/p&gt;
&lt;p&gt;Despite all of the recent news about unacceptable behavior that goes without consequence, there are companies that exist which consist of mainly men and yet defy those old paradigms. Rollbar has a zero tolerance for behavior that would be considered questionable, unprofessional, or unethical. For that, we are grateful! Nellie does get asked often what it is like to be the only woman in an office full of men in a sympathetic tone, however here it&apos;s actually not something she really notices. It feels refreshing to say that despite the number of men or women, this is a team we have greatly enjoyed being part of.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you&apos;re interested in chatting about being a woman in tech, or you&apos;d like to work with us here at Rollbar &lt;strong&gt;(&lt;a href=&quot;https://rollbar.com/jobs&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;we&apos;re hiring&lt;/a&gt;!)&lt;/strong&gt;, please don&apos;t hesitate to reach out to either of us! Nellie can be reached at &lt;strong&gt;&lt;a href=&quot;mailto:nellie@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;nellie@rollbar.com&lt;/a&gt;&lt;/strong&gt;, and Rivkah&apos;s email is &lt;strong&gt;&lt;a href=&quot;mailto:rivkah@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;rivkah@rollbar.com&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;</content:encoded></item><item><title><![CDATA[Up your incident management alerts game with Rollbar and VictorOps]]></title><description><![CDATA[Resolving on-call errors can be faster and easier than ever before when you integrate  VictorOps  and  Rollbar . VictorOps is a fantastic on…]]></description><link>https://rollbar.com/blog/victorops-incident-management/</link><guid isPermaLink="false">https://rollbar.com/blog/victorops-incident-management/</guid><pubDate>Thu, 02 Mar 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Resolving on-call errors can be faster and easier than ever before when you integrate &lt;a href=&quot;https://victorops.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;VictorOps&lt;/a&gt; and &lt;a href=&quot;/signup/&quot;&gt;Rollbar&lt;/a&gt;. VictorOps is a fantastic on-call management tool that provides incident notifications to engineers to help teams resolve incidents faster and minimize downtime. We&apos;re excited to announce that you can now automatically send your Rollbar items to VictorOps, and get alerted to new errors quickly - before your users notice. &lt;/p&gt;
&lt;!--more--&gt;
&lt;h3 id=&quot;linking-rollbar-and-victorops&quot;&gt;&lt;a href=&quot;#linking-rollbar-and-victorops&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Linking Rollbar and VictorOps&lt;/h3&gt;
&lt;p&gt;To automatically turn your Rollbar items into Alerts in VictorOps, read on.&lt;/p&gt;
&lt;p&gt;Configuration is per-project in Rollbar. &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Head to the Notification settings page for a project: Dashboard -&gt; Settings -&gt; Notifications -&gt; VictorOps.
&lt;a href=&quot;&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 55.096774193548384%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABSUlEQVQoz5WTy27CMBBF+f9Vf6Wr7voLLKoSSkIEBCfBSZykkLft27ERrxZEY+lKfoxmzlzbk5CFmDsOXNeF53pWh8MBWuvRMmOiux7K87EKU1RVZZMZ1XWN0+ilxDqZw2cJRPFtz/b7/U3MJaHJLhUdNmjaFk3TWLU0P1VWSlmd9m1MfRtzTjj0EoHL8bncgkUceZ4jSRJ0XXeuPqgB0/kUX6sQaxajLEvkQkADdwgVERDhbz8ktXlNeL1/vf7rIU2cxQIzfwsv2IETnSEURDAMgw2SSiItI3y4G2zjFCLLkJFMN5zzc+sXD5/oEdFdQtl22L2+wfEZEcaIeYIsNRTCUprqHZGyKMJsGSATR49tDJ0bC249pKvXBRlcFo/V1CPe4WaG1fsL3XIARv4YX9I0o+o5iqKgR9hD8xj/HUcPzc94RFeN+zU/LBFWia2c+1sAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;victorops1&quot;
        title=&quot;&quot;
        src=&quot;/static/victorops1-29ac9ab181d7dfa9f5c25e918df4c2b4-e9535.png&quot;
        srcset=&quot;/static/victorops1-29ac9ab181d7dfa9f5c25e918df4c2b4-d32c5.png 216w,
/static/victorops1-29ac9ab181d7dfa9f5c25e918df4c2b4-06f31.png 432w,
/static/victorops1-29ac9ab181d7dfa9f5c25e918df4c2b4-e9535.png 864w,
/static/victorops1-29ac9ab181d7dfa9f5c25e918df4c2b4-ab1f5.png 1296w,
/static/victorops1-29ac9ab181d7dfa9f5c25e918df4c2b4-1ba43.png 1550w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In VictorOps, go to Settings (or Complete Setup) -&gt; Alert Behavior -&gt; Integrations, and choose Rollbar.
&lt;a href=&quot;&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 26.183282980866064%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAx0lEQVQY021Qyw7CMAzb//8QR+DKBU0gEEcQGjC6dvTB1nSd6QJDgIhkRXXk2E12KgXEVUBrDSJC3/eMGCPW0xmqqoJSit8j773H/nBEWZYIIXxpsq7rmByWDX0gGc0dpigQbjWorhGNTjCIyTgG+q/hhb6FsxZSSnYeKyqJ5TaHEALOuTffk4c+n5CvNiiS4dcspcwutoUy9v2tT9ByzuJnuhdS8i4GtGT4TL+abCcdhG3Y6feGtJhw6pEb+dY3OIs9awZ8zh9pJYPlID8dTAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;victorops2&quot;
        title=&quot;&quot;
        src=&quot;/static/victorops2-93ec29e55d056b65371a04b0b1fe5f94-e9535.png&quot;
        srcset=&quot;/static/victorops2-93ec29e55d056b65371a04b0b1fe5f94-d32c5.png 216w,
/static/victorops2-93ec29e55d056b65371a04b0b1fe5f94-06f31.png 432w,
/static/victorops2-93ec29e55d056b65371a04b0b1fe5f94-e9535.png 864w,
/static/victorops2-93ec29e55d056b65371a04b0b1fe5f94-ab1f5.png 1296w,
/static/victorops2-93ec29e55d056b65371a04b0b1fe5f94-7539a.png 1728w,
/static/victorops2-93ec29e55d056b65371a04b0b1fe5f94-aea22.png 1986w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &quot;Enable Integration&quot; if it&apos;s not already enabled.
&lt;a href=&quot;&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 29.684763572679508%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAlUlEQVQY062R3Q7CIAyF9/7v6IWJi8MRsS0ouMERiIvDvxtt8oU2oSfnQCc+QvyMi/f4R3VEGptdj3EckVL6XdA5B6UU9sMAm3tmhohk7B2pWGubc6HcXwghFMFzFeyVxvZA0IYfC+tloka8UMy8OFwPTeRrwESMOS+Zk+DI2T1JnSdjgBjfR/72HjF/VBF4JuZon+oGPoLWEGPGUdQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;victorops3&quot;
        title=&quot;&quot;
        src=&quot;/static/victorops3-520a87f0816bc2089431aefab70e3947-e9535.png&quot;
        srcset=&quot;/static/victorops3-520a87f0816bc2089431aefab70e3947-d32c5.png 216w,
/static/victorops3-520a87f0816bc2089431aefab70e3947-06f31.png 432w,
/static/victorops3-520a87f0816bc2089431aefab70e3947-e9535.png 864w,
/static/victorops3-520a87f0816bc2089431aefab70e3947-ab1f5.png 1296w,
/static/victorops3-520a87f0816bc2089431aefab70e3947-7539a.png 1728w,
/static/victorops3-520a87f0816bc2089431aefab70e3947-35ca1.png 2284w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy the API key from VictorOps. In Rollbar, enter the API and routing keys, and click &quot;Enable VictorOps Integration.&quot;
&lt;a href=&quot;&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 43.6%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABBklEQVQoz52R20rEMBCG8/7voA/hAW9EvfRGdoWKB8SWdVuaUGvbHLbdHn4zcSPbpVJx4INMkvkz/4RVugaRSwMpFYwxaNv2X1Cw8D1BnufQWjux9fIE4vkGSZIgyzI0TTPCF/4W7Hyxwpnl+jHBU5xDxQu0RYiu637o+37EMAyTOMHLIMbtK8fdm0DIP90mHZrNBlVVOfaF54IFkYBSylkm9oNzjiiMIIRAmqYuL8sS2t6XUk7aZy/rDEUlR4LbbYO6rmFsToUk4K3OdriyNj8K6T6E8JZJgMTIstp1RGv/MOXE4RjY4Qv0k75ojourBxydBji2LO/DaUHf3Z+wMxyM/mY3ki+nMbn8mItb3gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;victorops4&quot;
        title=&quot;&quot;
        src=&quot;/static/victorops4-af5dd4d97bc4760d08d96959eb86673d-e9535.png&quot;
        srcset=&quot;/static/victorops4-af5dd4d97bc4760d08d96959eb86673d-d32c5.png 216w,
/static/victorops4-af5dd4d97bc4760d08d96959eb86673d-06f31.png 432w,
/static/victorops4-af5dd4d97bc4760d08d96959eb86673d-e9535.png 864w,
/static/victorops4-af5dd4d97bc4760d08d96959eb86673d-ab1f5.png 1296w,
/static/victorops4-af5dd4d97bc4760d08d96959eb86673d-7539a.png 1728w,
/static/victorops4-af5dd4d97bc4760d08d96959eb86673d-e3a7e.png 2500w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Congrats! You have now integrated Rollbar with your VictorOps account. Now, when a new error or higher occurs in Rollbar, it will create an Alert in VictorOps, which will be automatically resolved when it is resolved in Rollbar. If you want, you can customize the default rules by editing, adding, or deleting them. By bringing your Rollbar data into VictorOps, you can streamline your monitoring, minimize downtime, and resolve incidents faster.&lt;/p&gt;
&lt;p&gt;For more information, check out our &lt;a href=&quot;/docs/victorops&quot;&gt;integration docs&lt;/a&gt; for VictorOps. We also have an integration with another incident management alerts provider, PagerDuty; check out the docs &lt;a href=&quot;docs/pagerduty/&quot;&gt;here&lt;/a&gt;. To see if Rollbar integrates with any other tools you’re using, see our full list of integrations &lt;a href=&quot;/docs/tools/&quot;&gt;here&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you
defeat errors in production. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Using JavaScript source maps to debug errors]]></title><description><![CDATA[Some of the most common questions we get here at Rollbar deal with source maps:  What are source maps and what do they do?  How can you…]]></description><link>https://rollbar.com/blog/how-to-use-javascript-source-maps-to-debug-errors/</link><guid isPermaLink="false">https://rollbar.com/blog/how-to-use-javascript-source-maps-to-debug-errors/</guid><pubDate>Mon, 13 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Some of the most common questions we get here at Rollbar deal with source maps: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What are source maps and what do they do? &lt;/li&gt;
&lt;li&gt;How can you enable source mapping? &lt;/li&gt;
&lt;li&gt;Why aren&apos;t your source maps working properly? &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&apos;s explore Javascript source maps together, starting with the basics. &lt;/p&gt;
&lt;p class=&quot;highlightbox&quot;&gt;
Existing Rollbar users, go to our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/source-maps/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JavaScript source maps&lt;/a&gt;&lt;/strong&gt; documentation to get started. &lt;/p&gt;
&lt;p&gt;As web developers, we have two major goals. First, we want a highly performant website. Second, we want that website to be easy to debug and maintain. Unfortunately, these goals are often at odds with one other. If we minimize our JavaScript, we can achieve some of these goals. Minimizing JavaScript reduces the download size, and the smaller the payload for our website users, the better. If we combine our JavaScript files, we can also reduce the number of http requests. &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;For a highly performant website, we want to reduce the number of requests the browser has to make in order to fully load, render, and process the page. Furthermore, with transpilers, we can start using new JavaScript features before they are implemented by the browsers.&lt;/p&gt;
&lt;p&gt;Unfortunately, minimizing JavaScript also comes with some downsides: it&apos;s hard to debug, and we lose original filenames, line numbers, and column numbers. Luckily, &lt;strong&gt;&lt;a href=&quot;https://www.html5rocks.com/en/tutorials/developertools/sourcemaps/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;source maps solve this problem&lt;/a&gt;&lt;/strong&gt;. A source map is a file that provides a mapping from the minified line and column numbers back to the original file, line, and column. Source maps use Base64 VLQ encoding to reduce the size of the file, while still maintaining all required information.&lt;/p&gt;
&lt;h3 id=&quot;using-javascript-source-maps-in-rollbar&quot;&gt;&lt;a href=&quot;#using-javascript-source-maps-in-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Using JavaScript source maps in Rollbar&lt;/h3&gt;
&lt;p&gt;Rollbar supports using source maps to get meaningful stack traces while still using &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/debug-production-errors-in-minified-javascript-with-source-maps-and-rollbar/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;minified JavaScript in production&lt;/a&gt;&lt;/strong&gt;. Once you enable source mapping, you&apos;ll see the original source filename, line number, method name, and code snippet in your stack traces, and your error grouping should be more resilient to code changes. In order for the minified-to-source translation to work, we need at minimum a stack trace with column numbers, and a source map file. You&apos;ll get a stack trace with column numbers if you give Rollbar an Error object, in a browser that provides column numbers. Your source map file can optionally include any or all of the original source files referenced by the source map. You can include them using the &lt;code&gt;sourcesContent&lt;/code&gt; key. &lt;/p&gt;
&lt;p&gt;If Rollbar receives an occurrence with certain keys set in it, we will use any source maps that you have provided to us to decode your stack trace. The values that need to be set in your configuration are as follows:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;var _rollbarConfig = {
  // add these new params:
  payload: {
    client: {
      javascript: {
        source_map_enabled: true,
        code_version: &quot;some version string, such as a version number or git sha&quot;,
        // Optionally have Rollbar guess which frames the error was thrown from
        // when the browser does not provide line and column numbers.
        guess_uncaught_frames: true
      }
    }
  }
};&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;When we receive an occurrence that has these values, we will look up the source map by filename of the JavaScript file and the code_version specified. Then we will step through all the frames of the stack trace, and convert from the minified location to the original location. We store the source map package by project+version+minified URL. If you upload it more than once, each subsequent upload will overwrite the previous data.&lt;/p&gt;
&lt;p&gt;You have two options for providing your source map files to Rollbar: automatic download, or uploading your source maps. We recommend uploading your source map files, and you have two options for how to do this. One is to manually upload your source maps through our UI. Go to your project settings page, and click Source Maps. There, you&apos;ll be able to manually select the file you wish to upload. However, our recommended way to upload your source map files is to upload via our API at the beginning of your deploy script (before the new code is in production). Here&apos;s an example cURL command for how to do this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;curl https://api.rollbar.com/api/1/sourcemap \
  -F access_token=aaaabbbbccccddddeeeeffff00001111 \
  -F version=version_string_here \
  -F minified_url=http://example.com/static/js/example.min.js \
  -F source_map=@static/js/example.min.map \
  -F static/js/site.js=@static/js/site.js \
  -F static/js/util.js=@static/js/util.js&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;In the above example, our website is &lt;code&gt;http://example.com&lt;/code&gt;, we have a minified JavaScript file at &lt;code&gt;http://example.com/js/example.min.js&lt;/code&gt;, and we have a source tree like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;example/
example/static/js/example.min.js
example/static/js/example.min.map
example/static/js/site.js
example/static/js/util.js&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;If you want to have Rollbar automatically download your files, you need to provide a comment at the bottom of your JavaScript files that points to your source map file (for example: &lt;code&gt;*//# sourceMappingURL=URL_TO_SOURCE_MAP*&lt;/code&gt;). How does automatic downloading work? If we receive a JavaScript error, source maps are enabled, and we don&apos;t already have the source map for the current code version, we will schedule an attempt to download it. For each stack frame, we&apos;ll first download the minified source file and look for a &lt;code&gt;sourceMappingUrl&lt;/code&gt; comment. If it has one, we&apos;ll try to download that file and save it as the source map. Then for future errors, we&apos;ll use the source map to translate the minified frames back to original frames. This is the easiest method, but not suitable for all cases (such as if you don&apos;t want to expose your source map or code to the public web). It is also less reliable than the upload method, since the source map won&apos;t be downloaded yet when the first few errors come in. Because of this, we recommend the upload method for production use.&lt;/p&gt;
&lt;p&gt;However, if you&apos;re using the automatic download method, you can notify our API to trigger a download for each of your minified files. Doing this will reduce the number of errors that the source map isn&apos;t applied to, since we&apos;ll have a greater chance of downloading the source map before the first error after a deploy occurs. Here&apos;s a sample command for this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;curl https://api.rollbar.com/api/1/sourcemap/download
  -F access_token=aaaabbbbccccddddeeeeffff00001111 \  
  -F version=92429d82a41e930486c6de5ebda9602d55c39986 \  
  -F minified_url=http://example.com/static/js/example.min.js&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h3 id=&quot;tips-and-tricks-for-using-source-maps-with-rollbar&quot;&gt;&lt;a href=&quot;#tips-and-tricks-for-using-source-maps-with-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tips and tricks for using source maps with Rollbar&lt;/h3&gt;
&lt;p&gt;This all seems simple enough, but there are some common problems our users have run into. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don&apos;t forget to update the version number when you update your JavaScript. If you don&apos;t, the filename, line and column numbers will be incorrect. &lt;/li&gt;
&lt;li&gt;The value of &lt;code&gt;minified_url&lt;/code&gt; must be the full URL of the minified file. This should start with &lt;code&gt;http:&lt;/code&gt; or &lt;code&gt;https:&lt;/code&gt;, which we&apos;ll strip off.&lt;/li&gt;
&lt;li&gt;Make sure you&apos;re not missing one or both of the config params in the on-page JavaScript snippet. Set both &lt;code&gt;payload.client.javascript.source_map_enabled&lt;/code&gt; and &lt;code&gt;payload.client.javascript.code_version&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you&apos;re using the upload method, check to be sure that the &lt;code&gt;code_version&lt;/code&gt; used in the on-page snippet matches the version provided in the upload call.&lt;/li&gt;
&lt;li&gt;If you&apos;re using the download method, make sure your source map file or minified JavaScript source files are on a host that&apos;s reachable from the public internet, and are not gated behind an authorization wall.&lt;/li&gt;
&lt;li&gt;If the JavaScript error that you are expecting to be un-minified does not have column numbers, and you haven&apos;t enabled &lt;code&gt;guess_uncaught_frames&lt;/code&gt;, we won&apos;t be able to apply the source map. We need column numbers to be able to apply the source map without guessing.&lt;/li&gt;
&lt;li&gt;If your source map file combines multiple sub-maps into &quot;sections&quot; within the top level map, we unfortunately don&apos;t yet support this source map format (but we are planning to soon).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;May all your errors be easy to fix, and if you run into any issues, feel free to contact &lt;strong&gt;&lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Customer Support&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of pesky JavaScript errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the Rollbar Team - Andrew Ledvina]]></title><description><![CDATA[We're excited to introduce  Andrew Ledvina  as the newest member of the Rollbar team and Lead SDK Engineer. The timing couldn't have been…]]></description><link>https://rollbar.com/blog/meet-the-team-andrew/</link><guid isPermaLink="false">https://rollbar.com/blog/meet-the-team-andrew/</guid><pubDate>Fri, 10 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;re excited to introduce &lt;strong&gt;&lt;a href=&quot;https://github.com/rokob&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Andrew Ledvina&lt;/a&gt;&lt;/strong&gt; as the newest member of the Rollbar team and Lead SDK Engineer. The timing couldn&apos;t have been more perfect for Andrew to start during our &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/rollbar-all-together/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;quarterly all-hands last week&lt;/a&gt;&lt;/strong&gt;! He was able to have 1:1 meetings with the team, meet our remote team members in person, join for company outings and happy hours, and get an overall feel for the team! &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 500px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 89.20000000000002%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAASABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMBAv/EABUBAQEAAAAAAAAAAAAAAAAAAAID/9oADAMBAAIQAxAAAAGtlg9FIT7DawUv/8QAHxAAAgECBwAAAAAAAAAAAAAAAQIDABEEEBMhMTIz/9oACAEBAAEFAnuAgOTi7Rbx6dL2w/m3P//EABgRAAIDAAAAAAAAAAAAAAAAAAAhEBFC/9oACAEDAQE/AbQzMf/EABcRAAMBAAAAAAAAAAAAAAAAAAABERD/2gAIAQIBAT8BhFv/xAAbEAACAQUAAAAAAAAAAAAAAAAAEAECISIxgf/aAAgBAQAGPwKTK6lbKjq//8QAHBAAAgICAwAAAAAAAAAAAAAAABEBMSFBEHGx/9oACAEBAAE/IZSm4JlkuhPMiim8Ed60NFj0FXbi/9oADAMBAAIAAwAAABDwP/z/xAAaEQACAgMAAAAAAAAAAAAAAAAAARExQYHB/9oACAEDAQE/EGk3kkK2ujs//8QAFhEBAQEAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/EBbAn//EABwQAQACAwEBAQAAAAAAAAAAAAEAESFBUTFh8P/aAAgBAQABPxAGUdi6+1DBEDIpbyVzEeGoInojzrCzjZi4qoRmauUufJ+Z2J30T//Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;andrew&quot;
        title=&quot;&quot;
        src=&quot;/static/andrew-d3e968b4e0d328b52aa7f8452c4ac2c2-1e567.jpg&quot;
        srcset=&quot;/static/andrew-d3e968b4e0d328b52aa7f8452c4ac2c2-0b8bf.jpg 216w,
/static/andrew-d3e968b4e0d328b52aa7f8452c4ac2c2-22269.jpg 432w,
/static/andrew-d3e968b4e0d328b52aa7f8452c4ac2c2-1e567.jpg 500w&quot;
        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;As our Lead SDK Engineer, Andrew brings years of experience and extensive knowledge in many fields to the team. With his undergraduate studies completed at CU Boulder, Andrew holds a BS in Applied Mathematics with a Finance Emphasis, a BA in Economics and a BA in Chemistry. After graduation, Andrew then went on to receive an MA and PhD in the Department of Operations Research &amp;#x26; Financial Engineering at Princeton University.&lt;/p&gt;
&lt;p&gt;Prior to Rollbar, Andrew was the Director of Engineering at &lt;strong&gt;&lt;a href=&quot;https://www.flexport.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Flexport&lt;/a&gt;&lt;/strong&gt; and the company&apos;s first engineering hire. Andrew has also spent time working at companies like &lt;strong&gt;&lt;a href=&quot;https://gigster.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Gigster&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://www.facebook.com/Engineering/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Facebook&lt;/a&gt;&lt;/strong&gt;, and even helped a friend with his health insurance startup &lt;strong&gt;&lt;a href=&quot;https://alan.eu/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Alan&lt;/a&gt;&lt;/strong&gt;, based in Paris, France.&lt;/p&gt;
&lt;p&gt;I was able to ask Andrew a few questions and let him share his thoughts on Rollbar. &lt;/p&gt;
&lt;p&gt;Q&amp;#x26;A with Andrew Ledvina:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What excited you about Rollbar or attracted you to the company?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I was working at a different startup and recognized the need to track, understand, and ultimately fix errors that always exist in production code. Searching around for different solutions to this problem I came across a few different companies that had a solution for this problem. I had a few criteria in mind when choosing between alternatives: support for JavaScript errors in the browser as well as errors on our backend servers, simplicity of getting started based on the documentation, and pricing that started free so I could try out the service before naturally having to pay as my traffic scaled. Rollbar fit all of my criteria better than the alternatives and we never really looked back as it helped us fix errors quickly.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;As a software engineer, I understand that errors are unavoidable when building systems in an effort to get features out to users as quickly as possible. There will always be bugs. Good tooling is therefore essential to having a product that is both high quality and able to move forward at a reasonable velocity. I see Rollbar as an essential part of every company&apos;s toolbox whether they currently know that or not. As someone who writes code for a living, it excites me to help others who write code to be more efficient. Rollbar is a utility in the best sense of that word.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What are you looking forward to working on (technically)?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My role is spread across all of the different SDKs that Rollbar both currently has and soon will offer. I am excited about writing code in a large variety of different languages and paradigms, from imperative Python to functional Clojure and everything in between. There are both architectural challenges that span all of the SDKs as well as technical challenges in each particular language and framework that we want to support. I am looking forward mostly to working on the cross cutting problem of how best to interact with Rollbar from your code independent of what language or framework you choose to use.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How would you describe the culture?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The culture at Rollbar I would describe first and foremost as engineering driven. I was surprised during the interview process as well as after I started by the technical depth at every level and position that I have dealt with. In hindsight this fact is obvious considering the product, but nonetheless the quality bar is quite high. An important feature of building any good product is being able to empathize with the end user. At Rollbar, we are the same as our customers, we use our own product to monitor our own systems. That idea of building something you would want to use is a core part of the culture and permeates the discussions around features and the quality of the product.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What&apos;s your vision for the SDKs at Rollbar? What would you hope to achieve in the next 6 months?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Our SDKs are the main bridge between our client&apos;s code and our service, and as such are vitally important. My main goals for the next 6 months revolve around bringing consistency and feature parity to all of the notifiers we support. This means unifying the API used to interact with Rollbar from configuration through to sending errors. Along with this, I would like to get to a state where we have extremely high quality code that is thoroughly tested. Anytime you include a third party library in your code you are trusting someone else to have put in the effort to produce as error free code as possible. We want people to use our SDKs because they are rock solid and easy to use. I think that is true in some languages but not in others.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Being a bit of a language nerd, I am also excited to go more in depth in some languages and frameworks that I have only used tangentially. Languages like Go and Elixir are up and coming for a reason, and I would love to see official Rollbar support for them sooner rather than later.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun fact about yourself that you&apos;re willing to share?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My favorite animal is the Rock Hyrax, colloquially known as a dassie, which I discovered during a month spent in South Africa. The closest living relative to the hyrax is the elephant, which is quite surprising considering dassies are only about 20 inches long and weigh around 8 pounds. I spend my free time reading, running, and jumping out of airplanes.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As culture and core values are extremely important at Rollbar, Andrew&apos;s vision and personal perspective align with the company&apos;s mission to provide the best error monitoring solution for developers. Andrew&apos;s unique blend of engineering and data science, along with his interest in SDKs, make him a rare addition to the already diverse team.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your web and mobile application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Rollbar all together, quarterly all hands]]></title><description><![CDATA[This week was our first quaterly all-hands of 2017 for the full Rollbar team. This is exciting, as Rollbar are a  small and distributed team…]]></description><link>https://rollbar.com/blog/rollbar-all-together/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-all-together/</guid><pubDate>Thu, 09 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This week was our first quaterly all-hands of 2017 for the full Rollbar team. This is exciting, as Rollbar are a &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/about/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;small and distributed team&lt;/a&gt;&lt;/strong&gt; with members in Barcelona, Fort Worth, Las Vegas, Santa Monica and abroad. Most of us haven&apos;t all officially met aside from Slack, Google Hangouts or phone calls, so while we feel like we know one another from working together for some time, this has been long awaited! &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEDBP/EABYBAQEBAAAAAAAAAAAAAAAAAAIBA//aAAwDAQACEAMQAAABjpcM6yYz/8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAEQMSEzH/2gAIAQEAAQUCPlCtZyYTm6gYHn//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPwGI/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAECEkH/2gAIAQIBAT8BU1hZH//EABwQAAEEAwEAAAAAAAAAAAAAAAABAiFRAxExof/aAAgBAQAGPwJH2S9xGT0U1Zw//8QAGhABAAMBAQEAAAAAAAAAAAAAAQARIUFRgf/aAAgBAQABPyHq0JK7BcB+5G7E1hWlay9Wvhmu+vZ//9oADAMBAAIAAwAAABCXD//EABcRAQEBAQAAAAAAAAAAAAAAAAEAEXH/2gAIAQMBAT8Qdus9X//EABcRAQEBAQAAAAAAAAAAAAAAAAEAEVH/2gAIAQIBAT8QAYo6l//EABwQAQACAwEBAQAAAAAAAAAAAAERIQAxUUFh8P/aAAgBAQABPxCSdbAxj3Le+7htF8vuSjKfWOQqJbl5CAVZLi3PDqUZuX9BlgTKSDrP/9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;team&quot;
        title=&quot;&quot;
        src=&quot;/static/team-7a22bf53285eaad0ecf64d00aa4a3fe7-c69aa.jpg&quot;
        srcset=&quot;/static/team-7a22bf53285eaad0ecf64d00aa4a3fe7-2c497.jpg 216w,
/static/team-7a22bf53285eaad0ecf64d00aa4a3fe7-ec3f2.jpg 432w,
/static/team-7a22bf53285eaad0ecf64d00aa4a3fe7-c69aa.jpg 864w,
/static/team-7a22bf53285eaad0ecf64d00aa4a3fe7-d53dc.jpg 1296w,
/static/team-7a22bf53285eaad0ecf64d00aa4a3fe7-25865.jpg 1728w,
/static/team-7a22bf53285eaad0ecf64d00aa4a3fe7-98e27.jpg 2592w,
/static/team-7a22bf53285eaad0ecf64d00aa4a3fe7-d793a.jpg 4032w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 133.33333333333331%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGQAAAwADAAAAAAAAAAAAAAAAAAMEAQIF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQME/9oADAMBAAIQAxAAAAHnW6uFZQK3DDPWYvKz/8QAHRAAAgEEAwAAAAAAAAAAAAAAAQIAERITIQMiMf/aAAgBAQABBQLavlcjOYvaC5Yt1NRFjcNSfTFFV//EABkRAAIDAQAAAAAAAAAAAAAAAAARARAhUf/aAAgBAwEBPwFCjtYf/8QAGBEAAwEBAAAAAAAAAAAAAAAAAAEREIH/2gAIAQIBAT8BqOYqf//EAB8QAAEDAwUAAAAAAAAAAAAAAAABESECEjIgM0Fhkf/aAAgBAQAGPwKDAxLWHufolEIJ5NyvzR//xAAdEAADAAICAwAAAAAAAAAAAAAAAREhMUFRYYGR/9oACAEBAAE/IbRwFtP0jhz7MDjVyJRYLsPrT6GkTy2NVjO0MjDwkNBgKRT/2gAMAwEAAgADAAAAECskTP/EABkRAAMBAQEAAAAAAAAAAAAAAAABETEh8P/aAAgBAwEBPxCnh4InIN1h/8QAGhEAAgMBAQAAAAAAAAAAAAAAABEBITFBof/aAAgBAgEBPxBdTop56HLZTp//xAAgEAEAAgIBBAMAAAAAAAAAAAABABEhMWFBUXHBgaHh/9oACAEBAAE/EFW4ao8y6CD2WfqOWkdH8Q26YRapcixdTZHtxKZVZ0alBCmjplzADZm+5DQlciAeICni/maqxn3EGy+U6z//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;teamlunch&quot;
        title=&quot;&quot;
        src=&quot;/static/teamlunch-16a9ec74694d10ddc3d88da1f70f60b6-c69aa.jpg&quot;
        srcset=&quot;/static/teamlunch-16a9ec74694d10ddc3d88da1f70f60b6-2c497.jpg 216w,
/static/teamlunch-16a9ec74694d10ddc3d88da1f70f60b6-ec3f2.jpg 432w,
/static/teamlunch-16a9ec74694d10ddc3d88da1f70f60b6-c69aa.jpg 864w,
/static/teamlunch-16a9ec74694d10ddc3d88da1f70f60b6-01332.jpg 1224w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;To add to the excitement, we also had a new hire start on Monday. We are extremely happy to welcome &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/meet-the-team-andrew/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Andrew Ledvina to our team as Lead SDK Engineer&lt;/a&gt;&lt;/strong&gt;. As a remote team member, Andrew is based in Santa Monica. We&apos;re thrilled to have him start during our quaterly all-hands and add his expertise and energy to the team!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/rivkahstandig3636&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rivkah Standig&lt;/a&gt;&lt;/strong&gt;, our awesome Support Engineer/Developer Advocate, joins us from her travels abroad, flying in from Iceland. As the one team member that most of us had not yet met, we are happy she could make this on-site during her year of remote work and travels! Our other remote team members flew in from near and far: &lt;strong&gt;&lt;a href=&quot;https://github.com/jondeandres&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Jon de Andres&lt;/a&gt;&lt;/strong&gt; (Engineering) came from Barcelona, &lt;strong&gt;&lt;a href=&quot;https://github.com/chrisbarmonde&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Chris Barmonde&lt;/a&gt;&lt;/strong&gt; (Engineering) from Las Vegas and &lt;strong&gt;&lt;a href=&quot;https://twitter.com/themlsmith&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Mike Smith&lt;/a&gt;&lt;/strong&gt; (Growth) from Fort Worth. With focus on our remote team, it should also be mentioned that our San Francisco team is pretty amazing as well. &lt;/p&gt;
&lt;p&gt;Some of the week&apos;s highlights (photos below) include a team lunch, a joint birthday happy hour and a group Thai cooking class in the Mission!&lt;/p&gt;
&lt;p&gt;The Thai cooking class was a hands-on team activity, where we split into teams and created elements of a 3 course meal together. The instructor was very informative; she added a lot of energy to the experience! Once we prepared our meal, we were able to sit and chat with each other over it. The setting was in a restored church loft in the Mission and provided cozy refuge from the rainy winter day. There was a lot of cooking, chatter, and laughter throughout the event. The team enjoyed it and left with the recipes in hand to try at home.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEDBP/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGTyWi2TB//xAAaEAEAAwADAAAAAAAAAAAAAAABAAIREhMi/9oACAEBAAEFAi88ZxJVCvYMxn//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEv/aAAgBAwEBPwFL/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8BV//EABkQAAMBAQEAAAAAAAAAAAAAAAABETEhAv/aAAgBAQAGPwJxI75kMLej1mn/xAAbEAADAQADAQAAAAAAAAAAAAAAAREhUXGBof/aAAgBAQABPyHRKH9I3dDxDTFXwPS1x5KN00f/2gAMAwEAAgADAAAAEDsf/8QAGBEBAQADAAAAAAAAAAAAAAAAAQARMVH/2gAIAQMBAT8QwrqFy//EABcRAQEBAQAAAAAAAAAAAAAAAAEAIVH/2gAIAQIBAT8Qwk9v/8QAHBABAQACAgMAAAAAAAAAAAAAAREAITFBUWGh/9oACAEBAAE/EBUyJAZo27xjGQh3qT3ra/MFsJWqu/udepCrN645b5wBMBwoHur0dYPBQ887c//Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;teamthai&quot;
        title=&quot;&quot;
        src=&quot;/static/teamthai-48dfb10056955b74135663962d7a0a32-c69aa.jpg&quot;
        srcset=&quot;/static/teamthai-48dfb10056955b74135663962d7a0a32-2c497.jpg 216w,
/static/teamthai-48dfb10056955b74135663962d7a0a32-ec3f2.jpg 432w,
/static/teamthai-48dfb10056955b74135663962d7a0a32-c69aa.jpg 864w,
/static/teamthai-48dfb10056955b74135663962d7a0a32-d53dc.jpg 1296w,
/static/teamthai-48dfb10056955b74135663962d7a0a32-e28f2.jpg 1632w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  

  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABAAD/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgAB/9oADAMBAAIQAxAAAAHE+pwmQ63/xAAbEAEBAAEFAAAAAAAAAAAAAAABAhEABBMhIv/aAAgBAQABBQLigAMu6o1jzJ3Ui//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABoQAAIDAQEAAAAAAAAAAAAAAAERABAhEjH/2gAIAQEABj8C6ZGUsiIdez//xAAcEAEAAwACAwAAAAAAAAAAAAABABEhMWFBUYH/2gAIAQEAAT8hdVNbPPX9lWMB6l1iCXd8M04J3LQM6qf/2gAMAwEAAgADAAAAEJ8//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAwEBPxCCUw//xAAWEQEBAQAAAAAAAAAAAAAAAAARAEH/2gAIAQIBAT8QZdv/xAAbEAEBAAIDAQAAAAAAAAAAAAABEQBBIWGBkf/aAAgBAQABPxAYkuJCXfnOOtsOohlPMYdcBSMGr1FyyR0okvzJUKGye5//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;thai1&quot;
        title=&quot;&quot;
        src=&quot;/static/thai1-ac034fe7ab8c23eff4ab34cb4e04a2a2-c69aa.jpg&quot;
        srcset=&quot;/static/thai1-ac034fe7ab8c23eff4ab34cb4e04a2a2-2c497.jpg 216w,
/static/thai1-ac034fe7ab8c23eff4ab34cb4e04a2a2-ec3f2.jpg 432w,
/static/thai1-ac034fe7ab8c23eff4ab34cb4e04a2a2-c69aa.jpg 864w,
/static/thai1-ac034fe7ab8c23eff4ab34cb4e04a2a2-d53dc.jpg 1296w,
/static/thai1-ac034fe7ab8c23eff4ab34cb4e04a2a2-e28f2.jpg 1632w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  

  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGbSEy3E4f/xAAaEAADAQADAAAAAAAAAAAAAAABAgMABBES/9oACAEBAAEFAp2ZVXksrVoWpRPGAx6O/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGhAAAgIDAAAAAAAAAAAAAAAAAREAQQIQkf/aAAgBAQAGPwI4uo+iEhKOt//EABsQAQADAQADAAAAAAAAAAAAAAEAESFBMVFh/9oACAEBAAE/IbxEMXyFR4z0T54FhcUiUUJ27OxUva2f/9oADAMBAAIAAwAAABAAD//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAEDAQE/EEf/xAAXEQADAQAAAAAAAAAAAAAAAAAAARFB/9oACAECAQE/ENpWf//EAB0QAQACAwADAQAAAAAAAAAAAAERIQAxQVGRsdH/2gAIAQEAAT8QMRCTbDLVnU9ZUgi0KuZPDkWSSaxLue5yqCb+tZKzbJGv3GlWQoQTF5//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;thai2&quot;
        title=&quot;&quot;
        src=&quot;/static/thai2-e446241aafef0b24c0615d84cb071596-c69aa.jpg&quot;
        srcset=&quot;/static/thai2-e446241aafef0b24c0615d84cb071596-2c497.jpg 216w,
/static/thai2-e446241aafef0b24c0615d84cb071596-ec3f2.jpg 432w,
/static/thai2-e446241aafef0b24c0615d84cb071596-c69aa.jpg 864w,
/static/thai2-e446241aafef0b24c0615d84cb071596-d53dc.jpg 1296w,
/static/thai2-e446241aafef0b24c0615d84cb071596-e28f2.jpg 1632w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  

  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABQACBP/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHvO0aKkdTX/8QAGRAAAwEBAQAAAAAAAAAAAAAAAQIDABIR/9oACAEBAAEFAq1QpKoVqVHdB7DvDf/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EAB0QAAEDBQEAAAAAAAAAAAAAAAABISICEBIxMqH/2gAIAQEABj8CZ1JkdGdHKekUt//EABoQAQADAQEBAAAAAAAAAAAAAAEAESFBMeH/2gAIAQEAAT8hcC6VEK/kSrMaimNQnMHsTXk//9oADAMBAAIAAwAAABDUz//EABYRAQEBAAAAAAAAAAAAAAAAABEAAf/aAAgBAwEBPxAI2//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Q1UP/xAAaEAEBAQEBAQEAAAAAAAAAAAABEQAhQTFR/9oACAEBAAE/ELHQge58CcAOxnn8CYbULqHi96OVCT+m+6CIeb//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;thai4&quot;
        title=&quot;&quot;
        src=&quot;/static/thai4-db637e54b401f790080ad2cc67a6fde5-c69aa.jpg&quot;
        srcset=&quot;/static/thai4-db637e54b401f790080ad2cc67a6fde5-2c497.jpg 216w,
/static/thai4-db637e54b401f790080ad2cc67a6fde5-ec3f2.jpg 432w,
/static/thai4-db637e54b401f790080ad2cc67a6fde5-c69aa.jpg 864w,
/static/thai4-db637e54b401f790080ad2cc67a6fde5-d53dc.jpg 1296w,
/static/thai4-db637e54b401f790080ad2cc67a6fde5-e28f2.jpg 1632w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;On a final note, this quarterly all hands makes for a memorable one! We conclude the week of team meetings, gatherings and outings having a better sense of each other, our company mission, and are ready to continue the new year strong. &lt;/p&gt;</content:encoded></item><item><title><![CDATA[How GorillaStack used Rollbar to level up logging with the Serverless framework]]></title><description><![CDATA[Our friends at GorillaStack wanted to share how they set up Rollbar with the Serverless framework, and made a handy tool so you can do the…]]></description><link>https://rollbar.com/blog/how-gorillastack-used-rollbar-to-level-up/</link><guid isPermaLink="false">https://rollbar.com/blog/how-gorillastack-used-rollbar-to-level-up/</guid><pubDate>Tue, 07 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Our friends at GorillaStack wanted to share how they set up Rollbar with the Serverless framework, and made a handy tool so you can do the same.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here at &lt;strong&gt;&lt;a href=&quot;https://www.gorillastack.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GorillaStack&lt;/a&gt;&lt;/strong&gt;, we are big lovers of the &lt;strong&gt;&lt;a href=&quot;https://github.com/serverless/serverless&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Serverless&lt;/a&gt;&lt;/strong&gt; framework. By default, the Serverless framework uses &lt;strong&gt;&lt;a href=&quot;https://aws.amazon.com/cloudwatch/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CloudWatch&lt;/a&gt;&lt;/strong&gt; logs to store any system log messages and output from your lambda code. Pretty quickly, we found ourselves needing to escalate log messages such that we could be notified of application errors and act on them more proactively.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;img src=&quot;/assets/fail-128fe53d16665535e6bf537b0fb42139.gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enter Rollbar. I have been using their service on many side projects since discovering their free tier some years ago.  We also robbed them of almost all their swag at the last &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/join-rollbar-at-aws-reinvent/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;re:Invent conference&lt;/a&gt;&lt;/strong&gt;. Rollbar is a great system to use for escalating errors and messages from your applications. Best of all, there are options for adding it as a transport for popular logging solutions. As users of the node module &apos;winston&apos;, we found a transport available for Rollbar. Unfortunately, it wasn’t quite up to date, and didn’t format certain argument orders correctly, so we forked it ourselves. :) &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/GorillaStack/winston-rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://github.com/GorillaStack/winston-rollbar&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using this integration with your application logging library, messages of all levels will still be logged to CloudWatch logs, but those at or above a configured log level will be escalated to Rollbar, which will then notify you of application errors as they occur.&lt;/p&gt;
&lt;p&gt;As we usually do, we decided to &lt;strong&gt;&lt;a href=&quot;https://github.com/GorillaStack/serverless-rollbar-example&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;publish an open source example&lt;/a&gt;&lt;/strong&gt; to demonstrate our approach. To get started, the only thing you will need is a Rollbar API token. Simply export this into your environment before deploying our example repository to see it in action.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;token function&quot;&gt;export&lt;/span&gt; ROLLBAR_SERVER_ACCESS_TOKEN&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;_access_token_here_&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone git@github.com:GorillaStack/serverless-rollbar-example.git
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;
sls deploy
sls invoke -f happyEndpoint
sls invoke -f unhappyEndpoint
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You will receive an email after invoking the &lt;code&gt;unhappyEndpoint&lt;/code&gt; with a summary of the &lt;code&gt;error&lt;/code&gt; log message.  If you check your CloudWatch logs, you will see log messages of all levels.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 78.44739530132789%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsSAAALEgHS3X78AAABtklEQVQoz5WSwUrDMBzGfQcfwJvC7jv6CrsMxnwAbyLi3buwPcJu4k1hu4iHidB5cM6JiDI2HXU62y3GarckTZqkMTVF52CDfYSSpN+P//dPsqRmq91ul8vlSqVS/lEYhlOGpTlwsVjYyC5nMplcLpdKpTzPWwAuFAprqyv5fD6bzabT6cXgbrfbaDQsy6rX681mUwixAKybpEHAGNNzzrleRlE0A46kioTgjIc0kpxRIrWfBQQjvaN/6aGXQYClCM1yEo5TUUrd166uE1dmsfrtu0/gGouQ0rq1uZDGPw07ndpZKS+xx5Ev8VhRcr613q8eGkvLdlObpfveRwLrUr7vw+GL4kzhMYI9++ZICvZ7q+7VqQC2meua1sOAiyiBpZT6GPRXYV8JLgmhnZY5JCMmqKKBIkgJUTzY+ULwN2kcezwaxW4dmyDmvj3v7SYYYxjjEfKThgO8X9ru9Jv/4MmeCSEAgDjIX+UkhW7QcRwIIXMvHh+uwdCdhCNzAVODcTy1E6JB/6X3AcG8R/LX8wzNg5/s1nG1VrtsVE7Orm7uvM+vBWCMIByNB+DdGQB3+G5ezqS+ASxShQp8Qn5WAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar serverless aws&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-serverless-aws-9fd15bb6ecb9fce991d6c122865ac272-e9535.png&quot;
        srcset=&quot;/static/rollbar-serverless-aws-9fd15bb6ecb9fce991d6c122865ac272-d32c5.png 216w,
/static/rollbar-serverless-aws-9fd15bb6ecb9fce991d6c122865ac272-06f31.png 432w,
/static/rollbar-serverless-aws-9fd15bb6ecb9fce991d6c122865ac272-e9535.png 864w,
/static/rollbar-serverless-aws-9fd15bb6ecb9fce991d6c122865ac272-ab1f5.png 1296w,
/static/rollbar-serverless-aws-9fd15bb6ecb9fce991d6c122865ac272-7539a.png 1728w,
/static/rollbar-serverless-aws-9fd15bb6ecb9fce991d6c122865ac272-65a45.png 1958w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;This is a simple example of how to very simply level up your lambda logging using Rollbar.  Have you achieved this in a simpler way?  Let us know in the comments. &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you take control of your application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Connect Rollbar to your source code and issues in GitLab]]></title><description><![CDATA[Good news for GitLab users! You can now deep link error stack traces in Rollbar directly to the code in your GitLab repos. Rollbar now…]]></description><link>https://rollbar.com/blog/rollbar-integration-for-gitlab/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-integration-for-gitlab/</guid><pubDate>Tue, 31 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Good news for GitLab users! You can now deep link error stack traces in Rollbar directly to the code in your GitLab repos. Rollbar now supports GitLab&apos;s native issue tracking features, allowing you to seemlessly debug and manage new issues as they happen in your existing workflow. We’ve rolled out support for source control for both GitLab.com and self-hosted. Issue tracking only supports GitLab.com, self-hosted support is coming soon.&lt;/p&gt;
&lt;h3 id=&quot;linking-source-code-in-gitlab-to-rollbar-stack-traces&quot;&gt;&lt;a href=&quot;#linking-source-code-in-gitlab-to-rollbar-stack-traces&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Linking source code in GitLab to Rollbar stack traces&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;/docs/gitlab/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 51.0586319218241%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABrUlEQVQoz2WS246bQAyGecuqITAQSG6Tp8jm0AeoVtW22ifbbrQNMMBwmAG6pPprT7soUS4+2Z7BP7bHznK5BBNGMVar1UQcxzgcDijLEkopa5miKDAMw0RfpBh0PcUOiwXhAp/mAhGJCvL5LIoiHI9HaK2R57kVYrIsI2GFoqzQdd0N/K0Tx5FNXpAYC4b/LceH45fpz6brYYyZkq/9axxODIKFrZIti3/AFVZKom1KoqZKU0iZoCwkVJ5BkTUyQ50lyE4vUKefcDjR9318ns0nXE/A8wV2u71t46Ndbp3nWVWVrXocxzusoBCChNyJGeG6LrbbLfqKBt62OL28Qp7eoGUBkzMlVVdQnMMUJcZGY6zbK0HXmyqckT/3fDw87NBUlNRUSM6/UJ/P6DIaQS7pYcjyncrJlhb2J8H5/J8ItypEABEE2O/3GH4PeB/f0ff0KJ2x8eXPxZ6Nl/EOK7her/H18cny+O07nn48w/M8muEOLbXLqyKlJCtvdpLv7mcYhliS6GazuYEFucKubtC3Gr02qGj/0tc3SJpnk6QwKbWdZNBkTaGgaTf/AhXvfiAubicqAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;stacktrace gitlab linked&quot;
        title=&quot;&quot;
        src=&quot;/static/stacktrace-gitlab-linked-ba274a546ec9f677430afae7ca95f45f-e9535.png&quot;
        srcset=&quot;/static/stacktrace-gitlab-linked-ba274a546ec9f677430afae7ca95f45f-d32c5.png 216w,
/static/stacktrace-gitlab-linked-ba274a546ec9f677430afae7ca95f45f-06f31.png 432w,
/static/stacktrace-gitlab-linked-ba274a546ec9f677430afae7ca95f45f-e9535.png 864w,
/static/stacktrace-gitlab-linked-ba274a546ec9f677430afae7ca95f45f-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Whenever Rollbar detects errors in your application, you receive a detailed stack trace. By connecting your GitLab repos, you can also click through from the stack trace in Rollbar directly to the underlying code that broke in GitLab. It&apos;s like having x-ray vision for your application errors.&lt;/p&gt;
&lt;h3 id=&quot;turn-errors-in-rollbar-into-trackable-issues-in-gitlab&quot;&gt;&lt;a href=&quot;#turn-errors-in-rollbar-into-trackable-issues-in-gitlab&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Turn errors in Rollbar into trackable issues in GitLab&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;/docs/gitlab/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 34.53798767967145%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAAA1UlEQVQoz52Q2YrDMAxF/f+/15cpHUhDl5k0TXC8xPKWO5FgSinpSwXHiyRfrqzu/hfNuMf3cMC+b/C18mPbj+jcGaq/39C0Dc6XE259Bz87UAwoNX+EKqWAyTlDk0ZrjqBEqLVKnvdlWTb5f1vrIn2MSinBe495nnHVV+y6HQYzSE5rLfl3Ya2FMWZ1VjGOI2KMULzQKhpzBYtTykilSpGIxHkIQXjn9BnFjZOxcCGJSFwFQypynqbpIfYsyKPxfes7FLtg6yzwGs65zZHZNdd4otf4A/loILmNFeHeAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;gitlab1&quot;
        title=&quot;&quot;
        src=&quot;/static/gitlab1-3a3f75c1c72f601c7c8dd093803e0291-e9535.png&quot;
        srcset=&quot;/static/gitlab1-3a3f75c1c72f601c7c8dd093803e0291-d32c5.png 216w,
/static/gitlab1-3a3f75c1c72f601c7c8dd093803e0291-06f31.png 432w,
/static/gitlab1-3a3f75c1c72f601c7c8dd093803e0291-e9535.png 864w,
/static/gitlab1-3a3f75c1c72f601c7c8dd093803e0291-ab1f5.png 1296w,
/static/gitlab1-3a3f75c1c72f601c7c8dd093803e0291-7539a.png 1728w,
/static/gitlab1-3a3f75c1c72f601c7c8dd093803e0291-ac7ad.png 2435w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/docs/gitlab/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 40.88541666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAABCklEQVQoz52QzUrEMBSF88a+gCNdCoIv4a6OIi7diY6Cyix0VGRgVrW1tWnSNulPmvSYZnBTqDAuvtwTzr2HyyV5noMx5siyDGVZQik1SbNZTnpCCJDLNcOYiw+Ks9cYc4v/Ejk9cGr1fPWFk+Un/FUC/zl0//O3xHlXGwayd/2Ow4cIR48JvLt4y32M2W2Ig0Xk9BQz6+8vQng3ATzbf/yUgKx5gG9OwTmHlNIxrC5YiqIo0Pf9JELVyFsBI3KYWqJtW5AwjBAEAdKUQpttozYGnTYwpv8zcIyxc2TYglIKWdUoK4WyVq4KW2uldw8cnl92GR4HKd05iFYCnaVpmn+HDifKmsLetMIPaOJbCqETTIkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;gitlab2&quot;
        title=&quot;&quot;
        src=&quot;/static/gitlab2-fb5ffc699a09deae3f87eb7438fc5677-e9535.png&quot;
        srcset=&quot;/static/gitlab2-fb5ffc699a09deae3f87eb7438fc5677-d32c5.png 216w,
/static/gitlab2-fb5ffc699a09deae3f87eb7438fc5677-06f31.png 432w,
/static/gitlab2-fb5ffc699a09deae3f87eb7438fc5677-e9535.png 864w,
/static/gitlab2-fb5ffc699a09deae3f87eb7438fc5677-ab1f5.png 1296w,
/static/gitlab2-fb5ffc699a09deae3f87eb7438fc5677-7539a.png 1728w,
/static/gitlab2-fb5ffc699a09deae3f87eb7438fc5677-881ac.png 2304w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/docs/gitlab/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 38.798701298701296%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAAA3klEQVQoz42RPQ6CQBCF93TGQqyI7EILFlDYUBljQeIFbCB0wHW8gjcw/kAUEyNPx2TNZAnG4stsZnbezL4VjuNA47ouoihCmqbIsgxFUaCqqh5lWSIIAnie10MopaAhwSRJcLo0OJ5rNNfbm5Zxw+PZoes6xHH8uW8ipJQfsZkzg2VPsFwvcW3vg9R1g93+gHm4wHhqY2TZkIoJmhPCMESe54OQHavNFr7vg5YhyC6K3w1pAm0ppWJn+Y3a338QWt00lwuZtaGe3qfwzyGG8r9qQj+Lw5t4XjdyK8zaCzp6d0Oas9XqAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;gitlab3&quot;
        title=&quot;&quot;
        src=&quot;/static/gitlab3-7920a30b2f5b3a2f739b6138a5c1276d-e9535.png&quot;
        srcset=&quot;/static/gitlab3-7920a30b2f5b3a2f739b6138a5c1276d-d32c5.png 216w,
/static/gitlab3-7920a30b2f5b3a2f739b6138a5c1276d-06f31.png 432w,
/static/gitlab3-7920a30b2f5b3a2f739b6138a5c1276d-e9535.png 864w,
/static/gitlab3-7920a30b2f5b3a2f739b6138a5c1276d-ab1f5.png 1296w,
/static/gitlab3-7920a30b2f5b3a2f739b6138a5c1276d-7539a.png 1728w,
/static/gitlab3-7920a30b2f5b3a2f739b6138a5c1276d-ca1a0.png 2464w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rollbar now supports GitLab issue tracker. It&apos;s a fairly straightforward integration: When viewing an error in Rollbar, simply click the &quot;Create GitLab Issue&quot; button to send the error details to GitLab. You can also link an error in Rollbar to an existing GitLab Issue, by copying and pasting the URL for the GitLab Issue you would like to link.&lt;/p&gt;
&lt;p&gt;When you connect Rollbar and GitLab together, your debugging and error monitoring will become much more efficient. For more information, visit our &lt;strong&gt;&lt;a href=&quot;/docs/gitlab/&quot;&gt;GitLab documentation&lt;/a&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;a href=&quot;https://about.gitlab.com/press/releases/2017-01-19-rollbar-press-release.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;press release&lt;/a&gt;&lt;/strong&gt; for details.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Level up your issue and error tracking workflow when you connect &lt;strong&gt;&lt;a href=&quot;/&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt; to
&lt;strong&gt;&lt;a href=&quot;https://about.gitlab.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitLab&lt;/a&gt;&lt;/strong&gt;. GitLab users, signup and get &lt;strong&gt;&lt;a href=&quot;/gitlab2017/&quot;&gt;100,000 errors monitored for free&lt;/a&gt;&lt;/strong&gt; and let us help you take control of annoying application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Rollbar integration for the Ionic framework]]></title><description><![CDATA[Our friends at Cuttlesoft wanted to share how they use Rollbar to detect errors in Ionic built applications. Enjoy! At  Cuttlesoft , we use…]]></description><link>https://rollbar.com/blog/rollbar-integration-for-ionic/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-integration-for-ionic/</guid><pubDate>Fri, 06 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Our friends at Cuttlesoft wanted to share how they use Rollbar to detect errors in Ionic built applications. Enjoy!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;At &lt;strong&gt;&lt;a href=&quot;https://www.cuttlesoft.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Cuttlesoft&lt;/a&gt;&lt;/strong&gt;, we use Rollbar&apos;s excellent &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/features/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;full-stack error monitoring service&lt;/a&gt;&lt;/strong&gt; for pinpointing and fixing tricky bugs. Our team loves Rollbar for its integrations with other popular services (we get our error notifications via &lt;strong&gt;&lt;a href=&quot;https://slack.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Slack&lt;/a&gt;&lt;/strong&gt; so we’re constantly in the know). For building hybrid mobile and progressive web apps, we generally rely on &lt;strong&gt;&lt;a href=&quot;https://ionicframework.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ionic&lt;/a&gt;&lt;/strong&gt;. Ionic is an open-source framework for hybrid mobile app development maintained by &lt;strong&gt;&lt;a href=&quot;http://blog.drifty.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Drifty&lt;/a&gt;&lt;/strong&gt;. Built with &lt;strong&gt;&lt;a href=&quot;https://angularjs.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;AngularJS&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://cordova.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Cordova&lt;/a&gt;&lt;/strong&gt;, Ionic is a popular tool for mobile developers everywhere. To combine these two, we&apos;ve developed a method for integrating Rollbar error tracking with the Ionic stack. &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;We find it so useful that our co-founder and CTO Emily Morehouse wrote a tutorial for using our method of integration so that you too can harness the bug-squashing power of Rollbar + Ionic. Using just a few tools, we&apos;ll show you how to make Rollbar work in perfect sync with Ionic. Since Ionic is a hybrid framework, there are a few different services where Rollbar needs to be plugged in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Native iOS&lt;/li&gt;
&lt;li&gt;Native Android&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To do this, we&apos;ll use a few different plugins that help monitor each OS and stack layer. We&apos;ll use &lt;strong&gt;&lt;a href=&quot;https://github.com/emilyemorehouse/cordova-plugins-rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Emily Morehouse&apos;s fork of the Cordova Rollbar plugin&lt;/a&gt;&lt;/strong&gt; to catch native errors, and the &lt;strong&gt;&lt;a href=&quot;https://github.com/tandibar/ng-rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;ng-rollbar AngularJS plugin&lt;/a&gt;&lt;/strong&gt; to catch our Ionic application errors. Now, let&apos;s dive in. The first (and easiest) plugin to set up is the Cordova plugin, so let&apos;s knock that out first. We&apos;re assuming that you&apos;ve already created an account and project on Rollbar&apos;s site but if you haven&apos;t, go do that first.  &lt;/p&gt;
&lt;h2 id=&quot;catching-native-errors&quot;&gt;&lt;a href=&quot;#catching-native-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Catching Native Errors&lt;/h2&gt;
&lt;p&gt;Simply install the plugin:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code&gt;cordova plugin add https://github.com/emilyemorehouse/cordova-plugins-rollbar.git --variable ROLLBAR_ACCESS_TOKEN=&quot;&lt;rollbar_access_token&gt;&quot; --variable ROLLBAR_ENVIRONMENT=&quot;&lt;rollbar_environment&gt;&quot;&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Then, add the following code, probably in your run function and definitely after the device is ready. To use the Ionic platform ready trigger:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code&gt;$ionicPlatform.ready(function() {
    window.cordova.plugins.Rollbar.init();
});&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Or to use the Cordova deviceready listener:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code&gt;document.addEventListener(&apos;deviceready&apos;, function () {
    window.cordova.plugins.Rollbar.init();
});&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Either works fine, but we&apos;re a fan of the former. for a variety of reasons, it&apos;s generally not kosher to use variables through command line arguments (security of course, but also that running &lt;code&gt;ionic platform reset&lt;/code&gt; can completely mess up your project setup as variables are not always persisted in your configuration files), so be aware of the caveats with this approach. And that&apos;s it! All native crashes and errors will now be reported. It should be noted that native crashes are typically not caused by your application, but are super helpful if you&apos;re developing or using a plugin that could have issues.&lt;/p&gt;
&lt;h2 id=&quot;catching-javascript-errors&quot;&gt;&lt;a href=&quot;#catching-javascript-errors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Catching Javascript errors&lt;/h2&gt;
&lt;p&gt;To catch Javascript errors (the most important ones and ones that you&apos;re usually the most responsible for), you have a bit more setup and a lot more control over when and how these errors are caught. First off, let&apos;s get the dependencies installed:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code&gt;bower install ng-rollbar --save&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Now, let&apos;s get them included (we have bower set up so it installs to &lt;code&gt;lib&lt;/code&gt;, so adjust as necessary:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;lib/ng-rollbar/ng-rollbar.min.js&quot;&gt;&lt;/script&gt;&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Remember to include the module:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code&gt;angular
.module(&apos;myApp&apos;, [
	&apos;ionic&apos;,
    &apos;tandibar/ng-rollbar&apos;
]);&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Initialization must occur in your config function, though we find that it would make more sense to keep it in the run function as that&apos;s where every other initialization occurs. But the earlier the initialization is called, the better - since any exceptions that occur prior to initialization won&apos;t be caught and configuration happens before running. Place this in your config function:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code&gt;myApp.config([&apos;RollbarProvider&apos;, function(RollbarProvider) {
    RollbarProvider.init({
    	accessToken: &apos;&lt;your-application-token&gt;&apos;,
        captureUncaught: true,
    	payload: {
            environment: &apos;&lt;rollbar_environment&gt;&apos;
    	}
	});
}]);&lt;/rollbar_environment&gt; &lt;/your-application-token&gt;&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;That&apos;s it! Any error that&apos;s thrown will now be caught. This does not, however, work automatically with &quot;console.error&quot;s. If you&apos;d like to manually throw a Rollbar exception, you can use any of the following severities as long as you inject &lt;strong&gt;Rollbar&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code&gt;// Rollbar severities
Rollbar.critical(&quot;some critical error&quot;);
Rollbar.error(&quot;some error&quot;);
Rollbar.warning(&quot;some warning&quot;);
Rollbar.info(&quot;some info&quot;);
Rollbar.debug(&quot;some debug message&quot;);&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Another trick we like to use is to simply override the &lt;code&gt;console.\*&lt;/code&gt; functions and replace them with the Rollbar functions. Toss this into your run function if you want to convert all console logs into Rollbar messages, though we only use the error override in production and all others in development:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code&gt;console.error = Rollbar.error;
console.warn = Rollbar.warning;
console.info = Rollbar.info;
console.debug = Rollbar.debug;

// Duplicated use of Rollbar.info for console.log since an equivalent does not exist
console.log = Rollbar.info;&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;There you have it, Rollbar support for the Ionic Framework. If you&apos;re a fan of this tutorial, visit &lt;strong&gt;&lt;a href=&quot;https://www.cuttlesoft.com/blog&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;cuttlesoft.com/blog&lt;/a&gt;&lt;/strong&gt; for other helpful guides, open-source projects, and blog posts about all aspects of software development. Big thanks to Rollbar for building such a great service, and for letting us share our tutorial with you.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you take control of your application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Join Rollbar at AWS re:Invent]]></title><description><![CDATA[Join us this year at Amazon Web Services annual conference,  re:Invent ! Rollbar will be  participating along side of Atlassian  and other…]]></description><link>https://rollbar.com/blog/join-rollbar-at-aws-reinvent/</link><guid isPermaLink="false">https://rollbar.com/blog/join-rollbar-at-aws-reinvent/</guid><pubDate>Mon, 21 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Join us this year at Amazon Web Services annual conference, &lt;strong&gt;&lt;a href=&quot;https://reinvent.awsevents.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;re:Invent&lt;/a&gt;&lt;/strong&gt;! Rollbar will be &lt;strong&gt;&lt;a href=&quot;http://blogs.atlassian.com/2016/11/join-atlassian-team-aws-reinvent/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;participating along side of Atlassian&lt;/a&gt;&lt;/strong&gt; and other Atlassian ecosystem partners like &lt;strong&gt;&lt;a href=&quot;https://statuspage.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;StatusPage&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://splunk.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Splunk&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://puppetlabs.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Puppet&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://xmatters.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Xmatters&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://workato.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Workato&lt;/a&gt;&lt;/strong&gt;. We will all be in the Atlassian booth demonstrating how our solutions work better together. Come by and check it out - &lt;strong&gt;booth 2446&lt;/strong&gt;. &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Come join us at the event and see how integrating &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/integrations/atlassian/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar’s error monitoring&lt;/a&gt;&lt;/strong&gt; with Atlassian’s products provides teams with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instant error grouping and aggregation&lt;/strong&gt;: Errors are grouped by root cause and linked to your source code within &lt;strong&gt;&lt;a href=&quot;https://marketplace.atlassian.com/plugins/rollbar/cloud/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Bitbucket&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real-time notifications&lt;/strong&gt;: Intelligent alerting rules configured for &lt;strong&gt;&lt;a href=&quot;https://marketplace.atlassian.com/plugins/com.rollbar.com.hipchat/cloud/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;HipChat&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://marketplace.atlassian.com/plugins/com.rollbar.jira/cloud/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JIRA&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy workflow and prioritization&lt;/strong&gt;: Discover the most impactful errors with data and create issues in &lt;strong&gt;&lt;a href=&quot;/docs/jira/&quot;&gt;JIRA&lt;/a&gt;&lt;/strong&gt; instantly with rich data, contextual details and error analytics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faster time to resolution&lt;/strong&gt;: Debug, deploy fixes and track regressions much faster when your error data moves through &lt;strong&gt;&lt;a href=&quot;/docs/hipchat/&quot;&gt;HipChat&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;/docs/jira/&quot;&gt;JIRA&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;/docs/bitbucket/&quot;&gt;Bitbucket&lt;/a&gt;&lt;/strong&gt; automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--more--&gt;
&lt;p&gt;We&apos;d love to chat with you in person at AWS re:Invent. Make plans to stop by &lt;strong&gt;booth 2446&lt;/strong&gt; and say hi. We look forward to meeting you.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&quot;&quot;&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2016/2016-11-21-join-rollbar-at-aws-reinvent/reinvent-image.154717.o.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Deep link stack traces to Bitbucket and track Pipeline deploys]]></title><description><![CDATA[Good news for  Bitbucket  users! You can now deep link error stack traces in Rollbar directly to the code in your Bitbucket repos. Rollbar…]]></description><link>https://rollbar.com/blog/new-bitbucket-integrations/</link><guid isPermaLink="false">https://rollbar.com/blog/new-bitbucket-integrations/</guid><pubDate>Mon, 14 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Good news for &lt;a href=&quot;https://bitbucket.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Bitbucket&lt;/a&gt; users! You can now deep link error stack traces in Rollbar directly to the code in your Bitbucket repos. Rollbar also now integrates with &lt;a href=&quot;https://bitbucket.org/product/features/pipelines&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Bitbucket Pipelines&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;deep-links-to-your-source-code-in-bitbucket&quot;&gt;&lt;a href=&quot;#deep-links-to-your-source-code-in-bitbucket&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Deep links to your source code in Bitbucket&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;/docs/bitbucket/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 51.14006514657981%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAAB9ElEQVQoz1WSy4/SUBTG+S+NlD6AQlwRJbNwoSYEqF2YOLNQhzBEd8boyszEWbnxfzBxZQwMr77pg9IO/Tzn4pSxyZd772nuL9/5zq20Wq2C1WjqRbvdLqXrevHo8dPi+fgaZx+/YzD5BuP9NXrjS/THV+iNvuLk9Wc8efUJJ6df8Oz8Ei9GV6gQDFq9gQc1FU1dh0p7rjWbTRimiR+/FrAsC8FmgyRJYNs2ttsEaZrSmiLPc9z/KuQEDbpMDglC+8a/lWS8NDGbr+F6AeI4LoGx7yH2XLEmcYh8t0WepbglVRigaY1S7OxOpnkALtcewjASQNd1YTu2AAdBgCzdorjvkC8qioKH1VopSVYhKyoGgyFmN3NEUSTEQG7fdz04jgPbsmEROKQ48jw7AlVVJZBUqkqSJAm9Xg+//8ywthzhjB0xiMHLxQK+75MCynIrxPUjUJJLh1Xa12QF/cEA05sVHNenlkORI4M35Min/LLdDjtSlh203++PwFrtAOFWVVWDqmkwDENkuJj+LIciJk7OPM9HRLWQogijmKa+w+2+OAA7nQ7enF/gLendaIKLyQfIsox+v4/pfAXP34gMuWWbs3NoMAReLZcCHtO/jJ7PAVivo0VPp9vt/icGDodDrCi/YBOWQ2HoXV6cIZ/5TfKZ638BQnhxUprqcVwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;stacktrace bitbucket linked&quot;
        title=&quot;&quot;
        src=&quot;/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-e9535.png&quot;
        srcset=&quot;/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-d32c5.png 216w,
/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-06f31.png 432w,
/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-e9535.png 864w,
/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;h3 id=&quot;configure-pipelines-to-notify-rollbar-of-new-deploys&quot;&gt;&lt;a href=&quot;#configure-pipelines-to-notify-rollbar-of-new-deploys&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configure Pipelines to notify Rollbar of new deploys&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://bitbucket.org/rollbar/rollbar-bitbucket-pipelines&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2016/2016-11-14-new-bitbucket-integrations/rocllbar-bitbucket-pipelines.154649.o.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once Pipelines is configured, every deploy of your app will automatically be tracked in Rollbar. Making it easier to identify which code changes led to critical production issues.&lt;/p&gt;
&lt;p&gt;Rollbar integrates with the following Bitbucket features, &lt;strong&gt;&lt;a href=&quot;/blog/connect-rollbar-to-bitbucket-issue-tracker/&quot;&gt;Bitbucket Issue Tracker&lt;/a&gt;&lt;/strong&gt;, and now &lt;strong&gt;&lt;a href=&quot;/docs/bitbucket/&quot;&gt;Bitbucket repos&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://bitbucket.org/rollbar/rollbar-bitbucket-pipelines&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Bitbucket Pipelines&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;Don&apos;t forget Rollbar also integrates with other &lt;strong&gt;&lt;a href=&quot;/integrations/atlassian/&quot;&gt;Atlassian&lt;/a&gt;&lt;/strong&gt; products, like &lt;strong&gt;&lt;a href=&quot;/docs/jira/&quot;&gt;JIRA&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;/docs/hipchat/&quot;&gt;HipChat&lt;/a&gt;&lt;/strong&gt; and of course &lt;strong&gt;&lt;a href=&quot;/docs/bitbucket/&quot;&gt;Bitbucket&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dealing with errors can be time consuming and often an interruption in your everyday development workflow. It&apos;s important that we continue to work to improve this process and that we extend the capabilities and insights of your current toolset and workflows. We hope that you enjoy the new integration options!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Supercharge your issue and &lt;a href=&quot;/&quot;&gt;error tracking&lt;/a&gt; workflow when you connect &lt;a href=&quot;/&quot;&gt;Rollbar&lt;/a&gt; to
&lt;a href=&quot;https://bitbucket.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Bitbucket&lt;/a&gt;. Sign up for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you take control of your annoying production errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Join us for a panel discussion on DDoS attacks, DNS and more [EVENT]]]></title><description><![CDATA[Join us next week for  CircleCI's November Office Hours ! Cory Virok, Co-founder and CTO of Rollbar, along with others from the startup…]]></description><link>https://rollbar.com/blog/november-office-hours-meetup/</link><guid isPermaLink="false">https://rollbar.com/blog/november-office-hours-meetup/</guid><pubDate>Tue, 08 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Join us next week for &lt;strong&gt;&lt;a href=&quot;http://www.meetup.com/CircleCI-Office-Hours/events/233568990/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CircleCI&apos;s November Office Hours&lt;/a&gt;&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Cory Virok, Co-founder and CTO of Rollbar, along with others from the startup community will be participating in a panel discussion on &lt;strong&gt;&lt;a href=&quot;http://thenextweb.com/security/2016/10/21/massive-ddos-attack-dyn-dns-causing-havoc-online/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;October&apos;s DDoS attack&lt;/a&gt;&lt;/strong&gt; that took down a lot of the services we rely on in our everyday workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When&lt;/strong&gt;:
Wednesday November 16th @ 6pm PT &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where&lt;/strong&gt;:
&lt;strong&gt;&lt;a href=&quot;https://maps.google.com/maps?f=q&amp;#x26;hl=en&amp;#x26;q=325+9th+Street+%28between+Folsom+%26+Harrison%29%2C+San+Francisco%2C+CA%2C+us&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Heavybit 325 9th Street San Francisco, CA&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;strong&gt;Agenda&lt;/strong&gt;: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;6:00 - 6:30 pm: Networking, food and drinks.&lt;/li&gt;
&lt;li&gt;6:30 - 7:00 pm: Downtime Panel: October’s DDoS Attack Decoded.&lt;/li&gt;
&lt;li&gt;7:00 - 8:00 pm: Q+A and Networking.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Panelists and Moderator&lt;/strong&gt;: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scott Klein, Co-founder, &lt;strong&gt;&lt;a href=&quot;https://www.statuspage.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;StatusPage&lt;/a&gt;&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;Cory Virok, Co-Founder and CTO, &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;Lev Lazinskiy, Head of Technical Services, &lt;strong&gt;&lt;a href=&quot;https://circleci.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CircleCI&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Jim Rose (moderator), CEO, &lt;strong&gt;&lt;a href=&quot;https://circleci.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CircleCI&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RSVP for this event &lt;strong&gt;&lt;a href=&quot;http://www.meetup.com/CircleCI-Office-Hours/events/233568990/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;using this link&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This will be a fun and informative event. There will be food, drinks and free Rollbar swag. :-) Bring a friend or your entire team, the more the merrier. Hope to see you there!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you defeat annoying errors in your applications. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Correlate errors to feature rollout tests with Rollbar and Split]]></title><description><![CDATA[Our friends at Split wanted to let you know that you can now integrate Rollbar with Split. And take control of your error handling and…]]></description><link>https://rollbar.com/blog/actionable-feature-rollouts-with-rollbar-and-split/</link><guid isPermaLink="false">https://rollbar.com/blog/actionable-feature-rollouts-with-rollbar-and-split/</guid><pubDate>Thu, 03 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Our friends at Split wanted to let you know that you can now integrate Rollbar with Split. And take control of your error handling and feature rollouts - together. Enjoy! :-)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;&lt;/strong&gt; is an excellent error monitoring service that works across all of the languages Split supports. It’s great at telling you what’s going wrong and where, but doesn’t necessarily have all the details on why. That’s where Split comes in, with our &lt;strong&gt;&lt;a href=&quot;http://www.split.io/integrations/rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;new Rollbar integration&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We built Split to help teams take control of their deployments by slowly delivering features to targeted groups of users. In this way you can limit the scope of trouble when things do go wrong, killing the feature until it’s fixed, then slowly rolling it out again. Our new integration brings rollout metadata from features in Split into the Rollbar interface, so teams can quickly correlate errors against the latest deployments. &lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 29.76588628762542%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAARlAAAEZQAGA43XUAAAAfElEQVQY062OyQrEIBBE8/8fKbgyQ4xbFLxozXRDTrmEJA1Fl6KPt+TWoZSGlBJa639XMMbAWQv3+UIZi7LvuDrLGAMpJXjvsa4etdZHYWDOmQ0J3Fq7nROQLF8BkpkQ4h3DOScfti3wRYyRwWR97KOXUhBC4Df0p/d+yg8eGs4BD/S+TAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;split1&quot;
        title=&quot;&quot;
        src=&quot;/static/split1-6bfc018547923ca7828733b54d6cf7c5-e9535.png&quot;
        srcset=&quot;/static/split1-6bfc018547923ca7828733b54d6cf7c5-d32c5.png 216w,
/static/split1-6bfc018547923ca7828733b54d6cf7c5-06f31.png 432w,
/static/split1-6bfc018547923ca7828733b54d6cf7c5-e9535.png 864w,
/static/split1-6bfc018547923ca7828733b54d6cf7c5-4e034.png 1196w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;When it looks like a recently-released feature was responsible for the degradation of service, Rollbar users can click-through to Split to quickly take action, saving valuable time in the remediation process.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 43.43859649122807%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAARlAAAEZQAGA43XUAAABT0lEQVQoz32RX07CQBCHeydRwYREFKKiYDiDJryKCe32z0JfDWmVS8AF9BiQ6IOJiSZcQBIglmLS/pwdhFQtPnzZ3c7M19lZLX9UQ/64huxhBZn9MrYLp0ymUMZW4QQ7B2ep7FJ+tlhBrlhFrlTFXumcHZphCAjThGlbaAqbVgeubqDfuEL/uoFevY7e5cUPXKqxHJmKZloWbJJYtEopIR0H3s0NxsMh3gcDZjxcovaTp0f4FJetFuOomgSarutot9trWHh7h8lkinkwR8AECOchwjDEYrFAp9OhJmw4lGtJklJn6sxCk67boj+5rrum2+1iNp19C4MlHwHJPhHHMXzfZ4FC1a6bUcJmU+fNb2EURUScQsTxZP4KJdeEEDyLZMDzPIxGoz+8vL7h+eGe45uFhgFBr8YzocdRc5E0l+RVkqy+bxSmBVaFm4r+E34BftLdnxQn/gUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;split2&quot;
        title=&quot;&quot;
        src=&quot;/static/split2-0953f9519fedda060ee420bf2b85c466-e9535.png&quot;
        srcset=&quot;/static/split2-0953f9519fedda060ee420bf2b85c466-d32c5.png 216w,
/static/split2-0953f9519fedda060ee420bf2b85c466-06f31.png 432w,
/static/split2-0953f9519fedda060ee420bf2b85c466-e9535.png 864w,
/static/split2-0953f9519fedda060ee420bf2b85c466-ab1f5.png 1296w,
/static/split2-0953f9519fedda060ee420bf2b85c466-8f33d.png 1425w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Here&apos;s a a quick demo on how Rollbar and Split work together to make your controlled feature rollouts more productive. &lt;/p&gt;
&lt;iframe width=&quot;700&quot; height=&quot;460&quot; src=&quot;https://www.youtube.com/embed/4f1p6EIOrOg&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;br&gt;
Like you, we care deeply about giving your end-users the best experience possible, and Split’s controlled rollouts paired with Rollbar’s robust error notification make delivering on that promise easy. Our Rollbar integration is free to customers of both services, and you can always try **[Split free for 30 days](https://split.io)**. 
&lt;hr&gt;
&lt;p&gt;To learn more, visit our integration &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/docs/tools/split&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;documentation for Split&lt;/a&gt;&lt;/strong&gt;. To see if Rollbar integrates with other tools you’re using, see our full list of integrations &lt;strong&gt;&lt;a href=&quot;/docs/tools/&quot;&gt;here&lt;/a&gt;&lt;/strong&gt;. If you haven’t already, signup for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you defeat errors in production.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Postmortem from outage on October 21, 2016]]></title><description><![CDATA[We had a significant outage this past Friday, October 21. Many customers were not able to reach rollbar.com or api.rollbar.com, some data…]]></description><link>https://rollbar.com/blog/dns-ddos-postmortem/</link><guid isPermaLink="false">https://rollbar.com/blog/dns-ddos-postmortem/</guid><pubDate>Tue, 25 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We had a significant outage this past Friday, October 21. Many customers were not able to reach rollbar.com or api.rollbar.com, some data was lost, and a few customers experienced cascading issues caused by our API outage. The root cause was a Distributed Denial of Service (DDoS) attack on our DNS provider.&lt;/p&gt;
&lt;p&gt;We weren&apos;t the only service that had issues on Friday, but that is no excuse—we know that our customers rely on Rollbar as a critical monitoring service and it&apos;s all the more important that we are up when everything else is down. We&apos;d like to share some of the details about what happened and what we&apos;re doing to prevent this kind of issue from happening again.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;outage-timeline-and-resolution&quot;&gt;&lt;a href=&quot;#outage-timeline-and-resolution&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Outage Timeline and Resolution&lt;/h2&gt;
&lt;p&gt;All times PDT.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Approximately 4:00 a.m.: DDOS began against Dyn, Rollbar&apos;s DNS provider&lt;/li&gt;
&lt;li&gt;4:00 a.m. - 6:00 a.m.: A few Rollbar customers noticed problems and contacted our support team&lt;/li&gt;
&lt;li&gt;6:00 a.m.: First attack is mitigated by Dyn&lt;/li&gt;
&lt;li&gt;8:00 a.m.: We became aware of the first attack, but noted that it had ended.&lt;/li&gt;
&lt;li&gt;9:15 a.m.: We noticed timeouts reaching rollbar.com and that a second wave of the attack was under way.&lt;/li&gt;
&lt;li&gt;9:23 a.m.: We updated our status page about the issue&lt;/li&gt;
&lt;li&gt;9:40 a.m.: We began migration to an alternate DNS provider (AWS Route 53)&lt;/li&gt;
&lt;li&gt;10:40 a.m.: Configuration changes for the DNS migration were complete; however, we now had to wait for the nameserver change to propagate&lt;/li&gt;
&lt;li&gt;11:07 a.m.: We updated our &lt;a href=&quot;http://status.rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;status page&lt;/a&gt;, as well as &lt;a href=&quot;https://twitter.com/rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Twitter&lt;/a&gt; and &lt;a href=&quot;https://www.facebook.com/rollbarinc&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Facebook&lt;/a&gt;, regarding the migration and posted static IP addresses that customers could use in the meantime.&lt;/li&gt;
&lt;li&gt;Over the next 6-12 hours, DNS traffic moved over to AWS and all customers were able to resolve rollbar.com and api.rollbar.com&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;customer-impact&quot;&gt;&lt;a href=&quot;#customer-impact&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Customer Impact&lt;/h2&gt;
&lt;p&gt;During the outages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Many customers were not able to reach rollbar.com&lt;/li&gt;
&lt;li&gt;Many customers&apos; applications (servers, web and mobile clients) were not able to reach api.rollbar.com to send data, leading to data loss as those requests failed and, in some cases, application problems caused by the slow requests&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-we-learned&quot;&gt;&lt;a href=&quot;#what-we-learned&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What We Learned&lt;/h2&gt;
&lt;p&gt;The problems that this outage exposed were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS was a single point of failure. While Dyn has been an extremely reliable provider over the past 4+ years, Friday&apos;s outage showed that they are not infallible.&lt;/li&gt;
&lt;li&gt;Using DNS for geographic load balancing and failover made us more susceptible to an outage like this, since we use short TTLs and have a generally more complex DNS setup.&lt;/li&gt;
&lt;li&gt;Our monitoring systems did not detect this kind of outage. Traffic was normal and all internal systems were normal. We only learned about it through customer reports and manual testing.&lt;/li&gt;
&lt;li&gt;Some Rollbar client libraries do not handle failed requests well and are susceptible to resource starvation caused by retries. We&apos;re investigating two reports of this in the Sidekiq backend for the Ruby library, and are investigating one other that we believe is in a custom Java library.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We had some problems communicating with customers during the outage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our status page was hosted on the same domain as our website, so customers who could not reach rollbar.com likely couldn&apos;t reach status.rollbar.com either&lt;/li&gt;
&lt;li&gt;Twitter, our backup channel, also uses Dyn for DNS and was affected by the same issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-were-doing&quot;&gt;&lt;a href=&quot;#what-were-doing&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What We&apos;re Doing&lt;/h2&gt;
&lt;p&gt;In response to Friday&apos;s events and what we&apos;ve learned since:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We are re-evaluating our DNS setup so that we will be resilient against failures on this tier, likely by using multiple DNS providers. Since we use advanced DNS features like dynamic routing, this is not quite as simple as it may sound and we&apos;re doing some research first.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We are adding monitoring coverage for DNS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&apos;re moving our status page from status.rollbar.com to rollbarstatus.com, which will use a different DNS provider than our primary domain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We will be investigating how our client libraries handle network failures and audit them to ensure that the impact to the host application is minimal in the case of a network outage.&lt;/p&gt;
&lt;p&gt;For any customers who are looking for an immediate solution to this problem, we&apos;d like to refer you to &lt;a href=&quot;https://github.com/rollbar/rollbar-agent&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;rollbar-agent&lt;/a&gt; to move the network request out of the application and into another process that reads queued events from disk. This also has the benefit that requests will eventually succeed after a network outage. This model is powerful, but currently fairly difficult to set up. We&apos;ll be scheduling some improvements to rollbar-agent soon.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;other-resources&quot;&gt;&lt;a href=&quot;#other-resources&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Other Resources&lt;/h2&gt;
&lt;p&gt;There has been a lot of chatter around the web about this outage. Here are a few links that we found helpful or interesting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://dyn.com/blog/dyn-statement-on-10212016-ddos-attack/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Dyn&apos;s statement about the attack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.internetsociety.org/blog/tech-matters/2016/10/how-survive-dns-ddos-attack-consider-using-multiple-dns-providers&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Internet Society&apos;s post about the attack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We know our customers depend on Rollbar as a critical, reliable piece of infrastructure, and we&apos;re sorry that we did not meet this standard on Friday. If you have any questions, don&apos;t hesitate to contact us at &lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A better error monitoring workflow Rollbar + Atlassian]]></title><description><![CDATA[Dealing with errors can be time consuming and often an interruption in your everyday development workflow. It's important that we at Rollbar…]]></description><link>https://rollbar.com/blog/better-monitoring-workflow-atlassian-plus-rollbar/</link><guid isPermaLink="false">https://rollbar.com/blog/better-monitoring-workflow-atlassian-plus-rollbar/</guid><pubDate>Wed, 12 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Dealing with errors can be time consuming and often an interruption in your everyday development workflow. It&apos;s important that we at Rollbar continue to work to improve this process and that we extend the capabilities and insights of your current toolset and workflows. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.atlassian.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Atlassian&lt;/a&gt;&lt;/strong&gt; users can now rejoice! 🎉 Debugging errors just got a whole lot easier and faster. With our latest improvements and integrations with Atlassian products you can now keep tabs on your application directly within the tools you&apos;re already using to build it. No more switching between multiple tools and services to debug and deploy code. Creating a seamless user experience and unified workflow around production errors. &lt;/p&gt;
&lt;p&gt;Integrating &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/why-rollbar/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar’s error monitoring&lt;/a&gt;&lt;/strong&gt; with Atlassian’s products provides teams with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instant error grouping and aggregation&lt;/strong&gt;: Errors are grouped by root cause and linked to your source code within &lt;strong&gt;&lt;a href=&quot;https://marketplace.atlassian.com/plugins/rollbar/cloud/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Bitbucket&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real-time notifications&lt;/strong&gt;: Intelligent alerting rules configured for &lt;strong&gt;&lt;a href=&quot;https://marketplace.atlassian.com/plugins/com.rollbar.com.hipchat/cloud/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;HipChat&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://marketplace.atlassian.com/plugins/com.rollbar.jira/cloud/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JIRA&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy workflow and prioritization&lt;/strong&gt;: Discover the most impactful errors with data and create issues in &lt;strong&gt;&lt;a href=&quot;/docs/jira/&quot;&gt;JIRA&lt;/a&gt;&lt;/strong&gt; instantly with rich data, contextual details and error analytics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faster time to resolution&lt;/strong&gt;: Debug, deploy fixes and track regressions much faster when your error data moves through &lt;strong&gt;&lt;a href=&quot;/docs/hipchat/&quot;&gt;HipChat&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;/docs/jira/&quot;&gt;JIRA&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;/docs/bitbucket/&quot;&gt;Bitbucket&lt;/a&gt;&lt;/strong&gt; automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Watch our short video for an overview of how Rollbar and Atlassian&apos;s products work together:&lt;/p&gt;
&lt;!--more--&gt;
&lt;script src=&quot;//fast.wistia.com/embed/medias/l5v376wmpy.jsonp&quot; async&gt;
&lt;/script&gt;
&lt;script src=&quot;//fast.wistia.com/assets/external/E-v1.js&quot; async&gt;
&lt;/script&gt;
&lt;div class=&quot;wistia_responsive_padding&quot; style=&quot;padding:62.5% 0 0 0;position:relative;&quot;&gt;
&lt;div class=&quot;wistia_responsive_wrapper&quot; style=&quot;height:100%;left:0;position:absolute;top:0;width:100%;&quot;&gt;
&lt;div class=&quot;wistia_embed wistia_async_l5v376wmpy videoFoam=true&quot; style=&quot;height:100%;width:100%&quot;&gt;&amp;nbsp;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Take your production error monitoring to the next level and maintain your existing workflow. By integrating &lt;strong&gt;Rollbar&lt;/strong&gt; with &lt;strong&gt;JIRA&lt;/strong&gt;, &lt;strong&gt;HipChat&lt;/strong&gt; and &lt;strong&gt;Bitbucket&lt;/strong&gt; you can detect, diagnose and resolve errors in less than 2 minutes!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By integrating Rollbar with JIRA, HipChat and Bitbucket you can Detect, diagnose and resolve errors in less than 2 minutes!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;[&lt;strong&gt;&lt;a href=&quot;http://ctt.ec/MbY2f&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Click to Tweet&lt;/a&gt;&lt;/strong&gt;]&lt;/p&gt;
&lt;p&gt;Below are a few examples of how to manage and fix errors that occur in your software using these new integrations:&lt;/p&gt;
&lt;h3 id=&quot;get-real-time-error-alerts-in-hipchat&quot;&gt;&lt;a href=&quot;#get-real-time-error-alerts-in-hipchat&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Get real-time error alerts in HipChat&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;/docs/hipchat/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 51.14006514657981%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABdUlEQVQoz41PO2/UQBj0X6VGChIFJUUQDRQIiYY/QKREIl0KGjoqpFR38j7s27Mdn72737435iGifLZ1gKDJajSa+aTRzBZP31w+f3/15N2nk7dXJ6/PH7+6eHT64YEo2q4LIeSctRo4K0m5uen2oEcDErTEIwqlpDJGG6vAaGtDcLfZI4qXl9cvPl4/O/t69vlL1BQO22RYBJoNS0CDIgmY19QZ4a1YeYrN3dQiir7v27bF5gj1P2Fk1JgPpvZmSS7h7+l3eJAj+JRz6hrLiSw3vmKOk1AztChcRVYxc8Wg3q0wtSgU/m+U2DyFFpvN3MwjsGw4DkbEhb0is8A5mqLNlqMoXEjK+JjSFJr//jxvxmMEvm5GtiB+5OPsfHyTa4KkcLNNmkVFF2Z+JKiPduaguNNixZ9w6htXE0U3bkf9ArS2IqsN+wrEzojdwiJ1+5/DX823tvEDgXbr+jKONAwErT8QdyjXix+5lcJJgfzNNb9iew/3LQk5O/K/swAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;hipchat rollbar&quot;
        title=&quot;&quot;
        src=&quot;/static/hipchat-rollbar-fd4addcf95a2cf6e9d7fbf5bb2e6223d-e9535.png&quot;
        srcset=&quot;/static/hipchat-rollbar-fd4addcf95a2cf6e9d7fbf5bb2e6223d-d32c5.png 216w,
/static/hipchat-rollbar-fd4addcf95a2cf6e9d7fbf5bb2e6223d-06f31.png 432w,
/static/hipchat-rollbar-fd4addcf95a2cf6e9d7fbf5bb2e6223d-e9535.png 864w,
/static/hipchat-rollbar-fd4addcf95a2cf6e9d7fbf5bb2e6223d-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Send real-time notifications about application exceptions and code deployments to your rooms in HipChat. Reduce alert fatigue and customize error grouping rules to get alerted to issues that matter most. Stay on top of code deployments and fixes as they happen. &lt;strong&gt;&lt;a href=&quot;/docs/hipchat/&quot;&gt;See HipChat documentation for more details&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;deep-links-to-your-source-code-in-bitbucket&quot;&gt;&lt;a href=&quot;#deep-links-to-your-source-code-in-bitbucket&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Deep links to your source code in Bitbucket&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;/docs/bitbucket/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 51.14006514657981%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAAB9ElEQVQoz1WSy4/SUBTG+S+NlD6AQlwRJbNwoSYEqF2YOLNQhzBEd8boyszEWbnxfzBxZQwMr77pg9IO/Tzn4pSxyZd772nuL9/5zq20Wq2C1WjqRbvdLqXrevHo8dPi+fgaZx+/YzD5BuP9NXrjS/THV+iNvuLk9Wc8efUJJ6df8Oz8Ei9GV6gQDFq9gQc1FU1dh0p7rjWbTRimiR+/FrAsC8FmgyRJYNs2ttsEaZrSmiLPc9z/KuQEDbpMDglC+8a/lWS8NDGbr+F6AeI4LoGx7yH2XLEmcYh8t0WepbglVRigaY1S7OxOpnkALtcewjASQNd1YTu2AAdBgCzdorjvkC8qioKH1VopSVYhKyoGgyFmN3NEUSTEQG7fdz04jgPbsmEROKQ48jw7AlVVJZBUqkqSJAm9Xg+//8ywthzhjB0xiMHLxQK+75MCynIrxPUjUJJLh1Xa12QF/cEA05sVHNenlkORI4M35Min/LLdDjtSlh203++PwFrtAOFWVVWDqmkwDENkuJj+LIciJk7OPM9HRLWQogijmKa+w+2+OAA7nQ7enF/gLendaIKLyQfIsox+v4/pfAXP34gMuWWbs3NoMAReLZcCHtO/jJ7PAVivo0VPp9vt/icGDodDrCi/YBOWQ2HoXV6cIZ/5TfKZ638BQnhxUprqcVwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;stacktrace bitbucket linked&quot;
        title=&quot;&quot;
        src=&quot;/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-e9535.png&quot;
        srcset=&quot;/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-d32c5.png 216w,
/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-06f31.png 432w,
/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-e9535.png 864w,
/static/stacktrace-bitbucket-linked-a5a7ccc1264ecec95e21b392409ef85c-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rollbar integrates with &lt;strong&gt;&lt;a href=&quot;/docs/bitbucket/&quot;&gt;Bitbucket repos&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;/blog/connect-rollbar-to-bitbucket-issue-tracker/&quot;&gt;Issue Tracker&lt;/a&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;a href=&quot;https://bitbucket.org/rollbar/rollbar-bitbucket-pipelines&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Pipelines&lt;/a&gt;&lt;/strong&gt;. Create deep links to your source code in Bitbucket to help you diagnose and fix issues faster. Link stack traces in Rollbar directly to lines of code in your Bitbucket repos. Configure &lt;strong&gt;&lt;a href=&quot;https://bitbucket.org/rollbar/rollbar-bitbucket-pipelines&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Bitbucket Pipelines&lt;/a&gt;&lt;/strong&gt; to notify Rollbar of new deploys and see the commits that were included with each code deployment. &lt;strong&gt;&lt;a href=&quot;/docs/bitbucket/&quot;&gt;See Bitbucket documentation for more details&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;add-rich-error-data-to-jira-issues&quot;&gt;&lt;a href=&quot;#add-rich-error-data-to-jira-issues&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Add rich error data to JIRA issues&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;/docs/jira/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 51.14006514657981%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABj0lEQVQoz21Sy0rDQBTN/+/EnaIiiuDGJ74WboQiohvF4itqm9AmNu/nJNP2HudOSW3UwGFuJmdOzj1zjaWdc1o76NDWyQ0t717Syl6H1k/vaXW/08La4TVtHN/8weaR4u9f0fbZHe1e3JIxGAwoCALEcYwojuD7Pvid16ZO0xR1XYOI5hiPx3/emWOMvJCSJEWe58iyHFNZo1B1Q2QSk0dBBFHJ+X5RFJhOp+j1bZS6nu0b7iggP4y1YBiGai2QF0KhQilqTCaTOVjgt2CcCVT1j1sjTTNKs0wTuL2njyc8f77Aciw4Xw4c19GtcyTstnmYzwKZOrvYuqGcEX+cCUZ4NLvofnTxbpuwhhZs28Zw6CBJkragyjVKMh1DVUvkqhuhnLYE2YnZN/FmmbBdW7tzv1wtxt+llHNBjkDKMaT6SSEEXgchHnpeW5BzbLJiLNYNuC1ey7LUP+KapyAva123BKuqah1mR0KUqtX2iMyyU1OxMA3/Zsg37PkRPG82f7/dLYIvw1ccodplNGPzDUql9hVDDQUCAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;jira rollbar&quot;
        title=&quot;&quot;
        src=&quot;/static/jira-rollbar-e31734eba47d112adc0ef530c399e3b8-e9535.png&quot;
        srcset=&quot;/static/jira-rollbar-e31734eba47d112adc0ef530c399e3b8-d32c5.png 216w,
/static/jira-rollbar-e31734eba47d112adc0ef530c399e3b8-06f31.png 432w,
/static/jira-rollbar-e31734eba47d112adc0ef530c399e3b8-e9535.png 864w,
/static/jira-rollbar-e31734eba47d112adc0ef530c399e3b8-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Connect Rollbar to &lt;strong&gt;&lt;a href=&quot;https://marketplace.atlassian.com/plugins/com.rollbar.jira/cloud/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JIRA&lt;/a&gt;&lt;/strong&gt; and enhance issues with detailed error data like stack trace, error status, total occurrences, unique IPs affected, first seen date, last seen date and the date the error reoccurred and regressed. All conveniently displayed, linked and accessible within JIRA. Set notification rules in Rollbar to automatically open new issues in JIRA. Create and assign JIRA issues with a few clicks. With bidirectional syncing, statuses update in both JIRA and Rollbar. &lt;strong&gt;&lt;a href=&quot;/docs/jira/&quot;&gt;See JIRA documentation for more details&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Rollbar has integration support built for &lt;strong&gt;&lt;a href=&quot;https://marketplace.atlassian.com/plugins/com.rollbar.com.hipchat/cloud/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;HipChat&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;/docs/jira/&quot;&gt;JIRA Issue Tracker&lt;/a&gt;&lt;/strong&gt;, a native &lt;strong&gt;&lt;a href=&quot;/blog/add-on-now-available-for-jira/&quot;&gt;JIRA Add-on&lt;/a&gt;&lt;/strong&gt; (new), &lt;strong&gt;&lt;a href=&quot;/docs/bitbucket/&quot;&gt;Bitbucket&lt;/a&gt;&lt;/strong&gt; source control (new), &lt;strong&gt;&lt;a href=&quot;/blog/connect-rollbar-to-bitbucket-issue-tracker/&quot;&gt;Bitbucket Issue Tracker&lt;/a&gt;&lt;/strong&gt;, native &lt;strong&gt;&lt;a href=&quot;/blog/new-atlassian-connect-bitbucket-addon/&quot;&gt;Bitbucket Add-on&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://bitbucket.org/rollbar/rollbar-bitbucket-pipelines&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Bitbucket Pipelines&lt;/a&gt;&lt;/strong&gt; (new). &lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;attending-atlassian-summit&quot;&gt;&lt;a href=&quot;#attending-atlassian-summit&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Attending Atlassian Summit?&lt;/h3&gt;
&lt;p&gt;Visit us at booth B19 at &lt;strong&gt;&lt;a href=&quot;https://www.atlassian.com/summit&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Atlassian Summit&lt;/a&gt;&lt;/strong&gt; this week and sit down with a Rollbar expert to show you how you can level-up your app monitoring and error handling processes with our latest JIRA, HipChat and Bitbucket integrations. To learn more visit us at our booth, or go to &lt;strong&gt;&lt;a href=&quot;https://rollbar.com/summit&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://rollbar.com/summit&lt;/a&gt;&lt;/strong&gt; and receive the first month of Rollbar free.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[On the road again, where Rollbar will be this fall]]></title><description><![CDATA[Rollbar team members will be at the following events in the next few months, and we'd love to chat with you in person! Whether you have some…]]></description><link>https://rollbar.com/blog/fall-events-schedule/</link><guid isPermaLink="false">https://rollbar.com/blog/fall-events-schedule/</guid><pubDate>Tue, 11 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Rollbar team members will be at the following events in the next few months, and we&apos;d love to chat with you in person! Whether you have some specific questions about Rollbar, want to tell us about your projects, or just want some Rollbar gear, we&apos;ll be hanging out at these events eager to to talk shop. If you see us at any of these places, make sure to say &quot;hi&quot;! 👋&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;atlassian-summit&quot;&gt;&lt;a href=&quot;#atlassian-summit&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Atlassian Summit&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: San Jose, California&lt;/strong&gt; / &lt;strong&gt;When: Weds, Oct 12 to Thurs, Oct 13&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;a href=&quot;https://www.atlassian.com/summit&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Atlassian Summit&lt;/a&gt;&lt;/strong&gt; is all about the various Atlassian products (such as JIRA, Hipchat, or Bitbucket), and has talks from both Atlassians and Atlassian customers about how to use Atlassian tools better and more effectively. We&apos;ll be at booth B19 at the Summit, and would love for you to visit us there and chat about our new and improved JIRA, Hipchat, and Bitbucket integrations.  &lt;/p&gt;
&lt;h2 id=&quot;fstoco-full-stack-toronto&quot;&gt;&lt;a href=&quot;#fstoco-full-stack-toronto&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;FSTOCO (Full-Stack Toronto)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: Toronto, Canada&lt;/strong&gt; / &lt;strong&gt;When: Mon, Oct 17 to Tues, Oct 18&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://fsto.co/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;FSTOCO&lt;/a&gt;&lt;/strong&gt; is a full-stack web conference for all web professionals. With two days of talks running the gamut from UX, project management, front end, and back end, there&apos;s something for everyone. We&apos;re excited to be sponsors of FSTOCO this year, and hope to see you there!&lt;/p&gt;
&lt;h2 id=&quot;ruby-rampage-hackathon&quot;&gt;&lt;a href=&quot;#ruby-rampage-hackathon&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ruby Rampage Hackathon&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: virtual, global hackathon!&lt;/strong&gt; / &lt;strong&gt;When: Sat, Oct 22 to Sun, Oct 23&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Do you love hackathons and Ruby, and not having to leave your apartment? If so, &lt;strong&gt;&lt;a href=&quot;https://www.rubyrampage.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ruby Rampage&lt;/a&gt;&lt;/strong&gt; is for you! Compete online over two days to build the best Ruby app with your team, and you could win a prize. We&apos;re proud sponsors of Ruby Rampage, and would love to &quot;see&quot; you there. &lt;/p&gt;
&lt;h2 id=&quot;thunder-plains&quot;&gt;&lt;a href=&quot;#thunder-plains&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Thunder Plains&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: Oklahoma City, Oklahoma&lt;/strong&gt; / &lt;strong&gt;When: Thurs, Nov 3 to Fri, Nov 4&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&apos;re sponsoring &lt;strong&gt;&lt;a href=&quot;http://thunderplainsconf.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Thunder Plains&lt;/a&gt;&lt;/strong&gt;, a web and mobile development conference focusing on JavaScript and related technologies. With only 225 tickets, it promises to be an intimate and inspiring event. &lt;/p&gt;
&lt;h2 id=&quot;rubyconf-2016&quot;&gt;&lt;a href=&quot;#rubyconf-2016&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;RubyConf 2016&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: Cincinnati, Ohio&lt;/strong&gt; / &lt;strong&gt;When: Thurs, Nov 10 to Sat, Nov 12&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://rubyconf.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;RubyConf&lt;/a&gt;&lt;/strong&gt; is the main international annual gathering for the Ruby community. We are sponsoring RubyConf and would love to talk shop with you there. &lt;/p&gt;
&lt;h2 id=&quot;node-knockout-hackathon&quot;&gt;&lt;a href=&quot;#node-knockout-hackathon&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Node Knockout Hackathon&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: virtual, global hackathon!&lt;/strong&gt; / &lt;strong&gt;When: Sat, Nov 12 to Sun, Nov 13&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you love online hackathons but aren&apos;t a Rubyist, &lt;strong&gt;&lt;a href=&quot;https://www.nodeknockout.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Node Knockout&lt;/a&gt;&lt;/strong&gt; might be right up your alley. Compete online over two days to build the best Node.js app with your team, and win prizes and glory. Hope to see you there!&lt;/p&gt;
&lt;h2 id=&quot;node-interactive&quot;&gt;&lt;a href=&quot;#node-interactive&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Node Interactive&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: Austin, Texas&lt;/strong&gt; / &lt;strong&gt;When: Mon, Nov 28 to Wed, Nov 30&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://events.linuxfoundation.org/events/node-interactive&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Node Interactive&lt;/a&gt;&lt;/strong&gt; is the conference for all things Node.js! With talks ranging from front end, to back end, to the Internet of Things, Node Interactive has something for every Node developer. We&apos;re sponsoring Node Interactive this year and can&apos;t wait to chat with you there. &lt;/p&gt;
&lt;h2 id=&quot;aws-reinvent&quot;&gt;&lt;a href=&quot;#aws-reinvent&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;AWS re:Invent&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Where: Las Vegas, Nevada&lt;/strong&gt; / &lt;strong&gt;When: Mon, Nov 28 to Fri, Dec 2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://reinvent.awsevents.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;AWS re:Invent&lt;/a&gt;&lt;/strong&gt; is the largest gathering of the global Amazon Web Services community. Rollbar will be participating along side of Atlassian and other &lt;strong&gt;&lt;a href=&quot;http://blogs.atlassian.com/2016/11/join-atlassian-team-aws-reinvent/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Atlassian ecosystem partners in booth 2446&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;schedule-an-in-person-meeting&quot;&gt;&lt;a href=&quot;#schedule-an-in-person-meeting&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Schedule an in-person meeting&lt;/h2&gt;
&lt;p&gt;We’re making &lt;strong&gt;[office hours](&lt;a href=&quot;mailto:sales@rollbar.com?subject=I&amp;#x27;d&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;sales@rollbar.com?subject=I&apos;d&lt;/a&gt; like to meet at [add event you are attending here]&quot;)&lt;/strong&gt; available during these events. Schedule some time with us to sit down with a Rollbar expert to show you how you can level-up your app monitoring and error handling. Visit us at our booth or email &lt;strong&gt;[sales@rollbar.com](&lt;a href=&quot;mailto:sales@rollbar.com?subject=I&amp;#x27;d&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;sales@rollbar.com?subject=I&apos;d&lt;/a&gt; like to meet at [add event you are attending here])&lt;/strong&gt; to get something scheduled. 📅&lt;/p&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;strong&gt;&lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt;&lt;/strong&gt; and let us help you defeat annoying errors in your applications. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Rollbar add-on now available for JIRA]]></title><description><![CDATA[We’ve recently released a new  JIRA Add-On  to help extend your  application error monitoring  workflow.  JIRA  is one of the leading issue…]]></description><link>https://rollbar.com/blog/add-on-now-available-for-jira/</link><guid isPermaLink="false">https://rollbar.com/blog/add-on-now-available-for-jira/</guid><pubDate>Mon, 10 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’ve recently released a new &lt;a href=&quot;https://marketplace.atlassian.com/plugins/com.rollbar.jira/cloud/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JIRA Add-On&lt;/a&gt; to help extend your &lt;a href=&quot;/integrations/atlassian/&quot;&gt;application error monitoring&lt;/a&gt; workflow. &lt;a href=&quot;https://www.atlassian.com/software/jira&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JIRA&lt;/a&gt; is one of the leading issue tracking solutions used by agile teams. Enabling them to plan, track, release and support building better software. &lt;/p&gt;
&lt;h3 id=&quot;send-rich-error-data-to-jira&quot;&gt;&lt;a href=&quot;#send-rich-error-data-to-jira&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Send rich error data to JIRA&lt;/h3&gt;
&lt;p&gt;Connect Rollbar to JIRA and enhance issues with detailed error data like stack trace, error status, total occurrences, unique IPs affected, first seen date, last seen date and the date the error reoccurred and regressed. All conveniently displayed, linked and accessible within JIRA. &lt;/p&gt;
&lt;p&gt;Here are a few of the ways you can improve your monitoring workflow when you connect Rollbar with JIRA and install the new Rollbar for JIRA add-on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Link and display root cause exception data in issues.&lt;/li&gt;
&lt;li&gt;Set notification rules to automatically open new issues.&lt;/li&gt;
&lt;li&gt;Create and assign JIRA issues with a few clicks.&lt;/li&gt;
&lt;li&gt;Bidirectional syncing, update statuses in both Rollbar and JIRA.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;a href=&quot;/integrations/atlassian/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PRO TIP / REMINDER&lt;/strong&gt;: Automatically (and manually) create JIRA issues from Rollbar errors when you configure JIRA as a Notification Channel in Rollbar. Supercharge your issue tracking when you use &lt;strong&gt;JIRA Notications + Rollbar for JIRA Add-On&lt;/strong&gt; together. Check out our &lt;a href=&quot;/docs/jira/&quot;&gt;JIRA documentation&lt;/a&gt; for details. &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/integrations/atlassian/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50.814332247557005%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABpklEQVQoz4VSy0rDQBTN/4oIgi4UFwqu1I0LRXDhxpUgCop/4MaNopu20dg8mjTP5tE0aZoe54wmPhAdONyZ4d5zzz0zysr+JbaOb7BxdI2V/QusH14JXGPt4AqrBzfYPL3D4t75n1jaPcPyzikWtk+g3D/eQtMHcFwfWZZJPHSfoL7oGNguXvoWPM9DEASI4xj/LUXrG9CtoSwgSMjCNEmQpilGo1EbiSiK5Lksy5ZkPp9/EtqOi77lSaLxeIw8z+G6rkwq40jecV/XtWzEveOFEum4kGc2yicTVFUFheOQgJckZWeScBVFgel02qpggSSfzVAJNIv5rGOuMrAdGGLk9MM/KjR0433sbIJEqEiyQqphJOFPkIyoZjWUaBTD9SOEIjYKDV2H7/sSSZxgIsYh2IyxUVMWpbSCvvLMvVA4hGa48MO4lW5ZFkzDhG3bAk77KIl4KOY0VszE2I2HQRDKZgoTvoKEpmmi0+lA7fVk7PVUdLtdqKqKUBSSuPzwlqvOU2HJFFle/U6oaZokeFaf4TjDb9+FtjCStPkuHPXV9qHaMd4A6fjpI/qVa6QAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar issue tracker&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-issue-tracker-8ed8691d73c5f54fe603326c6580fe53-e9535.png&quot;
        srcset=&quot;/static/rollbar-issue-tracker-8ed8691d73c5f54fe603326c6580fe53-d32c5.png 216w,
/static/rollbar-issue-tracker-8ed8691d73c5f54fe603326c6580fe53-06f31.png 432w,
/static/rollbar-issue-tracker-8ed8691d73c5f54fe603326c6580fe53-e9535.png 864w,
/static/rollbar-issue-tracker-8ed8691d73c5f54fe603326c6580fe53-55d8b.png 1228w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To install the new Rollbar for JIRA add-on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In your JIRA account go to Admin &gt; Add-ons&lt;/li&gt;
&lt;li&gt;Search for &quot;Rollbar&quot;&lt;/li&gt;
&lt;li&gt;Click &quot;Install&quot; on the Rollbar for JIRA add-on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;OR&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to our &lt;a href=&quot;https://marketplace.atlassian.com/plugins/com.rollbar.jira/cloud/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Atlassian Marketplace listing for JIRA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Click &apos;Get it Now&apos;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We hope that by bringing Rollbar data into JIRA you can streamline your issue tracking and monitoring efforts and save a lot of time in your day to day debugging efforts.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;To see if Rollbar integrates with other tools you’re using, see our full list of integrations &lt;a href=&quot;/docs/tools/&quot;&gt;here&lt;/a&gt;. If you haven’t already, signup for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you defeat errors in production. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How CircleCI uses Rollbar to level up their continuous delivery]]></title><description><![CDATA[I'm excited to share a fun and insightful interview our friends at The Changelog recently did with Paul Biggar, Founder at  CircleCI  (and…]]></description><link>https://rollbar.com/blog/how-circleci-does-production-error-monitoring/</link><guid isPermaLink="false">https://rollbar.com/blog/how-circleci-does-production-error-monitoring/</guid><pubDate>Thu, 22 Sep 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;m excited to share a fun and insightful interview our friends at The Changelog recently did with Paul Biggar, Founder at &lt;a href=&quot;https://circleci.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CircleCI&lt;/a&gt; (and Rollbar super-user). We&apos;re big supporters and fans of &lt;a href=&quot;https://changelog.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;The Changelog&lt;/a&gt; and we asked their host and master interviewer Adam, to help us produce a few short interviews with our customers. It&apos;s a fun project that lets us pull back the curtain and learn more about how our customers monitor their applications and processes for handling errors and deploying code. Enjoy!&lt;/p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;136&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/283859769%3Fsecret_token%3Ds-VIzop&amp;amp;color=848484&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&quot;&gt;&lt;/iframe&gt;
&lt;p class=&quot;highlightbox&quot;&gt;
&lt;strong&gt;Featured in this interview:&lt;/strong&gt; Adam Stacoviak, Founder &amp;#x26; Chief Editor at &lt;a href=&quot;https://changelog.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;The Changelog&lt;/a&gt;, a podcast on software development and open source. Subscribe via &lt;a href=&quot;https://itunes.apple.com/podcast/the-changelog/id341623264&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;iTunes&lt;/a&gt; or &lt;a href=&quot;http://feeds.5by5.tv/changelog&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;RSS&lt;/a&gt;. Paul Biggar, Founder of &lt;a href=&quot;https://circleci.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CircleCI&lt;/a&gt;, a leading continuous integration platform.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; Hey there. Adam  here, editor-in-chief of Changelog. I&apos;m here with Paul Biggar, founder of CircleCI (circleci.com) and we&apos;re gonna talk about how important Rollbar is to him and his team to help them deliver on their brand promise to ship better coder faster. Paul, tell me about CircleCI. What types of services do you provide?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; CircleCI is a continuous integration and continuous delivery platform. Our customers are the developers in an organization. Developers rely on us heavily as part of their deployment workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; I guess deploying obviously is important. You&apos;ve got the phrase &apos;ship it&apos; for a reason, so it&apos;s a critical piece to an ops or developer organization to be able to ship code fast, ship code reliably.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; Right. The idea is to do continuous delivery, where you&apos;re constantly delivering value to your customers. Every time a developer pushes code, the CircleCI test will run and they&apos;ll validate that that code works, whether it&apos;s on a branch or whether it&apos;s on the master branch, and then they deploy the code to Heroku, to AWS, to wherever your hosting is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; Break down the problem a little bit deeper for those out there who might not be that informed about CI or CD services and what the value is that you actually do. Some people might still be &lt;code&gt;rsync&lt;/code&gt;-ing or doing different things to deploy their code, and they don&apos;t have workflows and things like that. Can you break down the problem a little bit more, and how CI and CD solves that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; You can always just run tests on your own machine, and you can always just deploy from your own machine. It&apos;s hard to really describe how much better it is for it to be part of an automated, continuous process, but it&apos;s like night and day. When our customers switch to a continuous delivery model from deploying on their machine whenever, it completely changes the velocity of their team and of their organization. If you&apos;re doing continuous delivery, you literally change how your company delivers code and the speed at which it delivers code. I would never work at a company that didn&apos;t do continuous delivery.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you&apos;re doing continuous delivery, you literally change how your company delivers code and the speed at which it delivers code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; So clearly you&apos;re like a part of the machine that should not/could not break. If you break, you&apos;re losing trust, you&apos;re losing value, and ultimately you&apos;re not delivering your brand promise. So tracking errors, tracking bugs, keeping your team informed about breaks, keeping your team informed in terms of like - it might even be different parts of the service, but you have a microservice architecture versus a monolith, and you&apos;ve got various teams plugging into CircleCI and how things are built... Let&apos;s talk about the obvious question here, which is how do you use Rollbar? And not just how do you use Rollbar, but why do you use Rollbar?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; I was talking about doing continuous delivery there, and one of the key parts about doing continuous delivery, you don&apos;t just have to test your software, but you have to constantly keep track of it. If you&apos;re going to be doing deploys ten times a day or twenty times a day, and you have to know that each deploy works, and the way to do that is to have really good production monitoring. Rollbar is the thing that you need to do that monitoring. You need to make sure that every time you deploy, you&apos;re gonna get an alert if something goes wrong, and that&apos;s exactly what Rollbar does for CircleCI, for our infrastructure.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you&apos;re going to be doing deploys ten times a day or twenty times a day, and you have to know that each deploy works, and the way to do that is to have really good production monitoring.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Rollbar is the thing that you need to do that monitoring.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; Let&apos;s talk about what you did before Rollbar. Before Rollbar, I&apos;m sure your team had processes for monitoring, tracking, fixing errors... Help me understand what it was like for your team before Rollbar. What kind of processes did you have, how did you deal with these things prior to introducing Rollbar to your team?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; Before we used Rollbar we used a different &lt;a href=&quot;https://rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;crash reporting service&lt;/a&gt; and we were shopping for a new one. We did the tour and looked at Rollbar and all of its competitors, and it was really the feature set of Rollbar that was super impressive and that made us go there, in particular the people tracking I think is really... It&apos;s not just a great feature, but it also kind of speaks our language because we&apos;re very focused on making sure that the customers are happy and we want to make sure that we have an individual understanding of what happens to each customer. The fact that we&apos;re able to click on &quot;This customer is experiencing a lot of errors&quot;, and to be able to follow the progression of errors that they&apos;ve been experiencing is very valuable to our team.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The fact that we&apos;re able to click on &quot;This customer is experiencing a lot of errors&quot;, and to be able to follow the progression of errors that they&apos;ve been experiencing is very valuable to our team.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; If we get an e-mail from a customer and the customer says, &quot;Your website keeps glitching on me,&quot; and being able to go to Rollbar and to say, &quot;Okay, this individual customer, this is how they&apos;re experiencing the site&quot;... Because otherwise you have to give an overall state of things, and overall things are looking good, because if they weren&apos;t, we&apos;d be dealing with it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/features/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 64.28571428571428%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsSAAALEgHS3X78AAABXklEQVQoz5WRzUsCQRjG/QfDQ5foohJdIkqjoKQggqCIPqVbh4ik8hbR/yKBsK676n67O7sz687u2uNquJoHfRiGl5n5vc/MM5m1wla2UMrmSyu54iJjdWNvXOS3M+ubu+VK9bjycXBTPXmsHd69lR/ej+6Hc+nqZefiOT32r19vn2rYQpErnmbOzi9N0xRFsdPpYPZ9f7CYPr++hzAqJyXO+XIwY6zRaNTr9W63a9v2EjCsKKW4cBzHKDzPC8NwLhAmgtME7rnsR9ZFzfZMFc+WJKndbiuKoqqq67o8JUKZ4Xi4HVqMYZv2BY20DOJYBjAwsizjhK7rhJA07LK+6TKsz8COZLhMaUHwRPLowv8JsEGmYSeBWwncbDZBSoksy0IEs85knrOoE8CCIMAT/iN+9HMzsKZpE7jPox4NHMYjSvBPCIn8KQiCdNo8in0eTaVNgxAw8bzYEQcLC/AvC+6Z1tzyI6gAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar person&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-person-f75a7cd5730d9e3bf3faecbb1a53a680-e9535.png&quot;
        srcset=&quot;/static/rollbar-person-f75a7cd5730d9e3bf3faecbb1a53a680-d32c5.png 216w,
/static/rollbar-person-f75a7cd5730d9e3bf3faecbb1a53a680-06f31.png 432w,
/static/rollbar-person-f75a7cd5730d9e3bf3faecbb1a53a680-e9535.png 864w,
/static/rollbar-person-f75a7cd5730d9e3bf3faecbb1a53a680-ab1f5.png 1296w,
/static/rollbar-person-f75a7cd5730d9e3bf3faecbb1a53a680-b8e74.png 1400w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Person Tracking as seen in Rollbar&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; I think Rollbar to me, just in general error monitoring, seems to be engineer-focused, but I&apos;ve gotta imagine, based on what you&apos;ve just said there, that it supports whomever is doing support for you; maybe it&apos;s actually engineers who do support for you. Can you talk a bit about that crossover, where it&apos;s an informing tool not just to engineers, but also to other parts of the business?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; Everyone at CircleCI is empowered to look into whatever they need to look into. If you&apos;re in support, and our support people are engineers - have an engineering background, they will often need to dive into what exactly a customer is experiencing, so being able to see... We use a couple of monitoring tools, we also use Datadog, so being able to see there&apos;s an increase in errors on Rollbar, there&apos;s a decrease in reliability on the API - you would see that in Datadog - this is stuff that you need to be able to  say, &quot;Why is the customer experiencing this problem?&quot;. Rollbar is really used by the dev-ops and the engineering team, but it&apos;s an invaluable tool for the support team too.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rollbar is really used by the dev-ops and the engineering team, but it&apos;s an invaluable tool for the support team too.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;[&lt;strong&gt;&lt;a href=&quot;http://ctt.ec/Xca0c&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Click to Tweet&lt;/a&gt;&lt;/strong&gt;]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; And when we were first looking at why is Rollbar gonna be valuable, it was a time when we didn&apos;t have a support team. All of us were doing support; we were either alternating by day or by week at that point, and it was part of the tool set. It was just a great place to start looking at where a customer experienced a certain problem, and that was what won Rollbar over for us.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; It&apos;s obvious that with those kinds of insights and that kind of informing across teams - not just engineers, but other parts of the business - you&apos;ve gotta be able to make customers happy pretty quickly. Can you give me any particular experience where something was happening, an error was happening, and you were able to track down who it was affecting? Maybe you found that before they even reported it to the support, and you won the day, you won a customer for life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; I think it&apos;s a lot more mundane than not, and I think intentionally so. People don&apos;t tell dramatic stories about their monitoring software if their monitoring software is good. When Rollbar is working the way that you know it&apos;s working, it&apos;s because you don&apos;t have any dramatic situations. You get alerts about new things that are happening, we get it shipped into Slack, and if Rollbar is telling us that something is happening, we immediately look into it, and on the website and with the customers nothing happens; everything stays the same. We fix the bug, we figure out why it&apos;s happening. We either mute the alert or we fix it, and it doesn&apos;t get to the point where a customer has to be dramatically saved, or anything like that. The site just keeps working.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We fix the bug, we figure out why it&apos;s happening. We either mute the alert or we fix it, and it doesn&apos;t get to the point where a customer has to be dramatically saved, or anything like that. The site just keeps working.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/features/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 35%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsSAAALEgHS3X78AAAA1klEQVQY052QvW4CMRCEeWSKVNRIKfIWSBQ8RmqalKFCSKDgv/V67fvxkdNlzhAFHVQZraxZaz+P7dn8ZbFab/5RAGfL1zcRef/Yfu52RCQSU0pN07RFMPWdcs7Y6ft+GAaAIwxn6k5zPBp/UHSyvP9yR8P7M6WqxnRVBBgLzBT+DgGBSPbel3xxREHEWsccjLXDg/7gi1IAlFIhiEuZKlQHo2PLdVfanNrLc5jbIDE6hzy6JY+isuNxH2bGpdDBTGHJEdJa48N+jxhHtTGYvp6Id02SfwDjI20AWsCtZQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar slack&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-slack-266c99f1442acc2aae1a3a9ab94111d4-e9535.png&quot;
        srcset=&quot;/static/rollbar-slack-266c99f1442acc2aae1a3a9ab94111d4-d32c5.png 216w,
/static/rollbar-slack-266c99f1442acc2aae1a3a9ab94111d4-06f31.png 432w,
/static/rollbar-slack-266c99f1442acc2aae1a3a9ab94111d4-e9535.png 864w,
/static/rollbar-slack-266c99f1442acc2aae1a3a9ab94111d4-ab1f5.png 1296w,
/static/rollbar-slack-266c99f1442acc2aae1a3a9ab94111d4-b8e74.png 1400w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Rollbar Notifications in Slack (Deploy, New Error, Resolved Error)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; You talked before about your choice of Rollbar and their feature set. Can you give me an example - and you may have already done this, but can you give me an example of particular features that you were excited about, and which features they had that you dreamed about and were able to put in use? Can you walk me through what those were?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; I think deploy tracking is probably not an intuitive feature, but it completely changes how you use it. Knowing which is the first deploy that introduced this problem allows you to immediately solve the problem. &quot;This was first introduced at this commit&quot; - then you go back to that commit, you look at the 20 to 50-line diff between that and the previous deploy, and you&apos;re like, &quot;Oh, this is what we changed; this is what the exception looks like. It&apos;s obvious what the problem is.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; How often does something like that happen for you?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; All the time. When you&apos;re looking at monitoring, &quot;How did it start happening?&quot; is as close to a root cause analysis as you can get.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;How did it start happening?&quot; is as close to a root cause analysis as you can get.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;[&lt;strong&gt;&lt;a href=&quot;http://ctt.ec/p04s4&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Click to Tweet&lt;/a&gt;&lt;/strong&gt;]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; I&apos;m just thinking, since it happens - let&apos;s not say all the time, because that sounds bad, let&apos;s just say often... And this is a feature that you sought out. Previously, this superpower was not available to you and your team; you signed up for Rollbar and suddenly just this single feature is a super power for you to help you catch things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; After we added deploy tracking on our end and during our deploy process something pings Rollbar, it completely changed how we were able to track down errors. Bugs and errors and exceptions and all that are just a constant. It&apos;s not like we deploy perfect software and it works all the time. We&apos;re constantly triaging, &quot;Are these exceptions important enough to fix or are they just noise? Are they handled by the dev or is it just noise that comes from having a distributed system?&quot; and the ability to say when that particular error started happening is just like a night and day feature. If you don&apos;t use that feature, once you have it you immediately realize how useful it is and how valuable it is. You can get to the root cause immediately.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;After we added deploy tracking on our end and during our deploy process something pings Rollbar, it completely changed how we were able to track down errors.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/features/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block; ; max-width: 864px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 41.42857142857143%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsSAAALEgHS3X78AAABBElEQVQY042QTU/CQBCG+wM1HLx4MBES48GTSDwhItHEg8YQEQoHTnoQK/6ipmmM9oPtB23J7tZl0bfUBGIEfTPZvNmdZ2Z2lO3SQaF0tFksb+we/ie29iq5Aajs7Jfr6uBM1aq3jw31uXb3dN57OW1r9Y5Wub7/ESetQbOvNbrD45sHgMrF5ZXv+6Zpvs/1uVaU0iAI4jhmjAHM4DRNwzBMkkRKuZzKOUfSqkLfMBfy1R7pum4YhuM4KEQIiaLITzie/oDhwAghxvRDTKXrurZt4wYGE2LU2W9awOiDz5DxhFKWGUI8z8vPXBiHLQmdFnAOvIU0FVlny7KwAvTEFmYrBPALKruCeHwu9RAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;rollbar deploy&quot;
        title=&quot;&quot;
        src=&quot;/static/rollbar-deploy-ba587216a8f8b012e2507bd0ed0b9c0a-e9535.png&quot;
        srcset=&quot;/static/rollbar-deploy-ba587216a8f8b012e2507bd0ed0b9c0a-d32c5.png 216w,
/static/rollbar-deploy-ba587216a8f8b012e2507bd0ed0b9c0a-06f31.png 432w,
/static/rollbar-deploy-ba587216a8f8b012e2507bd0ed0b9c0a-e9535.png 864w,
/static/rollbar-deploy-ba587216a8f8b012e2507bd0ed0b9c0a-ab1f5.png 1296w,
/static/rollbar-deploy-ba587216a8f8b012e2507bd0ed0b9c0a-b8e74.png 1400w&quot;
        sizes=&quot;(max-width: 864px) 100vw, 864px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;imgcaption&quot;&gt;
Deploy Tracking as seen in Rollbar&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; Can you give me an example of another feature that you use that you&apos;re totally in love with that isn&apos;t very clear that it&apos;s available to you, that you use quite often?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; The ability to configure when something alerts you. The gap between a hundred occurrences and a thousand occurrences of something is quite big. Being able to have Rollbar say &quot;This thing just became a big deal&quot; is important.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; So you can basically say, &quot;If this type of thing has happened before a hundred times, that&apos;s okay. We&apos;re familiar with that, we&apos;re aware of that bug, we&apos;re on that bug, our team is tracking that bug.&quot; But when it blows up to a thousand or two thousand, clearly it&apos;s gone from dwarf to monster.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; Right, because it&apos;s very rare to suddenly have a new bug that we&apos;ve never seen before. What usually happens is the bug will happen in a very rare situation. Maybe someone triaged it at some point and said, &quot;That&apos;s low down the list of priorities,&quot; and then all of a sudden, a bug that we&apos;ve seen dozens of times, hundreds of times before, once-a-day sort of thing, suddenly we an error a thousand times in an hour, or ten thousand times in an hour. That&apos;s when something becomes super serious, and that&apos;s the things that we want to get alerted about.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;suddenly we see an error a thousand times in an hour, or ten thousand times in an hour. That&apos;s when something becomes super serious, and that&apos;s the things that we want to get alerted about.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; The brand promise of CircleCI is &quot;Ship better code faster&quot;, which in my opinion - and maybe the listeners will feel this way, too - seems pretty confident. You&apos;re confident in what you do, you&apos;re confident in what your software promises to deliver to its customers. Can you talk a bit about how Rollbar has helped you deliver on that brand promise?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; The most important thing in delivering things quickly to your customers is having a level of confidence that the code works. You can&apos;t perfectly test something before it goes out, you can&apos;t perfectly validate it. You&apos;re gonna put it in front of the customers and something weird and new is gonna happen, and you have to know when that goes wrong. You have to have something like Rollbar to tell you something just went wrong and to alert you about it immediately. Otherwise you would just be paralyzed by fear. You&apos;d be unable to ship anything because you wouldn&apos;t know when it would go wrong and what the downsides would be.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can&apos;t perfectly test something before it goes out, you can&apos;t perfectly validate it. You&apos;re gonna put it in front of the customers and something weird and new is gonna happen, and you have to know when that goes wrong.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; Let&apos;s assume anyone who listened to this is someone who needs to use Rollbar. Someone needs to know about this tool, needs to know about this product, needs to know how it has changed how you do business because of it. I&apos;d like them to know how important this tool is to you. A better question might even be, &quot;Could you have done what you&apos;re doing with CircleCI, the level of morale for the team, the happiness level - all these different things that play into this, without Rollbar&apos;s help?&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paul:&lt;/strong&gt; We operate at serious scale, and the first thing we do when we create a new service is we install Rollbar. We need to have that visibility, and without that visibility it would be impossible to run at the scale we do. Certainly with the number of people that we have. We&apos;re a relatively small team operating a major service, and without the visibility that Rollbar gives us into our exceptions it just wouldn&apos;t be possible. If there&apos;s people out there who ship code without Rollbar, I can only imagine the pain that they&apos;re going through.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;the first thing we do when we create a new service is we install Rollbar. We need to have that visibility, and without that visibility it would be impossible to run at the scale we do.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;If there are people out there who ship code without Rollbar, I can only imagine the pain that they&apos;re going through.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;[&lt;strong&gt;&lt;a href=&quot;http://ctt.ec/ucJsb&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Click to Tweet&lt;/a&gt;&lt;/strong&gt;]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adam:&lt;/strong&gt; That&apos;s awesome. Thank you so much for your time today, Paul. I really appreciate you taking the time to speak with me. For those tuning in, if you haven&apos;t yet, head to rollbar.com to learn more. Cheers!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Thank you to Paul and the team at &lt;a href=&quot;https://circleci.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CircleCI&lt;/a&gt; for sharing this level of insight and for leading by example when it comes to continuous delivery and working to maintain error-free experiences for their users. Bravo!&lt;/p&gt;
&lt;p&gt;If you haven’t already, sign up for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you
take control of your application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Improved ruby error reporting with our latest gem updates]]></title><description><![CDATA[Recently, we released version 2.13.0 of the  rollbar-gem . This update is full of new features and some minor bug fixes. The full release…]]></description><link>https://rollbar.com/blog/ruby-gem-update/</link><guid isPermaLink="false">https://rollbar.com/blog/ruby-gem-update/</guid><pubDate>Wed, 14 Sep 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, we released version 2.13.0 of the &lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar-gem/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;rollbar-gem&lt;/a&gt;. This update is full of new features and some minor bug fixes. The full release notes can be found here, &lt;a href=&quot;https://github.com/rollbar/rollbar-gem/blob/master/CHANGELOG.md#2130&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Release 2.13.0&lt;/a&gt;. Here are a few of the highlights in this update:&lt;/p&gt;
&lt;h2 id=&quot;1-allow-overriding-configuration&quot;&gt;&lt;a href=&quot;#1-allow-overriding-configuration&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Allow overriding configuration&lt;/h2&gt;
&lt;p&gt;Many customers have asked to implement a way to override the default configuration for a specific block of code. Some of them use the same process to send reports to our API for different projects, some need to change the environment, and others want to use one async handler for a single block of code (or none at all).&lt;/p&gt;
&lt;p&gt;So, we&apos;ve added a new method called &lt;code&gt;Rollbar.with_config&lt;/code&gt; to do this. It receives a &lt;code&gt;Hash&lt;/code&gt; object with the configuration overrides you want to use for the given block. The configuration options can be found at &lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar-gem/configuration/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Configuration&lt;/a&gt;. The &lt;code&gt;Hash&lt;/code&gt; passed to &lt;code&gt;with_config&lt;/code&gt; should be formatted like &lt;code&gt;{environment: &apos;specific-environment&apos;}&lt;/code&gt;. For example:&lt;/p&gt;
&lt;!--more--&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;with_config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;use_async&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;begin&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# do work that may crash&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; e
    &lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;This method looks similar to &lt;code&gt;Rollbar.scoped&lt;/code&gt;, and &lt;code&gt;Rollbar.with_config&lt;/code&gt; uses it internally. Now &lt;code&gt;Rollbar.scoped&lt;/code&gt; can receive a second argument with the configuration overrides for the given block of code. So if you need to set a new payload scope and new config for a code block, you can write:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;scope &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
new_config &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;framework&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Sinatra&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;scoped&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scope&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; new_config&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;begin&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# do work that may crash&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; e
    &lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;In the example above, we are defining a new payload scope and overriding the &lt;code&gt;framework&lt;/code&gt; configuration for the reported errors inside the given block.&lt;/p&gt;
&lt;h2 id=&quot;2-code-and-context&quot;&gt;&lt;a href=&quot;#2-code-and-context&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Code and context&lt;/h2&gt;
&lt;p&gt;The data we send for each frame in a backtrace is the filename, code line number, and the method name. In the occurrence detail you can see the formatted backtrace showing that data. For example: &lt;a href=&quot;https://rollbar.com/Rollbar/rollbar-gem/items/5979/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://rollbar.com/Rollbar/rollbar-gem/items/5979/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, Rollbar can give you more detailed information about the line of code for each frame. In fact, we can display the exact text for each line of code in the backtrace. Previously, the gem wasn&apos;t sending this information, so we&apos;ve added it as a feature to this new release. You can configure whether or not to send the extra data per frame, send it only for lines of code related to your project files, or send it for all the backtrace lines. The new configuration option is &lt;code&gt;send_extra_frame_data&lt;/code&gt; and can have the values &lt;code&gt;:none&lt;/code&gt;, &lt;code&gt;:app&lt;/code&gt; or &lt;code&gt;:all&lt;/code&gt;. Example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;configure &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;config&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send_extra_frame_data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:all&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;An example for the configuration above can be found in &lt;a href=&quot;https://rollbar.com/Rollbar/rollbar-gem/items/6800/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://rollbar.com/Rollbar/rollbar-gem/items/6800/&lt;/a&gt;. You can see that for each line of code, its text code is now available.&lt;/p&gt;
&lt;h2 id=&quot;3-async-with-resque&quot;&gt;&lt;a href=&quot;#3-async-with-resque&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Async with Resque&lt;/h2&gt;
&lt;p&gt;We&apos;ve integrated the implementation for the Resque async handler from &lt;a href=&quot;https://github.com/dimko/resque-rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;resque-rollbar&lt;/a&gt; in the gem, so you don&apos;t have to install the &lt;code&gt;resque-rollbar&lt;/code&gt; gem anymore. Other async handlers were already available in the gem, such as &lt;code&gt;DelayedJob&lt;/code&gt;, &lt;code&gt;GirlFriday&lt;/code&gt;, &lt;code&gt;Sidekiq&lt;/code&gt;, &lt;code&gt;SuckerPunch&lt;/code&gt;, or the basic threaded one. We also wanted to have Resque in the gem, since we know it&apos;s used by many of our customers.&lt;/p&gt;
&lt;h2 id=&quot;4-content-type-and-content-length&quot;&gt;&lt;a href=&quot;#4-content-type-and-content-length&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Content-Type and Content-Length&lt;/h2&gt;
&lt;p&gt;When debugging errors, it&apos;s important have as much useful information as possible, and we were missing the headers &lt;code&gt;Content-Type&lt;/code&gt; and &lt;code&gt;Content-Length&lt;/code&gt;. Now you&apos;ll see them in your occurrence details, so it will be easier to identify common errors with empty JSON bodies or wrong content types.&lt;/p&gt;
&lt;h2 id=&quot;5-get-post-and-json-body-in-the-right-places&quot;&gt;&lt;a href=&quot;#5-get-post-and-json-body-in-the-right-places&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. GET, POST, and JSON body in the right places&lt;/h2&gt;
&lt;p&gt;When pushing the request data into our API we were merging all the GET, POST, and JSON body parameters, and (if defined) Rails route parameters into the &lt;code&gt;params&lt;/code&gt; attribute. We implemented it this way so that in a Rails controller you&apos;d have everything merged into the &lt;code&gt;params&lt;/code&gt; value. However, we wanted to separate them so it will be easier to find the correct data and identify what exactly is in the GET, POST, JSON body, or route params. Now, you&apos;ll find all that data is separated out in the occurrence details.&lt;/p&gt;
&lt;h2 id=&quot;6-bug-fixes&quot;&gt;&lt;a href=&quot;#6-bug-fixes&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;6. Bug fixes&lt;/h2&gt;
&lt;p&gt;We&apos;ve pushed a few bug fixes for the gem, some of which were reported by our customers. Thank you to everyone who reported bugs! Some important bug fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix DelayedJob serialization on some backends&lt;/li&gt;
&lt;li&gt;Unable to send Rake reports at some scenarios&lt;/li&gt;
&lt;li&gt;Validation reports with ActiveModel objects are fixed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope you take full advantage of the updates to the ruby gem. Please feel free to make &lt;a href=&quot;https://github.com/rollbar/rollbar-gem/pulls&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;pull requests&lt;/a&gt;, if there&apos;s anything you feel we could do better! &lt;/p&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you
defeat annoying ruby errors in your applications. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[5 ways to reduce noise when logging your JavaScript exceptions]]></title><description><![CDATA[Developing and maintaining user facing software is a challenge and a very distracting one at that. :-)
Often times it can be difficult…]]></description><link>https://rollbar.com/blog/reduce-noise-logging-javascript-exceptions/</link><guid isPermaLink="false">https://rollbar.com/blog/reduce-noise-logging-javascript-exceptions/</guid><pubDate>Tue, 16 Aug 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Developing and maintaining user facing software is a challenge and a very distracting one at that. :-)
Often times it can be difficult trying to stay focused on what matters most. It can be hard to tell
what&apos;s really broken and why, with dozens of alerts notifying you every other minute. Volatile...
The client-side being one of the most volatile of them all.&lt;/p&gt;
&lt;p&gt;When we attempt to capture errors in this environment we can very quickly get overwhelmed by lots
and lots of noise. This noise is typically generated from many different places. Some examples would
be old outdated browsers, browser extensions, third-party scripts, bots, spiders, etc. Rollbar&apos;s
&lt;a href=&quot;https://rollbar.com/features/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JavaScript error monitoring&lt;/a&gt; supports many different ways of
reducing this noise so you can be more proactive in what and how you&apos;re collecting your JavaScript
exceptions.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h3 id=&quot;1-ignore-noisy-errors-on-the-client-side&quot;&gt;&lt;a href=&quot;#1-ignore-noisy-errors-on-the-client-side&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Ignore noisy errors on the client-side&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar.js&lt;/a&gt; supports the ability to ignore errors on the
client-side. This option is really great because you have access to the entire payload and can
filter by any value in it. By doing this the error will never be sent to the Rollbar API. This is
supported via the &lt;a href=&quot;/docs/notifier/rollbar.js/#context-1&quot;&gt;checkIgnore&lt;/a&gt;
configuration option.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; _rollbarConfig &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
    checkIgnore&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isUncaught&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// Code here to determine whether or not to send the payload&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// to the Rollbar API&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Let&apos;s break down the function value. First the parameters passed to the function.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;isUncaught&lt;/code&gt;: This is true if the error bubbled up to window.onerror or false if this came from
one of the Rollbar.js logging methods&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;args&lt;/code&gt;: This is the args passed to the Rollbar.js logging method. If the error is uncaught and is
from an unhandled rejection, the args parameter contains the Promise object.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;payload&lt;/code&gt;: This is the payload that will be sent to the Rollbar API. You can use anything in the
payload to conditionally filter these errors out.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To have Rollbar.js ignore the payload here, return true from the function, otherwise return false
to continue processing and have the error sent to the &lt;a href=&quot;/docs/api/&quot;&gt;Rollbar API&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;2-whitelist-specific-domains&quot;&gt;&lt;a href=&quot;#2-whitelist-specific-domains&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Whitelist specific domains&lt;/h3&gt;
&lt;p&gt;You can configure &lt;a href=&quot;/docs/notifier/rollbar.js/&quot;&gt;Rollbar.js&lt;/a&gt; to only accept errors
from your own domains. This option works really well when you use a lot of third party scripts and
only want to see errors coming from domains that you have control over.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; _rollbarConfig &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
    hostWhiteList&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;domain1.com&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;domain2.com&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;When &lt;a href=&quot;/docs/notifier/rollbar.js/#context-1&quot;&gt;hostWhiteList&lt;/a&gt; has been configured, we will
enumerate over the stack frames in each error. At
least one of the frames must contain a filename that contains at least one of the strings in this
configuration option. The items in the array are compiled into a Regex that is used to compare
against the filenames. This can be useful if you use a lot of third party scripts which could be
generating errors that you can not do anything about and have little control over.&lt;/p&gt;
&lt;h3 id=&quot;3-ignore-certain-types-of-messages&quot;&gt;&lt;a href=&quot;#3-ignore-certain-types-of-messages&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Ignore certain types of messages&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;/docs/notifier/rollbar.js/&quot;&gt;Rollbar.js&lt;/a&gt; has support for ignoring specific messages. This is
configured under the &lt;a href=&quot;/docs/notifier/rollbar.js/#ignoring-specific-exception-messages&quot;&gt;ignoredMessages&lt;/a&gt;
key. This method of cleaning up noisy data works really well when you have a small sample of
messages that you don&apos;t care about.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; _rollbarConfig &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
    ignoredMessages&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Can&apos;t find Clippy.bmp. The end is nigh.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;When this configuration key is set, rollbar.js looks through the values in the setting, and if any
of them match the exception message, the error will be discarded. Again these will be compiled into
a regex that is compared against the exception mesasge.&lt;/p&gt;
&lt;h3 id=&quot;4-custom-error-grouping-options&quot;&gt;&lt;a href=&quot;#4-custom-error-grouping-options&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Custom error grouping options&lt;/h3&gt;
&lt;p&gt;The first three options (ignoring errors on the client-side, whitelist accepted hosts, ignore
messages) are all specific to the client-side and work to prevent the error from ever being sent to
and recorded in Rollbar. Custom Grouping however is when you still want the error data sent to
Rollbar and viewable in your dashboard for data metrics and reporting purposes, but you want to
reduce the some of the &apos;noise&apos; in the &lt;a href=&quot;/features/&quot;&gt;Items&lt;/a&gt; list. You can setup custom grouping rules to group your
errors together in a way that makes sense for you. This is the best option to use when you still
want to see the error occurrences in your dashboard, but want full control over how they are grouped
together. Here is a really in depth blog post on
&lt;a href=&quot;/blog/error-grouping-tutorial&quot;&gt;how to improve your error grouping in Rollbar&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;5-ask-for-help--&quot;&gt;&lt;a href=&quot;#5-ask-for-help--&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. Ask for help :-)&lt;/h3&gt;
&lt;p&gt;Email us at &lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt;. We&apos;d be happy to help you set things up for your Projects and
unique situation.&lt;/p&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you
defeat annoying client-side javascript errors in your applications. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SAML-based Single Sign-On (SSO) now available]]></title><description><![CDATA[If your team uses  Google Apps for Work  or  Okta ,
you can now access your Rollbar account using SAML-based single sign-on (SSO).  SSO via…]]></description><link>https://rollbar.com/blog/saml-single-sign-on-is-now-available/</link><guid isPermaLink="false">https://rollbar.com/blog/saml-single-sign-on-is-now-available/</guid><pubDate>Mon, 18 Jul 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If your team uses &lt;a href=&quot;https://apps.google.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Google Apps for Work&lt;/a&gt; or &lt;a href=&quot;https://www.okta.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Okta&lt;/a&gt;,
you can now access your Rollbar account using SAML-based single sign-on (SSO).  SSO via Google Apps
and Okta is available on all &lt;a href=&quot;/pricing/&quot;&gt;paid plans&lt;/a&gt;, and can be
&lt;a href=&quot;/docs/saml/&quot;&gt;setup in minutes&lt;/a&gt; by an admin.&lt;/p&gt;
&lt;p&gt;Once SSO is enabled, users can access your Rollbar account with just a click from the Google App
Drawer or Okta My Applications screen.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;google-app-drawer&quot;&gt;&lt;a href=&quot;#google-app-drawer&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Google App Drawer&lt;/h2&gt;
&lt;p&gt;![]({{ site.cdn&lt;em&gt;url }}/blog/images/2016/2016-07-18-saml-single-sign-on-is-now-available/screen&lt;/em&gt;shot&lt;em&gt;2016-07-08&lt;/em&gt;at&lt;em&gt;50539&lt;/em&gt;pm_480.153799.l.png)&lt;/p&gt;
&lt;h2 id=&quot;okta-my-applications&quot;&gt;&lt;a href=&quot;#okta-my-applications&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Okta My Applications&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2016/2016-07-18-saml-single-sign-on-is-now-available/Screen-Shot-2016-07-18-at-25625-PM.153862.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;If Google or Okta-based SSO is enabled on your account, then SSO options will show up on the login
screen whenever you are prompted.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2016/2016-07-18-saml-single-sign-on-is-now-available/Screen-Shot-2016-07-14-at-34355-PM.153813.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Ready to set up SSO for your account?  Check out our
&lt;a href=&quot;/docs/single-sign-on-sso/&quot;&gt;step-by-step documentation&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Two-Factor Authentication now available for all users]]></title><description><![CDATA[We’re excited to introduce  Two-Factor Authentication  (2FA) in Rollbar as an
optional extra layer of security on every user’s account. 2FA…]]></description><link>https://rollbar.com/blog/two-factor-authentication/</link><guid isPermaLink="false">https://rollbar.com/blog/two-factor-authentication/</guid><pubDate>Thu, 23 Jun 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2016/2016-06-23-two-factor-authentication/security-bg.153668.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;We’re excited to introduce &lt;a href=&quot;/settings/profile/&quot;&gt;Two-Factor Authentication&lt;/a&gt; (2FA) in Rollbar as an
optional extra layer of security on every user’s account. 2FA reduces your risk of having your
account hacked through phishing, credential exploitation or other remote attacks.&lt;/p&gt;
&lt;p&gt;We highly recommend enabling Two-Factor Authentication for your entire team. It’s easy to setup (and
free)!&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;To enable 2FA, go to your &lt;a href=&quot;/settings/profile/&quot;&gt;user settings page&lt;/a&gt; and click Enable under Two-Factor
Authentication. Then scan the QR code, and enter in your two-factor authentication verification
token from an authentication app of your choice. One of the more popular authentication apps is
Google Authenticator (available free for
&lt;a href=&quot;https://itunes.apple.com/us/app/google-authenticator/id388497605&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;iOS&lt;/a&gt; and
&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;#x26;hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Android&lt;/a&gt;).
Once you&apos;re all setup, you’ll be prompted for your token whenever you log in.&lt;/p&gt;
&lt;p&gt;2FA is available for all users in all plans at no additional charge. To learn more about Two-Factor
Authentication in Rollbar, check out our &lt;a href=&quot;/docs/two-factor-authentication/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Exception monitoring for production environments]]></title><description><![CDATA[Tools like Rollbar have changed the way development teams are recording and managing their
exceptions. What used to be a very personal…]]></description><link>https://rollbar.com/blog/exception-monitoring-for-production/</link><guid isPermaLink="false">https://rollbar.com/blog/exception-monitoring-for-production/</guid><pubDate>Mon, 06 Jun 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tools like Rollbar have changed the way development teams are recording and managing their
exceptions. What used to be a very personal developer-by-developer activity can now be a team-wide
tool for greater transparency, and increased application quality.&lt;/p&gt;
&lt;p&gt;But many still treat exception monitoring as a developer activity, and they are not leveraging its
benefits across all environments, from development to stage and integration, to systems testing and
production. In this post and another on QA environments, I will review why exception monitoring in
all environments is so beneficial, and some best practices for setting it up.&lt;/p&gt;
&lt;p&gt;We are trying to standardize with Rollbar for exception monitoring across environments and clients.
It helps our clients have visibility and thus better input into the application and development
processes, and it’s a good way for us to ensure quality prior to delivering releases to customers.&lt;/p&gt;
&lt;p&gt;But even after release, the tool has been extremely useful for the following reasons:&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;1-it-is-needed-to-support-cd-and-canary-releases&quot;&gt;&lt;a href=&quot;#1-it-is-needed-to-support-cd-and-canary-releases&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. It is needed to support CD and canary releases:&lt;/h2&gt;
&lt;p&gt;More and more we are asked to consider using continuous delivery (CD) and canary release processes.
While in many cases it is not possible or a good fit, when we do get an opportunity to implement CD,
exception monitoring is the only way to support it, because code goes from developer to source repo
and directly to prod as long as the basic tests show up green. We know very little about the code,
and do not have the eyeballs on exceptions that we normally would. This way, an exception in prod is
just one more trigger to let us know that a release should be rolled back. We do the same for our
server monitoring, so of course we should as well with code. We also use it to help with more
supporting data in A/B testing of releases.&lt;/p&gt;
&lt;h2 id=&quot;2-we-cannot-always-ensure-environment-parity&quot;&gt;&lt;a href=&quot;#2-we-cannot-always-ensure-environment-parity&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. We cannot always ensure environment parity:&lt;/h2&gt;
&lt;p&gt;We do our best to ensure parity between all environments, but it’s simply not possible. Different
applications have different requirements in terms of infrastructure. Our development environment is
fairly static, and it is local. Production can be on different configurations, and even different
clouds. So we are dealing with a hybrid scenario where for each client the production environment is
unique. These variables can easily cause issues where the differences in the production environment
compared to dev causes issues in code—things such as a mismatch on frameworks and other artifacts.
When this happens, sometimes exception monitoring is the only way to know.&lt;/p&gt;
&lt;h2 id=&quot;3-it-is-a-key-performance-indicator---accountability-all-the-way-to-production&quot;&gt;&lt;a href=&quot;#3-it-is-a-key-performance-indicator---accountability-all-the-way-to-production&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. It is a Key Performance Indicator - accountability all the way to production:&lt;/h2&gt;
&lt;p&gt;I believe that all developers have increasing responsibility for what happens in production. But in
our case, because we own the development processes of our clients, there is no question our
developers are accountable for code quality all the way up to production. And the analytics we
receive from Rollbar help us gauge how well our Dev groups are doing with code quality, where it
matters the most—the user. This allows us to quantify the impact directly and leave no question as
to how what happens in Dev impacts users.&lt;/p&gt;
&lt;h2 id=&quot;4-it-helps-qa-and-ops-communicate-with-developers&quot;&gt;&lt;a href=&quot;#4-it-helps-qa-and-ops-communicate-with-developers&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. It helps QA and Ops communicate with developers:&lt;/h2&gt;
&lt;p&gt;If there is a bug in production, often QA, Support and Ops teams are left with little information to
pass on to the Dev team. In reality, what usually happens is that it is not reported at all, not
until the error is noticed in earlier environments much later on. With Rollbar we are able to show
details about exceptions. Even if Support, QA and Ops do not understand the details, they are able
to communicate more effectively with developers and get them pointed in the right direction faster.
It helps avoid the “worked on my machine” problem, and helps relate application issues with
potential infrastructure issues. Plus, it reduces the amount of time that it takes for issues to be
resolved. And because we have monitoring of all environments, we can see if the exception was
already showing up in earlier environments. (If so, something is broken in our process.)&lt;/p&gt;
&lt;h2 id=&quot;5-it-helps-qa-and-ops-communicate-with-developers&quot;&gt;&lt;a href=&quot;#5-it-helps-qa-and-ops-communicate-with-developers&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. It helps QA and Ops communicate with developers:&lt;/h2&gt;
&lt;p&gt;Using the People data feature in Rollbar, we can, via support or email, engage directly with
customers, before they potentially submit a ticket, or even worse, reach out on social media about
the issue they encountered. This is a tailored user experience, and something that only happens in
production.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2016/2016-06-06-exception-monitoring-for-production/image02.153485.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;6-web-jobs&quot;&gt;&lt;a href=&quot;#6-web-jobs&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;6. Web Jobs:&lt;/h2&gt;
&lt;p&gt;We do a lot of web jobs that run specific serverless functions. In Azure, we use
&lt;a href=&quot;https://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;WebJobs&lt;/a&gt;,
&lt;a href=&quot;https://azure.microsoft.com/en-us/services/functions/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Functions&lt;/a&gt; and
&lt;a href=&quot;https://aws.amazon.com/lambda/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;AWS Lambda&lt;/a&gt;. Because these scripts are not apart of our applications
and our applications’ error reporting, it is not easy to know what is going on, or to debug them. In
both AWS and Azure when a script breaks, sometimes the only indicator you get is that the job stops,
or it perpetually restarts. Calls to Rollbar in our exception blocks in some cases is the only way
of knowing if something breaks. When we use Rollbar in our web jobs, we make sure that the web job
is set up as its own environment so we can report on each one.&lt;/p&gt;
&lt;p&gt;We do get exceptions and errors in production, even for small applications. See below:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2016/2016-06-06-exception-monitoring-for-production/image00.153484.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;As long as that is happening, we need exception monitoring in production—because as we move from the
development environment to production, the cost of each exception goes up. The consistency across
all environments means that our knowledge does not drop off a cliff, and we have greater
transparency, consistency, and quality of product.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Using Rollbar to unravel existing Laravel applications]]></title><description><![CDATA[
Read our new blog  Announcing Laravel error monitoring with Rollbar  ! About 6 months ago I inherited a project (let’s call it Project…]]></description><link>https://rollbar.com/blog/unravel-exceptions-in-laravel-applications/</link><guid isPermaLink="false">https://rollbar.com/blog/unravel-exceptions-in-laravel-applications/</guid><pubDate>Tue, 24 May 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p class=&quot;highlightbox&quot;&gt;
Read our new blog &lt;strong&gt;&lt;a href=&quot;/blog/laravel-error-monitoring/&quot;&gt;Announcing Laravel error monitoring with Rollbar&lt;/a&gt;&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;About 6 months ago I inherited a project (let’s call it Project Mayhem) that was grossly neglected
by the original developer. I won’t go into too many details, but let’s just say that I’ve seen
spaghetti with more order than this codebase had. No unit tests, no documentation, illogical
architecture, and an expecting client… I felt like I was literally living in one of those nightmares
where I’m late for the final exam in a class I passed a decade ago.&lt;/p&gt;
&lt;p&gt;The icing on this terrible cake was that I also inherited the hosting and was graciously provided
with absolutely no specs in order to replicate the previous production environment. I was flying
blind, and if it weren’t for Rollbar&apos;s &lt;a href=&quot;/error-tracking/php/&quot;&gt;php error logging tools&lt;/a&gt;, this project
would have crashed and burned long before I could make any meaningful changes to it. I was able to
manage and prioritize exceptions as they happened, which gave me the information I needed to build
out a proper hosting architecture and quickly fix existing issues in the codebase.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2016/2016-05-24-unravel-exceptions-in-laravel-applications/image02.153439.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Suffice it to say, I am a big fan of Rollbar.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Luckily for me, Project Mayhem was built on &lt;a href=&quot;https://laravel.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Laravel&lt;/a&gt;, an increasingly popular
PHP framework with an impressive array of third-party plugins; one of which just so happens to be
made specifically for &lt;a href=&quot;https://github.com/jenssegers/Laravel-Rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar&lt;/a&gt;. Getting Rollbar
setup on Laravel was as simple as running just a few commands, but what if the project wasn’t built
on Laravel? What if it was a “bespoke” PHP application?&lt;/p&gt;
&lt;p class=&quot;highlightbox&quot;&gt;
Since this blog was written, we&apos;ve released a new &lt;strong&gt;&lt;a href=&quot;/blog/laravel-error-monitoring/&quot;&gt;Laravel Notifier&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Well… Rollbar &lt;a href=&quot;https://github.com/rollbar/rollbar-php&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;thought of that&lt;/a&gt;. They’ve built out a PHP
client for their API that allows developers to quickly and easily integrate Rollbar with their
applications. To get started, all you have to do is require &lt;code&gt;&quot;rollbar/rollbar&quot;: &quot;~0.15.0&lt;/code&gt; in your
&lt;code&gt;composer.json&lt;/code&gt; file and (like all Composer plugins) you’re good to go!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-json&quot;&gt;&lt;code&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;require&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;rollbar/rollbar&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;~0.15.0&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt; The interesting thing about the way the Rollbar PHP client works is that (unless otherwise
specified) it will automatically catch your exceptions; you do not have to send them up manually.
No muss, no fuss. All you have to do is add the following code to your application’s entry point
(typically a bootstrap file or index file):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-php&quot;&gt;&lt;code&gt;&lt;span class=&quot;token variable&quot;&gt;$config&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;access_token&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;POST_SERVER_ITEM_ACCESS_TOKEN&apos;&lt;/span&gt; Rollbar&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;What this little piece of code does is install an exception handler in PHP which catches every
exception thrown and sends it up to Rollbar. I should note here that the configuration can be
&lt;a href=&quot;/docs/notifier/rollbar-php/&quot;&gt;much more in-depth&lt;/a&gt;, but I’m only showing the bare-bones to get you started.
While nothing else needs to be done in order to start enjoying the benefits of Rollbar in your PHP
application, you can still manually send up data by simply calling the &lt;code&gt;report_method()&lt;/code&gt; function.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-php&quot;&gt;&lt;code&gt;Rollbar&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;report_message&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;’Stuff &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; things&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&apos;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Level&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;WARNING&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The beauty of this method is that it gives you the ability to send supplementary, non-critical data
up to Rollbar. Warnings, internal errors, bad data, attempted security breaches. You can easily send
any useful data up to Rollbar with minimal effort, and save yourself hours of headache.&lt;/p&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you
defeat annoying laravel errors in your PHP applications. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Streamline monitoring with Rollbar & Datadog]]></title><description><![CDATA[Good news! We’ve recently released a new integration with  Datadog  to help
extend your  error monitoring  options. Datadog is a leading…]]></description><link>https://rollbar.com/blog/error-monitoring-rollbar-and-datadog/</link><guid isPermaLink="false">https://rollbar.com/blog/error-monitoring-rollbar-and-datadog/</guid><pubDate>Mon, 25 Apr 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2016/2016-04-25-error-monitoring-rollbar-and-datadog/rollbardatadog.153203.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Good news! We’ve recently released a new integration with &lt;a href=&quot;https://datadoghq.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Datadog&lt;/a&gt; to help
extend your &lt;a href=&quot;/features/&quot;&gt;error monitoring&lt;/a&gt; options. Datadog is a leading cloud monitoring solution
that brings metrics from all of your apps, tools &amp;#x26; services (like Rollbar) into one place. Now
Rollbar and Datadog users can syndicate exceptions, errors and code deployments as &apos;Events’ within
&lt;a href=&quot;https://datadoghq.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Datadog&lt;/a&gt; (example below).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/rollbar-error-in-datadog.153204.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here&apos;s a few of the ways you can improve your monitoring when you connect Rollbar and Datadog:&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul&gt;
&lt;li&gt;Get notified of exceptions, errors, code deployments in your event stream&lt;/li&gt;
&lt;li&gt;Filter notifications by severity, environment, host, users and more&lt;/li&gt;
&lt;li&gt;Search for exceptions in your graphs Discuss exceptions with your team&lt;/li&gt;
&lt;li&gt;Most important - spend less time debugging issues&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We hope that by bringing your Rollbar data into Datadog you can streamline your monitoring efforts
and reduce some of the noise in your day to day workflow.&lt;/p&gt;
&lt;p&gt;For more information, check out our &lt;a href=&quot;/docs/datadog/&quot;&gt;integration docs&lt;/a&gt; for Datadog.
Also, to see if Rollbar integrates with other tools you’re using, see our full list of integrations
&lt;a href=&quot;/docs/tools/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you
defeat errors in production. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[6 ways to improve error grouping in Rollbar]]></title><description><![CDATA[You're two weeks into using Rollbar. You've watched in amazement as issue after issue comes in
without a single customer complaint to…]]></description><link>https://rollbar.com/blog/error-grouping-tutorial/</link><guid isPermaLink="false">https://rollbar.com/blog/error-grouping-tutorial/</guid><pubDate>Mon, 11 Apr 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You&apos;re two weeks into using Rollbar. You&apos;ve watched in amazement as issue after issue comes in
without a single customer complaint to accompany them. How did you ever find errors before!?&lt;/p&gt;
&lt;p&gt;Now that your unresolved errors have drastically decreased, you&apos;ve started to notice a handful of
Rollbar items that all seem to be exactly the same issue. Maybe you&apos;ve been notified that your UI
has exceeded the maximum call stack when calling a particular function. And in one case you found
out that your database is actually missing several columns which got grouped into a single error.&lt;/p&gt;
&lt;p&gt;What&apos;s a new Rollbar user to do? Here&apos;s 6 steps to help you improve your error grouping in Rollbar:&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;1-learn-how-rollbar-groups-items&quot;&gt;&lt;a href=&quot;#1-learn-how-rollbar-groups-items&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Learn how Rollbar groups items.&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/docs/grouping-algorithm/&quot;&gt;The Rollbar grouping algorithm&lt;/a&gt; attempts to be as smart as
possible by grouping items by root cause. Error type items are grouped by a combination of platform,
environment, error class, and stack trace information. Message type items are grouped by message
text after stripping out certain number-like and date-like portions of the message.&lt;/p&gt;
&lt;h2 id=&quot;2-customize-your-error-grouping&quot;&gt;&lt;a href=&quot;#2-customize-your-error-grouping&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Customize your error grouping.&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/docs/custom-grouping/&quot;&gt;Custom grouping&lt;/a&gt; enables you to decide exactly how Rollbar will group your
items. You can alter the title, change the fingerprinting (and therefore the grouping), and use any
data you send to us to make it work!&lt;/p&gt;
&lt;h2 id=&quot;3-make-sure-youre-setting-the-server-root&quot;&gt;&lt;a href=&quot;#3-make-sure-youre-setting-the-server-root&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Make sure you&apos;re setting the server root.&lt;/h2&gt;
&lt;p&gt;Before grouping by filename, Rollbar will strip off whatever you&apos;re sending in the server root
segment. This means that you can host the code from varying locations, but still get the same
grouping, no matter where on the system you host your code. Each notifier allows setting this in its
own way. &lt;a href=&quot;/docs/notifier/&quot;&gt;Check out the docs&lt;/a&gt; for your notifier to learn how!&lt;/p&gt;
&lt;h2 id=&quot;4-consider-customizing-your-stack-trace-before-sending&quot;&gt;&lt;a href=&quot;#4-consider-customizing-your-stack-trace-before-sending&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Consider customizing your stack trace before sending.&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/rollbar/rollbar.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;rollbar.js&lt;/a&gt;,
&lt;a href=&quot;https://github.com/rollbar/rollbar-gem&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;rollbar-gem&lt;/a&gt;, and several of our
&lt;a href=&quot;/docs/items_other/&quot;&gt;community notifiers&lt;/a&gt; have the ability to alter the error
payload being sent to Rollbar just before sending them. Almost all of them can send custom data. If
you have a specific case where you know how to make the payload get grouped correctly (by stripping
out repeated stack frames in a recursive function, or normalizing a dynamically named function) you
can alter the stack trace before it&apos;s sent to get it to work with our default grouping algorithm. If
the alteration is just too complex, consider sending a custom data field and using custom grouping
to group on that when present. There are tons of ways to get this exactly right. Don&apos;t settle for
anything less.&lt;/p&gt;
&lt;h2 id=&quot;5-send-a-fingerprint&quot;&gt;&lt;a href=&quot;#5-send-a-fingerprint&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. Send a fingerprint.&lt;/h2&gt;
&lt;p&gt;Sometimes you know exactly how an item should be grouped in Rollbar, and there&apos;s no simple way to
express that in a custom grouping rule. In this case all our official notifiers, and most community
ones, have a way to send a fingerprint that is the field we group by to determine what item an
occurrence gets grouped with. The field can be up to 40 characters long. If you go over, that&apos;s
fine! Our system will hash it to ensure it fits. This will almost never result in a collision, so
feel free to have a fingerprint like
&quot;the-error-that-occurs-when-we-send-a-bad-id-to-stripe-for-customer:BIGNAME&quot;. We&apos;ll take care of
making it fit!&lt;/p&gt;
&lt;h2 id=&quot;6-ask-for-help&quot;&gt;&lt;a href=&quot;#6-ask-for-help&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;6. Ask for help!&lt;/h2&gt;
&lt;p&gt;Email us at &lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt;. We&apos;d be happy to help you set things up for your unique situation.&lt;/p&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you
defeat annoying errors in your applications. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Meet the Rollbar team IRL at these upcoming events]]></title><description><![CDATA[Rollbar is hitting the road. Catch one (or more) or our team members at the following events in the
next few months. We welcome the…]]></description><link>https://rollbar.com/blog/2016-spring-events-schedule/</link><guid isPermaLink="false">https://rollbar.com/blog/2016-spring-events-schedule/</guid><pubDate>Fri, 25 Mar 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Rollbar is hitting the road. Catch one (or more) or our team members at the following events in the
next few months. We welcome the opportunity to talk to you about your projects, answer your
questions and share some Rollbar swag. If you see us at an event, please stop by and say &quot;Hi.”&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;lone-star-php&quot;&gt;&lt;a href=&quot;#lone-star-php&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Lone Star PHP&lt;/h2&gt;
&lt;h3 id=&quot;where-dallas-texas-----when-fri-april-8-to-sat-april-9&quot;&gt;&lt;a href=&quot;#where-dallas-texas-----when-fri-april-8-to-sat-april-9&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where: Dallas, Texas   /  When: Fri, April 8 to Sat, April 9&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;http://lonestarphp.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Lone Star PHP&lt;/a&gt; Conference brings together great PHP speakers and
topics into a fantastic two-day event that is &apos;clap, clap, clap&apos; deep in the heart of Texas. Catch
me, &lt;a href=&quot;/about/&quot;&gt;Mike Smith&lt;/a&gt; (and local Texan) handing out Rollbar swag and making friends. ;)&lt;/p&gt;
&lt;h2 id=&quot;emberconf&quot;&gt;&lt;a href=&quot;#emberconf&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;EmberConf&lt;/h2&gt;
&lt;h3 id=&quot;where-portland-oregon----when-tues-march-29-to-wed-march-30&quot;&gt;&lt;a href=&quot;#where-portland-oregon----when-tues-march-29-to-wed-march-30&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where: Portland, Oregon  /  When: Tues, March 29 to Wed, March 30&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://emberconf.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;EmberConf&lt;/a&gt; is the flagship event of the Ember community. It’s two days of
sessions, talks, and good times with the Ember Core Team and community members from around the
world. Our CEO and Co-founder &lt;a href=&quot;/about/&quot;&gt;Brian Rue&lt;/a&gt; will be there, so say hi if you happen to see
anyone in a Rollbar shirt.&lt;/p&gt;
&lt;h2 id=&quot;ruby-on-ales&quot;&gt;&lt;a href=&quot;#ruby-on-ales&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ruby On Ales&lt;/h2&gt;
&lt;h3 id=&quot;where-bend-oregon----when-thurs-march-31-to-fri-april-1&quot;&gt;&lt;a href=&quot;#where-bend-oregon----when-thurs-march-31-to-fri-april-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where: Bend, Oregon  /  When: Thurs, March 31 to Fri, April 1&lt;/h3&gt;
&lt;p&gt;We’re ending our tour of Oregon at this years &lt;a href=&quot;https://ruby.onales.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ruby on Ales&lt;/a&gt; event. Ruby
on Ales is a two-day single track Ruby conference, with a super cool name. It is two full days of
presentations, networking and good ole fashion community fellowship.&lt;/p&gt;
&lt;h2 id=&quot;railsconf&quot;&gt;&lt;a href=&quot;#railsconf&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;RailsConf&lt;/h2&gt;
&lt;h3 id=&quot;where-kansas-city-missouri----when-wed-may-4-to-fri-may-6&quot;&gt;&lt;a href=&quot;#where-kansas-city-missouri----when-wed-may-4-to-fri-may-6&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where: Kansas City, Missouri  /  When: Wed, May 4 to Fri, May 6&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://railsconf.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;RailsConf&lt;/a&gt; is the largest gathering of Rails developers in the world, not to
mention the largest gathering of Rubyists. We&apos;ll be sponsoring and exhibiting, so stop by and say
hi, learn about updates to our &lt;a href=&quot;https://github.com/rollbar/rollbar-gem&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;ruby gem&lt;/a&gt; and grab some of
our new Rollbar swag.&lt;/p&gt;
&lt;h2 id=&quot;pycon&quot;&gt;&lt;a href=&quot;#pycon&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;PyCon&lt;/h2&gt;
&lt;h3 id=&quot;where-portland-oregon----when-mon-may-30-to-wed-june-1&quot;&gt;&lt;a href=&quot;#where-portland-oregon----when-mon-may-30-to-wed-june-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where: Portland, Oregon  /  When: Mon, May 30 to Wed, June 1&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://us.pycon.org/2016/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;PyCon&lt;/a&gt; is the largest annual gathering for the community using and
developing the open-source Python programming language. Organized by the awesome folks in the Python
community. We are sponsoring and exhibiting for the first time at PyCon. Please stop by our booth
and say hi, talk shop and grab some new Rollbar swag.&lt;/p&gt;
&lt;h3 id=&quot;want-a-free-ticket-to-pycon&quot;&gt;&lt;a href=&quot;#want-a-free-ticket-to-pycon&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Want a free ticket to PyCon?&lt;/h3&gt;
&lt;p&gt;We have one free pass to &lt;a href=&quot;https://us.pycon.org/2016/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;PyCon&lt;/a&gt; we are giving away.
&lt;a href=&quot;http://ctt.ec/BK7Wp&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Click here to tweet us&lt;/a&gt; and we’ll randomly select the winner on Mon, April 4th.&lt;/p&gt;
&lt;h2 id=&quot;schedule-an-in-person-meeting&quot;&gt;&lt;a href=&quot;#schedule-an-in-person-meeting&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Schedule an in-person meeting&lt;/h2&gt;
&lt;p&gt;We’re making
[office hours](&lt;a href=&quot;mailto:team@rollbar.com?subject=I&amp;#x27;d&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;team@rollbar.com?subject=I&apos;d&lt;/a&gt; like to meet at [add event you are attending here]&quot;)
available during these events. Schedule some time with us to sit down with a Rollbar expert to show
you how you can level-up your app monitoring and error handling processes. Visit us at our booth or
email [team@rollbar.com](&lt;a href=&quot;mailto:team@rollbar.com?subject=I&amp;#x27;d&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;team@rollbar.com?subject=I&apos;d&lt;/a&gt; like to meet at [add event you are attending here])
to get something scheduled.&lt;/p&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you
defeat annoying errors in your applications. :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Query Rollbar data directly from our API]]></title><description><![CDATA[Good news for RQL users. Until recently RQL usage was limited to the Rollbar interface. That's no
longer a problem. Now you can  access RQL…]]></description><link>https://rollbar.com/blog/access-rql-from-the-api/</link><guid isPermaLink="false">https://rollbar.com/blog/access-rql-from-the-api/</guid><pubDate>Mon, 15 Feb 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Good news for RQL users. Until recently RQL usage was limited to the Rollbar interface. That&apos;s no
longer a problem. Now you can &lt;a href=&quot;/docs/api/rql/&quot;&gt;access RQL directly from our API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We like to believe that our interface provides just about everything you need to discover,
investigate and resolve errors in your software. That being said, we know that everyone&apos;s needs are
not the same. So, we created the &lt;a href=&quot;/docs/rql/&quot;&gt;Rollbar Query Language&lt;/a&gt; (RQL for short) to give
Rollbar users more controls over their data. Many of our users have grown to depend on RQL for
getting their day to day work done.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2016/2016-02-15-access-rql-from-the-api/rql-rollbar.152221.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;RQL is a familiar SQL-like language for querying your Rollbar data. Here&apos;s a few ways that RQL can
be useful:&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul&gt;
&lt;li&gt;Want to find out the number of 500s your users experienced broken down by the url they were on at
the moment?&lt;/li&gt;
&lt;li&gt;Search items using more complex filters than is possible on the Rollbar website.&lt;/li&gt;
&lt;li&gt;Search for items that occurred between two specific deploys&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Extend the power of RQL and make the perfect dashboard or tool with your queried error data directly
from the API. For help, checkout our &lt;a href=&quot;/docs/api/rql/&quot;&gt;API documentation for RQL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For an example that runs on the data from our Live Demo check out the
&lt;a href=&quot;https://github.com/rollbar/api-examples&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;API-Examples&lt;/a&gt; repository on GitHub.&lt;/p&gt;
&lt;p&gt;New to Rollbar? &lt;a href=&quot;/signup/&quot;&gt;Signup&lt;/a&gt; for a 14-day free trial and get instant insights into your
application errors.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Rollbar add-on now available for Bitbucket]]></title><description><![CDATA[On the heels of Atlassian's announcement of
 Atlassian Connect for Bitbucket 
yesterday, we're excited to introduce our very own
 Rollbar…]]></description><link>https://rollbar.com/blog/new-atlassian-connect-bitbucket-addon/</link><guid isPermaLink="false">https://rollbar.com/blog/new-atlassian-connect-bitbucket-addon/</guid><pubDate>Thu, 11 Jun 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-06-11-new-atlassian-connect-bitbucket-addon/bitbucket-rollbar.147183.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the heels of Atlassian&apos;s announcement of
&lt;a href=&quot;https://developer.atlassian.com/blog/2015/06/atlassian-connect-for-bitbucket-a-new-way-to-extend-your-workflow-in-the-cloud/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Atlassian Connect for Bitbucket&lt;/a&gt;
yesterday, we&apos;re excited to introduce our very own
&lt;a href=&quot;https://marketplace.atlassian.com/plugins/rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rollbar Add-On&lt;/a&gt; for the Bitbucket community.&lt;/p&gt;
&lt;p&gt;With the new Rollbar Add-On for Bitbucket and our recent
&lt;a href=&quot;/blog/connect-rollbar-to-bitbucket-issue-tracker/&quot;&gt;Bitbucket Issue Tracker integration&lt;/a&gt;,
you can now monitor and keep tabs on your errors and exceptions within Bitbucket. No more switching
between multiple tools and services to debug and deploy code. Atlassian Connect for Bitbucket
provides an integration architecture that embeds add-ons right within the their UI creating a
seamless user experience and unified workflow.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;how-to-install-the-rollbar-bitbucket-add-on&quot;&gt;&lt;a href=&quot;#how-to-install-the-rollbar-bitbucket-add-on&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to install the Rollbar Bitbucket add-on?&lt;/h2&gt;
&lt;p&gt;If you&apos;re currently a user of Bitbucket, click on your avatar, select &quot;Manage Account&quot;, and simply
install the Rollbar add-on by selecting &quot;Find new add-ons&quot; from the left menu.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-06-11-new-atlassian-connect-bitbucket-addon/bb-rb.147180.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Once the add-on is installed, Rollbar data will be accessible per your Bitbucket repo dashboard(s).
Note: Atlassian Connect for Bitbucket uses fine-grained permissions to grant add-on access to
repositories, issues, accounts, teams, snippets and pull requests.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-06-11-new-atlassian-connect-bitbucket-addon/rollbar-bitbucket-screenshot.146968.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;We are thrilled to be a part of Atlassian Connect for Bitbucket and for the opportunity to build and
maintain a valuable add-on for the Bitbucket community and Rollbar users to find and fix errors  even
faster!&lt;/p&gt;
&lt;p&gt;What&apos;s next? We&apos;re currently working toward full support for Bitbucket which includes Issues, Source
Control and Authentication. Stay tuned.&lt;/p&gt;
&lt;p&gt;Leave a comment or send a note to support[at]rollbar.com and let us know if you have any feedback or
questions. Happy to help.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Easier way to get your team on Rollbar]]></title><description><![CDATA[Joining and getting your team on Rollbar is now easier. Rollbar is better together and our latest account setting makes it easier to get…]]></description><link>https://rollbar.com/blog/easier-way-to-get-teams-on-rollbar/</link><guid isPermaLink="false">https://rollbar.com/blog/easier-way-to-get-teams-on-rollbar/</guid><pubDate>Tue, 19 May 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;joining-and-getting-your-team-on-rollbar-is-now-easier&quot;&gt;&lt;a href=&quot;#joining-and-getting-your-team-on-rollbar-is-now-easier&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Joining and getting your team on Rollbar is now easier.&lt;/h2&gt;
&lt;p&gt;Rollbar is better together and our latest account setting makes it easier to get everyone together.
I&apos;m happy to introduce Email Domain Whitelists.&lt;/p&gt;
&lt;p&gt;Previously the only way to join your team on Rollbar was being invited via email. Admins had to send
email invites one by one. This can be tough for large organizations and fast growing engineering
teams.&lt;/p&gt;
&lt;p&gt;With Email Domain Whitelists, now you can set an email domain whitelist, so that anyone with an
address at a specified domain can join your account (once confirmed). No more one off invitations.
Making the workflow for admins and new team members easier and less confusing.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h3 id=&quot;problem&quot;&gt;&lt;a href=&quot;#problem&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;PROBLEM:&lt;/h3&gt;
&lt;p&gt;As we have grown we&apos;ve seen more and more new users who are employees at companies that are already
using Rollbar get lost trying to join their company’s account. The scenario looks something like
this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You see a notification in your company&apos;s Slack, HipChat, or an issue in JIRA, GitHub etc.&lt;/li&gt;
&lt;li&gt;Click link to view more details&lt;/li&gt;
&lt;li&gt;Hit the Rollbar login page (confusion ensues)&lt;/li&gt;
&lt;li&gt;Decide to signup and create a new separate account that is orphaned from your company’s account&lt;/li&gt;
&lt;li&gt;Ask Admin to add/invite you to their Team on Rollbar&lt;/li&gt;
&lt;li&gt;The new account you created gets abandoned :(&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;solution&quot;&gt;&lt;a href=&quot;#solution&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SOLUTION:&lt;/h3&gt;
&lt;p&gt;With the new email domain whitelist, anyone who signs up (from specified domains) automatically gets
added to your account once they confirm their email address. Go to /settings/accounts/Name/ to setup
(need to be on the Owners team to enable).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-05-19-easier-way-to-get-teams-on-rollbar/rollbar-teams-setting.146447.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Few items of note. Invites are on and email whitelists are off by default. Currently it only works
on pages that would normally require login (i.e. link to project, error item, deploy). Here&apos;s how it
works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Next time someone clicks a link in Slack, HipChat, JIRA, GitHub they will prompted to login
or join a team
![]({{ site.cdn&lt;em&gt;url }}/blog/images/2015/2015-05-19-easier-way-to-get-teams-on-rollbar/rollbar-teams-setting-page.146385.l.png)
![]({{ site.cdn&lt;/em&gt;url }}/blog/images/2015/2015-05-19-easier-way-to-get-teams-on-rollbar/rollbar-teams-signup.146491.l.png)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confirmation
![]({{ site.cdn_url }}/blog/images/2015/2015-05-19-easier-way-to-get-teams-on-rollbar/confirmation-teams-rollbar.146387.l.png)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Interested? Have your account admins enable the setting, send your team links to your projects and
get everyone onboard.&lt;/p&gt;
&lt;p&gt;This is our first solution to solving this problem. We&apos;re evaluating how we can extend this to
direct signups (that match a whitelist) and sharable links while maintaining the highest privacy and
security standards.  &lt;/p&gt;
&lt;p&gt;PS - It doesn&apos;t cost you more to add additional team members. So if you have 1 trillion members on
your team, it&apos;s all good. :)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Edit and rename error item titles]]></title><description><![CDATA[You can now rename/edit your error titles. Fix ugly long titles. Hover over, click, edit, and save. Enjoy!]]></description><link>https://rollbar.com/blog/edit-and-rename-error-item-titles/</link><guid isPermaLink="false">https://rollbar.com/blog/edit-and-rename-error-item-titles/</guid><pubDate>Thu, 26 Mar 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You can now rename/edit your error titles. Fix ugly long titles. Hover over, click, edit, and save.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-03-26-edit-and-rename-error-item-titles/rename-rollbar-error-titles.145059.o.gif&quot; alt=&quot;&quot; title=&quot;rename rollbar error tracking titles&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Connect Rollbar to Bitbucket Issue Tracker]]></title><description><![CDATA[New integration now available - Bitbucket Issue Tracker Supercharge your issue and  error tracking  workflow when you connect your  Rollbar…]]></description><link>https://rollbar.com/blog/connect-rollbar-to-bitbucket-issue-tracker/</link><guid isPermaLink="false">https://rollbar.com/blog/connect-rollbar-to-bitbucket-issue-tracker/</guid><pubDate>Tue, 17 Mar 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-03-17-connect-rollbar-to-bitbucket-issue-tracker/connect-rollbar-and-bitbucket.144600.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;new-integration-now-available---bitbucket-issue-tracker&quot;&gt;&lt;a href=&quot;#new-integration-now-available---bitbucket-issue-tracker&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;New integration now available - Bitbucket Issue Tracker&lt;/h2&gt;
&lt;p&gt;Supercharge your issue and &lt;a href=&quot;/&quot;&gt;error tracking&lt;/a&gt; workflow when you connect your &lt;a href=&quot;/&quot;&gt;Rollbar&lt;/a&gt; and
&lt;a href=&quot;https://bitbucket.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Bitbucket&lt;/a&gt; accounts. New Items in Rollbar will instantly create Issues in
your Bitbucket repo, or you can create and link Issues with the click of a button within Rollbar.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;heres-how&quot;&gt;&lt;a href=&quot;#heres-how&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Here&apos;s how:&lt;/h2&gt;
&lt;p&gt;Go to your project&apos;s Settings, then Notifications, and select Bitbucket Issues from the list of channels.&lt;/p&gt;
&lt;p&gt;Click &apos;Connect with Bitbucket” to grant Rollbar access to your account.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-03-17-connect-rollbar-to-bitbucket-issue-tracker/rollbar-bitbucket-setup.144598.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;From here, you can choose which repository, and add/edit/remove rules for Issues to be created
automatically.&lt;/p&gt;
&lt;p&gt;Like magic, your &lt;a href=&quot;/&quot;&gt;Rollbar error items&lt;/a&gt; and details now show up in your Bitbucket repo. &lt;strong&gt;&lt;em&gt;Success!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-03-17-connect-rollbar-to-bitbucket-issue-tracker/rollbar-errors-bitbucket.144691.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;create-bitbucket-issues-manually&quot;&gt;&lt;a href=&quot;#create-bitbucket-issues-manually&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create Bitbucket Issues manually&lt;/h2&gt;
&lt;p&gt;Prefer to create Issues by hand? You can create an Issue directly from the error Item page in
Rollbar, or link with an Issue that already exists. You can use this alongside the automatic rules;
or, remove the rules for full manual control.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-03-17-connect-rollbar-to-bitbucket-issue-tracker/create-bitbucket-issue-in-rollbar.144599.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;What&apos;s next?&lt;/p&gt;
&lt;p&gt;We&apos;re working toward full support for Bitbucket, like we have for GitHub - Issues, Source Control
and Authentication. I know Rollbar users who rely on Bitbucket in their workflows are rejoicing. :)&lt;/p&gt;
&lt;p&gt;Let us know if you have any feedback or questions. We&apos;re here to help.&lt;/p&gt;
&lt;p&gt;Deploy and enjoy!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Daily, Hourly, New Errors and Trend graphs are now clickable]]></title><description><![CDATA[Yes, that's correct. Daily, Hourly, New Errors, and Trend graphs are now clickable. You can find and fix errors  even
faster, and in less…]]></description><link>https://rollbar.com/blog/error-tracking-data-now-clickable/</link><guid isPermaLink="false">https://rollbar.com/blog/error-tracking-data-now-clickable/</guid><pubDate>Tue, 10 Mar 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yes, that&apos;s correct.&lt;/p&gt;
&lt;p&gt;Daily, Hourly, New Errors, and Trend graphs are now clickable. You can find and fix errors  even
faster, and in less clicks. :D&lt;/p&gt;
&lt;p&gt;Common usability feedback we get from our users:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sure would be nice if I could click the dashboard bar graphs and sparklines to quickly see what
caused a spike in error events etc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Couldn&apos;t agree more. We love aggregating data and we love it clickable. So we enabled it!&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;The following are now clickable in the project Dashboard:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hourly Error/Critical Occurrences&lt;/li&gt;
&lt;li&gt;Daily Error/Critical Occurrences&lt;/li&gt;
&lt;li&gt;Daily New/Reactivated Items&lt;/li&gt;
&lt;li&gt;Trends (24 hour and 7 day)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Trends are also clickable on the Items page. For reference Trends are these
guys ![]({{ site.cdn_url }}/blog/images/2015/2015-03-10-error-tracking-data-now-clickable/trend.144545.o.png &apos;error tracking trends&apos;) also called &apos;sparklines&apos;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-03-10-error-tracking-data-now-clickable/clickable-graphs.144540.o.gif&quot; alt=&quot;&quot; title=&quot;clickable data points&quot;&gt;&lt;/p&gt;
&lt;p&gt;When viewing a specific error item, the Last 60 Minutes, Hours, and Days are now clickable and aggregate error data by your selection.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-03-10-error-tracking-data-now-clickable/errors-tracked-last-60.144546.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;We&apos;re excited to get this features out the door. It reduces a lot of friction in navigating Rollbar.
One of many UI and UX improvements to come. :)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/login/&quot;&gt;Login&lt;/a&gt; today and go click through your data now.&lt;/p&gt;
&lt;p&gt;Deploy and enjoy!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Using Logstash and Rollbar Together]]></title><description><![CDATA[The infrastructure behind most modern web applications includes an assortment of tools for
collecting server and application metrics…]]></description><link>https://rollbar.com/blog/using-logstash-and-rollbar-together/</link><guid isPermaLink="false">https://rollbar.com/blog/using-logstash-and-rollbar-together/</guid><pubDate>Mon, 02 Mar 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The infrastructure behind most modern web applications includes an assortment of tools for
collecting server and application metrics, logging events, aggregating logs, and providing alerts.
Most systems are made up of a collection of best-in-class tools and services, selected and deployed
over time as team members arrive and depart, needs change, the system grows, and new tools are
introduced. One of the challenges web development and operations teams face is collecting and
analyzing data from these disparate sources and systems and then piecing together what’s happening
by looking at multiple reports and dashboards.&lt;/p&gt;
&lt;p&gt;Two common pieces in this puzzle are Logstash and Rollbar.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.elasticsearch.org/overview/logstash/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Logstash&lt;/a&gt; (and the
&lt;a href=&quot;http://www.elasticsearch.org/overview/kibana/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Kibana&lt;/a&gt; web interface, both of which are heavily
supported by and integrated with &lt;a href=&quot;http://www.elasticsearch.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Elasticsearch&lt;/a&gt;) lets you collect
and parse logs, store them in a central location, search and explore the data via the Kibana UI, and
output events to other services. Logstash provides a powerful tool for taking logs in many different
formats, converting them into JSON events, then routing and storing those events.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-03-02-using-logstash-and-rollbar-together/kibana.144457.o.jpg&quot; alt=&quot;&quot; title=&quot;kibana screenshot&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/&quot;&gt;Rollbar&lt;/a&gt; collects errors from your application, notifies you of those errors, and analyzes them
so you can more efficiently debug and fix them. With a few lines of code or config changes to your
application, you can make errors, complete stack traces, trends and affected user reports accessible
via your Roller dashboard. Like Logstash, Rollbar collects and analyzes events represented in JSON.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-03-02-using-logstash-and-rollbar-together/rollbar-screenshot.144459.o.png&quot; alt=&quot;&quot; title=&quot;rollbar screenshot&quot;&gt;&lt;/p&gt;
&lt;p&gt;By connecting Logstash and Rollbar, you can not only centralize and analyze your system and
application logs, but also improve error tracking and simplify debugging by providing context to
developers looking at errors generated by their code.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Most Logstash users have tried to configure Logstash to parse multi-line exception messages, or have
tried to convince a development team to adopt standards for application debugging and error message.
For code your team controls, it’s likely much simpler to install the Rollbar notifier for the
language and framework you’re using. You can send errors from your
&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar-gem/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ruby&lt;/a&gt;,
&lt;a href=&quot;https://rollbar.com/docs/notifier/pyrollbar/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Python&lt;/a&gt;, or
&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar-php/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;PHP&lt;/a&gt; application or
&lt;a href=&quot;https://rollbar.com/docs/notifier/rollbar.js/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;browser JavaScript&lt;/a&gt; to Rollbar and the service will
parse stack traces automatically and update your dashboard in real time. You can see the values of
local variables when the error occurred, and these errors are associated with other errors of the
same type.&lt;/p&gt;
&lt;p&gt;For Rollbar users, Logstash allows you to collect errors from external applications and ship them to
Rollbar, where they&apos;ll appear on the same dashboard as your application errors. Database and web
server errors, for example, can be passed along to Rollbar to help developers determine whether the
error is due to a bug, database performance issue, or operational issue with the web server.&lt;/p&gt;
&lt;p&gt;To get started...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you&apos;re Logstash user who&apos;d like to get started with Rollbar, you can &lt;a href=&quot;/&quot;&gt;sign up for a free account&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you&apos;re a Rollbar user who&apos;d like to try Logstash, see &quot;&lt;a href=&quot;http://logstash.net/docs/1.4.2/tutorials/getting-started-with-logstash&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Getting Started with Logstash&lt;/a&gt;&quot;&lt;/li&gt;
&lt;li&gt;For instructions on configuring Logstash events to Rollbar, see &quot;&lt;a href=&quot;https://rollbar.com/docs/logstash/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;How to Integrate Logstash with Rollbar&lt;/a&gt;&quot;.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Increasing max-open files for beanstalkd]]></title><description><![CDATA[Quick tip: If you are running out of file descriptors in your Beanstalkd process, use
 /etc/default/beanstalkd  to set the  ulimit  before…]]></description><link>https://rollbar.com/blog/increasing-max-open-files-for-beanstalkd/</link><guid isPermaLink="false">https://rollbar.com/blog/increasing-max-open-files-for-beanstalkd/</guid><pubDate>Sat, 28 Feb 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Quick tip: If you are running out of file descriptors in your Beanstalkd process, use
&lt;code&gt;/etc/default/beanstalkd&lt;/code&gt; to set the &lt;code&gt;ulimit&lt;/code&gt; before the init script starts the process.&lt;/p&gt;
&lt;p&gt;e.g.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;token comment&quot;&gt;# file: /etc/default/beanstalkd&lt;/span&gt;
BEANSTALKD_LISTEN_ADDR&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;127.0.0.1
BEANSTALKD_LISTEN_PORT&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;11300
START&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;yes
BEANSTALKD_EXTRA&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-b /var/lib/beanstalkd -f 1&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Should match your /etc/security/limits.conf settings&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ulimit&lt;/span&gt; -n 100000
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Lots of resources online tell you to update your &lt;code&gt;/etc/security/limits.conf&lt;/code&gt; and
&lt;code&gt;/etc/pam.d/common-session*&lt;/code&gt; settings to increase your maximum number of available file descriptors.
However, the default beanstalkd installation on Ubuntu 12.04+ uses an init script that starts the
daemon process using start-stop-daemon which does not use your system settings when setting the
processes ulimits. Just add this line to your defaults and you&apos;re good to go!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Get notifications every time an error occurs]]></title><description><![CDATA[You can now setup notifications every time an error occurs. Previously specific error Notifications
were only available for  New Items  and…]]></description><link>https://rollbar.com/blog/get-notifications-every-time-an-error-occurs/</link><guid isPermaLink="false">https://rollbar.com/blog/get-notifications-every-time-an-error-occurs/</guid><pubDate>Thu, 26 Feb 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You can now setup notifications every time an error occurs. Previously specific error Notifications
were only available for &lt;em&gt;New Items&lt;/em&gt; and &lt;em&gt;10^th Occurrences&lt;/em&gt;. Notification Rules are available for
all &lt;a href=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-02-26-get-notifications-every-time-an-error-occurs/rollbar-notification-channels.145054.o.png&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Channels&lt;/a&gt;
(Email, Slack, HipChat, Trello, PagerDuty).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-02-26-get-notifications-every-time-an-error-occurs/setup-alerts-for-every-error-occurence.145051.o.png&quot; alt=&quot;&quot; title=&quot;Setup notifications every time an error occurs&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Assign errors to your team]]></title><description><![CDATA[Ever wanted to assign error items to other team members in Rollbar? Of course you have. Now you can.
It is a pretty straight forward…]]></description><link>https://rollbar.com/blog/assign-errors-to-your-team/</link><guid isPermaLink="false">https://rollbar.com/blog/assign-errors-to-your-team/</guid><pubDate>Thu, 26 Feb 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ever wanted to assign error items to other team members in Rollbar? Of course you have. Now you can.
It is a pretty straight forward enhancement, but here is an overview.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;On the error ‘items’ details page, there&apos;s an “Assigned to&quot; dropdown with the members of your team.
Once assigned, we’ll shoot an email to that team member letting them know you assigned that specific
item to them, including link and details. They&apos;ll be automatically added as a &apos;watcher&apos; for that
specific item and will receive notifications about any comments and updates.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-02-26-assign-errors-to-your-team/error-tracking-assignment.144378.o.gif&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Assignment events will be listed in the item history section, so you can see who assigned it to whom, when.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-02-26-assign-errors-to-your-team/rollbar-assignment1.144404.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;To quickly find items assigned to yourself or others on your team, search &apos;assigned:me&apos;,
‘assigned:username’, or &apos;assigned:unassigned&apos; on the Items page.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2015/2015-02-26-assign-errors-to-your-team/rollbar-assignment2.144403.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;We&apos;re excited to get this out into the wild. Especially for some of the larger teams using Rollbar.
Let us know what you think and how we can make it better for you and your team.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Debugging Node.js Apps in Production with PyCharm]]></title><description><![CDATA[Node.js has a built-in debugger that you can start in running processes. To do this, send a
 SIGUSR1  signal to the running process and…]]></description><link>https://rollbar.com/blog/Debugging-Node.js-Apps-in-Production-with-PyCharm/</link><guid isPermaLink="false">https://rollbar.com/blog/Debugging-Node.js-Apps-in-Production-with-PyCharm/</guid><pubDate>Fri, 19 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Node.js has a built-in debugger that you can start in running processes. To do this, send a
&lt;code&gt;SIGUSR1&lt;/code&gt; signal to the running process and connect a debugger. The one, big caveat here is that the
debugger only listens on the local interface, &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The following are instructions for debugging Node.js applications running in your company&apos;s private
network from your laptop, through a bastion host.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SSH into the production host that is running the Node.js app&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Put your production app into debug mode.
&lt;code&gt;prod-host $&gt; kill -s SIGUSR1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;As root, start an SSH tunnel to connect your private network with localhost.
&lt;code&gt;prod-host $&gt; ssh -N -q -L :8585:localhost:5858&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On your laptop&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start an SSH tunnel to the production host, through your bastion host.
&lt;code&gt;laptop $&gt; ssh -N -q -L 5858::8585 @&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open PyCharm and create a remote debugging configuration.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run → Edit Configurations&lt;/li&gt;
&lt;li&gt;Click the + button on the top-left of the window and select “Node.js Remote Debug”&lt;/li&gt;
&lt;li&gt;Set the host to &lt;code&gt;127.0.0.1&lt;/code&gt; using port 5858, name it and save.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-12-19-Debugging-Node.js-Apps-in-Production-with-PyCharm/Screen-Shot-2014-12-19-at-105837-AM.141570.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run the new Debug configuration.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run → Debug...&lt;/li&gt;
&lt;li&gt;Select the new configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point your laptop will have connected to your local SSH tunnel which will be connected to
your production host&apos;s private network interface which will be tunneled to your production host&apos;s
local network interface and your Node.js process.&lt;/p&gt;
&lt;p&gt;PyCharm → local SSH tunnel → bastion host → production host private network → production host
localhost → Node.js&lt;/p&gt;
&lt;p&gt;Set some breakpoints in PyCharm and watch as your production process begins waits for you to step
through your app.&lt;/p&gt;
&lt;p&gt;Note: If you&apos;d rather use the command line instead of PyCharm just run the node debugger from your
laptop:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;laptop $&gt; node debug localhost:5858&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;happy-debugging&quot;&gt;&lt;a href=&quot;#happy-debugging&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Happy debugging!&lt;/h3&gt;
&lt;h4 id=&quot;troubleshooting&quot;&gt;&lt;a href=&quot;#troubleshooting&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Troubleshooting&lt;/h4&gt;
&lt;p&gt;Sometimes PyCharm will just not connect to the running process on your production machine. Try
restarting each of the SSH tunnels.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Restart the SSH tunnel on the production machine.&lt;/li&gt;
&lt;li&gt;Restart the SSH tunnel on your laptop.&lt;/li&gt;
&lt;li&gt;Restart the PyCharm debugger.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you
defeat annoying errors in your applications. :-)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/signup/&quot;&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/728x90FIXFAST-Gen.153113.o.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[RQL String Functions]]></title><description><![CDATA[RQL now includes a basic library of string functions. You can use these to slice and group your data
in arbitrary ways. For example, "email…]]></description><link>https://rollbar.com/blog/RQL-String-Functions/</link><guid isPermaLink="false">https://rollbar.com/blog/RQL-String-Functions/</guid><pubDate>Tue, 16 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;RQL now includes a basic library of string functions. You can use these to slice and group your data
in arbitrary ways. For example, &quot;email domains with the most events in the past hour&quot;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; substring&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; locate&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;@&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; item_occurrence
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;timestamp&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; unix_timestamp&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3600&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;email &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DESC&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The new functions: concat, concat&lt;em&gt;ws, lower, upper, left, right, substring, locate, length,
char&lt;/em&gt;length. The functions are implemented to be compatible with MySQL; see the
&lt;a href=&quot;/docs/rql/&quot;&gt;RQL docs&lt;/a&gt; for details.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Processing Delay Postmortem]]></title><description><![CDATA[Yesterday from 2:20am PST until 10:22am PST, we experienced a service degredation that caused our
customers to see processing delays…]]></description><link>https://rollbar.com/blog/processing-delay-postmortem-2014-12-04/</link><guid isPermaLink="false">https://rollbar.com/blog/processing-delay-postmortem-2014-12-04/</guid><pubDate>Fri, 05 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yesterday from 2:20am PST until 10:22am PST, we experienced a service degredation that caused our
customers to see processing delays reaching nearly 7 hours. While no data was lost, alerts were not
being sent and new data was not appearing in the rollbar.com interface during this time.&lt;/p&gt;
&lt;p&gt;We know that you rely on Rollbar to monitor your applications and alert when things go wrong, and
we&apos;re very sorry that we let you down during this outage. We&apos;d like to share some more details about
what happened and what we&apos;re doing to prevent this kind of issue from happening again.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;overview-of-api-tier-and-processing-pipeline&quot;&gt;&lt;a href=&quot;#overview-of-api-tier-and-processing-pipeline&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Overview of API Tier and Processing Pipeline&lt;/h2&gt;
&lt;p&gt;When data is received by our API endpoints (api.rollbar.com), it hits a load balancer which proxies
to an array of &quot;API servers&quot;. Those servers do some basic validation (access control, rate limiting,
etc.) and then write the data to local disk. Next, a separate process (the &quot;offline loader&quot;) loads
these files asynchronously into our database clusters. Then, a series of workers process the raw
data into the aggregated and indexed form you see on rollbar.com, and send alerts for any triggered
events. This system is designed for reliability first and performance second.&lt;/p&gt;
&lt;p&gt;When occurrence processing latency exceeds 30 seconds, we show an in-app notification that
processing is behind. This is calculated as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For each API server, calcuate ([timestamp of last occurrence received] - [for the last occurrence
that was fully processed by the pipeline, the timestamp it was received on the API server])&lt;/li&gt;
&lt;li&gt;Report the maximum delay of API servers as the processing delay&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The API tier primarily receives three kinds of data: occurrences (the &quot;item&quot; endpoints), deploys,
and symbol mapping files (source maps, Android Proguard files, and iOS dSYMs). Currently, all three
of these are loaded by the same offline loader process, to different database clusters depending on
the type of data.&lt;/p&gt;
&lt;h2 id=&quot;outage-timeline-cause-and-resolution&quot;&gt;&lt;a href=&quot;#outage-timeline-cause-and-resolution&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Outage Timeline, Cause, and Resolution&lt;/h2&gt;
&lt;p&gt;At about 2:00am PST, a node in the database cluster that stores the symbol mapping files ran out of
disk space. Unfortunately, this did not set off any alerts in our monitoring system because the disk
space alert had been previously triggered and acknowledged, but not yet resolved.&lt;/p&gt;
&lt;p&gt;At about 2:20am PST, the next symbol mapping file arrived on one of the API servers and since the
database server was out of disk, it could not be loaded. This caused other files on that API
server--containing occurrences and deploys--to not be loaded either. At this time, a processing
delay first appeared in the Rollbar interface, and some (but not all) data was delayed. Over the
next several hours, the delay continued to rise (as data on some API servers was not processed at
all) and the percent of data that was delayed also rose (as more API servers enocuntered the same
problem).&lt;/p&gt;
&lt;p&gt;At 8:25am PST, a Rollbar engineer started work for the day and noticed a support ticket about the
processing delay. He immediately escalated to a second engineer who began investigating. At 8:40am
PST, a third engineer joined and updated &lt;a href=&quot;http://status.rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;status.rollbar.com&lt;/a&gt; to say that we are investigating the
issue.&lt;/p&gt;
&lt;p&gt;At 9:05am PST, we identified the immediate problem that the symbol mapping files were blocking
occurrences from being loaded. We began mitigating by moving those files aside to allow the
higher-priority occurrence data to load. This began the recovery process, but created a backlog at
first level in the processing pipeline, causing all data to be delayed (instead of just some).&lt;/p&gt;
&lt;p&gt;At 9:11am PST, we identified disk space as the root cause, and resolved this a few minutes later. At
9:35am PST, we updated &lt;a href=&quot;http://status.rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;status.rollbar.com&lt;/a&gt; to state that we had
identified the issue.&lt;/p&gt;
&lt;p&gt;At 9:55am PST, processing latency hit a peak of about 25,000 seconds. We updated
&lt;a href=&quot;http://status.rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;status.rollbar.com&lt;/a&gt; with our estimate of 36 minutes to full recovery.&lt;/p&gt;
&lt;p&gt;At 10:43am PST, processing was fully caught up. &lt;a href=&quot;http://status.rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;status.rollbar.com&lt;/a&gt; was
updated a minute later.&lt;/p&gt;
&lt;h2 id=&quot;evaluating-our-response&quot;&gt;&lt;a href=&quot;#evaluating-our-response&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Evaluating our Response&lt;/h2&gt;
&lt;p&gt;Once our team became aware of the issue, we were able to identify and fix it relatively quickly (40
minutes from awareness to identification, with fix immediately afterwards). Recovery was relatively
fast as well, given the length of the backlog (1hr 38minutes to recover from 7hrs 45min of backlog).&lt;/p&gt;
&lt;p&gt;It took far too long to for us to notice this issue, however, as our automated monitoring failed to
alert us and we only discovered the issue via customer reports.&lt;/p&gt;
&lt;h2 id=&quot;improvements&quot;&gt;&lt;a href=&quot;#improvements&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Improvements&lt;/h2&gt;
&lt;p&gt;We&apos;ve identified and planned a number of improvements to our processes, tools, and systems to
address what went wrong. Here are the highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We&apos;re auditing our internal monitoring to ensure that checks are meaningful, needed checks are
present, and alerts are functioning correctly&lt;/li&gt;
&lt;li&gt;We&apos;ve created a standing Google Hangout so we can more easily coordinate our response when we&apos;re
not all in the same location&lt;/li&gt;
&lt;li&gt;We&apos;re investigating whether we can automate the component status on
&lt;a href=&quot;http://status.rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;status.rollbar.com&lt;/a&gt;, so that it doesn&apos;t need to be manually updated.
(Side note: go there now and click &quot;Subscribe to Updates&quot;!)&lt;/li&gt;
&lt;li&gt;We&apos;ve identified and planned system-level improvements to decouple symbol mapping uploads from the
critical occurrence processing pipeline&lt;/li&gt;
&lt;li&gt;We&apos;ve planned a project to improve our ability to recover more quickly from processing backlogs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;in-conclusion&quot;&gt;&lt;a href=&quot;#in-conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In Conclusion&lt;/h2&gt;
&lt;p&gt;We&apos;re very sorry for the degradation of service yesterday. We know that you rely on Rollbar for
critical areas of your operations and we hate to let you down. If you have any questions, please
don&apos;t hesitate to contact us at &lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[October Release Roundup]]></title><description><![CDATA[Happy Halloween, everyone! Here's a roundup of what's new in Rollbar this month. Ruby Upgrades The  rollbar  gem for Ruby got a lot of…]]></description><link>https://rollbar.com/blog/October-Release-Roundup/</link><guid isPermaLink="false">https://rollbar.com/blog/October-Release-Roundup/</guid><pubDate>Fri, 31 Oct 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Happy Halloween, everyone! Here&apos;s a roundup of what&apos;s new in Rollbar this month.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;ruby-upgrades&quot;&gt;&lt;a href=&quot;#ruby-upgrades&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ruby Upgrades&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;rollbar&lt;/code&gt; gem for Ruby got a lot of attention in October. Early in the month, we released
version 1.1.0, which added support for Ruby 2.1 exception causes, and a new &apos;failover_handlers&apos;
feature for more reliable asnyc reporting. Mid-month, we released version 1.2 which adds a new, much
nicer and more powerful interface for sending the data you want into Rollbar.&lt;/p&gt;
&lt;p&gt;In 1.2, you can do:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;begin&lt;/span&gt;
  &lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;About to do_something&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  do_something
&lt;span class=&quot;token keyword&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; e
  &lt;span class=&quot;token comment&quot;&gt;# send a message and extra data along with an exception&lt;/span&gt;
  &lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Something went wrong&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:foo&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bar&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;# customize payload attributes, like the &apos;person&apos; or &apos;fingerprint&apos;&lt;/span&gt;
  &lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:fingerprint&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;something&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;More in the &lt;a href=&quot;/docs/notifier/rollbar-gem/&quot;&gt;docs&lt;/a&gt;. It&apos;s available now on Rubygems (latest version is
1.2.7).&lt;/p&gt;
&lt;h2 id=&quot;new-status-site&quot;&gt;&lt;a href=&quot;#new-status-site&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;New Status Site&lt;/h2&gt;
&lt;p&gt;We&apos;ve upgraded &lt;a href=&quot;http://status.rollbar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;status.rollbar.com&lt;/a&gt;. We&apos;ll be using it to communicate
about outages, so if you&apos;d like to be notified, go there and subscribe to updates. The new status
site also shows the current maximum latencies for the processing pipeline.&lt;/p&gt;
&lt;h2 id=&quot;link-rollbar-items-with-existing-3rd-party-issues&quot;&gt;&lt;a href=&quot;#link-rollbar-items-with-existing-3rd-party-issues&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Link Rollbar Items with Existing 3rd-party Issues&lt;/h2&gt;
&lt;p&gt;You can now link a Rollbar item with an existing issue in your issue tracker:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-10-31-October-Release-Roundup/Screenshot-2014-10-31-163550.140205.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Or if you have a Rollbar item that is already linked, you can now change or remove the link. This
works with Asana, GitHub Issues, JIRA, Pivotal Tracker, Sprintly, and Trello.&lt;/p&gt;
&lt;h2 id=&quot;geolocation-for-ip-addresses&quot;&gt;&lt;a href=&quot;#geolocation-for-ip-addresses&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Geolocation for IP Addresses&lt;/h2&gt;
&lt;p&gt;Rollbar now shows geolocation information on the IP address detail page:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-10-31-October-Release-Roundup/Screenshot-2014-10-31-164401.140207.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can get there by clicking on an IP address anywhere in the app. More features on this theme to
come; stay tuned.&lt;/p&gt;
&lt;h2 id=&quot;basic-stats-on-the-item-page&quot;&gt;&lt;a href=&quot;#basic-stats-on-the-item-page&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Basic stats on the Item page&lt;/h2&gt;
&lt;p&gt;The basic item statistics--when it was first and last seen, how many times it has occurred since
being resolved, and how many total IPs have been affected--are finally available at a glance on the
Item detail page.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-10-31-October-Release-Roundup/Screenshot-2014-10-31-164812.140208.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;time-format-setting&quot;&gt;&lt;a href=&quot;#time-format-setting&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Time Format setting&lt;/h2&gt;
&lt;p&gt;If you&apos;d rather see timestamps use a  24-hour clock, head over to your project&apos;s Settings page:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-10-31-October-Release-Roundup/Screenshot-2014-10-31-163103.140204.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;misc&quot;&gt;&lt;a href=&quot;#misc&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Misc&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Improved processing pipeline speed by ~33%&lt;/li&gt;
&lt;li&gt;Added &lt;a href=&quot;/docs/api/projects/#update-rate-limits-for-a-project-access-token&quot;&gt;API methods to set rate limits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Improved support for code versions in &lt;a href=&quot;https://github.com/rollbar/rollbar-android/releases/tag/v0.1.0&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;rollbar-android 0.1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed a &lt;a href=&quot;https://github.com/rollbar/rollbar.js/pull/50&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;bug with wrapped functions&lt;/a&gt; in rollbar.js 1.1.11&lt;/li&gt;
&lt;li&gt;Added links to detailed usage reports from the Invoice and Usage pages&lt;/li&gt;
&lt;li&gt;Fixed an issue where rate limits would over-limit when duplicate items were received&lt;/li&gt;
&lt;li&gt;Deploy emails now include the deploy comment&lt;/li&gt;
&lt;li&gt;RQL aggregate functions now support arbitrary expressions as parameters&lt;/li&gt;
&lt;li&gt;Improved filename linking for vanilla ruby stack traces&lt;/li&gt;
&lt;li&gt;Added the High Occurrence Rate trigger for HipChat notifications&lt;/li&gt;
&lt;li&gt;Long param values are now displayed better on the occurrence detail page&lt;/li&gt;
&lt;li&gt;The &quot;viewing now&quot; list no longer shows yourself in the list&lt;/li&gt;
&lt;li&gt;Fixed a few edge cases with the Slack integration&lt;/li&gt;
&lt;li&gt;Fixed a bug where the trace_chain section in the Raw JSON part of the occurrence detail page would sometimes be reversed&lt;/li&gt;
&lt;li&gt;Fixed an issue where gravatar images would block the page load&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[RQL minor updates]]></title><description><![CDATA[A couple minor updates to RQL today: IS NULL and IS NOT NULL are now supported Fixed a crash in queries that contain a GROUP BY plus an…]]></description><link>https://rollbar.com/blog/RQL-minor-updates/</link><guid isPermaLink="false">https://rollbar.com/blog/RQL-minor-updates/</guid><pubDate>Thu, 25 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A couple minor updates to RQL today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IS NULL and IS NOT NULL are now supported&lt;/li&gt;
&lt;li&gt;Fixed a crash in queries that contain a GROUP BY plus an ORDER BY on a column referenced only
in the ORDER BY.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[New "Reports" API calls]]></title><description><![CDATA[We've released two new API calls, exposing some of the data on the Dashboard via our JSON API. Use the  /reports/top active items  to fetch…]]></description><link>https://rollbar.com/blog/New-Reports-API-calls/</link><guid isPermaLink="false">https://rollbar.com/blog/New-Reports-API-calls/</guid><pubDate>Wed, 20 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve released two new API calls, exposing some of the data on the Dashboard via our JSON API.&lt;/p&gt;
&lt;p&gt;Use the &lt;a href=&quot;/docs/api/reports/#top-recent-active-items&quot;&gt;/reports/top&lt;em&gt;active&lt;/em&gt;items&lt;/a&gt; to fetch the same data as
&quot;Top 10 Active Items in last 24 hours&quot;. And use
&lt;a href=&quot;/docs/api/reports/#occurrence-counts&quot;&gt;/reports/occurrence_counts&lt;/a&gt; to fetch the same data as &quot;Daily
Error/Critical Occurrences&quot; and &quot;Hourly Error/Critical Occurrences&quot;.&lt;/p&gt;
&lt;p&gt;More details in the &lt;a href=&quot;/docs/api/reports/&quot;&gt;docs&lt;/a&gt;. If you give this a try, send us any feedback at
&lt;a href=&quot;mailto:team@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;team@rollbar.com&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Occurrence counts by minute]]></title><description><![CDATA[We've released an improvement to our Item Detail pages, adding a graph showing the aggregate
occurrence counts per minute. It's live now for…]]></description><link>https://rollbar.com/blog/Occurrence-counts-by-minute/</link><guid isPermaLink="false">https://rollbar.com/blog/Occurrence-counts-by-minute/</guid><pubDate>Thu, 31 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve released an improvement to our Item Detail pages, adding a graph showing the aggregate
occurrence counts per minute. It&apos;s live now for everyone and looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-07-31-Occurrence-counts-by-minute/Screenshot-2014-07-31-183724.137373.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can use this to see patterns that previously were hard to spot, like errors that occur on a
regular, sub-hour interval (like the one shown above). It&apos;s also useful for quickly seeing how the
occurrence rate changes after a deploy.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[node_rollbar 0.3.11]]></title><description><![CDATA[We've released a new version of our Node.js library, version 0.3.11. It's available on
 npm  and  GitHub . This release adds a new function…]]></description><link>https://rollbar.com/blog/node_rollbar-0.3.11/</link><guid isPermaLink="false">https://rollbar.com/blog/node_rollbar-0.3.11/</guid><pubDate>Thu, 24 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve released a new version of our Node.js library, version 0.3.11. It&apos;s available on
&lt;a href=&quot;https://www.npmjs.org/package/rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;npm&lt;/a&gt; and &lt;a href=&quot;https://github.com/rollbar/node_rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release adds a new function to the public API, handleErrorWithPayloadData. The name&apos;s a
mouthful, but it allows you to use (nearly) the full power of the Rollbar API when reporting errors.
For example, to report an error as a &quot;warning&quot; and pass some additional data:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;handleErrorWithPayloadData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;level&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warning&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; custom&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;someKey&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;some value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;See more examples in the &lt;a href=&quot;/docs/notifier/node_rollbar/#caught-exceptions&quot;&gt;docs for caught exceptions&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[More stack trace filename search filters]]></title><description><![CDATA[We've released several new search filters to make it easier to find errors by the filenames in their
stack trace. If you've ever wanted to…]]></description><link>https://rollbar.com/blog/More-stack-trace-filename-search-filters/</link><guid isPermaLink="false">https://rollbar.com/blog/More-stack-trace-filename-search-filters/</guid><pubDate>Tue, 22 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve released several new search filters to make it easier to find errors by the filenames in their
stack trace. If you&apos;ve ever wanted to find client-side
&lt;a href=&quot;/blog/client-side-angular-error-handling/&quot;&gt;Angular JavaScript errors&lt;/a&gt; that only occurred within
your own specific domain, or exceptions originating in a specific part of your code, keep reading.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-07-22-More-stack-trace-filename-search-filters/Screenshot-2014-07-22-113914.136847.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;You&apos;ve always been able to search for errors where &lt;em&gt;any&lt;/em&gt; filename contains a string, but now you can
also search for errors where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;all filenames contain a string (&lt;code&gt;allfiles:myproject&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;no filenames contain a string (&lt;code&gt;nofiles:evilproject&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;the top stack frame&apos;s filename contains a string (&lt;code&gt;topfile:mydomain.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;the bottom stack frame&apos;s filename contains a string (&lt;code&gt;bottomfile:some_important_library&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;the number of filenames is within a range (&lt;code&gt;minfiles:1&lt;/code&gt; and/or &lt;code&gt;maxfiles:10&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;any filename contains a string (&lt;code&gt;file:.rb&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These filters can all be combined in a single query. If you forget which filters exist, mouse over
the ? next to the search box to see the help text.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Missing daily summary emails]]></title><description><![CDATA[We just rolled out a fix for missing daily summary emails. The bug was introduced last week when we
refactored a bunch of our email code. As…]]></description><link>https://rollbar.com/blog/Missing-daily-summary-emails/</link><guid isPermaLink="false">https://rollbar.com/blog/Missing-daily-summary-emails/</guid><pubDate>Mon, 21 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We just rolled out a fix for missing daily summary emails. The bug was introduced last week when we
refactored a bunch of our email code. As a result, some projects did not receive their daily email
for the previous 24 hours.&lt;/p&gt;
&lt;p&gt;We don&apos;t want to spam users with old summaries so please contact support@rollbar.com if you&apos;d like
to get yours.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[rollbar-gem v0.13.2]]></title><description><![CDATA[We've released a patch version (0.13.2) of our Ruby gem, fixing two issues. The use sucker punch config option could cause timeouts when…]]></description><link>https://rollbar.com/blog/rollbar-gem-v0.13.2/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-gem-v0.13.2/</guid><pubDate>Tue, 08 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve released a patch version (0.13.2) of our Ruby gem, fixing two issues.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The use&lt;em&gt;sucker&lt;/em&gt;punch config option could cause timeouts when using Unicorn
(&lt;a href=&quot;https://github.com/rollbar/rollbar-gem/issues/121&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;#121&lt;/a&gt;) - thanks to
&lt;a href=&quot;https://github.com/fabn&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Fabio Napoleoni&lt;/a&gt; for the report&lt;/li&gt;
&lt;li&gt;Sidekiq payloads were being mutated, causing the sidekiq-failures UI not to display parameters
correctly (&lt;a href=&quot;https://github.com/rollbar/rollbar-gem/issues/122&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;#122&lt;/a&gt;) - thanks to
&lt;a href=&quot;https://github.com/Ditchou&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;@Ditchou&lt;/a&gt; and &lt;a href=&quot;https://github.com/krasnoukhov&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Dmitry Krasnoukhov&lt;/a&gt;
for investigating and reporting this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s available now on &lt;a href=&quot;https://rubygems.org/gems/rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rubygems&lt;/a&gt; and &lt;a href=&quot;https://github.com/rollbar/rollbar-gem&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Prettier Node.js stack traces]]></title><description><![CDATA[Small tweak of the day: we now render Node.js stack traces to look more like they do via
console.log(err.stack). We also fixed an issue…]]></description><link>https://rollbar.com/blog/Prettier-Node.js-stack-traces/</link><guid isPermaLink="false">https://rollbar.com/blog/Prettier-Node.js-stack-traces/</guid><pubDate>Tue, 01 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Small tweak of the day: we now render Node.js stack traces to look more like they do via
console.log(err.stack). We also fixed an issue where the context lines would appear indented at
random levels.&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-07-01-Prettier-Node.js-stack-traces/Screenshot-2014-07-01-123749.135671.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;After:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-07-01-Prettier-Node.js-stack-traces/Screenshot-2014-07-01-123818.135672.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Debugging by IP Address]]></title><description><![CDATA[We've released a first round of features around IP Addresses. Similar to how you can
 see the history by Person , you can now see the…]]></description><link>https://rollbar.com/blog/Debugging-by-IP-Address/</link><guid isPermaLink="false">https://rollbar.com/blog/Debugging-by-IP-Address/</guid><pubDate>Mon, 30 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve released a first round of features around IP Addresses. Similar to how you can
&lt;a href=&quot;/features/people/&quot;&gt;see the history by Person&lt;/a&gt;, you can now see the history by IP address. If
you&apos;re tracking down an issue affecting logged-out users, this can be really helpful.&lt;/p&gt;
&lt;p&gt;To get there, click on an IP address anywhere in the Rollbar interface:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-06-30-Debugging-by-IP-Address-/Screenshot-2014-06-30-121319.135524.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;You&apos;ll be able to see all events affecting that IP:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-06-30-Debugging-by-IP-Address-/Screenshot-2014-06-30-121436.135525.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;There&apos;s also a handy link to the WHOIS record for the IP.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Better support for Browserify and Webpack]]></title><description><![CDATA[Recently (actually last week), we released a new version of rollbar.js that has a few fixes to play
nicely with Browserify and Webpack. It's…]]></description><link>https://rollbar.com/blog/Better-support-for-Browserify-and-Webpack/</link><guid isPermaLink="false">https://rollbar.com/blog/Better-support-for-Browserify-and-Webpack/</guid><pubDate>Wed, 18 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently (actually last week), we released a new version of rollbar.js that has a few fixes to play
nicely with Browserify and Webpack. It&apos;s being served from our CDN and the source is on
&lt;a href=&quot;https://github.com/rollbar/rollbar.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&apos;ve also put together examples showing how to use rollbar.js with each. If you use Browserify or
Webpack and want to include rollbar.js that way instead of using our standard snippet, this is your
lucky day:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js/tree/master/examples/browserify&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Browserify example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar.js/tree/master/examples/webpack&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Webpack example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/altano&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;@altano&lt;/a&gt; for helping with this.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Codeship + Rollbar]]></title><description><![CDATA[Our friends over at  Codeship  wrote a piece about how they use Rollbar to
track deployments and fix exceptions. More on the Codeship blog…]]></description><link>https://rollbar.com/blog/codeship-and-rollbar/</link><guid isPermaLink="false">https://rollbar.com/blog/codeship-and-rollbar/</guid><pubDate>Tue, 17 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Our friends over at &lt;a href=&quot;https://codeship.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Codeship&lt;/a&gt; wrote a piece about how they use Rollbar to
track deployments and fix exceptions. More on the Codeship blog:
&lt;a href=&quot;http://blog.codeship.io/2014/06/17/rollbar-deployment-tracking.html?utm_content=hifromrollbarblog&amp;#x26;utm_medium=social&amp;#x26;utm_source=twitter.com&amp;#x26;utm_campaign=buffer&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Tracking Deployments with Rollbar&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[rollbar.js snippet update]]></title><description><![CDATA[We've released a new version of rollbar.js (1.0.0-rc9), which fixes a bug in some environments. If you've seen "TypeError: Uncaught…]]></description><link>https://rollbar.com/blog/rollbar.js-snippet-update/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar.js-snippet-update/</guid><pubDate>Tue, 10 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve released a new version of rollbar.js (1.0.0-rc9), which fixes a bug in some environments.&lt;/p&gt;
&lt;p&gt;If you&apos;ve seen &quot;TypeError: Uncaught TypeError: Cannot read property &apos;_wrapped&apos; of null&quot; in your
project, you should update to the latest snippet. Grab it from the
&lt;a href=&quot;/docs/notifier/rollbar.js/&quot;&gt;docs&lt;/a&gt; to update.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[More Powerful Custom Grouping]]></title><description><![CDATA[{% assign default fingerprint = site.data.docs.custom-grouping.default fingerprint %}
{% assign default title = site.data.docs.custom…]]></description><link>https://rollbar.com/blog/More-Powerful-Custom-Grouping/</link><guid isPermaLink="false">https://rollbar.com/blog/More-Powerful-Custom-Grouping/</guid><pubDate>Mon, 09 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;{% assign default&lt;em&gt;fingerprint = site.data.docs.custom-grouping.default&lt;/em&gt;fingerprint %}
{% assign default&lt;em&gt;title = site.data.docs.custom-grouping.default&lt;/em&gt;title %}
{% assign body = site.data.docs.custom-grouping.body %}
{% assign client = site.data.docs.custom-grouping.client %}&lt;/p&gt;
&lt;p&gt;Our &lt;a href=&quot;/docs/custom-grouping/&quot;&gt;Custom Grouping&lt;/a&gt; feature just got a lot more powerful. It&apos;s
now possible to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;group TimeoutErrors by the controller+action it appears in&lt;/li&gt;
&lt;li&gt;group 404s by path&lt;/li&gt;
&lt;li&gt;group all Android exceptions by the app version number&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and much more, just by writing a simple JSON rule. This feature is live now for all accounts.&lt;/p&gt;
&lt;p&gt;For the uninitiated: Custom Grouping allows you to tune Rollbar&apos;s grouping algorithm for the
specifics of your application. If our &lt;a href=&quot;/docs/grouping-algorithm/&quot;&gt;default algorithm&lt;/a&gt; isn&apos;t
grouping incoming occurrences like you want, you can define rules to customize. Rules consist of a
&lt;em&gt;condition&lt;/em&gt;, a &lt;em&gt;title&lt;/em&gt;, and a &lt;em&gt;fingerprint&lt;/em&gt;. If an incoming occurrence matches the &lt;em&gt;condition&lt;/em&gt;, then
it will be grouped with others that have the same &lt;em&gt;fingerprint&lt;/em&gt;, and given the title &lt;em&gt;title&lt;/em&gt;. (If it
doesn&apos;t match, then the next rule is evaluated, or if there are no more rules, the default algorithm
is applied.)&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Previously, the title and fingerprint could only contain static text. Now, they&apos;re templates that
can reference:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;any part of the incoming occurrence&lt;/li&gt;
&lt;li&gt;the title and fingerprint generated by our default algorithm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, to group all ActionController::RoutingErrors by the request path (which comes in as the
exception message):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-json&quot;&gt;&lt;code&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ body.trace.exception.class }} {{ body.trace.exception.message }}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;fingerprint&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ body.trace.exception.class }}-{{ body.trace.exception.message }}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;condition&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;body.trace.exception.class&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;eq&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ActionController::RoutingError&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Or to have all Android exceptions grouped by app version:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-json&quot;&gt;&lt;code&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ default_title }} in version {{ client.android.code_version }}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;fingerprint&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ default_fingerprint }}-androidversion-{{ client.android.code_version }}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;condition&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;framework&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;eq&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;android&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;/docs/custom-grouping/&quot;&gt;docs&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p&gt;We&apos;ve already seen this solve a diverse set of grouping problems and are really excited about how
powerful this is. If you have any questions about how to get your errors grouped the way you want,
drop us a line at &lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt; and we&apos;ll be happy to help.&lt;/p&gt;
&lt;p&gt;New to Rollbar? &lt;a href=&quot;/signup/&quot;&gt;Sign up for a free account&lt;/a&gt; and start monitoring errors in 5 minutes.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Post-mortem for website assets outage]]></title><description><![CDATA[We had an issue from late last night through this morning where many users were not able to use the
rollbar.com website because CSS and…]]></description><link>https://rollbar.com/blog/Post-mortem-for-website-assets-outage/</link><guid isPermaLink="false">https://rollbar.com/blog/Post-mortem-for-website-assets-outage/</guid><pubDate>Fri, 06 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We had an issue from late last night through this morning where many users were not able to use the
rollbar.com website because CSS and Javascript assets were not loading in some regions. This post
will cover what happened, its cause, why we didn&apos;t notice it sooner, and the changes we&apos;re making
going forward.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;problem-and-cause&quot;&gt;&lt;a href=&quot;#problem-and-cause&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Problem and Cause&lt;/h2&gt;
&lt;p&gt;From 5:04am UTC until 4:21pm UTC today, users in/near Europe got 404 responses when trying to load
our static CSS and JS assets for rollbar.com. This resulted in a visually broken or unusable site,
depending on browser and CDN cache.&lt;/p&gt;
&lt;p&gt;The cause was a misconfigured load balancer in our Amsterdam data center that was put into service
at 12:05am UTC. The assets should have been present on that machine, but they weren&apos;t. For several
hours, this didn&apos;t appear, since the assets were still cached in our CDN. When they fell out of the
CDN&apos;s cache, requests for those assets from Europe-based CDN endpoints began to 404. Users hitting
those endpoints would then get 404s as well.&lt;/p&gt;
&lt;h2 id=&quot;detection-and-fix&quot;&gt;&lt;a href=&quot;#detection-and-fix&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Detection and Fix&lt;/h2&gt;
&lt;p&gt;We first noticed this via the last line of defense: customer support channels. IRC, Twitter, and our
support inbox were full of reports (thanks everyone!). Unfortunately, since this happened during the
middle of the night for our team (we&apos;re based in San Francisco), we didn&apos;t notice until 3:33pm UTC
when I checked my phone on the way to the office. I immediately escalated to the rest of the team.
At 3:36pm UTC, Cory started investigating.&lt;/p&gt;
&lt;p&gt;The website appeared fine for us, so we suspected it may be some sort of CDN-related issue. Based on
the time of the reports, we suspected it might be localized to Europe (later confirmed via Twitter).
At 4:05pm UTC, we identified the load balancer addition as the most likely cause.&lt;/p&gt;
&lt;p&gt;At 4:06pm UTC, we took the load balancer back out of service. The assets were still cached by the
CDN as being 404s, though, so this wasn&apos;t enough to fix. At 4:16pm UTC, we deployed a change to the
web tier to bust the cache; at 4:21pm UTC, the deploy was complete and the issue fixed. We confirmed
the fix with several of the users who had reported the issue.&lt;/p&gt;
&lt;p&gt;You can see the start, rise, and fix of this issue on this Rollbar Item that happens when jQuery
doesn&apos;t load. This is normal to happen intermittently (all networks occasionally fail), but not this
much:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-06-06-Post-mortem-for-website-assets-outage/Screenshot-2014-06-06-143605.134062.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;planned-improvements&quot;&gt;&lt;a href=&quot;#planned-improvements&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Planned Improvements&lt;/h2&gt;
&lt;p&gt;While we&apos;d of course prefer not to make configuration mistakes, the primary failure here was that
our none of our automated monitoring detected this. That meant instead of being paged as soon as it
happened, we didn&apos;t know anything was wrong for over 10 hours. &quot;Whatever can go wrong that isn&apos;t
monitored, is probably already broken.&quot;&lt;/p&gt;
&lt;p&gt;Today, we&apos;ll be making the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;adding a Nagios alert to monitor 404s on static assets on our load balancers (would have alerted
us as soon as the issue started)&lt;/li&gt;
&lt;li&gt;add a header to all requests to identify which load balancer served the request (would have made
this easier to identify)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&apos;re also considering:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a Nagios alert if there is a sudden large number of support tickets&lt;/li&gt;
&lt;li&gt;a Nagios or SMS alert if there is a Rollbar Item affecting a large number of unique users
(Rollbar actually already supports sending notifications like this, so it&apos;s just a matter of
hooking it up for ourselves)&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Security patch for the recent CCS Injection Vulnerability]]></title><description><![CDATA[For the security conscious folks out there - We just finished patching our load balancers with the
latest security updates. That is all…]]></description><link>https://rollbar.com/blog/Security-patch-for-the-recent-CCS-Injection-Vulnerability/</link><guid isPermaLink="false">https://rollbar.com/blog/Security-patch-for-the-recent-CCS-Injection-Vulnerability/</guid><pubDate>Thu, 05 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For the security conscious folks out there - We just finished patching our load balancers with the
latest security updates.&lt;/p&gt;
&lt;p&gt;That is all. :)&lt;/p&gt;
&lt;p&gt;More info can be found &lt;a href=&quot;https://www.digicert.com/openssl-ccs-injection-fix.htm?mkt_tok=3RkMMJWWfF9wsRons6XOZKXonjHpfsX96%2BkuXaOylMI%2F0ER3fOvrPUfGjI4DTctmI%2BSLDwEYGJlv6SgFQrLAMbdw0bgKXRA%3D&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Local variable values in stack traces]]></title><description><![CDATA["This stack trace would be so much easier to debug if I knew what the value of that variable was" -
said us, many many times. We finally…]]></description><link>https://rollbar.com/blog/local-variable-values-in-stack-traces/</link><guid isPermaLink="false">https://rollbar.com/blog/local-variable-values-in-stack-traces/</guid><pubDate>Thu, 05 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&quot;This stack trace would be so much easier to debug if I knew what the value of that variable was&quot; -
said us, many many times. We finally scratched our own itch and built this into Rollbar.&lt;/p&gt;
&lt;p&gt;It&apos;s really awesome. Take for example a bug I ran into with our new
&lt;a href=&quot;/blog/deploy-emails-show-which-commits-were-deployed/&quot;&gt;deploy emails&lt;/a&gt; feature:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-06-05-local-variable-values-in-stack-traces/Screenshot-2014-06-04-151300.134009.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&quot;Hmmm, sure would be nice if I knew which variable was &lt;code&gt;None&lt;/code&gt;--is it &lt;code&gt;prev_deploy&lt;/code&gt; or &lt;code&gt;deploy&lt;/code&gt;?&quot; In
the past, I would&apos;ve had to reproduce locally, or add an additional &lt;code&gt;rollbar.report_message()&lt;/code&gt; to
log each variable in production. But now I can just press &quot;locals&quot; for the stack frame and see it
instantly:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-06-05-local-variable-values-in-stack-traces/Screenshot-2014-06-04-151644.134010.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&quot;OK, it&apos;s &lt;code&gt;prev_deploy&lt;/code&gt;.&quot; That was all I needed: &lt;code&gt;prev_deploy&lt;/code&gt; will be &lt;code&gt;None&lt;/code&gt; when &lt;code&gt;deploy&lt;/code&gt; is the
very first deploy in this project. Easy two-line fix. Time taken from opening the Rollbar
notification to committing the fix: 2 minutes. Rollbarred!&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;&lt;a href=&quot;#how-it-works&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How it works&lt;/h2&gt;
&lt;p&gt;We&apos;ve implemented this in Python (&lt;a href=&quot;https://github.com/rollbar/pyrollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;pyrollbar&lt;/a&gt;), and are
actively exploring other languages. Ruby and PHP are looking promising. Here&apos;s how it works in
Python.&lt;/p&gt;
&lt;p&gt;When this feature is enabled and an exception is reported, we use the
&lt;a href=&quot;https://docs.python.org/2/library/inspect.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;inspect&lt;/a&gt; module to collect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;all stack frames: names and values of all variables that are function arguments&lt;/li&gt;
&lt;li&gt;in-project stack frames: names and values of all local variables&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are two main edge cases to deal with:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The variable could contain sensitive data. To deal with this, we use the same &lt;code&gt;scrub_fields&lt;/code&gt;
configuration used for scrubbing request data. If the variable name matches one of the field names
to be scrubbed, the variable&apos;s value will be scrubbed. (Like &lt;code&gt;access_token&lt;/code&gt; in the screenshot above.)&lt;/li&gt;
&lt;li&gt;The variable could contain a circular reference, be extremely large, or otherwise hard to
serialize. To deal with this, we use the &lt;a href=&quot;https://docs.python.org/2.7/library/repr.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;repr&lt;/a&gt;
module to safely convert the value to a string of reasonable length. We&apos;ve been using this
internally now in production for the past two weeks without issue.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;how-to-enable&quot;&gt;&lt;a href=&quot;#how-to-enable&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to Enable&lt;/h2&gt;
&lt;p&gt;If you&apos;re using Python, simply update to pyrollbar 0.8.0 or greater. Local variables are on by
default; see the &lt;a href=&quot;/docs/notifier/pyrollbar/&quot;&gt;docs&lt;/a&gt; for the full config reference.&lt;/p&gt;
&lt;p&gt;If you&apos;re using Erlang, you&apos;re in luck - &lt;a href=&quot;https://github.com/omarkj/erollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;erollbar&lt;/a&gt; already
sends argument values. Check its docs for details.&lt;/p&gt;
&lt;p&gt;Want this in a different language? Let us know -- email &lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt; or open an issue on
the GitHub repo for the appropriate Rollbar library.&lt;/p&gt;
&lt;p&gt;Don&apos;t use Rollbar yet? &lt;a href=&quot;/signup/&quot;&gt;Sign up for a free account&lt;/a&gt;, follow the setup instructions, and you&apos;ll be
debugging production in power mode in no time.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Deploy emails show which commits were deployed]]></title><description><![CDATA[We recently added a feature I've wanted for a long time: our Deploy email notifications now show
which commits were in that deploy. It looks…]]></description><link>https://rollbar.com/blog/deploy-emails-show-which-commits-were-deployed/</link><guid isPermaLink="false">https://rollbar.com/blog/deploy-emails-show-which-commits-were-deployed/</guid><pubDate>Wed, 04 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We recently added a feature I&apos;ve wanted for a long time: our Deploy email notifications now show
which commits were in that deploy. It looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-06-04-deploy-emails-show-which-commits-were-deployed/Screenshot-2014-06-04-133833.134004.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;This works by querying GitHub&apos;s API to find the differences between the commit used for the previous
deploy and the commit you just deployed. (If this looks familiar, it&apos;s because we show the same
information on the Deploys page). As long as one user in your account has GitHub enabled (and the
token enabled for your account), all users will be able to see the commit list.&lt;/p&gt;
&lt;p&gt;Want this? &lt;a href=&quot;/signup/&quot;&gt;Sign up for a free account&lt;/a&gt;, connect with GitHub, and set up deploy tracking.
Whenever you deploy, you and your team will get an email like the one above.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Daily summary email bugfix]]></title><description><![CDATA[Last week we fixed a bug in our daily summary emails that a customer reported on May 1st. The bug
caused some of the emails to miss…]]></description><link>https://rollbar.com/blog/Daily-summary-email-bugfix/</link><guid isPermaLink="false">https://rollbar.com/blog/Daily-summary-email-bugfix/</guid><pubDate>Mon, 02 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last week we fixed a bug in our daily summary emails that a customer reported on May 1st. The bug
caused some of the emails to miss information on errors that occurred during certain parts of the
day. This was a pretty serious bug. It affected almost all of our customers and had been around for
a very long time.&lt;/p&gt;
&lt;p&gt;The issue ended up being a miscalculation in our timezone handling code. Most developers who have
worked with timezones know how difficult it can be to get it right. I&apos;ll explain how we did it and
how Rollbar helped us quickly narrow in on the problem.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;debugging&quot;&gt;&lt;a href=&quot;#debugging&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Debugging&lt;/h2&gt;
&lt;p&gt;The symptoms:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The occurrence counts in some of the daily summary emails were too low&lt;/li&gt;
&lt;li&gt;Some new errors were not even in the daily summary emails&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first thing I did was to recreate the database query by hand. After reading the code and pulling
out the relevant queries, I was able to recreate the daily summaries for production but in a
development environment. At this point, it was clear that we were missing data but the query was
correct.&lt;/p&gt;
&lt;p&gt;Some possible culprits:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;MySQL slave delay&lt;/li&gt;
&lt;li&gt;Long-running MySQL transactions&lt;/li&gt;
&lt;li&gt;Nebulous time-zone related bug in our code&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I was able to verify that MySQL slave delay was not the cause by looking at our Scout graphs for the
database host. Slave delay was nowhere near where it needed to be to cause this.&lt;/p&gt;
&lt;p&gt;Next, I looked for long-running MySQL transactions. We have quite a few long-running connections so
it was impossible to determine if we had long-running transactions by looking at just the output
from MySQL&apos;s &lt;code&gt;SHOW FULL PROCESSLIST&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I added some code to the script that sends the daily summary emails to print out the maximum id on a
table in our database during each run of the script. If the maximum id never changed, it would mean
the transaction in which the query was executing was never being closed, (since we use
&lt;code&gt;REPEATABLE READ&lt;/code&gt; by default on all connections.)&lt;/p&gt;
&lt;p&gt;The ids were changing. This wasn&apos;t the problem...&lt;/p&gt;
&lt;p&gt;At this point it was clear that the problem was in our code. I had pored over it for a couple of
hours, testing everything and still could not find the problem. Then, I decided to add some Rollbar
debugging to get more information about the code that was running in production.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-06-02-Daily-summary-email-bugfix/Screen-Shot-2014-06-02-at-120402-PM.133930.l.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;After looking at the first occurrence it was clear what the problem was. The &lt;code&gt;min_ts&lt;/code&gt; and &lt;code&gt;max_ts&lt;/code&gt;
were incorrect. This code path was pretty straight forward and it was easy to find the culprit -
&lt;code&gt;time.mktime()&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-fix&quot;&gt;&lt;a href=&quot;#the-fix&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The fix&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://docs.python.org/2/library/time.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;docs for &lt;code&gt;time.mktime()&lt;/code&gt;&lt;/a&gt; say that it assumes the
&lt;code&gt;datetime&lt;/code&gt; object passed in uses the local timezone. Our code was passing in a &lt;code&gt;datetime&lt;/code&gt; object for
UTC which was getting ignored when we generated the timestamps for our query.&lt;/p&gt;
&lt;p&gt;The fix was a one-liner. Instead of using &lt;code&gt;time.mktime()&lt;/code&gt; we now us &lt;code&gt;calendar.timegm()&lt;/code&gt; since it
expects UTC.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2014/2014-06-02-Daily-summary-email-bugfix/Screen-Shot-2014-06-02-at-113951-AM.133932.l.png&quot; alt=&quot;&quot; title=&quot;Timezone bugfix&quot;&gt;&lt;/p&gt;
&lt;p&gt;Happy coding and watch out for timezone bugs!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[rollbar-php v0.9.2 released]]></title><description><![CDATA[We've released another small update to rollbar-php, version 0.9.2. Get it on
 Packagist  or
 GitHub . This release contains a  fix  for an…]]></description><link>https://rollbar.com/blog/rollbar-php-v0.9.2-released/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-php-v0.9.2-released/</guid><pubDate>Fri, 30 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve released another small update to rollbar-php, version 0.9.2. Get it on
&lt;a href=&quot;https://packagist.org/packages/rollbar/rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Packagist&lt;/a&gt; or
&lt;a href=&quot;https://github.com/rollbar/rollbar-php&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains a &lt;a href=&quot;https://github.com/rollbar/rollbar-php/pull/24&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;fix&lt;/a&gt; for an issue occurring
in high-volume environments using rollbar-php with rollbar-agent. Previously, it was possible for
relay log filenames to collide; now, the filenames include both the PID and the current time in
microseconds (from &lt;code&gt;microtime(true)&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/rfink&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ryan Fink&lt;/a&gt; for the pull request.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[rollbar-php v0.9.1 released]]></title><description><![CDATA[We've released another small update to rollbar-php, version 0.9.1. Get it on
 Packagist  or
 GitHub . This release contains a
 fix  for an…]]></description><link>https://rollbar.com/blog/rollbar-php-v0.9.1-released/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-php-v0.9.1-released/</guid><pubDate>Thu, 29 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve released another small update to rollbar-php, version 0.9.1. Get it on
&lt;a href=&quot;https://packagist.org/packages/rollbar/rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Packagist&lt;/a&gt; or
&lt;a href=&quot;https://github.com/rollbar/rollbar-php&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains a
&lt;a href=&quot;https://github.com/rollbar/rollbar-php/commit/76a5e21da314af85fa7d6732c11cf48d448f804a&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;fix&lt;/a&gt; for an
&lt;a href=&quot;https://github.com/rollbar/rollbar-php/issues/21&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;issue&lt;/a&gt; when using rollbar-php with rollbar-agent,
our server-side agent that allows asynchronous reporting. Previously, when used in agent mode, blank
files would be created on each request, even if there was nothing to report. Now, these files are
only created when needed.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/rfink&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ryan Fink&lt;/a&gt; from Red Ventures for the fix.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[rollbar-gem v0.12.20 released]]></title><description><![CDATA[We've released a new patch version of rollbar-gem, version 0.12.20. Get it on
 Rubygems  or  GitHub . This release contains a compatibility…]]></description><link>https://rollbar.com/blog/rollbar-gem-v0.12.20-released/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-gem-v0.12.20-released/</guid><pubDate>Thu, 29 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve released a new patch version of rollbar-gem, version 0.12.20. Get it on
&lt;a href=&quot;https://rubygems.org/gems/rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rubygems&lt;/a&gt; or &lt;a href=&quot;https://github.com/rollbar/rollbar-gem&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains a compatibility fix for Sidekiq &amp;#x3C; 2.3.2, as well as an improvement to the
project_gems feature. If you have multiple gems that you want to be considered in-project code, you
can now specify them with a regex (strings still work too).&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;configure &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;config&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
  config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;project_gems &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;/your_company/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;some_specific_gem&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/jcheatham&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Jonathan Cheatham&lt;/a&gt; for the pull request.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[rollbar-php v0.9.0 released]]></title><description><![CDATA[We've released a new version of rollbar-php, version 0.9.0. It's available now on
 Packagist , or find the source on
 GitHub . E_NOTICES NOW…]]></description><link>https://rollbar.com/blog/rollbar-php-v0.9.0-released/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-php-v0.9.0-released/</guid><pubDate>Fri, 23 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve released a new version of rollbar-php, version 0.9.0. It&apos;s available now on
&lt;a href=&quot;https://packagist.org/packages/rollbar/rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Packagist&lt;/a&gt;, or find the source on
&lt;a href=&quot;https://github.com/rollbar/rollbar-php&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;e_notices-now-ignored-by-default&quot;&gt;&lt;a href=&quot;#e_notices-now-ignored-by-default&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;E_NOTICES NOW IGNORED BY DEFAULT&lt;/h2&gt;
&lt;p&gt;Rollbar can track E&lt;em&gt;NOTICEs as &apos;info&apos;-level events, but in practice this often turns into large
amounts of data, even for relatively low-traffic projects. We&apos;ve changed the defaults to now ignore
E&lt;/em&gt;NOTICE errors.&lt;/p&gt;
&lt;p&gt;If you do want E_NOTICEs to be sent to Rollbar, configure like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-php&quot;&gt;&lt;code&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
Rollbar&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&apos;access_token&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;token here&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// other current config...&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&apos;included_errno&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;E_ERROR&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;E_WARNING&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;E_PARSE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;E_NOTICE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;E_CORE_ERROR&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;E_USER_ERROR&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;E_RECOVERABLE_ERROR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;maxerrno-is-dead-long-live-includederrno&quot;&gt;&lt;a href=&quot;#maxerrno-is-dead-long-live-includederrno&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;MAX&lt;em&gt;ERRNO IS DEAD, LONG LIVE INCLUDED&lt;/em&gt;ERRNO&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;max_errno&lt;/code&gt; configuration option has been removed and replaced by &lt;code&gt;included_errno&lt;/code&gt;.
included&lt;em&gt;errno takes a bitmask, like the PHP error&lt;/em&gt;reporting directive. The default includes
everything more severe than E&lt;em&gt;STRICT, except E&lt;/em&gt;NOTICE.&lt;/p&gt;
&lt;h2 id=&quot;x-rollbar-access-token-header-now-sent&quot;&gt;&lt;a href=&quot;#x-rollbar-access-token-header-now-sent&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;X-ROLLBAR-ACCESS-TOKEN HEADER NOW SENT&lt;/h2&gt;
&lt;p&gt;A few months ago, we added a feature to the API tier: the access token can now be provided in a
header, instead of being in the body of the request. This makes things easier on our API workload,
especially for requests that result in 429 or 403 response codes (because of rate limits, account
limits, disabled access tokens, etc.). It should result in slightly faster response times in those
cases.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[rollbar.js v1.0.0-rc8 released]]></title><description><![CDATA[Today, we released rollbar.js version 1.0.0-rc8. This release includes a
 fix  for a
bug where the global variable  i  was used, which could…]]></description><link>https://rollbar.com/blog/New-rollbar.js-version/</link><guid isPermaLink="false">https://rollbar.com/blog/New-rollbar.js-version/</guid><pubDate>Thu, 22 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, we released rollbar.js version 1.0.0-rc8. This release includes a
&lt;a href=&quot;https://github.com/rollbar/rollbar.js/commit/ffd624069125b0bc753d4a03eb939d3d9e8e0bb2&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;fix&lt;/a&gt; for a
bug where the global variable &lt;code&gt;i&lt;/code&gt; was used, which could cause strange behavior when interacting with
other code that also references &lt;code&gt;i&lt;/code&gt; as a global variable.&lt;/p&gt;
&lt;p&gt;The change is live now and being served from our CDN - no action is required on your part for most
customers. If you&apos;re self-hosting rollbar.js, we recommend upgrading your copy to the
&lt;a href=&quot;https://github.com/rollbar/rollbar.js/blob/master/dist/rollbar.min.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;latest&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Processing Delay Postmortem]]></title><description><![CDATA[Yesterday from about 2:30pm PDT until 4:55pm PDT, we experienced a service degradation that caused
our customers to see processing delays up…]]></description><link>https://rollbar.com/blog/processing-delay-postmortem/</link><guid isPermaLink="false">https://rollbar.com/blog/processing-delay-postmortem/</guid><pubDate>Fri, 11 Apr 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yesterday from about 2:30pm PDT until 4:55pm PDT, we experienced a service degradation that caused
our customers to see processing delays up to about 2 hours. While no data was lost, alerts were not
being sent and new data was not appearing in the rollbar.com interface. Customers instead would see
alerts notices on the Dashboard and Items page about the delay.&lt;/p&gt;
&lt;p&gt;We know that you rely on Rollbar to monitor your applications and alert you when things go wrong,
and we are very sorry that we let you down during this outage.&lt;/p&gt;
&lt;p&gt;The service degradation began following some planned database maintenance, which we had expected to
have no significant impact on service.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;the-planned-maintenance&quot;&gt;&lt;a href=&quot;#the-planned-maintenance&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Planned Maintenance&lt;/h2&gt;
&lt;p&gt;We store all of our data in MySQL in a master-master/active-passive configuration. Yesterday we
needed to add partitions to our largest table - a routine procedure. Normally, this process takes
about 15 minutes, during which time customers experience small delays in data processing. This
process generally goes unnoticed by customers. However, this time something caused the database to
load new data extremely slowly which, in turn, caused the outage.&lt;/p&gt;
&lt;h2 id=&quot;timeline&quot;&gt;&lt;a href=&quot;#timeline&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2:06pm - We began the planned maintenance by promoting the passive master to be the new active master.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2:29pm - The planned maintenance was complete.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All connections to our old active master were closed and the new active master was getting new data and processing it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2:40pm - It became apparent that new data was being loaded and processed very slowly.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We turned off our data loaders to decrease any contention in the database.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2:41pm - We began profiling the slow worker.&lt;/li&gt;
&lt;li&gt;2:47pm - We tested a theory that a single recurring item was causing most of the slow processing.&lt;/li&gt;
&lt;li&gt;~2:50pm - We noticed that ping times to the new active master were 1-5 milliseconds - an order of magnitude slower than normal.&lt;/li&gt;
&lt;li&gt;2:52pm - We turned off replication from the passive to the active database which seemed to help loading data, but not by much.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;~2:50pm - 3pm&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The ALTER to add partitions completed on the passive database.&lt;/li&gt;
&lt;li&gt;Up to this point, there were no connections on the passive database.&lt;/li&gt;
&lt;li&gt;We decided to switch back to the previous active master but quickly reverted after finding that our passive database was missing a significant number of rows.&lt;/li&gt;
&lt;li&gt;MySQL replication was 0 seconds behind.&lt;/li&gt;
&lt;li&gt;It was unclear how the passive database thought it was caught up but was missing data.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;~3:15pm - We identified a the slowest portion of the slow worker, which happened to be unused. We removed this code and deployed to all workers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This got processing back to normal speeds and allowed us to begin catching back up.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;~3:30pm - We turned the data loaders back on.&lt;/li&gt;
&lt;li&gt;4:30pm - The worker responsible to making new occurrences appear in the interface was caught up, but notifications were still delayed.&lt;/li&gt;
&lt;li&gt;4:55pm - Everything was caught back up and we were back to 0 delay.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;follow-on-tasks&quot;&gt;&lt;a href=&quot;#follow-on-tasks&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Follow-on Tasks&lt;/h2&gt;
&lt;p&gt;We have two open questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Why did the data loaders slow down when we switched to the new active master?&lt;/li&gt;
&lt;li&gt;How did the databases get out of sync?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We have some theories as to why the data loaders slowed down so much but we are not sure. It could
have been the amount of concurrent processes trying to load data into the same table. It could also
have been something about the disk layout or cache on the new active master. We plan to investigate
serializing loads in general and/or slowly ramping up loads after maintenance in the future.&lt;/p&gt;
&lt;p&gt;To determine why our databases became out of sync, we wrote a script to tell us the exact moment
when they diverged. Once it completes we will find the coordinates in the new active master’s
binlogs that correspond with the point in time where the databases became out of sync, then restart
replication on the passive master using those coordinates.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We take downtime very seriously and we want to be as transparent as possible when it happens.&lt;/p&gt;
&lt;p&gt;We are sorry for the degradation of service and we are working on making sure it doesn’t happen
again. If you have any questions, please don’t hesitate to contact us at &lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Heartbleed Bug Response]]></title><description><![CDATA[Updated 4/9 7:30pm What is Heartbleed? CVE-2014-0346, known as “Heartbleed”, is a bug in OpenSSL v1.0.1 through 1.0.1f that allows a remote…]]></description><link>https://rollbar.com/blog/heartbleed-bug-response/</link><guid isPermaLink="false">https://rollbar.com/blog/heartbleed-bug-response/</guid><pubDate>Tue, 08 Apr 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Updated 4/9 7:30pm&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-is-heartbleed&quot;&gt;&lt;a href=&quot;#what-is-heartbleed&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is Heartbleed?&lt;/h2&gt;
&lt;p&gt;CVE-2014-0346, known as “Heartbleed”, is a bug in OpenSSL v1.0.1 through 1.0.1f that allows a remote
attacker to access private memory on the target server. It has existed for almost 2 years. More info
can be found here: &lt;a href=&quot;http://heartbleed.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://heartbleed.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With this vulnerability, an attacker can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get your private key for your domain’s ssl cert&lt;/li&gt;
&lt;li&gt;Decrypt all current and past SSL traffic to/from all affected machines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If this sounds bad, it is. Most sites on the Internet are affected.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;are-you-affected&quot;&gt;&lt;a href=&quot;#are-you-affected&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Are you affected?&lt;/h2&gt;
&lt;p&gt;Probably. If your web server or load balancer is running on linux and you’ve updated your packages
anytime in the last 2 years, you are more-than-likely affected.&lt;/p&gt;
&lt;p&gt;To check your OpenSSL version, run &lt;code&gt;openssl version -a&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;http://filippo.io/Heartbleed/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://filippo.io/Heartbleed/&lt;/a&gt; to test your servers for the vulnerability.&lt;/p&gt;
&lt;h2 id=&quot;how-we-responded&quot;&gt;&lt;a href=&quot;#how-we-responded&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How We Responded&lt;/h2&gt;
&lt;p&gt;We learned of CVE-2014-0346 at around 4:50pm on 4/7 and immediately began our response. We completed
the most important fix (patching OpenSSL) within about an hour, and have been working over the past
24 hours on related issues.&lt;/p&gt;
&lt;p&gt;Here is a timeline of what we’ve done since the vulnerability was announced:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;4/7 - 3:01pm - Ubuntu Security Announcements email&lt;/p&gt;
&lt;p&gt;Subscribe to this list &lt;a href=&quot;https://lists.ubuntu.com/mailman/listinfo/ubuntu-security-announce&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4/7 - 4:50pm - Began updating our load balancers with the fix. All servers patched by 6pm.&lt;/p&gt;
&lt;p&gt;We’re running nginx on Ubuntu 12.04. Updating is as simple as:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update
&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; upgrade
openssl version -a &lt;span class=&quot;token comment&quot;&gt;# should show that it was built on April 7, 2014&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt; nginx restart
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The above didn’t work for us on the first try because our servers were talking to a mirror that
hadn’t updated to the latest packages (after all, they were only a couple hours old). Changing the
domain in each line in &lt;code&gt;/etc/apt/sources.list&lt;/code&gt; to &lt;code&gt;archive.ubuntu.com&lt;/code&gt; and then running
&lt;code&gt;apt-get update&lt;/code&gt; again solved this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4/7 - 11pm - rollbar.com and api.rollbar.com SSL certs were rekeyed&lt;/p&gt;
&lt;p&gt;We use &lt;a href=&quot;http://www.digicert.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;DigiCert&lt;/a&gt; for our SSL certs. The process was quick and easy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4/7 - 11:10pm - Previous rollbar.com and api.rollbar.com SSL certs revoked&lt;/p&gt;
&lt;p&gt;In order to prevent a possible man-in-the-middle attack we had Digicert revoke our old certs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4/7 - 11:30pm - ratchet.io and submit.ratchet.io rekey requested&lt;/p&gt;
&lt;p&gt;We still support our old domain, ratchet.io which use NetworkSolutions SSL certs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4/8 - 11:50am - All rollbar.com cookies were invalidated, forcing users to re-auth&lt;/p&gt;
&lt;p&gt;Since an attacker could have accessed our customers’ cookies, we changed the secret key that we use
to encrypt cookies. This invalidated all logged-in users’ sessions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4/8 - 12:30pm - 2:25pm - All third-party tokens and keys were regenerated and deployed&lt;/p&gt;
&lt;p&gt;We use services like Stripe, Mailgun, Heroku - All required new keys to be generated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4/8 - 3:30pm - ratchet.io and submit.ratchet.io certs were rekeyed and deployed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4/8 - 5:30pm - Published this blog post and added in-app notifications to change passwords and cycle access tokens&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Update 4/9&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Thanks to
&lt;a href=&quot;http://security.stackexchange.com/questions/55249/what-clients-are-proven-to-be-vulnerable-to-heartbleed&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;this post on security.stackexchange&lt;/a&gt;,
we additionally patched our application and compute servers (everything that can make outgoing HTTPS
requests). This was started at 3:45pm and completed at 4:45pm. The attack surface here is much
lower, as it requires creating a Rollbar account and setting up a webhook that points to the
attacker’s malicious server. We audited our logs and confirmed that there has been no such
suspicious activity.&lt;/p&gt;
&lt;h2 id=&quot;recommended-actions-for-rollbar-customers&quot;&gt;&lt;a href=&quot;#recommended-actions-for-rollbar-customers&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Recommended actions for Rollbar Customers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/settings/password/&quot;&gt;Change your password&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cycle any access tokens you have used (create and start using a new one, then disable or delete
the old one).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For projects, go to the project dashboard, then Settings -&gt; Project Access Tokens.
Most customers will need to do this.&lt;/li&gt;
&lt;li&gt;For accounts, go to Account Settings -&gt; Account Access Tokens. Most customers will not need
to do this.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;note-for-heroku-users&quot;&gt;&lt;a href=&quot;#note-for-heroku-users&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Note for Heroku Users&lt;/h3&gt;
&lt;p&gt;If you’re using Rollbar through Heroku, we’ve already started the process of cycling your access
tokens. We’ve created new tokens and updated them in your Heroku config. You should update the token
in any other locations (i.e. development environments, and anywhere it might be hardcoded) and then
disable/delete the old tokens.&lt;/p&gt;
&lt;h2 id=&quot;closing-notes&quot;&gt;&lt;a href=&quot;#closing-notes&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Closing notes&lt;/h2&gt;
&lt;p&gt;This was painful, but we’re thankful to the security researchers who discovered and responsibly
disclosed this issue, and to the security teams at Ubuntu and elsewhere who quickly released patched
packages.&lt;/p&gt;
&lt;p&gt;If you have any questions, please don’t hesitate to contact us at &lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Connecting Rollbar with PagerDuty]]></title><description><![CDATA[Using Rollbar with  PagerDuty  is now a lot more seamless. PagerDuty
provides SaaS IT on-call schedule management, alerting, and incident…]]></description><link>https://rollbar.com/blog/connect-rollbar-with-pagerduty/</link><guid isPermaLink="false">https://rollbar.com/blog/connect-rollbar-with-pagerduty/</guid><pubDate>Wed, 16 Oct 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2013/2013-10-16-connect-rollbar-with-pagerduty/pagerduty.133476.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Using Rollbar with &lt;a href=&quot;http://www.pagerduty.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;PagerDuty&lt;/a&gt; is now a lot more seamless. PagerDuty
provides SaaS IT on-call schedule management, alerting, and incident tracking. With our new
integration, you can automatically send issues found by Rollbar into incidents in PagerDuty.&lt;/p&gt;
&lt;p&gt;We have a few customers using it already. Here’s what Richard Lee, CTO at Polydice, a mobile
development studio, has to say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“With Rollbar’s integration of PagerDuty, we’re able to get notified as soon as errors detected, and
avoid possible downtime to our customers. This powerful combination becomes a must have tool for
us.” — Richard Lee, CTO at Polydice&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Integrating Rollbar with PagerDuty is easy; just create a new Generic API System in PagerDuty, and
then link it in Rollbar’s Notification settings. See our &lt;a href=&quot;/docs/pagerduty/&quot;&gt;docs&lt;/a&gt;
for detailed instructions.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Resolving Rollbar Items in Versions]]></title><description><![CDATA[We just rolled out a new feature to help track which versions/revisions errors are resolved in. When
resolving items within Rollbar, you…]]></description><link>https://rollbar.com/blog/resolving-rollbar-items-in-versions/</link><guid isPermaLink="false">https://rollbar.com/blog/resolving-rollbar-items-in-versions/</guid><pubDate>Tue, 17 Sep 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We just rolled out a new feature to help track which versions/revisions errors are resolved in. When
resolving items within Rollbar, you have the option of entering a revision or version number. If one
is entered, it will appear in the item’s status history to let anyone looking at the item better
understand specifically when it was fixed.&lt;/p&gt;
&lt;p&gt;This version can be combined with a new &lt;code&gt;code_version&lt;/code&gt; parameter set in the configuration options of
the latest versions of our notifiers. This can be set to either a numerical value (eg. 1, 24, 300),
a semantic version value (eg. 1.0.3, 2.9), or a git revision sha. Here are examples on how to set
this parameter in our JavaScript and Ruby notifiers:&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;In the &lt;a href=&quot;https://github.com/rollbar/rollbar.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JavaScript&lt;/a&gt; snippet:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;_rollbarParams &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ... other configuration&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;client.javascript.code_version&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bdd2b9241f791fc9f134fb3244b40d452d2d7e35&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;In your &lt;a href=&quot;https://github.com/rollbar/rollbar-gem&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;rollbar-gem&lt;/a&gt; configuration:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;token constant&quot;&gt;Rollbar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;configure &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;config&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# ... other configuration&lt;/span&gt;
    config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;code_version &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;bdd2b9241f791fc9f134fb3244b40d452d2d7e35&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The other notifiers have a very similar top-level code_version configuration settings. See the
notifier readmes for more info.&lt;/p&gt;
&lt;p&gt;If you resolve an item within Rollbar in a certain version and are also specifying a &lt;code&gt;code_version&lt;/code&gt;
for your code, we will use both of these values to decide whether or not to reactivate the item.&lt;/p&gt;
&lt;p&gt;For example, say you have a bug in version 1.0 of your app. The bug is fixed and will be deployed to
users in verision 1.1, but that won’t happen for a few days. You can just resolve the Rollbar item
associated with this bug now, but also specify that the resolved version is 1.1. You will no longer
get reactivation notifications for this item until occurrences of this item with a &lt;code&gt;code_version&lt;/code&gt; &gt;=
1.1 come in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2013/2013-09-17-resolving-rollbar-items-in-versions/resolve-in-version-popup.133477.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you connect Rollbar with GitHub, this process will also work with Git SHAs. We’ll query the
GitHub API to determine whether one commit is a parent of the other.&lt;/p&gt;
&lt;h2 id=&quot;auto-resolving-items-in-github-commits&quot;&gt;&lt;a href=&quot;#auto-resolving-items-in-github-commits&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Auto-resolving items in GitHub commits&lt;/h2&gt;
&lt;p&gt;You can now also include Rollbar item tags in your GitHub commit messages to automatically resolve
them in the correct revision when deploying. Just include one of the following strings in your
commits for each item you want to resolve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fix $ref&lt;/li&gt;
&lt;li&gt;fixed $ref&lt;/li&gt;
&lt;li&gt;fixes $ref&lt;/li&gt;
&lt;li&gt;resolve $ref&lt;/li&gt;
&lt;li&gt;resolved $ref&lt;/li&gt;
&lt;li&gt;resolves $ref&lt;/li&gt;
&lt;li&gt;close $ref&lt;/li&gt;
&lt;li&gt;closed $ref&lt;/li&gt;
&lt;li&gt;closes $ref&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where $ref is one of the following item tags:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full item URL, eg. &lt;code&gt;https://rollbar.com/item/123456789&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Item ID, eg. &lt;code&gt;rb#123456789&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Short item ID, eg. &lt;code&gt;rb#22&lt;/code&gt; This appears at the top left of an item page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then execute a deploy by hitting the &lt;a href=&quot;/docs/deploys/bash/&quot;&gt;deploy API endpoint&lt;/a&gt;. The
items referenced in any of the commit messages of the deploy will be resolved using the respective
revision of that commit.&lt;/p&gt;
&lt;p&gt;You can start tracking and resolving errors in Rollbar by &lt;a href=&quot;/signup/&quot;&gt;signing up for free&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ad-hoc error reporting with Rollbar CLI]]></title><description><![CDATA[We just coded up a quick tool to send Rollbar messages from the command line. It’s useful for quick,
one-off monitoring scripts that you don…]]></description><link>https://rollbar.com/blog/ad-hoc-error-reporting-with-rollbar-cli/</link><guid isPermaLink="false">https://rollbar.com/blog/ad-hoc-error-reporting-with-rollbar-cli/</guid><pubDate>Thu, 08 Aug 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We just coded up a quick tool to send Rollbar messages from the command line. It’s useful for quick,
one-off monitoring scripts that you don’t have time to instrument with one of our notifiers.&lt;/p&gt;
&lt;p&gt;To install, just &lt;code&gt;pip install rollbar&lt;/code&gt; and you’re done.&lt;/p&gt;
&lt;p&gt;e.g. Tracking all non-500s as WARNINGs from HAProxy&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;token function&quot;&gt;tail&lt;/span&gt; -f /var/log/haproxy.log &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{print &lt;span class=&quot;token variable&quot;&gt;$11&lt;/span&gt;,&lt;span class=&quot;token variable&quot;&gt;$0&lt;/span&gt;}&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;^5&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;=&quot;&quot;;print &quot;warning&quot;,&lt;span class=&quot;token variable&quot;&gt;$0&lt;/span&gt;}&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; rollbar -t &lt;span class=&quot;token variable&quot;&gt;$ACCESS_TOKEN&lt;/span&gt; -e production -v
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;e.g. Watch failed login attempts&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;token function&quot;&gt;tail&lt;/span&gt; -f /var/log/auth.log &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; -i &lt;span class=&quot;token string&quot;&gt;&apos;Failed password&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{print &quot;error user &quot;,&lt;span class=&quot;token variable&quot;&gt;$11&lt;/span&gt;,&quot;failed auth from &quot;,&lt;span class=&quot;token variable&quot;&gt;$13&lt;/span&gt;}&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; rollbar -t &lt;span class=&quot;token variable&quot;&gt;$ACCESS_TOKEN&lt;/span&gt; -e ops
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;More info on how to install and use it can be found
&lt;a href=&quot;https://github.com/rollbar/pyrollbar/blob/master/README.md#command-line-usage&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[jQuery Error Instrumentation]]></title><description><![CDATA[Today we are releasing a new feature for our JavaScript notifier that should make tracking down
errors much easier if you use jQuery 1.7 and…]]></description><link>https://rollbar.com/blog/jquery-error-instrumentation/</link><guid isPermaLink="false">https://rollbar.com/blog/jquery-error-instrumentation/</guid><pubDate>Wed, 07 Aug 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today we are releasing a new feature for our JavaScript notifier that should make tracking down
errors much easier if you use jQuery 1.7 and above. The new functionality comes in a separate JS
plugin snippet that should be placed right below where jQuery is loaded. Here is the first version
of the plugin:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;![CDATA[&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; t&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;notifier.plugins.jquery.version&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;_rollbarParams&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ajaxError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;u&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; o&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; a&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;level&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;warning&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;jQuery ajax error for url &quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;jquery_status&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;o&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; jquery_url&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;jquery_thrown_error&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;u&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;jquery_ajax_error&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; u&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ready&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;ready&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; u&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; o&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; a&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;on&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;u&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;arguments&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;o&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; e&lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;function&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; e&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; t&lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;function&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;t&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;u&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; u&lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;function&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; u&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;u&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;u&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; f&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;off&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;off&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; n&lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;function&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;n&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;o&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; o&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;e&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;o&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; o&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;jQuery&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ]]&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The source can be found on GitHub &lt;a href=&quot;https://github.com/rollbar/rollbar.js/blob/master/src/plugins/jquery.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;The snippet wraps the &lt;code&gt;ready()&lt;/code&gt;, &lt;code&gt;on()&lt;/code&gt; and &lt;code&gt;off()&lt;/code&gt; functions in jQuery to wrap any passed-in
handlers in try/except blocks to automatically report errors to Rollbar. This lets us collect the
full stack trace with line and column numbers for each frame, instead of just the last frame with
only a line number. When combined with &lt;a href=&quot;/docs/sourcemaps/&quot;&gt;source maps&lt;/a&gt;, this makes debugging
JavaScript errors much more doable.&lt;/p&gt;
&lt;p&gt;The new snippet also adds a handler to ajaxError() to automatically report any jQuery AJAX errors
such as 404s and 500s to Rollbar. If you don’t want this, add the following option to your base
snippet’s &lt;code&gt;_rollbarParams&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;&quot;notifier.plugins.jquery.ignoreAjaxErrors&quot;: true&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You can start tracking errors in Rollbar by &lt;a href=&quot;/signup/&quot;&gt;signing up for free&lt;/a&gt;.
Or read more in the &lt;a href=&quot;/docs/notifier/rollbar.js/&quot;&gt;docs&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JavaScript and Source Maps in a Django App]]></title><description><![CDATA[It’s pretty well known that every web app needs frontend JavaScript these days to provide the best
possible user experience. You are…]]></description><link>https://rollbar.com/blog/javascript-and-source-maps-in-a-django-app/</link><guid isPermaLink="false">https://rollbar.com/blog/javascript-and-source-maps-in-a-django-app/</guid><pubDate>Fri, 02 Aug 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It’s pretty well known that every web app needs frontend JavaScript these days to provide the best
possible user experience. You are probably going to have a bunch of JavaScript files that need to be
loaded by your users for that to happen, and since we all care about performance, minifiying and
compressing these files is an absolute must. But what happens when it comes time to debug issues in
these minified files? Stack traces will more or less be completely useless. How do we solve this
problem?&lt;/p&gt;
&lt;p&gt;JavaScript source maps solve this problem. They allow you to map a point in a minified file back to
the unminfied source, making it possible to actually identify and fix issues encountered in a
production app environment.&lt;/p&gt;
&lt;p&gt;Below I have outlined a simple guide for setting up source map generation and usage in a sample
Django app. You’ll learn how generate source maps for minified files, debug errors that happen in
these files, and also a quick overview of what’s required to get this working for your production
environments.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;local-debugging-with-source-maps&quot;&gt;&lt;a href=&quot;#local-debugging-with-source-maps&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Local Debugging with Source Maps&lt;/h2&gt;
&lt;p&gt;Say you have a simple Django app with the following directory structure:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;...
app/
    ...
    views.py
    static/
        js/
            site.js (containing various models and functionality used in your app)
            jquery.js (unminified)
            util.js
    templates/
        index.html&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;code&gt;site.js&lt;/code&gt; would have the following code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;aFunction&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

App &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
App&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;errorCausingFunction&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;aFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;&lt;code&gt;views.py&lt;/code&gt; would just contain one view that rendered &lt;code&gt;index.html&lt;/code&gt;, and here is how &lt;code&gt;index.html&lt;/code&gt;
would look like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-html&quot;&gt;&lt;code&gt;...
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/javascript&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;static/js/site.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/javascript&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;static/js/jquery.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/javascript&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;static/js/util.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
....
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/javascript&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;![CDATA[&lt;/span&gt;
App&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;errorCausingFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ]]&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Let’s minify. Start by installing UglifyJS2:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; -g uglify-js
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Here is an example command run from &lt;code&gt;app/&lt;/code&gt; that will generate minified Javascript:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;uglifyjs static/js/site.js static/js/jquery.js static/js/util.js --output static/js/all.min.js
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Here we are using uglifyjs to minify three JS files, &lt;code&gt;site.js&lt;/code&gt;, &lt;code&gt;util.js&lt;/code&gt;, and &lt;code&gt;jquery.js&lt;/code&gt;, into
&lt;code&gt;all.min.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Update your &lt;code&gt;index.html&lt;/code&gt; to include only &lt;code&gt;all.min.js&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;Now let’s try navigating to &lt;code&gt;index.html&lt;/code&gt; and seeing what happens:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2013/2013-08-02-javascript-and-source-maps-in-a-django-app/stacktrace-minified-chrome.133478.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Not the most helpful stack trace. All the line numbers are 1, and if this were a much larger file
with more generic function/variable names, it would be completely useless in helping you debug where
things went wrong.&lt;/p&gt;
&lt;p&gt;Let’s introduce source map functionality to our app.&lt;/p&gt;
&lt;p&gt;Modify your minification command to look like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;uglifyjs static/js/site.js static/js/jquery.js static/js/util.js --output static/js/all.min.js --source-map static/js/all.min.map --source-map-url /static/js/all.min.map
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Here we are adding two new options, &lt;code&gt;--source-map&lt;/code&gt; and &lt;code&gt;--source-map-url&lt;/code&gt;. UglifyJS2 will now
generate the resulting source map as &lt;code&gt;static/js/all.min.map&lt;/code&gt;, and will append a comment to the end of
the minified file containing the url to the source map on your website, in this case
&lt;code&gt;/static/js/all.min.map&lt;/code&gt;. Note, you may need to modify the comment in &lt;code&gt;all.min.map&lt;/code&gt; to read &lt;code&gt;//#&lt;/code&gt; instead
of &lt;code&gt;//@&lt;/code&gt;, as this is a &lt;a href=&quot;https://groups.google.com/forum/#!topic/mozilla.dev.js-sourcemap/4uo7Z5nTfUY&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;recently new convention&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now navigate to your app in Chrome with Developer Tools open. If everything is set up right, Chrome
will automatically translate the frames in the stack trace to the unminified equivalents, like so:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2013/2013-08-02-javascript-and-source-maps-in-a-django-app/stacktrace-unminified-chrome.133479.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Note that the filenames and line numbers now refer to the original source code, instead of the
minified source.&lt;/p&gt;
&lt;h2 id=&quot;production-debugging-with-source-maps&quot;&gt;&lt;a href=&quot;#production-debugging-with-source-maps&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Production Debugging with Source Maps&lt;/h2&gt;
&lt;p&gt;The above process is all fine and dandy for errors encountered on your local machine, but what if
you want to keep track of errors encountered by your users in real-time?&lt;/p&gt;
&lt;p&gt;Here at &lt;a href=&quot;/&quot;&gt;Rollbar&lt;/a&gt;, we have recently reworked our error processing pipeline to support the
application of source maps on JavaScript errors. Here’s how you would get Rollbar hooked up and
reporting from your production environment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a Rollbar account&lt;/li&gt;
&lt;li&gt;Follow the instructions to insert the Rollbar Javascript notifier snippet into your base template&lt;/li&gt;
&lt;li&gt;Modify the snippet configuration to signal that source maps should be used:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;  &lt;code&gt;js _rollbarParams = { // ... other params ... // set this to &apos;true&apos; to enable source map processing &quot;client.javascript.source_map_enabled&quot;: true, // provide the current code version, i.e. the git SHA of your javascript code. &quot;client.javascript.code_version&quot;: &quot;bdd2b9241f791fc9f134fb3244b40d452d2d7e35&quot; }&lt;/code&gt;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Make sure your minified files link properly to publicly accessible source maps using the
&lt;code&gt;sourceMappingURL&lt;/code&gt; comment:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token comment&quot;&gt;// ... minified js file contents ...&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//# sourceMappingURL=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Now, when your app sends Rollbar an error report, Rollbar will automatically attempt to download
source maps defined in your minified files and apply them to stack frames located in these files.&lt;/p&gt;
&lt;p&gt;Here is an example of the source map application process in action with an unminified stack trace
that you would see in Rollbar:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2013/2013-08-02-javascript-and-source-maps-in-a-django-app/stacktrace-unminified-rollbar.133480.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Notice the unminified source filenames with relevant line and column numbers.&lt;/p&gt;
&lt;h2 id=&quot;automating-things&quot;&gt;&lt;a href=&quot;#automating-things&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Automating things&lt;/h2&gt;
&lt;p&gt;It’s a bit annoying to have to minify everything every time you change one of your Javascript files.
We have a small script set up here in our dev environments that uses
&lt;a href=&quot;https://pypi.python.org/pypi/MacFSEvents&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;macfsevents&lt;/a&gt; to listen for Javascript file changes. Once
such events occur, we check to see if only the Javascript files we care about are affected. If so,
we run an uglifyjs command on all the Javascript files to generate minified sources and source maps.&lt;/p&gt;
&lt;p&gt;You can even go one step further by making an API call to Rollbar to upload your source map as part
of your deploy process. This API endpoint also accepts source file uploads for files referenced by
the source map, giving us the ability to print out the unminified source code for each frame in the
stack trace. For example:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2013/2013-08-02-javascript-and-source-maps-in-a-django-app/stacktrace-unminified-rollbar-with-source.133481.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here’s a sample command you could use to upload a source map and source file to our API:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;curl https://api.rollbar.com/api/1/sourcemap \
-F access_token&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;aaaabbbbccccddddeeeeffff00001111 \
-F version&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;bdd2b9241f791fc9f134fb3244b40d452d2d7e35 \
-F minified_url&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;http://127.0.0.1:8005/static/js/all.min.js \
-F source_map&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;@app/static/js/all.min.map \
-F app/static/js/site.js&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;@app/static/js/site.js
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The last param is a mapping of source file path to actual source file contents. The path would need
to match the one defined in your source map, generated by your minification tool.&lt;/p&gt;
&lt;h2 id=&quot;more-info&quot;&gt;&lt;a href=&quot;#more-info&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;More info&lt;/h2&gt;
&lt;p&gt;Check out the documentation for more info about integrating your
&lt;a href=&quot;/docs/notifier/rollbar.js/&quot;&gt;JavaScript&lt;/a&gt; and &lt;a href=&quot;/docs/sourcemaps/&quot;&gt;source maps&lt;/a&gt; with Rollbar.
Rollbar also integrates with your Python, Rails, PHP and Node.js based backends.&lt;/p&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you
defeat annoying django errors in your applications. :-)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/signup/&quot;&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/728x90FIXFAST-Gen.153113.o.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Debug Production Errors in Minified JavaScript with Source Maps and Rollbar]]></title><description><![CDATA[Rollbar  just got a much-requested feature: Source Maps support for Javascript. If you minify your
Javascript code in production, this will…]]></description><link>https://rollbar.com/blog/debug-production-errors-in-minified-javascript-with-source-maps-and-rollbar/</link><guid isPermaLink="false">https://rollbar.com/blog/debug-production-errors-in-minified-javascript-with-source-maps-and-rollbar/</guid><pubDate>Thu, 25 Jul 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/&quot;&gt;Rollbar&lt;/a&gt; just got a much-requested feature: Source Maps support for Javascript. If you minify your
Javascript code in production, this will make debugging production errors much easier. This feature
is now live for all accounts.&lt;/p&gt;
&lt;p class=&quot;highlightbox&quot;&gt;
&lt;strong&gt;&lt;a href=&quot;https://rollbar.com/blog/how-to-use-javascript-source-maps-to-debug-errors/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Here&apos;s a link&lt;/a&gt;&lt;/strong&gt; to a recently updated tutorial on using JavaScript source maps with Rollbar.  &lt;/p&gt;
&lt;h2 id=&quot;what-are-source-maps&quot;&gt;&lt;a href=&quot;#what-are-source-maps&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What Are Source Maps?&lt;/h2&gt;
&lt;p&gt;If you minify your Javascript code (i.e. using &lt;a href=&quot;https://github.com/mishoo/UglifyJS2&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;UglifyJS2&lt;/a&gt; or
the &lt;a href=&quot;https://developers.google.com/closure/compiler/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Closure Compiler&lt;/a&gt;), it gets harder to debug
errors. Stack traces reference the line/column numbers in the minified code instead of the original
source code.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Source Maps&lt;/a&gt; were designed to
resolve this; they provide a mapping back from the minified line/column numbers to the original
code. Chrome and Firefox have tools to use them in development, but what about errors that happen in
production?&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;source-maps-and-rollbar&quot;&gt;&lt;a href=&quot;#source-maps-and-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Source Maps and Rollbar&lt;/h2&gt;
&lt;p&gt;Rollbar can now map stack traces that reference minified code back to the original source files,
lines, and column numbers. Here’s what a stack trace might have looked like before:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2013/2013-07-25-debug-production-errors-in-minified-javascript-with-source-maps-and-rollbar/stacktrace-minified.133482.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here’s the de-minified version:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2013/2013-07-25-debug-production-errors-in-minified-javascript-with-source-maps-and-rollbar/stacktrace-unminified.133483.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;We’ll also use the de-minified stack trace in our
&lt;a href=&quot;/docs/grouping-algorithm/&quot;&gt;grouping algorithm&lt;/a&gt;, which should result in more useful grouping.&lt;/p&gt;
&lt;h2 id=&quot;getting-this-set-up&quot;&gt;&lt;a href=&quot;#getting-this-set-up&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Getting this set up&lt;/h2&gt;
&lt;p&gt;To get started, you’ll need to make a change to _rollbarParams in the on-page javascript snippet.
Add the following two parameters:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;_rollbarParams &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ... existing params ...&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// set this to &apos;true&apos; to enable source map processing&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;client.javascript.source_map_enabled&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// provide the current code version, i.e. the git SHA of your javascript code.&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;client.javascript.code_version&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bdd2b9241f791fc9f134fb3244b40d452d2d7e35&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Next, either: - Add a sourceMappingUrl comment at the end of your minified file to point to the
source map - Upload the source map (along with all source files) separately, as part of your deploy
process&lt;/p&gt;
&lt;p&gt;This second step is a bit more involved so please see our &lt;a href=&quot;/docs/sourcemaps/&quot;&gt;docs&lt;/a&gt; for
more details.&lt;/p&gt;
&lt;h2 id=&quot;caveats&quot;&gt;&lt;a href=&quot;#caveats&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Caveats&lt;/h2&gt;
&lt;p&gt;All of this relies on having a stack trace with line and column numbers. Unfortunately, browser
support for column numbers is inconsistent. As of today, this will work in Chrome, Firefox, and
IE10+, and only for caught errors reported like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;doSomething&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  _rollbar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Uncaught errors (reported via window.onerror) don’t have column numbers in any browser we’re aware
of, so they aren’t able to be de-obfuscated. For best results, catch all your exceptions so you
don’t fall back to the top-level error handler.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you haven’t already, signup for a &lt;a href=&quot;/signup/&quot;&gt;14-day free trial of Rollbar&lt;/a&gt; and let us help you
defeat annoying javascript errors in your applications. :-)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/signup/&quot;&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/728x90FIXFAST-Gen.153113.o.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Async node.js API server testing]]></title><description><![CDATA[This post is about how we built our test suite for our API server at  Rollbar  and some of the
tricks and gotchas we ran into along the way…]]></description><link>https://rollbar.com/blog/Async-nodejs-API-server-testing/</link><guid isPermaLink="false">https://rollbar.com/blog/Async-nodejs-API-server-testing/</guid><pubDate>Fri, 12 Jul 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This post is about how we built our test suite for our API server at &lt;a href=&quot;/&quot;&gt;Rollbar&lt;/a&gt; and some of the
tricks and gotchas we ran into along the way. We wanted to build a test suite that not only tested
the API logic, but also the underlying code, namely the &lt;a href=&quot;http://expressjs.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Express&lt;/a&gt; and the
&lt;a href=&quot;http://www.senchalabs.org/connect/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Connect&lt;/a&gt; middlewares we use. If our API server was going to
break, we wanted to know before we deployed it to thousands of customers and millions of requests
per day.&lt;/p&gt;
&lt;p&gt;Testing is super important. If you don’t want to test, this probably won’t be very helpful or
interesting.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;we-use-vows-why-not-mocha&quot;&gt;&lt;a href=&quot;#we-use-vows-why-not-mocha&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;We use Vows. Why not Mocha?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://visionmedia.github.io/mocha/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Mocha&lt;/a&gt; is, by far, the most widely used testing framework for
Node.js apps. So, why didn’t we use it? The two main reasons were that Vows was the first thing I
found when Googling “nodejs async testing” and the other is that the syntax of Mocha tests felt like
another language and less like code. Mocha tests are more readable but the benefit of readability
was overshadowed by the need to remember all of these new, special-case methods that Mocha injects.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token comment&quot;&gt;//Mocha&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;should&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;equal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;vs&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token comment&quot;&gt;//Vows&lt;/span&gt;
assert&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;equal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;There’s something that bothered me about the former. I didn’t like how the library used a bunch of
magic to enable something this small/strange.&lt;/p&gt;
&lt;p&gt;Mocha has a lot of awesome features but none that were important enough for me to switch.&lt;/p&gt;
&lt;h3 id=&quot;a-simple-vows-test&quot;&gt;&lt;a href=&quot;#a-simple-vows-test&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A simple Vows test&lt;/h3&gt;
&lt;p&gt;Vows works just as you’d expect it to, except when it doesn’t. More on that later…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; vows &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;vows&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; assert &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;assert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
vows&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;testmodule&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addBatch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;call username() with a valid user id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    topic&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; callback &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;callback&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;callback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;and verify username is correct&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; username&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      assert&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isNull&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      assert&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;username&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      assert&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;equal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;username&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cory&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;module&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;The above test will make sure that the function &lt;code&gt;username()&lt;/code&gt; calls its callback with &lt;code&gt;(null, &quot;cory&quot;)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Note that we use this.callback since everything is assumed to be async and we use &lt;code&gt;{error: false}&lt;/code&gt;
when we export the batch. More on those later.&lt;/p&gt;
&lt;p&gt;Check out the Vows &lt;a href=&quot;http://vowsjs.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;website&lt;/a&gt; for better examples.&lt;/p&gt;
&lt;h2 id=&quot;useful-design-patterns-i-swear-this-will-be-short&quot;&gt;&lt;a href=&quot;#useful-design-patterns-i-swear-this-will-be-short&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Useful design patterns (I swear this will be short)&lt;/h2&gt;
&lt;p&gt;We’ve found a few idioms and conventions that have been super helpful. Without going too much into
design patterns and architecture, here are a few tips that have made writing tests super-easy;
almost enjoyable—almost.&lt;/p&gt;
&lt;h3 id=&quot;separate-your-view-logic-from-your-api-business-logic&quot;&gt;&lt;a href=&quot;#separate-your-view-logic-from-your-api-business-logic&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Separate your view logic from your API business logic&lt;/h3&gt;
&lt;p&gt;Your server’s views should have one job, to marshall data from the request/socket/carrier pigeon and
provide it to your API library.&lt;/p&gt;
&lt;p&gt;Any error checking done in your views should be to make sure the types provided to your API library
are correct.&lt;/p&gt;
&lt;h3 id=&quot;make-every-function-you-write-use-a-callback&quot;&gt;&lt;a href=&quot;#make-every-function-you-write-use-a-callback&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Make every function you write use a callback&lt;/h3&gt;
&lt;p&gt;This is super-important for refactoring and adding new features. If you find yourself wanting to add
a feature that requires i/o into a code path that was assumed to be completely synchronous, you’ll
need to refactor the hell our of your code to make it work. Don’t bother. Make everything take a
callback. Embrace async!&lt;/p&gt;
&lt;h3 id=&quot;make-the-first-argument-to-every-callback-be-an-optional-error&quot;&gt;&lt;a href=&quot;#make-the-first-argument-to-every-callback-be-an-optional-error&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Make the first argument to every callback be an optional error&lt;/h3&gt;
&lt;p&gt;This is how the Node.js developers do it and I agree. It makes for a lot more boiler-plate code but
it forces you to keep error handling in-mind when developing. Writing defensive code is more
important than writing fewer lines of code.&lt;/p&gt;
&lt;p&gt;This will also make testing much, much easier with Vows. How? Read on…&lt;/p&gt;
&lt;h2 id=&quot;testing-the-api-server-for-reals&quot;&gt;&lt;a href=&quot;#testing-the-api-server-for-reals&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Testing the API server, for reals&lt;/h2&gt;
&lt;p&gt;Definitely write tests and exercise your API library directly but don’t stop there. Fork a process,
start your API server up in it and start firing requests at it using Vows.&lt;/p&gt;
&lt;p&gt;testcommon.js:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;exports&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;initTestingAppChildProc&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; promise&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ... Setup temporary config file&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ... Get path to your main app.js&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ... Initialize the api library&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// fork a child process to start the api server&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;configPath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;test&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; appProc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fork&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;appJsPath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// This is used to tell if our API server died during its&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// initialization.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; pendingCallback &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  appProc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;message&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ready&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      pendingCallback &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// This is how we know our API server is ready to&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// receive requests. The message is emitted in the&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// API server once it&apos;s ready to receive requests.&lt;/span&gt;
      promise&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;emit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;success&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; appProc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  appProc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;exit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;code&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; signal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pendingCallback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; msg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;child process exited before callback&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      promise&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;emit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  appProc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;SIGTERM&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;In our API server:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;&lt;span class=&quot;token comment&quot;&gt;// initialize the API and start the web server when it&apos;s ready&lt;/span&gt;
api&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Could not initialize API: &apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Start up the server&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; httpServer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;port&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; host&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;API server is ready.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Listening on &apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; host &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;:&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; port&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Use the &quot;ready&quot; message to signal that the server is ready.&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// This is used by the test suite to wait for the api server&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// process to start up before sending requests.&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ready&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;tests/routes.project.js:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-js&quot;&gt;&lt;code&gt;vows&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;routes.project&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addBatch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Provides a reference to the api server child process&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&apos;Start up an API server&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    topic&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; promise &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;events&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;EventEmitter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      common&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;initTestingAppChildProc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; promise&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; promise&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    teardown&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; childProc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; callback &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;callback&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;shutdown&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        api&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;shutdown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;callback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;childProc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        childProc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;exit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;code&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sig&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;shutdown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        childProc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;kill&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;shutdown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;and get a valid project&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      topic&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; childProc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        common&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;apiGet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;api/1/project/&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;access_token&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;test&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;validEnabledReadAccessToken&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;callback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;returns 200 OK&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; common&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertStatus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;returns JSON&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; common&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertJsonContentType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;fast local response time&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; common&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertMaxResponseTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;returns a valid api response&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; common&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertValidApiResponse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;has a result key in the JSON response&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; common&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertJsonHasFields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;result&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;there&apos;s no api error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; common&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertNoApiError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;all of the deploy fields are available&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; common&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertJsonHasFields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;db&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;projectFields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token string&quot;&gt;&apos;result&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;cross-check account id with api.getAccount&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        topic&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resp&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; body&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; project &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          api&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAccount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;account_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;callback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&apos;verify the account is not null&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; account&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          assert&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isNull&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          assert&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isObject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;account&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;module&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;There is a lot happening in these tests.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We use promises to notify our test when the API server is ready.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Documentation for using promises with Vows can be found here.&lt;/li&gt;
&lt;li&gt;I’m not completely on-board with the Promise design pattern but it seemed like the easiest way
to get this working. Mostly, I needed an event to be fired when there was an error that caused
the API server process to shut down.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;We use a Vows teardown function to shut down the API server process.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We use our API library to help test our API server.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We cross-check our API server’s response by using our API library directly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We use Vows macros for reusable tests on all API requests.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We also make use of Vows contexts even though there are none in this example.&lt;/li&gt;
&lt;li&gt;Documentation for macros and contexts are here.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;gotchas&quot;&gt;&lt;a href=&quot;#gotchas&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Gotchas&lt;/h2&gt;
&lt;p&gt;Never, ever, ever throw an uncaught exception in a Vows topic. It makes debugging impossible. I’ve
wasted hours looking through my API library for a bug only to find that I had a silly bug in my
topic.&lt;/p&gt;
&lt;p&gt;Always use &lt;code&gt;export(module, {error: false})&lt;/code&gt; in your Vows batches. This option is not really described
in the Vows docs. I had to find it in the source. Basically, if you don’t have this, Vows will
inspect the first argument to each test to see if it’s an error. Vows will potentially call your
test functions with a different set of arguments depending on if the first parameter to the topic’s
callback is an Error or not. It’s completely strange and magical and &lt;a href=&quot;https://github.com/cloudhead/vows/pull/263&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;confusing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Testing without mock objects means that you need a real database which means you probably need
real-ish data to test with. This is tough. We chose to maintain a DB SQL fixture that we have to
update whenever the schema changes. It’s a bit clunky but it works. I’m open to suggestions for this
if anyone knows of a better way.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;&lt;a href=&quot;#wrapping-up&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wrapping up…&lt;/h2&gt;
&lt;p&gt;We use &lt;a href=&quot;http://circleci.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CircleCI&lt;/a&gt; to run all of these tests and are really happy with their
service. It’s fast and easy to set up. Also, it has all of the systems that our API server uses like
MySQL, Beanstalkd and Memcache pre-installed. This gets us closer to testing in a production
environment than would otherwise be possible.&lt;/p&gt;
&lt;p&gt;Hopefully you were able to glean some useful tips from our experience at &lt;a href=&quot;/&quot;&gt;Rollbar&lt;/a&gt;. We love
building tools for devs like you!&lt;/p&gt;
&lt;p&gt;Add me on Twitter &lt;a href=&quot;https://twitter.com/coryvirok&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;@coryvirok&lt;/a&gt;. Follow
&lt;a href=&quot;https://twitter.com/rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;@rollbar&lt;/a&gt; for more updates.&lt;/p&gt;
&lt;h2 id=&quot;moment-of-zen&quot;&gt;&lt;a href=&quot;#moment-of-zen&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Moment of zen&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-none&quot;&gt;&lt;code&gt;✓ OK » 497 honored (33.232s)&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;</content:encoded></item><item><title><![CDATA[May Release Roundup]]></title><description><![CDATA[Here’s a roundup of what’s new at Rollbar in the month of May. Big Features We revamped our notifications system, and added integrations…]]></description><link>https://rollbar.com/blog/may-release-roundup/</link><guid isPermaLink="false">https://rollbar.com/blog/may-release-roundup/</guid><pubDate>Wed, 29 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s a roundup of what’s new at Rollbar in the month of May.&lt;/p&gt;
&lt;h2 id=&quot;big-features&quot;&gt;&lt;a href=&quot;#big-features&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Big Features&lt;/h2&gt;
&lt;p&gt;We revamped our notifications system, and added integrations with a bunch of new services. Rollbar
now works with &lt;a href=&quot;http://asana.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Asana&lt;/a&gt;, &lt;a href=&quot;http://campfirenow.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Campfire&lt;/a&gt;,
&lt;a href=&quot;https://flowdock.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Flowdock&lt;/a&gt;, &lt;a href=&quot;https://github.com/features/projects/issues&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub Issues&lt;/a&gt;,
&lt;a href=&quot;http://hipchat.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Hipchat&lt;/a&gt;, &lt;a href=&quot;http://jira.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JIRA&lt;/a&gt;, &lt;a href=&quot;http://pivotaltracker.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Pivotal Tracker&lt;/a&gt;,
and &lt;a href=&quot;http://trello.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Trello&lt;/a&gt;, as well as any arbitrary system via a &lt;a href=&quot;http://www.webhooks.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Webhook&lt;/a&gt;.
See the &lt;a href=&quot;/blog/rules-engine-for-notifications-campfire-hipchat-jira-trello/&quot;&gt;announcement blog post&lt;/a&gt;
for more details.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;small-features&quot;&gt;&lt;a href=&quot;#small-features&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Small Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can now customize how occurrences are grouped. This first release allows you to define rules of
things that should always be grouped together. See the documentation: &lt;a href=&quot;/docs/custom-grouping/&quot;&gt;Custom Grouping Rules&lt;/a&gt;.
An in-depth post on how to use this is coming soon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There’s now a “Download CSV” link at the bottom of the Items page, which will let you download a
CSV of what you see on the page. Note that this information is also available via our &lt;a href=&quot;/docs/test_console/&quot;&gt;API&lt;/a&gt;.
![]({{ site.cdn_url }}/blog/images/2013/2013-05-29-may-release-roundup/download-csv.133485.o.png)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can now sort the Items page by Total Occurrences or Unique Users, in additon to Last
Occurrence. Click on the column headers to change the sort.
![]({{ site.cdn_url }}/blog/images/2013/2013-05-29-may-release-roundup/item-list-sort.133486.o.png)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Links to files in GitHub are now linked to the appropriate revision, when this information is
available. We’ll use one of the following (trying each in order):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the value of server.sha&lt;/li&gt;
&lt;li&gt;the value of server.branch, if it looks like a SHA&lt;/li&gt;
&lt;li&gt;the revision from the last deploy before the first occurrence of the item&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;library-updates&quot;&gt;&lt;a href=&quot;#library-updates&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Library Updates&lt;/h2&gt;
&lt;h3 id=&quot;ruby&quot;&gt;&lt;a href=&quot;#ruby&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ruby&lt;/h3&gt;
&lt;p&gt;We released &lt;a href=&quot;https://github.com/rollbar/rollbar-gem&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;rollbar-gem&lt;/a&gt; versions 0.9.11 through 0.9.14.
The changes include a fix for use with Rails 4, a concurrency bugfix, better support for JSON
requests, and the ability to include custom metadata with all reports. See the full
&lt;a href=&quot;https://github.com/rollbar/rollbar-gem/blob/master/CHANGELOG.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;changelog&lt;/a&gt; for details. To
upgrade, change the rollbar line in your Gemfile to:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-ruby&quot;&gt;&lt;code&gt;gem &lt;span class=&quot;token string&quot;&gt;&apos;rollbar&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;~&gt; 0.9.14&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;We also contributed a fix to &lt;a href=&quot;https://github.com/CrowdFlower/resque-rollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;resque-rollbar&lt;/a&gt; to
force use of synchronous mode when reporting Resque failures (instead of async mode, which doesn’t
play nicely with Resque).&lt;/p&gt;
&lt;h3 id=&quot;python&quot;&gt;&lt;a href=&quot;#python&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Python&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rollbar/pyrollbar&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;pyrollbar&lt;/a&gt; gained a feature and now at version 0.5.7.
See the &lt;a href=&quot;https://github.com/rollbar/pyrollbar/blob/master/CHANGELOG.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;
&lt;h3 id=&quot;bug-fixes&quot;&gt;&lt;a href=&quot;#bug-fixes&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bug Fixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where pressing the back button would sometimes cause Chrome to render one of our JSON
responses as if it were HTML&lt;/li&gt;
&lt;li&gt;Fixed a bug where removed email addresses could not be re-added&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;documentation-updates&quot;&gt;&lt;a href=&quot;#documentation-updates&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Documentation Updates&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added guide on how our &lt;a href=&quot;/docs/grouping-algorithm/&quot;&gt;grouping algorithm&lt;/a&gt; works.&lt;/li&gt;
&lt;li&gt;Cleaned up our &lt;a href=&quot;/docs/api/items/&quot;&gt;Items API Reference&lt;/a&gt; and fixed a few outdated parts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More is on the way. Stay tuned! And don’t forget to send us any feedback: &lt;a href=&quot;mailto:team@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;team@rollbar.com&lt;/a&gt; — we
love hearing from you.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Rules Engine for Notifications, Plus Integrations with Campfire, Hipchat, JIRA, and Trello]]></title><description><![CDATA[Today we’re revamping the model for defining what you want to be notified about from  Rollbar .
Rollbar now integrates with  Asana…]]></description><link>https://rollbar.com/blog/rules-engine-for-notifications-campfire-hipchat-jira-trello/</link><guid isPermaLink="false">https://rollbar.com/blog/rules-engine-for-notifications-campfire-hipchat-jira-trello/</guid><pubDate>Mon, 06 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today we’re revamping the model for defining what you want to be notified about from &lt;a href=&quot;/&quot;&gt;Rollbar&lt;/a&gt;.
Rollbar now integrates with &lt;a href=&quot;http://asana.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Asana&lt;/a&gt;, &lt;a href=&quot;http://campfirenow.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Campfire&lt;/a&gt;,
&lt;a href=&quot;https://flowdock.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Flowdock&lt;/a&gt;, &lt;a href=&quot;https://github.com/features/projects/issues&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub Issues&lt;/a&gt;,
&lt;a href=&quot;http://hipchat.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Hipchat&lt;/a&gt;, &lt;a href=&quot;http://jira.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;JIRA&lt;/a&gt;, &lt;a href=&quot;http://pivotaltracker.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Pivotal Tracker&lt;/a&gt;,
and &lt;a href=&quot;http://trello.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Trello&lt;/a&gt;, as well as any arbitrary system via a &lt;a href=&quot;http://www.webhooks.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Webhook&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;new-integration-channels&quot;&gt;&lt;a href=&quot;#new-integration-channels&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;New Integration Channels&lt;/h2&gt;
&lt;p&gt;In addition to our existing channels (Email, Asana, GitHub Issues, Pivotal Tracker, and Webhook),
we’re launching support for four more: Campfire, Hipchat, JIRA, and Trello. You can set up all of
this in Settings -&gt; Notifications.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2013/2013-05-06-rules-engine-for-notifications-campfire-hipchat-jira-trello/integration-channels.133487.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;notification-rules-engine&quot;&gt;&lt;a href=&quot;#notification-rules-engine&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Notification Rules Engine&lt;/h2&gt;
&lt;p&gt;Notifications are now configured per-project (instead of per-user-per-project), using a
trigger-action model. There are triggers for the following events:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New Item (first occurrence of a new issue)&lt;/li&gt;
&lt;li&gt;Reactivated Item (a previously resolved issue has occurred again)&lt;/li&gt;
&lt;li&gt;10nth Occurrence (an issue has occurred for the 10th, 100th, etc. time)&lt;/li&gt;
&lt;li&gt;Resolved Item (an item has been resolved by hand)&lt;/li&gt;
&lt;li&gt;Reopened Item (an item has been reopened by hand)&lt;/li&gt;
&lt;li&gt;Post-deploy (you’ve notified us that you deployed a new release)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Corresponding actions are available for most actions in most channels. If it would make sense, it
probably exists.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2013/2013-05-06-rules-engine-for-notifications-campfire-hipchat-jira-trello/rules-engine.133488.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Most actions can be configured as you’d expect (i.e. set which teams should receive an email, or
which user to assign JIRA issues to).&lt;/p&gt;
&lt;p&gt;Item-related triggers can be filtered by environment, level, title (exception class+message), and
filename. Deploy triggers can be filtered by environment and comment. Our underlying tech supports
much more than the UI exposes, so let us know what other filters you’d like to see.&lt;/p&gt;
&lt;h2 id=&quot;migration-for-existing-customers&quot;&gt;&lt;a href=&quot;#migration-for-existing-customers&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Migration for existing customers&lt;/h2&gt;
&lt;p&gt;We’ve migrated existing customers’ settings to the new system, but there were a few aspects that
didn’t map very well (i.e. per-user-per-project settings). We hope the new system is easier to use
for most use-cases and still workable for complex setups, but let us know if there’s something you
are having trouble doing.&lt;/p&gt;
&lt;h2 id=&quot;questions-feedback&quot;&gt;&lt;a href=&quot;#questions-feedback&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Questions? Feedback?&lt;/h2&gt;
&lt;p&gt;Let us know if you have any questions about how to get the notifications you want. We look forward
to your feedback. What other integrations do you want? Let us know in the comments, or email us at
&lt;a href=&quot;mailto:team@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;team@rollbar.com&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Taking UNIQUE indexes to the next level]]></title><description><![CDATA[You’ve probably seen unique constraints somewhere – either in Rails’
 validates :uniqueness ,
Django’s  Field.unique , or a raw
SQL  table…]]></description><link>https://rollbar.com/blog/using-unique-indexes-for-fun-and-profit/</link><guid isPermaLink="false">https://rollbar.com/blog/using-unique-indexes-for-fun-and-profit/</guid><pubDate>Fri, 29 Mar 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You’ve probably seen unique constraints somewhere – either in Rails’
&lt;a href=&quot;http://guides.rubyonrails.org/active_record_validations_callbacks.html#uniqueness&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;code&gt;validates :uniqueness&lt;/code&gt;&lt;/a&gt;,
Django’s &lt;a href=&quot;https://docs.djangoproject.com/en/dev/ref/models/fields/#unique&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;code&gt;Field.unique&lt;/code&gt;&lt;/a&gt;, or a raw
SQL &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.5/en/create-index.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;table definition&lt;/a&gt;. The basic
function of unique constraints (preventing duplicate data from being inserted) is nice, but they’re
so much more powerful than that. When you write INSERT or REPLACE statements that rely on them, you
can do some pretty cool (and efficient) things that you would’ve had to do multiple queries for
otherwise.&lt;/p&gt;
&lt;p&gt;This post covers unique indexes in MySQL 5.5. Other versions of MySQL are similar. I’m not sure
about Postgres or other relational databases but presume they’re similar-ish as well.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;primer-what-is-a-unique-index&quot;&gt;&lt;a href=&quot;#primer-what-is-a-unique-index&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Primer: what is a unique index?&lt;/h2&gt;
&lt;p&gt;Pre-primer: data in a database is stored on disk somewhere. In a SQL database, the data is organized
into tables which have rows and columns. An index is a way to look up particular rows, based on the
values of one or more columns, without having to scan through the whole table. Instead, you look up
those values in the index, which tells you where to find the matching rows.&lt;/p&gt;
&lt;p&gt;Index lookups are typically faster than full table scans because they’re organized for fast searches
on the indexed columns (usually using binary trees), and they’re also generally smaller than the
original data.&lt;/p&gt;
&lt;p&gt;A unique index is an index that also imposes a constraint: that no two entries in the index can have
the same values. It can be comprised of one column or many columns. If many columns, then the entire
tuple of columns is used for determining uniqueness. There can be other columns in the table that
are not part of the index; these don’t affect the constraint.&lt;/p&gt;
&lt;p&gt;Primary keys are a special case of unique index; we’ll cover this in more detail later.&lt;/p&gt;
&lt;p&gt;Unique indexes can be created in a &lt;code&gt;CREATE TABLE&lt;/code&gt; statement like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  username &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  password char&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;unique&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;username&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;or using an &lt;code&gt;ALTER TABLE&lt;/code&gt; statement like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; users &lt;span class=&quot;token keyword&quot;&gt;ADD&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;unique&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;username&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h3 id=&quot;what-does-a-unique-constraint-affect&quot;&gt;&lt;a href=&quot;#what-does-a-unique-constraint-affect&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What does a unique constraint affect?&lt;/h3&gt;
&lt;p&gt;A unique constraint prevents you from changing your data in a way that would result in having
duplicate data in the index. For example, given the above &lt;code&gt;user&lt;/code&gt; table, the following will happen if
we try to insert duplicate data:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;mysql&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;brian&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; PASSWORD&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;asdf&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
Query OK&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;row&lt;/span&gt; affected&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; warning &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.04&lt;/span&gt; sec&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

mysql&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;brian&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; PASSWORD&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;asdfjkl&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
ERROR &lt;span class=&quot;token number&quot;&gt;1062&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;23000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: Duplicate entry &lt;span class=&quot;token string&quot;&gt;&apos;brian&apos;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;username&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;or if we try to get duplicate data with an update:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;mysql&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;sherlock&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; PASSWORD&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;123456&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
Query OK&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;row&lt;/span&gt; affected&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; warning &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.00&lt;/span&gt; sec&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

mysql&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; username &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;brian&apos;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; username &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;sherlock&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
ERROR &lt;span class=&quot;token number&quot;&gt;1062&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;23000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: Duplicate entry &lt;span class=&quot;token string&quot;&gt;&apos;brian&apos;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;username&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;So we can see that unique indexes are a great way to maintain consistency of our data at the
database level. If two people try to sign up with the same username, for example, the database will
reject it and return a duplicate key error.&lt;/p&gt;
&lt;h2 id=&quot;taking-it-to-the-next-level&quot;&gt;&lt;a href=&quot;#taking-it-to-the-next-level&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Taking it to the next level&lt;/h2&gt;
&lt;p&gt;MySQL provides several commands, all variations of &lt;code&gt;INSERT&lt;/code&gt;, that can take advantage of unique
indexes by specifying what to do (instead of erroring) when the insert would result in a duplicate.
These are best illustrated by example.&lt;/p&gt;
&lt;h3 id=&quot;insert--on-duplicate-key-update&quot;&gt;&lt;a href=&quot;#insert--on-duplicate-key-update&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;INSERT … ON DUPLICATE KEY UPDATE&lt;/h3&gt;
&lt;p&gt;Let’s say we’re building a simple ad impression tracking system. Ads are served by web servers and
the impression counts are tracked in a database. We just want to know the number of ad impressions
each hour. So we make a table like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; hour_impression &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  hour &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; unsigned &lt;span class=&quot;token operator&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;-- number of hours since unix epoch&lt;/span&gt;
  impressions &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; unsigned &lt;span class=&quot;token operator&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;primary&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hour&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Side note: here we’re using &lt;code&gt;hour&lt;/code&gt; as the primary key, rather than having an auto-increment primary
key like before in the &lt;code&gt;user&lt;/code&gt; table. This guarantees that &lt;code&gt;hour&lt;/code&gt; is unique (since primary keys are a
subset of unique keys), and has a nice property of laying out the data on disk in hour-order.&lt;/p&gt;
&lt;p&gt;A naive algorithm for recording each impression would be to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Check if a row already exists for the hour&lt;/li&gt;
&lt;li&gt;If not: &lt;code&gt;INSERT INTO hour_impression (hour, impressions) VALUES (:hour, 1)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If so: &lt;code&gt;UPDATE hour_impression SET impressions = impressions + 1 WHERE hour = :hour&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But this exposes a race condition: what happens if two impressions happen at approximately the same
time, on two different web servers? It’s possible that both will try to &lt;code&gt;INSERT&lt;/code&gt;, and the second one
is going to fail (because of the unique constraint).&lt;/p&gt;
&lt;p&gt;What we want to do is combine the above algorithm into a single step. This is what &lt;code&gt;INSERT … ON DUPLICATE KEY UPDATE&lt;/code&gt; is for:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; hour_impression &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hour&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;379015&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DUPLICATE KEY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; impressions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; impressions &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Now that it’s a single step, we can run as many of these statements in parallel as we want, and the
database will take care of the concurrency issues for us. Sweet!&lt;/p&gt;
&lt;h3 id=&quot;insert-ignore&quot;&gt;&lt;a href=&quot;#insert-ignore&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;INSERT IGNORE&lt;/h3&gt;
&lt;p&gt;Now let’s say instead of counting the number of impressions in each hour, we just want to know which
minutes any impressions at all were shown. So we create a table like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; minute_impression &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  minute &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; unsigned &lt;span class=&quot;token operator&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;-- number of minutes since the unix epoch&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;primary&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;minute&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Similar to before, a naive algorithm for recording which minutes had any impressions would be to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Check if a row already exists for the minute&lt;/li&gt;
&lt;li&gt;If so, do nothing&lt;/li&gt;
&lt;li&gt;If not, &lt;code&gt;INSERT INTO minute_impression (minute) VALUES (:minute)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This has the same kind of race condition as in the previous example. &lt;code&gt;INSERT IGNORE&lt;/code&gt; exists to
combine all of this into a single step:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;IGNORE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; minute_impression &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;minute&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;22740922&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;And as before, now we can run as many of these in parallel as we want and let the database take care
of the concurrency.&lt;/p&gt;
&lt;h2 id=&quot;more-tricks&quot;&gt;&lt;a href=&quot;#more-tricks&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;More tricks&lt;/h2&gt;
&lt;h3 id=&quot;replace&quot;&gt;&lt;a href=&quot;#replace&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;REPLACE&lt;/h3&gt;
&lt;p&gt;The opposite of &lt;code&gt;INSERT IGNORE&lt;/code&gt;. Overwrites matching rows with the new data instead of discarding it.&lt;/p&gt;
&lt;h3 id=&quot;nullable-unique-indexes&quot;&gt;&lt;a href=&quot;#nullable-unique-indexes&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Nullable unique indexes&lt;/h3&gt;
&lt;p&gt;Values in a unique index have to be unique, but there’s an exception: NULLs don’t count. For
example, let’s say you let people pick their username after signup. You might have table like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  id &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; unsigned &lt;span class=&quot;token operator&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;auto_increment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  username &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;unique&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;username&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;primary&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;You can have as many users as you like who haven’t chosen a username (it’ll be NULL) while still
preventing multiple users from having the same username.&lt;/p&gt;
&lt;h3 id=&quot;values-in-the-on-duplicate-key-update-clause&quot;&gt;&lt;a href=&quot;#values-in-the-on-duplicate-key-update-clause&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;VALUES() in the ON DUPLICATE KEY UPDATE clause&lt;/h3&gt;
&lt;p&gt;You can insert multiple rows in a single &lt;code&gt;INSERT … ON DUPLICATE KEY UPDATE&lt;/code&gt; statement, and the &lt;code&gt;UPDATE&lt;/code&gt;
rule will apply for each row that would’ve been a duplicate. In some cases you’ll want the update
statement to reflect the values of each particular row, and that’s not possible to do by hardcoding
them in the statement.&lt;/p&gt;
&lt;p&gt;For example, let’s return to the ad impression tracking problem from before, with this hour_impression table:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; hour_impression &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  hour &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; unsigned &lt;span class=&quot;token operator&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;-- number of hours since unix epoch&lt;/span&gt;
  impressions &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; unsigned &lt;span class=&quot;token operator&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;primary&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hour&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;But now instead of recording impressions one at a time, we’re batching them so that each &lt;code&gt;INSERT&lt;/code&gt;
increments impressions by a value 1 or higher. If we insert one of these batches at a time, we can
do:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; hour_impression &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hour&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;379015&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;-- 23 impressions during 12am 3/28/2013&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DUPLICATE KEY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt;
impressions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; impressions &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;If we want to insert multiple rows in the same statement, there’s a problem – the amount in the
&lt;code&gt;UPDATE&lt;/code&gt; clause is hardcoded. We can fix this using &lt;code&gt;VALUES()&lt;/code&gt; to reference the value from the
would-have-been-inserted row:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; hour_impression &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hour&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;379015&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;379015&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;55&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DUPLICATE KEY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt;
impressions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; impressions &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Unique indexes are useful when used alone and become incredibly powerful when used in combination
with &lt;code&gt;INSERT … ON DUPLICATE KEY UPDATE&lt;/code&gt; and its variants. We make heavy use of this at Rollbar and
it works great.&lt;/p&gt;
&lt;p&gt;Questions? Corrections? Let me know in the comments.&lt;/p&gt;
&lt;p&gt;References&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;INSERT … ON DUPLICATE KEY UPDATE syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/insert.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;INSERT IGNORE syntax&lt;/a&gt; (ctrl+f on the page)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/replace.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;REPLACE syntax&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Improved grouping for Javascript errors]]></title><description><![CDATA[We’ve released an updated to how Javascript errors are grouped in Rollbar. The new update does a
better job of separating different errors…]]></description><link>https://rollbar.com/blog/improved-grouping-for-javascript-errors/</link><guid isPermaLink="false">https://rollbar.com/blog/improved-grouping-for-javascript-errors/</guid><pubDate>Thu, 21 Mar 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’ve released an updated to how Javascript errors are grouped in Rollbar. The new update does a
better job of separating different errors into different groups (“Items” in Rollbar parlance) while
still recognizing the same issue in different browsers as the same. It’s now enabled for all new
projects. Existing projects can enable it on the Migrations tab in Settings.&lt;/p&gt;
&lt;p&gt;Now the longer version…&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;First some background: by default, exceptions in Rollbar are grouped using their stack traces. We
take all of the filenames and method names in all of the stack frames, plus the exception class
name, apply a number of heuristics to normalize them, and then combine everything together and take
a sha1 hash. The result is a 40-character string used as the “fingerprint”; occurrences with
matching fingerprints that also have the same project, environment, and platform are grouped
together. The fingerprint can also be &lt;a href=&quot;/docs/api/items/&quot;&gt;overridden at the API level&lt;/a&gt; for custom
grouping.&lt;/p&gt;
&lt;p&gt;This generally works pretty well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Omitting the line numbers from stack frames means groups persist across code changes elsewhere in the file.&lt;/li&gt;
&lt;li&gt;Using the whole stack trace, instead of just the very last frame, avoids conflating unrelated
issues that happen to cause an exception on the same line of code.&lt;/li&gt;
&lt;li&gt;Using just the exception class, instead of also the message, avoids including data in the
fingerprint, and when we have a nice, long stack trace, that’s usually enough uniqueness.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Javascript uncaught errors are a different story though. They’re reported through
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/DOM/window.onerror&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;window.onerror&lt;/a&gt;, which luckily is
supported in all major browsers but doesn’t provide a lot of context: only the error message,
filename, and line number. The Rollbar &lt;a href=&quot;https://rollbar.com/docs/items_js/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;javascript library&lt;/a&gt;
converts this into a stack trace with a single frame (using the filename and line number), and
parses the error message to get a semblance of class and message.&lt;/p&gt;
&lt;p&gt;The problem with this approach has been that since the grouping algorithm only uses filenames (not
line numbers), there’s only one stack frame, since it only uses the exception class name (not
message), there isn’t a whole lot of uniqueness. The updated algorithm improves this dramatically.
Here’s how it works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;There aren’t that many different kinds of Javascript errors. We’ve built up a database of the
error messages generated by all of them, in all major browsers.&lt;/li&gt;
&lt;li&gt;When we process an error, we try to match it against the patterns we know about. Several of the
patterns have data in them; for some of the patterns, we keep the data (i.e. if it’s a variable
name), and in others we discard it (i.e. if it’s an out-of-range precision value).&lt;/li&gt;
&lt;li&gt;If we aren’t able to match any of the known patterns, we fall back to the old algorithm.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We’ve been using this internally for the past couple weeks and so far it feels much better. A
caveat: our pattern database currently is English-only, so errors from end-users with their language
preferences set otherwise will be grouped using the old algorithm.&lt;/p&gt;
&lt;p&gt;The new algorithm is now enabled for all newly-created projects. We aren’t automatically turning it
on for old projects because none of the new groups will map to old groups; this will be a one-time
event but could result in a lot of notifications and we don’t want to force the change. To enable it
for an existing project, find the Migrations tab in the Settings for your project, and check the box
next to “Browser JS Occurrence Grouping V2”.&lt;/p&gt;
&lt;p&gt;Any questions? Let us know in the comments.&lt;/p&gt;
&lt;p&gt;Rollbar collects and analyzes errors so you can find and fix them faster.
&lt;a href=&quot;/signup/&quot;&gt;Create a free account&lt;/a&gt; to get started today.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Launch and initial funding]]></title><description><![CDATA[Today we’re excited to announce the public launch of Rollbar. Rollbar tracks and analyzes errors in
production applications, helping dev and…]]></description><link>https://rollbar.com/blog/rollbar-launch-and-initial-funding/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-launch-and-initial-funding/</guid><pubDate>Tue, 26 Feb 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today we’re excited to announce the public launch of Rollbar. Rollbar tracks and analyzes errors in
production applications, helping dev and ops teams diagnose and fix them.&lt;/p&gt;
&lt;h2 id=&quot;platform-agnostic-api&quot;&gt;&lt;a href=&quot;#platform-agnostic-api&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Platform-agnostic API&lt;/h2&gt;
&lt;p&gt;Anything that can speak JSON and HTTP can talk to Rollbar. Our API accepts raw “items” (errors,
exceptions, and log messages) and deploys as inputs, and aggregated items, occurrences, and deploys
as outputs. We provide official libraries for Ruby, Python, PHP, Node.js, Javascript, and Flash; or
you can &lt;a href=&quot;/docs/api/items/&quot;&gt;roll your own&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;severity-levels&quot;&gt;&lt;a href=&quot;#severity-levels&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Severity levels&lt;/h2&gt;
&lt;p&gt;Just because something raises an exception, doesn’t mean it should be treated as an “error”. Rollbar
lets you utilize five severity levels (from “debug” to “critical”) to control visibility and
notifications. Severity can be set in your code, or after-the-fact in the Rollbar interface.&lt;/p&gt;
&lt;h2 id=&quot;track-users-through-your-stack&quot;&gt;&lt;a href=&quot;#track-users-through-your-stack&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Track users through your stack&lt;/h2&gt;
&lt;p&gt;Person tracking helps you provide great customer support by emailing affected users when you fix an
error they hit. Or see the history for a particular user and link customer error reports to code
problems, client- and server-side.&lt;/p&gt;
&lt;h2 id=&quot;so-much-more&quot;&gt;&lt;a href=&quot;#so-much-more&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;So much more&lt;/h2&gt;
&lt;p&gt;API endpoints on 3 continents. Resolving and reactivations. Real-time notifications for new issues.
Graphs everywhere. Deploy tracking. Search by title, host, file, context, date, severity, status.
Replay an issue by pressing a button. SSL everywhere. GitHub, Asana, and Pivotal Tracker
integration.&lt;/p&gt;
&lt;p&gt;We’ve built many of the pieces our beta customers have needed, and we really think you’re going to
like it. &lt;a href=&quot;/signup/&quot;&gt;Start a free trial now&lt;/a&gt;, or see &lt;a href=&quot;/pricing/&quot;&gt;pricing&lt;/a&gt;, &lt;a href=&quot;/features/&quot;&gt;features&lt;/a&gt;,
or &lt;a href=&quot;/docs/&quot;&gt;docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;more-firepower&quot;&gt;&lt;a href=&quot;#more-firepower&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;More firepower&lt;/h2&gt;
&lt;p&gt;We’re also excited to announce that we’ve raised an initial round of funding from some of the
smartest people in the business. Mike Hirshland (Resolute.vc), Hiten Shah (KISSmetrics), and Arjun
Sethi participated in the round. This funding gives us some extra firepower to grow the team and
bring our vision to life.&lt;/p&gt;
&lt;p&gt;We’re really excited and can’t wait to keep making Rollbar better!&lt;/p&gt;
&lt;p&gt;Brian, Cory, and Sergei&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Upgrading to the new Rollbar notifier libraries]]></title><description><![CDATA[We’ve updated all of our notifier library repositories to match the name change to Rollbar today.
The old Ratchet.io repos have been…]]></description><link>https://rollbar.com/blog/rollbar-notifier-upgrades/</link><guid isPermaLink="false">https://rollbar.com/blog/rollbar-notifier-upgrades/</guid><pubDate>Tue, 26 Feb 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’ve updated all of our notifier library repositories to match the name change to Rollbar today.
The old Ratchet.io repos have been deprecated and all further development will continue on the
respective Rollbar versions.&lt;/p&gt;
&lt;p&gt;Please note that the &lt;code&gt;submit.ratchet.io&lt;/code&gt; endpoint and the existing libraries will continue to work
for the indefinite future, so you don’t have to do anything right now. But we do recommend upgrading
to take advantage of future updates.&lt;/p&gt;
&lt;p&gt;Upgrading should be seamless and quick. Please contact &lt;a href=&quot;mailto:support@rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;support@rollbar.com&lt;/a&gt; if you run into any
issues.&lt;/p&gt;
&lt;p&gt;Here are links to the upgrade instructions for each:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Browser JS - update the JS snippet used on your site to the version shown &lt;a href=&quot;/docs/&quot;&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rollbar/pyrollbar/blob/master/UPGRADE_FROM_RATCHET.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;pyratchet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar-gem/blob/master/UPGRADE_FROM_RATCHET.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;ratchetio-gem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar-php/blob/master/UPGRADE_FROM_RATCHET.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;ratchetio-php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rollbar/rollbar-agent/blob/master/UPGRADE_FROM_RATCHET.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;ratchet-agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rollbar/node_rollbar/blob/master/UPGRADE_FROM_RATCHET.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;node_ratchet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rollbar/flash_rollbar/blob/master/UPGRADE_FROM_RATCHET.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;flash_ratchet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Post-mortem from last night's outage]]></title><description><![CDATA[tl;dr: from about 9:30pm to 12:30am last night, our website was unreachable and we weren’t sending
out any notifications. Our API stayed up…]]></description><link>https://rollbar.com/blog/post-mortem-from-last-nights-outage/</link><guid isPermaLink="false">https://rollbar.com/blog/post-mortem-from-last-nights-outage/</guid><pubDate>Fri, 11 Jan 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;tl;dr: from about 9:30pm to 12:30am last night, our website was unreachable and we weren’t sending
out any notifications. Our API stayed up nearly the whole time thanks to an automatic failover.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We had our first major outage last night. We want to apologize to all of our customers for this
outage, and we’re going to continue to work to make the &lt;a href=&quot;/&quot;&gt;Rollbar.com&lt;/a&gt; service stable, reliable,
and performant.&lt;/p&gt;
&lt;p&gt;What follows is a timeline of events, and a summary of what went wrong, what went right, and what
we’re doing to address what went wrong.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a href=&quot;#background&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Background&lt;/h2&gt;
&lt;p&gt;First some background: our infrastructure is currently hosted at Softlayer and layed out like this
(simplified):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2013/2013-01-11-post-mortem-from-last-nights-outage/infrastructurediagram.133489.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;That is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;our primary cluster of servers is in San Jose&lt;/li&gt;
&lt;li&gt;all web traffic (rollbar.com / www.rollbar.com) is handled by lb2&lt;/li&gt;
&lt;li&gt;all API traffic (api.rollbar.com) is handled by lb1&lt;/li&gt;
&lt;li&gt;lb3 (in Singapore) and lb4 (Amsterdam) are ready to go but not in use yet (more on this below),
providing failover and faster API response times to customers outside of the Americas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’ve been in the process of setting up lb3 and lb4, along with some
&lt;a href=&quot;http://dyn.com/dns/dynect-managed-dns/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;fancy DNS functionality&lt;/a&gt; from Dyn, to provide redundancy
and faster response times to our customers outside of the Americas. Each is running a stripped-down
version of our infrastructure, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a frontend web server (nginx)&lt;/li&gt;
&lt;li&gt;two instsances of our node.js API server&lt;/li&gt;
&lt;li&gt;a partial database slave (for validating access tokens)&lt;/li&gt;
&lt;li&gt;our offline loading process (soon to be open-sourced!), for doing async writes to the active
master database.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Switching DNS to Dyn requires changing the nameservers, which can take “up to 48 hours”. At the
start of this story, it’s been about 36 hours. To play it safe, after testing out Dyn on a separate
domain, we configured it to have the same settings as we had before – lb3 and lb4 are not in play
yet.&lt;/p&gt;
&lt;h2 id=&quot;timeline&quot;&gt;&lt;a href=&quot;#timeline&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Timeline&lt;/h2&gt;
&lt;p&gt;Now the (abbreviated) timeline. All times are PST.&lt;/p&gt;
&lt;p&gt;9:30pm: Cory got an alert from Pingdom that our website (rollbar.com) was down. He tried visiting it
but it wouldn’t load (just hung). Remembering the pending DNS change, he immediately checked DNS
propagation and saw that rollbar.com was pointing at the wrong load balancer – lb1 (the API tier),
not lb2.&lt;/p&gt;
&lt;p&gt;Cory and Sergei investigated. The A record for rollbar.com showed as correct in Dyn, but DNS was
resolving incorrectly.&lt;/p&gt;
&lt;p&gt;9:47pm: Cory and Sergei looked at &lt;a href=&quot;http://twitter.com/SoftlayerNotify&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;@SoftlayerNotify&lt;/a&gt; and saw
that there was an issue underway with one of the routers in the San Jose data center.&lt;/p&gt;
&lt;p&gt;9:49pm: Website accessible by its IP address.&lt;/p&gt;
&lt;p&gt;9:51pm: No longer accessible by IP.&lt;/p&gt;
&lt;p&gt;10:05pm: Twitter search for “softlayer outage” shows other people being affected.&lt;/p&gt;
&lt;p&gt;10:05pm: API tier (api.rollbar.com) appears to be working. Sergei verifies that it’s hitting lb3 (in
Singapore).&lt;/p&gt;
&lt;p&gt;You might notice that we said before that lb3 wasn’t supposed to be in service yet. What appeared to
have happened DNS had automatically failed over to lb3 (since lb1 was down because of the Softlayer
outage). We had set something like this up before when testing out Dyn, but it wasn’t supposed to be
active yet. Fortunately, lb3 was ready to go and handled all of our API load just fine.&lt;/p&gt;
&lt;p&gt;10:22pm: Sergei tries fiddling with the Dyn configuration to see if anything helps.&lt;/p&gt;
&lt;p&gt;10:35pm: Sergei starts trying to get ahold Dyn&lt;/p&gt;
&lt;p&gt;10:58pm: Softlayer posts that “13 out of 14 rows of servers are online”. We must be in the 14th,
because we’re still unreachable at this point. Brian tries hard-rebooting the ‘dev’ server to see if
it helps. It doesn’t.&lt;/p&gt;
&lt;p&gt;11:15pm: Sergei gets a call from Dyn, who tells him that the problem was a “stale Real-Time Traffic
Manager configuration” and they’re looking into it.&lt;/p&gt;
&lt;p&gt;11:54pm: @SoftlayerNotify posts that “all servers are online however some intermittent problems
remain”&lt;/p&gt;
&lt;p&gt;11:55pm: Sergei notices that the A record for rollbar.com in the Dyn interface appears to have been
deleted, and he can’t add it back.&lt;/p&gt;
&lt;p&gt;12:00am: Brian sees that rollbar.com is working again. Cory notices that API calls are hitting lb2,
causing them to hit the old, non-optimized API handling code on our web tier, overloading them and
causing the website to hang. Frequent process restarts minimize the impact.&lt;/p&gt;
&lt;p&gt;12:19am: Sergei gets an email back from Dyn saying that they’re still looking into the problem.&lt;/p&gt;
&lt;p&gt;12:28am: Dyn calls to say they were able to fix everything. Sergei confirms. lb3 and lb4 are now
fully utilized.&lt;/p&gt;
&lt;p&gt;12:42am: Brian tweets that all systems are stable.&lt;/p&gt;
&lt;p&gt;2:58am: Softlayer tweets that they’re about to run some code upgrades on the troubled router, which
will cause some public network disruption.&lt;/p&gt;
&lt;p&gt;4:00am:- A customer reports connectivity issues to rollbar.com&lt;/p&gt;
&lt;p&gt;4:10am: Softlayer tweets that the troubled router is finally stable.&lt;/p&gt;
&lt;h2 id=&quot;so-what-happened-here&quot;&gt;&lt;a href=&quot;#so-what-happened-here&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;So what happened here?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Softlayer experienced a network outage, causing our servers in San Jose to be intermittently,
then fully, unreachable&lt;/li&gt;
&lt;li&gt;This triggered a DNS failover controlled by a stale Dyn configuration, which cascaded into a
broken set of DNS records&lt;/li&gt;
&lt;li&gt;After about 3 hours, our San Jose servers came back online, and about 30 minutes after that, the
DNS issue was resolved.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;what-went-right&quot;&gt;&lt;a href=&quot;#what-went-right&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What went right&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;We were notified of the problem by our backup monitoring service, Pingdom. (We’re using Nagios as
our primary, but it runs inside of San Jose.)&lt;/li&gt;
&lt;li&gt;Dyn’s DNS failover did work, even though wasn’t really supposed to be turned on. Our logs don’t
show any large gaps in customer data being received.&lt;/li&gt;
&lt;li&gt;A single machine (lb3) was able to handle all of our API traffic during the outage.&lt;/li&gt;
&lt;li&gt;The API tier was able to handle a master-offline situation.&lt;/li&gt;
&lt;li&gt;When San Jose came back online, data processing quickly caught up, notifications were sent, and
the system was stable.&lt;/li&gt;
&lt;li&gt;Our team came together, stayed mostly calm, and did everything we reasonably could to restore
service as quickly as possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a bonus, our Singapore and Amsterdam servers are
&lt;a href=&quot;http://www.whatsmydns.net/#A/api.rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;now in service&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-went-wrong&quot;&gt;&lt;a href=&quot;#what-went-wrong&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What went wrong&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Parts of our service were unusable for a long period of time&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Notifications for new errors, etc. weren’t sent&lt;/li&gt;
&lt;li&gt;The web app didn’t load, and there was no maintenance page.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://status.rollbar.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;status.rollbar.com&lt;/a&gt; didn’t show useful information&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Even though the Softlayer private network was at least partially accessible, we couldn’t access it
because we only had one way in (‘dev’, in San Jose).&lt;/li&gt;
&lt;li&gt;The web tier got crushed trying to handle the API load with its old code.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;action-items&quot;&gt;&lt;a href=&quot;#action-items&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Action items&lt;/h2&gt;
&lt;p&gt;In the short term (most of this will get done today):&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1b.&lt;/em&gt; Set up a web server in a separate datacenter to serve a maintenance page.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1c.&lt;/em&gt; Add meta-level checks to status.rollbar.com. It currently gets data pushed from Nagios, but
this isn’t helpful when San Jose is entirely unreachable.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;2.&lt;/em&gt; Add another ‘dev’-like machine that we can use to administer servers, deploy code, etc. if San
Jose is unreachable&lt;/p&gt;
&lt;p&gt;&lt;em&gt;3.&lt;/em&gt; Remove that old code, and make it an error if any API traffic hits the web tier.&lt;/p&gt;
&lt;p&gt;And longer term:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1a.&lt;/em&gt; Add a host master standby in another datacenter for fast failover. If an episode like last
night’s happens again, this will let us get notifications back online in a few minutes instead
of a few hours.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1b.&lt;/em&gt; Set up a read-only web tier in another datacenter&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We hope this was, if nothing else, an interesting look into our infrastructure, and to the journey
of building a highly-available we service.&lt;/p&gt;
&lt;p&gt;If you have any questions about the outage or otherwise, let us know in the comments or email us at
support@rollbar.com&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Happy Halloween]]></title><description><![CDATA[Y U No Use Rollbar? asdf – Happy Halloween from  Rollbar.com ! If you don’t have an account yet,  sign up here for early access .]]></description><link>https://rollbar.com/blog/happy-halloween/</link><guid isPermaLink="false">https://rollbar.com/blog/happy-halloween/</guid><pubDate>Wed, 31 Oct 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;y-u-no-use-rollbar&quot;&gt;&lt;a href=&quot;#y-u-no-use-rollbar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Y U No Use Rollbar?&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2012/2012-10-31-happy-halloween/halloween-2012.133490.o.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;asdf&lt;/p&gt;
&lt;p&gt;– Happy Halloween from &lt;a href=&quot;/&quot;&gt;Rollbar.com&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;If you don’t have an account yet, &lt;a href=&quot;/signup/&quot;&gt;sign up here for early access&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Real-time Search for Exceptions and Errors]]></title><description><![CDATA[We’re happy today to announce the release of real-time search. You can now search your exceptions,
errors, and log messages by title: For…]]></description><link>https://rollbar.com/blog/real-time-search-for-exceptions-and-errors/</link><guid isPermaLink="false">https://rollbar.com/blog/real-time-search-for-exceptions-and-errors/</guid><pubDate>Wed, 24 Oct 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’re happy today to announce the release of real-time search. You can now search your exceptions,
errors, and log messages by title:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.rollbar.com/assets/blog/images/2012/2012-10-24-real-time-search-for-exceptions-and-errors/realtimesearch1.133491.o.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;For exceptions, the title contains the exception class and message. For errors and log messages, it
contains the entire message. It’s a full-text search that works best on whole words; we also do a
few tricks with camelCase and underscore_separated terms.&lt;/p&gt;
&lt;p&gt;The search index is kept up-to-date in real-time as new items are added to the system (that’s the
“real-time” part). Typically the delay is ~2 seconds from receiving the input at our API to being in
the index and searchable.&lt;/p&gt;
&lt;p&gt;Current customers can try it out now; let us know if you run into any issues. What else would you
like to see indexed?&lt;/p&gt;
&lt;p&gt;If you don’t have an account yet, &lt;a href=&quot;/signup/&quot;&gt;sign up here for early access&lt;/a&gt;.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id=&quot;under-the-hood&quot;&gt;&lt;a href=&quot;#under-the-hood&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Under the hood&lt;/h2&gt;
&lt;p&gt;We’re using the new &lt;a href=&quot;http://sphinxsearch.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Sphinx&lt;/a&gt; realtime features for indexing and querying.
It’s currently running on a single dedicated machine (1 core, 2GB ram, 100GB local disk).&lt;/p&gt;
&lt;p&gt;New items are indexed by a long-running script that indexes new items as they are inserted. (It
keeps track of its location in the table and polls every second for new rows.) The index includes
two full-text fields, title and environment, and two scalar attributes, status and level.&lt;/p&gt;
&lt;p&gt;Title and environment don’t change, so we don’t need to update them. But status (active/resolved)
and level (critical/error/warning/info/debug) do. We keep these in sync by simply writing to the
search server whenever we update the primary database and whenever we modify our tokenizing
algorithm.&lt;/p&gt;
&lt;p&gt;Queries are routed through our API server, which returns the paged list of matching item ids that we
can then use to filter with on our primary database, (in case the search results are out of date)
and fetch the other data necessary for the results page (last occurrence, etc.)&lt;/p&gt;
&lt;p&gt;Although our setup is straightforward, there were a few gotchas and lessons learned.&lt;/p&gt;
&lt;h3 id=&quot;infix-queries&quot;&gt;&lt;a href=&quot;#infix-queries&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Infix queries&lt;/h3&gt;
&lt;p&gt;Sphinx’s realtime index does not currently support infix queries. That means that if you’re
searching for “Error” then exceptions with titles like “ReferenceError” or “not&lt;em&gt;found&lt;/em&gt;error” or even
“(Error)” would not be found. To get around this, we index both the original title as well as
another set of tokens that we’ve determined are useful for the lookup.&lt;/p&gt;
&lt;p&gt;e.g. “#462 UnicodeEncodeError: ‘latin-1’ codec can’t encode character u’\u0441’ in position 71:
ordinal not in range(256)”&lt;/p&gt;
&lt;p&gt;gets tokenized and becomes&lt;/p&gt;
&lt;p&gt;“#462 UnicodeEncodeError: ‘latin-1’ codec can’t encode character u’\u0441’ in position 71: ordinal
not in range(256) can’t u0441 71 256 Unicode Encode Error latin-1’”&lt;/p&gt;
&lt;p&gt;By tacking on these extra tokens, we are able to support most of the relevant infix searches our
users are likely to make.&lt;/p&gt;
&lt;h3 id=&quot;sphinx--mysql&quot;&gt;&lt;a href=&quot;#sphinx--mysql&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sphinx + MySQL&lt;/h3&gt;
&lt;p&gt;Sphinx search comes with a super-handy feature that lets you connect, add and query the search index
using a vanilla MySQL protocol. This is great for debugging and testing but comes with some caveats.&lt;/p&gt;
&lt;p&gt;There are a lot of operations that SphinxQL does not yet support. One of the major ones is the lack
of support for “OR” where_conditions and another is lack of a “COUNT(*)” method.&lt;/p&gt;
&lt;p&gt;Since our API server is written in node, we were able to use the
&lt;a href=&quot;https://github.com/felixge/node-mysql&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;node-mysql&lt;/a&gt; library from Felix Geisendörfer. After plugging
in the library, we noticed that the Sphinx server drops client connections fairly rigorously so we
implemented a layer on top of the node-mysql library to handle reconnects, disconnects, etc… This
has been great since it lets us perform maintenance on the Sphinx server without taking down our API
server.&lt;/p&gt;
&lt;h3 id=&quot;replace&quot;&gt;&lt;a href=&quot;#replace&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;REPLACE&lt;/h3&gt;
&lt;p&gt;Lastly, we made sure that we were able to re-index our entire database into our Sphinx server by
only using the REPLACE command when inserting new items. The docs mention that this can cause memory
issues but since it’s so infrequent for our use-case, we haven’t run into any trouble and the
benefit of re-indexing whenever we want more than makes up for it.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Using a Request Factory in Pyramid to write a little less code]]></title><description><![CDATA[At  Rollbar.com , we’ve been using  Pyramid  as our web framework
and have been pretty happy with it. It’s lightweight and mostly stays out…]]></description><link>https://rollbar.com/blog/using-pyramid-request-factory-to-write-less-code/</link><guid isPermaLink="false">https://rollbar.com/blog/using-pyramid-request-factory-to-write-less-code/</guid><pubDate>Fri, 07 Sep 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At &lt;a href=&quot;/&quot;&gt;Rollbar.com&lt;/a&gt;, we’ve been using &lt;a href=&quot;http://www.pylonsproject.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Pyramid&lt;/a&gt; as our web framework
and have been pretty happy with it. It’s lightweight and mostly stays out of our way.&lt;/p&gt;
&lt;p&gt;Pyramid doesn’t have a global request object that you can just import[1], so it makes you pass
around request wherever you need it. That results in a lot of library code that looks like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-py&quot;&gt;&lt;code&gt;# lib/helpers.py
def flash_success(request, body, title=&apos;&apos;):
    request.session.flash({&apos;body&apos;: body, &apos;title&apos;: title&apos;})&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;and a lot of view code that looks like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-py&quot;&gt;&lt;code&gt;# views/auth.py
@view_config(route_name=&apos;auth/login&apos;)
def login(request):
    # (do the login...)
    helpers.flash_success(request, &quot;You&apos;re now logged in.&quot;)
    # (redirect...)&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;That is, there ends up being a lot of function calls that pass &lt;code&gt;request&lt;/code&gt; as their first argument.
Wouldn’t it be nicer if we could attach these functions as methods on &lt;code&gt;request&lt;/code&gt; itself? That would
save a few characters every time we call them, and let us stop thinking about whether &lt;code&gt;request&lt;/code&gt; is
the first or last argument. Pyramid facilitates this by letting us provide our own
&lt;a href=&quot;http://pyramid.readthedocs.org/en/latest/narr/hooks.html#changing-the-request-factory&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Request Factory&lt;/a&gt;:&lt;/p&gt;
&lt;!--more--&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-py&quot;&gt;&lt;code&gt;from pyramid.request import Request

class MyRequest(Request):
    def hello(self):
        print &quot;hello!&quot;

def main(global_config, **settings):
    config = Configurator(settings=settings, request_factory=MyRequest)
    # ...&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Now the &lt;code&gt;request&lt;/code&gt; passed to our view methods, and everywhere else in our app, has our &lt;code&gt;hello&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;So, what can we do with this that’s actually useful? In our codebase, we have a few convenience
methods to get data about the logged-in user, flash messages, and check if features are enabled.&lt;/p&gt;
&lt;p&gt;Here it is, unedited, in its entirety:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-py&quot;&gt;&lt;code&gt;class MoxRequest(pyramid.request.Request):
    # logged-in-user access
    @util.CachedAttribute
    def user_id(self):
        from pyramid.security import authenticated_userid
        user_id = authenticated_userid(self)
        log.debug(&apos;authenticated user id: %r&apos;, user_id)
        return user_id

    @util.CachedAttribute
    def user(self):
        user_id = self.user_id
        if user_id:
            return model.User.get(user_id)
        return None

    @util.CachedAttribute
    def username(self):
        if self.user:
            return self.user.username
        else:
            return None

    def gater_check(self, feature_name):
        return self.registry.settings.get(&apos;gater.%s&apos; % feature_name) == &apos;on&apos;

    # flash methods
    def flash_success(self, body, title=&apos;&apos;):
        self._flash_message(body, title=title, queue=&apos;success&apos;)

    def flash_info(self, body, title=&apos;&apos;):
        self._flash_message(body, title=title, queue=&apos;info&apos;)

    def flash_warning(self, body, title=&apos;&apos;):
        self._flash_message(body, title=title, queue=&apos;warning&apos;)

    def flash_error(self, body, title=&apos;&apos;):
        self._flash_message(body, title=title, queue=&apos;error&apos;)

    def _flash_message(self, body, title=&apos;&apos;, queue=&apos;&apos;):
        self.session.flash({&apos;title&apos;: title, &apos;body&apos;: body}, queue=queue)&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;This just sits in our top-level &lt;code&gt;__init__.py&lt;/code&gt;, along with the &lt;code&gt;main()&lt;/code&gt; entry point.&lt;/p&gt;
&lt;p&gt;Notes: &lt;code&gt;@util.CachedAttribute&lt;/code&gt; contains
&lt;a href=&quot;http://code.activestate.com/recipes/276643-caching-and-aliasing-with-descriptors/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;this recipe&lt;/a&gt;.
“Mox” is an easy-to-type codename, named after
&lt;a href=&quot;http://www.summitpost.org/mox-peaks-from-red-face-mountain/690027&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;these mountains&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[1] I’m still not sold on this, but I’m getting by. It arguably causes problems with testing and
such, but it is pretty nice to magically &lt;code&gt;from flask import request&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Writing a simple deploy script with Fabric and @roles]]></title><description><![CDATA[I first heard about  Fabric  a couple years ago while at Lolapps and liked
the idea of: writing deployment and sysadmin scripts in a…]]></description><link>https://rollbar.com/blog/writing-a-simple-deploy-script-with-fabric-and-roles/</link><guid isPermaLink="false">https://rollbar.com/blog/writing-a-simple-deploy-script-with-fabric-and-roles/</guid><pubDate>Thu, 16 Aug 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I first heard about &lt;a href=&quot;http://www.fabfile.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Fabric&lt;/a&gt; a couple years ago while at Lolapps and liked
the idea of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;writing deployment and sysadmin scripts in a language other than Bash&lt;/li&gt;
&lt;li&gt;that language being Python, which we used everywhere else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;but we already had a huge swath of shell scripts that worked well (and truth be told, Bash isn’t
really that bad). But now that we have at clean slate for &lt;a href=&quot;/&quot;&gt;Rollbar&lt;/a&gt;, Fabric it is.&lt;/p&gt;
&lt;p&gt;I wanted a simple deployment script that would do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;check to make sure it’s running as the user “deploy” (since that’s the user that has ssh keys set up
and owns the code on the remote machines)&lt;/li&gt;
&lt;li&gt;for each webserver:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;in series, restart each web process&lt;/li&gt;
&lt;li&gt;make an HTTP POST to our &lt;a href=&quot;/docs/api/deploys/&quot;&gt;deploys api&lt;/a&gt; to record that the deploy completed
successfully&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here’s my first attempt:&lt;/p&gt;
&lt;!--more--&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-py&quot;&gt;&lt;code&gt;import sys

from fabric.api import run, local, cd, env, roles, execute
import requests

env.hosts = [&apos;web1&apos;, &apos;web2&apos;]


def deploy():
    # pre-roll checks
    check_user()

    # do the roll.
    update_and_restart()

    # post-roll tasks
    rollbar_record_deploy()


def update_and_restart():
    code_dir = &apos;/home/deploy/www/mox&apos;
    with cd(code_dir):
        run(&quot;git pull&quot;)
        run(&quot;pip install -r requirements.txt&quot;)
        run(&quot;supervisorctl restart web1&quot;)
        run(&quot;supervisorctl restart web2&quot;)


def check_user():
    if local(&apos;whoami&apos;, capture=True) != &apos;deploy&apos;:
        print &quot;This command should be run as deploy. Run like: sudo -u deploy fab deploy&quot;
        sys.exit(1)


def rollbar_record_deploy():
    # read access_token from production.ini
    access_token = local(&quot;grep &apos;rollbar.access_token&apos; production.ini | sed &apos;s/^.* = //g&apos;&quot;,
        capture=True)

    environment = &apos;production&apos;
    local_username = local(&apos;whoami&apos;, capture=True)
    revision = local(&apos;git log -n 1 --pretty=format:&quot;%H&quot;&apos;, capture=True)

    resp = requests.post(&apos;https://api.rollbar.com/api/1/deploy/&apos;, {
        &apos;access_token&apos;: access_token,
        &apos;environment&apos;: environment,
        &apos;local_username&apos;: local_username,
        &apos;revision&apos;: revision
    }, timeout=3)

    if resp.status_code == 200:
        print &quot;Deploy recorded successfully&quot;
    else:
        print &quot;Error recording deploy:&quot;, resp.text&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Looks close-ish, right? It knows which hosts to deploy to, checks that it’s running as deploy,
updates and restarts each host, and records the deploy. Here’s the output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; -u deploy fab deploy
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;env-mox&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;brian@dev mox&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; -u deploy fab deploy
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; password &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; brian:
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Executing task &lt;span class=&quot;token string&quot;&gt;&apos;deploy&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;whoami&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; pull
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: remote: Counting objects: 8, done.
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: remote: Compressing objects: 100% &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;4/4&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, done.
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: remote: Total 6 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;delta 4&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, reused 4 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;delta 2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Unpacking objects: 100% &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;6/6&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, done.
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: From github.com:brianr/mox
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out:    c731b57&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;1d365e0  master     -&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; origin/master
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Updating c731b57&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;1d365e0
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Fast-forward
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out:  fabfile.py &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;    8 ++++----
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out:  1 &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; changed, 4 insertions&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;+&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, 4 deletions&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; -r requirements.txt
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Requirement already satisfied &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;use --upgrade to upgrade&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: Beaker&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;1.6.3 &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; /home/deploy/env-mox/lib/python2.7/site-packages &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;from -r requirements.txt &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line 1&lt;span class=&quot;token punctuation&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Cleaning up&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: supervisorctl restart web1
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web1: stopped
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web1: started

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: supervisorctl restart web2
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web2: stopped
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web2: started

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rollbar.access_token&apos;&lt;/span&gt; production.ini &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s/^.* = //g&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;whoami&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; log -n 1 --pretty&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;format:&lt;span class=&quot;token string&quot;&gt;&quot;%H&quot;&lt;/span&gt;
Deploy recorded successfully. Deploy id: 307
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Executing task &lt;span class=&quot;token string&quot;&gt;&apos;deploy&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;whoami&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; pull
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: remote: Counting objects: 8, done.
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: remote: Compressing objects: 100% &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;4/4&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, done.
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: remote: Total 6 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;delta 4&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, reused 4 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;delta 2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Unpacking objects: 100% &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;6/6&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, done.
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: From github.com:brianr/mox
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out:    c731b57&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;1d365e0  master     -&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; origin/master
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Updating c731b57&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;1d365e0
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Fast-forward
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out:  fabfile.py &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;    8 ++++----
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out:  1 &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; changed, 4 insertions&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;+&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, 4 deletions&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; -r requirements.txt
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Requirement already satisfied &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;use --upgrade to upgrade&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: Beaker&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;1.6.3 &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; /home/deploy/env-mox/lib/python2.7/site-packages &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;from -r requirements.txt &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line 1&lt;span class=&quot;token punctuation&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Cleaning up&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: supervisorctl restart web1
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web1: stopped
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web1: started

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: supervisorctl restart web2
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web2: stopped
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web2: started

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rollbar.access_token&apos;&lt;/span&gt; production.ini &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s/^.* = //g&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;whoami&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; log -n 1 --pretty&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;format:&lt;span class=&quot;token string&quot;&gt;&quot;%H&quot;&lt;/span&gt;
Deploy recorded successfully. Deploy id: 308

Done.
Disconnecting from web2&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. done.
Disconnecting from web1&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. done.
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Lots of good things happening. But it’s doing the whole process - &lt;code&gt;check_user&lt;/code&gt;,
&lt;code&gt;update_and_restart&lt;/code&gt;, &lt;code&gt;rollbar_record_deploy&lt;/code&gt; - twice, once for each host. The duplicate
&lt;code&gt;check_user&lt;/code&gt; just slows things down, but the duplicate &lt;code&gt;rollbar_record_deploy&lt;/code&gt; is going to mess with
our deploy history, and it’s only going to get worse as we add more servers.&lt;/p&gt;
&lt;p&gt;Fabric’s solution to this, described in their
&lt;a href=&quot;http://docs.fabfile.org/en/1.4.3/usage/execution.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;docs&lt;/a&gt;, is “roles”. We can map hosts to
roles, then decorate tasks with which roles they apply to. Here we replace the &lt;code&gt;env.hosts&lt;/code&gt;
declaration with &lt;code&gt;env.roledefs&lt;/code&gt;, decorate &lt;code&gt;update_and_restart&lt;/code&gt; with &lt;code&gt;@roles&lt;/code&gt;, and call
&lt;code&gt;update_and_restart&lt;/code&gt; with &lt;code&gt;execute&lt;/code&gt; so that the &lt;code&gt;@roles&lt;/code&gt; decorator is honored:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-py&quot;&gt;&lt;code&gt;import sys

from fabric.api import run, local, cd, env, roles, execute
import requests

env.roledefs = {
    &apos;web&apos;: [&apos;web1&apos;, &apos;web2&apos;]
}


def deploy():
    # pre-roll checks
    check_user()

    # do the roll.
    # execute() will call the passed-in function, honoring host/role decorators.
    execute(update_and_restart)

    # post-roll tasks
    rollbar_record_deploy()


@roles(&apos;web&apos;)
def update_and_restart():
    code_dir = &apos;/home/deploy/www/mox&apos;
    with cd(code_dir):
        run(&quot;git pull&quot;)
        run(&quot;pip install -r requirements.txt&quot;)
        run(&quot;supervisorctl restart web1&quot;)
        run(&quot;supervisorctl restart web2&quot;)


def check_user():
    if local(&apos;whoami&apos;, capture=True) != &apos;deploy&apos;:
        print &quot;This command should be run as deploy. Run like: sudo -u deploy fab deploy&quot;
        sys.exit(1)


def rollbar_record_deploy():
    # read access_token from production.ini
    access_token = local(&quot;grep &apos;rollbar.access_token&apos; production.ini | sed &apos;s/^.* = //g&apos;&quot;,
        capture=True)

    environment = &apos;production&apos;
    local_username = local(&apos;whoami&apos;, capture=True)
    revision = local(&apos;git log -n 1 --pretty=format:&quot;%H&quot;&apos;, capture=True)

    resp = requests.post(&apos;https://api.rollbar.com/api/1/deploy/&apos;, {
        &apos;access_token&apos;: access_token,
        &apos;environment&apos;: environment,
        &apos;local_username&apos;: local_username,
        &apos;revision&apos;: revision
    }, timeout=3)

    if resp.status_code == 200:
        print &quot;Deploy recorded successfully&quot;
    else:
        print &quot;Error recording deploy:&quot;, resp.text&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;Here’s the output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot;&gt;
      &lt;pre class=&quot;language-bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;env-mox&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;brian@dev mox&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; -u deploy fab deploy
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; password &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; brian:
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;whoami&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Executing task &lt;span class=&quot;token string&quot;&gt;&apos;update_and_restart&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; pull
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Already up-to-date.

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; -r requirements.txt
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Requirement already satisfied &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;use --upgrade to upgrade&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: Beaker&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;1.6.3 &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; /home/deploy/env-mox/lib/python2.7/site-packages &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;from -r requirements.txt &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line 1&lt;span class=&quot;token punctuation&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Cleaning up&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: supervisorctl restart web1
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web1: stopped
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web1: started

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: supervisorctl restart web2
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web2: stopped
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web2: started

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Executing task &lt;span class=&quot;token string&quot;&gt;&apos;update_and_restart&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; pull
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Already up-to-date.

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; -r requirements.txt
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Requirement already satisfied &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;use --upgrade to upgrade&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: Beaker&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;1.6.3 &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; /home/deploy/env-mox/lib/python2.7/site-packages &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;from -r requirements.txt &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line 1&lt;span class=&quot;token punctuation&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: Cleaning up&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: supervisorctl restart web1
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web1: stopped
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web1: started

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; run: supervisorctl restart web2
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web2: stopped
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;web2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; out: web2: started

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rollbar.access_token&apos;&lt;/span&gt; production.ini &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s/^.* = //g&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;whoami&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; local: &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; log -n 1 --pretty&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;format:&lt;span class=&quot;token string&quot;&gt;&quot;%H&quot;&lt;/span&gt;
Deploy recorded successfully. Deploy id: 309

Done.
Disconnecting from web2&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. done.
Disconnecting from web1&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. done.
&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;That’s more like it. Since &lt;code&gt;env.hosts&lt;/code&gt; is not set, the undecorated tasks just run locally (and only
once), and the &lt;code&gt;@roles(&apos;web&apos;)&lt;/code&gt;-decorated task runs for each web host.&lt;/p&gt;</content:encoded></item></channel></rss>