Skip to content

Latest commit

 

History

History
138 lines (92 loc) · 5.33 KB

CHANGELOG.md

File metadata and controls

138 lines (92 loc) · 5.33 KB

Changelog for Oban Web v2.11

All notable changes to Oban.Web are documented here.

🥂 Web is Free and Open Source

Oban Web is now fully open source and free (as in champagne 😉)! From now on, Oban Web will be published to Hex and available for use in your Oban powered applications. See the updated, much slimmer, installation guide to get started!

Web v2.11 is licensed under Apache 2.0, just like Oban and Elixir itself. Previous versions are commercially licensed, therefore private, and won't be published to Hex.

Special thanks to all of our customers that supported the project for the past 5 years and made open source Oban, and now Web, possible 💛.

🐬🪶 MySQL and SQLite

All official Oban and Oban Pro engines are fully supported. Listing, filtering, ordering, and searching through jobs works for Postgres, MySQL, and SQLite. That includes the particularly gnarly issue of dynamically generating and manipulating JSON for filter auto-suggestions! Nested args queries, such as args.address.city:Edinburgh work equally well with each engine.

🎛️ Instance Select

The dashboard will now support switching between Oban instances. A new instance select menu in the header allows switching between running Oban instances at runtime. There's no need to mount additional dashboards in your application's router to handle multiple instances. The most recently selected instance persists between mounts.

- oban_dashboard "/oban_a", oban_name: Oban.A
- oban_dashboard "/oban_b", oban_name: Oban.B
- oban_dashboard "/oban_c", oban_name: Oban.C
+ oban_dashboard "/oban"

This also eliminates the need for additional router configuration, as the dashboard will select the first running Oban instance it finds (with a preference for the default Oban).

- oban_dashboard "/oban", oban_name: MyOban
+ oban_dashboard "/oban"

☯️ Unified Tables

The queue and jobs tables are fully rebuilt with shared, reusable components and matching functionality. This makes interacting with jobs clearer while queues gain some much requested functionality:

  • Sidebar - a new queue sidebar shows status counts and enables filtering by statuses such as paused or terminating.

  • Filtering - queues are auto-complete filterable just like jobs, making it possible to find queues running on a particular node or narrow down by status.

  • Shared Sorting - queue sorting now behaves identically to jobs, through a shared dropdown.

  • Uniform Navigation - click on any part of the queue row to navigate to details.

  • Condensed Rows - simplify the queue page by removing nested row components. Extra queue details are in the sub-queue page.

🕯️ Operate on Full Selection

Apply bulk actions to all selected jobs, not just those visible on the current page.

This expands the select functionality to extend beyond the current page and include all filtered jobs, up to a configurable limit. The limit defaults to 1000 and may be overridden with a resolver callback.

v2.11.0 — 2025-01-16

Enhancements

  • [Dashboard] Load using non-default Oban instance without any config.

    The dashboard now loads the first running non-default Oban instance, even without anything configured.

  • [Jobs] Decode decorated arg when formatting job args.

    The decorated arg are term encoded and inscrutiable in the standard display. Now the value is decoded and display as the original value.

  • [Jobs] Prevent decoding executable functions when displaying recorded output.

    By default, recorded content uses the :safe flag, which now prevents both atom creation and executable content. This is an extra security precaution to prevent any possible exploits through Web.

  • [Queues] Add sidebar similar to the jobs table, including filters to make bulk operations on queues possible.

  • [Queues] Add search bar with filtering functionality to query queues.

  • [Queues] Add multi-select mode to allow operating on multiple queues at once.

  • [Queues] Expose a "Stop Queues" operation along with corresponding access controls to prevent unintended shutdown.

  • [Resolver] Add resolve_instances/1 callback to restrict selectable Oban instances.

    Not all instances should be available to all users. This adds the resolve_instances/1 callback to allow scoping instances by user:

    def resolve_instances(%{admin?: true}), do: :all
    def resolve_instances(_user), do: [Oban]
    
  • [Resolver] Add bulk_action_limit/1 to restrict the number of jobs operated on at once.

    Bulk operations now effect all filtered jobs, not just those visible on the current page. As there may be millions of jobs that match a filter, some limiting factor is necessary. The default of 1000 may be overridden:

    def bulk_action_limit(:completed), do: 10_000
    def bulk_action_limit(_state), do: :infinity
    

Bug Fixes

  • [Page] Address deprecations from recent upgrades to Elixir 1.17+, Phoenix 1.5+, and Phoenix LiveView 1.0+

  • [Jobs] Always treat args wrapped in quotes as a string when filtering.

    Manually wrapping values in quotes enforces searching by string, rather than as a parsed integer. As values are cast to JSON the type matters, and 123 != "123".