Let's build a simple Flask app that is primed and ready to deploy to Heroku. | Continue reading
Welcome to part two of this series. In the previous tutorial, we learned about multi-tenancy, including different multi-tenancy implementation strategies. We also started building a multi-tenant Phoenix link shortening app and added basic user authentication. In this final part o … | Continue reading
AppSignal now supports Solid Cache, giving you the same deep cache performance insights you'd get from other Rails cache stores. In this blog post, we'll give you a quick tour of Solid Cache, and how you can benefit from monitoring your app's cache with AppSignal. Wha … | Continue reading
Let's discover how to identify and fix the root causes of your Node.js performance issues. | Continue reading
We will cover some best practices and common ways of handling money in your Rails app with Money-Rails. | Continue reading
Hello there! My name is Maciej Mensfeld, and some of you might recognize me from my involvement in RubyGems Security, OSS commitments, or perhaps from Karafka: a multi-threaded, efficient Kafka processing framework tailored for Ruby and Rails. While I generally pen my thoughts on … | Continue reading
Apps built with Elixir can support massive scalability, real-time interactivity, great fault tolerance, and the language's syntax is actually a joy to use. Elixir is a natural fit for applications such as chat apps, data dashboard apps, and anything needed to support a large … | Continue reading
At AppSignal, our pricing revolves around the number of requests we process for a customer and the number of buckets of logging data we store. After their free trial, customers are offered the most fitting plan for them based on their usage in the previous 30 days. About nine yea … | Continue reading
In parts one and two of this series, we only dealt with the pure CRUD aspects of using SQLite as a production database. In this post, we will explore the world of queue mechanisms, using SQLite as the pub/sub adapter for ActiveJob. Let's make use of LiteJob to handle incoming … | Continue reading
Because of the asynchronous nature of Node.js, it's crucial you set timeouts to ensure the responsiveness of your application. Node.js timeouts help prevent indefinite waiting and let your backend handle situations where tasks take longer than expected. Thanks to timeouts, yo … | Continue reading
In the previous part of this series about validating data at the boundary of an Elixir application, we covered a few general programming tactics to try and reject invalid and unexpected data in our software. Continuing with that subject, we'll now explore how two libraries, n … | Continue reading
We've improved our core features to help you debug issues more efficiently and effectively. This article will walk you through the changes we've made to our Error Tracking, Performance Monitoring, Anomaly Detection, and Log Incidents features that enable you to gain the i … | Continue reading
Deno and Bun are two JavaScript runtime newcomers that aim to undermine Node.js. These alternatives have gained popularity for their innovative approach to server-side development with JavaScript. But the real question is: what do they bring to the table compared to Node.js? In t … | Continue reading
In the second post of our series covering LiteStack (an alternative way to build Rails applications entirely based on SQLite), we'll explore the database's concepts of flexible typing and type affinity. We'll not only discover how SQLite's data handling differs fr … | Continue reading
We're happy to announce that AppSignal now offers monitoring tools for Python projects. AppSignal helps you get the most out of your Python application's monitoring metrics, with additional support for multiple Python frameworks and packages such as Django and Celery. In … | Continue reading
Many individuals, particularly founders of other SaaS platforms built on Rails, have inquired about the cost of our Rails World 2023 sponsorship and its worth. While anyone can estimate our expenses based on publicly available data, we're happy to provide a detailed breakdown … | Continue reading
Node.js v21, the latest Node update, is now available as a stable release. It supersedes v20 in the 'Current' release line, which has been promoted to the long-term support (LTS) channel as of 24 October. This new version stabilizes the fetch and WebStreams API, adds a bu … | Continue reading
Elixir excels at building scalable and maintainable applications. However, sometimes Elixir is not the best language to tackle specific tasks, and it can fall short in some areas, like direct system interaction. Fortunately, Elixir offers NIFs (Native Implemented Functions): a pa … | Continue reading
In the first part of this series, we built the asynchronous components of a much larger solution. Today, we will build the API interface that can be consumed in real-time. Recap So far, we have set up two step functions to process resumes asynchronously. The first step function t … | Continue reading
AppSignal now supports Remix! With insights into the performance of Remix components like loaders and routing, AppSignal helps you refine your Remix application. This blog post will show you how to start monitoring your Remix application using AppSignal. Getting Started To get st … | Continue reading
Ruby is an expressive language. This is no accident; Matz very consciously designed Ruby as an intuitive language to more or less read like English. It's safe to say that he succeeded. Methods are named very carefully, and do what they say they do; they also tend to have inve … | Continue reading
In this first part of a two-part series, we'll explore how to avoid bad data and validate data at the boundary of a Phoenix application. We'll use a few techniques to ensure that bad data doesn't degrade our application. In part two, we'll specifically focus on le … | Continue reading
To keep your app secure, you need to control who and what can access it. Access control can be categorized into authentication — "who" to allow — and authorization — "what" they can access. Authentication is a subject for another day, but when it comes to user authorization, you … | Continue reading
In this article, we'll show how you can use Elixir's profile.eprof mix task to evaluate and improve code performance in your Elixir application. You'll see how we used the profiling mix task to lower reductions in our instrument/3 function and custom instrumentation f … | Continue reading
In this series of posts, we will look at LiteStack, a one-stop-shop solution that hosts and processes all your production data on a single machine. LiteStack (as the name suggests) makes use of SQLite to provide: a database using the LiteDB adapter an ActiveJob backend (LiteJob) … | Continue reading
Exceptions are a core aspect of programming, and a way to signal when something goes wrong with a program. An exception could result from a simple error, or your program might crash because of underlying constraints. Exceptions are not necessarily bad, though — they are fundament … | Continue reading
Sidekiq allows Ruby developers to maintain fast and responsive web applications by moving time-consuming tasks into the background. With multithreading at its core, Sidekiq can process many jobs at once. This makes Sidekiq an important part of Ruby or Rails applications that hand … | Continue reading
In part one of this series, we introduced the CoreComponents that get generated when bootstrapping a new Phoenix project. In part two, we implemented a create modal. Now, we will implement an edit modal. You can continue following along with our companion repo. Editing a Form in … | Continue reading
Whether you're familiar with job schedulers or new to the concept, two popular libraries in the Node.js ecosystem stand out: Bull and Agenda. These libraries provide unique features and advantages when it comes to efficient job scheduling. Let's explore the ins and outs o … | Continue reading
Production bugs slow down velocity and often affect the complete trajectory of your release roadmap. It helps if you have a robust error tracking setup to rely on. In this article, we'll look at how to make tracking errors in your Node.js application more convenient, automate … | Continue reading
Static code analysis is an important tool to ensure a project meets the right code standards and quality. In Elixir, the most popular package for this is Credo. Not only does it offer dozens of pre-made checks, but it also allows you to create your own. In this article, we will w … | Continue reading
If a web application involves users, as a matter of course, their data should be protected and secured. Securing a web application can mean several things. In this post, we'll discuss a subset of web security that involves authentication using JSON Web Tokens (JWTs) and the R … | Continue reading
Automation testing has become a fundamental part of web development, and Playwright has emerged as one of the most powerful end-to-end testing tools. Thanks to its robust API and multi-browser support, it's easy to test sites and web apps. At the same time, Playwright can pre … | Continue reading
Mongoose is Object Data Modeling (ODM) for MongoDB. It represents application data as JavaScript objects, mapped to the underlying MongoDB database. You can use Mongoose to model data, enforce schemas, validate models, and manipulate data in a database without familiarity with th … | Continue reading
In this series, we've seen how to create GraphQL APIs in Elixir using Absinthe. So far, we have only discussed a one-way communication channel where the client makes the queries or mutations, and the server responds. GraphQL also supports a long-running subscription between t … | Continue reading
In part one of this series, we introduced Devise using an example app to explore modules, helpers, views, controllers, and routes. In this part, we'll explore more advanced usages of Devise, specifically the use of OmniAuth, API authentication, and Authtrail. Let's dive s … | Continue reading
In part one of this series, we introduced the core generated components when bootstrapping a new Phoenix project. We used a button and a modal from the core components to lay the groundwork for a "create modal". In this post, we will put a form onto the modal and create pets. Let … | Continue reading
You've heard of metaprogramming: code you write that generates other code dynamically. Without it, Rails as we know it wouldn't (and couldn't) exist. But there's a good chance you've never done it yourself, and it's not hard to see why; even a brief excurs … | Continue reading
Delegation in programming refers to handing off a task from one part of a program to another. It's an essential technique in object-oriented programming, empowering clean, maintainable code by ensuring that each object or method is responsible for a specific task or behavior. … | Continue reading
In this post, we'll configure a Phoenix LiveView application to use a structured logger. We'll then use AppSignal to correlate log events with other telemetry signals, like exception reports and traces. Along the way, you'll learn about the benefits of structured logg … | Continue reading
With over 20,000 GitHub stars and lots of integrations, the Devise gem is one of the most popular gems in the Ruby landscape. So why would we term it one of Ruby's "hidden" gems? Well, as popular as it is, most developers only scratch the surface of the library's capabili … | Continue reading
When relying on data from external services, it's important for the retrieval to be accurate and timely. While we may not control how efficiently an external API responds to our requests, we can control how and when we request data from that API. However, over time as your ap … | Continue reading
The beauty of Node is that while the main event loop runs in a single thread, some expensive tasks are automatically offloaded to a separate worker pool. These include the I/O-intensive DNS and File System (except fs.FSWatcher()) APIs, as well as the CPU-intensive Crypto and Zlib … | Continue reading
While a GraphQL API may be less susceptible to the common REST API performance issues of under and over-fetching data, allowing users to request and receive a wide range of data in a single, nestable query can also come with performance risks. AppSignal for Elixir now supports Ab … | Continue reading
Welcome to the final part of our Express to Fastify series. In the previous installments, we explored the unique features and advantages of Fastify over Express. Now, you'll put what you've learned so far into practice by migrating an existing Express application to Fasti … | Continue reading
This article covers the use of bundler features to secure Ruby applications. In this day and age, we have to be more and more careful about software supply chain security. We'll show you how to start this journey by relying on a Gemfile and bundler to manage your project' … | Continue reading
Want to monitor all of your application's services? Our Standalone Agent allows you to monitor processes our standard integrations don't monitor by default, helping you effortlessly expand your monitoring capabilities. To help simplify the process of configuring our stand … | Continue reading
Lambdas are a powerful programming construct used in many languages. These functions allow developers to write code that is more concise, efficient, and easier to maintain, making Lambdas an essential part of any developer's toolkit. In this article, we'll explore how you … | Continue reading