Splunk4Ninjas Workshops
サンプルアプリケーションのデプロイと OpenTelemetry による計装
ここまでで、K8s クラスターに OpenTelemetry Collector をデプロイし、インフラストラクチャメトリクスの収集に成功しました。
次のステップでは、サンプルアプリケーションをデプロイし、OpenTelemetry で計装してトレースをキャプチャします。
Python で書かれたマイクロサービスベースのアプリケーションを使用します。ワークショップをシンプルに保つため、クレジットチェックサービスとクレジットプロセッサーサービスの2つのサービスに焦点を当てます。
アプリケーションのデプロイ #
時間を節約するため、これらのサービスの Docker イメージは事前にビルド済みで、Docker Hub で利用可能です。以下のコマンドで K8s クラスターにクレジットチェックサービスをデプロイできます
kubectl apply -f /home/splunk/workshop/tagging/creditcheckservice-py-with-tags/creditcheckservice-dockerhub.yamldeployment.apps/creditcheckservice created
service/creditcheckservice created次に、クレジットプロセッサーサービスをデプロイします
kubectl apply -f /home/splunk/workshop/tagging/creditprocessorservice/creditprocessorservice-dockerhub.yamldeployment.apps/creditprocessorservice created
service/creditprocessorservice created最後に、トラフィックを生成するロードジェネレーターをデプロイします
kubectl apply -f /home/splunk/workshop/tagging/loadgenerator/loadgenerator-dockerhub.yamldeployment.apps/loadgenerator createdアプリケーションの確認 #
このセクションでは、アプリケーションの概要を説明します。アプリケーションの完全なソースコードを確認したい場合は、GitHub の Observability Workshop リポジトリ を参照してください。
OpenTelemetry の計装 #
クレジットチェックサービスとクレジットプロセッサーサービスのビルドに使用される Dockerfile を見ると、すでに OpenTelemetry で計装されていることがわかります。例えば、/home/splunk/workshop/tagging/creditcheckservice-py-with-tags/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 データのエクスポート先を指定するための環境変数がコンテナに設定されていることがわかります
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 に送信するスパンのコンテキストを充実させることができます。
例えば、決済処理アプリケーションでは以下の情報を追跡すると便利です
- 使用された決済タイプ(クレジットカード、ギフトカードなど)
- 決済をリクエストした顧客の ID
このようにすることで、決済処理中にエラーやパフォーマンスの問題が発生した場合、トラブルシューティングに必要なコンテキストを得ることができます。
一部のタグは 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 モジュールをインポートします
import requests
from flask import Flask, request
from waitress import serve
from opentelemetry import trace # <--- ADDED BY WORKSHOP
...次に、現在のスパンへの参照を取得して、属性(タグ)を追加できるようにします
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つのタグをキャプチャしています。最終的な結果は以下のようになります
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 がキャプチャした内容を確認しましょう
kubectl logs -l component=otel-collector-agent -fヒント:ログの tail を停止するには CTRL+C を使用してください。
以下のようなトレースが agent collector のログに出力されているはずです
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.score や credit.score.category が含まれていることに注目してください。次のセクションでは、Splunk Observability Cloud でトレースを分析し、パフォーマンス問題の根本原因を特定する際にこれらを使用します。
