Skip to content

X-SaaSus-Trace-Id 自動引継機能の追加#28

Open
takahujikeita wants to merge 1 commit into
mainfrom
add_x_saasus_trace_id
Open

X-SaaSus-Trace-Id 自動引継機能の追加#28
takahujikeita wants to merge 1 commit into
mainfrom
add_x_saasus_trace_id

Conversation

@takahujikeita

@takahujikeita takahujikeita commented May 21, 2026

Copy link
Copy Markdown

概要

X-SaaSus-Trace-Id ヘッダーの自動引継機能を実装しました。

アプリケーションサーバーが X-SaaSus-Trace-Id ヘッダーを含むリクエストを受信した場合、その値が同一リクエストライフサイクル内の後続の SaaSus API 呼び出しに自動的に転送されます。

変更内容

  • saasus_sdk_python/client/client.py: x_saasus_trace_id フィールドを追加し、set_referer_header() でヘッダーを付与
  • saasus_sdk_python/middleware/middleware.py: authenticate()x_saasus_trace_id を受け取り Client に保存
  • saasus_sdk_python/client/*_client.py: コンストラクタで x_saasus_trace_id を受け取り伝播
  • saasus_sdk_python/__main__.py: リクエストから X-SaaSus-Trace-Id を取得し authenticate に渡す

実装パターン

既存の X-SaaSus-Referer の実装と同じパターンに従っています。

- Add x_saasus_trace_id field to Client singleton
- Inject X-SaaSus-Trace-Id header in set_referer_header()
- Propagate through Authenticate.authenticate() and all API client constructors
- Extract X-SaaSus-Trace-Id from incoming request in fastapi_auth()

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@takahujikeita takahujikeita changed the title Add X-SaaSus-Trace-Id auto-propagation feature X-SaaSus-Trace-Id 自動引継機能の追加 May 21, 2026
@SasakiTakatsugu SasakiTakatsugu requested a review from Copilot June 10, 2026 02:15

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

X-SaaSus-Trace-Id を受信リクエストから取得し、同一リクエストライフサイクル内の後続 SaaSus API 呼び出しへ自動転送できるようにする変更です(既存の X-SaaSus-Referer と同パターンでの伝播)。

Changes:

  • Clientx_saasus_trace_id を保持し、リクエストヘッダーへ X-SaaSus-Trace-Id を付与する処理を追加
  • Authenticate.authenticate()x_saasus_trace_id を受け取り Client に保存
  • Signed*ApiClient のコンストラクタ引数に x_saasus_trace_id を追加し、署名付き呼び出しでヘッダーを伝播
  • FastAPI サンプルでリクエストヘッダーから X-SaaSus-Trace-Id を取り出して authenticate() に渡すよう変更

Reviewed changes

Copilot reviewed 10 out of 12 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
saasus_sdk_python/middleware/middleware.py authenticate()x_saasus_trace_id を追加し Client に保存
saasus_sdk_python/client/client.py Client に trace id を追加し set_referer_header()X-SaaSus-Trace-Id を付与
saasus_sdk_python/client/pricing_client.py SignedPricingApiClient に trace id 引数を追加し Client へ伝播
saasus_sdk_python/client/integration_client.py SignedIntegrationApiClient に trace id 引数を追加し Client へ伝播
saasus_sdk_python/client/communication_client.py SignedCommunicationApiClient に trace id 引数を追加し Client へ伝播
saasus_sdk_python/client/billing_client.py SignedBillingApiClient に trace id 引数を追加し Client へ伝播
saasus_sdk_python/client/awsmarketplace_client.py SignedAwsmarketplaceApiClient に trace id 引数を追加し Client へ伝播
saasus_sdk_python/client/auth_client.py SignedAuthApiClient に trace id 引数を追加し Client へ伝播
saasus_sdk_python/client/apilog_client.py SignedApilogApiClient に trace id 引数を追加し Client へ伝播
saasus_sdk_python/main.py FastAPI 認証で X-SaaSus-Trace-Id を取得して authenticate() に渡す
Comments suppressed due to low confidence (1)

saasus_sdk_python/client/client.py:35

  • Client is a process-wide singleton but now holds x_saasus_trace_id (and other request-derived headers) as mutable attributes. This is not safe under concurrency: values can leak across requests/tasks and attach the wrong trace id to outbound calls.
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.referer = None
            cls._instance.x_saasus_referer = None
            cls._instance.x_saasus_trace_id = None
            cls._instance.api_key = os.getenv("SAASUS_API_KEY", "")
            cls._instance.secret_key = os.getenv("SAASUS_SECRET_KEY", "")
            cls._instance.saas_id = os.getenv("SAASUS_SAAS_ID", "")
            cls._instance.time_provider = lambda: time.strftime("%Y%m%d%H%M", time.gmtime())
            cls._instance.base_url = os.getenv("SAASUS_BASE_URL", "https://api.saasus.io/v1")
        return cls._instance

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +8 to +14
def __init__(self, referer=None, x_saasus_referer=None, x_saasus_trace_id=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.client = Client()
self.configuration.default_headers = {}
self.client.referer = referer
self.client.x_saasus_referer = x_saasus_referer
self.client.x_saasus_trace_id = x_saasus_trace_id
Comment on lines +9 to +15
def __init__(self, referer=None, x_saasus_referer=None, x_saasus_trace_id=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.client = Client()
self.configuration.default_headers = {}
self.client.referer = referer
self.client.x_saasus_referer = x_saasus_referer
self.client.x_saasus_trace_id = x_saasus_trace_id
Comment on lines +9 to +15
def __init__(self, referer=None, x_saasus_referer=None, x_saasus_trace_id=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.client = Client()
self.configuration.default_headers = {}
self.client.referer = referer
self.client.x_saasus_referer = x_saasus_referer
self.client.x_saasus_trace_id = x_saasus_trace_id
Comment on lines +9 to +15
def __init__(self, referer=None, x_saasus_referer=None, x_saasus_trace_id=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.client = Client()
self.configuration.default_headers = {}
self.client.referer = referer
self.client.x_saasus_referer = x_saasus_referer
self.client.x_saasus_trace_id = x_saasus_trace_id
Comment on lines +9 to +15
def __init__(self, referer=None, x_saasus_referer=None, x_saasus_trace_id=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.client = Client()
self.configuration.default_headers = {}
self.client.referer = referer
self.client.x_saasus_referer = x_saasus_referer
self.client.x_saasus_trace_id = x_saasus_trace_id
Comment on lines +9 to +15
def __init__(self, referer=None, x_saasus_referer=None, x_saasus_trace_id=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.client = Client()
self.configuration.default_headers = {}
self.client.referer = referer
self.client.x_saasus_referer = x_saasus_referer
self.client.x_saasus_trace_id = x_saasus_trace_id
Comment on lines +9 to 15
def __init__(self, referer=None, x_saasus_referer=None, x_saasus_trace_id=None, *args, **kwargs):
self.client = Client()
self.client.referer = referer
self.client.x_saasus_referer = x_saasus_referer
self.client.x_saasus_trace_id = x_saasus_trace_id
self.base_url = os.getenv("SAASUS_BASE_URL", "https://api.saasus.io/v1")
super().__init__(*args, **kwargs)
Comment on lines 33 to +35
self.client.referer = referer
self.client.x_saasus_referer = x_saasus_referer
self.client.x_saasus_trace_id = x_saasus_trace_id
Comment on lines 51 to +53
referer = request.headers.get("Referer", "")
user_info, error = auth.authenticate(id_token=token, referer=referer)
x_saasus_trace_id = request.headers.get("X-SaaSus-Trace-Id", "")
user_info, error = auth.authenticate(id_token=token, referer=referer, x_saasus_trace_id=x_saasus_trace_id)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants