【发布时间】:2016-02-08 08:38:19
【问题描述】:
我想记录很多指标,例如函数执行所需的时间。我希望解决方案是轻量级的。添加一个装饰器并完成。也许 90% 的时间是这样的:
@LogMetrics
def my_business_logic(var1):
print 'done'
但是,我还希望能够在 10% 的时间内访问指标对象并执行类似的操作:
@LogMetrics
def my_business_logic(var1):
metrics.inc_counter('counter_a')
print 'done'
到目前为止,我有一个处理第一个场景的装饰器:
class LogMetrics(object):
def __init__(self, module=None):
self.module = module
def __call__(self, target):
def wrapped(*args, **kwargs):
# set up metrics
metrics = Metrics(module=module)
metrics.start_timer()
try:
result = target(*args, **kwargs)
except Exception as e:
metrics.set_fault()
raise e
finally:
metrics.stop_timer()
metrics.push()
return result
return wrapped
如何支持方案 2?我想做类似answer 的事情,但共识似乎是不这样做。请帮忙...
【问题讨论】:
-
神奇地与
globals()搞混确实是一个非常糟糕的主意,不要那样做。如果必须,只需创建一个老式的单例。 -
当我需要在任何地方使用这个指标对象时,单例如何提供帮助?
-
您可以添加一些全局/静态字典,它将存储您想要装饰的所有函数和方法的 {qualname: Metric} 字典。然后在 LogMetric.__call__ 中,您可以为包装函数获取适当的 Metric。
标签: python python-2.7 logging python-decorators