1
1
import collections
2
2
import logging
3
3
import os
4
- import traceback
5
4
import typing
6
5
from typing import Optional # noqa:F401
7
6
from typing import cast # noqa:F401
@@ -47,7 +46,7 @@ def get_logger(name):
47
46
logger = manager .loggerDict [name ]
48
47
if isinstance (manager .loggerDict [name ], logging .PlaceHolder ):
49
48
placeholder = logger
50
- logger = _new_logger (name = name )
49
+ logger = DDLogger (name = name )
51
50
manager .loggerDict [name ] = logger
52
51
# DEV: `_fixupChildren` and `_fixupParents` have been around for awhile,
53
52
# DEV: but add the `hasattr` guard... just in case.
@@ -56,7 +55,7 @@ def get_logger(name):
56
55
if hasattr (manager , "_fixupParents" ):
57
56
manager ._fixupParents (logger )
58
57
else :
59
- logger = _new_logger (name = name )
58
+ logger = DDLogger (name = name )
60
59
manager .loggerDict [name ] = logger
61
60
if hasattr (manager , "_fixupParents" ):
62
61
manager ._fixupParents (logger )
@@ -65,13 +64,6 @@ def get_logger(name):
65
64
return cast (DDLogger , logger )
66
65
67
66
68
- def _new_logger (name ):
69
- if _TelemetryConfig .LOG_COLLECTION_ENABLED :
70
- if name .startswith ("ddtrace.contrib." ):
71
- return DDTelemetryLogger (name = name )
72
- return DDLogger (name = name )
73
-
74
-
75
67
def hasHandlers (self ):
76
68
# type: (DDLogger) -> bool
77
69
"""
@@ -142,14 +134,6 @@ def handle(self, record):
142
134
:param record: The log record being logged
143
135
:type record: ``logging.LogRecord``
144
136
"""
145
- if record .levelno >= logging .ERROR :
146
- # avoid circular import
147
- from ddtrace .internal import telemetry
148
-
149
- # currently we only have one error code
150
- full_file_name = os .path .join (record .pathname , record .filename )
151
- telemetry .telemetry_writer .add_error (1 , record .msg % record .args , full_file_name , record .lineno )
152
-
153
137
# If rate limiting has been disabled (`DD_TRACE_LOGGING_RATE=0`) then apply no rate limit
154
138
# If the logging is in debug, then do not apply any limits to any log
155
139
if not self .rate_limit or self .getEffectiveLevel () == logging .DEBUG :
@@ -186,91 +170,3 @@ def handle(self, record):
186
170
# Increment the count of records we have skipped
187
171
# DEV: `self.buckets[key]` is a tuple which is immutable so recreate instead
188
172
self .buckets [key ] = DDLogger .LoggingBucket (logging_bucket .bucket , logging_bucket .skipped + 1 )
189
-
190
-
191
- class DDTelemetryLogger (DDLogger ):
192
- """
193
- Logger that intercepts and reports exceptions to the telemetry.
194
- """
195
-
196
- def __init__ (self , * args , ** kwargs ):
197
- # type: (*Any, **Any) -> None
198
- """Constructor for ``DDTelemetryLogger``"""
199
- super (DDTelemetryLogger , self ).__init__ (* args , ** kwargs )
200
-
201
- self .telemetry_log_buckets = collections .defaultdict (
202
- lambda : DDLogger .LoggingBucket (0 , 0 )
203
- ) # type: DefaultDict[Tuple[str, int, str, int], DDLogger.LoggingBucket]
204
-
205
- def handle (self , record ):
206
- # type: (logging.LogRecord) -> None
207
-
208
- from ddtrace .internal .telemetry .constants import TELEMETRY_LOG_LEVEL
209
-
210
- key = (record .name , record .levelno , record .pathname , record .lineno )
211
- current_bucket = int (record .created / _TelemetryConfig .TELEMETRY_HEARTBEAT_INTERVAL )
212
- key_bucket = self .telemetry_log_buckets [key ]
213
- if key_bucket .bucket == current_bucket :
214
- self .telemetry_log_buckets [key ] = DDLogger .LoggingBucket (key_bucket .bucket , key_bucket .skipped + 1 )
215
- else :
216
- self .telemetry_log_buckets [key ] = DDLogger .LoggingBucket (current_bucket , 0 )
217
- level = (
218
- TELEMETRY_LOG_LEVEL .ERROR
219
- if record .levelno >= logging .ERROR
220
- else TELEMETRY_LOG_LEVEL .WARNING
221
- if record .levelno == logging .WARNING
222
- else TELEMETRY_LOG_LEVEL .DEBUG
223
- )
224
- from ddtrace .internal import telemetry
225
-
226
- tags = {
227
- "lib_language" : "python" ,
228
- }
229
- stack_trace = _format_stack_trace (record .exc_info ) if record .exc_info is not None else None
230
- if record .levelno >= logging .ERROR or stack_trace is not None :
231
- # Report only an error or an exception with a stack trace
232
- telemetry .telemetry_writer .add_log (
233
- level , record .msg , tags = tags , stack_trace = stack_trace , count = key_bucket .skipped + 1
234
- )
235
-
236
- super ().handle (record )
237
-
238
-
239
- def _format_stack_trace (exc_info ):
240
- exc_type , exc_value , exc_traceback = exc_info
241
- if exc_traceback :
242
- tb = traceback .extract_tb (exc_traceback )
243
- formatted_tb = ["Traceback (most recent call last):" ]
244
- for filename , lineno , funcname , srcline in tb :
245
- if _should_redact (filename ):
246
- formatted_tb .append (" <REDACTED>" )
247
- else :
248
- relative_filename = _format_file_path (filename )
249
- formatted_line = f' File "{ relative_filename } ", line { lineno } , in { funcname } \n { srcline } '
250
- formatted_tb .append (formatted_line )
251
- formatted_tb .append (f"{ exc_type .__module__ } .{ exc_type .__name__ } : { exc_value } " )
252
- return "\n " .join (formatted_tb )
253
- return None
254
-
255
-
256
- def _should_redact (filename ):
257
- return not "ddtrace" in filename
258
-
259
-
260
- CWD = os .getcwd ()
261
-
262
-
263
- def _format_file_path (filename ):
264
- try :
265
- return os .path .relpath (filename , start = CWD )
266
- except ValueError :
267
- return filename
268
-
269
-
270
- class _TelemetryConfig :
271
- TELEMETRY_ENABLED = os .getenv ("DD_INSTRUMENTATION_TELEMETRY_ENABLED" , "true" ).lower () in ("true" , "1" )
272
- LOG_COLLECTION_ENABLED = TELEMETRY_ENABLED and os .getenv ("DD_TELEMETRY_LOG_COLLECTION_ENABLED" , "true" ).lower () in (
273
- "true" ,
274
- "1" ,
275
- )
276
- TELEMETRY_HEARTBEAT_INTERVAL = int (os .getenv ("DD_TELEMETRY_HEARTBEAT_INTERVAL" , "60" ))
0 commit comments