From 905aefd6b94de705bb269e164c36eadd0d4ee816 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Thu, 29 Feb 2024 15:26:26 +0900 Subject: [PATCH] use time.time_ns() for better precision (#202) Signed-off-by: Inada Naoki --- fluent/event.py | 9 +++++---- fluent/sender.py | 14 ++++++++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/fluent/event.py b/fluent/event.py index c69e537..a8c4d7b 100644 --- a/fluent/event.py +++ b/fluent/event.py @@ -1,5 +1,3 @@ -import time - from fluent import sender @@ -7,5 +5,8 @@ class Event: def __init__(self, label, data, **kwargs): assert isinstance(data, dict), "data must be a dict" sender_ = kwargs.get("sender", sender.get_global_sender()) - timestamp = kwargs.get("time", int(time.time())) - sender_.emit_with_time(label, timestamp, data) + timestamp = kwargs.get("time", None) + if timestamp is not None: + sender_.emit_with_time(label, timestamp, data) + else: + sender_.emit(label, data) diff --git a/fluent/sender.py b/fluent/sender.py index 320ce78..fe5fd35 100644 --- a/fluent/sender.py +++ b/fluent/sender.py @@ -30,15 +30,21 @@ def close(): # pragma: no cover class EventTime(msgpack.ExtType): - def __new__(cls, timestamp): + def __new__(cls, timestamp, nanoseconds=None): seconds = int(timestamp) - nanoseconds = int(timestamp % 1 * 10**9) + if nanoseconds is None: + nanoseconds = int(timestamp % 1 * 10**9) return super().__new__( cls, code=0, data=struct.pack(">II", seconds, nanoseconds), ) + @classmethod + def from_unix_nano(cls, unix_nano): + seconds, nanos = divmod(unix_nano, 10**9) + return cls(seconds, nanos) + class FluentSender: def __init__( @@ -78,7 +84,7 @@ def __init__( def emit(self, label, data): if self.nanosecond_precision: - cur_time = EventTime(time.time()) + cur_time = EventTime.from_unix_nano(time.time_ns()) else: cur_time = int(time.time()) return self.emit_with_time(label, cur_time, data) @@ -129,7 +135,7 @@ def close(self): def _make_packet(self, label, timestamp, data): if label: - tag = ".".join((self.tag, label)) if self.tag else label + tag = f"{self.tag}.{label}" if self.tag else label else: tag = self.tag if self.nanosecond_precision and isinstance(timestamp, float):