監視入門を読んでいて、Health エンドポイントパターンいうパターンが気になり、Django で Health チェックを実施するプラグインがないか確認したところ、KristianOellegaard/django-health-check: a pluggable app that runs a full check on the deployment, using a number of plugins to check e.g. database, queue server, celery processes, etc.見つけました。
データベース監視、Cache の監視など一通り実施できそうでしたので、試しにインストールしてみました。
インストール手順と、実施したことについて記載します。


前提

OS と Python、Django の Versionを記載します。

  • OS

    # cat /etc/redhat-release 
    CentOS Linux release 7.8.2003 (Core)
    

  • Python

    # python -V
    Python 3.6.7
    

  • Django

    # pip list | grep Django
    Django                     1.11.20
    


インストールと、設定

django-health-check設定、動作確認まで実施します。

  • インストール

    # pip install django-health-check
    ------------------
    Collecting django-health-check
      Downloading django_health_check-3.12.1-py2.py3-none-any.whl (25 kB)
    Requirement already satisfied: django>=1.11 in .venv/lib/python3.6/site-packages (from django-health-check) (1.11.20)
    Requirement already satisfied: pytz in .venv/lib/python3.6/site-packages (from django>=1.11->django-health-check) (2019.1)
    Installing collected packages: django-health-check
    Successfully installed django-health-check-3.12.1
    

  • urls.py の変更
    ヘルスチェックURLをurls.py追記します。

    urlpatterns += [ 
        # healthcheck
        url(r'^health/', include('health_check.urls')),       
    ]
    

  • settings.py の変更
    settings.pyアプリケーションを追加します。
    django-health-check複数のアプリケーションに分かれていて、チェック対象のミドルウェアをアプリケーション単位で選択する形式になります。

    INSTALLED_APPS = (
        ...    
        'health_check',                             # required                                                                                                                             
        #'health_check.db',                         # stock Django health checkers DBに保持しないのでコメントアウト
        'health_check.cache',
        'health_check.storage',
        #'health_check.contrib.celery',              # requires celery celeryは使用していない
        'health_check.contrib.psutil',              # disk and memory utilization; requires psutil DiskとMemoryの状況は確認したい
        #'health_check.contrib.s3boto3_storage',     # requires boto3 and S3BotoStorage backend
        #'health_check.contrib.rabbitmq',            # requires RabbitMQ broker
        #'health_check.contrib.redis',               # required Redis broker    
        )
    

ディスクとメモリーの状況を確認する場合は以下を追記します。

# HEALCH_CHECK SETTINGS
HEALTH_CHECK = {
    'DISK_USAGE_MAX': 90,  # percent
    'MEMORY_MIN': 100,    # in MB
}

また、psutilが別途インストール必要になるため、追加でインストールします。

pip install psutil     
ちなみにインストールしていないと以下のようなエラーが発生します。
Traceback (most recent call last):
  File "manage.py", line 14, in <module>
    execute_from_command_line(sys.argv)
  File ".venv/lib64/python3.6/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File ".venv/lib64/python3.6/site-packages/django/core/management/__init__.py", line 338, in execute
    django.setup()
  File ".venv/lib64/python3.6/site-packages/django/__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)
  File ".venv/lib64/python3.6/site-packages/django/apps/registry.py", line 116, in populate
    app_config.ready()
  File ".venv/lib64/python3.6/site-packages/health_check/contrib/psutil/apps.py", line 11, in ready
    from .backends import DiskUsage, MemoryUsage
  File ".venv/lib64/python3.6/site-packages/health_check/contrib/psutil/backends.py", line 4, in <module>
    import psutil
ModuleNotFoundError: No module named 'psutil'

その他、アプリケーションを有効化する際は、個別で設定の追加が必要です。

  • テスト実行
    Django command でhealth_checkいうコマンドが用意されており、CLIでヘルスチェックの実施が可能です。

    # python manage.py health_check
    CacheBackend             ... working
    DefaultFileStorageHealthCheck ... working
    DiskUsage                ... working
    MemoryUsage              ... working
    

  • httpでアクセスしてテスト実行
    https://www.monotalk.xyz/health/?format=json のように、?format=json付与すると、以下のようなjsonデータが取得できます。

    "CacheBackend": "working", "DefaultFileStorageHealthCheck": "working", "DiskUsage": "working", "MemoryUsage": "working"}
    
    ?format=json なしでアクセスすると、HTML形式で以下のように表示されます。こちらは実行時間も取得できます。
    Image from Gyazo

  • httpでアクセスする際の注意点
    python manage.py health_check実行ユーザーと、Webアプリの実行ユーザーが異なる場合、DefaultFileStorageHealthCheck のチェックがパーミッションの問題でエラーになります。
    同一ユーザーで実行するか、MEDIA_ROOTディレクトリのパーミッションを、変更する必要があります。


Health Check のクライアント

Health Check の URL に HTTPリクエストを送信するクライアントは、Google スプレッドシート の website-monitorいうアドオンがあるので、それを使いました。
URL監視は1シート1つだけですが、Down時刻、Up時刻の記録ができるので便利です。


参考

以下、Health エンドポイントパターン という言葉で見つけた記事になります。

以上です。

コメント