chore: import upstream snapshot with attribution
Deploy Documentation / deploy (push) Has been cancelled
CPU Test / Test (Utilities, legacy, Python 3.10) (push) Has been cancelled
CPU Test / Test (LLM proxy, stable, Python 3.11) (push) Has been cancelled
CPU Test / Test (Others, stable, Python 3.11) (push) Has been cancelled
CPU Test / Test (Store, stable, Python 3.11) (push) Has been cancelled
CPU Test / Test (Utilities, stable, Python 3.11) (push) Has been cancelled
CPU Test / Test (Weave, stable, Python 3.11) (push) Has been cancelled
CPU Test / Test (AgentOps, stable, Python 3.12) (push) Has been cancelled
CPU Test / Test (LLM proxy, stable, Python 3.12) (push) Has been cancelled
CPU Test / Test (Others, stable, Python 3.12) (push) Has been cancelled
CPU Test / Test (Weave, latest, Python 3.13) (push) Has been cancelled
Dashboard / Chromatic (push) Has been cancelled
CPU Test / Lint - fast (push) Has been cancelled
CPU Test / Lint - next (push) Has been cancelled
CPU Test / Lint - slow (push) Has been cancelled
CPU Test / Lint - JavaScript (push) Has been cancelled
CPU Test / Build documentation (push) Has been cancelled
CPU Test / Test (AgentOps, legacy, Python 3.10) (push) Has been cancelled
CPU Test / Test (LLM proxy, legacy, Python 3.10) (push) Has been cancelled
CPU Test / Test (Others, legacy, Python 3.10) (push) Has been cancelled
CPU Test / Test (Store, legacy, Python 3.10) (push) Has been cancelled
CPU Test / Test (Weave, legacy, Python 3.10) (push) Has been cancelled
CPU Test / Test (AgentOps, stable, Python 3.11) (push) Has been cancelled
CPU Test / Test (Store, stable, Python 3.12) (push) Has been cancelled
CPU Test / Test (Utilities, stable, Python 3.12) (push) Has been cancelled
CPU Test / Test (Weave, stable, Python 3.12) (push) Has been cancelled
CPU Test / Test (AgentOps, latest, Python 3.13) (push) Has been cancelled
CPU Test / Test (LLM proxy, latest, Python 3.13) (push) Has been cancelled
CPU Test / Test (Others, latest, Python 3.13) (push) Has been cancelled
CPU Test / Test (Store, latest, Python 3.13) (push) Has been cancelled
CPU Test / Test (Utilities, latest, Python 3.13) (push) Has been cancelled
CPU Test / Test (JavaScript) (push) Has been cancelled

This commit is contained in:
wehub-resource-sync
2026-07-13 12:44:17 +08:00
commit 85742ab165
588 changed files with 320176 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
# Use a Python image with uv pre-installed
FROM ghcr.io/astral-sh/uv:python3.12-bookworm
# Setup a non-root user
RUN groupadd --system --gid 999 nonroot \
&& useradd --system --gid 999 --uid 999 --create-home nonroot
# Install the project into `/app`
WORKDIR /app
# Enable bytecode compilation
ENV UV_COMPILE_BYTECODE=1
# Copy from the cache instead of linking since it's a mounted volume
ENV UV_LINK_MODE=copy
# Ensure installed tools can be executed out of the box
ENV UV_TOOL_BIN_DIR=/usr/local/bin
# Install the project's dependencies using the lockfile and settings
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync --locked --no-install-project --group dev --extra mongo --group core-stable
# Then, add the rest of the project source code and install it
# Installing separately from its dependencies allows optimal layer caching
COPY . /app
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --locked --group dev --extra mongo --group core-stable
# Place executables in the environment at the front of the path
ENV PATH="/app/.venv/bin:$PATH"
# Reset the entrypoint, don't invoke `uv`
ENTRYPOINT []
# Use the non-root user to run our application
USER nonroot
+29
View File
@@ -0,0 +1,29 @@
services:
prometheus:
image: prom/prometheus:latest
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
volumes:
- ./prometheus/prometheus.base.yml:/etc/prometheus/prometheus.yml:ro
- ${AGL_MONITORING_DATA_PATH:?Set AGL_MONITORING_DATA_PATH to the metrics directory}/prometheus:/prometheus
ports:
- "9090:9090"
grafana:
image: grafana/grafana:latest
depends_on:
- prometheus
ports:
- "9091:3000"
volumes:
- ./data/grafana:/var/lib/grafana
- ./grafana/datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml
- ./grafana/dashboard-provider.yml:/etc/grafana/provisioning/dashboards/provider.yml
- ./grafana/dashboards:/var/lib/grafana/dashboards
environment:
- GF_INSTALL_PLUGINS=grafana-piechart-panel
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- GF_AUTH_DISABLE_LOGIN_FORM=true
- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/agentlightning.json
+22
View File
@@ -0,0 +1,22 @@
# Docker-compose file to launch a MongoDB server for development.
# It's used to test the MongoDB store implementation.
services:
mongo:
image: mongo:8.2
ulimits:
nofile:
soft: 65535
hard: 65535
ports:
- "27017:27017"
command: ["mongod", "--bind_ip_all", "--replSet", "rs0"]
volumes:
- ../scripts/mongodb_init_rs_host.js:/docker-entrypoint-initdb.d/init-rs.js:ro
- ./data/mongo-host:/data/db
healthcheck:
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
@@ -0,0 +1,81 @@
services:
app:
extends:
file: compose.store.yml
service: app
depends_on:
- app-exporter # Wait for the exporter to be ready first
command: agl store --host 0.0.0.0 --port 4747 --tracker console prometheus --backend memory
environment:
- PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_multiproc
volumes:
- prometheus_multiproc:/tmp/prometheus_multiproc
app-exporter:
build:
context: ../
dockerfile: docker/Dockerfile.dev
command: agl prometheus --host 0.0.0.0 --port 4748
ports:
- "4748:4748"
environment:
- PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_multiproc
volumes:
- prometheus_multiproc:/tmp/prometheus_multiproc
node-exporter:
image: prom/node-exporter:latest
# In CI you might not have full /proc, but this is OK for container-level stats
pid: "host"
command:
- "--path.rootfs=/host"
volumes:
- "/:/host:ro,rslave"
prometheus:
image: prom/prometheus:latest
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--storage.tsdb.retention.time=1h"
volumes:
- ./prometheus/prometheus.base.yml:/etc/prometheus/prometheus.yml:ro
- ./data/prometheus:/prometheus
depends_on:
- app
- app-exporter
- node-exporter
ports:
- "9090:9090"
grafana:
image: grafana/grafana:latest
ports:
- "9091:3000"
depends_on:
- prometheus
volumes:
- ./data/grafana:/var/lib/grafana
# 1. Mount the Datasource Config
- ./grafana/datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml
# 2. Mount the Dashboard Provider Config
- ./grafana/dashboard-provider.yml:/etc/grafana/provisioning/dashboards/provider.yml
# 3. Mount the folder containing the actual JSON files
- ./grafana/dashboards:/var/lib/grafana/dashboards
environment:
- GF_INSTALL_PLUGINS=grafana-piechart-panel
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- GF_AUTH_DISABLE_LOGIN_FORM=true
- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/agentlightning.json
volumes:
prometheus_multiproc:
driver: local
driver_opts:
type: tmpfs
device: tmpfs
+116
View File
@@ -0,0 +1,116 @@
services:
mongo:
extends:
file: compose.mongo.yml
service: mongo
hostname: mongo
volumes:
- ./data/mongo-container:/data/db
- ../scripts/mongodb_init_rs_profiling.js:/docker-entrypoint-initdb.d/init-rs.js:ro
# This forces "mongo" to resolve to localhost ONLY inside this container.
# This allows rs.initiate to succeed using the hostname "mongo".
extra_hosts:
- "mongo:127.0.0.1"
app:
extends:
file: compose.store.yml
service: app
depends_on:
- mongo
- app-exporter # Wait for the exporter to be ready first
command:
- /bin/bash
- -c
- |
agl store --host 0.0.0.0 --port 4747 \
--tracker console prometheus --backend mongo \
--mongo-uri mongodb://mongo:27017/?replicaSet=rs0 \
--n-workers ${AGL_STORE_N_WORKERS:-32}
environment:
- PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_multiproc
volumes:
- prometheus_multiproc:/tmp/prometheus_multiproc
app-exporter:
build:
context: ../
dockerfile: docker/Dockerfile.dev
command: agl prometheus --host 0.0.0.0 --port 4748
ports:
- "4748:4748"
environment:
- PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_multiproc
volumes:
- prometheus_multiproc:/tmp/prometheus_multiproc
mongodb-exporter:
image: percona/mongodb_exporter:0.47.1
command:
- "--mongodb.uri=mongodb://mongo:27017/"
- "--collect-all"
- "--mongodb.collstats-colls=agentlightning.rollouts,agentlightning.attempts,agentlightning.spans,agentlightning.resources,agentlightning.workers,agentlightning.rollout_queue,agentlightning.span_sequence_ids"
depends_on:
- mongo
ports:
- "9216:9216"
node-exporter:
image: prom/node-exporter:latest
# In CI you might not have full /proc, but this is OK for container-level stats
pid: "host"
command:
- "--path.rootfs=/host"
volumes:
- "/:/host:ro,rslave"
prometheus:
image: prom/prometheus:latest
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--storage.tsdb.retention.time=1h"
volumes:
- ./prometheus/prometheus.mongo.yml:/etc/prometheus/prometheus.yml:ro
- ./data/prometheus:/prometheus
depends_on:
- app
- app-exporter
- mongodb-exporter
- node-exporter
ports:
- "9090:9090"
grafana:
image: grafana/grafana:latest
ports:
- "9091:3000"
depends_on:
- prometheus
volumes:
- ./data/grafana:/var/lib/grafana
# 1. Mount the Datasource Config
- ./grafana/datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml
# 2. Mount the Dashboard Provider Config
- ./grafana/dashboard-provider.yml:/etc/grafana/provisioning/dashboards/provider.yml
# 3. Mount the folder containing the actual JSON files
- ./grafana/dashboards:/var/lib/grafana/dashboards
environment:
- GF_INSTALL_PLUGINS=grafana-piechart-panel
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- GF_AUTH_DISABLE_LOGIN_FORM=true
- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/agentlightning.json
volumes:
prometheus_multiproc:
driver: local
driver_opts:
type: tmpfs
device: tmpfs
+30
View File
@@ -0,0 +1,30 @@
services:
app:
build:
context: ../
dockerfile: docker/Dockerfile.dev
ports:
- "4747:4747"
command: agl store --host 0.0.0.0 --port 4747
ulimits:
nofile:
soft: 65535
hard: 65535
develop:
watch:
# Sync the working directory with the `/app` directory in the container
- action: sync
path: ..
target: /app
# Exclude the project virtual environment — it could be for a
# different platform in the container
ignore:
- .venv/
# Rebuild the image if dependencies change by checking uv.lock
- action: rebuild
path: ../uv.lock
+12
View File
@@ -0,0 +1,12 @@
apiVersion: 1
providers:
- name: "default"
orgId: 1
folder: ""
type: file
disableDeletion: false
updateIntervalSeconds: 10
options:
# This tells Grafana to look for JSON files in this directory inside the container
path: /var/lib/grafana/dashboards
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,530 @@
{
"annotations": {
"list": []
},
"editable": true,
"gnetId": null,
"graphTooltip": 0,
"id": null,
"links": [],
"panels": [
{
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 0
},
"id": 100,
"panels": [],
"title": "LightningStore HTTP API",
"type": "row"
},
{
"fieldConfig": {
"defaults": {
"unit": "ops/s"
}
},
"gridPos": {
"h": 8,
"w": 8,
"x": 0,
"y": 1
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "sum by (method, path) (rate(agl_http_latency_count[15s]))",
"legendFormat": "{{method}} {{path}}"
}
],
"title": "HTTP Requests / Sec (by Path)",
"type": "timeseries"
},
{
"fieldConfig": {
"defaults": {
"unit": "s"
}
},
"gridPos": {
"h": 8,
"w": 8,
"x": 8,
"y": 1
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "histogram_quantile(0.50, sum by (le) (rate(agl_http_latency_bucket[15s])))",
"legendFormat": "P50"
},
{
"expr": "histogram_quantile(0.95, sum by (le) (rate(agl_http_latency_bucket[15s])))",
"legendFormat": "P95"
},
{
"expr": "histogram_quantile(0.99, sum by (le) (rate(agl_http_latency_bucket[15s])))",
"legendFormat": "P99"
}
],
"title": "HTTP Latency (P50, P95, P99)",
"type": "timeseries"
},
{
"fieldConfig": {
"defaults": {
"unit": "ops/s"
}
},
"gridPos": {
"h": 8,
"w": 8,
"x": 16,
"y": 1
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "sum by (method, path, status) (rate(agl_http_latency_count{status!~\"2..\"}[15s]))",
"legendFormat": "{{method}} {{path}} {{status}}"
}
],
"title": "HTTP Errors / Sec (non-2xx)",
"type": "timeseries"
},
{
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 9
},
"id": 200,
"panels": [],
"title": "LightningStore RPC Metrics",
"type": "row"
},
{
"fieldConfig": {
"defaults": {
"unit": "ops/s"
}
},
"gridPos": {
"h": 8,
"w": 8,
"x": 0,
"y": 10
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "sum by (method) (rate(agl_store_latency_count[15s]))",
"legendFormat": "{{method}}"
}
],
"title": "Store Calls / Sec (by Method)",
"type": "timeseries"
},
{
"fieldConfig": {
"defaults": {
"unit": "s"
}
},
"gridPos": {
"h": 8,
"w": 8,
"x": 8,
"y": 10
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "histogram_quantile(0.50, sum by (le) (rate(agl_store_latency_bucket[15s])))",
"legendFormat": "P50"
},
{
"expr": "histogram_quantile(0.95, sum by (le) (rate(agl_store_latency_bucket[15s])))",
"legendFormat": "P95"
},
{
"expr": "histogram_quantile(0.99, sum by (le) (rate(agl_store_latency_bucket[15s])))",
"legendFormat": "P99"
}
],
"title": "Store Latency (P50, P95, P99)",
"type": "timeseries"
},
{
"fieldConfig": {
"defaults": {
"unit": "ops/s"
}
},
"gridPos": {
"h": 8,
"w": 8,
"x": 16,
"y": 10
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "sum by (method, status) (rate(agl_store_latency_count{status!=\"OK\"}[15s]))",
"legendFormat": "{{method}} {{status}}"
}
],
"title": "Store Errors / Sec (by Method)",
"type": "timeseries"
},
{
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 18
},
"id": 300,
"panels": [],
"title": "Collection Metrics",
"type": "row"
},
{
"fieldConfig": {
"defaults": {
"unit": "ops/s"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 19
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "sum by (store_pubmeth, operation) (rate(agl_collections_latency_count[15s]))",
"legendFormat": "{{store_pubmeth}} {{operation}}"
}
],
"title": "Collection Ops / Sec (by Store Method)",
"type": "timeseries"
},
{
"fieldConfig": {
"defaults": {
"unit": "ops/s"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 19
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "sum by (store_pubmeth, collection, status) (rate(agl_collections_latency_count{status!=\"OK\"}[15s]))",
"legendFormat": "{{store_pubmeth}} {{collection}} {{status}}"
}
],
"title": "Collection Errors / Sec",
"type": "timeseries"
},
{
"fieldConfig": {
"defaults": {
"unit": "s"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 27
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "histogram_quantile(0.50, sum by (le) (rate(agl_collections_latency_bucket[15s])))",
"legendFormat": "P50"
},
{
"expr": "histogram_quantile(0.95, sum by (le) (rate(agl_collections_latency_bucket[15s])))",
"legendFormat": "P95"
},
{
"expr": "histogram_quantile(0.99, sum by (le) (rate(agl_collections_latency_bucket[15s])))",
"legendFormat": "P99"
}
],
"title": "Collection Latency (P50, P95, P99)",
"type": "timeseries"
},
{
"fieldConfig": {
"defaults": {
"unit": "s"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 27
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "histogram_quantile(0.95, sum by (le, store_pubmeth) (rate(agl_collections_latency_bucket[15s])))",
"legendFormat": "{{store_pubmeth}}"
}
],
"title": "Collection Latency P95 (by Store Method)",
"type": "timeseries"
},
{
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 35
},
"id": 400,
"panels": [],
"title": "Rollout Outcomes",
"type": "row"
},
{
"fieldConfig": {
"defaults": {
"unit": "ops/s"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 36
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "sum by (status) (rate(agl_rollouts_duration_count[15s]))",
"legendFormat": "{{status}}"
}
],
"title": "Rollout Completion Rate (by Status)",
"type": "timeseries"
},
{
"fieldConfig": {
"defaults": {
"unit": "ops/s"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 36
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "sum by (mode) (rate(agl_rollouts_duration_count[15s]))",
"legendFormat": "{{mode}}"
}
],
"title": "Rollout Completion Rate (by Mode)",
"type": "timeseries"
},
{
"fieldConfig": {
"defaults": {
"unit": "s"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 44
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "histogram_quantile(0.50, sum by (le) (rate(agl_rollouts_duration_bucket[15s])))",
"legendFormat": "P50"
},
{
"expr": "histogram_quantile(0.95, sum by (le) (rate(agl_rollouts_duration_bucket[15s])))",
"legendFormat": "P95"
},
{
"expr": "histogram_quantile(0.99, sum by (le) (rate(agl_rollouts_duration_bucket[15s])))",
"legendFormat": "P99"
}
],
"title": "Rollout Duration (P50, P95, P99)",
"type": "timeseries"
},
{
"fieldConfig": {
"defaults": {
"unit": "s"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 44
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"expr": "histogram_quantile(0.95, sum by (le, status) (rate(agl_rollouts_duration_bucket[15s])))",
"legendFormat": "{{status}}"
}
],
"title": "Rollout Duration P95 (by Status)",
"type": "timeseries"
}
],
"schemaVersion": 36,
"style": "dark",
"tags": [
"agentlightning"
],
"templating": {
"list": []
},
"time": {
"from": "now-10m",
"to": "now"
},
"title": "Agent Lightning Metrics",
"version": 2
}
+8
View File
@@ -0,0 +1,8 @@
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
+13
View File
@@ -0,0 +1,13 @@
global:
scrape_interval: 5s
evaluation_interval: 5s
scrape_configs:
- job_name: app
static_configs:
- targets: ["app-exporter:4748"]
metrics_path: /v1/prometheus/
- job_name: node
static_configs:
- targets: ["node-exporter:9100"]
+17
View File
@@ -0,0 +1,17 @@
global:
scrape_interval: 5s
evaluation_interval: 5s
scrape_configs:
- job_name: app
static_configs:
- targets: ["app-exporter:4748"]
metrics_path: /v1/prometheus/
- job_name: node
static_configs:
- targets: ["node-exporter:9100"]
- job_name: mongodb
static_configs:
- targets: ["mongodb-exporter:9216"]
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
set -euo pipefail
# Create data directories
mkdir -p data/prometheus data/mongo-container data/mongo-host data/grafana
# Change permissions
chmod 777 data/prometheus data/mongo-container data/mongo-host data/grafana