Splunk4Ninjas Workshops

サンプルアプリケーションのデプロイと OpenTelemetry による計装

15 minutes

ここまでで、K8s クラスターに OpenTelemetry Collector をデプロイし、インフラストラクチャメトリクスの収集に成功しました。

次のステップでは、サンプルアプリケーションをデプロイし、OpenTelemetry で計装してトレースをキャプチャします。

Python で書かれたマイクロサービスベースのアプリケーションを使用します。ワークショップをシンプルに保つため、クレジットチェックサービスとクレジットプロセッサーサービスの2つのサービスに焦点を当てます。

アプリケーションのデプロイ

時間を節約するため、これらのサービスの Docker イメージは事前にビルド済みで、Docker Hub で利用可能です。以下のコマンドで K8s クラスターにクレジットチェックサービスをデプロイできます

bash
kubectl apply -f /home/splunk/workshop/tagging/creditcheckservice-py-with-tags/creditcheckservice-dockerhub.yaml

次に、クレジットプロセッサーサービスをデプロイします

bash
kubectl apply -f /home/splunk/workshop/tagging/creditprocessorservice/creditprocessorservice-dockerhub.yaml

最後に、トラフィックを生成するロードジェネレーターをデプロイします

bash
kubectl apply -f /home/splunk/workshop/tagging/loadgenerator/loadgenerator-dockerhub.yaml

アプリケーションの確認

このセクションでは、アプリケーションの概要を説明します。アプリケーションの完全なソースコードを確認したい場合は、GitHub の Observability Workshop リポジトリ を参照してください。

OpenTelemetry の計装

クレジットチェックサービスとクレジットプロセッサーサービスのビルドに使用される Dockerfile を見ると、すでに OpenTelemetry で計装されていることがわかります。例えば、/home/splunk/workshop/tagging/creditcheckservice-py-with-tags/Dockerfile を見てみましょう

dockerfile
FROM python:3.11-slim

# Set working directory
WORKDIR /app

# Copy requirements over
COPY requirements.txt .

RUN apt-get update && apt-get install --yes gcc python3-dev

ENV PIP_ROOT_USER_ACTION=ignore

# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Copy main app
COPY main.py .

# Bootstrap OTel
RUN opentelemetry-bootstrap -a install

# Set the entrypoint command to run the application
CMD ["opentelemetry-instrument", "python3", "main.py"]

opentelemetry-bootstrap が含まれており、アプリケーションで使用されるサポート対象パッケージに対して OpenTelemetry の計装をインストールしていることがわかります。また、アプリケーション起動コマンドの一部として opentelemetry-instrument が使用されていることもわかります。

/home/splunk/workshop/tagging/creditcheckservice-py-with-tags/requirements.txt ファイルを確認すると、パッケージリストに splunk-opentelemetry[all] が含まれていることがわかります。

最後に、このサービスのデプロイに使用した Kubernetes マニフェスト(/home/splunk/workshop/tagging/creditcheckservice-py-with-tags/creditcheckservice-dockerhub.yaml)を確認すると、OpenTelemetry に OTLP データのエクスポート先を指定するための環境変数がコンテナに設定されていることがわかります

yaml
  env:
    - name: PORT
      value: "8888"
    - name: NODE_IP
      valueFrom:
        fieldRef:
          fieldPath: status.hostIP
    - name: OTEL_EXPORTER_OTLP_ENDPOINT
      value: "http://$(NODE_IP):4317"
    - name: OTEL_SERVICE_NAME
      value: "creditcheckservice"
    - name: OTEL_PROPAGATORS
      value: "tracecontext,baggage"

OpenTelemetry でサービスを計装するために必要なのはこれだけです!

アプリケーションの確認

アプリケーションでいくつかのカスタムタグをキャプチャしています。これについてはすぐに確認しますが、その前にタグの概念とその重要性について紹介します。

タグとは?

タグはキーと値のペアで、トレース内のスパンに関する追加のメタデータを提供し、Splunk APM に送信するスパンのコンテキストを充実させることができます。

例えば、決済処理アプリケーションでは以下の情報を追跡すると便利です

このようにすることで、決済処理中にエラーやパフォーマンスの問題が発生した場合、トラブルシューティングに必要なコンテキストを得ることができます。

一部のタグは OpenTelemetry Collector で追加できますが、このワークショップで扱うタグはより粒度が細かく、アプリケーション開発者が OpenTelemetry SDK を使用して追加するものです。

タグがなぜ重要なのか?

タグは、アプリケーションが真にオブザーバブルであるために不可欠です。タグはトレースにコンテキストを追加し、一部のユーザーが優れたエクスペリエンスを得ている一方で、他のユーザーがそうでない理由を理解するのに役立ちます。Splunk Observability Cloud の強力な機能は、タグを活用して根本原因に素早くたどり着くことを支援します。

用語に関する注意事項です。このワークショップではタグについて説明しており、これは Splunk Observability Cloud で使用される用語ですが、OpenTelemetry では代わりに**属性(attributes)**という用語を使用します。このワークショップでタグという言葉が出てきた場合、属性と同義として扱ってください。

タグはどのようにキャプチャされるのか?

Python アプリケーションでタグをキャプチャするには、まず /home/splunk/workshop/tagging/creditcheckservice-py-with-tags/main.py ファイルの先頭に import 文を追加して trace モジュールをインポートします

python
import requests
from flask import Flask, request
from waitress import serve
from opentelemetry import trace  # <--- ADDED BY WORKSHOP
...

次に、現在のスパンへの参照を取得して、属性(タグ)を追加できるようにします

python
def credit_check():
    current_span = trace.get_current_span()  # <--- ADDED BY WORKSHOP
    customerNum = request.args.get('customernum')
    current_span.set_attribute("customer.num", customerNum)  # <--- ADDED BY WORKSHOP
...

とても簡単ですよね?クレジットチェックサービスでは合計4つのタグをキャプチャしています。最終的な結果は以下のようになります

python
def credit_check():
    current_span = trace.get_current_span()  # <--- ADDED BY WORKSHOP
    customerNum = request.args.get('customernum')
    current_span.set_attribute("customer.num", customerNum)  # <--- ADDED BY WORKSHOP

    # Get Credit Score
    creditScoreReq = requests.get("http://creditprocessorservice:8899/getScore?customernum=" + customerNum)
    creditScoreReq.raise_for_status()
    creditScore = int(creditScoreReq.text)
    current_span.set_attribute("credit.score", creditScore)  # <--- ADDED BY WORKSHOP

    creditScoreCategory = getCreditCategoryFromScore(creditScore)
    current_span.set_attribute("credit.score.category", creditScoreCategory)  # <--- ADDED BY WORKSHOP

    # Run Credit Check
    creditCheckReq = requests.get("http://creditprocessorservice:8899/runCreditCheck?customernum=" + str(customerNum) + "&score=" + str(creditScore))
    creditCheckReq.raise_for_status()
    checkResult = str(creditCheckReq.text)
    current_span.set_attribute("credit.check.result", checkResult)  # <--- ADDED BY WORKSHOP

    return checkResult

トレースデータの確認

Splunk Observability Cloud でトレースデータを確認する前に、以下のコマンドで agent collector のログを tail して、debug exporter がキャプチャした内容を確認しましょう

bash
kubectl logs -l component=otel-collector-agent -f

ヒント:ログの tail を停止するには CTRL+C を使用してください。

以下のようなトレースが agent collector のログに出力されているはずです

text
InstrumentationScope opentelemetry.instrumentation.flask 0.44b0
Span #0
    Trace ID       : 9f9fc109903f25ba57bea9b075aa4833
    Parent ID      : 
    ID             : 6d71519f454f6059
    Name           : /check
    Kind           : Server
    Start time     : 2024-12-23 19:55:25.815891965 +0000 UTC
    End time       : 2024-12-23 19:55:27.824664949 +0000 UTC
    Status code    : Unset
    Status message : 
Attributes:
     -> http.method: Str(GET)
     -> http.server_name: Str(waitress.invalid)
     -> http.scheme: Str(http)
     -> net.host.port: Int(8888)
     -> http.host: Str(creditcheckservice:8888)
     -> http.target: Str(/check?customernum=30134241)
     -> net.peer.ip: Str(10.42.0.19)
     -> http.user_agent: Str(python-requests/2.31.0)
     -> net.peer.port: Str(47248)
     -> http.flavor: Str(1.1)
     -> http.route: Str(/check)
     -> customer.num: Str(30134241)
     -> credit.score: Int(443)
     -> credit.score.category: Str(poor)
     -> credit.check.result: Str(OK)
     -> http.status_code: Int(200)

トレースには、コードでキャプチャしたタグ(属性)である credit.scorecredit.score.category が含まれていることに注目してください。次のセクションでは、Splunk Observability Cloud でトレースを分析し、パフォーマンス問題の根本原因を特定する際にこれらを使用します。

Last Modified ·