1616% % and creates the buffer of trace spans to be reported.
1717% % @end
1818% %%-----------------------------------------------------------------------
19- -module (oc_reporter ).
19+ -module (oc_trace_reporter ).
2020
21- -behaviour (gen_server ).
21+ -behaviour (oc_internal_timer ).
2222
23- -compile ({no_auto_import , [register / 2 ]}).
23+ -export ([start_link /1 ,
24+ store_span /1 ]).
2425
25- -export ([start_link /0 ,
26- store_span /1 ,
27- register /1 ,
28- register /2 ]).
29-
30- -export ([init /1 ,
31- handle_call /3 ,
32- handle_cast /2 ,
33- handle_info /2 ,
34- code_change /3 ,
35- terminate /2 ]).
26+ -export ([ping /0 ]).
3627
3728-include (" opencensus.hrl" ).
3829-include (" oc_logger.hrl" ).
5041% % until it returns.
5142-callback report (nonempty_list (opencensus :span ()), opts ()) -> ok .
5243
53- -record (state , {reporters :: [{module (), term ()}],
54- send_interval_ms :: integer (),
55- timer_ref :: reference ()}).
56-
5744-define (BUFFER_1 , oc_report_buffer1 ).
5845-define (BUFFER_2 , oc_report_buffer2 ).
5946-define (BUFFER_STATUS , oc_report_status ).
6047
61- start_link () ->
48+ start_link (Handlers ) ->
6249 maybe_init_ets (),
63- gen_server :start_link ({local , ? MODULE }, ? MODULE , [], []).
50+ case gen_event :start_link ({local , ? MODULE }, []) of
51+ {ok , Pid } ->
52+ [gen_event :add_handler (Pid , Handler , Opts )
53+ || {Handler , Opts } <- Handlers ],
6454
65- % % @doc
66- % % @equiv register(Reporter, []).
67- % % @end
68- register (Reporter ) -> register (Reporter , []).
69-
70- % % @doc
71- % % Register new traces reporter `Reporter' with `Config'.
72- % % @end
73- -spec register (module (), term ()) -> ok .
74- register (Reporter , Options ) ->
75- gen_server :call (? MODULE , {register , init_reporter ({Reporter , Options })}).
55+ {ok , Pid };
56+ Other -> Other
57+ end .
7658
7759-spec store_span (opencensus :span ()) -> true | {error , invalid_span } | {error , no_report_buffer }.
7860store_span (Span = # span {}) ->
@@ -86,55 +68,7 @@ store_span(Span=#span{}) ->
8668store_span (_ ) ->
8769 {error , invalid_span }.
8870
89- init (_Args ) ->
90- SendInterval = application :get_env (opencensus , send_interval_ms , 500 ),
91- Reporters = [init_reporter (Config ) || Config <- application :get_env (opencensus , reporters , [])],
92- Ref = erlang :send_after (SendInterval , self (), report_spans ),
93- {ok , # state {reporters = Reporters ,
94- send_interval_ms = SendInterval ,
95- timer_ref = Ref }}.
96-
97- handle_call ({register , Reporter }, _From , # state {reporters = Reporters } = State ) ->
98- {reply , ok , State # state {reporters = [Reporter | Reporters ]}};
99- handle_call (_ , _From , State ) ->
100- {noreply , State }.
101-
102- handle_cast (_ , State ) ->
103- {noreply , State }.
104-
105- handle_info (report_spans , State = # state {reporters = Reporters ,
106- send_interval_ms = SendInterval ,
107- timer_ref = Ref }) ->
108- erlang :cancel_timer (Ref ),
109- Ref1 = erlang :send_after (SendInterval , self (), report_spans ),
110- send_spans (Reporters ),
111- {noreply , State # state {timer_ref = Ref1 }}.
112-
113- code_change (_ , State , _ ) ->
114- {ok , State }.
115-
116- terminate (_ , # state {timer_ref = Ref }) ->
117- erlang :cancel_timer (Ref ),
118- ok .
119-
120- init_reporter ({Reporter , Config }) ->
121- {Reporter , Reporter :init (Config )};
122- init_reporter (Reporter ) when is_atom (Reporter ) ->
123- {Reporter , Reporter :init ([])}.
124-
125- maybe_init_ets () ->
126- case ets :info (? BUFFER_STATUS , name ) of
127- undefined ->
128- [ets :new (Tab , [named_table , public | TableProps ]) ||
129- {Tab , TableProps } <- [{? BUFFER_1 , [{write_concurrency , true }, {keypos , # span .span_id }]},
130- {? BUFFER_2 , [{write_concurrency , true }, {keypos , # span .span_id }]},
131- {? BUFFER_STATUS , [{read_concurrency , true }]}]],
132- ets :insert (? BUFFER_STATUS , {current_buffer , ? BUFFER_1 });
133- _ ->
134- ok
135- end .
136-
137- send_spans (Reporters ) ->
71+ ping () ->
13872 [{_ , Buffer }] = ets :lookup (? BUFFER_STATUS , current_buffer ),
13973 NewBuffer = case Buffer of
14074 ? BUFFER_1 ->
@@ -148,19 +82,20 @@ send_spans(Reporters) ->
14882 ok ;
14983 Spans ->
15084 ets :delete_all_objects (Buffer ),
151- [report (Reporter , Spans , Config )
152- || {Reporter , Config } <- Reporters ],
85+ gen_event :sync_notify (? MODULE , {spans , Spans }),
15386 ok
15487 end .
15588
156- report (undefined , _ , _ ) ->
157- ok ;
158- report (Reporter , Spans , Config ) ->
159- % % don't let a reporter exception crash us
160- try
161- Reporter :report (Spans , Config )
162- catch
163- ? WITH_STACKTRACE (Class , Exception , StackTrace )
164- ? LOG_INFO (" reporter threw exception: reporter=~p ~p :~p stacktrace=~p " ,
165- [Reporter , Class , Exception , StackTrace ])
89+ maybe_init_ets () ->
90+ case ets :info (? BUFFER_STATUS , name ) of
91+ undefined ->
92+ [ets :new (Tab , [named_table , public | TableProps ]) ||
93+ {Tab , TableProps } <- [{? BUFFER_1 , [{write_concurrency , true }, {keypos , # span .span_id }]},
94+ {? BUFFER_2 , [{write_concurrency , true }, {keypos , # span .span_id }]},
95+ {? BUFFER_STATUS , [{read_concurrency , true }]}]],
96+ ets :insert (? BUFFER_STATUS , {current_buffer , ? BUFFER_1 }),
97+
98+ ok ;
99+ _ ->
100+ ok
166101 end .
0 commit comments