diff --git a/bugsink/app_settings.py b/bugsink/app_settings.py index 94e0a07..12bac22 100644 --- a/bugsink/app_settings.py +++ b/bugsink/app_settings.py @@ -59,6 +59,10 @@ DEFAULTS = { # of 50/s (ingestion) on low-grade hardware that I measured. "MAX_EVENTS_PER_PROJECT_PER_5_MINUTES": 1_000, "MAX_EVENTS_PER_PROJECT_PER_HOUR": 5_000, + "MAX_EVENTS_PER_PROJECT_PER_MONTH": 1_000_000, + + "MAX_EVENTS_PER_5_MINUTES": 1_000, + "MAX_EVENTS_PER_HOUR": 5_000, "MAX_EVENTS_PER_MONTH": 1_000_000, "MAX_EMAILS_PER_MONTH": None, # None means "no limit"; for non-None values, the quota is per calendar month diff --git a/bugsink/conf_templates/docker.py.template b/bugsink/conf_templates/docker.py.template index 9f32b8e..1acca31 100644 --- a/bugsink/conf_templates/docker.py.template +++ b/bugsink/conf_templates/docker.py.template @@ -163,10 +163,15 @@ BUGSINK = { "MAX_ENVELOPE_COMPRESSED_SIZE": int(os.getenv("MAX_ENVELOPE_COMPRESSED_SIZE", 20 * _MEBIBYTE)), # Bugsink-specific limits: - # The default values are 1_000 and 5_000 respectively; which corresponds to ~6% and ~2.7% of the total capacity of - # 50 requests/s (ingestion) on low-grade hardware that I measured, and with 50% of the default value for retention. + # The default values are 1_000, 5_000, 1M respectively; which corresponds to ~6%, ~2.7%, .8% of the total capacity + # of 50/s (ingestion) on low-grade hardware that I measured. "MAX_EVENTS_PER_PROJECT_PER_5_MINUTES": int(os.getenv("MAX_EVENTS_PER_PROJECT_PER_5_MINUTES", 1_000)), "MAX_EVENTS_PER_PROJECT_PER_HOUR": int(os.getenv("MAX_EVENTS_PER_PROJECT_PER_HOUR", 5_000)), + "MAX_EVENTS_PER_PROJECT_PER_MONTH": int(os.getenv("MAX_EVENTS_PER_PROJECT_PER_MONTH", 1_000_000)), + + "MAX_EVENTS_PER_5_MINUTES": int(os.getenv("MAX_EVENTS_PER_5_MINUTES", 1_000)), + "MAX_EVENTS_PER_HOUR": int(os.getenv("MAX_EVENTS_PER_HOUR", 5_000)), + "MAX_EVENTS_PER_MONTH": int(os.getenv("MAX_EVENTS_PER_MONTH", 1_000_000)), # Settings that help with debugging and development ("why isn't Bugsink doing what I expect?") "VALIDATE_ON_DIGEST": os.getenv("VALIDATE_ON_DIGEST", "none").lower(), # other legal values are "warn" and "strict" diff --git a/bugsink/settings/development.py b/bugsink/settings/development.py index 3442126..692e7d9 100644 --- a/bugsink/settings/development.py +++ b/bugsink/settings/development.py @@ -105,6 +105,10 @@ BUGSINK = { # set MAX_EVENTS* very high to be able to do serious performance testing (which I do often in my dev environment) "MAX_EVENTS_PER_PROJECT_PER_5_MINUTES": 1_000_000, "MAX_EVENTS_PER_PROJECT_PER_HOUR": 50_000_000, + "MAX_EVENTS_PER_PROJECT_PER_MONTH": 1_000_000_000, + + "MAX_EVENTS_PER_5_MINUTES": 1_000_000, + "MAX_EVENTS_PER_HOUR": 50_000_000, "MAX_EVENTS_PER_MONTH": 1_000_000_000, "MAX_EMAILS_PER_MONTH": 10, # for development: a thing to tune if you want to the the quota system diff --git a/ingest/views.py b/ingest/views.py index 93fd2a9..65aee45 100644 --- a/ingest/views.py +++ b/ingest/views.py @@ -62,11 +62,14 @@ HTTP_501_NOT_IMPLEMENTED = 501 QUOTA_THRESHOLDS = { "Installation": [ + ("minute", 5, "MAX_EVENTS_PER_5_MINUTES"), + ("hour", 1, "MAX_EVENTS_PER_HOUR",), ("month", 1, "MAX_EVENTS_PER_MONTH"), ], "Project": [ ("minute", 5, "MAX_EVENTS_PER_PROJECT_PER_5_MINUTES"), ("hour", 1, "MAX_EVENTS_PER_PROJECT_PER_HOUR",), + ("month", 1, "MAX_EVENTS_PER_PROJECT_PER_MONTH"), ], }