mirror of
https://github.com/makeplane/plane.git
synced 2026-06-14 03:30:00 +00:00
095b1aa360
* [WEB-7447] feat: migrate CE telemetry from OTLP traces to OTLP metrics Replace span-based tracing (tracer.py) with OTLP observable gauges, mirroring the approach already used in plane-ee. Key changes: - Add otlp_endpoints.py — shared gRPC/HTTP endpoint helpers - Add telemetry_metrics.py — push_instance_metrics task using MeterProvider + observable gauges (service name: plane-ce-api) - User count excludes bots (is_bot=False) - Page count excludes bot-owned private pages only - Domain derived from WEB_URL env var - Celery beat entry replaced with timedelta schedule + configurable METRICS_PUSH_INTERVAL_MINUTES (default 360 min) - Add explicit opentelemetry-exporter-otlp-proto-grpc dep - Delete tracer.py and telemetry.py (no longer needed) Co-authored-by: Plane AI <noreply@plane.so> * fix: address review comments on CE telemetry metrics - harden grpc_endpoint_from_url for scheme-less OTLP_ENDPOINT values (e.g. "telemetry.plane.so:4317") by prepending "//" before urlparse - fix WEB_URL domain extraction for scheme-less values with same approach - replace N+1 workspace count queries (6×N) with 6 batched annotate(Count) aggregation queries — reduces DB load significantly at WORKSPACE_METRICS_LIMIT - add deterministic ordering (order_by created_at) to workspace slice - harden METRICS_PUSH_INTERVAL_MINUTES env parsing with try/except guard and positive-value validation to avoid crash on malformed input Co-authored-by: Plane AI <noreply@plane.so> * fix: cap METRICS_PUSH_INTERVAL_MINUTES to prevent timedelta overflow Add upper-bound check (10_000_000 minutes) and catch OverflowError alongside ValueError so an arbitrarily large env value cannot crash worker startup via timedelta(minutes=...) OverflowError. Co-authored-by: Plane AI <noreply@plane.so> --------- Co-authored-by: Plane AI <noreply@plane.so>
75 lines
1.3 KiB
Plaintext
75 lines
1.3 KiB
Plaintext
# base requirements
|
|
|
|
# django
|
|
Django==4.2.30
|
|
# rest framework
|
|
djangorestframework==3.15.2
|
|
# postgres
|
|
psycopg==3.3.0
|
|
psycopg-binary==3.3.0
|
|
psycopg-c==3.3.0
|
|
dj-database-url==2.1.0
|
|
# redis
|
|
redis==5.0.4
|
|
django-redis==5.4.0
|
|
# cors
|
|
django-cors-headers==4.3.1
|
|
# celery
|
|
celery==5.4.0
|
|
django_celery_beat==2.6.0
|
|
django-celery-results==2.5.1
|
|
# file serve
|
|
whitenoise==6.11.0
|
|
# fake data
|
|
faker==25.0.0
|
|
# filters
|
|
django-filter==24.2
|
|
# json model
|
|
jsonmodels==2.7.0
|
|
# storage
|
|
django-storages==1.14.2
|
|
# user management
|
|
django-crum==0.7.9
|
|
# web server
|
|
uvicorn==0.29.0
|
|
# sockets
|
|
channels==4.1.0
|
|
# ai
|
|
openai==1.63.2
|
|
# slack
|
|
slack-sdk==3.27.1
|
|
# apm
|
|
scout-apm==3.1.0
|
|
# xlsx generation
|
|
openpyxl==3.1.2
|
|
# logging
|
|
python-json-logger==4.0.0
|
|
# html parser
|
|
beautifulsoup4==4.12.3
|
|
# analytics
|
|
posthog==3.5.0
|
|
# crypto
|
|
cryptography==46.0.7
|
|
# html validator
|
|
lxml==6.1.0
|
|
# s3
|
|
boto3==1.34.96
|
|
# http client (pinned to address CVE-2026-44431 and CVE-2026-44432)
|
|
urllib3>=2.7.0
|
|
# password validator
|
|
zxcvbn==4.4.28
|
|
# timezone
|
|
pytz==2024.1
|
|
# jwt
|
|
PyJWT==2.12.0
|
|
# OpenTelemetry
|
|
opentelemetry-api==1.28.1
|
|
opentelemetry-sdk==1.28.1
|
|
opentelemetry-instrumentation-django==0.49b1
|
|
opentelemetry-exporter-otlp==1.28.1
|
|
opentelemetry-exporter-otlp-proto-grpc==1.28.1
|
|
# OpenAPI Specification
|
|
drf-spectacular==0.28.0
|
|
# html sanitizer
|
|
nh3==0.2.18
|