diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..da134a28 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.git +infrastructure/aws/cdk.out +.venv +.mypy_cache +.pytest_cache +.ruff_cache + diff --git a/.github/actions/cdk-deploy/action.yml b/.github/actions/cdk-deploy/action.yml index 2607a3d6..a965e4e7 100644 --- a/.github/actions/cdk-deploy/action.yml +++ b/.github/actions/cdk-deploy/action.yml @@ -36,15 +36,10 @@ runs: run: npm install -g aws-cdk@2 - name: Install uv - uses: astral-sh/setup-uv@v3 + uses: astral-sh/setup-uv@v7 with: version: "0.5.*" - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.12' - - name: Install dependencies shell: bash working-directory: ${{ inputs.dir }} diff --git a/Dockerfile b/Dockerfile index a29a01da..4b7c1e80 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,5 +26,5 @@ RUN if [ -z "$EARTHDATA_USERNAME" ] || [ -z "$EARTHDATA_PASSWORD" ]; then \ # http://www.uvicorn.org/settings/ ENV HOST 0.0.0.0 ENV PORT 80 -CMD uv run uvicorn titiler.cmr.main:app --host ${HOST} --port ${PORT} --log-level debug --reload +CMD uv run --no-dev uvicorn titiler.cmr.main:app --host ${HOST} --port ${PORT} --log-level debug --reload diff --git a/README.md b/README.md index e3aa465e..0e13cceb 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ The application will be available at this address: [http://localhost:8081/api.ht To run the application directly in your local environment, configure the application to access data over `HTTP` then run it using `uvicorn`: ```bash -TITILER_CMR_S3_AUTH_ACCESS=external uv run uvicorn titiler.cmr.main:app --reload +TITILER_CMR_S3_AUTH_ACCESS=external uv run uvicorn titiler.cmr.main:app --reload --log-level info ``` The application will be available at this address: [http://localhost:8000/api.html](http://localhost:8000/api.html) diff --git a/docs/examples/rasterio_backend_example.ipynb b/docs/examples/rasterio_backend_example.ipynb index 769e9185..226922c1 100644 --- a/docs/examples/rasterio_backend_example.ipynb +++ b/docs/examples/rasterio_backend_example.ipynb @@ -41,10 +41,12 @@ "outputs": [], "source": [ "# titiler_endpoint = \"http://localhost:8081\" # docker network endpoint\n", + "# titiler_endpoint = (\n", + "# \"https://staging.openveda.cloud/api/titiler-cmr\" # VEDA staging endpoint\n", + "# )\n", "titiler_endpoint = (\n", - " \"https://staging.openveda.cloud/api/titiler-cmr\" # VEDA staging endpoint\n", - ")\n", - "# titiler_endpoint = \"https://v4jec6i5c0.execute-api.us-west-2.amazonaws.com\" # dev endpoint" + " \"https://v4jec6i5c0.execute-api.us-west-2.amazonaws.com\" # dev endpoint\n", + ")" ] }, { @@ -197,6 +199,7 @@ " (\"minzoom\", 8),\n", " (\"maxzoom\", 13),\n", " ),\n", + " timeout=None,\n", ").json()\n", "\n", "print(r)" @@ -260,6 +263,7 @@ " (\"minzoom\", 8),\n", " (\"maxzoom\", 13),\n", " ),\n", + " timeout=None,\n", ").json()\n", "\n", "m = Map(location=(47.9221313337365, -91.65432884883238), zoom_start=r[\"maxzoom\"] - 1)\n", @@ -337,7 +341,7 @@ " (\"bands\", \"B04\"),\n", " ),\n", " json=geojson,\n", - " timeout=30,\n", + " timeout=None,\n", ").json()\n", "\n", "print(json.dumps(r, indent=2))" diff --git a/docs/examples/time_series_example.ipynb b/docs/examples/time_series_example.ipynb index c560f7cb..b7480d05 100644 --- a/docs/examples/time_series_example.ipynb +++ b/docs/examples/time_series_example.ipynb @@ -178,6 +178,7 @@ " \"step\": \"P1W\",\n", " \"temporal_mode\": \"point\",\n", " },\n", + " timeout=None,\n", ").json()\n", "\n", "print(json.dumps(response, indent=2))" @@ -210,6 +211,7 @@ " \"step\": \"P1W\",\n", " \"temporal_mode\": \"interval\",\n", " },\n", + " timeout=None,\n", ").json()\n", "\n", "print(json.dumps(response, indent=2))" @@ -239,6 +241,7 @@ " [\"2024-10-01T00:00:01Z\", \"2024-10-07T00:00:01Z/2024-10-09T23:59:59Z\"]\n", " ),\n", " },\n", + " timeout=None,\n", ").json()\n", "\n", "print(json.dumps(response, indent=2))" diff --git a/docs/examples/xarray_backend_example.ipynb b/docs/examples/xarray_backend_example.ipynb index 0f434f38..8cc3f8a6 100644 --- a/docs/examples/xarray_backend_example.ipynb +++ b/docs/examples/xarray_backend_example.ipynb @@ -184,6 +184,7 @@ " (\"rescale\", \"0,1\"),\n", " (\"colormap_name\", \"blues_r\"),\n", " ),\n", + " timeout=None,\n", ").json()\n", "\n", "print(r)" @@ -258,7 +259,7 @@ " (\"variable\", variable),\n", " ),\n", " json=geojson_dict,\n", - " timeout=60,\n", + " timeout=None,\n", ").json()\n", "\n", "print(json.dumps(r, indent=2))" @@ -319,7 +320,7 @@ " (\"sel_method\", \"nearest\"),\n", " ),\n", " json=geojson_dict,\n", - " timeout=60,\n", + " timeout=None,\n", ").json()\n", "\n", "print(json.dumps(r, indent=2))" @@ -354,7 +355,7 @@ " (\"sel_method\", \"nearest\"),\n", " ),\n", " json=geojson_dict,\n", - " timeout=60,\n", + " timeout=None,\n", ").json()\n", "\n", "print(json.dumps(r, indent=2))" diff --git a/infrastructure/aws/cdk/app.py b/infrastructure/aws/cdk/app.py index 0b0b728d..40ba7844 100644 --- a/infrastructure/aws/cdk/app.py +++ b/infrastructure/aws/cdk/app.py @@ -12,6 +12,7 @@ from aws_cdk import aws_sns as sns from aws_cdk import aws_sns_subscriptions as subscriptions from aws_cdk.aws_apigatewayv2_integrations import HttpLambdaIntegration +from aws_cdk.aws_ecr_assets import Platform from config import AppSettings, StackSettings from constructs import Construct @@ -65,27 +66,32 @@ def __init__( **DEFAULT_ENV, "TITILER_CMR_ROOT_PATH": app_settings.root_path, "TITILER_CMR_S3_AUTH_STRATEGY": app_settings.s3_auth_strategy, + "TITILER_CMR_TELEMETRY_ENABLED": "TRUE", + "OTEL_PYTHON_DISABLED_INSTRUMENTATIONS": "aws-lambda,requests,urllib3,aiohttp-client", # Disable aws-lambda auto-instrumentation (handled by otel_wrapper.py) + "OTEL_PROPAGATORS": "tracecontext,baggage,xray", + "OPENTELEMETRY_COLLECTOR_CONFIG_URI": "/opt/collector-config/config.yaml", + # AWS_LAMBDA_LOG_FORMAT not set - using custom JSON formatter in handler.py + "AWS_LAMBDA_EXEC_WRAPPER": "/opt/otel-instrument", # Enable OTEL wrapper to avoid circular import } if app_settings.aws_request_payer: lambda_env["AWS_REQUEST_PAYER"] = app_settings.aws_request_payer - lambda_function = aws_lambda.Function( + lambda_function = aws_lambda.DockerImageFunction( self, f"{id}-lambda", - runtime=runtime, - code=aws_lambda.Code.from_docker_build( - path=os.path.abspath(context_dir), + code=aws_lambda.DockerImageCode.from_image_asset( + directory=os.path.abspath(context_dir), file="infrastructure/aws/lambda/Dockerfile", - platform="linux/amd64", + platform=Platform.LINUX_AMD64, ), - handler="handler.handler", memory_size=memory, reserved_concurrent_executions=concurrent, timeout=Duration.seconds(timeout), environment=lambda_env, log_retention=logs.RetentionDays.ONE_WEEK, role=iam_reader_role, + tracing=aws_lambda.Tracing.ACTIVE, ) for perm in permissions: diff --git a/infrastructure/aws/lambda/Dockerfile b/infrastructure/aws/lambda/Dockerfile index 8674f1c7..1627d8db 100644 --- a/infrastructure/aws/lambda/Dockerfile +++ b/infrastructure/aws/lambda/Dockerfile @@ -1,36 +1,80 @@ ARG PYTHON_VERSION=3.12 -FROM --platform=linux/amd64 public.ecr.aws/lambda/python:${PYTHON_VERSION} +# Stage 1: OTEL +# Download the OpenTelemetry layer +# ref: https://github.com/athewsey/opentelemetry-lambda-container/blob/98069d5eb6d812ccd28d5c80e2f9d6c8a8c76fb9/python-example/lambda-function/Dockerfile +FROM public.ecr.aws/lambda/python:${PYTHON_VERSION} as otel-builder +RUN </dev/null || true +EOF -# copy libexpat.so.1 into /asset which is included in LD_LIBRARY_PATH -RUN cp /usr/lib64/libexpat.so.1 /asset/ +# Stage 3: Final runtime stage - minimal Lambda image optimized for container runtime +FROM public.ecr.aws/lambda/python:${PYTHON_VERSION} -# Reduce package size and remove useless files -RUN cd /asset && find . -type f -name '*.pyc' | while read f; do n=$(echo $f | sed 's/__pycache__\///' | sed 's/.cpython-[0-9]*//'); cp $f $n; done; -RUN cd /asset && find . -type d -a -name '__pycache__' -print0 | xargs -0 rm -rf -RUN cd /asset && find . -type f -a -name '*.py' -print0 | xargs -0 rm -f -RUN find /asset -type d -a -name 'tests' -print0 | xargs -0 rm -rf -RUN rm -rdf /asset/numpy/doc/ /asset/bin /asset/geos_license /asset/Misc -RUN rm -rdf /asset/boto3* -RUN rm -rdf /asset/botocore* +ENV PYTHONUNBUFFERED=1 \ + PYTHONDONTWRITEBYTECODE=1 -# Strip debug symbols from compiled C/C++ code (except for numpy.libs!) -RUN cd /asset && \ - find . -type f -name '*.so*' \ - -not -path "./numpy.libs/*" \ - -exec strip --strip-unneeded {} \; +COPY --from=otel-builder /opt-builder/ /opt/ +COPY infrastructure/aws/lambda/collector-config.yaml /opt/collector-config/config.yaml +COPY --from=builder /deps ${LAMBDA_RUNTIME_DIR}/ +COPY --from=builder /usr/lib64/libexpat.so.1 ${LAMBDA_RUNTIME_DIR}/ +COPY infrastructure/aws/lambda/handler.py ${LAMBDA_RUNTIME_DIR}/ -COPY infrastructure/aws/lambda/handler.py /asset/handler.py +RUN < None: app.state.cmr_auth = None -handler = Mangum(app, lifespan="off") +handler = Mangum( + app, + lifespan="off", + api_gateway_base_path=None, + text_mime_types=[ + "application/json", + "application/javascript", + "application/xml", + "application/vnd.api+json", + ], +) if "AWS_EXECUTION_ENV" in os.environ: loop = asyncio.get_event_loop() loop.run_until_complete(app.router.startup()) + + +def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]: + """Lambda handler with container-specific optimizations and OTEL tracing.""" + return handler(event, context) diff --git a/infrastructure/aws/requirements-cdk.txt b/infrastructure/aws/requirements-cdk.txt deleted file mode 100644 index 3508f3f7..00000000 --- a/infrastructure/aws/requirements-cdk.txt +++ /dev/null @@ -1,9 +0,0 @@ -# aws cdk -aws-cdk-lib==2.99.1 -aws_cdk-aws_apigatewayv2_alpha==2.99.1a0 -aws_cdk-aws_apigatewayv2_integrations_alpha==2.99.1a0 -constructs>=10.0.0 - -# pydantic settings -pydantic~=2.0 -pydantic-settings~=2.0 diff --git a/pyproject.toml b/pyproject.toml index ef6c486e..28d12d8e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,9 +54,7 @@ lambda = [ "mangum==0.19.0", "aiobotocore>=2.24.0,<2.24.2" ] -telemetry = [ - "titiler.core[telemetry]>=0.23.1,<0.24", -] + [dependency-groups] dev = [ "folium>=0.17.0", diff --git a/titiler/cmr/logger.py b/titiler/cmr/logger.py index ed81b751..5038d1b3 100644 --- a/titiler/cmr/logger.py +++ b/titiler/cmr/logger.py @@ -1,5 +1,178 @@ """titiler-cmr logger.""" +import json import logging +import os +from datetime import datetime, timezone + + +class JSONFormatter(logging.Formatter): + """JSON log formatter for local development.""" + + def format(self, record): + """Format log record as JSON.""" + log_entry = { + "timestamp": self.formatTime(record, "%Y-%m-%dT%H:%M:%S.%fZ"), + "level": record.levelname, + "logger": record.name, + "message": record.getMessage(), + "filename": record.filename, + "lineno": record.lineno, + } + + # Add any extra fields passed via the extra parameter + if hasattr(record, "__dict__"): + for key, value in record.__dict__.items(): + if key not in log_entry and not key.startswith("_"): + # Only add if it's not a standard logging attribute + if not hasattr(logging.LogRecord("", 0, "", 0, "", (), None), key): + log_entry[key] = value + + if record.exc_info: + log_entry["exception"] = self.formatException(record.exc_info) + + return json.dumps(log_entry) + + +def otel_trace_id_to_xray_format(otel_trace_id: str) -> str: + """ + Convert OpenTelemetry trace ID to X-Ray format. + + OTEL format: 32 hex chars (e.g., "68eeb2ec45b07caf760899f308d34ab6") + X-Ray format: "1-{first 8 chars}-{remaining 24 chars}" (e.g., "1-68eeb2ec-45b07caf760899f308d34ab6") + + The first 8 hex chars represent the Unix timestamp, which is how X-Ray generates compatible IDs. + """ + if len(otel_trace_id) == 32: + return f"1-{otel_trace_id[:8]}-{otel_trace_id[8:]}" + return otel_trace_id + + +class XRayJsonFormatter(logging.Formatter): + """ + Custom JSON formatter that includes X-Ray trace ID for log correlation. + + This formatter outputs logs as JSON and includes: + - Standard log fields (timestamp, level, message, logger) + - X-Ray trace ID (converted from OTEL format) + - OTEL trace context fields (if present) + - Any extra fields passed via logger.info("msg", extra={...}) + """ + + RESERVED_ATTRS = { + "name", + "msg", + "args", + "created", + "filename", + "funcName", + "levelname", + "levelno", + "lineno", + "module", + "msecs", + "message", + "pathname", + "process", + "processName", + "relativeCreated", + "thread", + "threadName", + "exc_info", + "exc_text", + "stack_info", + "taskName", + } + + def format(self, record: logging.LogRecord) -> str: # noqa: C901 + """Format log record as JSON with X-Ray trace ID.""" + log_object = { + "timestamp": datetime.fromtimestamp(record.created, tz=timezone.utc) + .isoformat() + .replace("+00:00", "Z"), + "level": record.levelname, + "message": record.getMessage(), + "logger": record.name, + } + + xray_trace_id = None + + trace_header = os.environ.get("_X_AMZN_TRACE_ID", "") + if trace_header: + for part in trace_header.split(";"): + if part.startswith("Root="): + xray_trace_id = part.split("=", 1)[1] + break + + if not xray_trace_id and hasattr(record, "otelTraceID"): + xray_trace_id = otel_trace_id_to_xray_format(record.otelTraceID) + + if xray_trace_id: + log_object["xray_trace_id"] = xray_trace_id + + if record.exc_info: + log_object["exception"] = self.formatException(record.exc_info) + + for attr in [ + "otelSpanID", + "otelTraceID", + "otelTraceSampled", + "otelServiceName", + ]: + if hasattr(record, attr): + log_object[attr] = getattr(record, attr) + + if hasattr(record, "aws_request_id"): + log_object["requestId"] = record.aws_request_id + + for key, value in record.__dict__.items(): + if key not in self.RESERVED_ATTRS and key not in log_object: + log_object[key] = value + + return json.dumps(log_object) + + +def configure_logging(): + """ + Configure logging for the application. + + This should be called once at application startup. + Automatically detects the environment and configures appropriately: + - AWS Lambda: Uses XRayJsonFormatter with X-Ray trace correlation + - Local dev: Uses JSONFormatter for simple JSON logs + + All log levels for application and third-party libraries are configured here. + """ + + logging.getLogger("titiler").setLevel(logging.INFO) + logging.getLogger("titiler-cmr").setLevel(logging.INFO) + + logging.getLogger("botocore").setLevel(logging.WARNING) + logging.getLogger("aiobotocore").setLevel(logging.WARNING) + logging.getLogger("earthaccess").setLevel(logging.WARNING) + logging.getLogger("urllib3").setLevel(logging.WARNING) + logging.getLogger("numexpr").setLevel(logging.WARNING) + + is_lambda = "AWS_EXECUTION_ENV" in os.environ + + if is_lambda: + root_logger = logging.getLogger() + root_logger.setLevel(logging.WARN) + + for log_handler in root_logger.handlers[:]: + root_logger.removeHandler(log_handler) + + json_handler = logging.StreamHandler() + json_handler.setFormatter(XRayJsonFormatter()) + root_logger.addHandler(json_handler) + + logging.getLogger("mangum.lifespan").setLevel(logging.ERROR) + logging.getLogger("mangum.http").setLevel(logging.ERROR) + else: + formatter = JSONFormatter() + handler = logging.StreamHandler() + handler.setFormatter(formatter) + logging.root.addHandler(handler) + logger = logging.getLogger("titiler-cmr") diff --git a/titiler/cmr/main.py b/titiler/cmr/main.py index 4b427309..dbf9f759 100644 --- a/titiler/cmr/main.py +++ b/titiler/cmr/main.py @@ -1,8 +1,5 @@ """TiTiler+cmr FastAPI application.""" -import json -import logging -import os from contextlib import asynccontextmanager import earthaccess @@ -14,12 +11,16 @@ from titiler.cmr import __version__ as titiler_cmr_version from titiler.cmr.errors import DEFAULT_STATUS_CODES as CMR_STATUS_CODES from titiler.cmr.factory import Endpoints +from titiler.cmr.logger import configure_logging from titiler.cmr.settings import ApiSettings, AuthSettings from titiler.cmr.timeseries import TimeseriesExtension from titiler.core.errors import DEFAULT_STATUS_CODES, add_exception_handlers from titiler.core.middleware import CacheControlMiddleware, LoggerMiddleware from titiler.mosaic.errors import MOSAIC_STATUS_CODES +# Configure logging at application startup +configure_logging() + jinja2_env = jinja2.Environment( loader=jinja2.ChoiceLoader( [ @@ -34,58 +35,6 @@ auth_config = AuthSettings() -class JSONFormatter(logging.Formatter): - """JSON log formatter similar to AWS Lambda.""" - - def format(self, record): - """format log record in json""" - log_entry = { - "timestamp": self.formatTime(record, "%Y-%m-%dT%H:%M:%S.%fZ"), - "level": record.levelname, - "logger": record.name, - "message": record.getMessage(), - "filename": record.filename, - "lineno": record.lineno, - } - - # Add any extra fields passed via the extra parameter - if hasattr(record, "__dict__"): - for key, value in record.__dict__.items(): - if key not in log_entry and not key.startswith("_"): - # Only add if it's not a standard logging attribute - if not hasattr(logging.LogRecord("", 0, "", 0, "", (), None), key): - log_entry[key] = value - - if record.exc_info: - log_entry["exception"] = self.formatException(record.exc_info) - - return json.dumps(log_entry) - - -log_level = os.getenv("LOG_LEVEL", "INFO") - -# Configure logging format based on AWS_LAMBDA_LOG_FORMAT -# Only use custom JSON formatter locally - AWS Lambda handles JSON formatting automatically -formatter: JSONFormatter | logging.Formatter -if "AWS_EXECUTION_ENV" not in os.environ: - formatter = JSONFormatter() -else: - formatter = logging.Formatter( - "%(asctime)s - %(name)s - %(filename)s:%(lineno)d - %(levelname)s - %(message)s" - ) - -handler = logging.StreamHandler() -handler.setFormatter(formatter) - -logging.basicConfig( - level=getattr(logging, log_level), - handlers=[handler], -) - -for module in ["botocore", "aiobotocore", "earthaccess"]: - logging.getLogger(module).setLevel("WARN") - - @asynccontextmanager async def lifespan(app: FastAPI): """FastAPI Lifespan.""" @@ -205,5 +154,6 @@ async def lifespan(app: FastAPI): title=settings.name, templates=templates, extensions=[TimeseriesExtension()], + enable_telemetry=settings.telemetry_enabled, ) app.include_router(endpoints.router) diff --git a/titiler/cmr/settings.py b/titiler/cmr/settings.py index 00f12528..2604ea59 100644 --- a/titiler/cmr/settings.py +++ b/titiler/cmr/settings.py @@ -18,6 +18,7 @@ class ApiSettings(BaseSettings): time_series_max_image_size: float = 5.625e7 time_series_statistics_max_total_size: float = 1.5e10 time_series_image_max_total_size: float = 1e8 + telemetry_enabled: bool = False debug: bool = False model_config = { diff --git a/uv.lock b/uv.lock index 3c9f2b0b..afa7e96c 100644 --- a/uv.lock +++ b/uv.lock @@ -189,15 +189,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419, upload-time = "2023-09-30T22:11:16.072Z" }, ] -[[package]] -name = "asgiref" -version = "3.9.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/61/0aa957eec22ff70b830b22ff91f825e70e1ef732c06666a805730f28b36b/asgiref-3.9.1.tar.gz", hash = "sha256:a5ab6582236218e5ef1648f242fd9f10626cfd4de8dc377db215d5d5098e3142", size = 36870, upload-time = "2025-07-08T09:07:43.344Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/3c/0464dcada90d5da0e71018c04a140ad6349558afb30b3051b4264cc5b965/asgiref-3.9.1-py3-none-any.whl", hash = "sha256:f3bba7092a48005b5f5bacd747d36ee4a5a61f4a269a6df590b43144355ebd2c", size = 23790, upload-time = "2025-07-08T09:07:41.548Z" }, -] - [[package]] name = "asttokens" version = "3.0.0" @@ -957,46 +948,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, ] -[[package]] -name = "googleapis-common-protos" -version = "1.70.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903, upload-time = "2025-04-14T10:17:02.924Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530, upload-time = "2025-04-14T10:17:01.271Z" }, -] - -[[package]] -name = "grpcio" -version = "1.74.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/38/b4/35feb8f7cab7239c5b94bd2db71abb3d6adb5f335ad8f131abb6060840b6/grpcio-1.74.0.tar.gz", hash = "sha256:80d1f4fbb35b0742d3e3d3bb654b7381cd5f015f8497279a1e9c21ba623e01b1", size = 12756048, upload-time = "2025-07-24T18:54:23.039Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/5d/e504d5d5c4469823504f65687d6c8fb97b7f7bf0b34873b7598f1df24630/grpcio-1.74.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:8533e6e9c5bd630ca98062e3a1326249e6ada07d05acf191a77bc33f8948f3d8", size = 5445551, upload-time = "2025-07-24T18:53:23.641Z" }, - { url = "https://files.pythonhosted.org/packages/43/01/730e37056f96f2f6ce9f17999af1556df62ee8dab7fa48bceeaab5fd3008/grpcio-1.74.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:2918948864fec2a11721d91568effffbe0a02b23ecd57f281391d986847982f6", size = 10979810, upload-time = "2025-07-24T18:53:25.349Z" }, - { url = "https://files.pythonhosted.org/packages/79/3d/09fd100473ea5c47083889ca47ffd356576173ec134312f6aa0e13111dee/grpcio-1.74.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:60d2d48b0580e70d2e1954d0d19fa3c2e60dd7cbed826aca104fff518310d1c5", size = 5941946, upload-time = "2025-07-24T18:53:27.387Z" }, - { url = "https://files.pythonhosted.org/packages/8a/99/12d2cca0a63c874c6d3d195629dcd85cdf5d6f98a30d8db44271f8a97b93/grpcio-1.74.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3601274bc0523f6dc07666c0e01682c94472402ac2fd1226fd96e079863bfa49", size = 6621763, upload-time = "2025-07-24T18:53:29.193Z" }, - { url = "https://files.pythonhosted.org/packages/9d/2c/930b0e7a2f1029bbc193443c7bc4dc2a46fedb0203c8793dcd97081f1520/grpcio-1.74.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:176d60a5168d7948539def20b2a3adcce67d72454d9ae05969a2e73f3a0feee7", size = 6180664, upload-time = "2025-07-24T18:53:30.823Z" }, - { url = "https://files.pythonhosted.org/packages/db/d5/ff8a2442180ad0867717e670f5ec42bfd8d38b92158ad6bcd864e6d4b1ed/grpcio-1.74.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e759f9e8bc908aaae0412642afe5416c9f983a80499448fcc7fab8692ae044c3", size = 6301083, upload-time = "2025-07-24T18:53:32.454Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ba/b361d390451a37ca118e4ec7dccec690422e05bc85fba2ec72b06cefec9f/grpcio-1.74.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e7c4389771855a92934b2846bd807fc25a3dfa820fd912fe6bd8136026b2707", size = 6994132, upload-time = "2025-07-24T18:53:34.506Z" }, - { url = "https://files.pythonhosted.org/packages/3b/0c/3a5fa47d2437a44ced74141795ac0251bbddeae74bf81df3447edd767d27/grpcio-1.74.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cce634b10aeab37010449124814b05a62fb5f18928ca878f1bf4750d1f0c815b", size = 6489616, upload-time = "2025-07-24T18:53:36.217Z" }, - { url = "https://files.pythonhosted.org/packages/ae/95/ab64703b436d99dc5217228babc76047d60e9ad14df129e307b5fec81fd0/grpcio-1.74.0-cp312-cp312-win32.whl", hash = "sha256:885912559974df35d92219e2dc98f51a16a48395f37b92865ad45186f294096c", size = 3807083, upload-time = "2025-07-24T18:53:37.911Z" }, - { url = "https://files.pythonhosted.org/packages/84/59/900aa2445891fc47a33f7d2f76e00ca5d6ae6584b20d19af9c06fa09bf9a/grpcio-1.74.0-cp312-cp312-win_amd64.whl", hash = "sha256:42f8fee287427b94be63d916c90399ed310ed10aadbf9e2e5538b3e497d269bc", size = 4490123, upload-time = "2025-07-24T18:53:39.528Z" }, - { url = "https://files.pythonhosted.org/packages/d4/d8/1004a5f468715221450e66b051c839c2ce9a985aa3ee427422061fcbb6aa/grpcio-1.74.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:2bc2d7d8d184e2362b53905cb1708c84cb16354771c04b490485fa07ce3a1d89", size = 5449488, upload-time = "2025-07-24T18:53:41.174Z" }, - { url = "https://files.pythonhosted.org/packages/94/0e/33731a03f63740d7743dced423846c831d8e6da808fcd02821a4416df7fa/grpcio-1.74.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:c14e803037e572c177ba54a3e090d6eb12efd795d49327c5ee2b3bddb836bf01", size = 10974059, upload-time = "2025-07-24T18:53:43.066Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c6/3d2c14d87771a421205bdca991467cfe473ee4c6a1231c1ede5248c62ab8/grpcio-1.74.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f6ec94f0e50eb8fa1744a731088b966427575e40c2944a980049798b127a687e", size = 5945647, upload-time = "2025-07-24T18:53:45.269Z" }, - { url = "https://files.pythonhosted.org/packages/c5/83/5a354c8aaff58594eef7fffebae41a0f8995a6258bbc6809b800c33d4c13/grpcio-1.74.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:566b9395b90cc3d0d0c6404bc8572c7c18786ede549cdb540ae27b58afe0fb91", size = 6626101, upload-time = "2025-07-24T18:53:47.015Z" }, - { url = "https://files.pythonhosted.org/packages/3f/ca/4fdc7bf59bf6994aa45cbd4ef1055cd65e2884de6113dbd49f75498ddb08/grpcio-1.74.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1ea6176d7dfd5b941ea01c2ec34de9531ba494d541fe2057c904e601879f249", size = 6182562, upload-time = "2025-07-24T18:53:48.967Z" }, - { url = "https://files.pythonhosted.org/packages/fd/48/2869e5b2c1922583686f7ae674937986807c2f676d08be70d0a541316270/grpcio-1.74.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:64229c1e9cea079420527fa8ac45d80fc1e8d3f94deaa35643c381fa8d98f362", size = 6303425, upload-time = "2025-07-24T18:53:50.847Z" }, - { url = "https://files.pythonhosted.org/packages/a6/0e/bac93147b9a164f759497bc6913e74af1cb632c733c7af62c0336782bd38/grpcio-1.74.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:0f87bddd6e27fc776aacf7ebfec367b6d49cad0455123951e4488ea99d9b9b8f", size = 6996533, upload-time = "2025-07-24T18:53:52.747Z" }, - { url = "https://files.pythonhosted.org/packages/84/35/9f6b2503c1fd86d068b46818bbd7329db26a87cdd8c01e0d1a9abea1104c/grpcio-1.74.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3b03d8f2a07f0fea8c8f74deb59f8352b770e3900d143b3d1475effcb08eec20", size = 6491489, upload-time = "2025-07-24T18:53:55.06Z" }, - { url = "https://files.pythonhosted.org/packages/75/33/a04e99be2a82c4cbc4039eb3a76f6c3632932b9d5d295221389d10ac9ca7/grpcio-1.74.0-cp313-cp313-win32.whl", hash = "sha256:b6a73b2ba83e663b2480a90b82fdae6a7aa6427f62bf43b29912c0cfd1aa2bfa", size = 3805811, upload-time = "2025-07-24T18:53:56.798Z" }, - { url = "https://files.pythonhosted.org/packages/34/80/de3eb55eb581815342d097214bed4c59e806b05f1b3110df03b2280d6dfd/grpcio-1.74.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd3c71aeee838299c5887230b8a1822795325ddfea635edd82954c1eaa831e24", size = 4489214, upload-time = "2025-07-24T18:53:59.771Z" }, -] - [[package]] name = "h11" version = "0.14.0" @@ -2024,188 +1975,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/86/09/a5ab407bd7f5f5599e6a9261f964ace03a73e7c6928de906981c31c38082/numpy-2.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", size = 12644098, upload-time = "2024-11-02T17:46:07.941Z" }, ] -[[package]] -name = "opentelemetry-api" -version = "1.36.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "importlib-metadata" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/27/d2/c782c88b8afbf961d6972428821c302bd1e9e7bc361352172f0ca31296e2/opentelemetry_api-1.36.0.tar.gz", hash = "sha256:9a72572b9c416d004d492cbc6e61962c0501eaf945ece9b5a0f56597d8348aa0", size = 64780, upload-time = "2025-07-29T15:12:06.02Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/ee/6b08dde0a022c463b88f55ae81149584b125a42183407dc1045c486cc870/opentelemetry_api-1.36.0-py3-none-any.whl", hash = "sha256:02f20bcacf666e1333b6b1f04e647dc1d5111f86b8e510238fcc56d7762cda8c", size = 65564, upload-time = "2025-07-29T15:11:47.998Z" }, -] - -[[package]] -name = "opentelemetry-exporter-otlp" -version = "1.36.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-exporter-otlp-proto-grpc" }, - { name = "opentelemetry-exporter-otlp-proto-http" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/95/7f/d31294ac28d567a14aefd855756bab79fed69c5a75df712f228f10c47e04/opentelemetry_exporter_otlp-1.36.0.tar.gz", hash = "sha256:72f166ea5a8923ac42889337f903e93af57db8893de200369b07401e98e4e06b", size = 6144, upload-time = "2025-07-29T15:12:07.153Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/a2/8966111a285124f3d6156a663ddf2aeddd52843c1a3d6b56cbd9b6c3fd0e/opentelemetry_exporter_otlp-1.36.0-py3-none-any.whl", hash = "sha256:de93b7c45bcc78296998775d52add7c63729e83ef2cd6560730a6b336d7f6494", size = 7018, upload-time = "2025-07-29T15:11:50.498Z" }, -] - -[[package]] -name = "opentelemetry-exporter-otlp-proto-common" -version = "1.36.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-proto" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/34/da/7747e57eb341c59886052d733072bc878424bf20f1d8cf203d508bbece5b/opentelemetry_exporter_otlp_proto_common-1.36.0.tar.gz", hash = "sha256:6c496ccbcbe26b04653cecadd92f73659b814c6e3579af157d8716e5f9f25cbf", size = 20302, upload-time = "2025-07-29T15:12:07.71Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/ed/22290dca7db78eb32e0101738366b5bbda00d0407f00feffb9bf8c3fdf87/opentelemetry_exporter_otlp_proto_common-1.36.0-py3-none-any.whl", hash = "sha256:0fc002a6ed63eac235ada9aa7056e5492e9a71728214a61745f6ad04b923f840", size = 18349, upload-time = "2025-07-29T15:11:51.327Z" }, -] - -[[package]] -name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.36.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "googleapis-common-protos" }, - { name = "grpcio" }, - { name = "opentelemetry-api" }, - { name = "opentelemetry-exporter-otlp-proto-common" }, - { name = "opentelemetry-proto" }, - { name = "opentelemetry-sdk" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/72/6f/6c1b0bdd0446e5532294d1d41bf11fbaea39c8a2423a4cdfe4fe6b708127/opentelemetry_exporter_otlp_proto_grpc-1.36.0.tar.gz", hash = "sha256:b281afbf7036b325b3588b5b6c8bb175069e3978d1bd24071f4a59d04c1e5bbf", size = 23822, upload-time = "2025-07-29T15:12:08.292Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/67/5f6bd188d66d0fd8e81e681bbf5822e53eb150034e2611dd2b935d3ab61a/opentelemetry_exporter_otlp_proto_grpc-1.36.0-py3-none-any.whl", hash = "sha256:734e841fc6a5d6f30e7be4d8053adb703c70ca80c562ae24e8083a28fadef211", size = 18828, upload-time = "2025-07-29T15:11:52.235Z" }, -] - -[[package]] -name = "opentelemetry-exporter-otlp-proto-http" -version = "1.36.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "googleapis-common-protos" }, - { name = "opentelemetry-api" }, - { name = "opentelemetry-exporter-otlp-proto-common" }, - { name = "opentelemetry-proto" }, - { name = "opentelemetry-sdk" }, - { name = "requests" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/25/85/6632e7e5700ba1ce5b8a065315f92c1e6d787ccc4fb2bdab15139eaefc82/opentelemetry_exporter_otlp_proto_http-1.36.0.tar.gz", hash = "sha256:dd3637f72f774b9fc9608ab1ac479f8b44d09b6fb5b2f3df68a24ad1da7d356e", size = 16213, upload-time = "2025-07-29T15:12:08.932Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/41/a680d38b34f8f5ddbd78ed9f0042e1cc712d58ec7531924d71cb1e6c629d/opentelemetry_exporter_otlp_proto_http-1.36.0-py3-none-any.whl", hash = "sha256:3d769f68e2267e7abe4527f70deb6f598f40be3ea34c6adc35789bea94a32902", size = 18752, upload-time = "2025-07-29T15:11:53.164Z" }, -] - -[[package]] -name = "opentelemetry-instrumentation" -version = "0.57b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "packaging" }, - { name = "wrapt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/12/37/cf17cf28f945a3aca5a038cfbb45ee01317d4f7f3a0e5209920883fe9b08/opentelemetry_instrumentation-0.57b0.tar.gz", hash = "sha256:f2a30135ba77cdea2b0e1df272f4163c154e978f57214795d72f40befd4fcf05", size = 30807, upload-time = "2025-07-29T15:42:44.746Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/6f/f20cd1542959f43fb26a5bf9bb18cd81a1ea0700e8870c8f369bd07f5c65/opentelemetry_instrumentation-0.57b0-py3-none-any.whl", hash = "sha256:9109280f44882e07cec2850db28210b90600ae9110b42824d196de357cbddf7e", size = 32460, upload-time = "2025-07-29T15:41:40.883Z" }, -] - -[[package]] -name = "opentelemetry-instrumentation-asgi" -version = "0.57b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "asgiref" }, - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "opentelemetry-util-http" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/97/10/7ba59b586eb099fa0155521b387d857de476687c670096597f618d889323/opentelemetry_instrumentation_asgi-0.57b0.tar.gz", hash = "sha256:a6f880b5d1838f65688fc992c65fbb1d3571f319d370990c32e759d3160e510b", size = 24654, upload-time = "2025-07-29T15:42:48.199Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/07/ab97dd7e8bc680b479203f7d3b2771b7a097468135a669a38da3208f96cb/opentelemetry_instrumentation_asgi-0.57b0-py3-none-any.whl", hash = "sha256:47debbde6af066a7e8e911f7193730d5e40d62effc1ac2e1119908347790a3ea", size = 16599, upload-time = "2025-07-29T15:41:48.332Z" }, -] - -[[package]] -name = "opentelemetry-instrumentation-fastapi" -version = "0.57b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-instrumentation-asgi" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "opentelemetry-util-http" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/47/a8/7c22a33ff5986523a7f9afcb5f4d749533842c3cc77ef55b46727580edd0/opentelemetry_instrumentation_fastapi-0.57b0.tar.gz", hash = "sha256:73ac22f3c472a8f9cb21d1fbe5a4bf2797690c295fff4a1c040e9b1b1688a105", size = 20277, upload-time = "2025-07-29T15:42:58.68Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/df/f20fc21c88c7af5311bfefc15fc4e606bab5edb7c193aa8c73c354904c35/opentelemetry_instrumentation_fastapi-0.57b0-py3-none-any.whl", hash = "sha256:61e6402749ffe0bfec582e58155e0d81dd38723cd9bc4562bca1acca80334006", size = 12712, upload-time = "2025-07-29T15:42:03.332Z" }, -] - -[[package]] -name = "opentelemetry-instrumentation-logging" -version = "0.57b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5b/31/0df708cf7c861b083e64b094c048e0fcf72f1aa4beba61333fd089076c82/opentelemetry_instrumentation_logging-0.57b0.tar.gz", hash = "sha256:44dbeb8aaf643e95d7311b699b8d368b1ecdb8404f1563f19f2b3ce2b4c6a035", size = 9969, upload-time = "2025-07-29T15:43:02.381Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/ff/d2bacc8c3ba74136b156cae80048907bd89a50d1823d81ac875a5fb6d93c/opentelemetry_instrumentation_logging-0.57b0-py3-none-any.whl", hash = "sha256:9f57d13bf776f6507f8ccff16a7aa6e6e753672708943925a794f16152504a04", size = 12577, upload-time = "2025-07-29T15:42:10.602Z" }, -] - -[[package]] -name = "opentelemetry-proto" -version = "1.36.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fd/02/f6556142301d136e3b7e95ab8ea6a5d9dc28d879a99f3dd673b5f97dca06/opentelemetry_proto-1.36.0.tar.gz", hash = "sha256:0f10b3c72f74c91e0764a5ec88fd8f1c368ea5d9c64639fb455e2854ef87dd2f", size = 46152, upload-time = "2025-07-29T15:12:15.717Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/57/3361e06136225be8180e879199caea520f38026f8071366241ac458beb8d/opentelemetry_proto-1.36.0-py3-none-any.whl", hash = "sha256:151b3bf73a09f94afc658497cf77d45a565606f62ce0c17acb08cd9937ca206e", size = 72537, upload-time = "2025-07-29T15:12:02.243Z" }, -] - -[[package]] -name = "opentelemetry-sdk" -version = "1.36.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4c/85/8567a966b85a2d3f971c4d42f781c305b2b91c043724fa08fd37d158e9dc/opentelemetry_sdk-1.36.0.tar.gz", hash = "sha256:19c8c81599f51b71670661ff7495c905d8fdf6976e41622d5245b791b06fa581", size = 162557, upload-time = "2025-07-29T15:12:16.76Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/59/7bed362ad1137ba5886dac8439e84cd2df6d087be7c09574ece47ae9b22c/opentelemetry_sdk-1.36.0-py3-none-any.whl", hash = "sha256:19fe048b42e98c5c1ffe85b569b7073576ad4ce0bcb6e9b4c6a39e890a6c45fb", size = 119995, upload-time = "2025-07-29T15:12:03.181Z" }, -] - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.57b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7e/31/67dfa252ee88476a29200b0255bda8dfc2cf07b56ad66dc9a6221f7dc787/opentelemetry_semantic_conventions-0.57b0.tar.gz", hash = "sha256:609a4a79c7891b4620d64c7aac6898f872d790d75f22019913a660756f27ff32", size = 124225, upload-time = "2025-07-29T15:12:17.873Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/75/7d591371c6c39c73de5ce5da5a2cc7b72d1d1cd3f8f4638f553c01c37b11/opentelemetry_semantic_conventions-0.57b0-py3-none-any.whl", hash = "sha256:757f7e76293294f124c827e514c2a3144f191ef175b069ce8d1211e1e38e9e78", size = 201627, upload-time = "2025-07-29T15:12:04.174Z" }, -] - -[[package]] -name = "opentelemetry-util-http" -version = "0.57b0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/1b/6229c45445e08e798fa825f5376f6d6a4211d29052a4088eed6d577fa653/opentelemetry_util_http-0.57b0.tar.gz", hash = "sha256:f7417595ead0eb42ed1863ec9b2f839fc740368cd7bbbfc1d0a47bc1ab0aba11", size = 9405, upload-time = "2025-07-29T15:43:19.916Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/a6/b98d508d189b9c208f5978d0906141747d7e6df7c7cafec03657ed1ed559/opentelemetry_util_http-0.57b0-py3-none-any.whl", hash = "sha256:e54c0df5543951e471c3d694f85474977cd5765a3b7654398c83bab3d2ffb8e9", size = 7643, upload-time = "2025-07-29T15:42:41.744Z" }, -] - [[package]] name = "orjson" version = "3.10.12" @@ -2497,20 +2266,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/b6/c5319caea262f4821995dca2107483b94a3345d4607ad797c76cb9c36bcc/propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54", size = 11818, upload-time = "2024-12-01T18:29:14.716Z" }, ] -[[package]] -name = "protobuf" -version = "6.32.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c0/df/fb4a8eeea482eca989b51cffd274aac2ee24e825f0bf3cbce5281fa1567b/protobuf-6.32.0.tar.gz", hash = "sha256:a81439049127067fc49ec1d36e25c6ee1d1a2b7be930675f919258d03c04e7d2", size = 440614, upload-time = "2025-08-14T21:21:25.015Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/18/df8c87da2e47f4f1dcc5153a81cd6bca4e429803f4069a299e236e4dd510/protobuf-6.32.0-cp310-abi3-win32.whl", hash = "sha256:84f9e3c1ff6fb0308dbacb0950d8aa90694b0d0ee68e75719cb044b7078fe741", size = 424409, upload-time = "2025-08-14T21:21:12.366Z" }, - { url = "https://files.pythonhosted.org/packages/e1/59/0a820b7310f8139bd8d5a9388e6a38e1786d179d6f33998448609296c229/protobuf-6.32.0-cp310-abi3-win_amd64.whl", hash = "sha256:a8bdbb2f009cfc22a36d031f22a625a38b615b5e19e558a7b756b3279723e68e", size = 435735, upload-time = "2025-08-14T21:21:15.046Z" }, - { url = "https://files.pythonhosted.org/packages/cc/5b/0d421533c59c789e9c9894683efac582c06246bf24bb26b753b149bd88e4/protobuf-6.32.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d52691e5bee6c860fff9a1c86ad26a13afbeb4b168cd4445c922b7e2cf85aaf0", size = 426449, upload-time = "2025-08-14T21:21:16.687Z" }, - { url = "https://files.pythonhosted.org/packages/ec/7b/607764ebe6c7a23dcee06e054fd1de3d5841b7648a90fd6def9a3bb58c5e/protobuf-6.32.0-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:501fe6372fd1c8ea2a30b4d9be8f87955a64d6be9c88a973996cef5ef6f0abf1", size = 322869, upload-time = "2025-08-14T21:21:18.282Z" }, - { url = "https://files.pythonhosted.org/packages/40/01/2e730bd1c25392fc32e3268e02446f0d77cb51a2c3a8486b1798e34d5805/protobuf-6.32.0-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:75a2aab2bd1aeb1f5dc7c5f33bcb11d82ea8c055c9becbb41c26a8c43fd7092c", size = 322009, upload-time = "2025-08-14T21:21:19.893Z" }, - { url = "https://files.pythonhosted.org/packages/9c/f2/80ffc4677aac1bc3519b26bc7f7f5de7fce0ee2f7e36e59e27d8beb32dd1/protobuf-6.32.0-py3-none-any.whl", hash = "sha256:ba377e5b67b908c8f3072a57b63e2c6a4cbd18aea4ed98d2584350dbf46f2783", size = 169287, upload-time = "2025-08-14T21:21:23.515Z" }, -] - [[package]] name = "psutil" version = "6.1.0" @@ -3412,9 +3167,6 @@ lambda = [ { name = "aiobotocore" }, { name = "mangum" }, ] -telemetry = [ - { name = "titiler-core", extra = ["telemetry"] }, -] uvicorn = [ { name = "uvicorn" }, ] @@ -3475,13 +3227,12 @@ requires-dist = [ { name = "rioxarray", specifier = "~=0.13.4" }, { name = "s3fs", specifier = "~=2025.9.0" }, { name = "titiler-core", specifier = ">=0.23.1,<0.24" }, - { name = "titiler-core", extras = ["telemetry"], marker = "extra == 'telemetry'", specifier = ">=0.23.1,<0.24" }, { name = "titiler-mosaic", specifier = ">=0.23.1,<0.24" }, { name = "titiler-xarray", specifier = ">=0.23.1,<0.24" }, { name = "uvicorn", marker = "extra == 'uvicorn'" }, { name = "xarray", specifier = "~=2024.9.0" }, ] -provides-extras = ["lambda", "telemetry", "uvicorn"] +provides-extras = ["lambda", "uvicorn"] [package.metadata.requires-dev] deployment = [ @@ -3538,15 +3289,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/20/c51a4a12f3e4e6a7ecc6586f97aff71823846494ba9b57681355ef68ca2f/titiler_core-0.23.1-py3-none-any.whl", hash = "sha256:03104b648cf2400ed4bd2d9ea9df1b3509c22a8fed8822a93c42bab2ce55ac78", size = 89830, upload-time = "2025-08-27T22:20:02.439Z" }, ] -[package.optional-dependencies] -telemetry = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-exporter-otlp" }, - { name = "opentelemetry-instrumentation-fastapi" }, - { name = "opentelemetry-instrumentation-logging" }, - { name = "opentelemetry-sdk" }, -] - [[package]] name = "titiler-mosaic" version = "0.23.1"