アプリケーションの開発制限

このドキュメントは、GitLabにアプリケーションの制限を追加するための開発者向けのガイドです。

ドキュメント

まず最初に、情報を集め、GitLabの異なるティアに設定されている異なるリミットを決めなければなりません。それらの制限を文書化し、伝えるために他の人と調整しましょう。

アプリケーションの制限を導入するためのガイドがあります。

プラン制限の導入

データベースプラン制限の挿入

plan_limits テーブルに新しい列を作成し、制限値を挿入します。マイグレーション・スクリプト・ファイルを2つに分けて作成することをお勧めします。

  1. plan_limits テーブルに新しいカラムを追加し、希望する制限値を表す NULL ではないデフォルト値を指定します:

    add_column(:plan_limits, :project_hooks, :integer, default: 100, null: false)
    

    0 に設定されたプラン制限エントリは、制限が有効になっていないことを意味します。この設定は、特別な文書化された状況でのみ使用してください。

  2. (オプション)create_or_update_plan_limit マイグレーション・ヘルパーを使用して、希望する制限で各レベルを微調整するデータベース・マイグレーションを作成します:

    class InsertProjectHooksPlanLimits < Gitlab::Database::Migration[2.1]
      def up
        create_or_update_plan_limit('project_hooks', 'default', 0)
        create_or_update_plan_limit('project_hooks', 'free', 10)
        create_or_update_plan_limit('project_hooks', 'bronze', 20)
        create_or_update_plan_limit('project_hooks', 'silver', 30)
        create_or_update_plan_limit('project_hooks', 'premium', 30)
        create_or_update_plan_limit('project_hooks', 'premium_trial', 30)
        create_or_update_plan_limit('project_hooks', 'gold', 100)
        create_or_update_plan_limit('project_hooks', 'ultimate', 100)
        create_or_update_plan_limit('project_hooks', 'ultimate_trial', 100)
      end
       
      def down
        create_or_update_plan_limit('project_hooks', 'default', 0)
        create_or_update_plan_limit('project_hooks', 'free', 0)
        create_or_update_plan_limit('project_hooks', 'bronze', 0)
        create_or_update_plan_limit('project_hooks', 'silver', 0)
        create_or_update_plan_limit('project_hooks', 'premium', 0)
        create_or_update_plan_limit('project_hooks', 'premium_trial', 0)
        create_or_update_plan_limit('project_hooks', 'gold', 0)
        create_or_update_plan_limit('project_hooks', 'ultimate', 0)
        create_or_update_plan_limit('project_hooks', 'ultimate_trial', 0)
      end
    end
    

    GitLab.comにしか存在しないプランもあります。これは、存在しないプランに対してはノーオプションです。

プランの制限の検証

現在の制限を取得

現在の制限値へのアクセスは、プロジェクトまたはネームスペースを通じて行うことができます:

project.actual_limits.project_hooks

現在の制限の確認

電流制限を超過しているかどうかをチェックするPlanLimits#exceeded? メソッドが1つあります。ActiveRecord オブジェクトかIntegerを使用します。

レコードのカウントが定義された制限を超えないことを確認します:

project.actual_limits.exceeded?(:project_hooks, ProjectHook.where(project: project))

数が定義された制限を超えないようにします:

project.actual_limits.exceeded?(:project_hooks, 10)

Limitable 懸念

Limitable concern は、モデルが制限を超えないことを検証するために使うことができます。これは、現在のモデルのレコード数が定義された制限を超えないことを保証します。

検証されるオブジェクトのリミットスコープと、複数化されたモデル名と異なる場合はリミット名を指定しなければなりません。

class ProjectHook
  include Limitable

  self.limit_name = 'project_hooks' # Optional as ProjectHook corresponds with project_hooks
  self.limit_scope = :project
end

モデルをテストするために、共有された例を含めることができます。

it_behaves_like 'includes Limitable concern' do
  subject { build(:project_hook, project: create(:project)) }
end

インスタンス全体の制限のテスト

インスタンス全体の機能にはライセンスが割り当てられていないため、インスタンス全体の機能は常にdefault プランを使用します。

class InstanceVariable
  include Limitable

  self.limit_name = 'instance_variables' # Optional as InstanceVariable corresponds with instance_variables
  self.limit_scope = Limitable::GLOBAL_SCOPE
end

サブスクリプションプラン

opensource プランは GitLab 14.7 で導入されました。

自己管理型です:

  • default:みんな

GitLab.

  • default:システム全体の機能
  • free:無料サブスクリプションの名前空間とプロジェクト。
  • bronze:ブロンズサブスクリプションの名前空間とプロジェクト。この階層は購入できなくなりました。
  • silver:Premiumサブスクリプションの名前空間とプロジェクト。
  • premium:Premiumサブスクリプションの名前空間とプロジェクト。
  • premium_trial:Premiumトライアル・サブスクリプションの名前空間とプロジェクト。
  • gold:Ultimateサブスクリプションの名前空間とプロジェクト。
  • ultimate:Ultimateサブスクリプションの名前空間とプロジェクト。
  • ultimate_trial:Ultimateトライアル・サブスクリプションの名前空間とプロジェクト。
  • opensource:GitLabオープンソースプログラムのメンバーである名前空間とプロジェクト。

test 環境の予定はありません。

レート制限を実装するにはRack::Attack

Rack::Attack ミドルウェアを使用して Rack リクエストをスロットルします。これはRailsコントローラ、Grapeエンドポイント、その他のRackリクエストに適用されます。

新しいスロットルを追加する手順は以下のようになります:

  1. ApplicationSetting モデル (*_enabled,*_requests_per_period,*_period_in_seconds) に新しいカラムを追加します。
  2. Gitlab::RackAttackGitlab::RackAttack::Request を拡張して新しいレート制限を設定し、必要なリクエストに適用します。
  3. app/views/admin/application_settings/_ip_limits.html.haml の Admin Area フォームに新しい設定を追加します。
  4. ユーザーおよびIPレート制限と アプリケーション設定APIで新しい設定を文書化します。
  5. GitLab.comのレートリミットを設定し、GitLab.com-specific rate limitsで文書化します。

実装の詳細については、過去のイシューを参照してください:

レート制限を実装するにはGitlab::ApplicationRateLimiter

このモジュールはカスタムレートリミッターを実装しており、特定のアクションを スロットルするために使用できます。ミドルウェアレベルでオペレーションを行うRack::AttackRack::Throttle とは異なり、コントローラや API レベルで使用することができます。

コントローラでの使用についてはCheckRateLimit を参照してください。コードの他の部分では、Gitlab::ApplicationRateLimiter モジュールを直接呼び出すことができます。

次のレート制限アーキテクチャ

2022年5月、私たちは前方視的なレート制限アーキテクチャを使用したアプリケーション制限フレームワークの次のイテレーションに着手しました。

新しい要件を定義し、次のアーキテクチャの設計に取り組んでいます。新しい制限を追加するための新しい機能が必要な場合は、今すぐ構築するのではなく、レート制限アーキテクチャ・ワーキンググループに貢献することを検討してください。

レート制限アーキテクチャの次のイテレーションに組み込みたい機能の例:

  1. 名前空間ごと/プランごとに制限を定義し、上書きできるようにします。
  2. どのような制限が実装され、デフォルトが何であるかについてのドキュメントを自動的に生成します。
  3. リミットを一箇所で定義し、検索や探索が可能。
  4. ソフトリミットとハードリミットがあり、リミットが近づくとユーザーに通知します。