Skip to content

Commit

Permalink
skip export retry on pyodide (#823)
Browse files Browse the repository at this point in the history
  • Loading branch information
samuelcolvin authored Jan 27, 2025
1 parent 4eedfe0 commit 52dc65f
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 7 deletions.
4 changes: 2 additions & 2 deletions logfire/_internal/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import functools
import json
import os
import platform
import re
import sys
import time
Expand Down Expand Up @@ -92,6 +91,7 @@
UnexpectedResponse,
ensure_data_dir_exists,
handle_internal_errors,
platform_is_emscripten,
read_toml_file,
suppress_instrumentation,
)
Expand Down Expand Up @@ -709,7 +709,7 @@ def _initialize(self) -> None:
if self._initialized: # pragma: no cover
return

emscripten = platform.system().lower() == 'emscripten'
emscripten = platform_is_emscripten()

with suppress_instrumentation():
otel_resource_attributes: dict[str, Any] = {
Expand Down
8 changes: 5 additions & 3 deletions logfire/_internal/exporters/otlp.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import logfire

from ..stack_info import STACK_INFO_KEYS
from ..utils import logger, truncate_string
from ..utils import logger, platform_is_emscripten, truncate_string
from .wrapper import WrapperSpanExporter


Expand Down Expand Up @@ -50,7 +50,9 @@ def post(self, url: str, data: bytes, **kwargs: Any): # type: ignore
# If we do this we must measure and limit the amount of time spent requesting and retrying.
# TODO consider increasing the BatchSpanProcessor export delay here
# to reduce the number of small inefficient requests.
self.retryer.add_task(data, {'url': url, **kwargs})
# No threads in Emscripten, we can't add a task to try later, just raise
if not platform_is_emscripten(): # pragma: no branch
self.retryer.add_task(data, {'url': url, **kwargs})
raise

return response
Expand Down Expand Up @@ -133,7 +135,7 @@ def add_task(self, data: bytes, kwargs: dict[str, Any]):
if self._should_log():
logger.error('Export and retry failed: %s', e)

def _should_log(self):
def _should_log(self) -> bool:
result = time.monotonic() - self.last_log_time >= self.LOG_INTERVAL
if result:
self.last_log_time = time.monotonic()
Expand Down
9 changes: 9 additions & 0 deletions logfire/_internal/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import json
import logging
import os
import platform
import random
import sys
from contextlib import contextmanager
Expand Down Expand Up @@ -396,3 +397,11 @@ def generate_trace_id(self) -> int:
while trace_id == trace_api.INVALID_TRACE_ID: # pragma: no cover
trace_id = ulid(self.random, self._ms_timestamp_generator)
return trace_id


def platform_is_emscripten() -> bool:
"""Return True if the platform is Emscripten, e.g. Pyodide.
Threads cannot be created on Emscripten, so we need to avoid any code that creates threads.
"""
return platform.system().lower() == 'emscripten'
4 changes: 2 additions & 2 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 52dc65f

Please sign in to comment.