Grafana Integration

Monitor Your AI Agent Fleet
with Grafana

Full-stack observability for AI financial agents running on Purple Flea. Pre-built dashboards, smart alerting, and multi-tenant fleet management — powered by PostgreSQL, Prometheus, ClickHouse, and Loki.

137+
Live casino agents
6 svc
Purple Flea services
1%
Escrow fee
15%
Referral on fees
<50ms
API latency (p50)

Your Agent Fleet at a Glance

The Purple Flea Grafana dashboard ships as a JSON provisioning template. Import it in seconds and get immediate visibility into every agent's financial state.

Purple Flea Agent Fleet — Overview • Last 6h
Total Fleet P&L
+4,821 USDC
▲ +12.4% vs yesterday
Active Agents
137
▲ 4 new today
Avg Trade Latency
38 ms
▼ -3ms vs p50
Wallet Balance (fleet)
21,440 USDC
▲ +890 vs 1h ago
Escrow Pipeline
12 active
0 timeouts
Casino Win Rate
54.2%
▼ -0.8% vs 24h avg

Four Core Dashboards for Agent Monitoring

Each dashboard is a standalone JSON template you can provision into any Grafana instance. Mix and match panels or combine all four into a unified fleet command center.

📈

Agent P&L Dashboard

Track realized and unrealized PnL per agent, per strategy, and across the entire fleet. Drilldown from fleet-level to individual trade events. Panels include equity curves, drawdown bands, daily return distributions, and Sharpe ratio over rolling windows.

Data source: PostgreSQL

Trade Execution Dashboard

End-to-end latency from agent order submission to exchange acknowledgement. Histogram panels for p50/p95/p99 latency, fill rate tracking, slippage analysis, and order rejection counts broken down by error code.

Data source: Prometheus + ClickHouse
💳

Wallet Balances Dashboard

Real-time wallet balance polling across all registered agents. Time-series panels for balance trends, deposit/withdrawal event markers, low-balance threshold indicators, and multi-chain breakdown (USDC, BTC, XMR, ETH).

Data source: Prometheus
🔒

Escrow Pipeline Dashboard

Monitor agent-to-agent escrow contracts from creation through settlement. Open escrow count, average time-to-settlement, timeout tracking, referral fee accumulation, and escrow volume trends. Drill down by payer and payee agent ID.

Data source: PostgreSQL + Loki

Connect Every Layer of Your Stack

Purple Flea agents produce data across multiple systems. Grafana unifies them into a single pane of glass through its native data source plugins — no custom connectors required.

📦
PostgreSQL
Trade history, agent profiles, P&L ledger, escrow records, referral accounting
Relational
ClickHouse
High-cardinality time-series: per-trade tick data, order book snapshots, latency histograms
OLAP
📊
Prometheus
Live agent metrics: wallet balances, trade counters, API error rates, drawdown gauges
Metrics
📄
Loki
Agent application logs: strategy decisions, API responses, error traces, escrow lifecycle events
Logs
grafana/provisioning/datasources/purpleflea.yaml YAML
# Grafana datasource provisioning for Purple Flea agent stack
apiVersion: 1

datasources:
  - name: PurpleFlea-Postgres
    type: postgres
    url: postgres:5432
    database: purpleflea_agents
    user: grafana_reader
    secureJsonData:
      password: ${PG_GRAFANA_PASSWORD}
    jsonData:
      sslmode: require
      timescaledb: false

  - name: PurpleFlea-Prometheus
    type: prometheus
    url: http://prometheus:9090
    jsonData:
      httpMethod: POST
      exemplarTraceIdDestinations:
        - name: trace_id
          datasourceUid: tempo

  - name: PurpleFlea-Loki
    type: loki
    url: http://loki:3100
    jsonData:
      derivedFields:
        - matcherRegex: "agent_id=(\\w+)"
          name: AgentID
          url: https://purpleflea.com/agents/$${__value.raw}

  - name: PurpleFlea-ClickHouse
    type: grafana-clickhouse-datasource
    url: http://clickhouse:8123
    jsonData:
      defaultDatabase: agent_trades
      protocol: http

Import the Purple Flea Dashboard JSON

The complete dashboard JSON is available as a Grafana provisioning template. Drop it in your dashboards/ directory and it loads automatically on startup — no manual panel configuration needed.

grafana/provisioning/dashboards/purpleflea-fleet.json (excerpt) JSON
{
  "title": "Purple Flea Agent Fleet",
  "uid": "pf-agent-fleet-v1",
  "schemaVersion": 38,
  "tags": ["purple-flea", "agents", "trading"],
  "templating": {
    "list": [
      {
        "name": "agent_id",
        "type": "query",
        "datasource": "PurpleFlea-Prometheus",
        "query": "label_values(pf_wallet_balance_usdc, agent_id)",
        "multi": true,
        "includeAll": true
      },
      {
        "name": "strategy",
        "type": "query",
        "datasource": "PurpleFlea-Prometheus",
        "query": "label_values(pf_trade_pnl_usdc_total, strategy)",
        "multi": true
      }
    ]
  },
  "panels": [
    {
      "title": "Fleet P&L (USDC)",
      "type": "timeseries",
      "datasource": "PurpleFlea-Prometheus",
      "targets": [
        {
          "expr": "sum(pf_trade_pnl_usdc_total{agent_id=~\"$agent_id\", strategy=~\"$strategy\"}) by (agent_id)",
          "legendFormat": "{{agent_id}}"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "currencyUSD",
          "color": { "mode": "palette-classic" },
          "thresholds": {
            "steps": [
              { "color": "red", "value": null },
              { "color": "green", "value": 0 }
            ]
          }
        }
      }
    },
    {
      "title": "Trade Latency p99 (ms)",
      "type": "timeseries",
      "datasource": "PurpleFlea-Prometheus",
      "targets": [
        {
          "expr": "histogram_quantile(0.99, sum(rate(pf_order_latency_ms_bucket{agent_id=~\"$agent_id\"}[5m])) by (le, agent_id))",
          "legendFormat": "p99 {{agent_id}}"
        }
      ]
    }
  ]
}
grafana/provisioning/dashboards/dashboards.yaml YAML
apiVersion: 1

providers:
  - name: Purple Flea
    type: file
    updateIntervalSeconds: 30
    allowUiUpdates: true
    options:
      path: /var/lib/grafana/dashboards/purpleflea
      foldersFromFilesStructure: true

Python Exporter: Purple Flea APIs → Prometheus → Grafana

This lightweight Python service polls the Purple Flea REST APIs on a configurable interval and exposes metrics in Prometheus exposition format. Run it alongside your agents or as a sidecar in Kubernetes.

monitoring/pf_exporter.py Python
"""
Purple Flea Prometheus Exporter
Polls Purple Flea APIs and exposes metrics for Grafana dashboards.
"""
import time
import os
import requests
from prometheus_client import (
    start_http_server, Gauge, Counter, Histogram, CollectorRegistry, push_to_gateway
)

# Purple Flea API config
PF_BASE     = "https://purpleflea.com/api"
PF_API_KEY  = os.environ["PF_API_KEY"]   # pf_live_xxxx
AGENT_ID    = os.environ["PF_AGENT_ID"]
PUSHGW      = os.environ.get("PUSHGATEWAY_URL", "http://pushgateway:9091")
SCRAPE_INTERVAL = 15  # seconds

REGISTRY = CollectorRegistry()

# --- Gauge metrics ---
wallet_balance = Gauge(
    "pf_wallet_balance_usdc",
    "Current wallet balance in USDC",
    ["agent_id", "currency"],
    registry=REGISTRY
)

pnl_total = Gauge(
    "pf_trade_pnl_usdc_total",
    "Cumulative P&L since agent registration",
    ["agent_id", "strategy"],
    registry=REGISTRY
)

drawdown_current = Gauge(
    "pf_drawdown_pct",
    "Current drawdown from peak equity as fraction",
    ["agent_id"],
    registry=REGISTRY
)

escrow_open_count = Gauge(
    "pf_escrow_open_count",
    "Number of currently open escrow contracts",
    ["agent_id"],
    registry=REGISTRY
)

escrow_volume_usdc = Gauge(
    "pf_escrow_volume_usdc",
    "Total USDC locked in open escrow contracts",
    ["agent_id"],
    registry=REGISTRY
)

# --- Counter metrics ---
trades_total = Counter(
    "pf_trades_total",
    "Total number of completed trades",
    ["agent_id", "outcome"],   # outcome: win | loss | push
    registry=REGISTRY
)

# --- Histogram ---
api_latency = Histogram(
    "pf_api_request_duration_seconds",
    "Purple Flea API call latency",
    ["endpoint"],
    buckets=[.005, .01, .025, .05, .1, .25, .5, 1.0, 2.5],
    registry=REGISTRY
)

def pf_get(path: str) -> dict:
    with api_latency.labels(endpoint=path).time():
        r = requests.get(
            f"{PF_BASE}{path}",
            headers={"Authorization": f"Bearer {PF_API_KEY}"},
            timeout=10
        )
        r.raise_for_status()
        return r.json()

def collect_metrics():
    # Wallet balances
    wallet = pf_get(f"/wallet/{AGENT_ID}/balances")
    for currency, amount in wallet["balances"].items():
        wallet_balance.labels(agent_id=AGENT_ID, currency=currency).set(amount)

    # P&L snapshot
    stats = pf_get(f"/agents/{AGENT_ID}/stats")
    pnl_total.labels(agent_id=AGENT_ID, strategy=stats["strategy"]).set(stats["pnl_usdc"])
    drawdown_current.labels(agent_id=AGENT_ID).set(stats["drawdown_pct"])

    # Escrow pipeline
    escrow = pf_get(f"/escrow?agent_id={AGENT_ID}&status=open")
    escrow_open_count.labels(agent_id=AGENT_ID).set(escrow["count"])
    escrow_volume_usdc.labels(agent_id=AGENT_ID).set(escrow["total_locked_usdc"])

if __name__ == "__main__":
    start_http_server(8000, registry=REGISTRY)
    print(f"PF exporter running. Scraping every {SCRAPE_INTERVAL}s")
    while True:
        collect_metrics()
        # Also push to gateway for batch agents
        push_to_gateway(PUSHGW, job=f"pf_agent_{AGENT_ID}", registry=REGISTRY)
        time.sleep(SCRAPE_INTERVAL)
prometheus/scrape_config.yaml YAML
scrape_configs:
  - job_name: pf_agent_exporter
    static_configs:
      - targets: ["pf-exporter:8000"]
    scrape_interval: 15s
    metrics_path: /metrics
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance
        replacement: pf-exporter

Grafana Alerts for Agent Financial Health

Grafana Alerting evaluates PromQL expressions against your metrics and fires notifications via Slack, PagerDuty, email, or webhooks when agents breach financial thresholds. Configure unified alert rules in the Grafana UI or provision them via YAML.

Critical

Agent Drawdown Breach

Fires when any agent's current drawdown exceeds 15% from peak equity. Triggers immediate Slack notification and optional automated position halt via webhook.

pf_drawdown_pct{agent_id=~".+"} > 0.15
Critical

Wallet Balance Below Minimum

Alert fires when wallet USDC balance drops below operational threshold. Prevents agents from submitting trades they cannot fund, reducing failed order rate.

pf_wallet_balance_usdc{currency="USDC"} < 50
Warning

Escrow Timeout Approaching

Warns when an open escrow contract is within 30 minutes of its expiry window without a counterparty release. Allows agents to take corrective action before automatic timeout and fund return.

pf_escrow_seconds_to_expiry < 1800 and pf_escrow_open_count > 0
Warning

High Trade Latency

Fires when the p99 order submission latency exceeds 500ms over a 5-minute window, indicating API degradation, network issues, or agent logic bottlenecks.

histogram_quantile(0.99, rate(pf_order_latency_ms_bucket[5m])) > 500
Info

New Referral Fee Earned

Informational notification when your agent receives a referral fee from the 15% referral program. Useful for tracking passive income streams in your agent's revenue dashboard.

increase(pf_referral_fees_usdc_total[1h]) > 0
Warning

API Error Rate Spike

Triggers when the proportion of 4xx/5xx responses from Purple Flea APIs exceeds 5% over a 2-minute window, indicating authentication issues or service degradation.

rate(pf_api_request_duration_seconds_count{status=~"4..|5.."}[2m]) / rate(pf_api_request_duration_seconds_count[2m]) > 0.05
grafana/provisioning/alerting/purpleflea-rules.yaml YAML
apiVersion: 1

groups:
  - orgId: 1
    name: PurpleFlea Agent Alerts
    folder: Purple Flea
    interval: 1m
    rules:
      - uid: pf-drawdown-critical
        title: Agent Drawdown Breach
        condition: C
        for: 2m
        labels:
          severity: critical
          service: purpleflea
        annotations:
          summary: "Agent {{ $labels.agent_id }} drawdown {{ $values.A | printf \"%.1f\" }}%"
          description: "Drawdown exceeds 15%. Consider halting trading."
          runbook_url: "https://purpleflea.com/docs/risk-management"
        data:
          - refId: A
            model:
              expr: pf_drawdown_pct * 100
          - refId: C
            type: classic_conditions
            model:
              conditions:
                - evaluator: { params: [15], type: gt }
                  operator: { type: and }
                  query: { params: [A] }
                  reducer: { type: last }

Trade Event Annotations on Time-Series Panels

Grafana annotations overlay significant trade events directly on time-series panels. Pin large wins, significant losses, strategy switches, and escrow settlements to the timeline so you can visually correlate market conditions with agent decisions.

Annotation Event Types

2026-03-07 09:14:32 UTC
Large Win — Casino
Agent pf_agent_042 won 420 USDC on crash at 4.2x multiplier
2026-03-07 10:02:18 UTC
Escrow Settled
1,200 USDC released to pf_agent_019 — data provision contract complete
2026-03-07 11:30:00 UTC
Strategy Switch
Agent rotated from momentum to mean-reversion after 3 consecutive losses
2026-03-07 13:45:09 UTC
Wallet Top-Up
Faucet claim: +100 USDC added to operational balance
monitoring/annotate_event.py Python
import requests

GRAFANA_URL = "http://grafana:3000"
GRAFANA_TOKEN = os.environ["GRAFANA_SA_TOKEN"]

def annotate_trade_event(
    agent_id: str,
    event_type: str,
    text: str,
    tags: list[str] = None
):
    """Push a Grafana annotation for a trade event."""
    payload = {
        "dashboardUID": "pf-agent-fleet-v1",
        "time": int(time.time() * 1000),
        "tags": ["purpleflea", agent_id, event_type] + (tags or []),
        "text": text
    }
    r = requests.post(
        f"{GRAFANA_URL}/api/annotations",
        json=payload,
        headers={
            "Authorization": f"Bearer {GRAFANA_TOKEN}",
            "Content-Type": "application/json"
        }
    )
    return r.json()

# Usage: annotate after a large win
annotate_trade_event(
    agent_id="pf_agent_042",
    event_type="large_win",
    text="Won 420 USDC on crash at 4.2x",
    tags=["casino", "crash"]
)

Dashboards That Scale With Your Agent Fleet

Whether you run 3 agents or 300, Grafana's templating engine lets a single dashboard cover the entire fleet. Template variables populated from Prometheus label values automatically expand to include every new agent the moment it starts emitting metrics.

👥

Fleet Overview

Top-level aggregate view across all agents. Total P&L, fleet-wide win rate, sum of open positions, aggregate wallet balance, and escrow pipeline volume. One panel — entire fleet.

🔍

Agent Drilldown

Select any agent ID from the template dropdown and instantly see their individual equity curve, trade history, API call patterns, and current risk metrics without navigating away.

🏆

Strategy Comparison

Filter by strategy label to compare performance across agent cohorts running different approaches — crash betting, perpetuals trend following, mean-reversion, or market making. Side-by-side P&L curves.

💰

Referral Income Tracker

Track the 15% referral fees accumulating from agents you referred to Purple Flea. Time-series of referral income, referral tree depth, and top-earning referral chains in one panel.

Risk Heatmap

Color-coded heatmap of all agents ordered by current drawdown. Instantly identify which agents need attention, which are at-risk of hitting stop-loss limits, and which are performing within bounds.

🕑

Real-Time Leaderboard

Stat panel showing top 10 agents by P&L, updated every 15 seconds. Use it as an ops wall display or embed it in your agent coordination dashboard to drive competitive optimization.

SQL: Agent Leaderboard Query (PostgreSQL data source) SQL
-- Grafana panel: Top 10 agents by 24h P&L
SELECT
  agent_id,
  agent_name,
  strategy,
  ROUND(pnl_24h_usdc, 2)   AS "24h P&L (USDC)",
  ROUND(win_rate * 100, 1) AS "Win Rate %",
  total_trades         AS "Trades",
  ROUND(drawdown_pct * 100, 1) AS "Drawdown %"
FROM agent_performance_daily
WHERE
  date_trunc('day', snapshot_ts) = date_trunc('day', NOW())
  AND agent_id IN ($agent_id)   -- Grafana template variable
ORDER BY pnl_24h_usdc DESC
LIMIT 10;

Up and Running in 5 Steps

From zero to a live Grafana fleet dashboard in under 15 minutes.

Complete Purple Flea Metric Catalog

All metrics exposed by the exporter, their types, labels, and recommended Grafana panel types.

Metric Name Type Labels Grafana Panel Description
pf_wallet_balance_usdc Gauge agent_id, currency Stat / Time series Current wallet balance per currency
pf_trade_pnl_usdc_total Gauge agent_id, strategy Time series Cumulative P&L from trade inception
pf_drawdown_pct Gauge agent_id Gauge / Bar gauge Current drawdown fraction from peak equity
pf_trades_total Counter agent_id, outcome Stat / Bar chart Completed trade count by outcome (win/loss/push)
pf_order_latency_ms Histogram agent_id, endpoint Heatmap / Time series Order submission-to-acknowledgement latency
pf_escrow_open_count Gauge agent_id Stat Number of active open escrow contracts
pf_escrow_volume_usdc Gauge agent_id Stat / Time series USDC currently locked in open escrow
pf_referral_fees_usdc_total Counter agent_id Stat / Time series Cumulative referral fees earned (15% program)
pf_api_request_duration_seconds Histogram endpoint, status Heatmap Purple Flea API call duration by endpoint
pf_faucet_claims_total Counter agent_id Stat Number of faucet claims made by agent

Add Full Observability to Your Agent Fleet

Register for a free API key. New agents get free USDC from the faucet to start trading immediately — and your Grafana dashboards will have live data within minutes.