fix(api): 修復全部 lint 錯誤 (ruff --fix)

- Import sorting (I001)
- Unused imports (F401)
- f-string without placeholders (F541)
- Loop variable unused (B007)
- zip() strict parameter (B905)
- Exception chaining (B904)
- collections.abc imports (UP035)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-03-26 16:06:20 +08:00
parent e26ea526b1
commit 30153496d1
38 changed files with 3041 additions and 101 deletions

View File

@@ -3,7 +3,7 @@ AWOOOI OpenTelemetry Configuration
==================================
P0 基礎設施: 可觀測性鐵律
Traces → SigNoz (192.168.0.188:4317)
Traces + Metrics → SigNoz (192.168.0.188:24317)
四主機架構強制校驗:
| IP | 允許 OTEL? |
@@ -16,16 +16,34 @@ Traces → SigNoz (192.168.0.188:4317)
優雅降級 (Graceful Degradation):
- OTEL 連線失敗不會導致 API 崩潰
- 使用 BatchSpanProcessor 非同步傳輸
- 使用 PeriodicExportingMetricReader 批量送出指標
- 連線超時後自動跳過追蹤
Phase 13.3 新增:
- OTEL Metrics (llm.tokens.*, llm.cost.*, llm.latency.*)
- Token Counter 整合
版本: v1.1
最後修改: 2026-03-26 14:30 (台北時區)
修改者: Claude Code
變更紀錄:
| 版本 | 日期 | 執行者 | 變更內容 |
|------|------|--------|----------|
| v1.0 | - | - | 初始 Traces 實作 |
| v1.1 | 2026-03-26 | Claude Code | Phase 13.3 新增 Metrics Provider |
"""
import logging
from opentelemetry import trace
from opentelemetry import metrics, trace
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
from opentelemetry.instrumentation.logging import LoggingInstrumentor
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.sdk.resources import SERVICE_NAME, SERVICE_VERSION, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
@@ -37,6 +55,7 @@ _logger = logging.getLogger("awoooi.telemetry")
# Global state
_tracer_provider: TracerProvider | None = None
_meter_provider: MeterProvider | None = None
_initialized: bool = False
@@ -84,7 +103,7 @@ def setup_telemetry(app) -> bool:
- 如果 OTEL_ENABLED=false跳過初始化
- 如果連線失敗API 仍可正常運作
"""
global _tracer_provider, _initialized
global _tracer_provider, _meter_provider, _initialized
# 檢查是否啟用
if settings.MOCK_MODE:
@@ -114,12 +133,14 @@ def setup_telemetry(app) -> bool:
"service.namespace": "awoooi",
})
# 建立 TracerProvider
# =====================================================================
# Traces Provider
# =====================================================================
_tracer_provider = TracerProvider(resource=resource)
# 建立 OTLP Exporter (gRPC)
# 使用 BatchSpanProcessor 實現非同步傳輸 (優雅降級關鍵)
otlp_exporter = OTLPSpanExporter(
otlp_trace_exporter = OTLPSpanExporter(
endpoint=settings.OTEL_EXPORTER_OTLP_ENDPOINT,
insecure=True, # 內網使用,無需 TLS
timeout=5, # 5 秒超時,避免阻塞
@@ -130,7 +151,7 @@ def setup_telemetry(app) -> bool:
# 2. 連線失敗時自動丟棄 spans不影響 API
# 3. 記憶體保護: max_queue_size 限制
span_processor = BatchSpanProcessor(
otlp_exporter,
otlp_trace_exporter,
max_queue_size=2048, # 最大佇列大小
max_export_batch_size=512, # 批量大小
schedule_delay_millis=5000, # 5 秒批量間隔
@@ -139,6 +160,32 @@ def setup_telemetry(app) -> bool:
_tracer_provider.add_span_processor(span_processor)
trace.set_tracer_provider(_tracer_provider)
# =====================================================================
# Metrics Provider (Phase 13.3 #88)
# =====================================================================
otlp_metric_exporter = OTLPMetricExporter(
endpoint=settings.OTEL_EXPORTER_OTLP_ENDPOINT,
insecure=True,
timeout=5,
)
# PeriodicExportingMetricReader: 每 30 秒批量送出指標
metric_reader = PeriodicExportingMetricReader(
otlp_metric_exporter,
export_interval_millis=30000, # 30 秒
)
_meter_provider = MeterProvider(
resource=resource,
metric_readers=[metric_reader],
)
metrics.set_meter_provider(_meter_provider)
_logger.info("OTEL Metrics Provider 初始化成功")
# =====================================================================
# Auto Instrumentation
# =====================================================================
# 自動埋入 FastAPI 追蹤
FastAPIInstrumentor.instrument_app(
app,
@@ -157,7 +204,7 @@ def setup_telemetry(app) -> bool:
_initialized = True
_logger.info(
f"OTEL 初始化成功: "
f"OTEL 初始化成功 (Traces + Metrics): "
f"service={settings.OTEL_SERVICE_NAME}, "
f"endpoint={settings.OTEL_EXPORTER_OTLP_ENDPOINT}"
)