チュートリアル: DjangoアプリケーションでGitLab可観測性を使用する
この機能の利用可否は、機能フラグによって制御されます。
このチュートリアルでは、GitLab可観測性の機能を使用してDjangoアプリケーションを作成、設定、インストルメント、および監視する方法を説明します。
はじめる前
このチュートリアルを進めるには、以下が必要です:
- GitLab.comまたはSelf-ManagedインスタンスのGitLab Ultimateサブスクリプション
- Python 3とDjangoのローカルインスタンス(
python -m pip install Djangoでインストールできます)。 - GitとPythonの基本的な知識
- OpenTelemetryのコアコンセプトの基本的な知識
GitLabプロジェクトを作成する
まず、GitLabプロジェクトと対応するアクセストークンを作成します。このチュートリアルでは、animalsというプロジェクト名を使用します。
- 左側のサイドバーの上部で、新規作成( )を選択し、新規プロジェクト/リポジトリを選択します。
- 空のプロジェクトの作成を選択します。
- プロジェクトの詳細を入力してください。
- プロジェクト名フィールドに、
animalsと入力します。
- プロジェクト名フィールドに、
- プロジェクトを作成を選択します。
animalsプロジェクトの左側のサイドバーで、設定 > アクセストークンを選択します。apiスコープとデベロッパーロールを持つアクセストークンを作成します。後で必要になるため、トークンの値を安全な場所に保管してください。
Djangoアプリケーションを作成する
アプリケーションを作成するには:
コマンドラインから、次のコマンドを実行します:
python -m django startproject animals_appDjangoサーバーが正しく実行されていることを確認します:
python manage.py runserverhttp://localhost:8000にアクセスして、サーバーが正しく実行されていることを確認します。Djangoプロジェクトには、プロジェクト内に複数のアプリケーションが含まれています。偽の動物のリストを管理するアプリケーションを作成するには、次のコマンドを実行します:
python manage.py startapp animals新しい
animalsアプリケーションの初期ビューを作成するには、animals/views.pyファイルに次のコードを追加します:from django.http import HttpResponse def index(request): return HttpResponse("This is where the list of animals will be shown.")animals/urls.pyに、次のコードを追加します:from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ]さらに、room
urls.pyを更新して、animalsアプリを含めます:path('animals/', include('animals.urls'))animals_app/settings.pyで、アプリケーションを追加します:INSTALLED_APPS = [ ... 'animals.apps.AnimalsConfig', ]animals/models.pyで、動物を定義するモデルを作成します:from django.db import models class Animal(models.Model): name = models.CharField(max_length=200) number_of_legs = models.IntegerField(default=2) dangerous = models.BooleanField(default=False)モデルを定義したら、データベースの移行を作成します。これにより、データベースへの変更を記述するファイルが作成されます。
python manage.py makemigrations animals新しく作成された移行を実行します:
python manage.py migrate
OpenTelemetryでアプリケーションをインストルメント化する
必要な依存関係をインストールします:
pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-httpメトリクスとトレーシングには、異なるインポートが必要です。
manage.pyファイルで、必要なモジュールをインポートします:from opentelemetry.instrumentation.django import DjangoInstrumentor from opentelemetry.sdk.resources import SERVICE_NAME, Resource from opentelemetry import trace from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry import metrics from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader, ConsoleMetricExporterアプリケーションをインストルメント化するには、
manage.pyファイルに次のコードを追加します。{{PROJECT_ACCESS_TOKEN}}と{{PROJECT_ID}}を、プロジェクトの値に置き換えます。- Self-Managedインスタンスを使用している場合は、
gitlab.comをSelf-Managedインスタンスのホスト名に置き換えます。
resource = Resource(attributes={ SERVICE_NAME: "animals-django" }) os.environ.setdefault('OTEL_EXPORTER_OTLP_HEADERS', "PRIVATE-TOKEN={{PROJECT_ACCESS_TOKEN}}") traceProvider = TracerProvider(resource=resource) processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="https://gitlab.com/api/v4/projects/{{PROJECT_ID}}/observability/v1/traces")) traceProvider.add_span_processor(processor) trace.set_tracer_provider(traceProvider) reader = PeriodicExportingMetricReader( OTLPMetricExporter(endpoint="https://gitlab.com/api/v4/projects/{{PROJECT_ID}}/observability/v1/metrics") ) meterProvider = MeterProvider(resource=resource, metric_readers=[reader]) metrics.set_meter_provider(meterProvider) meter = metrics.get_meter("default.meter") """Run administrative tasks.""" os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'animals_app.settings') DjangoInstrumentor().instrument()
このコードは、サービス名animals-djangoを定義し、GitLabで認証し、アプリケーションをインストルメント化します。
トレーシングの収集を開始するには、Djangoサーバーを再起動します。
/animalsを数回更新すると、GitLab UIにトレーシングが表示されます。オプション。Djangoはまた、特定のメトリクスをデフォルトでGitLabにエクスポートしますが、カスタムメトリクスもサポートされています。たとえば、ページが読み込むたびにカウンタメトリクスをインクリメントするには、次のコードを追加します:
meter = metrics.get_meter("default.meter") work_counter = meter.create_counter( "animals.viewed.counter", unit="1", description="Counts the number of times the list of animals was viewed" ) work_counter.add(1)

