Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

84 linhas
2.3 KiB

  1. # NOTE: this is the logger sentry exposes to users, not some generic logger.
  2. import functools
  3. import time
  4. from typing import Any
  5. from sentry_sdk import get_client
  6. from sentry_sdk.utils import safe_repr
  7. OTEL_RANGES = [
  8. # ((severity level range), severity text)
  9. # https://opentelemetry.io/docs/specs/otel/logs/data-model
  10. ((1, 4), "trace"),
  11. ((5, 8), "debug"),
  12. ((9, 12), "info"),
  13. ((13, 16), "warn"),
  14. ((17, 20), "error"),
  15. ((21, 24), "fatal"),
  16. ]
  17. def _capture_log(severity_text, severity_number, template, **kwargs):
  18. # type: (str, int, str, **Any) -> None
  19. client = get_client()
  20. attrs = {
  21. "sentry.message.template": template,
  22. } # type: dict[str, str | bool | float | int]
  23. if "attributes" in kwargs:
  24. attrs.update(kwargs.pop("attributes"))
  25. for k, v in kwargs.items():
  26. attrs[f"sentry.message.parameter.{k}"] = v
  27. attrs = {
  28. k: (
  29. v
  30. if (
  31. isinstance(v, str)
  32. or isinstance(v, int)
  33. or isinstance(v, bool)
  34. or isinstance(v, float)
  35. )
  36. else safe_repr(v)
  37. )
  38. for (k, v) in attrs.items()
  39. }
  40. # noinspection PyProtectedMember
  41. client._capture_experimental_log(
  42. {
  43. "severity_text": severity_text,
  44. "severity_number": severity_number,
  45. "attributes": attrs,
  46. "body": template.format(**kwargs),
  47. "time_unix_nano": time.time_ns(),
  48. "trace_id": None,
  49. },
  50. )
  51. trace = functools.partial(_capture_log, "trace", 1)
  52. debug = functools.partial(_capture_log, "debug", 5)
  53. info = functools.partial(_capture_log, "info", 9)
  54. warning = functools.partial(_capture_log, "warn", 13)
  55. error = functools.partial(_capture_log, "error", 17)
  56. fatal = functools.partial(_capture_log, "fatal", 21)
  57. def _otel_severity_text(otel_severity_number):
  58. # type: (int) -> str
  59. for (lower, upper), severity in OTEL_RANGES:
  60. if lower <= otel_severity_number <= upper:
  61. return severity
  62. return "default"
  63. def _log_level_to_otel(level, mapping):
  64. # type: (int, dict[Any, int]) -> tuple[int, str]
  65. for py_level, otel_severity_number in sorted(mapping.items(), reverse=True):
  66. if level >= py_level:
  67. return otel_severity_number, _otel_severity_text(otel_severity_number)
  68. return 0, "default"