@@ -33,7 +33,7 @@ use std::{
3333 } ,
3434} ;
3535use temporal_sdk_core_api:: telemetry:: {
36- CoreLog , CoreTelemetry , Logger , TelemetryOptions ,
36+ CoreLog , CoreTelemetry , Logger , TelemetryOptions , TelemetryOptionsBuilder ,
3737 metrics:: { CoreMeter , MetricKeyValue , NewAttributes , TemporalMeter } ,
3838} ;
3939use tracing:: { Level , Subscriber } ;
@@ -173,54 +173,59 @@ pub fn telemetry_init(opts: TelemetryOptions) -> Result<TelemetryInstance, anyho
173173 let mut forward_layer = None ;
174174 // ===================================
175175
176- let tracing_sub = opts. logging . map ( |logger| {
177- match logger {
178- Logger :: Console { filter } => {
179- // This is silly dupe but can't be avoided without boxing.
180- if env:: var ( "TEMPORAL_CORE_PRETTY_LOGS" ) . is_ok ( ) {
181- console_pretty_layer = Some (
182- tracing_subscriber:: fmt:: layer ( )
183- . with_target ( false )
184- . event_format (
185- tracing_subscriber:: fmt:: format ( )
186- . pretty ( )
187- . with_source_location ( false ) ,
188- )
189- . with_filter ( EnvFilter :: new ( filter) ) ,
190- )
191- } else {
192- console_compact_layer = Some (
193- tracing_subscriber:: fmt:: layer ( )
194- . with_target ( false )
195- . event_format (
196- tracing_subscriber:: fmt:: format ( )
197- . compact ( )
198- . with_source_location ( false ) ,
199- )
200- . with_filter ( EnvFilter :: new ( filter) ) ,
201- )
176+ let tracing_sub = if let Some ( ts) = opts. subscriber_override {
177+ Some ( ts)
178+ } else {
179+ opts. logging . map ( |logger| {
180+ match logger {
181+ Logger :: Console { filter } => {
182+ // This is silly dupe but can't be avoided without boxing.
183+ if env:: var ( "TEMPORAL_CORE_PRETTY_LOGS" ) . is_ok ( ) {
184+ console_pretty_layer = Some (
185+ tracing_subscriber:: fmt:: layer ( )
186+ . with_target ( false )
187+ . event_format (
188+ tracing_subscriber:: fmt:: format ( )
189+ . pretty ( )
190+ . with_source_location ( false ) ,
191+ )
192+ . with_filter ( EnvFilter :: new ( filter) ) ,
193+ )
194+ } else {
195+ console_compact_layer = Some (
196+ tracing_subscriber:: fmt:: layer ( )
197+ . with_target ( false )
198+ . event_format (
199+ tracing_subscriber:: fmt:: format ( )
200+ . compact ( )
201+ . with_source_location ( false ) ,
202+ )
203+ . with_filter ( EnvFilter :: new ( filter) ) ,
204+ )
205+ }
202206 }
203- }
204- Logger :: Forward { filter } => {
205- let ( export_layer , lo ) =
206- CoreLogConsumerLayer :: new_buffered ( FORWARD_LOG_BUFFER_SIZE ) ;
207- logs_out = Some ( Mutex :: new ( lo ) ) ;
208- forward_layer = Some ( export_layer . with_filter ( EnvFilter :: new ( filter ) ) ) ;
209- }
210- Logger :: Push { filter , consumer } => {
211- forward_layer =
212- Some ( CoreLogConsumerLayer :: new ( consumer ) . with_filter ( EnvFilter :: new ( filter ) ) ) ;
213- }
214- } ;
215- let reg = tracing_subscriber:: registry ( )
216- . with ( console_pretty_layer)
217- . with ( console_compact_layer)
218- . with ( forward_layer) ;
207+ Logger :: Forward { filter } => {
208+ let ( export_layer , lo ) =
209+ CoreLogConsumerLayer :: new_buffered ( FORWARD_LOG_BUFFER_SIZE ) ;
210+ logs_out = Some ( Mutex :: new ( lo ) ) ;
211+ forward_layer = Some ( export_layer . with_filter ( EnvFilter :: new ( filter ) ) ) ;
212+ }
213+ Logger :: Push { filter , consumer } => {
214+ forward_layer = Some (
215+ CoreLogConsumerLayer :: new ( consumer ) . with_filter ( EnvFilter :: new ( filter ) ) ,
216+ ) ;
217+ }
218+ } ;
219+ let reg = tracing_subscriber:: registry ( )
220+ . with ( console_pretty_layer)
221+ . with ( console_compact_layer)
222+ . with ( forward_layer) ;
219223
220- #[ cfg( feature = "tokio-console" ) ]
221- let reg = reg. with ( console_subscriber:: spawn ( ) ) ;
222- Arc :: new ( reg) as Arc < dyn Subscriber + Send + Sync >
223- } ) ;
224+ #[ cfg( feature = "tokio-console" ) ]
225+ let reg = reg. with ( console_subscriber:: spawn ( ) ) ;
226+ Arc :: new ( reg) as Arc < dyn Subscriber + Send + Sync >
227+ } )
228+ } ;
224229
225230 Ok ( TelemetryInstance :: new (
226231 tracing_sub,
@@ -231,6 +236,9 @@ pub fn telemetry_init(opts: TelemetryOptions) -> Result<TelemetryInstance, anyho
231236 ) )
232237}
233238
239+ /// WARNING: Calling can cause panics because of https://github.com/tokio-rs/tracing/issues/1656
240+ /// Lang must not start using until resolved
241+ ///
234242/// Initialize telemetry/tracing globally. Useful for testing. Only takes affect when called
235243/// the first time. Subsequent calls are ignored.
236244pub fn telemetry_init_global ( opts : TelemetryOptions ) -> Result < ( ) , anyhow:: Error > {
@@ -247,8 +255,23 @@ pub fn telemetry_init_global(opts: TelemetryOptions) -> Result<(), anyhow::Error
247255 Ok ( ( ) )
248256}
249257
250- #[ cfg( test) ]
251- pub use test_initters:: * ;
258+ /// WARNING: Calling can cause panics because of https://github.com/tokio-rs/tracing/issues/1656
259+ /// Lang must not start using until resolved
260+ ///
261+ /// Initialize the fallback global handler. All lang SDKs should call this somewhere, once, at
262+ /// startup, as it initializes a fallback handler for any dependencies (looking at you, otel) that
263+ /// don't provide good ways to customize their tracing usage. It sets a WARN-level global filter
264+ /// that uses the default console logger.
265+ pub fn telemetry_init_fallback ( ) -> Result < ( ) , anyhow:: Error > {
266+ telemetry_init_global (
267+ TelemetryOptionsBuilder :: default ( )
268+ . logging ( Logger :: Console {
269+ filter : construct_filter_string ( Level :: DEBUG , Level :: WARN ) ,
270+ } )
271+ . build ( ) ?,
272+ ) ?;
273+ Ok ( ( ) )
274+ }
252275
253276/// A trait for using [Display] on the contents of vecs, etc, which don't implement it.
254277///
@@ -275,24 +298,3 @@ where
275298 format ! ( "[{}]" , self . iter( ) . format( "," ) )
276299 }
277300}
278-
279- /// Helpers for test initialization
280- #[ cfg( test) ]
281- pub mod test_initters {
282- use super :: * ;
283- use temporal_sdk_core_api:: telemetry:: TelemetryOptionsBuilder ;
284-
285- /// Turn on logging to the console
286- #[ allow( dead_code) ] // Not always used, called to enable for debugging when needed
287- pub fn test_telem_console ( ) {
288- telemetry_init_global (
289- TelemetryOptionsBuilder :: default ( )
290- . logging ( Logger :: Console {
291- filter : construct_filter_string ( Level :: DEBUG , Level :: WARN ) ,
292- } )
293- . build ( )
294- . unwrap ( ) ,
295- )
296- . unwrap ( ) ;
297- }
298- }
0 commit comments