@@ -6,6 +6,7 @@ class TelemetryTest < ActiveSupport::TestCase
66 class Counter < SolidObjects ::Actor
77 actor_type "telemetry-counter"
88 attribute :count , default : 0
9+ observable :count , broadcast : :value
910
1011 def arrange
1112 emit :telemetry_effect , secret : "private effect"
@@ -40,6 +41,8 @@ def increment
4041 assert_equal 1 , event . fetch ( "attempt" )
4142 assert event . fetch ( "incarnation" )
4243 refute_includes event . fetch ( "metrics" ) . to_json , "actorId"
44+ started = events . find { |entry | entry . fetch ( "name" ) == "solid_objects.message.started" }
45+ refute_includes started . fetch ( "metrics" ) . map { |metric | metric . fetch ( "name" ) } , "solid_objects.duration"
4346 end
4447 test "diagnostics and observers require authorization and are bounded" do
4548 reference = Counter . ref ( "diagnostics" )
@@ -118,4 +121,44 @@ def increment
118121 ensure
119122 worker &.stop
120123 end
124+ test "outbox measurement failure cannot fail delivery" do
125+ SolidObjects . configuration . instrumentation = -> ( _ ) { true }
126+ Counter . ref ( "measurement" ) . arrange
127+ calls = [ ]
128+ SolidObjects . register_effect ( :telemetry_effect ) {
129+ calls << :delivered
130+ "result"
131+ }
132+ executor = SolidObjects ::EffectExecutor . new
133+ executor . define_singleton_method ( :claim_next ) do
134+ super ( ) . tap do |effect |
135+ effect . define_singleton_method ( :available_at ) { raise "measurement failed" }
136+ end
137+ end
138+ assert executor . run_once
139+ assert_equal [ :delivered ] , calls
140+ assert_equal "completed" , SolidObjects ::Effect . first . status
141+ ensure
142+ executor &.stop
143+ end
144+
145+ test "samples broadcast age and caps the combined outbox category" do
146+ events = [ ]
147+ SolidObjects . configuration . instrumentation = -> ( event ) { events << event }
148+ SolidObjects . configuration . authorize_administration = -> ( **) { true }
149+ SolidObjects . configuration . broadcast_adapter = -> ( _ ) { true }
150+ reference = Counter . ref ( "broadcast" )
151+ reference . increment
152+ reference . arrange
153+ summary = reference . diagnostics ( limit : 1 )
154+ assert_equal 1 , summary . fetch ( "outbox" ) . fetch ( "sampled" )
155+ assert summary . fetch ( "outbox" ) . fetch ( "truncated" )
156+ executor = SolidObjects ::BroadcastExecutor . new
157+ assert executor . run_once
158+ event = events . find { |entry | entry . fetch ( "name" ) == "solid_objects.outbox.age" && entry . fetch ( "attributes" ) [ "outboxKind" ] == "broadcast" }
159+ assert event
160+ assert_operator event . fetch ( "metrics" ) . last . fetch ( "value" ) , :>= , 0
161+ ensure
162+ executor &.stop
163+ end
121164end
0 commit comments