项目文件夹

文件
wehub-resource-sync 5a558eb09e
TypeScript SDK Compatibility V1.x E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / TypeScript SDK Compatibility V1.x E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
TypeScript SDK E2E Tests / TypeScript SDK E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
Python SDK E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK E2E Tests / Python SDK E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK E2E Tests / build-opik (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Python SDK Compatibility V1.x E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK E2E Tests / build-opik (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer E2E Tests Python ${{matrix.python_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer Integration Smoke Tests (push) Has been cancelled
🐙 Code Quality / detect (push) Has been cancelled
🐙 Code Quality / lint (${{ matrix.leg.name }}) (push) Has been cancelled
🐙 Code Quality / summary (push) Has been cancelled
TypeScript SDK Library Integration Tests / Check Secrets (push) Has been cancelled
TypeScript SDK Library Integration Tests / opik-vercel (Vercel AI SDK / eve) (push) Has been cancelled
SDK Library Integration Tests Runner / Check Secrets (push) Has been cancelled
SDK Library Integration Tests Runner / Missed OpenAI API Key Warning (push) Has been cancelled
SDK Library Integration Tests Runner / Build (push) Has been cancelled
SDK Library Integration Tests Runner / openai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_legacy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / llama_index_tests (push) Has been cancelled
SDK Library Integration Tests Runner / anthropic_tests (push) Has been cancelled
SDK Library Integration Tests Runner / mistral_tests (push) Has been cancelled
SDK Library Integration Tests Runner / groq_tests (push) Has been cancelled
SDK Library Integration Tests Runner / aisuite_tests (push) Has been cancelled
SDK Library Integration Tests Runner / haystack_tests (push) Has been cancelled
SDK Library Integration Tests Runner / dspy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v1_tests (push) Has been cancelled
SDK Library Integration Tests Runner / genai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_legacy_1_3_0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / evaluation_metrics_tests (push) Has been cancelled
SDK Library Integration Tests Runner / bedrock_tests (push) Has been cancelled
SDK Library Integration Tests Runner / litellm_tests (push) Has been cancelled
SDK Library Integration Tests Runner / harbor_tests (push) Has been cancelled
SDK Library Integration Tests Runner / Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / render-equality (push) Has been cancelled
Opik Optimizer - Unit Tests / Opik Optimizer Unit Tests Python ${{matrix.python_version}} (push) Has been cancelled
Python BE E2E Tests / Python BE E2E (push) Has been cancelled
Python Backend Tests / run-python-backend-tests (push) Has been cancelled
Python SDK Unit Tests / Python SDK Unit Tests ${{matrix.python_version}} (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
SDK E2E Libraries Integration Tests / Check Secrets (push) Has been cancelled
SDK E2E Libraries Integration Tests / Missed OpenAI API Key Warning (push) Has been cancelled
SDK E2E Libraries Integration Tests / build-opik (push) Has been cancelled
SDK E2E Libraries Integration Tests / E2E Lib Integration Python ${{matrix.python_version}} (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-gemini) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-langchain) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-openai) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-otel) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-vercel) (push) Has been cancelled
TypeScript SDK Build & Publish / build-and-publish (push) Has been cancelled
TypeScript SDK Unit Tests / Test on Node ${{ matrix.node-version }} (push) Has been cancelled
Backend Tests / discover-tests (push) Has been cancelled
Backend Tests / ${{ matrix.name }} (push) Has been cancelled
Build and Publish SDK / build-and-publish (push) Has been cancelled
Build Opik Docker Images / set-version (push) Has been cancelled
Build Opik Docker Images / build-backend (push) Has been cancelled
Build Opik Docker Images / build-sandbox-executor-python (push) Has been cancelled
Build Opik Docker Images / build-python-backend (push) Has been cancelled
Build Opik Docker Images / build-frontend (push) Has been cancelled
Build Opik Docker Images / create-git-tag (push) Has been cancelled
ClickHouse Migration Cluster Check / validate-clickhouse-migrations (push) Has been cancelled
Docs - Publish / run (push) Has been cancelled
E2E Tests - Post Merge (v2) / 🧪 E2E v2 Tests (${{ github.event.inputs.tier || 't1' }}) (push) Has been cancelled
E2E Tests - Post Merge (v2) / 📢 Slack Notification (push) Has been cancelled
Frontend Unit Tests / Test on Node 20 (push) Has been cancelled
Guardrails E2E Tests / Select Python version matrix (push) Has been cancelled
Guardrails E2E Tests / Guardrails E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Guardrails E2E Tests / 📢 Slack Notification (push) Has been cancelled
Guardrails Backend Unit Tests / Guardrails Backend Unit Tests (push) Has been cancelled
Guardrails Backend Unit Tests / 📢 Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v3.21.0) (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v4.2.0) (push) Has been cancelled
Lint Opik Helm Chart / unittest-helm-chart (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:25:44 +08:00

240 行
8.7 KiB
YAML

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
name: Load Tests (SDK ingestion)
run-name: "Load Tests ${{ github.ref_name }} by @${{ github.actor }}"
permissions:
contents: read
# checks: write so EnricoMi/publish-unit-test-result-action can post the
# "Load Test Results" check; without it the step gets 403 Forbidden and
# fails the whole workflow even when all scenarios passed.
checks: write
on:
schedule:
- cron: '0 4 * * 0' # Weekly, Sunday 04:00 UTC
workflow_dispatch:
env:
OPIK_ENABLE_LITELLM_MODELS_MONITORING: False
OPIK_SENTRY_ENABLE: False
OPIK_URL_OVERRIDE: http://localhost:8080
OPIK_CONSOLE_LOGGING_LEVEL: WARNING
jobs:
run-load-tests:
# Larger GitHub-hosted runner (~4 vCPU / 16 GB) instead of the default
# ubuntu-latest (2 vCPU / 7 GB). The heaviest ingestion scenarios
# (e.g. test_many_spans_per_trace) intermittently OOM-killed an xdist
# worker on 7 GB; the extra memory headroom is what stops that.
runs-on: ubuntu-latest-m
timeout-minutes: 60
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Run latest Opik server
env:
OPIK_USAGE_REPORT_ENABLED: false
COMPOSE_BAKE: false
TOGGLE_RUNNERS_ENABLED: "true"
run: |
cd ${{ github.workspace }}
./opik.sh --backend --port-mapping --build
- name: Check Opik server availability
shell: bash
run: |
chmod +x ${{ github.workspace }}/tests_end_to_end/installer_utils/*.sh
cd ${{ github.workspace }}/deployment/docker-compose
${{ github.workspace }}/tests_end_to_end/installer_utils/check_docker_compose_pods.sh
${{ github.workspace }}/tests_end_to_end/installer_utils/check_backend.sh
- name: Install Opik SDK
run: |
cd ${{ github.workspace }}/sdks/python
pip install .
- name: Install Python SDK load-test requirements
run: |
cd ${{ github.workspace }}/tests_load/suite/python_sdk
pip install -r requirements.txt
- name: Run Python SDK load tests
# -n 2 + --dist=worksteal runs two scenarios in parallel at a time.
# History: on the old 7 GB ubuntu-latest, `-n auto` (= 4 workers)
# reliably OOM-killed the heaviest scenarios
# (test_many_traces_one_span_each, test_many_spans_per_trace) when
# co-scheduled against the same docker-compose Opik stack, and even
# -n 2 still crashed a worker occasionally. The job now runs on the
# larger ubuntu-latest-m (~16 GB, see runs-on above), so -n 2 has
# comfortable memory headroom; it's kept conservative for now and can
# be raised toward -n auto on the larger runner if more parallelism is
# wanted. Each test uses a unique project so isolation holds. Worksteal
# balances the very uneven per-test durations (spread is window-locked
# at 600 s, others run in 1-6 min).
run: |
cd ${{ github.workspace }}/tests_load
pytest suite/python_sdk -n 2 --dist=worksteal --junitxml=${{ github.workspace }}/load_test_results.xml
- name: Render metrics into job summary
if: always()
run: |
python - <<'PY' >> "$GITHUB_STEP_SUMMARY"
import json
import pathlib
metrics_dir = pathlib.Path("tests_load/.last_run")
files = sorted(metrics_dir.glob("*.json")) if metrics_dir.exists() else []
if not files:
print("## Load test metrics\n\n_No metrics produced (suite did not run)._")
raise SystemExit
def fmt_seconds(value):
if not isinstance(value, (int, float)):
return "—"
return f"{value / 60:.1f} m" if value >= 60 else f"{value:.1f} s"
def fmt_count(value):
return f"{value:,}" if isinstance(value, (int, float)) else "—"
def submit_seconds(metrics):
# The submit phase is timed as "logging" for trace-based tests and
# as "insert" for the dataset-versions test.
for key in ("logging_seconds", "insert_seconds"):
if isinstance(metrics.get(key), (int, float)):
return metrics[key]
return None
def submitted_volume(metrics):
# Returns (count, label). Picks the most representative unit per
# test type so the table shows what was actually submitted.
if "expected_total_items" in metrics:
return metrics["expected_total_items"], (
f"{metrics['expected_total_items']:,} items"
)
if "total_traces" in metrics:
return metrics["total_traces"], (
f"{metrics['total_traces']:,} traces"
)
trace_count = metrics.get("trace_count")
spans_per_trace = metrics.get("spans_per_trace")
if isinstance(trace_count, int) and isinstance(spans_per_trace, int):
return trace_count, (
f"{trace_count:,} traces × {spans_per_trace} spans"
)
if isinstance(trace_count, int):
return trace_count, f"{trace_count:,} traces"
return None, "—"
def submit_rate(count, seconds):
if count is None or not isinstance(seconds, (int, float)) or seconds <= 0:
return "—"
return f"{count / seconds:,.0f}/s"
def total_seconds(metrics):
parts = [
metrics.get(key)
for key in (
"logging_seconds",
"insert_seconds",
"flush_seconds",
"verify_seconds",
)
]
parts = [p for p in parts if isinstance(p, (int, float))]
return sum(parts) if parts else None
def delivered_count(metrics):
for key in ("delivered_trace_count", "delivered_item_count"):
if key in metrics:
return metrics[key]
return None
print("## Load test metrics\n")
print(
"_Submit = time spent calling decorated functions / context managers."
" Submit rate = volume ÷ submit time."
" Total = submit + flush + verify._\n"
)
print(
"| Test | Volume | Submit | Submit rate"
" | Flush | Verify | Total | Delivered |"
)
print(
"| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: |"
)
payloads = []
for path in files:
metrics = json.loads(path.read_text())
payloads.append(metrics)
name = metrics.get("test_name", path.stem)
count, volume_label = submitted_volume(metrics)
submit_s = submit_seconds(metrics)
print(
f"| `{name}`"
f" | {volume_label}"
f" | {fmt_seconds(submit_s)}"
f" | {submit_rate(count, submit_s)}"
f" | {fmt_seconds(metrics.get('flush_seconds'))}"
f" | {fmt_seconds(metrics.get('verify_seconds'))}"
f" | {fmt_seconds(total_seconds(metrics))}"
f" | {fmt_count(delivered_count(metrics))} |"
)
print("\n<details>\n<summary>Per-test metrics (raw JSON)</summary>\n")
for metrics in payloads:
print(f"\n**{metrics.get('test_name', '?')}**")
print("```json")
print(json.dumps(metrics, indent=2))
print("```")
print("\n</details>")
PY
- name: Upload metrics report
if: always()
uses: actions/upload-artifact@v7
with:
name: load-test-metrics
path: ${{ github.workspace }}/tests_load/.last_run/
- name: Publish Test Report
uses: EnricoMi/publish-unit-test-result-action/linux@v2
if: always()
with:
action_fail: true
comment_mode: failures
check_name: Load Test Results
files: ${{ github.workspace }}/load_test_results.xml
- name: Keep BE log in case of failure
if: failure()
run: |
docker logs opik-backend-1 > ${{ github.workspace }}/opik-backend.log
- name: Attach BE log
if: failure()
uses: actions/upload-artifact@v7
with:
name: opik-backend-log
path: ${{ github.workspace }}/opik-backend.log
- name: Stop opik server
if: always()
run: |
cd ${{ github.workspace }}
./opik.sh --stop