Comments (6)
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.
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.
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.
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.
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.
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)
- Feature request: use other input values in default HOT 4
- alias_input is documented but unavailable HOT 1
- What about improving the README about testing? HOT 1
- Get "TypeError: exception class/object expected" error when update from 3.1.3 to 3.6 HOT 2
- Missing note on stubbing ServiceActor::Result HOT 4
- Can't set an hash as a default value for an input HOT 1
- Keep Zeitwerk as a development dependency only HOT 2
- Consider removing `OpenStruct` usage HOT 2
- Consider dropping support for unmaintained Ruby releases HOT 1
- Misleading `ServiceActor::ArgumentError` message under specific circumstances HOT 8
- Make Actor result + pattern matching more pleasant HOT 1
- Actor's output names collision with `Object`'s instance methods HOT 2
- Using `Kernel.tap` and `Kernel.then` via `ServiceActor::Result` receiver HOT 1
- Is `DefaultCheck` obsolete? HOT 4
- Invoking undefined methods on `ServiceActor::Result` will lead to runtime errors in the next major release of Actor. HOT 29
- Release notes for 3.8.0 HOT 8
- [Proposal] Default outputs via `output_of` actor class method HOT 3
- Breaking changes on ServiceActor::Result `failure?` after dropping `ostruct` ??? HOT 5
- Repeated `play` execution on 3.9.0 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from actor.