Skip to content

Instantly share code, notes, and snippets.

View bkeepers's full-sized avatar

Brandon Keepers bkeepers

View GitHub Profile
@bkeepers
bkeepers / README.md
Last active September 13, 2023 15:55
good_job queries to make latency/runtime graphs

Queries to show GoodJob queue latency, runtime, and counts in Blazer

IMG_6587

IMG_1893

@bkeepers
bkeepers / flipper.js
Last active February 4, 2024 10:46
Simple Flipper API for your app
// Plain ol' JavaScript module for fetching feature flags from the server
//
// import { isEnabled } from './flipper.js'
//
// if (await isEnabled("new_feature")) {
// // render new feature
// } else {
// // render old feature
// }
//
@bkeepers
bkeepers / initializer.rb
Created March 14, 2023 20:32
Use Sync adapter to keep memory in sync with storage adapter
# config/initializers/flipper.rb
require 'flipper/adapters/sync'
Rails.application.configure do
# Disable per-request memoization
config.flipper.memoize = false
end
Flipper.configure do |config|
@bkeepers
bkeepers / initializer.rb
Last active March 6, 2023 11:32
Use Flipper::Adapters::Poll to keep persisted features synced into memory. Polling happens in a background thread and loads all features into an in-memory adapter.
require "flipper/adapters/dual_write"
require "flipper/adapters/poll"
Flipper.configure do |config|
config.adapter do
# Primary storage adapter
storage_adapter = Flipper::Adapters::ActiveRecord.new
# Poll the primary storage adapter every 10 seconds to get all features
poller = Flipper::Adapters::Poll::Poller.get('memoizer', {
@bkeepers
bkeepers / delayed_job_active_job_compat.rb
Last active July 27, 2023 14:41
Migrate from plain ol' delayed_job to ActiveJob without losing jobs in the queue when you deploy
# Allow legacy jobs in the queue to be initialized and processed now that they use ActiveJob
#
# Each job must also define `#init_with(coder)` to define how serialized instance variables are
# used to initialize the new ActiveJob instance.
module Delayed::LegacyJob
class Proxy < SimpleDelegator
# ActiveJob calls `#perform_now` internally when executing a job to pass arguments to `#perform`
def perform
perform_now
end
@bkeepers
bkeepers / flipper-bugsnag.rb
Last active December 16, 2022 14:06
Flipper + BugSnag feature flags
# config/initializers/flipper.rb
ActiveSupport::Notifications.subscribe('feature_operation.flipper') do |event|
operation, feature_name, result = event.payload.values_at(:operation, :feature_name, :result)
return unless operation == :enabled?
result ? Bugsnag.add_feature_flag(feature_name) : Bugsnag.clear_feature_flag(feature_name)
end
@bkeepers
bkeepers / example.rb
Last active September 14, 2022 13:58
Multivariate - A/B - split testing with Flipper
# Register test groups
# https://www.flippercloud.io/docs/features#enablement-group
Flipper.register(:group_a) do |actor, context|
# Algorithm or database lookup to determine if a user is in this group
# e.g. 10% percentage of actors
crc32('group_a' + context.feature_name + actor.flipper_id) % 100 < 10
end
Flipper.register(:group_b) do |actor, context|
@bkeepers
bkeepers / README.md
Last active October 24, 2022 20:02
Fail Rails system tests if there are any JavaScript errors

We're on the cusp of 2022 and most software is now written in JavaScript, but it is still virtually impossible to fail integration tests on a JavaScript error and get a useful stack trace from the browser.

This gist includes my description of the problem and sample code from my attempts to solve it.

What I want:

  • Integration test should fail (preferabbly immediately) on any uncaught JavaScript error (window.onerror, unhandledrejection, etc)
  • The stack trace should use source maps and be close to what browsers show in DevTools

The tools I'm currently using:

@bkeepers
bkeepers / iframe_location_controller.js
Last active March 12, 2021 00:55
Stimulus controller to save location of same-origin iframe in hash of parent window and restore on reload.
import { Controller } from 'stimulus'
// Stimulus controller to save location of same-origin iframe in hash of parent
// window and restore on reload.
//
// <iframe src="…"
// data-controller="iframe-location"
// data-action="load->iframe-location#save">
// </frame>
//
@bkeepers
bkeepers / data.csv
Last active February 24, 2021 15:25
age length price
36 29 12500
41 38 34900
45 13 1250
11 26 22400
19 48 265000
33 38 89900
5 42 399000
39 28 3200
39 27 14750