1414from django_json_widget .widgets import JSONEditorWidget
1515from django_object_actions import DjangoObjectActions , takes_instance_or_queryset
1616
17- from controller .sentry .forms import BumpForm
17+ from controller .sentry .choices import MetricType
18+ from controller .sentry .forms import BumpForm , MetricForm
1819from controller .sentry .models import App
1920from controller .sentry .utils import invalidate_cache
2021
@@ -63,32 +64,36 @@ class AppAdmin(
6364 [
6465 "Sentry" ,
6566 {
66- "classes" : ("collapse" , "open" ),
67+ "classes" : ("collapse" ,),
6768 "fields" : ("sentry_project_slug" ,),
6869 },
6970 ],
7071 [
71- "WSGI" ,
72+ "Metric - WSGI" ,
7273 {
73- "classes" : ("collapse" , "open" ),
74- "fields" : ("wsgi_ignore_path" , "wsgi_collect_metrics" , "wsgi_metrics" ),
74+ "classes" : ("collapse" ,),
75+ "fields" : (
76+ "wsgi_collect_metrics" ,
77+ "wsgi_ignore_path" ,
78+ "wsgi_metrics" ,
79+ ),
7580 },
7681 ],
7782 [
78- "Celery" ,
83+ "Metric - Celery" ,
7984 {
80- "classes" : ("collapse" , "open" ),
85+ "classes" : ("collapse" ,),
8186 "fields" : (
82- "celery_ignore_task" ,
8387 "celery_collect_metrics" ,
88+ "celery_ignore_task" ,
8489 "celery_metrics" ,
8590 ),
8691 },
8792 ],
8893 ]
8994 actions = ["bump_sample_rate" ]
9095 changelist_actions = ["panic" , "unpanic" ]
91- change_actions = ["bump_sample_rate" ]
96+ change_actions = ["bump_sample_rate" , "enable_disable_metrics" ]
9297
9398 def get_changelist_actions (self , request ):
9499 allowed_actions = []
@@ -104,6 +109,7 @@ def get_change_actions(self, request, object_id, form_url):
104109 allowed_actions .append (action )
105110 return allowed_actions
106111
112+ # ----- Bump Sample Rate
107113 @takes_instance_or_queryset
108114 @add_form_to_action (BumpForm )
109115 @confirm_action ()
@@ -114,6 +120,8 @@ def bump_sample_rate(self, request, queryset, form: BumpForm = None): # pylint:
114120 active_sample_rate = form .cleaned_data ["new_sample_rate" ],
115121 active_window_end = new_date ,
116122 )
123+ for app in queryset :
124+ invalidate_cache (f"/sentry/apps/{ app .reference } /" )
117125
118126 bump_sample_rate .allowed_permissions = ("bump_sample_rate" ,)
119127
@@ -125,6 +133,29 @@ def has_bump_sample_rate_permission(self, request):
125133 panic = cache .get (settings .PANIC_KEY )
126134 return not panic and request .user .has_perm ("%s.%s" % (opts .app_label , codename ))
127135
136+ # ----- Update Metrics
137+ @takes_instance_or_queryset
138+ @add_form_to_action (MetricForm )
139+ @admin .action (description = "Enable/Disable Metrics Collection" )
140+ def enable_disable_metrics (self , request , queryset , form : MetricForm = None ): # pylint: disable=unused-argument
141+ metrics = form .cleaned_data ["metrics" ]
142+ app : App
143+ for app in queryset :
144+ for metric in MetricType :
145+ app .set_metric (metric , metric .value in metrics )
146+ invalidate_cache (f"/sentry/apps/{ app .reference } /" )
147+ app .save ()
148+
149+ enable_disable_metrics .allowed_permissions = ("enable_disable_metrics" ,)
150+
151+ def has_enable_disable_metrics_permission (self , request ):
152+ """Does the user have the enable_disable_metrics permission?"""
153+ opts = self .opts
154+ codename = get_permission_codename ("enable_disable_metrics" , opts )
155+
156+ return request .user .has_perm ("%s.%s" % (opts .app_label , codename ))
157+
158+ # ----- Panic / Unpanic
128159 @takes_instance_or_queryset
129160 @confirm_action (display_queryset = False )
130161 @admin .action (description = "Panic" )
@@ -157,6 +188,7 @@ def has_unpanic_permission(self, request):
157188 codename = get_permission_codename ("panic" , opts )
158189 return panic and request .user .has_perm ("%s.%s" % (opts .app_label , codename ))
159190
191+ # Save model
160192 def save_model (self , request , obj , form , change ) -> None :
161193 invalidate_cache (f"/sentry/apps/{ obj .reference } /" )
162194 return super ().save_model (request , obj , form , change )
0 commit comments