Systems | Development | Analytics | API | Testing

Heroku logs and you: a complete guide

Heroku's logging system is your primary window into application behavior, but its ephemeral nature and streaming architecture can feel mysterious at first. This guide walks through everything developers need to know about Heroku logs, from understanding what they are and how to access them, to working around their limitations and forwarding them to external services like Honeybadger Insights for complete observability. Read on to master Heroku logging.

FastAPI error handling: types, methods, and best practices

Errors and exceptions are inevitable in any software, and FastAPI applications are no exception. Errors can disrupt the normal flow of execution, expose sensitive information, and lead to a poor user experience. Hence, it is important to implement robust error-handling mechanisms in FastAPI applications. In this article, we will discuss the different types of FastAPI errors to help you understand their causes and effects.

Code coverage vs. test coverage in Python

If you have been writing tests for a while, you have probably encountered code coverage and test coverage. These concepts can be difficult to differentiate because they are somewhat intertwined. In this article, you will learn what code coverage vs test coverage means, and the basis of these concepts. You will also learn the key differences between code coverage and test coverage in Python. You would discover tools, techniques, and best practices to improve your testing strategy.

How to build a Copilot agent

A customer recently shared their debugging workflow with me. When an error shows up in Honeybadger, they import it to Linear, manually add context about where to look in the codebase, then assign GitHub Copilot to investigate. It works, but they asked a good question: could Copilot just access Honeybadger directly? The answer is yes—and it's easier than I expected.

Everything you need to know about Ruby 4.0

Ruby 4.0 is a major release, launched on Ruby’s 30th anniversary (December 25, 2025) to celebrate three decades of the community, not due to major breaking changes. I was surprised to learn that Ruby doesn’t actually follow semantic versioning! Instead, Matz (Ruby’s creator) increases the major version when changes impress him. This version marks 30 years of Ruby and introduces features to extend the language.

Exploring Rails Action Cable with Solid Cable

Real-time features are becoming increasingly important in web applications, but not every Rails developer is familiar with Action Cable, the framework's built-in WebSocket library. Rails Action Cable has long supported web sockets, but comes with some additional complexity. Rails 8 introduces Solid Cable, a new database-backed adapter for Action Cable that eliminates the need for Redis. In this guide, I'll walk you through Action Cable by way of Solid Cable and show you how to build a real-time feature.

Honeybadger year in review: What we shipped in 2025

Happy holidays! 2025 has been a busy and productive time here at 'Badger HQ. While we shipped a lot of cool things, four features really stand out as we look back on the year. Our top features in 2025 include: We also attended some conferences this year! MicroConf, RailsConf, Laracon, ElixirConf, Rocky Mountain Ruby, and SF Ruby: It was great connecting with so many folks in person, discussing application monitoring, and sharing some delicious meals.

Get more from your Python integration testing with Honeybadger

Integration testing is an essential part of development, ensuring applications can survive the rigors of deployment and function in the real world. Getting the most out of them is key. It’s about making sure you write meaningful tests that ensure your code works as expected. If you’re running integration tests in Python, you may appreciate better visibility and deeper insights into application errors.

A comprehensive guide to error handling In Node.js

If you've been writing anything more than "Hello world" programs, you are probably familiar with the concept of errors in programming. They are mistakes in your code, often referred to as "bugs", that cause a program to fail or behave unexpectedly. Unlike some languages, such as Go and Rust, where you are forced to interact with potential errors every step of the way, it's possible to get by without a coherent error handling strategy in JavaScript and Node.js.

Writing Comprehensive Integration Tests for Django Applications

Integration testing verifies that multiple components of your Django application work together correctly. Unlike writing unit tests that examine isolated functions or methods, the Django integration testing process validates entire user workflows, tests database transactions, and system interactions. Django's testing framework provides specialized tools for creating realistic automated test scenarios that mirror production environments.