Giter Club home page Giter Club logo

Comments (6)

sunny avatar sunny commented on July 22, 2024 1

Hi there!

I’m afraid there’s currently no built-in instrumentation or hooks.

You could try and override the _call method on actors. But, as its name suggests, it’s an internal API, so there’s no guarantee that overriding it will stay in place.

class ApplicationActor
  def _call
    ActiveSupport::Notifications.instrument("ApplicationActor", extra: self) do
      super
    end
  end
end

I’d be happy to accept a pull-request to add ActiveSupport instrumentation to actor-rails or some kind of hook syntax such as around_call … in this repo if you’d be willing to try that out 🙏🏻

from actor.

blocknotes avatar blocknotes commented on July 22, 2024 1

Thank you for your feedback @sunny - I'll think about proposing something to you.
I'm not a big fan of callbacks but having something easy for instrumentation seems a nice value to me.

from actor.

blocknotes avatar blocknotes commented on July 22, 2024 1

I don't have a good solution for now to avoid using the private interface method _call.

Currently I'm following the @sunny hint.
Adding here some code if it can help someone else:

# app/lib/instrumentable_actor.rb
module InstrumentableActor
  # NOTE: rely on a private method _call
  def _call(**_args)
    extra = { class: self.class, args: result.to_h }
    ActiveSupport::Notifications.instrument("ApplicationActor", extra:) do
      super
    end
  end
end

# app/actors/application_actor.rb
class ApplicationActor
  include ServiceActor::Base
  include InstrumentableActor
end

# config/initializers/notifications.rb
ActiveSupport::Notifications.subscribe("ApplicationActor") do |event, start, finish, id, payload|
  Rails.logger.info do
    extra = payload[:extra]
    "[#{id}] #{event} - #{extra[:class]} #{extra[:args]} - start: #{start} - finish: #{finish}"
  end
end

The logs have this form:

[081cd796c6441ff4e6db] ApplicationActor - MyActor {:par1=>"some value"} - start: 2023-03-30 16:37:55 +0200 - finish: 2023-03-30 16:37:55 +0200

from actor.

sunny avatar sunny commented on July 22, 2024

Perhaps the ActiveSupport::Notifications.instrument call you have could be added directly to ServiceActor::Base inside the service_actor-rails gem so that you don’t have to rely on an internal method.

Would you be willing to try a pull-request over there with that change?

from actor.

blocknotes avatar blocknotes commented on July 22, 2024

Hey @sunny.
I could try but how could I avoid the _call method?
I tried also directly prepending the instrumentation on the call instances but I got some issues and it seems a workaround to me (also because the descendants must be loaded ahead also in development with eager load or manually requiring the child actor classes).

from actor.

sunny avatar sunny commented on July 22, 2024

I think it’s fine for actor-rails to use actor’s internal _call method. Although they are two different gems, their develpment is tightly linked so it’s much less of an issue than if the method is overridden in your app.

Another option would be to introduce a callback mechanic in actor so that actor-rails doesn’t rely on _call. For example this could be an around class method that can accept a block. That would be ideal and allow more use-cases but it might take longer to build since it would mean changes to both actor and actor-rails.

from actor.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.