Trifle
GitHub
Trifle::Traces

Trifle::Traces

Gem Version Ruby

Simple tracer that collects log messages and return values from blocks. And on top of that you can persist in database/storage of your choice.

Trifle::Traces is a way too simple timeline tracer that helps you track custom outputs. Ideal for any code from blackbox category (aka background-job-that-talks-to-API-and-works-every-time-when-you-run-it-manually-but-never-when-in-production type of jobs).

Why?

If you need to track certain execution of a code and log some output, you're pretty much stuck with Rails::Logger. That adds bunch of output like timestamp, level and you can even extend it with some additional attributes. Unfortunately that is like using puts in 2022.

Trifle::Traces helps you to add visibility into parts of your application you never thought you needed (until you did, but then it was too late. Right?). It allows you to use tracer around your code, store text, return values, states and even artifacts all with few simple commands. It does not persist any data, but allows you to choose the storing method that fits your needs the most, all through a series of callbacks.

Before

You've probably seen code like:

require 'rest-client'

module Cron
  class SubmitSomethingWorker
    include Sidekiq::Worker

    def perform(some_id)
      Rails.logger.info "Start processing"
      something = Something.find(some_id)
      Rails.logger.info "Found record in DB"
      body = { code: something.code, count: 100 }
      Rails.logger.info "Sending payload: #{body}"

      RestClient.post('http://example.com/something', body)
      Rails.logger.info "Done?"
    end
  end
end

With output like:

Start processing
Found record in DB
Sending payload: {code: nil, count: 100}

And wondering what went wrong.

After

Why not rather:

require 'rest-client'

module Cron
  class SubmitSomethingWorker
    include Sidekiq::Worker

    def perform(some_id)
      @some_id = some_id
      Trifle::Traces.trace('Sending request') do
        RestClient.post('http://example.com/something', body)
      end
    end

    def body
      Trifle::Traces.trace('Building body') do
        { code: something.code, count: 100 }
      end
    end

    def something
      @something ||= Trifle::Traces.trace('Looking up record in DB') do
        Something.find(@some_id)
      end
    end
  end
end