microbootstrap 1.4.2__tar.gz → 1.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/PKG-INFO +7 -1
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/README.md +6 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/granian_server.py +3 -1
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/opentelemetry_instrument.py +23 -1
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/sentry_instrument.py +42 -0
- microbootstrap-1.5.0/pyproject.toml +173 -0
- microbootstrap-1.4.2/pyproject.toml → microbootstrap-1.5.0/pyproject.toml.orig +4 -1
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/__init__.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/__init__.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/base.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/fastapi.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/fastmcp.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/faststream.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/litestar.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/config/__init__.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/config/fastapi.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/config/fastmcp.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/config/faststream.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/config/litestar.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/console_writer.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/exceptions.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/helpers.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/__init__.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/base.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/cors_instrument.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/health_checks_instrument.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/instrument_box.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/logging_instrument.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/prometheus_instrument.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/pyroscope_instrument.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/swagger_instrument.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments_setupper.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/middlewares/__init__.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/middlewares/fastapi.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/middlewares/fastmcp.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/middlewares/litestar.py +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/py.typed +0 -0
- {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/settings.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: microbootstrap
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.5.0
|
|
4
4
|
Summary: Package for bootstrapping new micro-services
|
|
5
5
|
Keywords: python,microservice,bootstrap,opentelemetry,logging,error-tracing,litestar,fastapi,fastmcp,mcp
|
|
6
6
|
Author: community-of-python
|
|
@@ -378,6 +378,8 @@ class YourSettings(BaseServiceSettings):
|
|
|
378
378
|
sentry_additional_params: dict[str, typing.Any] = {}
|
|
379
379
|
sentry_tags: dict[str, str] | None = None
|
|
380
380
|
sentry_opentelemetry_trace_url_template: str | None = None
|
|
381
|
+
sentry_opentelemetry_baggage_keys: set[str] = set()
|
|
382
|
+
sentry_opentelemetry_baggage_url_templates: dict[str, str] = {}
|
|
381
383
|
|
|
382
384
|
... # Other settings here
|
|
383
385
|
```
|
|
@@ -397,6 +399,8 @@ Parameter descriptions:
|
|
|
397
399
|
- `sentry_additional_params` - Additional parameters to pass to Sentry SDK.
|
|
398
400
|
- `sentry_tags` - Tags to apply to all Sentry events.
|
|
399
401
|
- `sentry_opentelemetry_trace_url_template` - Template for OpenTelemetry trace URLs to add to Sentry events (example: `"https://example.com/traces/{trace_id}"`).
|
|
402
|
+
- `sentry_opentelemetry_baggage_keys` - Baggage keys to copy into searchable Sentry tags.
|
|
403
|
+
- `sentry_opentelemetry_baggage_url_templates` - Maps baggage keys to URL templates added to Sentry event extra data as `<key>_url`. The placeholder must match the baggage key and its value is URL-encoded (example: `{"conversation_id": "https://example.com/logs/{conversation_id}"}`).
|
|
400
404
|
|
|
401
405
|
### [Prometheus](https://prometheus.io/)
|
|
402
406
|
|
|
@@ -502,6 +506,7 @@ class YourSettings(BaseServiceSettings):
|
|
|
502
506
|
opentelemetry_insecure: bool = True
|
|
503
507
|
opentelemetry_instrumentors: list[OpenTelemetryInstrumentor] = []
|
|
504
508
|
opentelemetry_exclude_urls: list[str] = []
|
|
509
|
+
opentelemetry_baggage_span_attributes: dict[str, str] = {}
|
|
505
510
|
|
|
506
511
|
... # Other settings here
|
|
507
512
|
```
|
|
@@ -519,6 +524,7 @@ Parameters description:
|
|
|
519
524
|
- `opentelemetry_exclude_urls` - list of ignored urls.
|
|
520
525
|
- `opentelemetry_log_traces` - traces will be logged to stdout.
|
|
521
526
|
- `opentelemetry_generate_health_check_spans` - generate spans for health check handlers if `True`
|
|
527
|
+
- `opentelemetry_baggage_span_attributes` - maps allowed baggage keys to attributes added to local server and consumer spans.
|
|
522
528
|
|
|
523
529
|
These settings are subsequently passed to [opentelemetry](https://opentelemetry.io/), finalizing your Opentelemetry integration.
|
|
524
530
|
|
|
@@ -313,6 +313,8 @@ class YourSettings(BaseServiceSettings):
|
|
|
313
313
|
sentry_additional_params: dict[str, typing.Any] = {}
|
|
314
314
|
sentry_tags: dict[str, str] | None = None
|
|
315
315
|
sentry_opentelemetry_trace_url_template: str | None = None
|
|
316
|
+
sentry_opentelemetry_baggage_keys: set[str] = set()
|
|
317
|
+
sentry_opentelemetry_baggage_url_templates: dict[str, str] = {}
|
|
316
318
|
|
|
317
319
|
... # Other settings here
|
|
318
320
|
```
|
|
@@ -332,6 +334,8 @@ Parameter descriptions:
|
|
|
332
334
|
- `sentry_additional_params` - Additional parameters to pass to Sentry SDK.
|
|
333
335
|
- `sentry_tags` - Tags to apply to all Sentry events.
|
|
334
336
|
- `sentry_opentelemetry_trace_url_template` - Template for OpenTelemetry trace URLs to add to Sentry events (example: `"https://example.com/traces/{trace_id}"`).
|
|
337
|
+
- `sentry_opentelemetry_baggage_keys` - Baggage keys to copy into searchable Sentry tags.
|
|
338
|
+
- `sentry_opentelemetry_baggage_url_templates` - Maps baggage keys to URL templates added to Sentry event extra data as `<key>_url`. The placeholder must match the baggage key and its value is URL-encoded (example: `{"conversation_id": "https://example.com/logs/{conversation_id}"}`).
|
|
335
339
|
|
|
336
340
|
### [Prometheus](https://prometheus.io/)
|
|
337
341
|
|
|
@@ -437,6 +441,7 @@ class YourSettings(BaseServiceSettings):
|
|
|
437
441
|
opentelemetry_insecure: bool = True
|
|
438
442
|
opentelemetry_instrumentors: list[OpenTelemetryInstrumentor] = []
|
|
439
443
|
opentelemetry_exclude_urls: list[str] = []
|
|
444
|
+
opentelemetry_baggage_span_attributes: dict[str, str] = {}
|
|
440
445
|
|
|
441
446
|
... # Other settings here
|
|
442
447
|
```
|
|
@@ -454,6 +459,7 @@ Parameters description:
|
|
|
454
459
|
- `opentelemetry_exclude_urls` - list of ignored urls.
|
|
455
460
|
- `opentelemetry_log_traces` - traces will be logged to stdout.
|
|
456
461
|
- `opentelemetry_generate_health_check_spans` - generate spans for health check handlers if `True`
|
|
462
|
+
- `opentelemetry_baggage_span_attributes` - maps allowed baggage keys to attributes added to local server and consumer spans.
|
|
457
463
|
|
|
458
464
|
These settings are subsequently passed to [opentelemetry](https://opentelemetry.io/), finalizing your Opentelemetry integration.
|
|
459
465
|
|
|
@@ -27,13 +27,15 @@ GRANIAN_LOG_LEVELS_MAP = {
|
|
|
27
27
|
def create_granian_server(
|
|
28
28
|
target: str,
|
|
29
29
|
settings: ServerConfig,
|
|
30
|
+
*,
|
|
31
|
+
interface: Interfaces = Interfaces.ASGI,
|
|
30
32
|
**granian_options: typing.Any, # noqa: ANN401
|
|
31
33
|
) -> GranianServer[typing.Any]:
|
|
32
34
|
return granian.Granian(
|
|
33
35
|
target=target,
|
|
34
36
|
address=settings.server_host,
|
|
35
37
|
port=settings.server_port,
|
|
36
|
-
interface=
|
|
38
|
+
interface=interface,
|
|
37
39
|
workers=settings.server_workers_count,
|
|
38
40
|
log_level=GRANIAN_LOG_LEVELS_MAP[getattr(settings, "logging_log_level", logging.INFO)],
|
|
39
41
|
reload=settings.server_reload,
|
{microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/opentelemetry_instrument.py
RENAMED
|
@@ -6,6 +6,7 @@ import typing
|
|
|
6
6
|
|
|
7
7
|
import pydantic
|
|
8
8
|
import structlog
|
|
9
|
+
from opentelemetry import baggage
|
|
9
10
|
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
|
|
10
11
|
from opentelemetry.instrumentation.dependencies import DependencyConflictError
|
|
11
12
|
from opentelemetry.instrumentation.environment_variables import OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
|
|
@@ -15,7 +16,7 @@ from opentelemetry.sdk.trace import ReadableSpan, Span, SpanProcessor
|
|
|
15
16
|
from opentelemetry.sdk.trace import TracerProvider as SdkTracerProvider
|
|
16
17
|
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter, SimpleSpanProcessor
|
|
17
18
|
from opentelemetry.semconv.resource import ResourceAttributes
|
|
18
|
-
from opentelemetry.trace import format_span_id, set_tracer_provider
|
|
19
|
+
from opentelemetry.trace import SpanKind, format_span_id, set_tracer_provider
|
|
19
20
|
from opentelemetry.util._importlib_metadata import entry_points
|
|
20
21
|
|
|
21
22
|
from microbootstrap.instruments.base import BaseInstrumentConfig, Instrument
|
|
@@ -66,6 +67,7 @@ class OpentelemetryConfig(BaseInstrumentConfig):
|
|
|
66
67
|
)
|
|
67
68
|
opentelemetry_log_traces: bool = False
|
|
68
69
|
opentelemetry_generate_health_check_spans: bool = True
|
|
70
|
+
opentelemetry_baggage_span_attributes: dict[str, str] = pydantic.Field(default_factory=dict)
|
|
69
71
|
|
|
70
72
|
|
|
71
73
|
@typing.runtime_checkable
|
|
@@ -95,6 +97,22 @@ def _format_span(readable_span: ReadableSpan) -> str:
|
|
|
95
97
|
return typing.cast("str", readable_span.to_json(indent=None)) + os.linesep
|
|
96
98
|
|
|
97
99
|
|
|
100
|
+
class BaggageSpanProcessor(SpanProcessor):
|
|
101
|
+
def __init__(self, baggage_span_attributes: dict[str, str]) -> None:
|
|
102
|
+
self.baggage_span_attributes = baggage_span_attributes
|
|
103
|
+
|
|
104
|
+
def on_start(self, span: Span, parent_context: Context | None = None) -> None:
|
|
105
|
+
if span.kind not in {SpanKind.SERVER, SpanKind.CONSUMER}:
|
|
106
|
+
return
|
|
107
|
+
|
|
108
|
+
for baggage_key, span_attribute in self.baggage_span_attributes.items():
|
|
109
|
+
if (value := baggage.get_baggage(baggage_key, context=parent_context)) is not None:
|
|
110
|
+
span.set_attribute(span_attribute, str(value))
|
|
111
|
+
|
|
112
|
+
def on_end(self, span: ReadableSpan) -> None:
|
|
113
|
+
pass
|
|
114
|
+
|
|
115
|
+
|
|
98
116
|
class BaseOpentelemetryInstrument(Instrument[OpentelemetryConfigT]):
|
|
99
117
|
instrument_name = "Opentelemetry"
|
|
100
118
|
ready_condition = "Provide all necessary config parameters"
|
|
@@ -145,6 +163,10 @@ class BaseOpentelemetryInstrument(Instrument[OpentelemetryConfigT]):
|
|
|
145
163
|
resource: typing.Final = resources.Resource.create(attributes=attributes)
|
|
146
164
|
|
|
147
165
|
self.tracer_provider = SdkTracerProvider(resource=resource)
|
|
166
|
+
if self.instrument_config.opentelemetry_baggage_span_attributes:
|
|
167
|
+
self.tracer_provider.add_span_processor(
|
|
168
|
+
BaggageSpanProcessor(self.instrument_config.opentelemetry_baggage_span_attributes),
|
|
169
|
+
)
|
|
148
170
|
if self.instrument_config.pyroscope_endpoint and pyroscope:
|
|
149
171
|
self.tracer_provider.add_span_processor(PyroscopeSpanProcessor())
|
|
150
172
|
|
{microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/sentry_instrument.py
RENAMED
|
@@ -2,10 +2,12 @@ from __future__ import annotations
|
|
|
2
2
|
import contextlib
|
|
3
3
|
import functools
|
|
4
4
|
import typing
|
|
5
|
+
import urllib.parse
|
|
5
6
|
|
|
6
7
|
import orjson
|
|
7
8
|
import pydantic
|
|
8
9
|
import sentry_sdk
|
|
10
|
+
from opentelemetry import baggage
|
|
9
11
|
from sentry_sdk import _types as sentry_types
|
|
10
12
|
from sentry_sdk.integrations import Integration # noqa: TC002
|
|
11
13
|
|
|
@@ -26,6 +28,8 @@ class SentryConfig(BaseInstrumentConfig):
|
|
|
26
28
|
sentry_tags: dict[str, str] | None = None
|
|
27
29
|
sentry_before_send: typing.Callable[[typing.Any, typing.Any], typing.Any | None] | None = None
|
|
28
30
|
sentry_opentelemetry_trace_url_template: str | None = None
|
|
31
|
+
sentry_opentelemetry_baggage_keys: set[str] = pydantic.Field(default_factory=set)
|
|
32
|
+
sentry_opentelemetry_baggage_url_templates: dict[str, str] = pydantic.Field(default_factory=dict)
|
|
29
33
|
|
|
30
34
|
|
|
31
35
|
IGNORED_STRUCTLOG_ATTRIBUTES: typing.Final = frozenset({"event", "level", "logger", "tracing", "timestamp"})
|
|
@@ -72,6 +76,34 @@ def add_trace_url_to_event(
|
|
|
72
76
|
return event
|
|
73
77
|
|
|
74
78
|
|
|
79
|
+
def enrich_sentry_event_from_opentelemetry_baggage(
|
|
80
|
+
baggage_keys: set[str],
|
|
81
|
+
baggage_url_templates: dict[str, str],
|
|
82
|
+
event: sentry_types.Event,
|
|
83
|
+
_hint: sentry_types.Hint,
|
|
84
|
+
) -> sentry_types.Event:
|
|
85
|
+
baggage_values = {
|
|
86
|
+
key: value
|
|
87
|
+
for key in baggage_keys.union(baggage_url_templates)
|
|
88
|
+
if (value := baggage.get_baggage(key)) is not None
|
|
89
|
+
}
|
|
90
|
+
if not baggage_values:
|
|
91
|
+
return event
|
|
92
|
+
|
|
93
|
+
if tag_values := {key: str(baggage_values[key]) for key in baggage_keys if key in baggage_values}:
|
|
94
|
+
event.setdefault("tags", {}).update(tag_values)
|
|
95
|
+
|
|
96
|
+
for key, url_template in baggage_url_templates.items():
|
|
97
|
+
placeholder = f"{{{key}}}"
|
|
98
|
+
if key not in baggage_values or placeholder not in url_template:
|
|
99
|
+
continue
|
|
100
|
+
event.setdefault("extra", {})[f"{key}_url"] = url_template.replace(
|
|
101
|
+
placeholder,
|
|
102
|
+
urllib.parse.quote(str(baggage_values[key]), safe=""),
|
|
103
|
+
)
|
|
104
|
+
return event
|
|
105
|
+
|
|
106
|
+
|
|
75
107
|
def wrap_before_send_callbacks(*callbacks: sentry_types.EventProcessor | None) -> sentry_types.EventProcessor:
|
|
76
108
|
def run_before_send(event: sentry_types.Event, hint: sentry_types.Hint) -> sentry_types.Event | None:
|
|
77
109
|
for callback in callbacks:
|
|
@@ -109,6 +141,16 @@ class SentryInstrument(Instrument[SentryConfig]):
|
|
|
109
141
|
)
|
|
110
142
|
if self.instrument_config.sentry_opentelemetry_trace_url_template
|
|
111
143
|
else None,
|
|
144
|
+
functools.partial(
|
|
145
|
+
enrich_sentry_event_from_opentelemetry_baggage,
|
|
146
|
+
self.instrument_config.sentry_opentelemetry_baggage_keys,
|
|
147
|
+
self.instrument_config.sentry_opentelemetry_baggage_url_templates,
|
|
148
|
+
)
|
|
149
|
+
if (
|
|
150
|
+
self.instrument_config.sentry_opentelemetry_baggage_keys
|
|
151
|
+
or self.instrument_config.sentry_opentelemetry_baggage_url_templates
|
|
152
|
+
)
|
|
153
|
+
else None,
|
|
112
154
|
self.instrument_config.sentry_before_send,
|
|
113
155
|
),
|
|
114
156
|
integrations=self.instrument_config.sentry_integrations,
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "microbootstrap"
|
|
3
|
+
description = "Package for bootstrapping new micro-services"
|
|
4
|
+
readme = "README.md"
|
|
5
|
+
requires-python = ">=3.10,<4"
|
|
6
|
+
keywords = [
|
|
7
|
+
"python",
|
|
8
|
+
"microservice",
|
|
9
|
+
"bootstrap",
|
|
10
|
+
"opentelemetry",
|
|
11
|
+
"logging",
|
|
12
|
+
"error-tracing",
|
|
13
|
+
"litestar",
|
|
14
|
+
"fastapi",
|
|
15
|
+
"fastmcp",
|
|
16
|
+
"mcp",
|
|
17
|
+
]
|
|
18
|
+
classifiers = [
|
|
19
|
+
"Typing :: Typed",
|
|
20
|
+
"Topic :: Software Development :: Build Tools",
|
|
21
|
+
"Operating System :: MacOS",
|
|
22
|
+
"Operating System :: Microsoft",
|
|
23
|
+
"Operating System :: POSIX :: Linux",
|
|
24
|
+
"Intended Audience :: Developers",
|
|
25
|
+
"Programming Language :: Python",
|
|
26
|
+
"Programming Language :: Python :: 3",
|
|
27
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
28
|
+
"Programming Language :: Python :: 3.10",
|
|
29
|
+
"Programming Language :: Python :: 3.11",
|
|
30
|
+
"Programming Language :: Python :: 3.12",
|
|
31
|
+
"Programming Language :: Python :: 3.13",
|
|
32
|
+
"Programming Language :: Python :: 3.14",
|
|
33
|
+
]
|
|
34
|
+
dependencies = [
|
|
35
|
+
"eval-type-backport>=0.2",
|
|
36
|
+
"opentelemetry-api>=1.30.0",
|
|
37
|
+
"opentelemetry-exporter-otlp>=1.15.0",
|
|
38
|
+
"opentelemetry-exporter-prometheus-remote-write>=0.46b0",
|
|
39
|
+
"opentelemetry-instrumentation>=0.46b0",
|
|
40
|
+
"opentelemetry-instrumentation-system-metrics>=0.46b0",
|
|
41
|
+
"opentelemetry-sdk>=1.30.0",
|
|
42
|
+
"pydantic-settings>=2",
|
|
43
|
+
"rich>=13",
|
|
44
|
+
"sentry-sdk>=2.7",
|
|
45
|
+
"structlog>=24",
|
|
46
|
+
"pyroscope-io>=1.0.0; platform_system != 'Windows'",
|
|
47
|
+
"opentelemetry-distro[otlp]>=0.54b1",
|
|
48
|
+
"opentelemetry-instrumentation-aio-pika>=0.54b1",
|
|
49
|
+
"opentelemetry-instrumentation-aiohttp-client>=0.54b1",
|
|
50
|
+
"opentelemetry-instrumentation-aiokafka>=0.54b1",
|
|
51
|
+
"opentelemetry-instrumentation-asyncpg>=0.54b1",
|
|
52
|
+
"opentelemetry-instrumentation-httpx>=0.54b1",
|
|
53
|
+
"opentelemetry-instrumentation-logging>=0.54b1",
|
|
54
|
+
"opentelemetry-instrumentation-redis>=0.54b1",
|
|
55
|
+
"opentelemetry-instrumentation-psycopg>=0.54b1",
|
|
56
|
+
"opentelemetry-instrumentation-sqlalchemy>=0.54b1",
|
|
57
|
+
"opentelemetry-instrumentation-asyncio>=0.54b1",
|
|
58
|
+
"opentelemetry-instrumentation-asgi>=0.46b0",
|
|
59
|
+
"orjson>=3.10.18",
|
|
60
|
+
]
|
|
61
|
+
version = "1.5.0"
|
|
62
|
+
|
|
63
|
+
[[project.authors]]
|
|
64
|
+
name = "community-of-python"
|
|
65
|
+
|
|
66
|
+
[project.optional-dependencies]
|
|
67
|
+
fastapi = [
|
|
68
|
+
"fastapi>=0.100",
|
|
69
|
+
"fastapi-offline-docs>=1",
|
|
70
|
+
"opentelemetry-instrumentation-fastapi>=0.46b0",
|
|
71
|
+
"prometheus-fastapi-instrumentator>=6.1",
|
|
72
|
+
]
|
|
73
|
+
litestar = [
|
|
74
|
+
"litestar>=2.9",
|
|
75
|
+
"litestar-offline-docs>=1",
|
|
76
|
+
"prometheus-client>=0.20",
|
|
77
|
+
]
|
|
78
|
+
granian = ["granian[reload]>=1"]
|
|
79
|
+
faststream = [
|
|
80
|
+
"faststream~=0.6.2",
|
|
81
|
+
"prometheus-client>=0.20",
|
|
82
|
+
]
|
|
83
|
+
fastmcp = [
|
|
84
|
+
"fastmcp>=2,<4",
|
|
85
|
+
"prometheus-client>=0.20",
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
[dependency-groups]
|
|
89
|
+
dev = [
|
|
90
|
+
"anyio>=4.8.0",
|
|
91
|
+
"httpx>=0.28.1",
|
|
92
|
+
"mypy>=1.14.1",
|
|
93
|
+
"pre-commit>=4.0.1",
|
|
94
|
+
"pytest>=8.3.4",
|
|
95
|
+
"pytest-cov>=6.0.0",
|
|
96
|
+
"pytest-mock>=3.14.0",
|
|
97
|
+
"pytest-xdist>=3.6.1",
|
|
98
|
+
"redis>=5.2.1",
|
|
99
|
+
"ruff>=0.9.1",
|
|
100
|
+
"trio>=0.28.0",
|
|
101
|
+
"typing-extensions>=4.12.2",
|
|
102
|
+
]
|
|
103
|
+
|
|
104
|
+
[build-system]
|
|
105
|
+
requires = ["uv_build"]
|
|
106
|
+
build-backend = "uv_build"
|
|
107
|
+
|
|
108
|
+
[tool.uv.build-backend]
|
|
109
|
+
module-name = "microbootstrap"
|
|
110
|
+
module-root = ""
|
|
111
|
+
|
|
112
|
+
[tool.mypy]
|
|
113
|
+
plugins = ["pydantic.mypy"]
|
|
114
|
+
files = [
|
|
115
|
+
"microbootstrap",
|
|
116
|
+
"tests",
|
|
117
|
+
]
|
|
118
|
+
python_version = "3.10"
|
|
119
|
+
strict = true
|
|
120
|
+
pretty = true
|
|
121
|
+
show_error_codes = true
|
|
122
|
+
|
|
123
|
+
[tool.ruff]
|
|
124
|
+
target-version = "py310"
|
|
125
|
+
line-length = 120
|
|
126
|
+
|
|
127
|
+
[tool.ruff.format]
|
|
128
|
+
exclude = ["README.md"]
|
|
129
|
+
docstring-code-format = true
|
|
130
|
+
|
|
131
|
+
[tool.ruff.lint]
|
|
132
|
+
select = ["ALL"]
|
|
133
|
+
ignore = [
|
|
134
|
+
"CPY001",
|
|
135
|
+
"EM",
|
|
136
|
+
"FBT",
|
|
137
|
+
"TRY003",
|
|
138
|
+
"FIX002",
|
|
139
|
+
"TD003",
|
|
140
|
+
"D1",
|
|
141
|
+
"D106",
|
|
142
|
+
"D203",
|
|
143
|
+
"D213",
|
|
144
|
+
"G004",
|
|
145
|
+
"FA",
|
|
146
|
+
"COM812",
|
|
147
|
+
"ISC001",
|
|
148
|
+
"PLR0917",
|
|
149
|
+
]
|
|
150
|
+
|
|
151
|
+
[tool.ruff.lint.isort]
|
|
152
|
+
no-lines-before = [
|
|
153
|
+
"standard-library",
|
|
154
|
+
"local-folder",
|
|
155
|
+
]
|
|
156
|
+
lines-after-imports = 2
|
|
157
|
+
|
|
158
|
+
[tool.ruff.lint.extend-per-file-ignores]
|
|
159
|
+
"tests/*.py" = [
|
|
160
|
+
"S101",
|
|
161
|
+
"S311",
|
|
162
|
+
]
|
|
163
|
+
"examples/*.py" = ["INP001"]
|
|
164
|
+
|
|
165
|
+
[tool.coverage.report]
|
|
166
|
+
exclude_also = [
|
|
167
|
+
"if typing.TYPE_CHECKING:",
|
|
168
|
+
'class \w+\(typing.Protocol\):',
|
|
169
|
+
]
|
|
170
|
+
omit = ["tests/*"]
|
|
171
|
+
|
|
172
|
+
[tool.pytest.ini_options]
|
|
173
|
+
addopts = "--cov=. -p no:warnings --cov-report term-missing"
|
|
@@ -58,7 +58,7 @@ dependencies = [
|
|
|
58
58
|
"opentelemetry-instrumentation-asgi>=0.46b0",
|
|
59
59
|
"orjson>=3.10.18",
|
|
60
60
|
]
|
|
61
|
-
version = "1.
|
|
61
|
+
version = "1.5.0"
|
|
62
62
|
authors = [{ name = "community-of-python" }]
|
|
63
63
|
|
|
64
64
|
[project.optional-dependencies]
|
|
@@ -114,11 +114,13 @@ target-version = "py310"
|
|
|
114
114
|
line-length = 120
|
|
115
115
|
|
|
116
116
|
[tool.ruff.format]
|
|
117
|
+
exclude = ["README.md"]
|
|
117
118
|
docstring-code-format = true
|
|
118
119
|
|
|
119
120
|
[tool.ruff.lint]
|
|
120
121
|
select = ["ALL"]
|
|
121
122
|
ignore = [
|
|
123
|
+
"CPY001",
|
|
122
124
|
"EM",
|
|
123
125
|
"FBT",
|
|
124
126
|
"TRY003",
|
|
@@ -132,6 +134,7 @@ ignore = [
|
|
|
132
134
|
"FA",
|
|
133
135
|
"COM812",
|
|
134
136
|
"ISC001",
|
|
137
|
+
"PLR0917",
|
|
135
138
|
]
|
|
136
139
|
|
|
137
140
|
[tool.ruff.lint.isort]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/health_checks_instrument.py
RENAMED
|
File without changes
|
|
File without changes
|
{microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/logging_instrument.py
RENAMED
|
File without changes
|
{microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/prometheus_instrument.py
RENAMED
|
File without changes
|
{microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/pyroscope_instrument.py
RENAMED
|
File without changes
|
{microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/swagger_instrument.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|