Feature categorization of endpoints on CustomersDot
# Synopsis > An error budget aligns incentives and emphasizes joint ownership between SRE and product development. Error budgets make it easier to decide the rate of releases and to effectively defuse discussions about outages with stakeholders, and allows multiple teams to reach the same conclusion about production risk without rancor. Setting up proper [Error Budget](https://about.gitlab.com/handbook/engineering/error-budgets) per team requires [assigned endpoints](https://about.gitlab.com/handbook/engineering/error-budgets/#budget-spend-by-stage-group) to match each Fulfillment team. We track error budgets at team level and each EM/team are responsible for their own endpoints. The goal of this epic is to define feature category for each endpoint. Each Sidekiq worker, controller action, or API endpoint must declare a `feature_category` attribute. Set proper feature category for each team to collect metrics for establishing accurate error budget. # SLI ownership table Each SLI can be owned by a team and/or a `feature_category`. Teams are defined in [`service-catalog.yml`](https://gitlab.com/gitlab-com/runbooks/blob/master/services/service-catalog.yml). Feature categories are defined in the stage categories stanza in the [`stages.yml` file](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml). Here is the list of all feature categories for the Fulfillment team: - ~"group::not_owned" Use this label to mark endpoints that do not belong to any group or belong to several teams. - ~"group::purchase" - ~"group::utilization" - ~"group::provision" - ~"group::fulfillment platform" - ~"group::billing and subscription management" ## API Controllers _Put **yes** into `Pull from request?` cell if a Rails controller does not belong to any group and require pulling the correct feature category from a request._ | Name | Feature category | Pull a feature category from a request? | | ------ | ------ | ------ | | `CustomersController` | ~"group::fulfillment platform" | No | | `PaymentMethodsController` | ~"group::fulfillment platform" | No | | `CouponsController` | ~"group::billing and subscription management" | No | | `CountriesController` | ~"group::fulfillment platform" | No | | `SeatLinksController` | ~"group::provision" | No | | `LicensesController` | ~"group::provision" | No | | `OauthAppIdController` | ~"group::fulfillment platform" | No | | `Marketplace::SubscriptionsController` | ~"group::fulfillment platform" | No | ## Controllers _Put **yes** into `Pull from request?` cell if a Rails controller does not belong to any group and require pulling the correct feature category from a request._ | Name | Feature category | Pull a feature category from a request? | | ------ | ------ | ------ | | `Admins::OmniauthCallbacksController` | ~"group::fulfillment platform" | No | | `Customers::OmniauthCallbacksController` | ~"group::fulfillment platform" | No | | `DeviseController` | ~"group::fulfillment platform" | No | | `EmailConfirmationsController` | ~"group::fulfillment platform" | No | | `EulaRequestsController` | ~"group::not_owned" | No | | `Gitlab::NamespacesController` | ~"group::billing and subscription management" | No | | `GraphqlController` | ~"group::not_owned" | Yes | | `InstanceReviewController` | ~"group::utilization" | No | | `InstanceReviewSettingsController` | ~"group::utilization" | No | | `InvoicesController` | ~"group::purchase" | No | | `LicensesController` | ~"group::provision" | No | | `MarketoController` | ~"group::fulfillment platform" | No | | `OrdersController` | ~"group::purchase" | No | | `PaymentFormsController` | ~"group::billing and subscription management" | No | | `PaymentMethodsController` | ~"group::purchase" | No | | `PlansController` | ~"group::fulfillment platform" | No | | `RailsAdmin::ApplicationController` | ~"group::fulfillment platform" | No | | `RegistrationsController` | ~"group::fulfillment platform" | No | | `SessionsController` | ~"group::fulfillment platform" | No | | `SubscriptionUpgradesController` | ~"group::billing and subscription management" | No | | `Subscriptions::CommunityProgramController` | ~"group::billing and subscription management" | No | | `SubscriptionsController` | ~"group::not_owned" | Yes | | `TrialsController` | ~"group::not_owned" | No | | `ZuoraCallbacksController` | ~"group::provision" | No | ## Workers | Name | Feature category | | ------ | ------ | | `Platypus::CreateLeadWorker` | ~"group::fulfillment platform" | | `Platypus::MarkSubscriptionProvisionedWorker` | ~"group::fulfillment platform" | | `Salesforce::CreateAccountWorker` | ~"group::provision" | | `Salesforce::CreateLeadWorker` | ~"group::provision" | | `Salesforce::CreateOpportunityForUpcomingReconciliationWorker` | ~"group::provision" | | `Salesforce::CreateOpportunityWorker` | ~"group::provision" | | `Salesforce::CreateQuoteForReconciliationWorker` | ~"group::provision" | | `Salesforce::FindOrCreateLeadWorker` | ~"group::provision" | | `ZuoraCallout::BaseWorker` | ~"group::provision" | | `ZuoraCallout::OrderProcessedWorker` | ~"group::provision" | | `ZuoraCallout::SubscriptionTermStartWorker` | ~"group::provision" | | `CreateAmendmentWorker` | ~"group::billing and subscription management" | | `SelfHostedUsageNotifier` | ~"group::utilization" | | `SkipReconciliationWorker` | ~"group::billing and subscription management" | | `UpdateGitlabPlanInfoWorker` | ~"group::provision" | | `UpdateGitlabUpcomingReconciliationsWorker` | ~"group::billing and subscription management" | | `UpdateSubscriptionEoaStarterBronzeOfferWorker` | ~"group::billing and subscription management" | | `UpdateZuoraSubscriptionNamespaceDataWorker` | ~"group::provision" | | `ZuoraCallbackWorker` | ~"group::provision" | ## Jobs | Name | Feature category | | ------ | ------ | | `AutoRenew::UpcomingNotificationCronJob` | ~"group::billing and subscription management"| | `AutoRenew::UpcomingNotificationJob` | ~"group::billing and subscription management"| | `Gitlab::SyncMinutesJob` | ~"group::utilization" | | `Gitlab::SyncOrderJob` | ~"group::provision" | | `HealthCheckCron::CheckGitlabJob` | ~"group::fulfillment platform" | | `HealthCheckCron::CheckZuoraJob` | ~"group::fulfillment platform" | | `Quality::TestAccountCleanupCronJob` | ~"group::not_owned" | | `Reconciliations::SendSeatOverageNotificationJob` | ~"group::billing and subscription management"| | `AutoRenewCronJob` | ~"group::billing and subscription management"| | `AutoRenewJob` | ~"group::billing and subscription management"| | `BulkDownloadInvoiceJob` | ~"group::purchase" | | `DownloadMonthlyInvoiceCronJob` | ~"group::purchase" | | `ExpireOrderCronJob` | ~"group::billing and subscription management" | | `ExpireOrderJob` | ~"group::billing and subscription management" | | `OrphanedComSubscriptionEmailCronJob` | ~"group::fulfillment platform" | | `QueueReconciliationIntroEmailJob` | ~"group::billing and subscription management" | | `ReconciliationCronJob` | ~"group::billing and subscription management" | | `ReconciliationJob` | ~"group::billing and subscription management" | | `RetryDeclinedReconciliationJob` | ~"group::billing and subscription management" | | `SaasUpcomingReconciliationAlertJob` | ~"group::billing and subscription management"| | `SendUpcomingReconciliationEmailJob` | ~"group::billing and subscription management"| | `SubmitSeatUtilizationDataReminderCronJob` | ~"group::provision" | | `SubmitSeatUtilizationDataReminderJob` | ~"group::provision" | | `UnlinkedComSubscriptionNotificationJob` | ~"group::fulfillment platform" | | `UpcomingReconciliationNotificationCronJob` | ~"group::billing and subscription management" | | `Zuora::*` | ~"group::not_owned" | # Implementation plan - [x] Collect and define feature category for each endpoint in CustomersDot application. - [x] Port a [feature categorization code](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/feature_categories.rb) from gitlab.com - [x] Assign feature categories for each type of endpoints: API Controllers, Controllers, Job and Sidekiq workers. - [x] Validate we receive a proper data per each endpoint per each team. - [ ] Correct the error budget per each team if required. # Resources - https://docs.gitlab.com/ee/development/feature_categorization/ - https://landing.google.com/sre/sre-book/chapters/embracing-risk/#id-na2u1S2SKi1
epic