merge: testing → main (reconcile 2-week divergence)
This commit is contained in:
@@ -35,3 +35,32 @@ Active bugs detected during development. Do not fix until noted otherwise.
|
||||
**Root cause:** `sqlmodel>=0.0.16` was added to `pyproject.toml` but `pip install -e .` had not been re-run in the dev environment.
|
||||
|
||||
**Fix:** Run `pip install -e ".[dev]"`. Already applied.
|
||||
|
||||
---
|
||||
|
||||
## BUG-003 — SSE `/api/v1/stream` proxy BrokenPipe storm
|
||||
|
||||
**Detected:** 2026-04-17
|
||||
**Status:** Open — do not fix, testing first
|
||||
|
||||
**Symptom:** The web-dashboard CLI proxy hammers `BrokenPipeError: [Errno 32] Broken pipe` on `GET /api/v1/stream` and answers with 502s. The SSE client reconnects, a handful succeed (200), then the next chunk write fails again:
|
||||
|
||||
```
|
||||
decnet.cli - web proxy error GET /api/v1/stream?token=...: [Errno 32] Broken pipe
|
||||
decnet.cli - web code 502, message API proxy error: [Errno 32] Broken pipe
|
||||
...
|
||||
File "/home/anti/Tools/DECNET/decnet/cli.py", line 790, in _proxy
|
||||
self.wfile.write(chunk)
|
||||
BrokenPipeError: [Errno 32] Broken pipe
|
||||
```
|
||||
|
||||
During the failure the proxy also tries to `send_error(502, ...)` on the already-closed socket, producing a second BrokenPipe and a noisy traceback.
|
||||
|
||||
**Root cause (suspected, unconfirmed):** the stdlib `http.server`-based proxy in `decnet/cli.py:_proxy` doesn't handle the browser closing the SSE socket cleanly — any `wfile.write(chunk)` after the client disconnects raises `BrokenPipe`, and then the error path itself writes to the dead socket. Upstream uvicorn SSE generator is probably fine; the proxy layer is the fragile piece.
|
||||
|
||||
**Fix:** Deferred. Likely options when we get back to it:
|
||||
- Catch `BrokenPipeError` / `ConnectionResetError` inside `_proxy` and silently close instead of `send_error` (writing headers to a dead socket is always going to fail).
|
||||
- Replace the threaded stdlib proxy with something that understands streaming and disconnect signals properly.
|
||||
- Or bypass the proxy for `/api/v1/stream` specifically and let the browser hit the API directly (CORS permitting).
|
||||
|
||||
**Impact:** Dashboard SSE is unusable under any real load; the API itself is unaffected.
|
||||
|
||||
223
development/CAMPAIGN_CLUSTERING.md
Normal file
223
development/CAMPAIGN_CLUSTERING.md
Normal file
@@ -0,0 +1,223 @@
|
||||
# Campaign Clustering — Design
|
||||
|
||||
**Status:** pre-implementation. This doc is the spec; code follows.
|
||||
|
||||
**Roadmap entry:** `DEVELOPMENT.md` — Detection & Intelligence → "Attack campaign clustering".
|
||||
|
||||
## Premise
|
||||
|
||||
A *campaign* is a coordinated set of attacker actions that share intent, tooling, or operator — observable at DECNET as recurring patterns across `attackers`, `sessions`, `fingerprints`, `credentials`, and `payloads`.
|
||||
|
||||
We will not write clustering code until we can **simulate campaigns with ground-truth labels** and run a clusterer against those labels. The simulator is the specification for what a campaign is; the algorithm is replaceable.
|
||||
|
||||
Order of work, strictly:
|
||||
|
||||
1. Campaign DSL + generator (produces synthetic events with `campaign_id` / `actor_id` labels).
|
||||
2. Adversarial scenario fixtures (the 6 below).
|
||||
3. Metric harness (ARI + homogeneity + completeness + singleton recall).
|
||||
4. Dumbest viable clusterer (connected components on a similarity graph). Must pass all 6 fixtures.
|
||||
5. Pipeline integration (`decnet clusterer` worker, `campaigns` table, dashboard).
|
||||
6. Replay tier — public datasets / Honeynet SSH logs through the live collector. Reality check, not optional forever.
|
||||
|
||||
Steps 1–3 are the durable artifact. Step 4 is the first throwaway algorithm.
|
||||
|
||||
---
|
||||
|
||||
## Phase Vocabulary: Unified Kill Chain
|
||||
|
||||
Phase names use the **Unified Kill Chain** (Pols, 2017), 18 phases across 3 stages. UKC maps cleanly to MITRE ATT&CK tactics, which means the phase labels we emit in synthetic data are the same labels the future TTP-tagging worker (also in `DEVELOPMENT.md`) will produce. Fixtures become reusable across both features instead of needing renaming.
|
||||
|
||||
| Stage | Phases |
|
||||
|---|---|
|
||||
| **In** (initial foothold) | Reconnaissance, Resource Development, Weaponization, Delivery, Social Engineering, Exploitation, Persistence, Defense Evasion, Command & Control |
|
||||
| **Through** (network propagation) | Pivoting, Discovery, Privilege Escalation, Execution, Credential Access, Lateral Movement |
|
||||
| **Out** (action on objectives) | Collection, Exfiltration, Impact, Objectives |
|
||||
|
||||
**Honeypot observability.** A honeypot does not see the entire chain. Pre-target phases (OSINT Reconnaissance, Resource Development, Weaponization, Social Engineering) happen before any decky is touched. We observe roughly 14 of 18:
|
||||
|
||||
- **In:** Delivery, Exploitation, Persistence, Defense Evasion, Command & Control
|
||||
- **Through:** Pivoting, Discovery, Privilege Escalation, Execution, Credential Access, Lateral Movement
|
||||
- **Out:** Collection, Exfiltration, Impact, Objectives
|
||||
|
||||
The DSL allows the full enum so a campaign spec can describe an end-to-end story, but the generator emits no events for unobservable phases (and warns on them). MazeNET makes Pivoting and Lateral Movement first-class — that's where DECNET has *more* signal than a single-host honeypot, not less.
|
||||
|
||||
Each phase carries default tool-signature templates the DSL can override per-campaign. Examples:
|
||||
|
||||
- `discovery` → defaults: `whoami`, `id`, `uname -a`, `netstat -tnp`, `cat /etc/passwd`
|
||||
- `persistence` → defaults: crontab edit, `~/.ssh/authorized_keys` write, systemd unit drop, `.bashrc` append
|
||||
- `credential_access` → defaults: `/etc/shadow` read, browser-cred files, SSH key harvest
|
||||
- `lateral_movement` → defaults: SSH/WinRM/SMB pivot to another decky in the same MazeNET segment
|
||||
|
||||
---
|
||||
|
||||
## 1. Campaign DSL
|
||||
|
||||
A campaign is a *causal story*, not a bag of events. Generator consumes YAML, emits a stream of synthetic records into the test DB with ground-truth labels.
|
||||
|
||||
```yaml
|
||||
campaign:
|
||||
id: c-apt-fauxbear-01
|
||||
actors:
|
||||
- id: a-001
|
||||
asn: 14061 # DigitalOcean
|
||||
ip_pool: rotating # rotating | sticky | tor
|
||||
ja3: 769,4865-... # tool fingerprint, shared within campaign
|
||||
hassh: aae6b9...
|
||||
hours_active_utc: [22, 23, 0, 1, 2, 3]
|
||||
jitter_seconds: 90
|
||||
role: intrusion # intrusion | post-exploit | exfil — for multi-operator campaigns
|
||||
- id: a-002
|
||||
asn: 14061
|
||||
ip_pool: sticky
|
||||
ja3: 769,4865-... # same tool, different operator
|
||||
hassh: aae6b9...
|
||||
hours_active_utc: [14, 15, 16, 17]
|
||||
jitter_seconds: 30
|
||||
role: post-exploit
|
||||
phases: # UKC phase enum
|
||||
- name: delivery
|
||||
actor: a-001
|
||||
tool_signature: { user_agent: "Mozilla/5.0 (compatible; Nmap)" }
|
||||
target_selector: { service: any, count: 50 }
|
||||
dwell_seconds: 1
|
||||
- name: exploitation
|
||||
actor: a-001
|
||||
tool_signature: { payload_hash: deadbeef..., cve: CVE-2024-XXXX }
|
||||
target_selector: { service: http, port: 8080 }
|
||||
success_rate: 0.2
|
||||
- name: persistence
|
||||
actor: a-001
|
||||
tool_signature: { commands: ["wget", "chmod +x", "./", "crontab -e"] }
|
||||
target_selector: { decky: previous_success }
|
||||
- name: command_and_control
|
||||
actor: a-001
|
||||
tool_signature: { c2_callback: evil.example.com, beacon_jitter_seconds: 30 }
|
||||
- name: discovery
|
||||
actor: a-002 # handoff to second operator
|
||||
tool_signature: { commands: ["whoami", "id", "uname -a", "ip route", "arp -a"] }
|
||||
- name: lateral_movement
|
||||
actor: a-002
|
||||
tool_signature: { protocol: ssh, credential_source: harvested }
|
||||
target_selector: { decky: adjacent_in_mazenet }
|
||||
- name: collection
|
||||
actor: a-002
|
||||
tool_signature: { paths: ["/var/lib/mysql/*", "/home/*/Documents/*"] }
|
||||
- name: exfiltration
|
||||
actor: a-002
|
||||
tool_signature: { c2_callback: evil.example.com, payload_hash: deadbeef... }
|
||||
duration_days: 7
|
||||
pause_windows: [] # for the "campaign that pauses" scenario
|
||||
```
|
||||
|
||||
**Generator contract:**
|
||||
|
||||
- Input: list of campaign YAMLs + `noise: { scanner_count, ratio }`.
|
||||
- Output: rows in `attackers` / `sessions` / `fingerprints` / `credentials_attempts` / `payloads`, each tagged with a `_truth_campaign_id` and `_truth_actor_id` column (test-only, stripped before clustering runs).
|
||||
- Deterministic given a seed.
|
||||
- Validates phase names against the UKC enum; warns on unobservable phases (emits no events for them).
|
||||
|
||||
The generator lives at `tests/factories/campaign_factory.py`. The DSL parser is the spec; if a real attacker pattern can't be expressed in it, the DSL is incomplete and we extend it before extending the clusterer.
|
||||
|
||||
---
|
||||
|
||||
## 2. Adversarial Scenario Fixtures
|
||||
|
||||
Six fixtures. Each is a YAML file under `tests/fixtures/campaigns/` plus an expected-bounds file. CI runs the clusterer against all six; any regression fails the build.
|
||||
|
||||
| # | Name | Setup | Pass condition |
|
||||
|---|---|---|---|
|
||||
| 1 | `shared_wordlist` | 2 distinct campaigns, both use rockyou-top1k for SSH brute (Credential Access phase) | Must NOT merge — credential overlap alone is insufficient signal |
|
||||
| 2 | `vpn_hopping` | 1 campaign, 1 actor, IPs rotate across 5 ASNs over 3 days, JA3/HASSH stable, full Delivery→C2→Discovery chain | Must NOT split — actor identity survives IP churn |
|
||||
| 3 | `lone_wolf` | 1 opportunistic scanner, Delivery phase only, no follow-up, no shared signals | Must stay singleton — not absorbed into any campaign |
|
||||
| 4 | `paused_campaign` | 1 campaign, active days 1–2 (Delivery, Exploitation), silent days 3–5, active days 6–7 (Discovery, Lateral Movement, Exfiltration) | Must NOT split into two campaigns — temporal window must accommodate operator pauses |
|
||||
| 5 | `multi_operator` | 1 campaign, 2 actors with distinct UKC roles: actor A handles Delivery→Exploitation→Persistence→C2 on UTC night shift, actor B handles Discovery→Lateral Movement→Collection→Exfiltration on UTC day shift, different IPs/ASNs, shared C2 callback + payload hash | Must merge — shared tooling and phase handoff > diverged infra |
|
||||
| 6 | `noise_floor` | All 5 above + 10× random Delivery-only scanners drawn from a noise distribution | All 5 must still resolve correctly; scanners stay singleton |
|
||||
|
||||
Fixture 5 is the load-bearing one for UKC: a real campaign frequently splits operators along the In/Through/Out boundary, and a clusterer that only looks at IP/ASN will miss it. Phase-handoff is itself a feature the algorithm can use.
|
||||
|
||||
**Bounds per fixture** (in `expected.yaml` next to each):
|
||||
|
||||
```yaml
|
||||
adjusted_rand_index: { min: 0.85 }
|
||||
homogeneity: { min: 0.90 } # no false merges
|
||||
completeness: { min: 0.80 } # no false splits
|
||||
singleton_recall: { min: 0.95 } # for lone_wolf / noise scanners
|
||||
```
|
||||
|
||||
Bounds are deliberately loose at first — we ratchet them up as the algorithm improves. Loosening a bound to make CI pass requires a PR comment justifying it.
|
||||
|
||||
---
|
||||
|
||||
## 3. Metric Harness
|
||||
|
||||
`tests/clustering/metrics.py`. Decided **before** any algorithm exists, so we don't pick the metric that flatters the result.
|
||||
|
||||
- **Adjusted Rand Index** — headline. Compares predicted vs. truth labels, corrects for chance.
|
||||
- **Homogeneity** — each predicted cluster contains only members of one true campaign. Catches false merges.
|
||||
- **Completeness** — all members of a true campaign land in the same predicted cluster. Catches false splits.
|
||||
- **Singleton recall** — fraction of true singletons (lone wolves, noise) that stay singleton.
|
||||
|
||||
Homogeneity and completeness trade off; both must be reported. A single number hides which direction the algorithm is failing.
|
||||
|
||||
**Per-fixture report** is dumped as JSON on every CI run, not just pass/fail, so we can watch trends over time.
|
||||
|
||||
---
|
||||
|
||||
## 4. First Algorithm (after 1–3 are green)
|
||||
|
||||
Connected-components on a similarity graph. No ML.
|
||||
|
||||
- Nodes: attackers (or sessions, TBD — see open questions).
|
||||
- Edges: weighted similarity, threshold to binarize.
|
||||
- Edge weight = sum of:
|
||||
- JA3/JA4/HASSH exact match: high
|
||||
- Payload hash exact match: high
|
||||
- C2 callback domain/IP exact match: high
|
||||
- **Phase-handoff signal:** actor X ends in C2/Persistence on a decky, actor Y begins Discovery/Lateral Movement on the same decky within window W: medium-high. Defeats fixture 5 even when IP/ASN diverge.
|
||||
- Credential-list Jaccard: low (defeated by fixture 1)
|
||||
- Command-sequence Jaccard, bucketed by UKC phase: medium
|
||||
- Temporal proximity (within window W): low multiplier
|
||||
- ASN match: very low
|
||||
- Edge threshold and feature weights are config, tuned against the 6 fixtures.
|
||||
|
||||
If connected-components passes all 6, ship it. DBSCAN/HDBSCAN/graph-community algorithms are deferred until a fixture proves CC inadequate.
|
||||
|
||||
---
|
||||
|
||||
## 5. Pipeline Integration
|
||||
|
||||
- New worker: `decnet clusterer`. Bus consumer on `attacker.scored` and `attacker.observed`.
|
||||
- Re-cluster strategy: incremental on new attacker arrivals, full re-cluster nightly.
|
||||
- Storage: `campaigns` table (UUID PK, per the `feedback_uuid_over_natural_keys` rule); `attackers.campaign_id` FK nullable.
|
||||
- Bus signal: `campaign.{id}.formed` / `campaign.{id}.updated`. Document in `wiki-checkout/Service-Bus.md` per the `feedback_wiki_bus_signals` rule.
|
||||
- Dashboard: Campaigns list page + CampaignDetail (aggregated AttackerDetail, with a UKC phase timeline visualization showing which phases each actor in the campaign executed).
|
||||
|
||||
---
|
||||
|
||||
## 6. Replay Tier (post-v1)
|
||||
|
||||
Public-dataset replay through the real collector. Confirms our fixtures encode realistic patterns, not just our assumptions.
|
||||
|
||||
Candidate sources:
|
||||
- Honeynet Project SSH session corpora.
|
||||
- DShield daily summaries.
|
||||
- Our own production data once it accumulates.
|
||||
|
||||
This is where we discover whether the DSL is missing a dimension. Schedule it; don't punt forever.
|
||||
|
||||
---
|
||||
|
||||
## Risks
|
||||
|
||||
1. **Simulator encodes our assumptions.** Real attackers may not match. Mitigation: replay tier (§6).
|
||||
2. **Bound creep.** Loosening fixture bounds to ship is the failure mode. Mitigation: bound changes require PR justification.
|
||||
3. **Feature drift.** Sniffer fingerprint coverage changes the available signal. Mitigation: feature set is configurable; fixtures regenerate from the DSL when features change.
|
||||
4. **UKC phase inference accuracy.** The clusterer relies on phase labels per session — those have to come from somewhere. Pre-TTP-tagging worker, the DSL emits them as ground truth in synthetic data, and the live pipeline uses heuristic phase assignment (command keywords, port/protocol). This is a known approximation; tightens once the TTP-tagging worker ships.
|
||||
5. **Cost of full re-cluster.** At fleet scale, nightly re-cluster on millions of attackers is expensive. Mitigation: incremental-first, full nightly is a fallback we may drop.
|
||||
|
||||
## Open questions
|
||||
|
||||
- **Cluster nodes: attackers or sessions?** Leaning attackers (already deduped by `attacker_uuid`), but session-level may catch campaigns that span multiple attacker identities. Decide after fixture 5 (`multi_operator`).
|
||||
- **Time window W** for temporal-proximity and phase-handoff edges: 24h? 7d? Tuned against fixture 4 (`paused_campaign`).
|
||||
- **Phase inference at runtime.** Do we ship a heuristic phase classifier alongside the clusterer, or block on the TTP-tagging worker landing first? Heuristic is faster but is technical debt against the future ATT&CK-tagged version.
|
||||
- **API exposure.** Do we expose campaigns in the public API or admin-only at first? Admin-only until we have UI for false-positive correction.
|
||||
@@ -1,6 +1,6 @@
|
||||
# DECNET — Technical Debt Register
|
||||
|
||||
> Last updated: 2026-04-09 — All addressable debt cleared.
|
||||
> Last updated: 2026-04-26 — Orchestrator UI shipped; logged DEBT-042 (failure-count window) and DEBT-043 (no FE test framework).
|
||||
> Severity: 🔴 Critical · 🟠 High · 🟡 Medium · 🟢 Low
|
||||
|
||||
---
|
||||
@@ -122,6 +122,337 @@ The bait store and honeypot files are hardcoded. A dynamic injection framework s
|
||||
The deploy endpoint exercises Docker Compose orchestration via `decnet.engine.deploy`, which creates MACVLAN/IPvlan networks and runs `docker compose up`. Meaningful tests require mocking the entire Docker SDK + subprocess layer, coupling tightly to implementation details.
|
||||
**Status:** Deferred — test after Docker-in-Docker CI is available.
|
||||
|
||||
### DEBT-029 — Service-wide pub/sub bus worker (`decnet bus`) ✅ RESOLVED
|
||||
**Files:** `decnet/bus/` (`worker.py`, `factory.py`, `unix_client.py`, `unix_server.py`, `protocol.py`, `fake.py`, `base.py`, `topics.py`), `decnet/cli/bus.py`, `deploy/decnet-bus.service`, `tests/bus/` (62 tests green).
|
||||
|
||||
`CLAUDE.md` promises a `ServiceBus` worker and a `get_bus()` factory, but neither exists. Today there is no event plumbing between workers: mutator, correlator, profiler, sniffer, and prober cannot publish state transitions to interested consumers. The web SSE endpoint (`/stream`) polls the DB every ~1s inside its generator loop as a result. Downstream features that need this infrastructure: live topology mutations (DEBT-030), pulsating/live topology visualization, automatic mutations, network traffic simulation, attacker-pool push updates.
|
||||
|
||||
MVP scope (**host-local**):
|
||||
1. `decnet bus` long-running worker, systemd-supervised like every other worker. Runs on every host — master and each swarm agent — independently.
|
||||
2. Transport: **UNIX-domain socket** (default `/run/decnet/bus.sock`, fallback `~/.decnet/bus.sock` in dev). Kernel-authenticated peer delivery; authorization is socket file permissions (0660, group=`decnet`). No TCP, no mTLS, no external broker.
|
||||
3. Wire protocol: tiny hand-rolled framing — 1 ASCII verb line (`PUB <topic>`, `SUB <pattern>`, `EVT <topic>`, `HELLO`, `BYE`) + 4-byte big-endian body length + orjson body. Shared `matches(pattern, topic)` helper implements NATS-style wildcards (`*` = one token, `>` = one-or-more trailing tokens).
|
||||
4. Factory `get_bus()` returns a client with `publish(topic, payload)` / `subscribe(pattern) -> Subscription` (async ctx + async iterator). In-process `FakeBus` for unit tests; `NullBus` when `DECNET_BUS_ENABLED=false`.
|
||||
5. Topic hierarchy locked early: `topology.{id}.mutation.{state}`, `topology.{id}.status`, `decky.{id}.state`, `decky.{id}.traffic`, `attacker.observed`, `system.log`, `system.bus.health`.
|
||||
6. Delivery semantics: **at-most-once, fire-and-forget**. Per-subscriber bounded queue with drop-oldest on overflow. No replay, no persistence, no queue groups, no ordering guarantees. DB remains the source of truth; the bus is the notification layer only.
|
||||
7. First consumer proving end-to-end: SSE route for topology events (DEBT-030).
|
||||
8. Later: migrate `/stream` off its internal poll loop onto the bus for global events.
|
||||
|
||||
**Cross-host federation is out of MVP scope.** Each host runs its own bus — swarm agents and the master do not share a bus substrate. If a use case emerges that requires cross-host pub/sub, it will land as a `decnet bus --bridge-tcp` mode that proxies the UNIX socket over the existing swarm mTLS infra. DEBT-030 is master-only and therefore unblocked by this deferral.
|
||||
|
||||
**Status:** ✅ Resolved — MVP shipped. Host-local UNIX-socket bus, `get_bus()` factory, `decnet bus` worker with heartbeats, systemd unit, 62 unit/integration tests green. DEBT-030 is now unblocked.
|
||||
|
||||
### DEBT-030 — Live (hot) topology mutations via web UI ✅ RESOLVED (Phase A)
|
||||
**Files:** `decnet/web/router/topology/api_mutations.py` (enqueue endpoint already exists), `decnet/mutator/engine.py` + `ops.py` (reconciler already applies all 7 ops), `web/src/hooks/useMazeApi.ts` (missing enqueue methods), `web/src/components/MazeNET.tsx` (editor treats every topology as pending).
|
||||
|
||||
**Backend is already there:**
|
||||
- `TopologyMutation` table (`decnet/web/db/models.py:322-358`) supports `add_lan`, `remove_lan`, `attach_decky`, `detach_decky`, `remove_decky`, `update_decky`, `update_lan`.
|
||||
- `POST /topologies/{id}/mutations` enqueues, gated to `active|degraded`.
|
||||
- Mutator watch loop (`decnet/mutator/engine.py:136-190`) claims atomically, dispatches to `ops.py`, does Docker best-effort, flips topology to `degraded` on failure.
|
||||
|
||||
**Gap is entirely in the frontend + event delivery:**
|
||||
1. `useMazeApi.ts` has no `enqueueMutation()` peer to `deployTopology()`; editor edits on `active` topologies currently no-op / 4xx.
|
||||
2. No mutation-status UI (pending / applying / applied / failed badges, audit log).
|
||||
3. No server→client push channel for mutation state transitions — depends on DEBT-029.
|
||||
|
||||
**Design (agreed):**
|
||||
- **Staged buffer** (client-side, Zustand, not persisted): every editor action pushes a `TopologyMutation` onto `pendingOps[]`. Undo = pop. Reset = clear.
|
||||
- **Apply (N changes)** button opens a diff modal rendering ops in plain English, then POSTs the batch. Batch carries the `topology.version` observed when staging began; server returns 409 on drift.
|
||||
- **Batch atomicity = honest partial.** Server enqueues N rows in order; mutator applies one-by-one. If op 3 fails, 1-2 stay applied, topology flips to `degraded`, user decides to fix-forward or enqueue a manual revert. (Docker ops aren't transactional; pretending otherwise causes worse bugs than honesty.)
|
||||
- **Visual states compose** per existing rule: `pending-mutation`, `applying`, `failed` layer on top of `running / inactive / selected`, never replace them.
|
||||
- **Push via SSE over the bus** (not polling): new route `GET /api/v1/topologies/{id}/events` subscribes to `topology.{id}.*` on the service bus and forwards as SSE. Envelope: `{v, type, ts, payload}`. Day-one event types: `mutation.enqueued|applying|applied|failed`, `topology.status_changed`, `topology.version_bumped`. Room to grow: `decky.state_changed`, `decky.traffic`, `attacker.observed`.
|
||||
- **Separate from `/stream`** deliberately: different auth scopes, different fan-out shape (per-topology vs global), different failure isolation. Two routes, one bus.
|
||||
|
||||
**Status:** ✅ Resolved (Phase A) — end-to-end bus→UI plumbing shipped.
|
||||
- Mutator publishes every state transition on the bus (`mutation.applying|applied|failed`, `status`); fire-and-forget, DB remains source of truth.
|
||||
- Mutator watch loop is bus-woken via `topology.*.mutation.enqueued`; 10s poll stays as fallback heartbeat so a dropped wake event costs latency, not correctness.
|
||||
- New route `GET /api/v1/topologies/{id}/events` streams per-topology SSE — snapshot on connect + live forwarding of bus events, 15s keepalive, `?token=` query-param auth matching `/stream`.
|
||||
- Web editor opens the SSE when topology is `active|degraded`, refetches on `mutation.applied|failed|status`, surfaces a `LIVE` / `CONNECTING…` header indicator.
|
||||
- Smoke: `scripts/bus/smoke-mutator.sh` verifies the full mutator-family topic hierarchy round-trips through a live bus worker.
|
||||
|
||||
**Phase B follow-up (deferred):** staged-buffer editor (Apply (N changes) + optimistic visual states using `NodeBase.status='mutating'`). Today's Phase A refetches the whole topology on each applied event — correct but not yet optimistic. The hooks + API method + SSE consumer that Phase B needs are already in place (`useTopologyStream.ts`, `useMazeApi.enqueueMutation`).
|
||||
|
||||
### ~~DEBT-031 — Service workers don't use the bus~~ ✅ RESOLVED
|
||||
**Files:** `decnet/collector/`, `decnet/correlation/`, `decnet/profiler/`, `decnet/sniffer/`, `decnet/prober/`, `decnet/ingester/`, `decnet/agent/`, `decnet/forwarder/`, `decnet/updater/`.
|
||||
|
||||
DEBT-029 shipped the bus; DEBT-030 proved the pattern end-to-end through the mutator and the web editor. Every other worker still ignores the bus entirely — they neither publish the state transitions their consumers would want nor subscribe to events that could replace polling / cut latency. The plumbing is ready; the workers aren't wired in.
|
||||
|
||||
**Guiding principle: bus is optional.** Workers must not take a hard dependency on the bus. If `get_bus()` fails or `DECNET_BUS_ENABLED=false`, the worker logs one warning at startup and continues in pre-bus mode (poll loops, DB-only state). This mirrors `decnet/mutator/engine.py:run_watch_loop` — try to connect, catch broadly, log, degrade to poll-only. Copy that pattern; don't invent a new one.
|
||||
|
||||
**Publish (per worker, what should land on the bus):**
|
||||
- `collector` — `system.log` batches / high-severity lines as they ingest (fan-out to dashboards / live views).
|
||||
- `correlator` — `attacker.observed` on first sighting, `attacker.session.{started|ended}` on session boundaries.
|
||||
- `profiler` — `attacker.scored` when a profile score crosses a threshold.
|
||||
- `sniffer` — `decky.{id}.traffic` summaries (bounded rate; drop-oldest is fine per bus semantics).
|
||||
- `prober` — `decky.{id}.state` transitions when a realism probe flips health.
|
||||
- `ingester` — `system.log` for structured forwarder-originated batches.
|
||||
- `agent` / `forwarder` / `updater` — `system.{worker}.health` heartbeats + lifecycle events (start, stop, self-update applied).
|
||||
|
||||
**Subscribe (per worker, what they could react to instead of polling):**
|
||||
- `correlator` / `profiler` — wake on `system.log` instead of polling the logs table; poll stays as fallback.
|
||||
- `prober` — wake on `decky.*.state` to re-probe immediately after a mutation-applied event.
|
||||
- Any worker that currently polls the DB on a fixed interval — add a bus-wake `asyncio.Event` exactly like the mutator's.
|
||||
|
||||
**Constraints (non-negotiable):**
|
||||
1. DB stays the source of truth. A dropped bus event costs latency, never correctness — every subscriber must still have a poll fallback.
|
||||
2. Publishes are fire-and-forget, wrapped in `try/except log.warning`. A bus publish failure must never break the worker's primary loop.
|
||||
3. No new topics outside the hierarchy documented in `CLAUDE.md` / `wiki-checkout/Service-Bus.md`. Extend `decnet/bus/topics.py` with helpers + constants; don't hand-roll topic strings at the callsite.
|
||||
4. Test with `FakeBus` (see `tests/bus/conftest.py::fake_bus`). Every new publish path gets a unit test asserting the event lands on a fake subscriber; every new wake path gets a test asserting the worker re-enters its loop faster than the poll interval.
|
||||
5. `DECNET_BUS_ENABLED=false` must leave every worker functional — add a CI matrix row or at minimum an explicit test per worker proving it.
|
||||
|
||||
**Suggested rollout order** (ship one worker at a time, one commit each): sniffer → prober → correlator → profiler → collector → ingester → agent/forwarder/updater. Sniffer and prober are the highest-value publishers for the live-topology visualization story; correlator/profiler unlock the attacker-pool push updates that MazeNET's observed-entities view currently polls for.
|
||||
|
||||
**Status:** Resolved. Nine-commit rollout landed on `dev`:
|
||||
|
||||
1. Prep — extracted `publish_safely` + `make_thread_safe_publisher` to `decnet/bus/publish.py`; added `attacker.*`, `system.<worker>.health` topic builders.
|
||||
2. Sniffer — `decky.{id}.traffic` per flow-summary / fingerprint event (bounded by the bus's drop-oldest queue).
|
||||
3. Prober — `attacker.fingerprinted` with probe family (jarm/hassh/tcpfp) in `event.type`.
|
||||
4. Correlator — `attacker.observed` on first sighting, hooked via an optional `publish_fn` on `CorrelationEngine`; the profiler worker carries the bus.
|
||||
5. Profiler — `attacker.scored` per DB-committed profile upsert.
|
||||
6. Collector — `system.log` per ingested parsed event (compact payload: decky/service/event_type/attacker_ip/timestamp).
|
||||
7. Ingester — `system.log` per DB-committed batch (`event.type = "batch_committed"`, payload includes offset).
|
||||
8. Agent / Forwarder / Updater — shared `run_health_heartbeat` helper emits `system.<worker>.health` every 30s.
|
||||
|
||||
**Deferred (out of DEBT-031 scope, tracked for follow-ups):**
|
||||
- **Realism-probe `decky.{id}.state`** — the prober as it exists today fingerprints attackers, not deckies. Publishing `decky.{id}.state` on realism-flip needs a separate realism probe path we don't have yet.
|
||||
- **Correlator `session.started` / `session.ended`** — `CorrelationEngine` is a batch class with no session state. A session-boundary signal would need session tracking introduced first; constants are reserved in `decnet/bus/topics.py`.
|
||||
- **Standalone graph-correlator worker** — closed. The original rollout plan presumed one; the graph engine instead lives as library code in `decnet/correlation/` and is consumed by the profiler worker (graph traversal during profiling) and the reuse correlator (credential-reuse pass). The dead `decnet correlate` CLI debug helper has been removed. Library shape is the right one — keeping it.
|
||||
- **Bus-wake subscriptions** — publishes landed; subscribe-side (e.g. prober re-probe on `decky.*.state`) was not wired to avoid coupling the wake pattern to a subscriber we don't yet have.
|
||||
|
||||
### DEBT-033 — Transcript day-shard rotation
|
||||
**Files:** `decnet/templates/_shared/sessrec/sessrec.c`, `decnet/web/router/transcripts/`.
|
||||
|
||||
Session recording v1 (SSH/Telnet interactive-session capture) stores asciinema events in **one JSONL shard per (decky, UTC day)**: `sessions-YYYY-MM-DD.jsonl`. This bounds inode count (O(days) not O(sessions)) and blunts the obvious "`while true; do login; exit; done`" DoS, but a determined attacker can still keep a single day's shard growing until the 200 MB disk-free precheck trips. When that happens the recorder silently skips new recordings (`session_skipped reason=disk_pressure`) until midnight or until operator cleanup — which is *safe*, but it also means an attacker can blind the recorder for the rest of the day by filling disk once.
|
||||
|
||||
Proper fix is size-based rotation on the day shard:
|
||||
1. Recorder (or a sidecar job) rotates `sessions-YYYY-MM-DD.jsonl` → `sessions-YYYY-MM-DD.1.jsonl` when size crosses e.g. 500 MB; keep last N rotations (default 4 → hard ceiling ≈ 2 GB/day/decky).
|
||||
2. Oldest rotations drop on write pressure (FIFO), not on read.
|
||||
3. API router shard-index cache (see `transcripts/` router, built from session-recording plan) gains an mtime-keyed scan across all rotations for the requested day when resolving a `sid`, not just the live shard. Cache invalidation already keys on `(path, st_mtime_ns)` so rotation drops stale entries automatically.
|
||||
4. Same trigger (disk pressure or a new config knob `DECNET_TRANSCRIPT_DAY_MAX_MB`) decides when to fire; no background timer needed if the recorder itself checks size before each append.
|
||||
|
||||
**Why deferred from v1:** the per-session 10 MB cap + disk-free precheck together give bounded worst-case behavior ("recorder quietly stops; disk stays healthy") that is acceptable for a first release. Rotation is a correctness-under-load improvement, not a correctness baseline, and it couples recorder write-path + API read-path changes that are cleaner to land as one commit after v1 ships.
|
||||
|
||||
**Status:** Open — implement after v1 session recording lands and we have real-world session sizes to calibrate the rotation threshold.
|
||||
|
||||
### ✅ DEBT-034 — Worker supervisor (START buttons in Config → Workers)
|
||||
> **Shipped 2026-04-22.** systemd units for the five missing workers
|
||||
> (`collector` / `profiler` / `sniffer` / `prober` / `mutator`) +
|
||||
> `decnet.target`, polkit rule scoping `manage-units` to `decnet-*.service`
|
||||
> for the `decnet` group, `systemd_control` helper, single-worker +
|
||||
> `start-all` endpoints, `installed` flag on `WorkerStatus`, and UI
|
||||
> wiring. Deferred items (SWARM-host start/stop via mTLS API;
|
||||
> DECNET-side crash-quarantine policy) remain as named follow-ups.
|
||||
|
||||
**Files:** `packaging/systemd/*.service` + `decnet.target` (**new**), `packaging/polkit/50-decnet-workers.rules` (**new**), `decnet/web/services/systemd_control.py` (**new**), `decnet/web/router/workers/api_start_worker.py` + `api_start_all_workers.py` (**new**), `decnet_web/src/components/Config.tsx` (enable START buttons).
|
||||
|
||||
The Workers panel (Config → Workers) landed with bus-based STOP but every START button is a disabled placeholder. STOP works because a running worker can subscribe to its own `system.<name>.control` topic and SIGTERM-self-signal when it sees `{"action": "stop"}`. START has the inverse problem — a *stopped* worker has no subscriber, so the same bus pattern cannot bring it back up. Something outside the worker must own the process lifecycle.
|
||||
|
||||
**Decision: lean on systemd.** DECNET workers are already systemd-supervised in production (`deploy/decnet-bus.service` shipped with DEBT-029; the rest follow the same pattern). Building a DECNET-native supervisor (`decnetd`) would duplicate `Restart=on-failure`, crash backoff, log routing into journald, and boot ordering — all of which systemd already does correctly. The only non-systemd host we care about is the dev box, where operators can start workers by hand.
|
||||
|
||||
**v1 scope:**
|
||||
1. **Unit files** for every worker in `packaging/systemd/`: `decnet-bus`, `decnet-api`, `decnet-collector`, `decnet-profiler`, `decnet-sniffer`, `decnet-prober`, `decnet-mutator`. Each declares `Restart=on-failure`, `RestartSec=5s`, `User=decnet`, `Group=decnet`. A `decnet.target` groups them for `systemctl start decnet.target`. Bus is startable too — chicken-and-egg is fine: systemd brings it up, the API's cached `get_app_bus()` result won't self-heal without an API restart, but that's the existing singleton limitation (documented in `decnet/bus/app.py`), not a supervisor problem.
|
||||
2. **Polkit rule** (`packaging/polkit/50-decnet-workers.rules`) allowing the `decnet` group to `start` / `stop` / `restart` units matching `decnet-*.service` and `decnet.target` without a password. The API runs as `decnet`, so `systemctl --no-ask-password start decnet-<name>` just works.
|
||||
3. **`decnet/web/services/systemd_control.py`** — small helper wrapping `systemctl start|stop|status <unit>` via `asyncio.create_subprocess_exec`. Hardcoded unit name mapping from `KNOWN_WORKERS` (prevents command injection; name validation already enforced at the router). Exposes `start(name)`, `stop(name)`, `is_active(name)`, `list_installed()` returning `set[str]`.
|
||||
4. **New admin endpoints:**
|
||||
- `POST /api/v1/workers/{name}/start` — validates against `KNOWN_WORKERS`, shells out via the helper, returns 202 on success with `{"accepted": true, "worker": <name>, "action": "start"}`. 503 if systemd is unreachable (e.g. dev box without systemd).
|
||||
- `POST /api/v1/workers/start-all` — **best-effort**. Iterates `KNOWN_WORKERS`, calls `start()` on each, aggregates results. Returns `{"started": [...], "failed": [{name, reason}], "already_running": [...]}` with 200 even on partial success. UI surfaces a summary toast.
|
||||
- Keep existing bus-based STOP endpoint — it already works without root; no need to route STOP through systemd.
|
||||
5. **UI (`Config.tsx`):**
|
||||
- Detect unit availability once per panel mount via `GET /api/v1/workers` enriched with `installed: bool` per row (added to `WorkerStatus`). START button enabled only when `installed == true`.
|
||||
- Existing "START ALL WORKERS" placeholder in the header wires to `POST /workers/start-all`; toast renders `"STARTED · 5 · ALREADY RUNNING · 2 · FAILED · 1 (bus: permission denied)"`.
|
||||
- Add a `starting` row state (spinner) between intent and observed heartbeat; transitions to `ok` on next refresh, `unknown`/`stale` if the unit never comes up (systemd log link in tooltip).
|
||||
6. **Tests:**
|
||||
- `tests/web/services/test_systemd_control.py` — monkeypatch `asyncio.create_subprocess_exec`, assert the right argv.
|
||||
- `tests/api/workers/test_start_workers.py` — 202 admin / 403 viewer / 404 unknown name for single-worker start; aggregation shape for start-all with a mix of success/failure.
|
||||
- Frontend test coverage stays out of scope (no harness in repo).
|
||||
|
||||
**Deferred (documented on this ticket, not separate DEBTs):**
|
||||
|
||||
- **a. SWARM-host worker start/stop.** Today `agent` / `forwarder` / `updater` publish heartbeats to their *own* host's bus, not the master's — the Workers panel rows stay `unknown` by design. A master-originated start/stop for those daemons needs to ride the existing swarm mTLS API (`/api/v1/swarm/hosts/{id}/workers/{name}/{action}`), not the bus. Out of v2 as well — not a near-term need. When we ship it, reuse the same systemd helper on the agent side behind the mTLS boundary.
|
||||
|
||||
- **b. DECNET-side crash-quarantine policy.** v1 uses systemd's defaults (`Restart=on-failure`, `RestartSec=5s`, no upper bound on restart count) because they're battle-tested and cover 95% of operational reality. A sophisticated circuit-breaker — "quarantine worker X after N crashes in M minutes, expose the quarantine state in the panel" — is valuable for a honeypot-in-production context where a compromised template could cause tight crash loops that mask themselves as flapping. Design sketch: extend the worker_registry to track `(name, last_crash_ts)` triples sourced from `systemctl is-failed`, flip a row to `quarantined` state after threshold, require an admin "CLEAR QUARANTINE" click (→ `systemctl reset-failed`) before further auto-restart. Not blocking v1.
|
||||
|
||||
**Status:** Open. Depends on the Workers panel (shipped) and `deploy/decnet-bus.service` pattern being extended to the other workers.
|
||||
|
||||
### DEBT-036 — Session-profile ingester (keystroke-dynamics extraction from transcript shards)
|
||||
**Files:** `decnet/web/ingester.py` (or new sibling under `decnet/session_profiler/`), `decnet/web/db/models/attackers.py:SessionProfile` (table already exists, ships empty), `decnet/templates/_shared/sessrec/sessrec.c` (emitter side — already done), `decnet/web/router/attackers/api_get_attacker_detail.py` (consumer — already joins SessionProfile when present).
|
||||
|
||||
The `SessionProfile` SQLModel table has been committed to storage since session recording v1 landed (see `decnet/web/db/models/attackers.py:97-143`). Every column — `kd_iki_mean`, `kd_iki_stdev`, `kd_iki_p50`, `kd_iki_p95`, `kd_enter_latency_p50/p95`, `kd_burst_ratio`, `kd_think_ratio`, `kd_ctrl_backspace/wkill/ukill/abort/eof`, `kd_arrow_rate`, `kd_tab_rate`, `kd_digraph_simhash`, `total_keystrokes`, `session_duration_s` — is nullable by design because the **ingester that populates them does not exist yet** (documented as gap #2 in `SIGNAL_CAPTURE_AUDIT.md`). Every session that gets recorded lands an empty row (or, today, no row at all) while the `[t, "i", d]` event stream in the shard carries every signal those columns exist to capture.
|
||||
|
||||
**Motivating case.** Given the last 14 keystrokes of one real session (the `wget scanme.nmap.orgh` sequence from shard `2026-04-24`), a manual pass over the "i" events trivially recovers:
|
||||
- Coefficient of variation ≈ **0.74** — solidly in the human band (scripts <0.1, jittered tools 0.3-0.6, humans 0.7-1.5+).
|
||||
- A **467 ms pause** before the URL argument — classic semantic-boundary "thinking pause" between the command verb and its argument. Bots don't emit these; they fire the whole pre-composed line at uniform cadence.
|
||||
- Tight **intra-word bigrams** — `ge` 79 ms, `t<space>` 83 ms — muscle-memory transitions.
|
||||
- Slow **start-of-action latency** — `w` → `g` at 225 ms, characteristic of "initiating a command" vs "executing" a remembered one.
|
||||
|
||||
All four signals fall out of the schema for free. CoV from `kd_iki_mean` + `kd_iki_stdev`. Semantic pauses from `kd_think_ratio`. Bigram timing from `kd_digraph_simhash`. The fourth (start-of-action latency) doesn't have a column yet — see "Schema extensions" below.
|
||||
|
||||
**Design:**
|
||||
|
||||
1. **Trigger.** Subscribe on the bus to `attacker.session.ended` *or* (pragmatic fallback until DEBT-031's deferred session-boundary topic lands) poll `Log` rows with `event_type = "session_recorded"` that lack a `SessionProfile(sid=sid)` companion row. The poll path is what ships first; wire the bus later without changing the ingester body.
|
||||
2. **Read side.** For each (decky, service, sid), resolve the shard via the fallback-scan path already shipped in `323077b` (`api_get_transcript._find_shard_with_sid`). Extract only `[t, "i", d]` events — the per-session index built by `_get_index` already buckets events by sid, so this is O(keystrokes-in-sid), not O(shard).
|
||||
3. **Feature extraction.** One bounded pass over the input events:
|
||||
- IATs: pairwise `events[i].t - events[i-1].t`, clipped at e.g. 10 s so genuine "went to get coffee" gaps don't destroy the stdev.
|
||||
- Control-key rates: count backspace / ^U / ^W / ^C / ^D / arrow / tab against `total_keystrokes`, ratios not raw counts.
|
||||
- Enter latencies: IAT of each `\r` relative to the previous non-`\r` input.
|
||||
- Burst / think ratios: fraction of IATs below 200 ms / above 1 s.
|
||||
- SimHash: 8-byte Hamming-comparable digest over the top-N digraphs, weighted by occurrence.
|
||||
4. **Write side.** One `session_profile` upsert per sid. Idempotent on re-run (same sid → same row).
|
||||
5. **Schema extensions** (motivated by the manual analysis above — not blocking v1 but worth adding in the same commit if the ingester gets scheduled):
|
||||
- `kd_start_of_action_latency_ms` — IAT of the first keystroke after each prompt redraw (or approximated by "first keystroke after an idle gap >1 s"). User's point 5.
|
||||
- `kd_pause_hist_burst / _think / _distracted` — three-bucket pause-length histogram (<200 ms / 200-1500 ms / >1500 ms), more discriminating than a flat burst-vs-think ratio. User's middle suggestion.
|
||||
- `kd_top_bigrams` JSON blob — top-N (bigram, count, mean_iat_ms) tuples. Complement to `kd_digraph_simhash` that answers "same typist in same mental state", not just "same typist". User's first suggestion.
|
||||
|
||||
**Non-negotiables:**
|
||||
- Bounded by the existing 10 MB per-session shard cap; no new disk-free precheck needed.
|
||||
- No PII beyond what the shard already stores. Raw keystroke `d` values (which include the attacker's passwords in the input stream) MUST NOT land in `SessionProfile` columns — only timing and frequency aggregates. Bigram SimHash uses *characters*, not *content* — but document this explicitly in the column docstring so a future contributor doesn't "improve" it into something that leaks.
|
||||
- Idempotent: re-running the ingester on a sid that already has a `SessionProfile` row overwrites deterministically (same shard, same `[t,"i",d]` events → same features).
|
||||
- `FakeBus` / poll-only must keep this functional when `DECNET_BUS_ENABLED=false` — mirrors the DEBT-031 rollout pattern.
|
||||
|
||||
**Acceptance:**
|
||||
- Shipping a decky, running a real SSH session, disconnecting → within one ingester tick a `SessionProfile` row exists with non-null `kd_iki_mean`, `kd_iki_stdev`, `kd_burst_ratio`, `kd_think_ratio`, `total_keystrokes`, `session_duration_s`.
|
||||
- The motivating-case wget session produces CoV ≈ 0.74 ± 0.05 when the ingester processes it — sanity check against the manual analysis.
|
||||
- The AttackerDetail page surfaces at least `kd_iki_mean` + `kd_burst_ratio` somewhere in the keystroke-dynamics section, unblocking the "is this the same typist" hover story.
|
||||
|
||||
**Status:** Open. Depends on the shard-scan fallback (shipped in `323077b`) and `SessionProfile` schema (shipped with session recording v1). The bus-trigger path depends on DEBT-031's deferred `attacker.session.started/ended` topics, but poll-driven ingestion works today and can ship first.
|
||||
|
||||
### DEBT-035 — Artifacts written as the container uid, not the API's
|
||||
**Files:** `decnet/services/ssh.py`, `decnet/services/telnet.py`, `decnet/templates/{ssh,telnet}/{Dockerfile,entrypoint.sh}`, `decnet/composer.py` (wherever bind mounts for `/var/lib/decnet/artifacts/**` are generated), `decnet/web/router/transcripts/api_get_transcript.py` (consumer).
|
||||
|
||||
Every decoy container that produces artifacts (session recordings, captured uploads, credential dumps) writes into a host bind-mount under `/var/lib/decnet/artifacts/{decky}/{service}/...`. The writer is whatever uid is running inside the container — typically `root` (uid 0 inside the container, which maps to the host's `root` or the container's own unprivileged `decnet` uid depending on the template's `USER` directive). The API, on the other hand, runs under whatever `--user` was passed to `decnet init` — `anti` on dev boxes, `decnet` in production.
|
||||
|
||||
On mismatch, the API process hits `PermissionError` the moment it tries to `stat()` the artifacts dir. The transcripts endpoint now soft-fails this into a 404 (shipped in `323077b`), which keeps the API up but still leaves the operator unable to view any session that was recorded before the mismatch was fixed by hand.
|
||||
|
||||
**Evidence (dev box, 2026-04-24):**
|
||||
```
|
||||
PermissionError: [Errno 13] Permission denied:
|
||||
'/var/lib/decnet/artifacts/omega-decky/ssh/transcripts'
|
||||
```
|
||||
Workaround: `sudo chown -R anti:anti /var/lib/decnet/artifacts`. Every new decky re-creates the dir as whatever uid the container uses, so the workaround has to be re-run — which doesn't scale.
|
||||
|
||||
**Design options (pick one, not all):**
|
||||
|
||||
1. **Container runs as the host API's uid.** `compose_fragment()` for every artifact-producing service injects `user: "{host_uid}:{host_gid}"` into the compose snippet, sourcing the uid/gid from whatever `DECNET_API_UID` / `DECNET_API_GID` the master detected at init time (or `id -u` / `id -g` of the current process at compose time). This is the cleanest but has the most blast radius — bind mounts need to be pre-chowned to that uid before the container starts, and some templates have `entrypoint.sh` steps that assume root (e.g. `setcap`, `chmod` of system files during service setup).
|
||||
|
||||
2. **Setgid bit on the artifacts tree + shared group.** `mkdir -p /var/lib/decnet/artifacts && chmod 2775 /var/lib/decnet/artifacts && chgrp decnet /var/lib/decnet/artifacts`. Every new file inherits the `decnet` group; the API (member of `decnet`) can read regardless of which uid wrote. Still requires each container to `chmod g+r` its output — sessrec/emitter code would need a small change to `umask(0002)` or explicit `fchmod` calls. Less invasive but fragile: any writer that forgets the umask silently regresses.
|
||||
|
||||
3. **Sidecar post-processor.** A long-running daemon under the API's uid `inotify`-watches `/var/lib/decnet/artifacts/**`, re-chowns new files on creation. Works without touching any template, but adds a new process and a race window between "file created" and "file readable by API". Not a great shape for an already-worker-heavy architecture.
|
||||
|
||||
**Recommendation:** option 1, with the init command handling the setup (mkdir the artifacts tree with mode 0775, group = `--group`, then propagate the uid/gid into the compose generator). Option 2 as a fallback where option 1 can't land (e.g. templates that genuinely need root inside the container, like the conpot ICS template).
|
||||
|
||||
**Acceptance:**
|
||||
- A fresh `decnet init --user anti --group anti` → deploy a decky → exercise a recorded session → the API (running as `anti`) can read `/var/lib/decnet/artifacts/.../transcripts/sessions-*.jsonl` **without any manual chown**.
|
||||
- The soft-fail path shipped in `323077b` stays as defence-in-depth — the API must never 500 on a permission mismatch, but it also shouldn't *need* to soft-fail on a healthy install.
|
||||
|
||||
**Status:** Open. Current workaround is `sudo chown -R <user>:<group> /var/lib/decnet/artifacts` after every new deploy; soft-fail in the transcripts endpoint keeps the API alive in the interim.
|
||||
|
||||
### DEBT-037 — Webhook delivery guarantees beyond MVP
|
||||
**Files:** `decnet/webhook/` (**new**), `decnet/web/db/models/webhooks.py` (**new**), `decnet/web/router/webhooks/` (**new**).
|
||||
|
||||
The webhook worker (Wazuh / Shuffle / TheHive / n8n integration path) ships MVP-first: subscription CRUD + a `decnet webhook` worker that subscribes to the internal bus, forwards matching events as HTTP POSTs with HMAC-SHA256 signatures (`X-DECNET-Signature: sha256=<hex>`), and retries 3× with exponential backoff. Simple-mode UI exposes an enum of event families (`AttackerDetail` / `DeckyStatus` / `SystemStatus`); Advanced mode exposes raw bus-topic patterns. Payload bodies are the existing Pydantic response models — no new schema.
|
||||
|
||||
What MVP deliberately defers:
|
||||
|
||||
1. ~~**Circuit breaker.**~~ ✅ **Shipped 2026-04-24.** After `DECNET_WEBHOOK_CIRCUIT_THRESHOLD` (default 5) consecutive failures the worker calls `trip_webhook_circuit(uuid, ts)` — flips `enabled=False`, stamps `auto_disabled_at`, fires a reload. Operator clears the trip by re-enabling via PATCH, which zeros the counter and clears the stamp. UI surfaces `TRIPPED · <ts>` chip on the row; page header shows a `N TRIPPED` count.
|
||||
2. **Dead-letter table.** Events that exhaust retries are dropped with a log line, not persisted. Operators can't replay a missed event after they fix their Shuffle flow. Minimum viable: `webhook_dead_letters(subscription_id, topic, payload_json, final_error, dropped_at)` with a TTL sweep, and `POST /webhooks/{id}/replay?since=...` to re-queue.
|
||||
3. **Delivery audit log.** No persisted record of "what went where and when." Useful for compliance and for debugging "why didn't TheHive see that alert." Same table shape as dead-letter but success-path entries with retention knob.
|
||||
4. **Batch delivery / coalescing.** Every event fires one HTTP POST. High-volume topics (`system.log` on a busy master) will happily saturate the egress. Post-MVP, add a bounded batch window (e.g. up to 50 events or 500 ms) and POST an envelope `{events: [...]}`.
|
||||
5. **Per-subscription rate limiting.** An admin who subscribes to `>` gets every event DECNET ever emits. A token-bucket cap (requests/sec to a given destination) protects both the webhook worker and the destination from operator self-inflicted DoS.
|
||||
6. **Template overrides.** Shuffle accepts the DECNET shape; TheHive wants an observable-style envelope; Wazuh wants a flat `decoder + field` shape. MVP ships one shape. Post-MVP: per-subscription Jinja-ish payload template, or a small set of named adapters (`"shape": "thehive" | "wazuh" | "raw"`).
|
||||
7. **Secret rotation.** HMAC secret is stored plaintext in the DB and rotated by UPDATE. Post-MVP: encrypt at rest (using the existing JWT secret as KEK), dual-secret window during rotation so in-flight verifications don't fail.
|
||||
|
||||
**Non-negotiable even at MVP:**
|
||||
- HMAC signing (already scoped in MVP — listed here only to clarify it's NOT on the deferred list).
|
||||
- `DECNET_BUS_ENABLED=false` must leave the webhook worker functional in a degraded "disabled" mode that surfaces its state via the Workers panel, matching DEBT-031's pattern.
|
||||
- Retry backoff MUST jitter; synchronized retries across a fleet of DECNET masters would be its own DoS.
|
||||
|
||||
**Status:** Not yet started. Opens alongside the webhook MVP commit — the MVP PR will reference this entry and the follow-up work will close items 1–7 in priority order (circuit breaker first, batch delivery last).
|
||||
|
||||
### DEBT-038 — SSH PAM cred-capture: known limitations
|
||||
**Files:** `decnet/templates/ssh/auth-helper.c`, `decnet/templates/ssh/Dockerfile`.
|
||||
|
||||
The SSH cred-capture path that closes the "real OpenSSH doesn't log attempted passwords" gap (commit `d064125`) ships in the smallest, most-realistic mechanism available — a static `pam_exec.so` shim binary. That choice trades a handful of known limitations against the alternatives (custom C PAM module, eBPF, OpenSSH patch, all heavier and more fingerprintable). Documenting them here so the trade-offs are explicit and the migration paths are obvious if any of these actually bite.
|
||||
|
||||
1. **Helper binary visible on disk.** `/usr/sbin/auth-helper` exists at runtime; a rooted attacker with shell can `find` it. Mitigations in place: boring system-binary name, stripped, statically linked (`file` reports a generic ELF, no module/library hints). Future hardening if needed: stealth-pack via the existing `_build_stealth.py` mechanism (XOR+gzip+base64 in `/entrypoint.sh`, write to disk at container start) — same pattern `syslog_bridge.py` and `emit_capture.py` already use. Skipped in v1 because the binary still has to exist on disk for `pam_exec` to invoke it; stealth packing only adds extraction complexity without reducing the exposed surface.
|
||||
|
||||
2. **PAM line fingerprinty.** `/etc/pam.d/sshd` shows `auth optional pam_exec.so expose_authtok stdout /usr/sbin/auth-helper`. Real ops use this exact pattern (Duo, Okta, custom MFA), so the line itself is not honeypot-screaming — but a sophisticated adversary reading PAM stacks against a known-good baseline will notice an unusual binary path. No clean mitigation short of the full custom-`.so` migration in (3).
|
||||
|
||||
3. **Fork-per-attempt DoS.** Every auth attempt forks `auth-helper`. Bounded above by sshd's `MaxStartups` and `LoginGraceTime` defaults; not exploitable in practice but real at extreme attempt rates (multi-thousand-per-second hydra runs against a single decky). Migration if it bites: a custom `pam_decnet_capture.so` writing via direct syscall without the fork. The PAM line stays identical (`auth optional pam_decnet_capture.so` with the same `expose_authtok`); only the binary type changes. Same wire format on the way out — no collector or dashboard work.
|
||||
|
||||
4. **Pubkey attempts not captured.** Pubkey auth runs through a separate PAM path; password-only is v1 by intent. Capturing pubkey attempt fingerprints (key-type, comment, fingerprint hash) needs a parallel hook into sshd's pubkey path, not pam_exec. Valuable signal but lower reuse density than passwords — defer until v2 or until cred-reuse analytics surface a need.
|
||||
|
||||
5. **Telnet had the same gap — closed in commit `f1026b4`.** Telnet's busybox-telnetd → `/bin/login` PAM stack didn't log attempted passwords either; the `auth-helper` binary is service-agnostic and was extended into `/etc/pam.d/login` via the same one-line PAM hook. The canonical source moved to `decnet/templates/_shared/auth-helper/auth-helper.c` and is synced into both ssh/ and telnet/ build contexts via `_sync_auth_helper_sources()` (mirrors the existing sessrec sync). Limitations 1–4 above apply equally to the telnet hook.
|
||||
|
||||
6. **Standardized SD shape (DEBT-039 follow-up).** The auth-helper SD-block now emits the universal `principal` + `secret_printable` + `secret_b64` keys consumed directly by the ingester's native-shape branch and stored as hoisted columns on the new `Credential` table. `username` rides alongside as a service-specific identity field for SSH/Telnet. Future emitters drop `username` in favor of their service-native identity (`domain` for SMTP, `dn` for LDAP, …).
|
||||
|
||||
**Status:** Open — document-only ticket tracking the architectural trade-offs of the v1 implementation. None of these are blocking; they're the things to know if the helper ever needs upgrading.
|
||||
|
||||
### ~~DEBT-039 — Migrate FTP/POP3/IMAP/SMTP emitters to standardized credential shape~~ ✅ RESOLVED
|
||||
|
||||
Closed by commits `aebb9f8` (encode_secret() helper), `abb4dd9` (six-service migration), and the legacy-adapter removal commit. Scope expanded during execution to include Redis (`auth, password=` — was silently dropped) and LDAP (`bind, dn=, password=` — was silently dropped) — both now emit the universal shape and feed the native ingester branch. The legacy adapter `_ingest_credential_legacy` and its `username`+`password` fork are deleted; only the native branch remains. Also added: the SMTP MAIL FROM event now exposes a parsed `domain=` field alongside the original `value=` for future "what domains attackers spoof from" analytics — Log row only, no Credential write.
|
||||
|
||||
---
|
||||
|
||||
### ~~DEBT-040 — RDP, SMB, RDP-NLA cred capture (protocol framers)~~ ✅ RESOLVED
|
||||
**Files:** `decnet/templates/smb/server.py` (rewritten), `decnet/templates/rdp/server.py` (rewritten), `decnet/engine/deployer.py` (`_sync_ntlmssp_sources()`), `decnet/services/rdp.py` (`nla` knob), `tests/service_testing/test_smb_server.py` + `test_rdp_basic.py` + `test_rdp_nla.py`.
|
||||
|
||||
Closed in three commits on `dev`:
|
||||
|
||||
1. **SMB NTLMSSP framer.** `SimpleSMBServer` replaced with a hand-rolled asyncio SMB2 framer that walks Negotiate → SessionSetup(Type 1) → SessionSetup(Type 3); reuses the shared `parse_type3()` to land `secret_kind="ntlmssp_v2"` (or `_v1`) in the Credential table. Always returns `STATUS_LOGON_FAILURE`. SPNEGO Type 2 challenge is wrapped per RFC 4178; per-decky `SERVER_CHALLENGE` derived from `instance_seed.random_bytes("ntlm_challenge")` so the fleet doesn't share a fingerprint. Impacket dependency dropped. 7 unit tests.
|
||||
|
||||
2. **RDP X.224 cookie capture.** The Twisted-based connection logger replaced with an asyncio handler that parses the X.224 Connection Request, extracts the `mstshash=<user>` routing cookie (stamped by mstsc / FreeRDP / Hydra / ncrack / MSF `rdp_login`), records `rdpNegRequest.requestedProtocols`, and answers with a well-formed Connection Confirm selecting `PROTOCOL_RDP`. Scope-down vs. the original spec: full `TS_INFO_PACKET` extraction would have required either Standard-RDP-Security RC4 (with our own RSA pair + MS-RDPBCGR signing) or a complete MCS+GCC ASN.1/BER stack — both far beyond the 150 LoC budget. The cookie is the only credential bit that flows in plaintext on the wire; capturing it is the highest-value-per-byte signal without those rabbit holes. 7 unit tests.
|
||||
|
||||
3. **RDP NLA / CredSSP.** Behind `RDP_ENABLE_NLA=true` (or `service_cfg.nla=true` in the topology), confirms `PROTOCOL_HYBRID`, upgrades the socket to TLS via `loop.start_tls()` using a self-signed cert generated by the entrypoint, then drives a tiny CredSSP loop: read inbound TSRequest DER, scan for the NTLMSSP signature, dispatch on message type — Type 1 → respond with TSRequest carrying a Type 2 challenge; Type 3 → `parse_type3()` and emit. Hand-built TSRequest writer (no `pyasn1` dep). 9 unit tests (DER reader, builder, `_handle_nla` round-trip, oversized-DER drop, per-instance challenge differs across `NODE_NAME`).
|
||||
|
||||
Shared prep landed in commit 1: `_sync_ntlmssp_sources()` in `decnet/engine/deployer.py` mirrors the auth-helper / sessrec sync pattern, copies `_shared/ntlmssp.py` into the SMB and RDP build contexts before `docker compose up`.
|
||||
|
||||
**Deferred (not blocking close):**
|
||||
- Full `TS_INFO_PACKET` (basic-RDP plaintext password) — see scope-down note in commit 2. Re-open as a follow-up DEBT if attacker telemetry actually shows traffic on `PROTOCOL_RDP` without NLA.
|
||||
- Pubkey / Kerberos auth paths — out of scope; mirrors DEBT-038's deferral on the SSH side.
|
||||
|
||||
### ~~DEBT-041 — Intel API + UI keyed by attacker.ip, not attacker.uuid~~ ✅ RESOLVED
|
||||
Closed by re-key commit on `dev`. `attacker_intel.attacker_uuid` is now the canonical key (UNIQUE + FK to `attackers.uuid`); `attacker_ip` stays as a denormalised value column (indexed, not unique). `GET /api/v1/attackers/{uuid}/intel` is the only public route — the IP-keyed alias was deleted, not deprecated. Bus event `attacker.intel.enriched` payload gains `attacker_uuid` alongside `attacker_ip` for SIEM consumers. `<IntelPanel uuid={...} />` swaps to UUID. The ticket text below is preserved as the original rationale.
|
||||
|
||||
**Files:** `decnet/web/router/attackers/api_get_attacker_intel.py`, `decnet/web/db/sqlmodel_repo.py:upsert_attacker_intel`, `decnet/web/db/models/attacker_intel.py`, `decnet_web/src/components/AttackerDetail.tsx` (`<IntelPanel ip={attacker.ip} />`).
|
||||
|
||||
The threat-intel enrichment surface (DEBT-N/A: `feat(intel)` series) keys every public surface — `GET /api/v1/attackers/{ip}/intel`, the row's `attacker_ip` UNIQUE, and the React `<IntelPanel ip=...>` — on the attacker's IP rather than the canonical `attacker.uuid` we use for every other attacker-detail route. The decision was deliberate in v1: the enricher is woken by `attacker.observed` / `attacker.scored` events whose payload is naturally IP-keyed, the row models a *one-row-per-IP* TTL cache, and standing up a parallel UUID lookup endpoint would have added a join hop with no consumer.
|
||||
|
||||
**Why this is debt, not just a design choice:**
|
||||
1. **NAT / shared-egress collisions.** Two distinct attacker UUIDs that share a source IP (corporate NAT, mobile carrier CGNAT, open VPN exit) collapse to one intel row. Verdicts are technically "about the IP" so this is correct semantically, but the AttackerDetail surface implies *this attacker's intel*, which is misleading when an actor swap goes unnoticed. A UUID-keyed view would let the UI show "this row is shared with N other attacker profiles" honestly.
|
||||
2. **API consistency.** Every other route under `/api/v1/attackers/` is keyed by UUID (`/{uuid}/commands`, `/{uuid}/artifacts`, `/{uuid}/transcripts`, etc.). The IP-keyed `/{ip}/intel` is an outlier that contract-test scaffolding (Schemathesis path-param fuzzing) and OpenAPI-driven SDKs will trip over.
|
||||
3. **Federation-shape mismatch.** DEVELOPMENT_V2's federation work expects gossip-able fingerprints attached to *identity vectors* (session profiles, simhash), not IP-keyed rows. When the federation layer lands and starts asking "what intel exists for this attacker?", the answer is currently a join through the IP — fine, but the abstraction leaks.
|
||||
4. **AttackerDetail.tsx coupling.** `<IntelPanel ip={attacker.ip} />` requires the parent fetch (UUID-keyed) to land before the panel can fire its own request. Two sequential fetches where one would suffice if the panel were UUID-keyed and either (a) the row carried `attacker_uuid` as a queryable index or (b) the endpoint accepted a UUID and performed the IP join server-side.
|
||||
|
||||
**Migration sketch (post-v1):**
|
||||
1. Add `GET /api/v1/attackers/{uuid}/intel` — server-side resolves `uuid → ip`, then `ip → AttackerIntel` row. Keep the IP-keyed route as a deprecated alias for two release cycles.
|
||||
2. Frontend switches `<IntelPanel uuid={...} />` and the parallel-fetches via `Promise.all` with the existing `useEffect`s.
|
||||
3. Decide whether the `attacker_intel` table grows a real foreign key on `attacker_uuid` (with the NAT-collision implications above made explicit in the model docstring) OR whether the row stays IP-keyed and the endpoint just performs the join — the latter is cheaper, the former gives stronger guarantees if/when we want to delete intel rows on attacker purge.
|
||||
|
||||
**Acceptance:**
|
||||
- `/api/v1/attackers/{uuid}/intel` returns the intel row for the attacker's *current* IP, with a clear contract on what happens when an attacker has rotated IPs (see follow-up open question).
|
||||
- The IP-keyed route returns `Deprecation:` header and is removed in v1.2 or v2.0 once external integrations migrate.
|
||||
- AttackerDetail.tsx stops passing `attacker.ip` into `<IntelPanel/>`.
|
||||
|
||||
**Open question:** for an attacker UUID whose row currently carries IP `A` but who first appeared from IP `B`, what should `/attackers/{uuid}/intel` return? Most-recent-IP (current behavior implicit through `attacker.ip`) is the v1 answer; "all intel rows ever associated with this attacker" might surface IP rotation more clearly in a v2 surface. Decide before the migration ships, document either way.
|
||||
|
||||
**Status:** Open. No operational impact today (single-IP attackers are the dominant case), but worth closing before the federation layer lands so the wire-format and API both speak in identity terms, not IP terms.
|
||||
|
||||
### DEBT-032 — Prober can't detect fingerprint rotation without mutation
|
||||
**Files:** `decnet/prober/worker.py` (~lines 235, 286, 334, 392), `decnet/web/db/models.py` (new `decky_service_fingerprints` table).
|
||||
|
||||
Substrate identity is `(service_name, implementation_fingerprint)`, not service name alone. A base-image rebuild that rotates OpenSSH 8.4 → 9.2 — or any recompose that changes JARM / HASSH / TCP fingerprint without changing the service list — is a substrate transition from the attacker's recon POV, and today the correlation graph sees none of it.
|
||||
|
||||
The prober already computes JARM (`worker.py:286`), HASSH (`worker.py:334`), and TCP fingerprint (`worker.py:392`), and emits each as RFC 5424 syslog + optional bus publish. What's missing is **per-(decky, service, probe_type) persistence** to diff against: the current dedup set `probed: dict[IP → {probe_type → set(ports)}]` (`worker.py:235`) is in-memory and scoped to one run, so any restart loses history and any same-IP probe on a changed substrate can't be detected as a change.
|
||||
|
||||
**Design:**
|
||||
1. New SQLModel table `decky_service_fingerprints` keyed by `(decky_name, service, probe_type)` with `last_hash, last_seen_at, sample_count`. One upsert per probe; bounded by fleet × probe families.
|
||||
2. Prober reads `last_hash` before emitting; on diff, emits a new `substrate_fingerprint_changed` event (RFC 5424 syslog + `decky.{id}.fingerprint` bus topic) with `{decky, service, probe_type, old_hash, new_hash}`. On match, upsert the timestamp and skip the event.
|
||||
3. Correlator consumes the new event kind into a parallel per-decky index (mirroring the mutation index landed in this session) and interleaves `🔍 decky-03 hassh drift` markers in `AttackerTraversal.fingerprints_during`.
|
||||
4. Divergence detector: compare `substrate_state(t)` fold (mutations) vs `observed_identity(t)` fold (fingerprints) per decky. A fingerprint change without a preceding mutation ⇒ `substrate_divergence` finding — container drift, compromised base image, rootkit banner rewrite, or prober lag. Falls out of the data model for free once both streams exist.
|
||||
|
||||
**Prerequisite satisfied:** mutation event stream + correlator mutation-kind parser landed alongside this DEBT entry (commits `f875350`, `fa0cdb3`, `bf5ed7a`, `d4d8a2a` on `dev`). The fingerprint stream plugs into the same substrate: same RFC 5424 emission pattern, sibling per-decky engine index, same timeline interleaving.
|
||||
|
||||
**Status:** Open — deferred to its own commit sequence. The dedup state in `worker.py:235` is the only thing standing between "JARM hash computed" and "substrate rotation detected."
|
||||
|
||||
---
|
||||
|
||||
## 🟢 Low
|
||||
@@ -142,6 +473,30 @@ The deploy endpoint exercises Docker Compose orchestration via `decnet.engine.de
|
||||
~~**Files:** Project root~~
|
||||
`requirements.lock` generated via `pip freeze`. Reproducible installs now available via `pip install -r requirements.lock`.
|
||||
|
||||
### DEBT-042 — Orchestrator failure-count badge is window-bound
|
||||
**File:** `decnet_web/src/components/Orchestrator.tsx`
|
||||
The "X failures / 1h" header badge is computed from the in-memory SSE
|
||||
window (capped at 500 rows merged with one paginated server page). On
|
||||
busy fleets — many deckies × dense activity — failures older than the
|
||||
local window or beyond the visible page are silently excluded, so the
|
||||
badge can read low. Acceptable for MVP; the badge is a hint, not a
|
||||
metric.
|
||||
**Remediation:** add a dedicated count endpoint
|
||||
(`GET /api/v1/orchestrator/events/stats?since=1h&success=false`) and
|
||||
have the badge call it on the same cadence the page already polls.
|
||||
Trigger: first time the count visibly diverges from a hand-checked
|
||||
DB query, or fleet size ≥ 10 active deckies.
|
||||
|
||||
### DEBT-043 — No frontend test framework configured
|
||||
**Files:** `decnet_web/package.json`
|
||||
The repo has no vitest/jest/RTL setup. Frontend changes (Orchestrator
|
||||
page, useOrchestratorStream hook, identity/campaign pages) ship with
|
||||
backend-only coverage. Component-level regressions land in production
|
||||
unless caught by manual smoke testing.
|
||||
**Remediation:** add vitest + @testing-library/react, write the
|
||||
listed-but-skipped tests for `Orchestrator.tsx` (renders empty state,
|
||||
filter toggling, mocked-EventSource prepend) as the seed suite.
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
@@ -176,6 +531,20 @@ The deploy endpoint exercises Docker Compose orchestration via `decnet.engine.de
|
||||
| DEBT-026 | 🟡 Medium | Features | deferred (out of scope) |
|
||||
| DEBT-027 | 🟡 Medium | Features | deferred (out of scope) |
|
||||
| DEBT-028 | 🟡 Medium | Testing | deferred (needs DinD CI) |
|
||||
| DEBT-029 | 🟡 Medium | Architecture / Bus | ✅ resolved |
|
||||
| DEBT-030 | 🟡 Medium | Web / Live mutations | ✅ resolved (Phase A) |
|
||||
| ~~DEBT-031~~ | ✅ | Workers / Bus integration | resolved |
|
||||
| DEBT-032 | 🟡 Medium | Correlation / Prober | open |
|
||||
| DEBT-033 | 🟡 Medium | Storage / Session recording | open |
|
||||
| DEBT-035 | 🟡 Medium | Artifacts / Filesystem perms | open |
|
||||
| DEBT-036 | 🟡 Medium | Correlation / Keystroke dynamics | open |
|
||||
| DEBT-037 | 🟡 Medium | Integration / Webhooks | open (tracks MVP follow-ups) |
|
||||
| DEBT-038 | 🟡 Medium | Honeypot / SSH cred capture | open (document-only) |
|
||||
| ~~DEBT-039~~ | ✅ | Honeypot / Cred emitters | resolved |
|
||||
| ~~DEBT-040~~ | ✅ | Honeypot / RDP+SMB cred framers | resolved |
|
||||
| ~~DEBT-041~~ | ✅ | API / UI / Threat-intel keying | resolved |
|
||||
| DEBT-042 | 🟢 Low | UI / Orchestrator failure-count window | open |
|
||||
| DEBT-043 | 🟡 Medium | Frontend test framework missing | open |
|
||||
|
||||
**Remaining open:** DEBT-011 (Alembic), DEBT-023 (image pinning), DEBT-026 (modular mailboxes), DEBT-027 (Dynamic bait store), DEBT-028 (deploy endpoint tests)
|
||||
**Estimated remaining effort:** ~12 hours
|
||||
**Remaining open:** DEBT-011 (Alembic), DEBT-023 (image pinning), DEBT-026 (modular mailboxes), DEBT-027 (Dynamic bait store), DEBT-028 (deploy endpoint tests), DEBT-032 (fingerprint rotation detection), DEBT-033 (transcript shard rotation), DEBT-035 (artifacts uid/gid alignment), DEBT-036 (session-profile ingester), DEBT-037 (webhook delivery hardening), DEBT-038 (SSH PAM cred-capture limitations — document-only), DEBT-042 (orchestrator failure-count window), DEBT-043 (frontend test framework).
|
||||
**Estimated remaining effort:** ~21 hours. DEBT-030 Phase B (optimistic staged-buffer editor) is a follow-up, not debt.
|
||||
|
||||
@@ -4,33 +4,33 @@
|
||||
*Goal: Ensure every service is interactive enough to feel real during manual exploration.*
|
||||
|
||||
### Remote Access & Shells
|
||||
- [ ] **SSH (Cowrie)** — Custom filesystem, realistic user database, and command execution.
|
||||
- [ ] **Telnet (Cowrie)** — Realistic banner and command emulation.
|
||||
- [ ] **RDP** — Realistic NLA authentication and screen capture (where possible).
|
||||
- [ ] **VNC** — Realistic RFB protocol handshake and authentication.
|
||||
- [~] **SSH (Cowrie)** — Custom filesystem, realistic user database, and command execution: DELETED! Will use real OpenSSH for the highest interaction possible.
|
||||
- [~] **Telnet (Cowrie)** — Realistic banner and command emulation: DELETED! Will use Busybox Telnetd for the same reasons as above.
|
||||
- [x] **RDP** — Realistic NLA authentication and screen capture (where possible).
|
||||
- [x] **VNC** — Realistic RFB protocol handshake and authentication.
|
||||
- [x] **Real SSH** — High-interaction sshd with shell logging.
|
||||
|
||||
### Databases
|
||||
- [ ] **MySQL** — Support for common SQL queries and realistic schema.
|
||||
- [ ] **Postgres** — Realistic version strings and basic query support.
|
||||
- [ ] **MSSQL** — Realistic TDS protocol handshake.
|
||||
- [ ] **MongoDB** — Support for common Mongo wire protocol commands.
|
||||
- [x] **MySQL** — Support for common SQL queries and realistic schema.
|
||||
- [x] **Postgres** — Realistic version strings and basic query support.
|
||||
- [x] **MSSQL** — Realistic TDS protocol handshake.
|
||||
- [x] **MongoDB** — Support for common Mongo wire protocol commands.
|
||||
- [x] **Redis** — Support for basic GET/SET/INFO commands.
|
||||
- [ ] **Elasticsearch** — Realistic REST API responses for `/_cluster/health` etc.
|
||||
- [x] **Elasticsearch** — Realistic REST API responses for `/_cluster/health` etc.
|
||||
|
||||
### Web & APIs
|
||||
- [x] **HTTP** — Flexible templates (WordPress, phpMyAdmin, etc.) with logging.
|
||||
- [ ] **Docker API** — Realistic responses for `docker version` and `docker ps`.
|
||||
- [ ] **Kubernetes (K8s)** — Mocked kubectl responses and basic API exploration.
|
||||
- [x] **Docker API** — Realistic responses for `docker version` and `docker ps`.
|
||||
- [x] **Kubernetes (K8s)** — Mocked kubectl responses and basic API exploration.
|
||||
- [x] **LLMNR** — Realistic local name resolution responses via responder-style emulation.
|
||||
|
||||
### File Transfer & Storage
|
||||
- [ ] **SMB** — Realistic share discovery and basic file browsing.
|
||||
- [x] **SMB** — Realistic share discovery and basic file browsing.
|
||||
- [x] **FTP** — Support for common FTP commands and directory listing.
|
||||
- [ ] **TFTP** — Basic block-based file transfer emulation.
|
||||
- [x] **TFTP** — Basic block-based file transfer emulation.
|
||||
|
||||
### Directory & Mail
|
||||
- [ ] **LDAP** — Basic directory search and authentication responses.
|
||||
- [x] **LDAP** — Basic directory search and authentication responses.
|
||||
- [x] **SMTP** — Mail server banners and basic EHLO/MAIL FROM support.
|
||||
- [x] **IMAP** — Realistic mail folder structure and auth.
|
||||
- [x] **POP3** — Basic mail retrieval protocol emulation.
|
||||
@@ -38,56 +38,122 @@
|
||||
### Industrial & IoT (ICS)
|
||||
- [x] **MQTT** — Basic topic subscription and publishing support.
|
||||
- [x] **SNMP** — Realistic MIB responses for common OIDs.
|
||||
- [ ] **SIP** — Basic VoIP protocol handshake and registration.
|
||||
- [x] **SIP** — Basic VoIP protocol handshake and registration.
|
||||
- [x] **Conpot** — SCADA/ICS protocol emulation (Modbus, etc.).
|
||||
|
||||
---
|
||||
|
||||
## Core / Hardening
|
||||
|
||||
- [ ] **Attacker fingerprinting** — Capture TLS JA3/JA4 hashes, TCP window sizes, User-Agent strings, and SSH client banners.
|
||||
- [ ] **Canary tokens** — Embed fake AWS keys and honeydocs into decky filesystems.
|
||||
- [~] **Attacker fingerprinting** — HTTP User-Agent, VNC client version stored as `fingerprint` bounties. JA3/JA3S in progress (sniffer container). HASSH, JA4+, TCP stack, JARM planned (see Attacker Intelligence section).
|
||||
- [x] **Canary tokens** — Embed fake AWS keys and honeydocs into decky filesystems.
|
||||
- [ ] **Tarpit mode** — Slow down attackers by drip-feeding bytes or delaying responses.
|
||||
- [x] **Dynamic decky mutation** — Rotate exposed services or OS fingerprints over time.
|
||||
- [x] **Credential harvesting DB** — Centralized database for all username/password attempts.
|
||||
- [ ] **Session recording** — Full capture for SSH/Telnet sessions.
|
||||
- [ ] **Payload capture** — Store and hash files uploaded by attackers.
|
||||
- [x] **Session recording** — Full capture for SSH/Telnet sessions. -> sessrec pty relay writes asciinema v2 day-shards per decky; paged API + SessionDrawer replay in the dashboard.
|
||||
- [x] **Payload capture** — Store and hash files uploaded by attackers. -> Via inotifywait and custom C wrappers.
|
||||
|
||||
## Detection & Intelligence
|
||||
|
||||
- [ ] **Real-time alerting** — Webhook/Slack/Telegram notifications for first-hits.
|
||||
- [ ] **Threat intel enrichment** — Auto-lookup IPs against AbuseIPDB, Shodan, and GreyNoise.
|
||||
- [ ] **Attack campaign clustering** — Group sessions by signatures and timing patterns.
|
||||
- [ ] **GeoIP mapping** — Visualize attacker origin and ASN data on a map.
|
||||
- [x] **Real-time alerting via webhooks** — Admin-configurable outbound webhooks (SIEM/SOAR integration: Wazuh/Shuffle/TheHive/n8n) with HMAC-SHA256 signing, topic-pattern filtering, and bounded retry. Slack/Telegram-specific senders remain as per-destination work (they accept generic webhook payloads already).
|
||||
- [x] **Threat intel enrichment** — Auto-lookup IPs against AbuseIPDB, Shodan, and GreyNoise. -> Out-of-band `decnet enrich` worker, woken on `attacker.scored`/`attacker.observed`. v1 ships GreyNoise Community + AbuseIPDB + abuse.ch (Feodo Tracker bulk feed and ThreatFox per-IP). Shodan / Censys / OTX backlogged in DEVELOPMENT_V2.md.
|
||||
- [x] **Attack campaign clustering** — Group sessions by signatures and timing patterns.
|
||||
- [x] **GeoIP mapping** — Visualize attacker origin and ASN data on a map.
|
||||
- [ ] **TTPs tagging** — Map observed behaviors to MITRE ATT&CK techniques.
|
||||
|
||||
## Dashboard & Visibility
|
||||
|
||||
- [x] **Web dashboard** — Real-time React SPA + FastAPI backend for logs and fleet status.
|
||||
- [x] **Decky Inventory** — Dedicated "Decoy Fleet" page showing all deployed assets.
|
||||
- [ ] **Pre-built Kibana/Grafana dashboards** — Ship JSON exports for ELK/Grafana.
|
||||
- [ ] **CLI live feed** — `decnet watch` command for a unified, colored terminal stream.
|
||||
- [~] **Pre-built Kibana/Grafana dashboards** — Ship JSON exports for ELK/Grafana. -> Deferred to post-v1 release.
|
||||
- [~] **CLI live feed** — `decnet watch` — WON'T IMPLEMENT: redundant with `tail -f` on the existing log file; adds bloat without meaningful value.
|
||||
- [x] **Traversal graph export** — Export attacker movement as JSON (via CLI).
|
||||
|
||||
## Deployment & Infrastructure
|
||||
|
||||
- [ ] **SWARM / multihost mode** — Ansible-based orchestration for multi-node deployments.
|
||||
- [ ] **Terraform/Pulumi provider** — Cloud-hosted decky deployment.
|
||||
- [ ] **Kubernetes deployment mode** — Run deckies as K8s pods.
|
||||
- [x] **SWARM / multihost mode** — Ansible-based orchestration for multi-node deployments. -> Not Ansible based, but bundle based via the UI.
|
||||
- [~] **Terraform/Pulumi provider** — Cloud-hosted decky deployment. -> Deferred to post-v1 release.
|
||||
- [~] **Kubernetes deployment mode** — Run deckies as K8s pods. -> Deferred to post-v1 release.
|
||||
- [x] **Lifecycle Management** — Automatic API process termination on `teardown`.
|
||||
- [x] **Health monitoring** — Active vs. Deployed decky tracking in the dashboard.
|
||||
|
||||
## Services & Realism
|
||||
|
||||
- [ ] **HTTPS/TLS support** — Honeypots with SSL certificates.
|
||||
- [ ] **Fake Active Directory** — Convincing AD/LDAP emulation.
|
||||
- [ ] **Realistic web apps** — Fake WordPress, Grafana, and phpMyAdmin templates.
|
||||
- [ ] **OT/ICS profiles** — Expanded Modbus, DNP3, and BACnet support.
|
||||
- [x] **HTTPS/TLS support** — Honeypots with SSL certificates.
|
||||
- [~] **Fake Active Directory** — Convincing AD/LDAP emulation. -> Deferred to post-v1 release.
|
||||
- [~] **Realistic web apps** — Fake WordPress, Grafana, and phpMyAdmin templates. -> Deferred to post-v1 release.
|
||||
- [~] **OT/ICS profiles** — Expanded Modbus, DNP3, and BACnet support. -> Deferred to post-v1 release. Some profiles exist, but they are not comprehensive.
|
||||
|
||||
## Attacker Intelligence Collection
|
||||
*Goal: Build the richest possible attacker profile from passive observation across all 26 services.*
|
||||
|
||||
- `decnet/vectorstore/` substrate is scaffolded and `sqlite-vec` is wired (factory + base + impl). No producers/consumers yet — reserved for the future statistical re-identification engine.
|
||||
|
||||
### TLS/SSL Fingerprinting (via sniffer container)
|
||||
- [x] **JA3/JA3S** — TLS ClientHello/ServerHello fingerprint hashes
|
||||
- [x] **JA4+ family** — JA4, JA4S, JA4H, JA4L (latency/geo estimation via RTT)
|
||||
- [x] **JARM** — Active server fingerprint; identifies C2 framework from TLS server behavior
|
||||
- [~] **CYU** — Citrix-specific TLS fingerprint: WILL NOT implement pre-v1. Don't have that kind of data.
|
||||
- [x] **TLS session resumption behavior** — Identifies tooling by how it handles session tickets
|
||||
- [x] **Certificate details** — CN, SANs, issuer, validity period, self-signed flag (attacker-run servers)
|
||||
|
||||
### Timing & Behavioral
|
||||
- [x] **Inter-packet arrival times** — OS TCP stack fingerprint + beaconing interval detection
|
||||
- [x] **TTL values** — Rough OS / hop-distance inference
|
||||
- [x] **TCP window size & scaling** — p0f-style OS fingerprinting
|
||||
- [x] **Retransmission patterns** — Identify lossy paths / throttled connections
|
||||
- [x] **Beacon jitter variance** — Attribute tooling: Cobalt Strike vs. Sliver vs. Havoc have distinct profiles
|
||||
- [x] **C2 check-in cadence** — Detect beaconing vs. interactive sessions
|
||||
- [x] **Data exfil timing** — Behavioral sequencing relative to recon phase
|
||||
|
||||
### Protocol Fingerprinting
|
||||
- [x] **TCP/IP stack** — ISN patterns, DF bit, ToS/DSCP, IP ID sequence (random/incremental/zero)
|
||||
- [x] **HASSH / HASSHServer** — SSH KEX algo, cipher, MAC order → tool fingerprint
|
||||
- [x] **HTTP/2 fingerprint** — GREASE values, settings frame order, header pseudo-field ordering
|
||||
- [ ] **QUIC fingerprint** — Connection ID length, transport parameters order
|
||||
- [ ] **DNS behavior** — Query patterns, recursion flags, EDNS0 options, resolver fingerprint
|
||||
- [x] **HTTP header ordering** — Tool-specific capitalization and ordering quirks
|
||||
|
||||
### Network Topology Leakage
|
||||
- [x] **X-Forwarded-For mismatches** — Detect VPN/proxy slip vs. actual source IP
|
||||
- [ ] **ICMP error messages** — Internal IP leakage from misconfigured attacker infra
|
||||
- [ ] **IPv6 link-local leakage** — IPv6 addrs leaked even over IPv4 VPN (common opsec fail)
|
||||
- [ ] **mDNS/LLMNR leakage** — Attacker hostname/device info from misconfigured systems
|
||||
|
||||
### Geolocation & Infrastructure
|
||||
- [x] **ASN lookup** — Source IP autonomous system number and org name
|
||||
- [ ] **BGP prefix / RPKI validity** — Route origin legitimacy
|
||||
- [x] **PTR records** — rDNS for attacker IPs (catches infra with forgotten reverse DNS)
|
||||
- [ ] **Latency triangulation** — JA4L RTT estimates for rough geolocation
|
||||
|
||||
### Service-Level Behavioral Profiling
|
||||
- [x] **Commands executed** — Full command log per session (SSH, Telnet, FTP, Redis, DB services)
|
||||
- [x] **Services actively interacted with** — Distinguish port scans from live exploitation attempts
|
||||
- [x] **Tooling attribution** — Byte-sequence signatures from known C2 frameworks in handshakes
|
||||
- [x] **Credential reuse patterns** — Same username/password tried across multiple deckies/services
|
||||
- [x] **Payload signatures** — Hash and classify uploaded files, shellcode, exploit payloads
|
||||
|
||||
---
|
||||
|
||||
## Developer Experience
|
||||
|
||||
- [x] **API Fuzzing** — Property-based testing for all web endpoints.
|
||||
- [x] **CI/CD pipeline** — Automated testing and linting via Gitea Actions.
|
||||
- [x] **Strict Typing** — Project-wide enforcement of PEP 484 type hints.
|
||||
- [ ] **Plugin SDK docs** — Documentation for adding custom services.
|
||||
- [x] **Plugin SDK docs** — Documentation for adding custom services.
|
||||
- [ ] **Config generator wizard** — `decnet wizard` for interactive setup.
|
||||
|
||||
## API Improvements
|
||||
|
||||
- [x] Enable up to 250 concurrent users with close to zero performance degradation.
|
||||
- [x] Enable up to 100 requests per second with close to zero performance degradation.
|
||||
|
||||
## MazeNET
|
||||
|
||||
- [x] Initial MazeNET implementation via DAG recursive graphs.
|
||||
- [x] Usable UI.
|
||||
- [x] Random, seed-based network topologies.
|
||||
- [x] Manual topology creation via war map.
|
||||
- [x] UI based topology teardowns.
|
||||
- [x] SWARM-based topology deployment.
|
||||
- [x] UI based SWARM topology deployments.
|
||||
|
||||
600
development/DEVELOPMENT_V2.md
Normal file
600
development/DEVELOPMENT_V2.md
Normal file
@@ -0,0 +1,600 @@
|
||||
# DECNET Development Roadmap — V2
|
||||
|
||||
Post-v1 direction. Everything here is *after* the v1 box is closed; this
|
||||
document exists to make sure the schema and architectural decisions we take
|
||||
*before* v1 ships don't box us out of the interesting post-v1 work.
|
||||
|
||||
---
|
||||
|
||||
## Keystroke Dynamics & Session Profiling
|
||||
|
||||
**Goal:** graduate the Profiler from IP-keyed attribution to
|
||||
identity-independent correlation using structured per-session feature
|
||||
vectors. Attackers rotate IPs; they don't rotate their hands.
|
||||
|
||||
The sessrec pipeline (v1) already lands every keystroke as a `ch:"i"` event
|
||||
with a `t` timestamp in the asciinema day-shard. The raw data is sitting
|
||||
on disk. The work is *not* collection — it's feature extraction, schema,
|
||||
and correlation primitives.
|
||||
|
||||
### Features — cheap, post-processing over existing shards
|
||||
|
||||
All of these are derived from a single pass over a session's `"i"` events.
|
||||
No new capture infra.
|
||||
|
||||
- **Inter-keystroke interval (IKI) distribution**
|
||||
`kd_iki_mean`, `kd_iki_stdev`, `kd_iki_p50`, `kd_iki_p95`.
|
||||
Humans: 80–250ms, high variance. `sshpass`/`paramiko`/`expect`: <5ms,
|
||||
near-zero variance. Paste attacks: bimodal (one huge gap, then a burst).
|
||||
- **Burst ratio**
|
||||
`kd_burst_ratio` = fraction of keystrokes within <30ms of the previous
|
||||
one. High = pasted commands, low = typed. One number; cleanly separates
|
||||
operator-at-keyboard from automation.
|
||||
- **Control-character mix** (not just backspace — the whole family)
|
||||
`kd_ctrl_backspace`, `kd_ctrl_wkill` (`\x17`), `kd_ctrl_ukill` (`\x15`),
|
||||
`kd_ctrl_abort` (`\x03`), `kd_ctrl_eof` (`\x04`), `kd_arrow_rate`
|
||||
(`\x1b[A/B/C/D`), `kd_tab_rate` (`\x09`).
|
||||
*Presence of any control char* → bot/human split. *Mix* →
|
||||
tooling/experience fingerprint. Heavy Ctrl-W = experienced Unix user.
|
||||
Heavy arrows = history editing. Heavy tab = exploratory recon. Bots
|
||||
emit `\r`-terminated literals and nothing else.
|
||||
- **Prompt-to-enter latency distribution**
|
||||
`kd_enter_latency_p50`, `kd_enter_latency_p95`, and crucially the
|
||||
**ratio p95/p50** as a cheap tail-heaviness indicator. Shape matters
|
||||
more than median. Readers have long right-tails; memorized playbooks
|
||||
have tight distributions; bots have cliff-edge distributions at whatever
|
||||
`sleep` is hardcoded. p50 alone blurs these together.
|
||||
- **Typing-to-think ratio**
|
||||
`kd_think_ratio` = idle gap (>2s before Enter) / total session time.
|
||||
Recon/read behavior vs. memorized execution.
|
||||
- **Digraph rhythm fingerprint** — `kd_digraph_simhash`, 64-bit.
|
||||
**Use SimHash (or MinHash) over quantile-bucketed digraph timings**,
|
||||
not a regular hash. Hamming-distance comparable — similar rhythms get
|
||||
similar hashes, which is the entire point. A plain hash of quantized
|
||||
timings loses this: one digraph off = totally different hash. SimHash
|
||||
is ~30 lines. This is the feature that graduates "fingerprint" into
|
||||
"identity."
|
||||
|
||||
### Schema — the single most important decision on this page
|
||||
|
||||
The features above *must* live in a dedicated `session_profile` table,
|
||||
UUID-keyed, foreign key to the owning `session_recorded` Log row.
|
||||
**Not** in `meta_json_b64`. **Not** as ad-hoc bounty strings.
|
||||
|
||||
Rationale:
|
||||
- Correlation wants `find_similar_sessions(sid, ε)` — that's a SQL query
|
||||
over indexed float columns, not a 50k-row JSON parse.
|
||||
- Retrofitting is brutal. Decide the shape now, when the table is empty.
|
||||
- Federation (see below) needs these as structured columns to be
|
||||
gossipable without per-operator parsing quirks.
|
||||
|
||||
Sketch:
|
||||
|
||||
```sql
|
||||
CREATE TABLE session_profile (
|
||||
sid TEXT PRIMARY KEY, -- session UUID
|
||||
log_id INTEGER REFERENCES logs(id), -- owning session_recorded
|
||||
schema_version INTEGER NOT NULL, -- evolve features without breaking gossip
|
||||
-- timing moments
|
||||
kd_iki_mean REAL,
|
||||
kd_iki_stdev REAL,
|
||||
kd_iki_p50 REAL,
|
||||
kd_iki_p95 REAL,
|
||||
kd_enter_latency_p50 REAL,
|
||||
kd_enter_latency_p95 REAL,
|
||||
-- ratios
|
||||
kd_burst_ratio REAL,
|
||||
kd_think_ratio REAL,
|
||||
-- control-char rates
|
||||
kd_ctrl_backspace REAL,
|
||||
kd_ctrl_wkill REAL,
|
||||
kd_ctrl_ukill REAL,
|
||||
kd_ctrl_abort REAL,
|
||||
kd_ctrl_eof REAL,
|
||||
kd_arrow_rate REAL,
|
||||
kd_tab_rate REAL,
|
||||
-- rhythm fingerprint
|
||||
kd_digraph_simhash BLOB, -- 8 bytes, Hamming-comparable
|
||||
-- derived
|
||||
total_keystrokes INTEGER,
|
||||
session_duration_s REAL,
|
||||
created_at TIMESTAMP
|
||||
);
|
||||
CREATE INDEX ix_session_profile_simhash ON session_profile(kd_digraph_simhash);
|
||||
```
|
||||
|
||||
`schema_version` is non-negotiable from day one. Federation gossip in v2
|
||||
requires cross-operator compatibility; bumping feature definitions without
|
||||
a version field will silently poison other operators' clustering.
|
||||
|
||||
### Sequencing — build the shell before the features
|
||||
|
||||
The natural instinct is: features first, then correlation. **Invert it.**
|
||||
|
||||
1. **`session_profile` table + empty write path** — one row per session, all
|
||||
nulls. Ships immediately.
|
||||
2. **Correlator `find_similar_sessions(sid, ε)` primitive — stubbed.**
|
||||
Returns empty. Wire the API, wire the UI surface in `SessionDrawer`
|
||||
("Similar Sessions: none yet").
|
||||
3. **First features** — the five cheapest (IKI moments, burst ratio,
|
||||
control-char mix). Populate the table.
|
||||
4. **Similarity function goes live** — Euclidean distance over normalized
|
||||
float features, Hamming distance over simhash. No ML needed.
|
||||
5. **Digraph simhash** — once cheap features are validated as useful.
|
||||
6. **Correlation graph integration** — `CorrelationEngine` learns to
|
||||
follow profile-similarity edges, not just IP edges.
|
||||
|
||||
**Why inverted:** once operators see a session profile with no "similar
|
||||
sessions" surface, they'll ask for it, and the UX (what's shown, how
|
||||
distance is rendered, what actions the link affords) will drive which
|
||||
features matter. Build the shell, let demand signal feature priority.
|
||||
|
||||
### Correlation — what this enables
|
||||
|
||||
Today, `CorrelationEngine` keys on `attacker_ip`. Session profiles let it
|
||||
graduate to **identity-independent correlation**.
|
||||
|
||||
Concrete scenario:
|
||||
> Attacker hits operator A's maze from IP X. Three weeks later, hits
|
||||
> operator B's maze from IP Y. IPs don't match. But:
|
||||
> - `kd_digraph_simhash` Hamming distance: 3
|
||||
> - HASSH fingerprint: identical
|
||||
> - JARM: identical
|
||||
> - Command-sequence 3-gram overlap: 60%
|
||||
>
|
||||
> That's a cross-operator identity claim with receipts. SQL query, not
|
||||
> research project.
|
||||
|
||||
Without structured session profiles, that analysis is literally impossible.
|
||||
With them, it's a join.
|
||||
|
||||
### Federation implication (v2/v3)
|
||||
|
||||
Session profile vectors are **exactly** the thing to gossip in the
|
||||
federation layer. They are:
|
||||
- **Small** — a few floats + an 8-byte hash. Cheap on the wire.
|
||||
- **Semantically meaningful** — encode identity without encoding
|
||||
operator-specific infrastructure or PII.
|
||||
- **Collision-rich** — similar vectors across operators = shared adversary,
|
||||
same pattern as the fingerprint-tuple idea, but richer and noisier-signal.
|
||||
|
||||
The `session_profile` schema is effectively the v2 federation wire format.
|
||||
Design it that way from day one:
|
||||
- `schema_version` field (mentioned above).
|
||||
- No operator-identifying fields (decky name, internal IP, host labels).
|
||||
- SimHash specifically because Hamming distance works across operators
|
||||
without needing shared training data.
|
||||
|
||||
### Cost estimate
|
||||
|
||||
- Five cheap features + table + stubbed `find_similar_sessions`:
|
||||
**½ to 1 day** of implementation once the codebase is known.
|
||||
- Digraph simhash + live similarity: **another 1–2 days**.
|
||||
- Correlation engine integration: **depends on how deep the graph walk
|
||||
goes** — 2–5 days for a first pass.
|
||||
|
||||
The expensive part is not implementation. It's **deciding the schema well
|
||||
enough that we don't regret it in six months.** Hence this document.
|
||||
|
||||
### What *not* to build
|
||||
|
||||
- **Typing biometric login.** That's the research-paper framing. Wrong
|
||||
frame for a honeypot. We're doing *tooling attribution* and *operator
|
||||
clustering*, not authentication.
|
||||
- **Hold time / pressure / velocity.** Not on the SSH wire. Dead-end
|
||||
without attacker-side instrumentation they will not run.
|
||||
- **ML clustering before similarity.** Euclidean + Hamming over normalized
|
||||
features handles the first useful year of data. Don't reach for sklearn
|
||||
until the simple thing demonstrably fails.
|
||||
|
||||
---
|
||||
|
||||
## Open questions to resolve before writing code
|
||||
|
||||
1. **Normalization strategy for Euclidean distance** — z-score per-feature
|
||||
over rolling window? Fixed population stats? Operator-local vs.
|
||||
gossip-aligned?
|
||||
2. **ε tuning** — start empirically. Seed the UI with "show top-N nearest"
|
||||
rather than a distance threshold. Learn ε from operator feedback.
|
||||
3. **Retention** — session profiles are small; keep indefinitely? Or
|
||||
co-expire with the owning log row?
|
||||
4. **Privacy boundary on gossip** — do we hash the sid on the wire, or
|
||||
exchange it plaintext? First pass: hashed, with a challenge-response
|
||||
if two operators want to confirm same-session.
|
||||
|
||||
---
|
||||
|
||||
## Federation
|
||||
|
||||
**Goal:** cross-operator threat-intel sharing. An operator in country A
|
||||
observes an attacker, and an operator in country B benefits — without
|
||||
either operator leaking internal infrastructure, attracting legal
|
||||
exposure, or becoming part of the other's attack surface.
|
||||
|
||||
### Framing — federation, not P2P
|
||||
|
||||
"Federation API + P2P" is two contradictory models. Pick **federation
|
||||
(Mastodon/ActivityPub shape), not P2P.** Reasons:
|
||||
|
||||
- Operators already run persistent, addressable infrastructure. There is
|
||||
a DECNET master host with a stable identity. That's a server, not a
|
||||
transient peer. The hard problem libp2p/Nostr exist to solve is already
|
||||
solved here.
|
||||
- Threat-intel sharing is fundamentally **many-to-many gossip with audit
|
||||
trails**, not many-to-many streaming. Federated server-to-server gossip
|
||||
maps naturally; DHT/P2P overhead buys nothing.
|
||||
- SWARM already ships mTLS + per-host cert fingerprint pinning. Promoting
|
||||
that to cross-operator is a small, understood step. Bolting on libp2p
|
||||
is a ground-up rewrite.
|
||||
|
||||
### Scale — design for thousands, not millions
|
||||
|
||||
Realistic ceiling for a security-operator federation is **low thousands**.
|
||||
Points of reference: Mastodon ~10k servers, Tor ~7k relays, Nostr ~2k
|
||||
active relays. A niche-of-a-niche like threat-intel federation will not
|
||||
exceed these.
|
||||
|
||||
**Design explicitly for 1k operators, with an escape hatch at 10k.**
|
||||
Million-scale assumptions force Kafka/DHT/consensus theater that
|
||||
strangles actual work.
|
||||
|
||||
### The hard problem is trust, not protocol
|
||||
|
||||
Every threat-intel federation that ignored trust became a spam cesspool
|
||||
(early AlienVault OTX, half the ISAC world). Answers required:
|
||||
|
||||
- **Sybil resistance** — what stops an adversary spinning 50 fake
|
||||
operators to poison clustering? First-pass answer: **gated enrollment
|
||||
via a central registry signed by the project root**. Yes, centralized.
|
||||
"Centralized root, federated leaves" is Mastodon's model and it works.
|
||||
Decentralize only if adoption forces it. Don't premature-decentralize.
|
||||
- **Adversarial join** — what stops an attacker running a decoy operator
|
||||
specifically to map *what other operators observe*? This is the
|
||||
terrifying one. Gossip must be **asymmetric by design**: publish
|
||||
simhashes and other lossy fingerprints, not raw session data. Answer
|
||||
queries with binary matches (yes/no + count + first-seen), not full
|
||||
session payloads. The attacker-operator learns "this simhash is
|
||||
known to someone," nothing more.
|
||||
- **Jurisdictional blast radius** — IP addresses are PII under GDPR. An
|
||||
operator in Germany gossiping an attacker IP to an operator in
|
||||
Singapore may commit a crime. **Per-operator, per-field opt-out with a
|
||||
default-deny posture for PII-adjacent data** is non-negotiable.
|
||||
Geo-tagged operator registry entries let the federation enforce this at
|
||||
the protocol layer rather than the honor system.
|
||||
- **Legal chill** — CFAA, NIS2, sector-specific rules. Having a clear
|
||||
"this operator chose to share X" audit trail per record protects
|
||||
everyone. Every gossiped fact carries the originating operator's
|
||||
signature.
|
||||
|
||||
### What to build first — the two-operator handshake
|
||||
|
||||
Build **one primitive and nothing else**: two operators who've manually
|
||||
exchanged pubkeys making signed queries to each other to answer one
|
||||
question — **"have you seen this SimHash?"**
|
||||
|
||||
Response: `{ seen: bool, count: int, first_seen: timestamp }`. Nothing
|
||||
more. No sid, no decky, no IP, no raw session data.
|
||||
|
||||
Why: if that primitive doesn't produce value for two operators, scaling
|
||||
it to a thousand won't either. If it does, the scaling is mostly
|
||||
operational — directory service, retry/backoff, rate limits — which are
|
||||
all solved problems. **The design risk lives entirely in the primitive,
|
||||
not in the scale-out.**
|
||||
|
||||
Explicit non-goals for first iteration:
|
||||
- No pub-sub.
|
||||
- No DHT.
|
||||
- No gossip protocol.
|
||||
- No operator discovery.
|
||||
- No multi-hop.
|
||||
|
||||
Just two pubkeys, one question, a signed answer.
|
||||
|
||||
### Sequencing
|
||||
|
||||
1. **Operator identity** — Ed25519 keypair per operator, generated at
|
||||
install. Self-signed manifest (operator name, pubkey, contact, geo).
|
||||
2. **Two-operator handshake** — mTLS over HTTPS, pubkey pinning, one
|
||||
RPC: `QuerySimHash(hash) → {seen, count, first_seen}`. Manual peer
|
||||
config in YAML.
|
||||
3. **Registry** — central signed directory of known operators, fetched
|
||||
on boot. Enables discovery without mandating central routing.
|
||||
4. **Additional query types** — JA3/JA4 lookup, HASSH lookup, command-
|
||||
n-gram match. Same shape: lossy fingerprint in, binary+metadata out.
|
||||
5. **Publish path** — operators periodically push new fingerprints to
|
||||
peers (gossiped, not polled). Signed, deduplicated by fingerprint.
|
||||
6. **Clustering & visualization** — UI surface for "this simhash is
|
||||
known across N operators, first seen by operator-X on date-Y."
|
||||
|
||||
### Codebase-aware observations
|
||||
|
||||
- **`session_profile` *is* the federation wire format.** `schema_version`
|
||||
from day one is non-negotiable — retrofitting cross-operator
|
||||
compatibility after the fact is a nightmare.
|
||||
- **SWARM mTLS is the starting point**, not the finishing point. The
|
||||
per-host fingerprint-pin pattern (memory:
|
||||
feedback_mtls_pin_per_host.md) extends naturally to per-operator pins.
|
||||
- **The bus stays local.** Federation is cross-host in a way the bus was
|
||||
explicitly scoped away from ("cross-host federation is out of MVP
|
||||
scope"). A separate `decnet federation` worker is the right shape, not
|
||||
bridging the bus over TCP.
|
||||
- **Attack surface.** Federation endpoints on operator hosts *are*
|
||||
targets. If the coordination layer is compromised, honeypots become
|
||||
attack infra. Bind federation RPC to a separate interface, separate
|
||||
cert chain, separate systemd unit. Assume the federation daemon will
|
||||
eventually be breached and design blast-radius containment into the
|
||||
architecture — it must not share credentials, sockets, or filesystem
|
||||
trust with the local DECNET workers.
|
||||
|
||||
### Open questions
|
||||
|
||||
1. **Who runs the root registry?** Project root (ANTI) as v2 default;
|
||||
path to handoff/multi-root federation in v3.
|
||||
2. **Revocation** — how is a compromised operator kicked? Registry
|
||||
signs a revocation list, peers refuse queries from revoked pubkeys.
|
||||
Cache TTL?
|
||||
3. **Rate-limiting adversarial joins** — a registered operator can still
|
||||
query-flood to enumerate fingerprints. Per-peer query budgets, with
|
||||
a reputation signal that decays silence and rewards useful
|
||||
publishing.
|
||||
4. **Consent UX** — what does an operator opt into when they enable
|
||||
federation? Single toggle is wrong; per-category (fingerprints /
|
||||
profiles / commands / IPs) is right. Defaults matter more than
|
||||
flexibility.
|
||||
|
||||
### Trust model refinement — 2026-04-22 design review
|
||||
|
||||
The framing above (central signed registry, gated enrollment, revocation
|
||||
lists, reputation algorithms) is **superseded by a social-trust model**
|
||||
arrived at through adversarial design review. Captured here verbatim so
|
||||
the iteration trail isn't lost.
|
||||
|
||||
**The governing insight:** trust is not technical, it is human. Instead
|
||||
of solving cross-operator trust with crypto/PKI/reputation, **leave it
|
||||
to humans**. Two operators meet at a conference, have beers, decide to
|
||||
federate. Recurse ad infinitum. No zero-knowledge proofs, no
|
||||
decentralized governance, no CRL theater.
|
||||
|
||||
This is a deliberate deferral of a hard problem, not a claim that the
|
||||
hard problem is solved. The rest of this subsection documents why the
|
||||
social-trust model holds up under attack and where its residual weaknesses
|
||||
live.
|
||||
|
||||
#### Attacks considered and outcomes
|
||||
|
||||
**1. Transitive trust collapse.** First framing ("recurse ad infinitum")
|
||||
implied A→B→C gossip flow, which is how PGP's web of trust died.
|
||||
**Resolution:** model is hub-and-spoke, not transitive. Every federation
|
||||
edge is a manual, mutually-made handshake ("beershake"). A learns that C
|
||||
exists (because B mentioned C), but A does not federate with C until
|
||||
A and C separately beershake. Topology metadata leaks (B tells A that
|
||||
C exists, which C may not have consented to share), but gossip does not.
|
||||
|
||||
**2. Attackers go to conferences too.** Social trust filters for
|
||||
"drinks beer at BSides," not "not-an-adversary." Ransomware affiliates
|
||||
and red teams can stand up DECNET, be charming, and join. **Accepted.**
|
||||
Social consequences scale better than cryptographic ones for this class
|
||||
of problem: if operator A's sponsored peer B starts gossiping garbage,
|
||||
A's other federates see that A brought B in — reputation damage is the
|
||||
brake. Not perfect, but it's a real cost.
|
||||
|
||||
**3. The query IS the intel.** Aggregate-only responses
|
||||
(`{seen, count, first_seen}`) don't defeat recon — a phishing operator
|
||||
querying "has anyone seen `paypa1-security.com`?" learns whether their
|
||||
cover domain has burned. **Resolution: federation is push-only, not
|
||||
pull.** Peers send what they chose to send; nobody can ask on demand.
|
||||
C still gets data, but not on-demand data. This closes the dangerous
|
||||
recon lane outright.
|
||||
|
||||
**4. Compromised-peer inheritance.** A friend's DECNET master is a box
|
||||
on the internet. When it gets rooted, the attacker inherits every
|
||||
federation edge that admin held. **Conceded as a real risk.** No clean
|
||||
mitigation beyond the push-only constraint (limits what the compromised
|
||||
node can exfiltrate in real-time) and the hub-and-spoke constraint
|
||||
(limits blast radius to that operator's direct peers).
|
||||
|
||||
**5. Revocation non-transitivity.** If trust is social, so is distrust.
|
||||
A kicks B; Carol (who also federates with B) still relays to B.
|
||||
**Resolution: see #2 — A's kick is visible to A's other federates,
|
||||
sponsorship accountability propagates socially in real-time via the
|
||||
topology-transparency mechanism (see below). Not a coordination
|
||||
problem DECNET solves; one it exposes so humans can solve it.**
|
||||
|
||||
**6. Legal/compliance at enterprise scale.** GDPR, HIPAA, FFIEC,
|
||||
data-residency — informal federation has no DPA and will not survive
|
||||
first enterprise deal. **Resolution: write down the deferral.** v1
|
||||
federation is explicitly for informal peer networks only. A DPA
|
||||
framework gates any regulated-org federation; that is v3 scope.
|
||||
|
||||
#### The full model
|
||||
|
||||
- **Hub-and-spoke, pairwise beershakes.** No transitive trust.
|
||||
- **Push-only, never pull.** Peers push what they choose; no on-demand
|
||||
queries, no recon surface.
|
||||
- **Sponsorship-as-reputation.** A brought B in; if B misbehaves, A's
|
||||
reputation across A's other federates degrades. Social cost, real-time.
|
||||
- **Hash-evidence on every contribution.** To prevent fabricated pushes
|
||||
that game contribution ratios, every shared fact must include a
|
||||
verifiable fingerprint (message sha256, cert fingerprint, artifact
|
||||
sha256) — not a free-text claim. "I saw domain X" without an artifact
|
||||
hash is not a contribution.
|
||||
- **Contribution ratios, enforced per peer.** Pure consumers get starved;
|
||||
peers must push roughly as much as they receive. Paired with
|
||||
hash-evidence above so ratios can't be gamed with garbage.
|
||||
- **Topology transparency.** Every federate can see the full federation
|
||||
graph from their vantage point: who sponsored whom, who kicked whom,
|
||||
contribution volumes. Makes sponsorship accountability observable in
|
||||
real-time rather than post-incident.
|
||||
- **Omission-based canary watermarking.** Individualizing "saw domain X"
|
||||
across N peers is impossible (you can't watermark a string). Instead,
|
||||
A withholds X from peer 23 specifically; if X surfaces externally, A
|
||||
can triangulate across multiple omission canaries over time. Forensic
|
||||
tool, not preventive.
|
||||
|
||||
#### Accepted residuals
|
||||
|
||||
These are structural to gossip systems and are **accepted with
|
||||
mitigation, not eliminated:**
|
||||
|
||||
- **Audit gap.** Misbehaving federates leak silently — queries (or in
|
||||
push-only, consumption) are supposed to happen. By the time a peer
|
||||
notices the leak, the data has already moved. Mitigation: omission
|
||||
canaries provide post-hoc forensic attribution; sponsorship
|
||||
accountability provides the social pressure to catch it faster.
|
||||
- **Correlation-at-receiver.** C receives push from A, B, D, E. None
|
||||
shared much individually; C correlates across them to build a picture
|
||||
no sender authorized. Cannot be designed out without killing the
|
||||
federation's entire value proposition. Priced in, documented.
|
||||
- **Push cadence as metadata.** Even push-only, timing/volume of what A
|
||||
pushes tells receivers about A's current coverage/posture. Low
|
||||
bandwidth, probably unfixable without batching jitter that hurts
|
||||
timeliness. Accepted.
|
||||
- **Topology metadata leak.** B telling A that C exists (as part of the
|
||||
"recurse ad infinitum" socialization) is itself signal C may not have
|
||||
consented to share. In regulated sectors, even "bank X runs deception"
|
||||
is information. Minor, but noted.
|
||||
|
||||
#### Why the social-trust framing is correct *now*
|
||||
|
||||
The earlier subsection (central registry, gated enrollment, Ed25519
|
||||
per-operator identities, signed revocation lists) is not wrong, it is
|
||||
**premature**. Building that machinery before there is a real
|
||||
federation with real users is the "million-scale assumptions that
|
||||
strangle actual work" trap called out in the Scale section above. The
|
||||
social-trust model ships when there are two friends with two
|
||||
deployments who want to try it. The crypto/registry model ships when
|
||||
there is a customer whose compliance team requires it.
|
||||
|
||||
What cannot be deferred: **the wire format**. `session_profile`,
|
||||
`smtp_targets`, and future federation-adjacent tables must still carry
|
||||
`schema_version` from day one. Privacy-preserving shape
|
||||
(`{seen, count, first_seen}` aggregate-only, no attacker identity) is
|
||||
the right posture independent of trust model — minimizing leak surface
|
||||
is always correct.
|
||||
|
||||
#### What this changes in the earlier Open Questions
|
||||
|
||||
- **#1 Root registry** — no longer v2-blocking. Deferred to v3 or
|
||||
whenever a federation outgrows social coordination.
|
||||
- **#2 Revocation** — answered. "A kicks B; A's other federates see it
|
||||
in the topology-transparency view and make their own call." No CRL.
|
||||
- **#3 Rate-limiting adversarial joins** — partially answered. Push-only
|
||||
eliminates the query-flood vector. Per-peer rate limits on push still
|
||||
apply to prevent contribution-ratio gaming via spam.
|
||||
- **#4 Consent UX** — unchanged. Per-category opt-in with default-deny
|
||||
on PII-adjacent data is still the right shape.
|
||||
|
||||
#### Second round — scope-verified pull as a complementary channel
|
||||
|
||||
Follow-up design review revisited the "query IS the intel" problem from
|
||||
a different angle. Push-only closes the recon attack but sacrifices the
|
||||
defender's most useful query shape: "has anyone seen anything new about
|
||||
MY brand today?"
|
||||
|
||||
**Proposal:** operators verify domain scope at registration time (ACME
|
||||
dns-01 pattern — TXT record challenge), and pull queries are restricted
|
||||
to data about scope-verified domains. BigBank can query about
|
||||
`bigbank.com`; they cannot query about `competitor.com`.
|
||||
|
||||
**This is a genuine addition, not a replacement for push-only.** Both
|
||||
channels coexist with different threat models:
|
||||
|
||||
- **Push-only channel** — peer-volunteered gossip. Handles the case
|
||||
where the domain being attacked is one the defender does NOT own
|
||||
(lookalikes, typosquats, newly-registered phishing infra). This is
|
||||
the defender's primary use case and scope-verified pull cannot serve
|
||||
it without fuzzy matching, which attackers abuse.
|
||||
- **Scope-verified pull channel** — bounded "what's new about my
|
||||
verified scope" queries. Narrow, auditable, recon-resistant.
|
||||
|
||||
**Attacks considered on the pull channel:**
|
||||
|
||||
1. **Indirect-reference / lookalike queries.** The intel defenders most
|
||||
need is about domains they DON'T own (`bigbank-secure-login.support`
|
||||
targeting BigBank). Allowing fuzzy/lookalike matching under "claimed
|
||||
typo of my scope" reopens the recon lane. **Resolution: exact-match
|
||||
only on the pull channel. Lookalike intel flows through push-only.**
|
||||
2. **Domain graveyard.** Attacker buys an expired domain, DNS-verifies,
|
||||
pulls historical phishing intel for a brand they're about to revive.
|
||||
**Mitigation: scope applies prospectively only — queries bounded to
|
||||
intel indexed since the operator's verification timestamp.** Bake in
|
||||
from day one, hard to retrofit.
|
||||
3. **Subdomain scope inference.** Wildcard matching (`*.bigbank.com`)
|
||||
invites overreach. **Resolution: explicit list of scoped domains,
|
||||
each individually DNS-verified. No wildcard inference.**
|
||||
4. **Self-lookup leaks coverage maps to the asker.** BigBank querying
|
||||
their scope learns which peers have visibility into BigBank-targeting
|
||||
campaigns. **Resolution: aggregate-only response
|
||||
(`{seen, count, first_seen}`) with no per-peer attribution.** Already
|
||||
implicit.
|
||||
5. **MSSP multi-tenant churn.** An MSSP claims scope over 200 client
|
||||
brands; clients leave, the DECNET retains ex-scope.
|
||||
**Mitigation: periodic re-verification (weekly cadence) of every
|
||||
scoped domain's TXT record.**
|
||||
|
||||
**Residual, accepted:** scope-verified pull cannot serve queries about
|
||||
domains the defender doesn't control. That's the structural limit —
|
||||
push-only covers it.
|
||||
|
||||
**Net model for v2 federation:**
|
||||
- Identity: Ed25519 keypair + DNS-verified scope list (explicit, not
|
||||
wildcard, periodic re-verify).
|
||||
- Channel 1 — push: hash-evidenced contributions, peer-volunteered, no
|
||||
query surface.
|
||||
- Channel 2 — pull: scope-verified, exact-match, prospective-only,
|
||||
aggregate-response, rate-limited.
|
||||
|
||||
---
|
||||
|
||||
## Campaign Clustering — DSL Evolution
|
||||
|
||||
The DSL currently models campaigns as linear phase sequences with clear actor assignments. Real campaigns are messier — phases overlap, actors share responsibilities, tool signatures drift over time. The fixtures don't test for overlapping phases or ambiguous actor assignments. That's probably fine for v1 — the six fixtures cover the known failure modes — but the replay tier will reveal whether you need to add fixtures for phase overlap or role ambiguity. The DSL has a natural extension path: concurrent phases, multi-actor per phase, probabilistic phase ordering. You don't need it now, but the design doesn't block it.
|
||||
|
||||
---
|
||||
|
||||
## Threat Intel Enrichment — Provider Backlog
|
||||
|
||||
Long list of candidate sources for `decnet/intel/`. Open / free-tier
|
||||
prioritized; Shodan is the explicit paid exception. v1 ships three
|
||||
(GreyNoise Community, AbuseIPDB, abuse.ch); the rest are post-v1 fodder
|
||||
slotted in as demand surfaces.
|
||||
|
||||
### Reputation / abuse reports
|
||||
- AbuseIPDB — community abuse scores, free 1k/day **[v1]**
|
||||
- CrowdSec CTI — community blocklist API, free
|
||||
- Spamhaus DROP/EDROP — hijacked netblocks, free
|
||||
- CINS Score (Sentinel IPS) — reputation feed, free
|
||||
- FireHOL IP lists — aggregated reputation (GitHub), free
|
||||
- Project Honey Pot HTTP:BL — DNSBL for HTTP attackers, free
|
||||
- Emerging Threats open — free blocklist
|
||||
|
||||
### Scanner / noise classification
|
||||
- GreyNoise Community API — purpose-built for honeypot noise filtering, free **[v1]**
|
||||
- DShield / SANS ISC — scanned-IP feeds, free
|
||||
- Tor Project exit-node list — free, no key
|
||||
|
||||
### Active C2 / malware attribution
|
||||
- abuse.ch Feodo Tracker — botnet C2 IPs, free, no key **[v1]**
|
||||
- abuse.ch ThreatFox — IOCs from malware analysis, free **[v1]**
|
||||
- abuse.ch URLhaus — malicious URLs, free
|
||||
- abuse.ch SSLBL — malicious TLS certs, free
|
||||
- abuse.ch MalwareBazaar — payload hashes (pairs with payload capture)
|
||||
- AlienVault OTX — pulse-based IOCs, free with key
|
||||
|
||||
### Host scan / infrastructure
|
||||
- Shodan — paid, cheap tiers (approved exception)
|
||||
- Censys — free tier, host scan data
|
||||
- BinaryEdge — ~250/mo free
|
||||
- CIRCL passive DNS / passive SSL — free for researchers
|
||||
- VirusTotal — 4 lookups/min free
|
||||
|
||||
### Network ownership / geo
|
||||
- Team Cymru IP-to-ASN whois — free DNS-based, no key
|
||||
- IPinfo — free tier, ASN/company
|
||||
- MaxMind GeoLite2 — already in use (GeoIP mapping)
|
||||
|
||||
### Misc
|
||||
- Cloudflare Radar — aggregate intel, free
|
||||
- Pulsedive — IOC enrichment, free tier
|
||||
- MISP communities — federated OSINT
|
||||
|
||||
338
development/IDENTITY_RESOLUTION.md
Normal file
338
development/IDENTITY_RESOLUTION.md
Normal file
@@ -0,0 +1,338 @@
|
||||
# Identity Resolution — Design
|
||||
|
||||
**Status:** pre-implementation. This doc is the spec; code follows.
|
||||
|
||||
**Roadmap pressure:** Campaign Clustering (`CAMPAIGN_CLUSTERING.md`),
|
||||
Keystroke Dynamics (`DEVELOPMENT_V2.md` §1), Federation
|
||||
(`DEVELOPMENT_V2.md` §3).
|
||||
|
||||
## Premise
|
||||
|
||||
The `attackers` table is keyed per-IP — one row every time we observe
|
||||
activity from a new source IP. That works for naive scoring, but it
|
||||
conflates two distinct concepts:
|
||||
|
||||
- **Observation event.** "We saw activity from IP X starting at T1."
|
||||
Mutable; IPs come and go; the unit of *ingestion* on the wire.
|
||||
- **Actor identity.** "These N observations are the same hands."
|
||||
Semi-stable; recovered from signals the attacker can't cheaply rotate
|
||||
(JA3, HASSH, payload hashes, C2 callbacks, eventually keystroke
|
||||
rhythm).
|
||||
|
||||
A campaign is then one-level-up: "these M identities are coordinated."
|
||||
The clean ladder is **Observation → Identity → Campaign**, three
|
||||
levels, each derived from the level below by clustering on
|
||||
increasingly meta signals.
|
||||
|
||||
We will not ship a clusterer in this PR sequence. The plan here is the
|
||||
**substrate the clusterer writes into** — schema, API, bus topics,
|
||||
frontend hooks — landed empty so downstream work targets a stable
|
||||
shape and the campaign clustering fixtures can encode honest
|
||||
multi-row-per-actor scenarios.
|
||||
|
||||
Order of work, strictly:
|
||||
|
||||
1. This design doc.
|
||||
2. Schema-only PR — `attacker_identities` table + nullable
|
||||
`attackers.identity_id` FK. Empty table, no production reads/writes.
|
||||
3. Read-only API — `/api/v1/identities/*` returning empty lists / 404.
|
||||
4. Frontend — conditional `IdentityDetail` page; `AttackerDetail`
|
||||
gains a "Identity: <link>" badge when populated.
|
||||
5. Bus topics + wiki — declare topics, document, no publishers yet.
|
||||
6. Test factory adapter — campaign factory emits N rows per
|
||||
IP-rotating actor with shared `truth_identity_id`. Unblocks
|
||||
fixture 2 (`vpn_hopping`) and beyond.
|
||||
|
||||
The clusterer itself follows after fixtures 2–6 ship, on the
|
||||
substrate this PR sequence builds.
|
||||
|
||||
---
|
||||
|
||||
## Why now, why not later
|
||||
|
||||
**Pre-v1 schema changes are nearly free.** SQLModel
|
||||
`metadata.create_all()` picks up new tables; new nullable columns are
|
||||
free; no Alembic until v1. Real production data is currently small
|
||||
and replayable.
|
||||
|
||||
**Post-v1 the cost compounds.** Real attacker rows accumulate, FKs
|
||||
proliferate, dashboard URLs get bookmarked, federation gossip locks
|
||||
in `schema_version=1` payload shapes. Every month we wait, the
|
||||
migration becomes harder.
|
||||
|
||||
**V2 keystroke dynamics needs an identity row.** `kd_digraph_simhash`
|
||||
correlation is *the* feature that graduates fingerprint into identity.
|
||||
It needs a row to attach to. Without it, the V2 work either rebuilds
|
||||
this substrate from scratch, or hangs simhash off the per-IP
|
||||
observation table — which means an IP-rotating actor's typing rhythm
|
||||
gets fragmented across every IP they used.
|
||||
|
||||
**Federation gossip is identity-level.** Operators in different
|
||||
geographies will never share an IP. They may share an identity.
|
||||
|
||||
---
|
||||
|
||||
## Why sibling-add, not rename
|
||||
|
||||
**Considered:** rename `attackers` → `attacker_observations`.
|
||||
Eliminates the "attacker means observation" lie at the schema layer.
|
||||
|
||||
**Rejected.** Costs:
|
||||
|
||||
- 126 occurrences of `attacker_uuid` across the codebase, mid-migration
|
||||
churn directly on top of DEBT-041 (commit `3eb67c9`, just landed).
|
||||
- Frontend `Attacker` → `Observation` mismatches user mental model.
|
||||
Operators click "show me the attacker," not "show me the
|
||||
observation." Splunk, ELK, MISP, every CTI platform keeps the
|
||||
user-facing concept stable and exposes identity resolution as a
|
||||
derived view.
|
||||
- The lie is in *documentation*, not in code. Code already operates
|
||||
per-IP correctly; it's just named imprecisely. Fixing it via
|
||||
docstring + wiki is far cheaper than renaming.
|
||||
|
||||
**Adopted:** **sibling-add.** Keep the `attackers` table; document its
|
||||
semantic role as "per-IP observation." Add `attacker_identities` as a
|
||||
new sibling. Add nullable `attackers.identity_id` FK. The clusterer
|
||||
populates identities. Existing code paths are unchanged. Frontend
|
||||
`AttackerDetail` gains a conditional widget; new `IdentityDetail`
|
||||
page aggregates observations.
|
||||
|
||||
The "Attacker" vocabulary continues to mean "what the operator clicks
|
||||
in the dashboard" — the per-IP observation row. "Identity" is the
|
||||
analyst-facing concept, surfaced when the clusterer has resolved one.
|
||||
|
||||
---
|
||||
|
||||
## Schema
|
||||
|
||||
### `AttackerIdentity` (new)
|
||||
|
||||
| Column | Type | Notes |
|
||||
|---|---|---|
|
||||
| `uuid` | TEXT PK | uuid4(); identities are NOT fingerprint-derived (fingerprints evolve as the actor's tooling changes; the row's identity must outlive its current fingerprints) |
|
||||
| `schema_version` | INT, default 1 | Federation-gossip compat from day one. Bumping feature definitions without a version field silently poisons other operators' clustering |
|
||||
| `campaign_id` | TEXT FK nullable | Set by the campaign clusterer (downstream effort) |
|
||||
| `first_seen_at` | TIMESTAMP | Earliest observation linked to this identity |
|
||||
| `last_seen_at` | TIMESTAMP | Latest observation linked to this identity |
|
||||
| `created_at` / `updated_at` | TIMESTAMP | Row audit |
|
||||
| `confidence` | REAL nullable | Identity-cohesion score from clusterer; null until clusterer writes |
|
||||
| `observation_count` | INT default 0 | Denormalized for cheap dashboard reads. Maintained by the clusterer when it links/unlinks |
|
||||
| `ja3_hashes` | TEXT (JSON list) nullable | Multiple TLS stacks per actor possible (different tools, different hosts) |
|
||||
| `hassh_hashes` | TEXT (JSON list) nullable | |
|
||||
| `payload_simhashes` | TEXT (JSON list) nullable | 64-bit ints serialized as hex strings |
|
||||
| `c2_endpoints` | TEXT (JSON list) nullable | Domain or IP, dedup'd |
|
||||
| `kd_digraph_simhash` | BINARY(8) nullable | V2 keystroke-dynamics hook. Same shape as `SessionProfile.kd_digraph_simhash`; identity-level value is the centroid (or majority vote) across the identity's sessions |
|
||||
| `merged_into_uuid` | TEXT self-FK nullable | Soft-merge audit trail. When the clusterer combines two existing identities, the loser's row stays in place with `merged_into_uuid` pointing at the winner — preserves the audit trail without orphaning FKs |
|
||||
| `notes` | TEXT nullable | Operator-editable. Free-form |
|
||||
|
||||
All clusterer-populated fields are nullable; the table ships empty and
|
||||
is valid in that state.
|
||||
|
||||
### `attackers` (extended)
|
||||
|
||||
One nullable column added:
|
||||
|
||||
| Column | Type | Notes |
|
||||
|---|---|---|
|
||||
| `identity_id` | TEXT FK nullable, indexed | References `attacker_identities.uuid`. NULL until the clusterer resolves an identity |
|
||||
|
||||
**Migration:** None needed. Pre-v1 SQLModel `metadata.create_all()`
|
||||
adds the new table and column. No data backfill (column is nullable).
|
||||
|
||||
---
|
||||
|
||||
## Where intel lives — both, with clear semantics
|
||||
|
||||
DEBT-041 (`3eb67c9`) just re-keyed `attacker_intel` on `attacker_uuid`
|
||||
(observation level). That work is correct; we do **not** touch it
|
||||
here.
|
||||
|
||||
**Observation-level intel** (`attacker_intel`, current):
|
||||
- AbuseIPDB confidence, GreyNoise classification, abuse.ch matches,
|
||||
PTR records, GeoIP — all **IP-scoped facts**. An identity spanning
|
||||
40 IPs has 40 distinct AbuseIPDB verdicts. We must not lose that
|
||||
granularity.
|
||||
|
||||
**Identity-level intel** (`attacker_identity_intel`, deferred):
|
||||
- Aggregate reputation (e.g. "this identity has been reported as
|
||||
malicious across 4 of 5 observed IPs").
|
||||
- Threat-actor naming from MISP/CTI feeds, where naming is
|
||||
actor-scoped not IP-scoped.
|
||||
- TTP / MITRE ATT&CK tags.
|
||||
|
||||
Different lifecycle (clusterer-driven, not enricher-driven), different
|
||||
inputs (aggregates over observations, not direct API calls), so it
|
||||
gets its own table and its own enricher when it ships. **Not in this
|
||||
PR sequence.**
|
||||
|
||||
The IdentityDetail API (read side) aggregates observation intel on
|
||||
read until the identity-level table exists.
|
||||
|
||||
---
|
||||
|
||||
## Bus Topics
|
||||
|
||||
Three new topics. No publishers in this PR sequence — constants exist;
|
||||
publishers ship with the clusterer.
|
||||
|
||||
| Topic | Payload | When |
|
||||
|---|---|---|
|
||||
| `identity.formed` | `{identity_uuid, observation_uuids: [], confidence, first_seen_at}` | Clusterer creates a new identity from one or more observations |
|
||||
| `identity.observation.linked` | `{identity_uuid, observation_uuid, confidence_after}` | Clusterer attaches an observation to an existing identity (or re-attaches one previously linked elsewhere) |
|
||||
| `identity.merged` | `{winner_uuid, loser_uuid, observation_uuids: [], confidence_after}` | Clusterer collapses two identities. The loser's row stays in place via `merged_into_uuid`; subscribers re-key any cached identity references to the winner |
|
||||
|
||||
**Deferred:** `identity.campaign.assigned`. Adds opportunistically
|
||||
when the campaign clusterer ships. YAGNI before then.
|
||||
|
||||
**Wiki:** `Service-Bus.md` documents these in the same commit that
|
||||
adds the constants (per the project's `feedback_wiki_bus_signals`
|
||||
rule).
|
||||
|
||||
---
|
||||
|
||||
## API Surface
|
||||
|
||||
All new endpoints are read-only and auth-gated identically to
|
||||
`/api/v1/attackers/*` (per `project_health_auth_gated`).
|
||||
|
||||
| Method | Path | Returns |
|
||||
|---|---|---|
|
||||
| GET | `/api/v1/identities` | Paginated list of identities. Response shape mirrors `AttackersResponse` |
|
||||
| GET | `/api/v1/identities/{uuid}` | Identity row + aggregated intel summary (rolled up from FK'd observations) + campaign stub if assigned |
|
||||
| GET | `/api/v1/identities/{uuid}/observations` | Paginated list of `Attacker` observation rows that FK to this identity |
|
||||
|
||||
While the table is empty, every endpoint returns either an empty list
|
||||
or 404 — both are valid responses.
|
||||
|
||||
**`AttackerDetail` change** (frontend, not API): when
|
||||
`attackers.identity_id` is non-null, render a "Identity: <uuid-link>"
|
||||
badge linking to `/identities/<uuid>`. No change otherwise.
|
||||
|
||||
---
|
||||
|
||||
## Frontend
|
||||
|
||||
- **`AttackerDetail.tsx`** — conditional badge. Zero behavior change
|
||||
when `identity_id` is null.
|
||||
- **`IdentityDetail.tsx`** (new) — aggregates observations, fingerprint
|
||||
summary, intel summary, campaign link. Same visual vocabulary as
|
||||
`AttackerDetail` so operators feel at home.
|
||||
- **Routing** — `/identities/:uuid` alongside `/attackers/:uuid`.
|
||||
- Default browse remains "Attackers." There is no "Identities" tab
|
||||
in the main navigation until identities are populated; once they
|
||||
are, an "Identity Resolution" entry appears under the Analytics
|
||||
section (this is post-clusterer; out of scope here).
|
||||
|
||||
---
|
||||
|
||||
## Risks
|
||||
|
||||
1. **Confidence drift.** The clusterer can rewrite identity
|
||||
assignments as evidence accumulates. An observation linked to
|
||||
identity-A today may move to identity-B tomorrow. UI must surface
|
||||
this without alarming operators ("This observation has been
|
||||
re-attributed; previous identity remains as a soft-merged
|
||||
reference"). The `merged_into_uuid` chain is the audit trail.
|
||||
|
||||
2. ~~**API URL stability.**~~ Resolved in commit `dc3d08d`: the
|
||||
read-only API follows `merged_into_uuid` and surfaces the canonical
|
||||
winner. Loser UUIDs resolve to the winner row.
|
||||
|
||||
3. **Schema-version lock-in for federation.** `schema_version=1` is
|
||||
what we ship. Any fingerprint added to the identity row post-v1
|
||||
bumps the version. Operators behind by versions get a degraded
|
||||
gossip experience but should not crash — the receiver must
|
||||
tolerate unknown fields.
|
||||
|
||||
4. **Observation FK proliferation.** Today only `attackers` would
|
||||
carry `identity_id`. Tomorrow, `SessionProfile`, `AttackerIntel`,
|
||||
webhook payloads might want it too. Resist proliferation; the
|
||||
normalised path is `observation.identity_id` and identity-level
|
||||
facts go in `attacker_identity_intel`. We only carry `identity_id`
|
||||
on tables where joining via the observation row is materially
|
||||
slower at read time.
|
||||
|
||||
5. **Identity-level intel scope creep.** Easy to start moving DEBT-041
|
||||
intel up to identity level "for cleanliness." Don't. AbuseIPDB
|
||||
results are IP-scoped facts; moving them up loses information.
|
||||
Identity-level intel is *aggregate* intel, a different thing.
|
||||
|
||||
---
|
||||
|
||||
## Open Questions
|
||||
|
||||
1. ~~**Revocability of identity merges.**~~ **Resolved 2026-04-26:**
|
||||
merges are revocable. `identity.unmerged` topic ships in
|
||||
`decnet/bus/topics.py` alongside the existing three so subscribers
|
||||
on `identity.>` get it from day one. Clusterer clears
|
||||
`merged_into_uuid`, re-links observations, publishes
|
||||
`identity.unmerged` + a fresh `identity.formed` for the
|
||||
resurrected side.
|
||||
|
||||
2. ~~**`AttackerDetail` UX when `identity_id` changes.**~~ **Resolved
|
||||
2026-04-26:** SSE channel modeled on the topology-mutator SSE.
|
||||
New endpoint subscribes to `identity.>`, JWT via `?token=`,
|
||||
snapshot-on-connect + live forward. `AttackerDetail` and
|
||||
`IdentityDetail` consume it.
|
||||
|
||||
3. **`SessionProfile.identity_id` FK.** Does this PR sequence add it,
|
||||
or does it wait for V2 keystroke dynamics? Leaning **wait** — the
|
||||
FK is only useful when the identity-level keystroke similarity
|
||||
query exists, which is V2 work. Adds a column we don't read in
|
||||
v1 = unused complexity.
|
||||
|
||||
4. **Webhook payload identity_id.** Adds opportunistically once
|
||||
identities are populated. Not load-bearing for this PR sequence.
|
||||
|
||||
5. **Identity-level intel table.** Schema sketch is straightforward
|
||||
(uuid PK, identity_uuid FK, source, confidence, ttps JSON,
|
||||
timestamps), but the enricher is meaningfully different from
|
||||
the IP-scoped one. Defer entirely.
|
||||
|
||||
---
|
||||
|
||||
## What is explicitly NOT in this design
|
||||
|
||||
- The clusterer worker (`decnet/clustering/` worker bin). Designed in
|
||||
`CAMPAIGN_CLUSTERING.md` §4; lands on top of this substrate.
|
||||
- `attacker_identity_intel` table.
|
||||
- `SessionProfile.identity_id` FK.
|
||||
- Webhook payload `identity_id` enrichment.
|
||||
- Renaming `attackers` → `attacker_observations`. Considered, rejected.
|
||||
- Identity-level federation gossip. The schema is federation-ready
|
||||
(schema_version, no operator-identifying fields); the gossip wire
|
||||
itself is V2.
|
||||
|
||||
---
|
||||
|
||||
## Verification
|
||||
|
||||
After all 5 commits below land:
|
||||
|
||||
```bash
|
||||
source .311/bin/activate
|
||||
|
||||
# Schema lands cleanly.
|
||||
pytest tests/db/test_identity_schema.py -v
|
||||
|
||||
# API surface returns expected shapes against an empty identities table.
|
||||
pytest tests/web/test_api_identities.py -v
|
||||
|
||||
# No regressions on the unchanged path.
|
||||
pytest tests/web/ tests/profiler/ tests/correlation/ -v
|
||||
|
||||
# Bus topic constants importable; wiki updated.
|
||||
python -c "from decnet.bus.topics import IDENTITY_FORMED, IDENTITY_OBSERVATION_LINKED, IDENTITY_MERGED; print('OK')"
|
||||
test -f wiki-checkout/Identity-Resolution.md
|
||||
grep -q "identity.formed" wiki-checkout/Service-Bus.md
|
||||
|
||||
# Factory adapter unblocks fixture 2.
|
||||
pytest tests/clustering/test_campaign_factory.py -v
|
||||
```
|
||||
|
||||
Manual smoke after schema + API + frontend:
|
||||
|
||||
- `decnet api` then `decnet web`.
|
||||
- Browse to an existing AttackerDetail page → no badge (identity_id is NULL).
|
||||
- `GET /api/v1/identities` → `{"data": [], "total": 0, ...}`.
|
||||
- `GET /api/v1/identities/<random-uuid>` → 404.
|
||||
566
development/SIGNAL_CAPTURE_AUDIT.md
Normal file
566
development/SIGNAL_CAPTURE_AUDIT.md
Normal file
@@ -0,0 +1,566 @@
|
||||
# DECNET Capture Pipeline — Attacker-Profiling Signal Audit
|
||||
|
||||
**Date**: 2026-04-22
|
||||
**Scope**: v1 capture readiness for post-v1 profiler extraction
|
||||
**Methodology**: End-to-end verification (emission → transport → storage) for each signal against active code paths.
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
**Capture Status by Category**:
|
||||
|
||||
| Category | Captured | Partial | Not Captured | n/a |
|
||||
|----------|----------|---------|--------------|-----|
|
||||
| Session Environment | 0 | 1 | 3 | 0 |
|
||||
| Keystroke/Human | 0 | 2 | 6 | 2 |
|
||||
| SSH Transport | 2 | 2 | 2 | 0 |
|
||||
| Network/TCP | 3 | 2 | 5 | 0 |
|
||||
| TLS/L7 | 2 | 2 | 1 | 0 |
|
||||
| Aggregated/Derived | 0 | 0 | 5 | 0 |
|
||||
| **TOTAL** | **7** | **9** | **22** | **2** |
|
||||
|
||||
**Critical Pre-v1 Gaps** (blockers if signals are roadmap-committed):
|
||||
|
||||
1. **KEX algorithm ordering** — HASSH hash is stored, but raw `kex_algorithms` string is only emitted to syslog, not persisted to DB. Future extractor must parse syslog archives.
|
||||
2. **Per-keystroke timing** — Asciinema v2 `"i"` events with `t` timestamps are written to day-shard files on disk, but no database ingestion. Requires filesystem polling + parsing path.
|
||||
3. **TCP options order** — Captured in PCAP + sniffer logs (`options_sig`), but `options_sig` is a rolled-up signature string, not the raw per-connection sequence.
|
||||
4. **Terminal size (COLS×ROWS)** — Not captured from pty-req at all; would require SSH protocol-level interception.
|
||||
5. **SSH client version** — Server-side only sees RFC 4253 banner; full version string would require TLS cert inspection or prober modification.
|
||||
|
||||
**Biggest ROI capture improvements** (cheap, high-value):
|
||||
|
||||
1. Add `ssh_client_banner` column to Attacker table — capture SSH-2.0-* string from pty-req.
|
||||
2. Ingest asciinema keystroke timing into new `SessionProfile` table (v2 roadmap already designs this).
|
||||
3. Store raw KEX algorithm lists in `AttackerBehavior.kex_order_raw` (MEDIUMTEXT) instead of relying on syslog dedup.
|
||||
|
||||
---
|
||||
|
||||
## Per-Signal Classification
|
||||
|
||||
### Per-Session Environment (SessionProfile candidates)
|
||||
|
||||
#### TERM environment variable
|
||||
- **Status**: `partial`
|
||||
- **Where**: SSH server can read TERM from pty-req; emitted in syslog by `emit_capture.py` if implemented.
|
||||
- **Current path**: Not found in active code path. Check `decnet/templates/ssh/emit_capture.py` or syslog bridge.
|
||||
- **Missing**: Database column in a `SessionProfile` table; no structured ingestion.
|
||||
- **Cheap fix**: Modify SSH syslog bridge to emit `session_event` with `term=<value>`. Create `SessionProfile` table with `session_term` TEXT column.
|
||||
- **Priority**: V2 backlog (nice-to-have for human vs. automation, low discriminative power).
|
||||
|
||||
#### LANG / LC_ALL
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Server-side locale is baked into container image, not attacker-controlled. Attacker's client locale is not visible over SSH.
|
||||
- **Priority**: defer (non-capturable from server vantage point).
|
||||
|
||||
#### SSH client version string (full SSH-2.0-OpenSSH_9.2p1…)
|
||||
- **Status**: `partial`
|
||||
- **Where**: RFC 4253 banner string is transmitted in plaintext before encryption. Sniffer could capture it from TCP stream; prober `hassh.py` captures server banner (lines 58–101), not client.
|
||||
- **Missing**: Client-side banner capture. Sniffer would need TCP stream reconstruction to pluck the SSH banner from the raw payload.
|
||||
- **Cheap fix**: Extend sniffer to parse SSH banners from TCP stream (before TLS/encryption); emit `ssh_client_banner` event. Store in Attacker.`ssh_client_banners` (JSON list).
|
||||
- **Priority**: v1 blocker if client-profiling is committed. Currently partial via TLS fingerprint fallback.
|
||||
|
||||
#### Terminal size (COLS × ROWS)
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: SSH pty-req extension carries `terminal mode` (COLS, ROWS, speeds); server-side sshd parses this but does not log it by default. Would require patching sshd or intercepting at the protocol layer.
|
||||
- **Missing**: No access to pty-req payload without protocol-level instrumentation.
|
||||
- **Cheap fix**: Patch SSH entrypoint to log pty-req to syslog before accepting the request (requires custom OpenSSH build).
|
||||
- **Priority**: V2 backlog (interesting for typing-space reconstruction, but not blocky).
|
||||
|
||||
---
|
||||
|
||||
### Per-Session, Keyboard/Human (SessionProfile candidates)
|
||||
|
||||
#### Per-keystroke timing (t in asciinema "i" events)
|
||||
- **Status**: `partial`
|
||||
- **Where**: Sessrec pipeline (`decnet/templates/ssh/sessrec/`) writes asciinema v2 day-shards with per-keystroke `"i"` (input) events carrying `t` (timestamp in seconds since session start). Files on disk: `/var/lib/decnet/session_recordings/<decky>/<date>.json` (or similar).
|
||||
- **Missing**: No ingestion into database. Extractors must read asciinema files from filesystem and parse the `"i"` event stream post-hoc.
|
||||
- **Cheap fix**: Ingest keystroke timing stream into new `SessionProfile` table (design already in DEVELOPMENT_V2.md). Add job to parse day-shard files on rotation and compute IKI moments, burst ratio, etc.
|
||||
- **Priority**: v1 blocker if keystroke dynamics is roadmap-committed. Data exists but not queryable.
|
||||
|
||||
#### Control-character stream (backspace, ^W, ^U, ^C, ^D, arrows, tab)
|
||||
- **Status**: `partial`
|
||||
- **Where**: Asciinema captures every keystroke as UTF-8/control byte in `"i"` events. Raw byte sequence is preserved.
|
||||
- **Missing**: Same as above — files on disk, no DB ingestion. Future extractor can parse control bytes from the `"data"` field of each `"i"` event.
|
||||
- **Cheap fix**: Same as keystroke timing — ingest asciinema events and compute `kd_ctrl_*` rates in SessionProfile.
|
||||
- **Priority**: v2 (depends on SessionProfile schema).
|
||||
|
||||
#### Inter-command think time (prompt-return to next-command-start gap)
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Requires prompt boundary detection in the asciinema stream (heuristic: line ending in `$` or `#` + pause > 100ms). No active code marks prompts.
|
||||
- **Missing**: Prompt-boundary markers in asciinema. Would require ML or regex-based post-processing.
|
||||
- **Cheap fix**: Add prompt-regex configuration + marker injection during sessrec playback, or post-hoc analysis over asciinema.
|
||||
- **Priority**: V2 (interesting but requires heuristic or attacker-side annotation).
|
||||
|
||||
#### Pause before sensitive commands
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Requires command-boundary detection (typing a full command, then detecting gap before Enter). Asciinema captures this timing, but no code marks command boundaries.
|
||||
- **Missing**: Command-line parsing + gap detection logic.
|
||||
- **Cheap fix**: Off-line analysis: parse `"i"` events, detect Enter (`\r`), measure gap before Enter. Correlate with command content from `"o"` (output) events.
|
||||
- **Priority**: V2 backlog (post-extraction analysis; interesting for psychological profiling).
|
||||
|
||||
#### Command n-grams
|
||||
- **Status**: `partial`
|
||||
- **Where**: SSH service logs individual commands to syslog when pty input is detected. Attacker.`commands` JSON array stores seen commands (but coarse-grained per service/decky, not per-session).
|
||||
- **Missing**: Per-session, per-command sequencing. No n-gram bigrams/trigrams computed.
|
||||
- **Cheap fix**: Parse asciinema `"i"` + `"o"` stream to extract full command lines, store as JSON list in SessionProfile.`cmd_sequence` or new `SessionCommand` table.
|
||||
- **Priority**: V2 (foundation for command chaining fingerprint).
|
||||
|
||||
#### Flag preferences (ls -la vs ls -al, ps -ef vs ps aux)
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Asciinema records the **typed** command line exactly, but no code parses flag ordering or normalizes commands for pattern comparison.
|
||||
- **Missing**: Canonical command parsing + flag-order extraction.
|
||||
- **Cheap fix**: Off-line: regex-parse commands from asciinema, extract flag sequences, compute n-grams over flag positions.
|
||||
- **Priority**: V2 (cheap post-processing, good human-vs-tool separator).
|
||||
|
||||
#### Typo patterns (suod, sl)
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Asciinema records corrected command line after backspacing, not the raw keystrokes with typos visible.
|
||||
- **Example**: typing `suod<backspace>` then `ddo<backspace>` then `o` shows as `sudo` in `"o"` output; the intermediate typos are **visible** in the `"i"` event stream but require careful keystroke-by-keystroke parsing.
|
||||
- **Missing**: Raw keystroke stream parsing to detect backspace/correction patterns.
|
||||
- **Cheap fix**: Parse `"i"` events, reconstruct line state keystroke-by-keystroke, log (typed_text, final_text) pairs to detect corrections.
|
||||
- **Priority**: V2 (unique human fingerprint, but requires manual asciinema parsing).
|
||||
|
||||
#### Editor choice (vi/vim/nano/ed)
|
||||
- **Status**: `partial`
|
||||
- **Where**: Command launch (`vi`, `nano`, `ed`) is visible in asciinema `"i"` + `"o"` stream and captured in Attacker.`commands`.
|
||||
- **Missing**: No aggregation of editor invocations or time-in-editor statistics.
|
||||
- **Cheap fix**: Post-process commands, count editor launches, extract editor type. Could add to AttackerBehavior.`preferred_editor` or new SessionProfile.`editor_used`.
|
||||
- **Priority**: V2 (behavioral signal, low priority).
|
||||
|
||||
#### Shell history usage (!!,!$, ^old^new, fc)
|
||||
- **Status**: `partial`
|
||||
- **Where**: Command input stream captures the actual invocation (if attacker types `!!`, it's visible in `"i"`). Output `"o"` shows the expanded command.
|
||||
- **Missing**: No parsing of history expansion syntax; requires post-processing to identify `!` / `^` patterns.
|
||||
- **Cheap fix**: Regex-scan asciinema input for shell history operators; count occurrences.
|
||||
- **Priority**: V2 (interesting tool-chain signal, but low volume).
|
||||
|
||||
---
|
||||
|
||||
### Per-Attacker, SSH Transport (AttackerBehavior candidates)
|
||||
|
||||
#### HASSH / HASSHServer
|
||||
- **Status**: `captured`
|
||||
- **Where**: Prober (`decnet/prober/hassh.py`) computes HASSHServer fingerprint; stored as `Attacker.fingerprints` JSON list (generic bounty store). Also emitted to syslog by prober worker.
|
||||
- **Note**: Roadmap says `[x]` (captured); verified in code at lines 244–252 of `hassh.py`.
|
||||
- **Storage**: `Attacker.fingerprints` (JSON list of `{type, value, ...}` dicts); not per-attacker-behavior, but queryable.
|
||||
- **Priority**: ✓ captured; v2: consider normalizing to `AttackerBehavior.hassh_server` for faster lookup.
|
||||
|
||||
#### KEX algorithm preference ORDER (beyond HASSH hash)
|
||||
- **Status**: `partial`
|
||||
- **Where**: Sniffer logs raw `kex_algorithms`, `encryption_s2c`, `mac_s2c`, `compression_s2c` strings to syslog in `tls_session` and `tcp_syn_fingerprint` events (fingerprint.py lines 240–252).
|
||||
- **Missing**: Stored in **syslog only**, not in DB. Attacker table has `fingerprints` (bounty store) but no dedicated `kex_order_raw` column.
|
||||
- **Path to recovery**: Read syslog archives and parse `kex_algorithms` field. But this is not queryable at scale.
|
||||
- **Cheap fix**: Add `Attacker.kex_order_raw` (MEDIUMTEXT, JSON string list) and `kd_kex_order_hash` (similar to digraph simhash). Populate during sniffer event ingestion.
|
||||
- **Priority**: v1 blocker if KEX ordering is committed to roadmap (currently only hash stored, raw data must be re-parsed from syslog).
|
||||
|
||||
#### Public key comment field
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: SSH key comment is part of the OpenSSH wire format (only transmitted if key auth is used). Server-side sshd does not log it by default; would require PAM/auth hook instrumentation.
|
||||
- **Missing**: No interception of public key authentication payloads.
|
||||
- **Cheap fix**: Patch SSH server to emit auth_pubkey event with key comment extracted from wire format. Or use `net.ssh` library instrumentation.
|
||||
- **Priority**: V2 backlog (valuable for key reuse fingerprinting, but rare).
|
||||
|
||||
#### Private key type advertised (Ed25519 / RSA / ECDSA)
|
||||
- **Status**: `partial`
|
||||
- **Where**: SSH transport carries key type in the public key authentication message. Sniffer cannot decode this (traffic is encrypted after ServerHello). Server-side sshd doesn't log it.
|
||||
- **Missing**: Requires either passive PCAP of SSH-TRANSPORT (not available; encrypted) or server-side auth hook.
|
||||
- **Cheap fix**: Patch sshd to emit `auth_pubkey_type` event during authentication.
|
||||
- **Priority**: V2 (interesting but lower signal than key comment).
|
||||
|
||||
#### Agent forwarding requested?
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Agent forwarding is negotiated via SSH_MSG_SERVICE_REQUEST → ssh-userauth → "ssh-agent@openssh.com" extension. Encrypted after KEX.
|
||||
- **Missing**: Would require decrypting SSH transport or instrumenting sshd auth hook.
|
||||
- **Cheap fix**: Sshd can detect `SSH_AUTH_SOCK` or SSH_AGENT_FWD service request; add to syslog.
|
||||
- **Priority**: V2 (useful for lateral-movement detection).
|
||||
|
||||
#### Channel multiplexing pattern
|
||||
- **Status**: `partial`
|
||||
- **Where**: SSH service logs each command separately. Channel open/close events could be tracked, but no code currently does.
|
||||
- **Missing**: Per-session channel state machine (open channels, their types, lifetime).
|
||||
- **Cheap fix**: Instrument sshd or use SSH_MSG_CHANNEL_OPEN events in syslog to track simultaneous channels.
|
||||
- **Priority**: V2 (rare; most attackers use sequential commands).
|
||||
|
||||
#### SSH_CLIENT / SSH_CONNECTION environment variables
|
||||
- **Status**: `captured`
|
||||
- **Where**: SSH server **always** sets `SSH_CLIENT` and `SSH_CONNECTION` in the child shell. Server-side user code (bashrc, commands) can read them. If attacker runs `echo $SSH_CLIENT`, it's visible in asciinema output.
|
||||
- **Missing**: No **automatic** logging of these vars. Requires parsing asciinema for intentional queries or patching sshd to emit them.
|
||||
- **Cheap fix**: Patch SSH PAM or auth hook to log `SSH_CLIENT` on successful auth. Or parse asciinema for `echo $SSH_*` commands.
|
||||
- **Priority**: V2 (low value; mostly redundant with src_ip already in logs).
|
||||
|
||||
---
|
||||
|
||||
### Per-Attacker, Network/Transport (AttackerBehavior candidates)
|
||||
|
||||
#### TCP timestamp clock skew (Kohno 2005)
|
||||
- **Status**: `partial`
|
||||
- **Where**: PCAP contains TCP timestamps (if present). Sniffer code extracts MSS, window size, options (fingerprint.py line 77–94). TCP options include timestamp flag (`has_timestamps`).
|
||||
- **Missing**: Raw timestamp values (`opt_value` for "Timestamp" in scapy) are NOT extracted. Only boolean `has_timestamps` flag is stored. To compute clock skew, need timestamp values across multiple packets.
|
||||
- **Path to recovery**: Raw PCAP analysis (if PCAPs are retained on disk). Each TCP packet has `[TCP option: Timestamp x, y]` which can be parsed post-hoc.
|
||||
- **Cheap fix**: Extend sniffer to extract timestamp sequence numbers and RTT deltas. Store as per-flow timing summary in `tcp_flow_timing` event (which already captures flow metrics).
|
||||
- **Priority**: V2 (requires PCAP or extended sniffer capture; useful for OS fingerprinting).
|
||||
|
||||
#### TCP ISN generator characteristics
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: ISN is visible in PCAP (TCP seq number on SYN). Sniffer code tracks flow seqs for retransmit detection (line 850) but does not extract the initial SYN seq across multiple connections to analyze ISN patterns.
|
||||
- **Missing**: No per-connection ISN logging. Would need to roll up ISN sequences across multiple SYNs to the same port.
|
||||
- **Cheap fix**: On every SYN, log `syn_seq` in `tcp_syn_fingerprint` event. Post-hoc analysis can compute randomness metrics.
|
||||
- **Priority**: V2 backlog (weak signal; ISN randomization is standard on modern OS).
|
||||
|
||||
#### TCP options ordering in SYN
|
||||
- **Status**: `partial`
|
||||
- **Where**: Sniffer extracts `options_sig` (line 87) via `_extract_options_order()` from scapy TCP options. This is a **signature string** (e.g., `"MSS,WScale,SAckOK,Timestamp"`).
|
||||
- **Missing**: The signature is **aggregated**; we don't store the raw per-packet ordering. Also, `options_sig` is deduplicated in logs (only one event per unique signature per dedup window).
|
||||
- **Path to recovery**: Raw PCAP analysis or re-parsing sniffer logs to extract the signature. But the signature is a good enough feature for OS fingerprinting.
|
||||
- **Cheap fix**: Store `tcp_fingerprint` JSON in AttackerBehavior with raw options list (not just signature). Current schema (models.py line 174–177) only stores aggregated `{window, wscale, mss, options_sig}`.
|
||||
- **Priority**: v1 improvement (low effort, already have options_sig; add raw list).
|
||||
|
||||
#### Initial congestion window ramp-up
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Requires detailed TCP state machine tracking (SYN, SYN-ACK, ACK sequence with packet sizes). Sniffer tracks `packets` count and `bytes` total per flow (line 844–868), but not per-packet sequence or ACK-clock dynamics.
|
||||
- **Missing**: Per-packet payload sizes and ACK timing.
|
||||
- **Cheap fix**: Extend `tcp_flow_timing` event to include per-packet sizes (as JSON list) or CWND estimation from ACK patterns.
|
||||
- **Priority**: V2 backlog (very niche; useful for Reno vs. Cubic vs. BBR detection, but rare in honeypot context).
|
||||
|
||||
#### Retransmit timing and backoff
|
||||
- **Status**: `captured`
|
||||
- **Where**: Sniffer tracks `retransmits` count per flow (lines 873–877, 922). Emitted in `tcp_flow_timing` event. No **timing** of retransmits, only count.
|
||||
- **Missing**: Timing deltas between retransmit pairs (RTO, exponential backoff pattern).
|
||||
- **Path to recovery**: Raw PCAP; sequence numbers in `tcp_flow_timing` are not logged.
|
||||
- **Cheap fix**: Extend event to include retransmit timing deltas (list of RTOs).
|
||||
- **Priority**: V2 (useful for network condition inference; low value on honeypots).
|
||||
|
||||
#### MTU / path-MTU discovery behavior
|
||||
- **Status**: `partial`
|
||||
- **Where**: Sniffer tracks per-flow byte counts (line 868); can infer effective MSS from packet sizes. TCP fingerprint includes extracted MSS (line 77–94, emitted in `tcp_syn_fingerprint`).
|
||||
- **Missing**: No multi-flow MTU tracking or ICMP fragmentation-needed response detection. Would require ICMP processing.
|
||||
- **Cheap fix**: Log ICMP unreachable (frag needed) events separately; correlate with TCP flows to infer PMTUD behavior.
|
||||
- **Priority**: V2 backlog (VPN detection is interesting but niche).
|
||||
|
||||
#### Packet pacing (microsecond-resolution egress timing)
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Sniffer computes mean/min/max inter-arrival time in milliseconds (lines 904–906), not microseconds. Modern pacing requires sub-millisecond precision.
|
||||
- **Missing**: Sniffer uses `time.monotonic()` (typically millisecond granularity on Linux); would need OS-level timing hooks or PCAP with hardware timestamps.
|
||||
- **Cheap fix**: Upgrade sniffer to use PCAP timestamps (pcap.ts_resolution) if available; log microsecond-resolution inter-packet gaps.
|
||||
- **Priority**: V2 backlog (requires infrastructure upgrade; marginal value on honeypots).
|
||||
|
||||
#### Window scaling multipliers
|
||||
- **Status**: `captured`
|
||||
- **Where**: Sniffer extracts `wscale` from TCP options (line 80); stored in `tcp_fingerprint` JSON and emitted in `tcp_syn_fingerprint` event.
|
||||
- **Storage**: AttackerBehavior.`tcp_fingerprint` (JSON: `{window, wscale, mss, ...}`); queryable.
|
||||
- **Priority**: ✓ captured (sufficient for OS fingerprinting and congestion algorithm inference).
|
||||
|
||||
#### ECN negotiation
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: ECN is signaled via TCP flags (CWR, ECE) and the SYN's TCP options. Scapy's TCP layer does not expose ECN flags in the options extraction.
|
||||
- **Missing**: No code to parse ECN negotiation from TCP header.
|
||||
- **Cheap fix**: Extend TCP fingerprint extraction to check for ECN flag bits.
|
||||
- **Priority**: V2 backlog (rarely used; low value).
|
||||
|
||||
---
|
||||
|
||||
### Per-Attacker, L7 (TLS/HTTP)
|
||||
|
||||
#### TLS fingerprint (JA3/JA4)
|
||||
- **Status**: `captured`
|
||||
- **Where**: Sniffer fingerprint engine computes JA3/JA3S/JA4/JA4S (lines 565–662); emitted in syslog and stored in `Attacker.fingerprints` (bounty store).
|
||||
- **Storage**: Logs are queryable; fingerprints stored as JSON in bounty table (generic).
|
||||
- **Roadmap**: `[x]` JA3/JA3S, `[x]` JA4+. Verified in code.
|
||||
- **Priority**: ✓ captured (good).
|
||||
|
||||
#### TLS session resumption behavior
|
||||
- **Status**: `captured`
|
||||
- **Where**: Sniffer extracts resumption mechanisms (session_ticket, PSK, early_data, session_id) in `_session_resumption_info()` (lines 675–689). Emitted in `tls_client_hello` event.
|
||||
- **Storage**: Logged to syslog; `Attacker.fingerprints` stores resumption=`[mechanism list]`.
|
||||
- **Priority**: ✓ captured (good).
|
||||
|
||||
#### HTTP/2 SETTINGS frame ordering + values
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: HTTP/2 is encrypted (after TLS handshake). Sniffer cannot see plaintext SETTINGS frames.
|
||||
- **Missing**: Would require decryption (not viable passively) or attacker-side TLS instrumentation.
|
||||
- **Cheap fix**: Instrument HTTP/2 services (h2c, HTTP/2 over plain TCP on rare deployments) or use TLS key log for offline analysis.
|
||||
- **Priority**: defer (not capturable from passive vantage point).
|
||||
|
||||
#### HTTP/2 stream prioritization
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Encrypted in TLS.
|
||||
- **Missing**: Same as above.
|
||||
- **Priority**: defer (not capturable).
|
||||
|
||||
#### HTTP header ordering
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Inside encrypted TLS. Sniffer cannot see plaintext HTTP headers.
|
||||
- **Missing**: Would require server-side HTTP request logging (not implemented).
|
||||
- **Cheap fix**: Instrument HTTP service to log raw header order in syslog.
|
||||
- **Priority**: V2 (useful for bot/tool detection, but requires service-level capture).
|
||||
|
||||
#### Cookie handling behavior (expiry, domain scope)
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Encrypted TLS + requires HTTP state machine tracking (Set-Cookie responses vs. Cookie requests).
|
||||
- **Missing**: Would need server-side HTTP middleware or browser instrumentation.
|
||||
- **Cheap fix**: Add cookie jar logging to HTTP service (track which attacker cookies were accepted, rejected, resent).
|
||||
- **Priority**: V2 (behavioral signal; interesting but niche).
|
||||
|
||||
---
|
||||
|
||||
### Per-Attacker, Aggregated/Derived (would live in new `AttackerAggregate` table)
|
||||
|
||||
#### Time-of-day activity distribution (chronotyping)
|
||||
- **Status**: `partial`
|
||||
- **Where**: Log entries have `timestamp` (datetime). All events are timestamped. Can compute hour-of-day histogram post-hoc.
|
||||
- **Missing**: No aggregation table or computed features. Would live in new AttackerAggregate.
|
||||
- **Cheap fix**: Batch job: group events by attacker + hour-of-day, compute distribution histogram. Store as JSON or new table.
|
||||
- **Priority**: V2 (simple aggregation; good for clustering).
|
||||
|
||||
#### Session duration distribution
|
||||
- **Status**: `partial`
|
||||
- **Where**: SessionProfile schema (DEVELOPMENT_V2.md) includes `session_duration_s`. Asciinema files are per-decky-per-day, so duration can be computed.
|
||||
- **Missing**: No SessionProfile table yet; no aggregation of durations across sessions.
|
||||
- **Cheap fix**: Implement SessionProfile table + compute per-attacker duration histogram in AttackerAggregate.
|
||||
- **Priority**: V2 (depends on SessionProfile; good for behavioral clustering).
|
||||
|
||||
#### Recon-to-action ratio
|
||||
- **Status**: `partial`
|
||||
- **Where**: Profiler already computes recon vs. exfil phase sequencing (behavioral.py lines 52–62, 188–191). Stored in `AttackerBehavior.phase_sequence` (JSON: `{recon_end, exfil_start, latency}`).
|
||||
- **Missing**: No per-attacker ratio column in AttackerAggregate. Would be simple division: `exfil_events / recon_events`.
|
||||
- **Cheap fix**: Compute ratio in profiler job; store in new AttackerAggregate or as extension to AttackerBehavior.
|
||||
- **Priority**: V2 (low effort; useful for threat level scoring).
|
||||
|
||||
#### Lateral movement style
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Requires graph traversal (attacker hopping between deckies). Correlation engine (correlation/engine.py) should track this, but no explicit "lateral movement style" feature (sequential vs. parallel, target selection heuristic).
|
||||
- **Missing**: No code analyzing lateral movement pattern (which deckies were touched, in what order, dwell time per decky).
|
||||
- **Cheap fix**: Extend CorrelationEngine to build per-attacker decky traversal graph; compute metrics (average dwell time, fan-out ratio, revisit frequency).
|
||||
- **Priority**: V2 (interesting; requires traversal graph extraction from correlation engine).
|
||||
|
||||
#### Persistence-first vs. exfil-first
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Requires semantic tagging of events (is this persistence activity? exfil activity?). Profiler has `EXFIL_EVENT_TYPES` (line 59–62) but no persistence catalog.
|
||||
- **Missing**: No code to classify persistence attempts (cron jobs, reverse shells, privilege escalation).
|
||||
- **Cheap fix**: Add PERSISTENCE_EVENT_TYPES list; compute persistence_start vs. exfil_start timestamps; store in AttackerBehavior or AttackerAggregate.
|
||||
- **Priority**: V2 (requires event taxonomy; valuable for threat classification).
|
||||
|
||||
#### Tool-chain ordering
|
||||
- **Status**: `partial`
|
||||
- **Where**: Profiler logs tool guesses in AttackerBehavior.`tool_guesses` (line 183, behavioral.py lines 76–105). Tools are matched by beacon timing + header patterns.
|
||||
- **Missing**: No **ordering** — tools are listed but not sequenced by first-appearance time.
|
||||
- **Cheap fix**: Sort tool_guesses by first event timestamp; store as ordered list. Compute tool transition graph (tool A → tool B over time).
|
||||
- **Priority**: V2 (interesting; small extension to existing tool attribution).
|
||||
|
||||
#### Error-response psychology
|
||||
- **Status**: `not_captured`
|
||||
- **Why**: Requires analyzing how attacker reacts to failures (e.g., retry frequency after auth failure, command error recovery). Would need per-command success/failure tracking.
|
||||
- **Missing**: No error-categorization in logs; would need service-level event typing (auth_failure vs. auth_success, exec_error vs. exec_success).
|
||||
- **Cheap fix**: Extend service events to include success/failure indicators; compute attacker error-response metrics (retry rate, time-to-recovery, behavior change after error).
|
||||
- **Priority**: V2 backlog (niche; good for human vs. bot discrimination).
|
||||
|
||||
---
|
||||
|
||||
## Table Recommendations
|
||||
|
||||
### `AttackerBehavior` — Current & Recommended Additions
|
||||
|
||||
**Currently captured** (verified in models.py lines 161–194):
|
||||
- `tcp_fingerprint` (JSON) — window, wscale, mss, options_sig
|
||||
- `timing_stats` (JSON) — mean/median/stdev/min/max IAT
|
||||
- `phase_sequence` (JSON) — recon_end, exfil_start latency
|
||||
- `tool_guesses` (JSON list)
|
||||
- `beacon_interval_s`, `beacon_jitter_pct`
|
||||
- `behavior_class` (beaconing | interactive | scanning | …)
|
||||
|
||||
**Recommended additions for v1 (pre-v2, no schema bump)**:
|
||||
- `kex_order_raw` (MEDIUMTEXT, JSON list) — raw KEX algorithm strings from HASSH
|
||||
- `tls_fingerprints_full` (MEDIUMTEXT, JSON) — full JA3/JA4 raw strings, not just hashes
|
||||
- `ssh_client_banners` (MEDIUMTEXT, JSON list) — capture from TCP stream
|
||||
|
||||
**Reserved for v2**:
|
||||
- See SessionProfile below.
|
||||
|
||||
### `SessionProfile` — New Table (v2 roadmap in DEVELOPMENT_V2.md)
|
||||
|
||||
Design is already specified (lines 71–104). Implement in v1 as empty table + stubbed write path, ready for feature extraction post-v1.
|
||||
|
||||
**Columns** (from DEVELOPMENT_V2.md):
|
||||
- `sid` (TEXT PK)
|
||||
- `log_id` (FK to logs)
|
||||
- `schema_version` (INT, required for federation gossip)
|
||||
- Timing features: `kd_iki_mean`, `kd_iki_stdev`, `kd_iki_p50`, `kd_iki_p95`, `kd_enter_latency_p50`, `kd_enter_latency_p95`
|
||||
- Ratio features: `kd_burst_ratio`, `kd_think_ratio`
|
||||
- Control-char rates: `kd_ctrl_backspace`, `kd_ctrl_wkill`, `kd_ctrl_ukill`, `kd_ctrl_abort`, `kd_ctrl_eof`, `kd_arrow_rate`, `kd_tab_rate`
|
||||
- `kd_digraph_simhash` (BLOB, 8 bytes)
|
||||
- Derived: `total_keystrokes`, `session_duration_s`, `created_at`
|
||||
|
||||
**Note**: All keystroke-timing values are derivable from existing asciinema day-shard files on disk. Implement ingestion job in v2 (not v1 blocker).
|
||||
|
||||
### `AttackerAggregate` — New Table (v2+)
|
||||
|
||||
Columns (suggested):
|
||||
- `attacker_uuid` (PK, FK to attackers)
|
||||
- `activity_dist_by_hour` (JSON) — histogram of event counts by UTC hour
|
||||
- `session_duration_dist` (JSON) — percentiles of session durations
|
||||
- `recon_to_action_ratio` (REAL)
|
||||
- `lateral_movement_graph` (JSON) — decky traversal (src → dst edges with dwell times)
|
||||
- `tool_sequence` (JSON list) — tools in chronological order
|
||||
- `is_persistent` (BOOL) — persistence activity detected?
|
||||
- `updated_at` (TIMESTAMP)
|
||||
|
||||
---
|
||||
|
||||
## Full Per-Signal Capture Table
|
||||
|
||||
| Signal | Status | Where Captured | What's Missing | Cheap Fix | Priority |
|
||||
|--------|--------|-----------------|-----------------|-----------|----------|
|
||||
| **Session Environment** |
|
||||
| TERM | partial | SSH pty-req, server-readable | No syslog emission, no DB | Patch SSH syslog bridge to emit term= | V2 |
|
||||
| LANG/LC_ALL | n/a | Server locale, not attacker-controlled | Not visible from server vantage | Defer (not capturable) | defer |
|
||||
| SSH client version | partial | TCP stream (plaintext banner before TLS) | Sniffer doesn't parse SSH banners; only TLS fingerprints | Extend sniffer to extract SSH banner from TCP stream | v1 blocker |
|
||||
| Terminal size (COLS×ROWS) | not_captured | SSH pty-req extension | Requires protocol interception or sshd patch | Patch sshd to log pty-req | V2 |
|
||||
| **Keyboard/Human** |
|
||||
| Per-keystroke timing | partial | Asciinema "i" events with t timestamps | Files on disk, not ingested to DB | Implement SessionProfile table + ingest job | v1 blocker |
|
||||
| Control-character stream | partial | Asciinema keystroke bytes | Same as above (files only) | Same as above | v1 blocker |
|
||||
| Inter-command think time | not_captured | Requires prompt detection | Heuristic (line ending in $/#) not implemented | Post-hoc: regex + gap detection over asciinema | V2 |
|
||||
| Pause before sensitive cmd | not_captured | Would be in asciinema timing | Requires command-line parsing + gap detection | Off-line analysis of asciinema | V2 |
|
||||
| Command n-grams | partial | Attacker.commands (generic list) | Per-session structure missing | Parse asciinema I/O; store in SessionProfile | V2 |
|
||||
| Flag preferences | not_captured | Asciinema input has typed flags | No parsing or normalization | Regex-parse and canonicalize flags from asciinema | V2 |
|
||||
| Typo patterns | not_captured | Raw keystroke sequence in asciinema "i" | Requires keystroke-by-keystroke reconstruction | Parse "i" events with backspace markers; reconstruct line state | V2 |
|
||||
| Editor choice | partial | Attacker.commands shows editor launch | No aggregation or time-in-editor | Count editor invocations; store preference in SessionProfile | V2 |
|
||||
| Shell history usage | partial | Command input shows !, ^, !! | No parsing for history operators | Regex-scan for shell history syntax; count | V2 |
|
||||
| **SSH Transport** |
|
||||
| HASSH/HASSHServer | captured | Prober (hassh.py); Attacker.fingerprints | ✓ (hash + raw algorithm strings in syslog) | Already done | — |
|
||||
| KEX algorithm order | partial | Syslog event kex_algorithms= field | Not persisted to DB (only in syslog) | Add AttackerBehavior.kex_order_raw (MEDIUMTEXT, JSON) | v1 blocker |
|
||||
| Public key comment | not_captured | SSH wire format (auth_pubkey) | Requires server-side auth hook | Patch sshd to emit auth_pubkey_comment event | V2 |
|
||||
| Private key type | partial | SSH wire format (auth algorithm OID) | Encrypted after KEX; needs sshd hook | Patch sshd to emit auth_key_type event | V2 |
|
||||
| Agent forwarding? | not_captured | SSH extension negotiation (encrypted) | Requires sshd instrumentation | Patch sshd to detect ssh-agent@openssh.com | V2 |
|
||||
| Channel multiplexing | partial | SSH service logs commands separately | No channel state machine | Instrument sshd SSH_MSG_CHANNEL_OPEN events | V2 |
|
||||
| SSH_CLIENT env vars | captured | Server sets automatically; queryable via shell | No automatic logging | Patch sshd PAM to emit SSH_CLIENT on auth | V2 |
|
||||
| **Network/Transport** |
|
||||
| TCP timestamp skew | partial | PCAP + sniffer has has_timestamps flag | Only boolean; not timestamp values | Extract timestamp seq numbers in sniffer | V2 |
|
||||
| TCP ISN generator | not_captured | PCAP SYN seq field | No per-connection ISN logging | Log syn_seq in tcp_syn_fingerprint event | V2 |
|
||||
| TCP options ordering | partial | Sniffer extracts options_sig signature | Aggregated string; no raw order per-packet | Extend tcp_fingerprint JSON with raw options list | v1 improvement |
|
||||
| Initial congestion window | not_captured | Would require per-packet ACK analysis | Not tracked in sniffer | Extend tcp_flow_timing to include payload sizes list | V2 |
|
||||
| Retransmit timing+backoff | partial | Sniffer counts retransmits; no timing | RTO/backoff timing not logged | Extend event to include RTO deltas | V2 |
|
||||
| MTU/path-MTU discovery | partial | MSS in TCP SYN; byte counts per flow | No ICMP fragmentation-needed events | Add ICMP processing; correlate with TCP flows | V2 |
|
||||
| Packet pacing (μs) | not_captured | Sniffer uses millisecond granularity | Needs PCAP hardware timestamps or OS hooks | Upgrade to sub-millisecond timing | V2+ |
|
||||
| Window scaling | captured | TCP fingerprint; wscale in AttackerBehavior | ✓ queryable | — | — |
|
||||
| ECN negotiation | not_captured | TCP SYN flags (CWR/ECE) + options | Not extracted from TCP header | Extend TCP fingerprint to parse ECN bits | V2 |
|
||||
| **L7 (TLS/HTTP)** |
|
||||
| TLS fingerprint (JA3/JA4) | captured | Sniffer fingerprint.py; Attacker.fingerprints | ✓ hashes stored + syslog | Already done | — |
|
||||
| HTTP/2 SETTINGS order | not_captured | Encrypted inside TLS | Passive inspection not viable | Defer (not capturable) | defer |
|
||||
| HTTP/2 prioritization | not_captured | Encrypted | Not capturable | defer | defer |
|
||||
| HTTP header ordering | not_captured | Encrypted; requires service logging | Service doesn't log raw headers | Patch HTTP service to log header order | V2 |
|
||||
| Cookie handling | not_captured | Requires HTTP state machine | Not tracked | Add cookie jar logging to HTTP service | V2 |
|
||||
| **Aggregated/Derived** |
|
||||
| Time-of-day distribution | partial | Timestamps on all events | No aggregation table | Batch job: hour-of-day histogram → AttackerAggregate | V2 |
|
||||
| Session duration dist | partial | SessionProfile would have duration | No SessionProfile table yet | Implement SessionProfile + duration stats | V2 |
|
||||
| Recon-to-action ratio | partial | AttackerBehavior.phase_sequence | No per-attacker ratio column | Compute ratio in profiler; store in AttackerAggregate | V2 |
|
||||
| Lateral movement style | not_captured | Correlation engine has traversal path | No traversal pattern analysis | Extend engine to compute dwell time + fan-out metrics | V2 |
|
||||
| Persistence-first vs. exfil | not_captured | No persistence event taxonomy | Needs event-type classification | Add PERSISTENCE_EVENT_TYPES; compute timings | V2 |
|
||||
| Tool-chain ordering | partial | tool_guesses list exists; unordered | No temporal ordering | Sort by first-event timestamp; build transition graph | V2 |
|
||||
| Error-response psych | not_captured | No success/failure event tagging | Requires per-command outcome tracking | Extend service events with status=success/failure | V2 |
|
||||
|
||||
---
|
||||
|
||||
## Pre-v1 Capture Gaps (Actionable, Blocky)
|
||||
|
||||
**Only tackle these if the signal is committed to the v1 roadmap:**
|
||||
|
||||
1. **KEX algorithm ordering** (ssh-transport)
|
||||
- **Action**: Add `AttackerBehavior.kex_order_raw` (MEDIUMTEXT, JSON list of algorithm strings).
|
||||
- **Effort**: 2 hrs (schema + sniffer event parser + profiler aggregator).
|
||||
- **Blocker?**: Only if roadmap demands full KEX analysis (currently only HASSH hash is promised).
|
||||
|
||||
2. **Per-keystroke timing ingestion** (keyboard/human)
|
||||
- **Action**: Create `SessionProfile` table (design in DEVELOPMENT_V2.md); stub write path with all NULLs.
|
||||
- **Effort**: 4 hrs (schema + migration + DAL).
|
||||
- **Blocker?**: Yes, if keystroke dynamics is v1 roadmap. Data exists on disk but is not queryable.
|
||||
|
||||
3. **SSH client banner capture** (ssh-transport)
|
||||
- **Action**: Extend sniffer to parse SSH banners from TCP stream before TLS; emit ssh_client_hello event.
|
||||
- **Effort**: 3 hrs (TCP stream parser + sniffer integration).
|
||||
- **Blocker?**: Yes, if full SSH client profiling is v1 roadmap (currently only server banner via HASSH).
|
||||
|
||||
4. **TCP options raw extraction** (network/transport)
|
||||
- **Action**: Extend `tcp_fingerprint` JSON to include raw options list (not just signature string).
|
||||
- **Effort**: 1 hr (minimal schema change + sniffer parser).
|
||||
- **Blocker?**: No (options_sig is good enough for current p0f-style fingerprinting; nice-to-have).
|
||||
|
||||
---
|
||||
|
||||
## Non-Capturable Signals (Explicit Deferral)
|
||||
|
||||
These require vantage-point changes or are architecturally infeasible:
|
||||
|
||||
| Signal | Why | Vantage Point Needed |
|
||||
|--------|-----|----------------------|
|
||||
| LANG / LC_ALL | Server locale is fixed; attacker's client locale invisible over SSH | Client-side instrumentation |
|
||||
| HTTP/2 SETTINGS frame order | Encrypted inside TLS stream | Server-side decryption or key log |
|
||||
| HTTP/2 stream prioritization | Encrypted | Server-side decryption |
|
||||
| Initial congestion window (CWND) | Requires detailed TCP ACK-clock tracking | Per-packet sniffer instrumentation |
|
||||
| Packet pacing (μs resolution) | Requires hardware-timestamped PCAP or kernel hooks | OS-level instrumentation |
|
||||
| Hold time / pressure / velocity (typing biometrics) | Not on SSH wire | Client-side TLS instrumentation |
|
||||
|
||||
---
|
||||
|
||||
## Summary for v1 Release
|
||||
|
||||
**Ship with these (already captured, queryable)**:
|
||||
- HASSH/HASSHServer ✓
|
||||
- JA3/JA3S/JA4/JA4S ✓
|
||||
- TLS session resumption ✓
|
||||
- TCP fingerprint (window, wscale, mss, options_sig) ✓
|
||||
- Behavioral timing stats (mean/median/stdev IAT) ✓
|
||||
- Phase sequencing (recon_end, exfil_start) ✓
|
||||
- Tool attribution (beacon timing + headers) ✓
|
||||
|
||||
**Data exists on disk, not queryable (v1 deferral acceptable)**:
|
||||
- Per-keystroke timing (asciinema day-shards) — needs SessionProfile ingestion job
|
||||
- SSH client banner (TCP stream) — needs sniffer enhancement
|
||||
- KEX algorithm order (syslog) — needs AttackerBehavior.kex_order_raw column
|
||||
|
||||
**Requires infrastructure changes (v2+)**:
|
||||
- Lateral movement graph analysis
|
||||
- HTTP header order + cookie jar behavior
|
||||
- Persistence-first vs. exfil-first classification
|
||||
- Error-response psychology
|
||||
- Chronotyping + session duration distribution
|
||||
|
||||
---
|
||||
|
||||
## Federation & Cross-Operator Gossip (v2 Implications)
|
||||
|
||||
The `SessionProfile` schema (table, schema_version field, numeric features) is designed to be the federation wire format. **No changes needed for v1**, but ensure schema_version is in the table definition from day one so gossip compatibility is straightforward in v2.
|
||||
|
||||
---
|
||||
|
||||
## Appendices
|
||||
|
||||
### A. Code Paths Audited
|
||||
|
||||
- `decnet/sniffer/fingerprint.py` — TLS + TCP fingerprinting engine
|
||||
- `decnet/services/ssh.py` — SSH service config + artifact paths
|
||||
- `decnet/prober/hassh.py` — HASSHServer computation
|
||||
- `decnet/web/db/models.py` — SQL schema (Attacker, AttackerBehavior, etc.)
|
||||
- `decnet/profiler/behavioral.py` — Timing + tool attribution
|
||||
- `decnet/correlation/parser.py` — RFC 5424 syslog ingestion
|
||||
- `decnet/templates/ssh/` — Session recording (asciinema), syslog bridge, capture.sh
|
||||
|
||||
### B. Storage Destinations Verified
|
||||
|
||||
- **Database**: SQLite/MySQL tables (Attacker, AttackerBehavior, Bounty, Log)
|
||||
- **Syslog**: RFC 5424 events (parsed by correlation engine, optionally piped to ELK)
|
||||
- **Disk**: Asciinema day-shards (`/var/lib/decnet/session_recordings/`), raw PCAP (retention TBD)
|
||||
- **Memory**: Sniffer state (sessions, flows, dedup cache) — lost on restart unless replayed from PCAP
|
||||
|
||||
### C. Roadmap Cross-Reference
|
||||
|
||||
- DEVELOPMENT.md lines 48–133: Attacker Intelligence Collection (TLS, behavioral, protocol fingerprinting, network topology, geolocation, service-level, aggregated).
|
||||
- `[x]` JA3/JA3S, JA4+, JARM, session resumption, TCP window/scaling, retransmits, beaconing, data exfil timing, HASSH/HASSHServer, HTTP/2 fingerprint, TLS session resumption, TTL values (partial), TCP stack fingerprinting.
|
||||
- `[ ]` (not v1): ISN patterns, HTTP header ordering, QUIC, DNS, IPv6/mDNS leakage, geolocation, service-level commands, credential reuse, payload signatures.
|
||||
|
||||
- DEVELOPMENT_V2.md: Keystroke dynamics, session profiling, federation.
|
||||
- SessionProfile schema (lines 71–104) — not yet implemented; ready-to-implement design.
|
||||
- Correlation via simhash (lines 50–56) — digraph rhythm fingerprinting.
|
||||
|
||||
---
|
||||
|
||||
450
development/THREAT_MODEL.md
Normal file
450
development/THREAT_MODEL.md
Normal file
@@ -0,0 +1,450 @@
|
||||
# DECNET Threat Model
|
||||
|
||||
## Purpose
|
||||
|
||||
This document is the single source of truth for **what threats DECNET
|
||||
defends against, what it accepts, and what it considers out of scope.**
|
||||
|
||||
Its role is to provide a **stop line** for design discussions: once a
|
||||
threat is recorded here with a status, it does not need to be
|
||||
re-litigated in every feature review. New threats get added; existing
|
||||
ones get re-classified if reality changes; nothing gets deleted without
|
||||
a note in the change log.
|
||||
|
||||
## Methodology — STRIDE per-element
|
||||
|
||||
We use STRIDE-per-element (threats-per-element variant), organized by
|
||||
**trust boundary**. Each major component gets:
|
||||
|
||||
1. A **data-flow diagram (DFD)** showing external entities, processes,
|
||||
data stores, and the trust boundaries that separate them.
|
||||
2. A per-flow **STRIDE enumeration** — for each data flow crossing a
|
||||
trust boundary, identify threats in each of the six categories:
|
||||
|
||||
| Code | Category | Violates |
|
||||
|------|----------|----------|
|
||||
| S | Spoofing | Authentication |
|
||||
| T | Tampering | Integrity |
|
||||
| R | Repudiation | Non-repudiation |
|
||||
| I | Information disclosure | Confidentiality |
|
||||
| D | Denial of service | Availability |
|
||||
| E | Elevation of privilege | Authorization |
|
||||
|
||||
3. **Mitigation status** for each threat, chosen from:
|
||||
|
||||
- **Mitigated** — defended in code; link to the mitigation.
|
||||
- **Accepted** — the risk is known and deliberately accepted; note
|
||||
the reason.
|
||||
- **Transferred** — responsibility lies elsewhere (OS, upstream
|
||||
library, operator deployment practice).
|
||||
- **Needs verification** — plausibly mitigated but the threat model
|
||||
author couldn't confirm in code; flag for review.
|
||||
- **Out of scope** — explicitly excluded (see the master
|
||||
out-of-scope register).
|
||||
|
||||
## Risk-acceptance protocol
|
||||
|
||||
Accepting a risk is a deliberate act with a written justification. An
|
||||
"accepted" entry must include:
|
||||
|
||||
- **Why** the risk is accepted (cost/benefit, compensating control
|
||||
elsewhere, low likelihood × low impact).
|
||||
- **When** the acceptance should be revisited (e.g. "reassess when
|
||||
multi-tenant support lands" or "revisit pre-v1").
|
||||
- **Who** observed and accepted it (by git commit author on this file —
|
||||
no hand-waving).
|
||||
|
||||
---
|
||||
|
||||
## System context
|
||||
|
||||
DECNET is a distributed honeypot platform. The top-level actors and
|
||||
trust boundaries:
|
||||
|
||||
```
|
||||
┌─────────────────────────┐
|
||||
│ External Attacker │
|
||||
│ (internet, untrusted) │
|
||||
└─────────────┬───────────┘
|
||||
│ TCP/IP (MACVLAN)
|
||||
▼
|
||||
── TRUST BOUNDARY: attacker ↔ decoy ──────────────────────────────
|
||||
│
|
||||
┌─────────────▼───────────┐
|
||||
│ Decky (honeypot) │
|
||||
│ service containers │
|
||||
└─────────────┬───────────┘
|
||||
│ RFC 5424 syslog
|
||||
│ (local: UDP; cross-host: TLS 6514)
|
||||
▼
|
||||
── TRUST BOUNDARY: decky ↔ master (log ingest) ────────────────────
|
||||
│
|
||||
┌─────────────▼───────────┐ ┌──────────────┐
|
||||
│ Master host │◄────────┤ Swarm agent │
|
||||
│ ┌──────┐ ┌──────┐ │ mTLS │ (remote host)│
|
||||
│ │ API │ │Workers│ │ 6514 └──────────────┘
|
||||
│ │ Web │ │ + Bus │ │
|
||||
│ └──▲───┘ └──┬───┘ │
|
||||
│ │ │ │
|
||||
│ ┌──┴───┐ ┌──▼───┐ │
|
||||
│ │ DB │ │ Logs │ │
|
||||
│ └──────┘ └──────┘ │
|
||||
└────▲────────────────────┘
|
||||
│ HTTPS + JWT
|
||||
── TRUST BOUNDARY: dashboard user ↔ API ──────────────────────────
|
||||
│
|
||||
┌─────────────┴───────────┐
|
||||
│ Dashboard user │
|
||||
│ (viewer / admin role) │
|
||||
└─────────────────────────┘
|
||||
```
|
||||
|
||||
### Trust boundaries (top-level)
|
||||
|
||||
| # | Boundary | Component doc |
|
||||
|---|----------|---------------|
|
||||
| 1 | Attacker ↔ Decky (the whole point: attackers cross this by design) | *not yet modeled* |
|
||||
| 2 | Decky ↔ Master (syslog path) | *not yet modeled* |
|
||||
| 3 | Swarm agent ↔ Master (mTLS API) | *partially — see* `feedback_mtls_pin_per_host.md` |
|
||||
| 4 | Dashboard user ↔ API | **[Component 1](#component-1--dashboard-user--api)** ← this doc |
|
||||
| 5 | Bus client ↔ Bus (local IPC) | *not yet modeled* |
|
||||
| 6 | Updater daemon ↔ Update source | *not yet modeled* |
|
||||
| 7 | Federation peer ↔ Federation peer (v2) | *see* `DEVELOPMENT_V2.md` §Federation |
|
||||
|
||||
---
|
||||
|
||||
## Component 1 — Dashboard user ↔ API
|
||||
|
||||
**Status:** first component modeled; sets the template for the rest.
|
||||
**Scope:** everything the React dashboard sends to `/api/v1/*` and
|
||||
everything the API sends back. Out of scope for this component:
|
||||
master↔agent API, service-to-service calls within the master.
|
||||
|
||||
### DFD
|
||||
|
||||
```
|
||||
┌────────────────────────────────┐
|
||||
│ Dashboard user (browser) │
|
||||
│ React SPA, JWT in memory │
|
||||
└─────────────┬──────────────────┘
|
||||
│
|
||||
│ HTTPS (TLS to reverse proxy)
|
||||
│ JWT in Authorization header
|
||||
│ (exception: SSE uses ?token=<jwt>)
|
||||
│
|
||||
══ TRUST BOUNDARY ═══════════════│═══════════════════════════════════
|
||||
│
|
||||
┌─────────────▼──────────────────┐
|
||||
│ FastAPI app (decnet api) │
|
||||
│ ┌─────────────────────────┐ │
|
||||
│ │ Auth middleware / JWT │ │
|
||||
│ │ decode + role extract │ │
|
||||
│ └───────────┬─────────────┘ │
|
||||
│ │ authenticated │
|
||||
│ ┌───────────▼─────────────┐ │
|
||||
│ │ Dependencies: │ │
|
||||
│ │ require_viewer │ │
|
||||
│ │ require_admin │ │
|
||||
│ │ require_master_mode │ │
|
||||
│ └───────────┬─────────────┘ │
|
||||
│ │ authorized │
|
||||
│ ┌───────────▼─────────────┐ │
|
||||
│ │ Route handler │ │
|
||||
│ │ → repo (SQLModel) │ │
|
||||
│ │ → bus publish │ │
|
||||
│ │ → artifact filesystem │ │
|
||||
│ └─────────────────────────┘ │
|
||||
└────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Sub-flows in scope
|
||||
|
||||
| ID | Flow | Examples |
|
||||
|----|------|----------|
|
||||
| F1 | Authn | `POST /auth/login`, JWT issuance, `POST /auth/change-password` |
|
||||
| F2 | Authz | every route's `require_*` decoration; role checks at dependency layer |
|
||||
| F3 | Data reads (non-query) | `GET /attackers/{uuid}`, `GET /deckies/{name}`, `GET /health` |
|
||||
| F4 | Queries (user-filtered) | `GET /logs?service=&severity=&q=`, `GET /attackers?…`, `GET /bounties?…`, `GET /attackers/{uuid}/commands?service=&limit=&offset=` |
|
||||
| F5 | Mutations | `PATCH /deckies/*`, `POST /config/*`, `POST /users`, `DELETE /users/{u}`, `POST /topologies`, `POST /topologies/{id}/mutations` |
|
||||
| F6 | Streaming / SSE | `GET /stream/events?token=`, `GET /topologies/{id}/events?token=` |
|
||||
| F7 | Downloads | `GET /artifacts/{decky}/{stored_as}?service=` (ssh / smtp), `GET /attackers/{uuid}/mail` |
|
||||
|
||||
### STRIDE enumeration
|
||||
|
||||
Each sub-flow below gets its own table. Status codes:
|
||||
**M** = mitigated · **A** = accepted · **T** = transferred ·
|
||||
**?** = needs verification · **X** = out of scope.
|
||||
|
||||
#### F1 — Authn
|
||||
|
||||
| Cat | Threat | Status | Notes |
|
||||
|-----|--------|--------|-------|
|
||||
| S | Credential stuffing / brute force on `/auth/login` | M | slowapi two-bucket rate limit at `decnet/web/router/auth/api_login.py`: 10/5min per-IP AND 10/5min per-username, tripping either → 429. In-memory storage (`decnet/web/limiter.py`). |
|
||||
| S | JWT forgery with weak/leaked secret | M | `DECNET_JWT_SECRET` required, 32+ chars; signing verified on every request. Operator deployment responsibility to rotate on suspected leak. |
|
||||
| S | Stolen JWT replayed from attacker's browser | A | JWT TTL is short; no server-side session revocation pre-v1. Accepted: revisit if customer demands immediate-revocation. |
|
||||
| T | Password hash tampering in DB | T | DB integrity is OS/filesystem scope. See boundary #2 for syslog-path tampering. |
|
||||
| R | User denies having performed an action | M | Every mutation logged with actor UUID; audit trail lives in `logs` table. |
|
||||
| I | Password reflected in login response on failure | M | Single uniform 401 for user-not-found and bad-password at `api_login.py`. No user-existence oracle. |
|
||||
| I | JWT secret leaked via error message / stack trace | M | Generic `@app.exception_handler(Exception)` at `decnet/web/api.py` returns opaque `{detail, error_id}` on uncaught exceptions; traceback is logged server-side only. Dev-mode (`DECNET_DEVELOPER=True`) includes traceback in body for debugging. |
|
||||
| D | Bcrypt-cost DoS via long password submission | M | Pydantic `max_length=72` on all password fields in `decnet/web/db/models/auth.py` (matches bcrypt's internal truncation limit). |
|
||||
| E | `role=None` bypass (historical bug) | M | See memory `project_rbac_null_role.md`; fixed via centralized RBAC that treats `None` as unauthenticated. |
|
||||
|
||||
#### F2 — Authz
|
||||
|
||||
| Cat | Threat | Status | Notes |
|
||||
|-----|--------|--------|-------|
|
||||
| S | Forged role claim in JWT | M | Role read from DB by UUID on each authz, not trusted from token. (Verify — see `project_rbac_null_role.md`.) |
|
||||
| T | Client-side role flag tampering | M | Server-side gating required; client-side hide-only is UI polish. See `feedback_serverside_ui.md`. |
|
||||
| R | Admin denies granting a role | M | `update_user_role` calls logged. |
|
||||
| I | Route missing `require_*` accidentally exposes admin data to viewer | M | 401 half covered by `tests/api/test_schemathesis.py::test_auth_enforcement` (schemathesis + `ignored_auth` check on every operation). 403 half covered by `tests/api/test_rbac_contract.py`, which introspects every `APIRoute.dependant` at collection time, classifies each as admin/viewer/open via identity-match against the `require_admin`/`require_viewer` singletons, and asserts a viewer JWT receives 403 on admin routes and non-401/403 on viewer routes. SSE routes are skipped (covered separately under F6). |
|
||||
| D | n/a (authz is a check, not a bottleneck) | — | |
|
||||
| E | Viewer crafts path traversal in URL to hit admin route | M | FastAPI path matching is exact; no dynamic include. |
|
||||
| E | Master-only CLI command reachable in agent mode | M | `MASTER_ONLY_COMMANDS` gating at CLI registration + `_require_master_mode()` guard in handler. |
|
||||
|
||||
#### F3 — Data reads (non-query)
|
||||
|
||||
| Cat | Threat | Status | Notes |
|
||||
|-----|--------|--------|-------|
|
||||
| S | (same as F2) | — | |
|
||||
| T | Response body tampered in transit | T | TLS to reverse proxy is operator-deployment scope. |
|
||||
| R | n/a (read-only) | — | |
|
||||
| I | Non-existent resource returns different status than forbidden | M | Attacker-not-found returns 404 after authz passes, consistent with other handlers. |
|
||||
| I | Sensitive fields bleed into viewer response (e.g. attacker PII) | **?** | Verify: field allow-listing on attacker serializer for viewer role. |
|
||||
| D | Heavy single-resource fetch (rare) | A | Unbounded fetch on a single row is bounded by row size. Accepted. |
|
||||
| E | n/a (no privilege change) | — | |
|
||||
|
||||
#### F4 — Queries (densest threat surface)
|
||||
|
||||
| Cat | Threat | Status | Notes |
|
||||
|-----|--------|--------|-------|
|
||||
| S | (inherited from authn/authz) | — | |
|
||||
| T | SQL injection via filter params | M | SQLModel uses parameterized queries exclusively; no string-concatenation SQL in repo. Verify on each new query endpoint. |
|
||||
| T | ORM expression injection (e.g. sort-by-arbitrary-column) | M | Only one client-supplied sort key exists across the API: `sort_by` on `/attackers` (`api_get_attackers.py:59`), which is `Query(..., pattern="^(recent\|active\|traversals)$")`. The repo dispatch in `sqlmodel_repo.py:829-832` uses a dict lookup, not raw `order_by(getattr(...))`. No other route accepts a client-supplied column name. |
|
||||
| R | Query log does not record who queried what | A | Pre-v1: query audit log out of scope. Revisit if customer demands query-level audit. |
|
||||
| I | Filter-bypass exfiltration: viewer filters return admin-visible rows | **?** | Verify: repo methods take the caller's role and scope results, OR routes pre-filter, OR data is viewer-safe by schema. Currently assumed "viewer-safe by schema" — worth asserting in a test. |
|
||||
| I | Timing side channel reveals existence of filtered-out rows | A | Micro-timing attacks on SQLite not a realistic threat for this workload. Accepted. |
|
||||
| I | Error message (422 / 500) leaks column names or SQL fragments | M | FastAPI 422 is schema-shaped; 500 handler must not return tracebacks in prod. Verify handler config. |
|
||||
| I | Schema enumeration via schemathesis-style fuzzing | A | Schemathesis contract tests document 400/422 shape; an attacker learning the schema gains nothing beyond the public OpenAPI spec. See `feedback_schemathesis_400.md`. |
|
||||
| D | Unbounded result set via missing `limit` | M | Every query endpoint declares `limit: int = Query(..., le=N)` at the FastAPI layer — `/logs`, `/attackers`, `/bounties`, `/attacker-commands`, `/topologies/{id}` (`le=1000`), `/topologies` (`le=500`), `/transcripts` (`le=5000`). Cap enforced at pydantic validation, before the handler runs. |
|
||||
| D | Deep-pagination scan via large `offset` | M | Every `offset` param is `Query(0, ge=0, le=2147483647)` (INT32 max). At that scale SQLite returns empty immediately once rows exhaust; the point is to keep callers within a range the indexer can skip cheaply. `api_get_transcript.py:147` and `api_list_topologies.py:29` brought in line 2026-04-24. |
|
||||
| D | Expensive `LIKE '%foo%'` on non-indexed column | A | See DA-09. `/logs?search=` LIKE-scans four columns on the unbounded logs table; `/attackers?search=` LIKE-scans `attacker.ip`. Both routes are admin-gated. Cost-to-caller is bounded by `limit ≤ 1000` and by operator-level reverse-proxy rate limiting (see DA-04). Performance upgrade to FTS5 is tracked separately; within the current admin-trust model the cost is acceptable. |
|
||||
| D | Repeated expensive queries from single user | A | Per-user rate limiting is out of scope pre-v1. Operator-deployment mitigation: reverse-proxy rate limit. |
|
||||
| E | Filter params allow reading across tenants (future multi-tenant) | X | Multi-tenant is not in the v1 model; revisit when tenants exist. |
|
||||
|
||||
#### F5 — Mutations
|
||||
|
||||
| Cat | Threat | Status | Notes |
|
||||
|-----|--------|--------|-------|
|
||||
| S | Forged mutation from non-authenticated client | M | `require_admin` on all mutations; JWT enforced. |
|
||||
| T | Replay of a captured mutation request | A | No nonce/idempotency-key pre-v1. Accepted: admin role already has full mutation power; replay gains nothing a fresh request couldn't. Revisit if multi-admin audit becomes a requirement. |
|
||||
| T | Concurrent-write race corrupting state | **?** | Verify: SQLModel session scoping + DB-level constraints cover the likely races (user creation, topology CRUD). |
|
||||
| R | Admin denies having mutated | M | Actor UUID + timestamp logged on every mutation. |
|
||||
| I | Mutation response returns internal state not meant for client | M | Every mutation route that returns a dict-shaped body now pins `response_model=...` at the decorator: `MessageResponse` for `{"message": ...}` envelopes, purpose-built models (`DeployResponse`, `PurgeResponse`, `ReapReportResponse`, `UserResponse`) for richer shapes. FastAPI strips undocumented extra fields at serialization time, so a handler that accidentally returned a full user row (including `password_hash`) would only ship declared fields. `Response`/`ORJSONResponse` routes bypass response_model intentionally and are audited individually. |
|
||||
| D | Malformed body triggers expensive validation / oversized payload | M | FastAPI enforces content-length at ASGI layer; Pydantic short-circuits on type mismatch. |
|
||||
| D | Destructive mutation storm (e.g. delete-all-users) | A | Admin role is trusted; protecting admins from themselves is out of scope. |
|
||||
| E | Mutation bypasses role check via missing `require_admin` | M | `tests/api/test_rbac_contract.py::test_admin_route_rejects_viewer` parametrizes every route classified admin by FastAPI-dependency introspection (identity-match on the `require_admin` closure) and asserts viewer JWT → 403. A missing `require_admin` would reclassify the route away from "admin" and break the viewer route's non-403 assertion, so the check is bidirectional. |
|
||||
|
||||
#### F6 — Streaming / SSE
|
||||
|
||||
| Cat | Threat | Status | Notes |
|
||||
|-----|--------|--------|-------|
|
||||
| S | Token-in-query-string logged by reverse proxy / browser history | A | SSE cannot use Authorization header; `?token=<jwt>` is the standard workaround. Mitigation: short JWT TTL, operator must scrub access logs if compliance requires. Document explicitly. |
|
||||
| T | Injected events into the stream from another client | M | Events are repo→bus→SSE one-way; no client-to-client. |
|
||||
| R | User denies having observed events | X | Passive read; non-repudiation n/a. |
|
||||
| I | SSE forwards events the user's role shouldn't see | M | Both SSE streams are viewer-safe by construction. `/stream` (`api_stream_events.py:59`) emits `logs`/`stats`/`histogram` — same data reachable via viewer-gated REST (`/logs`, `/stats`). `/topologies/{id}/events` (`api_events.py:59`) emits `snapshot`/`status`/`mutation.{state}` — mutation metadata is already viewer-readable via `/topologies/{id}/mutations`; status is viewer-readable via `/topologies/{id}`. Both handlers carry a docstring invariant: adding a new event family requires a threat-model review. Currently no admin-only field is emitted on either path. |
|
||||
| D | Connection exhaustion (hold many SSE connections open) | M | Per-user cap enforced via `decnet/web/sse_limits.py::sse_connection_slot`, wired into both SSE generators as their first `async with`. Default cap 5 per user UUID, overridable via `DECNET_SSE_MAX_PER_USER`. Exceeding the cap returns `429 Too Many Requests` before any stream data is yielded. Tested at `tests/api/test_sse_limits.py`. |
|
||||
| E | n/a | — | |
|
||||
|
||||
#### F7 — Downloads
|
||||
|
||||
| Cat | Threat | Status | Notes |
|
||||
|-----|--------|--------|-------|
|
||||
| S | (inherited) | — | |
|
||||
| T | Path-traversal via `{decky}` or `{stored_as}` to read arbitrary files | M | Pattern-validated at FastAPI layer (`{service}` is `^[a-z]{1,16}$`; artifact names are UUID-shaped) AND containment-checked in `_resolve_artifact_path` at `decnet/web/router/artifacts/api_get_artifact.py:48-64` (both root and candidate are `.resolve()`d, then `root in candidate.parents` is asserted — defence-in-depth against symlinks). |
|
||||
| R | Admin denies having downloaded | M | Download endpoint emits an access log entry. |
|
||||
| I | Viewer accesses attacker-controlled bytes | M | Admin-gated (`require_admin`). Rationale: artifacts are phishing kits / malware droppers / attacker-controlled content — see `api_get_attacker_mail.py` docstring. |
|
||||
| I | MIME sniffing / content-type confusion executes attacker payload in browser | M | `FileResponse` at `decnet/web/router/artifacts/api_get_artifact.py:87` sets both `Content-Disposition: attachment; filename="..."` and `X-Content-Type-Options: nosniff` explicitly (not relying on Starlette's default, which only emits `attachment` for non-ASCII filenames). |
|
||||
| D | Gigabyte-sized artifact download ties up workers | M | SMTP body cap is 10 MB (EHLO SIZE enforcement); SSH artifact sizes bounded by disk quota. |
|
||||
| E | Downloaded artifact escapes the browser sandbox | T | Browser security boundary is transferred to the browser vendor and operator's endpoint protection. |
|
||||
|
||||
### Accepted risks (Dashboard ↔ API)
|
||||
|
||||
Consolidated for easy reference:
|
||||
|
||||
| ID | Threat | Why accepted | Revisit when |
|
||||
|----|--------|--------------|--------------|
|
||||
| DA-01 | Stolen JWT replayable until TTL expiry | Server-side revocation list is infra cost disproportionate to v1 threat model | Customer demands immediate revocation, OR swarm-scale deployment where JWT theft blast radius grows |
|
||||
| DA-02 | Query-level audit log absent | Admin-mutation audit is sufficient pre-v1 | Regulated-industry customer engagement |
|
||||
| DA-03 | Query-filter timing side channel | SQLite + single-tenant; impact is negligible | Multi-tenant support lands |
|
||||
| DA-04 | Per-user query rate limiting absent | Trusted operator deployment; reverse-proxy rate limit is the operator's responsibility | SaaS / multi-tenant hosting model |
|
||||
| DA-05 | Mutation replay within admin session | Replay grants no privilege a fresh request wouldn't | Multi-admin audit requirement |
|
||||
| DA-06 | Destructive admin mutations not protected against the admin | Trusted-admin assumption; protecting root from root is out of scope | Multi-admin RBAC with mutual-approval workflows |
|
||||
| DA-07 | SSE token in query string | No alternative in the SSE spec; operator must control access-log handling | Move to WebSocket with in-band auth |
|
||||
| DA-08 | Reverse-proxy deployments collapse per-IP rate-limit bucket to one shared bucket | `X-Forwarded-For` is spoofable by any client; trusting it defeats the rate limit. Operators behind a proxy get coarser granularity but no spoofing lane. | Verified-proxy config lands (allow-list of proxy IPs whose `X-Forwarded-For` we trust) |
|
||||
| DA-09 | Admin-initiated `LIKE '%q%'` scan on `/logs` or `/attackers` ties up a worker for the duration of the scan on a large dataset | Both routes are admin-gated; the admin role already carries DA-06 (protecting admins from themselves is out of scope). `limit ≤ 1000` caps the result page size, and per-user rate-limiting is operator-scope per DA-04. FTS5 is a performance upgrade, not a security change, under the current trust model. | Logs table growth causes operator-observable latency on the LIKE path, OR trust model changes (multi-tenant / SaaS / untrusted-admin delegation) |
|
||||
|
||||
### Needs-verification checklist (Dashboard ↔ API)
|
||||
|
||||
Drop-in TODO list — each entry resolves to either "mitigated, link to
|
||||
code" or "accepted, add to table above."
|
||||
|
||||
- [x] ~~Per-IP / per-user rate limit on `/auth/login`.~~ Shipped — see F1/S row.
|
||||
- [x] ~~Uniform "invalid credentials" on login failure (no user-existence oracle).~~ Verified — see F1/I row.
|
||||
- [x] ~~Production error handler suppresses tracebacks and internal details.~~ Shipped — generic `@app.exception_handler(Exception)` in `decnet/web/api.py`; opaque `{detail, error_id}` in prod, traceback only under `DECNET_DEVELOPER=True`.
|
||||
- [x] ~~`detail=str(e)` / `detail=f"…{e}"` sites in `decnet/web/router/fleet/api_deploy_deckies.py:41,67,83,155`.~~ Audited 2026-04-24: L41 + L83 are deliberate `ValueError` messages from `load_ini_from_string` / `build_deckies_from_ini` (user-authored INI validator feedback, not internal state); L67/73 wraps `detect_subnet`'s `RuntimeError` with a remediation hint (`"Add a [general] section with interface=, net=, and gw="`); L155 aggregates structured `DispatchResult.detail` fields from swarm workers, not raw exceptions. All four sites are admin-gated. No sanitization needed.
|
||||
- [x] ~~Password length clamp before bcrypt.~~ Verified — Pydantic `max_length=72`.
|
||||
- [x] ~~Contract test asserting every protected route returns 401 unauthenticated and 403 for under-roled.~~ 401 half: `tests/api/test_schemathesis.py::test_auth_enforcement` (schemathesis + `ignored_auth`). 403 half: `tests/api/test_rbac_contract.py` (server-side dependency introspection + viewer JWT per route). Role hints deliberately kept out of the OpenAPI spec — classification stays server-side.
|
||||
- [ ] Field allow-list on viewer responses for attacker / user / bounty serializers.
|
||||
- [x] ~~Sort/filter query keys are allow-listed, not passed through raw.~~ Only one client-supplied sort key in the API (`sort_by` on `/attackers`), pattern-validated at `api_get_attackers.py:59`; repo dispatch is dict-lookup. No other route accepts a column name.
|
||||
- [ ] Role-scoped repo methods OR per-route pre-filter for viewer queries (pick one, document it).
|
||||
- [x] ~~Every query endpoint has a server-side hard cap independent of `limit`.~~ All 7 query endpoints declare `Query(..., le=N)` at the FastAPI layer; enforced pre-handler.
|
||||
- [x] ~~`offset` is capped OR pagination is cursor-based OR deep-offset is cheap.~~ Every `offset` now uses `le=2147483647` (`api_list_topologies.py:29` and `api_get_transcript.py:147` brought in line 2026-04-24; others already capped).
|
||||
- [x] ~~Free-text `q` parameters hit an indexed/FTS5 column, never a full-table `LIKE` scan.~~ Moved to accepted risk **DA-09** — admin-only surface, `limit` capped, operator rate-limit applies. Revisit if logs-table LIKE latency becomes operator-observable OR if the trust model changes (multi-tenant / SaaS).
|
||||
- [x] ~~Per-route response_model shape audit on mutations.~~ Every dict-returning mutation now declares `response_model=...`. `MessageResponse` covers the 8 `{"message": ...}` envelopes; `DeployResponse`/`PurgeResponse`/`ReapReportResponse`/`UserResponse` cover the richer shapes. 204-No-Content routes and manual `Response`/`ORJSONResponse` routes are explicitly scoped out (no body to validate).
|
||||
- [x] ~~Contract test asserting every mutation route returns 403 for viewer.~~ Covered by `test_rbac_contract.py` (same test also covers read routes — classification is by dependency, not HTTP verb).
|
||||
- [x] ~~SSE handler applies per-connection role filter before forwarding events.~~ Viewer-safe by construction on both streams — every event type on `/stream` and `/topologies/{id}/events` wraps data already reachable via viewer-gated REST. Handler docstrings now carry the invariant: new event families require a threat-model review.
|
||||
- [x] ~~Per-user concurrent SSE connection cap.~~ `decnet/web/sse_limits.py::sse_connection_slot` gates both SSE generators; default 5 per user UUID, `DECNET_SSE_MAX_PER_USER` override, 429 on overflow. Tests at `tests/api/test_sse_limits.py`.
|
||||
- [x] ~~Artifact download sets `Content-Disposition: attachment` + `X-Content-Type-Options: nosniff`.~~ Shipped — explicit headers on `FileResponse` in `api_get_artifact.py`; asserted in `tests/api/artifacts/test_get_artifact.py::test_content_disposition_is_attachment`.
|
||||
- [x] ~~Artifact path resolution asserts the resolved path is under the artifacts root (canonicalize + prefix check).~~ Verified — `_resolve_artifact_path` at `api_get_artifact.py:48-64` resolves both sides and asserts `root in candidate.parents`.
|
||||
|
||||
### Out of scope (this component)
|
||||
|
||||
- TLS termination correctness (operator's reverse proxy).
|
||||
- Browser-side XSS originating from user-controlled content rendered in the dashboard (that's a frontend threat model, separate document when we write one).
|
||||
- Physical access to the master host.
|
||||
- Supply-chain compromise of FastAPI / SQLModel / dependencies (upstream / OS scope).
|
||||
- Denial of service at the network layer (operator deployment).
|
||||
|
||||
---
|
||||
|
||||
## Master out-of-scope register
|
||||
|
||||
These threats are excluded from the DECNET threat model entirely,
|
||||
regardless of component:
|
||||
|
||||
- **Physical attacker at the master or agent console.** Disk
|
||||
encryption, console access, BMC/iLO security is the operator's
|
||||
responsibility.
|
||||
- **Nation-state zero-days in Linux kernel / systemd / Docker.**
|
||||
- **Upstream supply-chain compromise of Python packages or base images**
|
||||
beyond what `pip-audit` + the pre-commit hook catches.
|
||||
- **Side channels at the hardware level** (Spectre, Rowhammer, etc.).
|
||||
- **Attacks on the operator's own endpoint** (laptop used to access the
|
||||
dashboard).
|
||||
|
||||
## Master accepted-risks register
|
||||
|
||||
*(Consolidates per-component accepted entries as they are added.)*
|
||||
|
||||
| Component | ID | Summary |
|
||||
|-----------|----|---------|
|
||||
| Dashboard↔API | DA-01..DA-09 | See component section. |
|
||||
| DECNET↔Webhook destination | WH-01..WH-03 | See component section. |
|
||||
|
||||
---
|
||||
|
||||
## Component 2 — DECNET ↔ External webhook destination
|
||||
|
||||
**Status:** modeled alongside the webhook MVP (2026-04-24).
|
||||
**Scope:** outbound HTTP POSTs from the `decnet webhook` worker to an
|
||||
operator-configured URL (typically Shuffle / TheHive / Wazuh / n8n).
|
||||
In scope: the data crossing the master→receiver boundary, the signing
|
||||
& secret storage, and the failure behavior of the egress path. Out of
|
||||
scope: the receiver's own security posture, anything downstream of
|
||||
the receiver (Shuffle→Slack, TheHive→Cortex, …).
|
||||
|
||||
### DFD
|
||||
|
||||
```
|
||||
Master host
|
||||
┌─────────────────────────────────────┐
|
||||
│ ┌────────────────────┐ │
|
||||
│ │ WebhookSubscription│ (DB row) │
|
||||
│ │ url, secret, │ │
|
||||
│ │ topic_patterns │ │
|
||||
│ └─────────┬──────────┘ │
|
||||
│ │ read │
|
||||
│ ┌─────────▼────────┐ bus events │
|
||||
│ │ decnet webhook │◄──── bus ◄─── other workers (attacker.*, decky.*, system.*)
|
||||
│ │ worker │ │
|
||||
│ └─────────┬────────┘ │
|
||||
│ │ HMAC-signed POST │
|
||||
└───────────│─────────────────────────┘
|
||||
│
|
||||
══ TRUST BOUNDARY ═══════════════════════════════════
|
||||
│
|
||||
▼
|
||||
External receiver (Shuffle / TheHive / Wazuh / n8n / ...)
|
||||
```
|
||||
|
||||
### STRIDE enumeration
|
||||
|
||||
| Cat | Threat | Status | Notes |
|
||||
|-----|--------|--------|-------|
|
||||
| S | Receiver accepts a forged event impersonating DECNET | M | Every POST carries `X-DECNET-Signature: sha256=<hex>` computed with HMAC-SHA256 over the canonical body (orjson with sorted keys); per-subscription secret. Receiver recomputes + compares. See `decnet/webhook/client.py::sign`. |
|
||||
| S | Attacker controls a webhook URL the admin added and forges callbacks back to DECNET | X | DECNET does not accept inbound webhook POSTs; only egress. Receiver→DECNET is not a surface in this component. |
|
||||
| T | Payload tampering in transit | T / M | TLS termination is the operator's responsibility (same stance as Dashboard↔API). If the URL is `http://` on a hostile network, the HMAC still detects tampering — a recomputed signature would fail on any altered byte. Operators MUST use `https://`; the router does not enforce this pre-v1 (see WH-01). |
|
||||
| T | Secret leak lets attackers forge events in-band | A | Secret rotation is a manual PATCH. In-flight window where a rotated secret is observed by both old + new verifiers is the operator's coordination problem. Encrypt-at-rest on the DB column is deferred — see DEBT-037 §7. |
|
||||
| R | DECNET denies having sent an event | M | `last_success_at` + `last_failure_at` stamps on the row; structured log per delivery with `event_id`. No persisted per-event audit log pre-v1 — see DEBT-037 §3. |
|
||||
| I | Secret leaks via API GET/LIST response | M | `WebhookResponse` deliberately omits the `secret` field. `WebhookCreateResponse` carries the secret exactly once on create for copy-out. PATCH-to-rotate, no read-back. |
|
||||
| I | Webhook URL + secret leak via DB dump | A | Plaintext at-rest on SQLite/MySQL. Same trust assumption as the JWT secret (which is env-sourced, not DB-stored). See WH-01 and DEBT-037 §7. |
|
||||
| I | Attacker-controlled event content reaches receiver | T | Event payloads pass through DECNET untransformed — the receiver must sanitize before rendering (e.g. XSS if Shuffle pipes to a browser-facing Slack block without escaping). Out of scope for the DECNET side. Document in operator docs. |
|
||||
| D | Slow / unreachable receiver ties up egress | M | Bounded concurrency (`Semaphore(10)`), per-delivery timeout (10s), and bounded retry (3 attempts, `[1,2,4]` × jitter) plus a circuit breaker: after `DECNET_WEBHOOK_CIRCUIT_THRESHOLD` (default 5) consecutive failures the worker auto-disables the subscription (`enabled=False`, `auto_disabled_at=<ts>`), publishes a reload signal, and stops consuming events for that sub. Operator re-enables via PATCH which clears the trip stamp and zeros the counter. See `decnet/webhook/worker.py::_safe_record_failure` + `sqlmodel_repo.py::trip_webhook_circuit`. |
|
||||
| D | Huge payload floods receiver | A | Payload shape is whatever the bus event carries; no per-destination batching / coalescing. On high-volume topics this is a known concern — see DEBT-037 §4 for post-MVP batch delivery. |
|
||||
| E | Viewer role manipulates webhook config | M | All CRUD routes under `/api/v1/webhooks` are `Depends(require_admin)`. Verified by `tests/api/test_rbac_contract.py` (every admin-classified route asserts viewer → 403). |
|
||||
| E | Admin adds a URL pointing at an internal-only DECNET service (SSRF-style) | A | Admin role is trusted; protecting admin from self-inflicted SSRF is out of scope under the current trust model. Revisit if we ever delegate subscription CRUD to a less-trusted role. |
|
||||
|
||||
### Accepted risks (DECNET↔Webhook)
|
||||
|
||||
| ID | Threat | Why accepted | Revisit when |
|
||||
|----|--------|--------------|--------------|
|
||||
| WH-01 | Webhook secret + URL stored plaintext in the DB | Matches the existing pre-v1 posture (JWT secret is env-sourced; there's no operator expectation that DB-at-rest is encrypted). Encrypting one column in isolation invents a KEK lifecycle we don't have. | Comprehensive DB-at-rest encryption lands, OR regulated-industry customer engagement. Tracked in DEBT-037 §7. |
|
||||
| ~~WH-02~~ | ~~Half-dead receiver wastes the full retry budget (1+2+4 ≈ 7s with jitter) per delivery before the worker gives up~~ | ~~Admin role is trusted…~~ | **Closed 2026-04-24 — circuit breaker shipped. Tripped sub is isolated after N failures; operator clears via PATCH. See D row above.** |
|
||||
| WH-03 | Admin configures an `http://` webhook URL; event body (incl. payload fields) travels plaintext on the wire | Operator-trust posture (same rationale as DA-06: protecting admin from self is out of scope). HMAC signature still detects tampering regardless of transport — only *read* confidentiality is lost. The API surfaces a non-blocking warning in `WebhookResponse.warnings` so the operator is informed on every GET/CREATE, and test/dev environments without TLS remain usable. | Multi-admin delegation lands, OR a regulated-industry customer engagement, OR an operator ticket asks for a `DECNET_WEBHOOK_REQUIRE_HTTPS=true` enforcement knob. |
|
||||
|
||||
### Needs-verification checklist (DECNET↔Webhook)
|
||||
|
||||
- [x] HMAC-SHA256 signing over canonical (orjson sorted-keys) body — verified by `tests/webhook/test_client.py::test_deliver_receiver_can_verify_signature`.
|
||||
- [x] Secret never leaks via GET/LIST response — `tests/api/webhooks/test_crud.py::test_list_strips_secret` + `::test_get_single_strips_secret`.
|
||||
- [x] Admin-only CRUD — inherited invariant from `test_rbac_contract.py`; new webhook routes auto-classified as admin.
|
||||
- [x] 4xx no-retry, 5xx/429/network retry — `tests/webhook/test_client.py::test_deliver_no_retry_on_4xx` + retry tests.
|
||||
- [x] Bounded concurrency + timeout per delivery — `Semaphore(10)` + 10s httpx timeout in `worker.py`.
|
||||
- [ ] Secret-field omission on the OpenAPI schema (not just the response body). Verify that `/openapi.json` shows `WebhookResponse` without `secret` so SDK consumers don't accidentally deserialize into a shape that expects it.
|
||||
- [x] ~~Reject `http://` URLs at admin time.~~ Resolved as **WH-03 accepted risk** — operator-trust posture, we warn rather than reject. `WebhookResponse.warnings` surfaces an `insecure_url` advisory on every GET/CREATE when the URL starts with `http://`. Tested at `tests/api/webhooks/test_crud.py::test_http_url_warns_but_accepts`.
|
||||
|
||||
### Out of scope (this component)
|
||||
|
||||
- The receiver's auth, storage, or downstream routing.
|
||||
- Post-MVP hardening (circuit breaker, dead-letter, batch, templates, at-rest encryption) — all tracked in DEBT-037.
|
||||
- Frontend UI for subscription CRUD — a separate commit series.
|
||||
|
||||
---
|
||||
|
||||
## Components not yet modeled
|
||||
|
||||
In priority order:
|
||||
|
||||
1. Decky ↔ Master (syslog path) — data-integrity critical.
|
||||
2. Swarm agent ↔ Master (mTLS) — existing pinning; document it.
|
||||
3. Federation peer ↔ Peer — see `DEVELOPMENT_V2.md` §Federation for
|
||||
analysis; migrate into this doc when v2 lands.
|
||||
4. Bus client ↔ Bus — local IPC, narrow surface.
|
||||
5. Updater daemon ↔ Update source.
|
||||
6. Decky itself (attacker-facing surface) — largest S/T/E surface; do
|
||||
this once the internal boundaries are modeled.
|
||||
|
||||
## Change log
|
||||
|
||||
| Date | Change | Author |
|
||||
|------|--------|--------|
|
||||
| 2026-04-23 | Initial scaffold. System context + Dashboard↔API as first worked component. | ANTI |
|
||||
| 2026-04-23 | F1 Authn: 3 threats moved from **?** to **M** (rate limit shipped; uniform 401 verified; bcrypt length clamp verified). Added DA-08 accepted risk: reverse-proxy per-IP bucket collapse. | ANTI |
|
||||
| 2026-04-23 | F1/I "traceback / stack trace leakage" moved from **?** to **M** via generic Exception handler with `error_id` correlation. Added follow-up checklist entry for `detail=str(e)` sites in fleet deploy router. | ANTI |
|
||||
| 2026-04-24 | F7: "MIME sniffing" moved from **?** to **M** (explicit `Content-Disposition`/`nosniff` headers + test). F7: "path-traversal" row reworded to point at the existing `_resolve_artifact_path` containment check. Fleet-deploy `detail=str(e)` audit resolved — all four sites documented as deliberate, admin-gated, no sanitization needed. | ANTI |
|
||||
| 2026-04-24 | F2/I + F5/E moved from **?** to **M** via new `tests/api/test_rbac_contract.py` — classifies every APIRoute by FastAPI-dependency introspection and asserts viewer JWT → 403 on admin routes, non-401/403 on viewer routes. Role hints deliberately omitted from OpenAPI spec. SSE routes skipped (F6 scope). | ANTI |
|
||||
| 2026-04-24 | F4/T (ORM sort injection), F4/D (unbounded `limit`), F4/D (deep `offset`) all moved from **?** to **M**. Limit caps were already universal; sort is pattern-validated on the only surface that exposes it; added `le=2147483647` to the two offset params that were unbounded (`api_list_topologies.py`, `api_get_transcript.py`). | ANTI |
|
||||
| 2026-04-24 | F5/I moved from **?** to **M** via `response_model=...` on every dict-returning mutation (`MessageResponse` + purpose-built models). F4/D "expensive `LIKE`" moved from **?** to **A** under new accepted risk DA-09 — admin-only surface, operator-scope rate limiting, `limit` cap. FTS5 kept as a performance TODO, not a security blocker. | ANTI |
|
||||
| 2026-04-24 | F6/I and F6/D both moved from **?** to **M**. F6/I: documented the viewer-safe-by-construction invariant for both SSE streams (every emitted event type wraps data already viewer-readable via REST). F6/D: added `decnet/web/sse_limits.py::sse_connection_slot` — per-user counter + async lock + 429 on overflow, wired into both SSE generators. `DECNET_SSE_MAX_PER_USER` env knob, default 5. | ANTI |
|
||||
| 2026-04-24 | Component 2 added — DECNET↔External webhook destination. Covers the new `decnet webhook` worker + `/api/v1/webhooks` admin CRUD. HMAC-SHA256 signing, 4xx no-retry + 5xx/429 retry with jittered backoff, admin-only CRUD, secret never leaks post-create. Two accepted risks registered (WH-01 secret at rest, WH-02 half-dead-receiver retry waste) paired with DEBT-037 pointers. | ANTI |
|
||||
| 2026-04-24 | WH-03 accepted risk added — `http://` webhook URLs are allowed (operator-trust posture) but surface an `insecure_url` advisory in `WebhookResponse.warnings`. Checklist item "reject http://" resolved as "warn, not reject" per explicit operator decision. | ANTI |
|
||||
| 2026-04-24 | WH-02 closed — circuit breaker shipped. After `DECNET_WEBHOOK_CIRCUIT_THRESHOLD` (default 5) consecutive failures, the worker auto-disables the subscription via `trip_webhook_circuit`, stamps `auto_disabled_at`, and fires a reload so no further events are consumed for it. Operator re-enables via PATCH which clears the trip. Closes DEBT-037 §1. | ANTI |
|
||||
1000
development/api-audit.md
Normal file
1000
development/api-audit.md
Normal file
File diff suppressed because it is too large
Load Diff
20
development/docker-compose.otel.yml
Normal file
20
development/docker-compose.otel.yml
Normal file
@@ -0,0 +1,20 @@
|
||||
# DECNET OpenTelemetry development stack.
|
||||
#
|
||||
# Start: docker compose -f development/docker-compose.otel.yml up -d
|
||||
# UI: http://localhost:16686 (Jaeger)
|
||||
# Stop: docker compose -f development/docker-compose.otel.yml down
|
||||
#
|
||||
# Then run DECNET with tracing enabled:
|
||||
# DECNET_DEVELOPER_TRACING=true decnet web
|
||||
|
||||
services:
|
||||
jaeger:
|
||||
image: jaegertracing/all-in-one:latest
|
||||
container_name: decnet-jaeger
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "4317:4317" # OTLP gRPC receiver
|
||||
- "4318:4318" # OTLP HTTP receiver
|
||||
- "16686:16686" # Jaeger UI
|
||||
environment:
|
||||
COLLECTOR_OTLP_ENABLED: "true"
|
||||
153
development/docs/ARCHITECTURE.md
Normal file
153
development/docs/ARCHITECTURE.md
Normal file
@@ -0,0 +1,153 @@
|
||||
# DECNET Technical Architecture: Deep Dive
|
||||
|
||||
This document provides a low-level technical decomposition of the DECNET (Deception Network) framework. It covers the internal orchestration logic, networking internals, reactive data pipelines, and the persistent intelligence schema.
|
||||
|
||||
---
|
||||
|
||||
## 1. System Topology & Micro-Services
|
||||
|
||||
DECNET is architected as a set of decoupled "engines" that interact via a persistent shared repository (SQLite/MySQL) and the Docker socket.
|
||||
|
||||
### Component Connectivity Graph
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "Infrastructure Layer"
|
||||
DK[Docker Engine]
|
||||
MV[MACVLAN / IPvlan Driver]
|
||||
end
|
||||
|
||||
subgraph "Identity Layer (Deckies)"
|
||||
B1[Base Container 01]
|
||||
S1a[Service: SSH]
|
||||
S1b[Service: HTTP]
|
||||
B1 --- S1a
|
||||
B1 --- S1b
|
||||
end
|
||||
|
||||
subgraph "Telemetry Layer"
|
||||
SNF[Sniffer Worker]
|
||||
COL[Log Collector]
|
||||
end
|
||||
|
||||
subgraph "Processing Layer"
|
||||
ING[Log Ingester]
|
||||
PROF[Attacker Profiler]
|
||||
end
|
||||
|
||||
subgraph "Persistence Layer"
|
||||
DB[(SQLModel Repository)]
|
||||
ST[decnet-state.json]
|
||||
end
|
||||
|
||||
DK --- MV
|
||||
MV --- B1
|
||||
|
||||
S1a -- "stdout/stderr" --> COL
|
||||
S1b -- "stdout/stderr" --> COL
|
||||
SNF -- "PCAP Analysis" --> COL
|
||||
|
||||
COL -- "JSON Tail" --> ING
|
||||
ING -- "Bounty Extraction" --> DB
|
||||
ING -- "Log Commit" --> DB
|
||||
|
||||
DB -- "Log Cursor" --> PROF
|
||||
PROF -- "Correlation Engine" --> DB
|
||||
PROF -- "Behavior Rollup" --> DB
|
||||
|
||||
ING -- "Events" --> WS[Web Dashboard / SSE]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Core Orchestration: The "Decky" Lifecycle
|
||||
|
||||
A **Decky** is a logical entity represented by a shared network namespace.
|
||||
|
||||
### The Deployment Flow (`decnet deploy`)
|
||||
1. **Configuration Parsing**: `DecnetConfig` (via `ini_loader.py`) validates the archetypes and service counts.
|
||||
2. **IP Allocation**: `ips_to_range()` calculates the minimal CIDR covering all requested IPs to prevent exhaustion of the host's subnet.
|
||||
3. **Network Setup**:
|
||||
- Calls `docker network create -d macvlan --parent eth0`.
|
||||
- Creates a host-side bridge (`decnet_macvlan0`) to fix the Linux bridge isolation issue (hairpin fix).
|
||||
4. **Logging Injection**: Every service container has `decnet_logging.py` injected into its build context to ensure uniform RFC 5424 syslog output.
|
||||
5. **Compose Generation**: `write_compose()` creates a dynamic `docker-compose.yml` where:
|
||||
- Service containers use `network_mode: "service:<base_container_name>"`.
|
||||
- Base containers use `sysctls` derived from `os_fingerprint.py`.
|
||||
|
||||
### Teardown & State
|
||||
Runtime state is persisted in `decnet-state.json`. Upon `teardown`, DECNET:
|
||||
1. Runs `docker compose down`.
|
||||
2. Deletes the host-side macvlan interface and routes.
|
||||
3. Removes the Docker network.
|
||||
4. Clears the CLI state.
|
||||
|
||||
---
|
||||
|
||||
## 3. Networking Internals: Passive & Active Fidelity
|
||||
|
||||
### OS Fingerprinting (TCP/IP Spoofing)
|
||||
DECNET tunes the networking behavior of each Decky within its own namespace. This is handled by the `os_fingerprint.py` module, which sets specific `sysctls` in the base container:
|
||||
- `net.ipv4.tcp_window_scaling`: Enables/disables based on OS profile.
|
||||
- `net.ipv4.tcp_timestamps`: Mimics specific OS tendencies (e.g., Windows vs. Linux).
|
||||
- `net.ipv4.tcp_syncookies`: Prevents OS detection via SYN-flood response patterns.
|
||||
|
||||
### The Packet Flow
|
||||
1. **Ingress**: Packet hits physical NIC -> MACVLAN Bridge -> Target Decky Namespace.
|
||||
2. **Telemetry**: The `Sniffer` container attaches to the same MACVLAN bridge in promiscuous mode. It uses scapy-like logic (via `decnet.sniffer`) to extract:
|
||||
- **JA3/JA4**: TLS ClientHello fingerprints.
|
||||
- **HASSH**: SSH Key Exchange fingerprints.
|
||||
- **JARM**: (Triggered actively) TLS server fingerprints.
|
||||
|
||||
---
|
||||
|
||||
## 4. Persistent Intelligence: Database Schema
|
||||
|
||||
DECNET uses an asynchronous SQLModel-based repository. The schema is optimized for both high-speed ingestion and complex behavioral correlation.
|
||||
|
||||
### Entity Relationship Model
|
||||
|
||||
| Table | Purpose | Key Fields |
|
||||
| :--- | :--- | :--- |
|
||||
| **logs** | Raw event stream | `id`, `timestamp`, `decky`, `service`, `event_type`, `attacker_ip`, `fields` |
|
||||
| **bounty** | Harvested artifacts | `id`, `bounty_type`, `payload` (JSON), `attacker_ip` |
|
||||
| **attackers** | Aggregated profiles | `uuid`, `ip`, `is_traversal`, `traversal_path`, `fingerprints` (JSON), `commands` (JSON) |
|
||||
| **attacker_behavior** | behavioral profile | `attacker_uuid`, `os_guess`, `behavior_class`, `tool_guesses` (JSON), `timing_stats` (JSON) |
|
||||
|
||||
### JSON Logic
|
||||
To maintain portability across SQLite/MySQL, DECNET uses the `JSON_EXTRACT` function for filtering logs by internal fields (e.g., searching for a specific HTTP User-Agent inside the `fields` column).
|
||||
|
||||
---
|
||||
|
||||
## 5. Reactive Processing: The Internal Pipeline
|
||||
|
||||
### Log Ingestion & Bounty Extraction
|
||||
1. **Tailer**: `log_ingestion_worker` tails the JSON log stream.
|
||||
2. **.JSON Parsing**: Every line is validated against the RFC 5424 mapping.
|
||||
3. **Extraction Logic**:
|
||||
- If `event_type == "credential"`, a row is added to the `bounty` table.
|
||||
- If `ja3` field exists, a `fingerprint` bounty is created.
|
||||
4. **Notification**: Logs are dispatched to active WebSocket/SSE clients for real-time visualization.
|
||||
|
||||
### Correlation & Traversal Logic
|
||||
The `CorrelationEngine` processes logs in batches:
|
||||
- **IP Grouping**: Logs are indexed by `attacker_ip`.
|
||||
- **Hop Extraction**: The engine identifies distinct `deckies` touched by the same IP.
|
||||
- **Path Calculation**: A chronological string (`decky-A -> decky-B`) is built to visualize the attack progression.
|
||||
- **Attacker Profile Upsert**: The `Attacker` table is updated with the new counts, path, and consolidated bounty history.
|
||||
|
||||
---
|
||||
|
||||
## 6. Service Plugin Architecture
|
||||
|
||||
Adding a new honeypot service is zero-configuration. The `decnet/services/registry.py` uses `pkgutil.iter_modules` to auto-discover any file in the `services/` directory.
|
||||
|
||||
### `BaseService` Interface
|
||||
Every service must implement:
|
||||
- `name`: Unique identifier (e.g., "ssh").
|
||||
- `ports`: Targeted ports (e.g., `22/tcp`).
|
||||
- `dockerfile_context()`: Path to the template directory.
|
||||
- `compose_service(name, base_name)`: Returns the Docker Compose fragment.
|
||||
|
||||
### Templates
|
||||
Templates (found in `/templates/`) contain the Dockerfile and entrypoint. The `deployer` automatically syncs `decnet_logging.py` into these contexts during build time to ensure logs are streamed correctly to the host.
|
||||
219
development/docs/TRACING.md
Normal file
219
development/docs/TRACING.md
Normal file
@@ -0,0 +1,219 @@
|
||||
# Distributed Tracing
|
||||
|
||||
OpenTelemetry (OTEL) distributed tracing across all DECNET services. Gated by the `DECNET_DEVELOPER_TRACING` environment variable (off by default). When disabled, zero overhead: no OTEL imports occur, `@traced` returns the original unwrapped function, and no middleware is installed.
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# 1. Start Jaeger (OTLP receiver on :4317, UI on :16686)
|
||||
docker compose -f development/docker-compose.otel.yml up -d
|
||||
|
||||
# 2. Run DECNET with tracing enabled
|
||||
DECNET_DEVELOPER_TRACING=true decnet web
|
||||
|
||||
# 3. Open Jaeger UI — service name is "decnet"
|
||||
open http://localhost:16686
|
||||
```
|
||||
|
||||
| Variable | Default | Purpose |
|
||||
|----------|---------|---------|
|
||||
| `DECNET_DEVELOPER_TRACING` | `false` | Enable/disable all tracing |
|
||||
| `DECNET_OTEL_ENDPOINT` | `http://localhost:4317` | OTLP gRPC exporter target |
|
||||
|
||||
## Architecture
|
||||
|
||||
The core module is `decnet/telemetry.py`. All tracing flows through it.
|
||||
|
||||
| Export | Purpose |
|
||||
|--------|---------|
|
||||
| `setup_tracing(app)` | Init TracerProvider, instrument FastAPI, enable log-trace correlation |
|
||||
| `shutdown_tracing()` | Flush and shut down the TracerProvider |
|
||||
| `get_tracer(component)` | Return an OTEL Tracer or `_NoOpTracer` when disabled |
|
||||
| `@traced(name)` | Decorator wrapping sync/async functions in spans (no-op when disabled) |
|
||||
| `wrap_repository(repo)` | Dynamic `__getattr__` proxy adding `db.*` spans to every async method |
|
||||
| `inject_context(record)` | Embed W3C trace context into a JSON record under `_trace` |
|
||||
| `extract_context(record)` | Recover trace context from `_trace` and remove it from the record |
|
||||
| `start_span_with_context(tracer, name, ctx)` | Start a span as child of an extracted context |
|
||||
|
||||
**TracerProvider config**: Resource(`service.name=decnet`, `service.version=0.2.0`), `BatchSpanProcessor`, OTLP gRPC exporter.
|
||||
|
||||
**When disabled**: `_NoOpTracer` and `_NoOpSpan` stubs are returned. No OTEL SDK packages are imported. The `@traced` decorator returns the original function object at decoration time.
|
||||
|
||||
## Pipeline Trace Propagation
|
||||
|
||||
The DECNET data pipeline is decoupled through JSON files and the database, which normally breaks trace continuity. Four mechanisms bridge the gaps:
|
||||
|
||||
1. **Collector → JSON**: `inject_context()` embeds W3C `traceparent`/`tracestate` into each JSON log record under a `_trace` key.
|
||||
2. **JSON → Ingester**: `extract_context()` recovers the parent context. The ingester creates `ingester.process_record` as a child span, preserving the collector→ingester parent-child relationship.
|
||||
3. **Ingester → DB**: The ingester persists the current span's `trace_id` and `span_id` as columns on the `logs` table before calling `repo.add_log()`.
|
||||
4. **DB → SSE**: The SSE endpoint reads `trace_id`/`span_id` from log rows and creates OTEL **span links** (FOLLOWS_FROM) on `sse.emit_logs`, connecting the read path back to the original ingestion traces.
|
||||
|
||||
**Log-trace correlation**: `_TraceContextFilter` (installed by `enable_trace_context()`) injects `otel_trace_id` and `otel_span_id` into Python `LogRecord` objects, bridging structured logs with trace context.
|
||||
|
||||
## Span Reference
|
||||
|
||||
### API Endpoints (20 spans)
|
||||
|
||||
| Span | Endpoint |
|
||||
|------|----------|
|
||||
| `api.login` | `POST /auth/login` |
|
||||
| `api.change_password` | `POST /auth/change-password` |
|
||||
| `api.get_logs` | `GET /logs` |
|
||||
| `api.get_logs_histogram` | `GET /logs/histogram` |
|
||||
| `api.get_bounties` | `GET /bounty` |
|
||||
| `api.get_attackers` | `GET /attackers` |
|
||||
| `api.get_attacker_detail` | `GET /attackers/{uuid}` |
|
||||
| `api.get_attacker_commands` | `GET /attackers/{uuid}/commands` |
|
||||
| `api.get_stats` | `GET /stats` |
|
||||
| `api.get_deckies` | `GET /fleet/deckies` |
|
||||
| `api.deploy_deckies` | `POST /fleet/deploy` |
|
||||
| `api.mutate_decky` | `POST /fleet/mutate/{decky_id}` |
|
||||
| `api.update_mutate_interval` | `POST /fleet/mutate-interval/{decky_id}` |
|
||||
| `api.get_config` | `GET /config` |
|
||||
| `api.update_deployment_limit` | `PUT /config/deployment-limit` |
|
||||
| `api.update_global_mutation_interval` | `PUT /config/global-mutation-interval` |
|
||||
| `api.create_user` | `POST /config/users` |
|
||||
| `api.delete_user` | `DELETE /config/users/{uuid}` |
|
||||
| `api.update_user_role` | `PUT /config/users/{uuid}/role` |
|
||||
| `api.reset_user_password` | `PUT /config/users/{uuid}/password` |
|
||||
| `api.reinit` | `POST /config/reinit` |
|
||||
| `api.get_health` | `GET /health` |
|
||||
| `api.stream_events` | `GET /stream` |
|
||||
|
||||
### DB Layer (dynamic)
|
||||
|
||||
Every async method on `BaseRepository` is automatically wrapped by `TracedRepository` as `db.<method_name>` (e.g. `db.add_log`, `db.get_attackers`, `db.upsert_attacker`).
|
||||
|
||||
### Collector
|
||||
|
||||
| Span | Type |
|
||||
|------|------|
|
||||
| `collector.stream_container` | `@traced` |
|
||||
| `collector.event` | inline |
|
||||
|
||||
### Ingester
|
||||
|
||||
| Span | Type |
|
||||
|------|------|
|
||||
| `ingester.process_record` | inline (with parent context) |
|
||||
| `ingester.extract_bounty` | `@traced` |
|
||||
|
||||
### Profiler
|
||||
|
||||
| Span | Type |
|
||||
|------|------|
|
||||
| `profiler.incremental_update` | `@traced` |
|
||||
| `profiler.update_profiles` | `@traced` |
|
||||
| `profiler.process_ip` | inline |
|
||||
| `profiler.timing_stats` | `@traced` |
|
||||
| `profiler.classify_behavior` | `@traced` |
|
||||
| `profiler.detect_tools_from_headers` | `@traced` |
|
||||
| `profiler.phase_sequence` | `@traced` |
|
||||
| `profiler.sniffer_rollup` | `@traced` |
|
||||
| `profiler.build_behavior_record` | `@traced` |
|
||||
| `profiler.behavior_summary` | inline |
|
||||
|
||||
### Sniffer
|
||||
|
||||
| Span | Type |
|
||||
|------|------|
|
||||
| `sniffer.worker` | `@traced` |
|
||||
| `sniffer.sniff_loop` | `@traced` |
|
||||
| `sniffer.tcp_syn_fingerprint` | inline |
|
||||
| `sniffer.tls_client_hello` | inline |
|
||||
| `sniffer.tls_server_hello` | inline |
|
||||
| `sniffer.tls_certificate` | inline |
|
||||
| `sniffer.parse_client_hello` | `@traced` |
|
||||
| `sniffer.parse_server_hello` | `@traced` |
|
||||
| `sniffer.parse_certificate` | `@traced` |
|
||||
| `sniffer.ja3` | `@traced` |
|
||||
| `sniffer.ja3s` | `@traced` |
|
||||
| `sniffer.ja4` | `@traced` |
|
||||
| `sniffer.ja4s` | `@traced` |
|
||||
| `sniffer.session_resumption_info` | `@traced` |
|
||||
| `sniffer.p0f_guess_os` | `@traced` |
|
||||
| `sniffer.write_event` | `@traced` |
|
||||
|
||||
### Prober
|
||||
|
||||
| Span | Type |
|
||||
|------|------|
|
||||
| `prober.worker` | `@traced` |
|
||||
| `prober.discover_attackers` | `@traced` |
|
||||
| `prober.probe_cycle` | `@traced` |
|
||||
| `prober.jarm_phase` | `@traced` |
|
||||
| `prober.hassh_phase` | `@traced` |
|
||||
| `prober.tcpfp_phase` | `@traced` |
|
||||
| `prober.jarm_hash` | `@traced` |
|
||||
| `prober.jarm_send_probe` | `@traced` |
|
||||
| `prober.hassh_server` | `@traced` |
|
||||
| `prober.hassh_ssh_connect` | `@traced` |
|
||||
| `prober.tcp_fingerprint` | `@traced` |
|
||||
| `prober.tcpfp_send_syn` | `@traced` |
|
||||
|
||||
### Engine
|
||||
|
||||
| Span | Type |
|
||||
|------|------|
|
||||
| `engine.deploy` | `@traced` |
|
||||
| `engine.teardown` | `@traced` |
|
||||
| `engine.compose_with_retry` | `@traced` |
|
||||
|
||||
### Mutator
|
||||
|
||||
| Span | Type |
|
||||
|------|------|
|
||||
| `mutator.mutate_decky` | `@traced` |
|
||||
| `mutator.mutate_all` | `@traced` |
|
||||
| `mutator.watch_loop` | `@traced` |
|
||||
|
||||
### Correlation
|
||||
|
||||
| Span | Type |
|
||||
|------|------|
|
||||
| `correlation.ingest_file` | `@traced` |
|
||||
| `correlation.ingest_file.summary` | inline |
|
||||
| `correlation.traversals` | `@traced` |
|
||||
| `correlation.report_json` | `@traced` |
|
||||
| `correlation.traversal_syslog_lines` | `@traced` |
|
||||
|
||||
### Logging
|
||||
|
||||
| Span | Type |
|
||||
|------|------|
|
||||
| `logging.init_file_handler` | `@traced` |
|
||||
| `logging.probe_log_target` | `@traced` |
|
||||
|
||||
### SSE
|
||||
|
||||
| Span | Type |
|
||||
|------|------|
|
||||
| `sse.emit_logs` | inline (with span links to ingestion traces) |
|
||||
|
||||
## Adding New Traces
|
||||
|
||||
```python
|
||||
from decnet.telemetry import traced as _traced, get_tracer as _get_tracer
|
||||
|
||||
# Decorator (preferred for entire functions)
|
||||
@_traced("component.operation")
|
||||
async def my_function():
|
||||
...
|
||||
|
||||
# Inline (for sub-sections within a function)
|
||||
with _get_tracer("component").start_as_current_span("component.sub_op") as span:
|
||||
span.set_attribute("key", "value")
|
||||
...
|
||||
```
|
||||
|
||||
Naming convention: `component.operation` (e.g. `prober.jarm_hash`, `profiler.timing_stats`).
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Symptom | Check |
|
||||
|---------|-------|
|
||||
| No traces in Jaeger | `DECNET_DEVELOPER_TRACING=true`? Jaeger running on port 4317? |
|
||||
| `ImportError` on OTEL packages | Run `pip install -e ".[dev]"` (OTEL is in optional deps) |
|
||||
| Partial traces (ingester orphaned) | Verify `_trace` key present in JSON log file records |
|
||||
| SSE spans have no links | Confirm `trace_id`/`span_id` columns exist in `logs` table |
|
||||
| Performance concern | BatchSpanProcessor adds ~1ms per span; zero overhead when disabled |
|
||||
63
development/docs/services/COLLECTOR.md
Normal file
63
development/docs/services/COLLECTOR.md
Normal file
@@ -0,0 +1,63 @@
|
||||
# DECNET Collector
|
||||
|
||||
The `decnet/collector` module is responsible for the background acquisition, normalization, and filtering of logs generated by the honeypot fleet. It acts as the bridge between the transient Docker container logs and the persistent analytical database.
|
||||
|
||||
## Architecture
|
||||
|
||||
The Collector runs as a host-side worker (typically managed by the CLI or a daemon). It employs a hybrid asynchronous and multi-threaded model to handle log streaming from a dynamic number of containers without blocking the main event loop.
|
||||
|
||||
### Log Pipeline Flow
|
||||
1. **Discovery**: Scans `decnet-state.json` to identify active Decky service containers.
|
||||
2. **Streaming**: Spawns a dedicated thread for every active container to tail its `stdout` via the Docker SDK.
|
||||
3. **Normalization**: Parses the raw RFC 5424 Syslog lines into structured JSON.
|
||||
4. **Filtering**: Applies a rate-limiter to deduplicate high-frequency connection events.
|
||||
5. **Storage**: Appends raw lines to `.log` and filtered JSON to `.json` for database ingestion.
|
||||
|
||||
---
|
||||
|
||||
## Core Components
|
||||
|
||||
### `worker.py`
|
||||
|
||||
#### `log_collector_worker(log_file: str)`
|
||||
The main asynchronous entry point.
|
||||
- **Initial Scan**: Identifies all running containers that match the DECNET service naming convention.
|
||||
- **Event Loop**: Uses the Docker `events` API to listen for `container:start` events, allowing it to automatically pick up new Deckies that are deployed after the collector has started.
|
||||
- **Task Management**: Manages a dictionary of active streaming tasks, ensuring no container is streamed more than once and cleaning up completed tasks.
|
||||
|
||||
---
|
||||
|
||||
## Log Normalization (RFC 5424)
|
||||
|
||||
DECNET services emit logs using a standardized RFC 5424 format with structured data. The `parse_rfc5424` function is the primary tool for extracting this information.
|
||||
|
||||
- **Structured Data**: Extracts parameters from the `relay@55555` SD-ELEMENT.
|
||||
- **Field Mapping**: Identifies the `attacker_ip` by scanning common source IP fields (`src_ip`, `client_ip`, etc.).
|
||||
- **Consistency**: Formats timestamps into a human-readable `%Y-%m-%d %H:%M:%S` format for the analytical stream.
|
||||
|
||||
---
|
||||
|
||||
## Ingestion Rate Limiter
|
||||
|
||||
To prevent the local SQLite database from being overwhelmed during credential-stuffing attacks or heavy port scanning, the Collector implements a window-based rate limiter for "lifecycle" events.
|
||||
|
||||
- **Scope**: By default, it limits: `connect`, `disconnect`, `connection`, `accept`, and `close`.
|
||||
- **Logic**: It groups events by `(attacker_ip, decky, service, event_type)`. If the same event occurs within the window, it is written to the raw `.log` file (for forensics) but **discarded** for the `.json` stream (ingestion).
|
||||
- **Configuration**:
|
||||
- `DECNET_COLLECTOR_RL_WINDOW_SEC`: The deduplication window size (default: 1.0s).
|
||||
- `DECNET_COLLECTOR_RL_EVENT_TYPES`: Comma-separated list of event types to limit.
|
||||
|
||||
---
|
||||
|
||||
## Resilience & Operational Stability
|
||||
|
||||
### Inode Tracking (`_reopen_if_needed`)
|
||||
Log files can be rotated by `logrotate` or manually deleted. The Collector tracks the **inode** of the log handles. If the file on disk changes (indicating rotation or deletion), the collector transparently closes and reopens the handle, ensuring no logs are lost and preventing "stale handle" errors.
|
||||
|
||||
### Docker SDK Integration
|
||||
The Collector uses `asyncio.to_thread` to run the blocking Docker SDK `logs(stream=True)` calls. This ensures that the high-latency network calls to the Docker daemon do not starve the asynchronous event loop responsible for monitoring container starts.
|
||||
|
||||
### Container Identification
|
||||
The Collector uses two layers of verification to ensure it only collects logs from DECNET honeypots:
|
||||
1. **Name Matching**: Checks if the container name matches the `{decky}-{service}` pattern.
|
||||
2. **State Verification**: Cross-references container names with the current `decnet-state.json`.
|
||||
61
development/docs/services/ENGINE.md
Normal file
61
development/docs/services/ENGINE.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# DECNET Engine (Orchestrator)
|
||||
|
||||
The `decnet/engine` module is the central nervous system of DECNET. It acts as the primary orchestrator, responsible for bridging high-level configuration (user-defined deckies and archetypes) with the underlying infrastructure (Docker containers, MACVLAN/IPvlan networking, and host-level configurations).
|
||||
|
||||
## Role in the Ecosystem
|
||||
While the CLI manages user interaction and the Service Registry manages available honeypots, the **Engine** is what actually manifests these concepts into running containers on the network. It handles:
|
||||
- **Network Virtualization**: Dynamically setting up MACVLAN or IPvlan L2 interfaces.
|
||||
- **Container Lifecycle**: Orchestrating `docker compose` for building and running services.
|
||||
- **State Persistence**: Tracking active deployments to ensure clean teardowns.
|
||||
- **Unified Logging Injection**: Ensuring all honeypots share the same logging utilities.
|
||||
|
||||
---
|
||||
|
||||
## Core Components
|
||||
|
||||
### `deployer.py`
|
||||
This is the primary implementation file for the engine logic.
|
||||
|
||||
#### `deploy(config: DecnetConfig, ...)`
|
||||
The entry point for a deployment. It executes the following sequence:
|
||||
1. **Network Setup**: Identifies the IP range required for the requested deckies and initializes the Docker MACVLAN/IPvlan network.
|
||||
2. **Host Bridge**: Configures host-level routing (via `setup_host_macvlan` or `setup_host_ipvlan`) so the host can communicate with the decoys.
|
||||
3. **Logging Synchronization**: Copies the `decnet_logging.py` utility into every service's build context to ensure consistent log formatting.
|
||||
4. **Compose Generation**: Uses the `decnet.composer` to generate a `decnet-compose.yml` file.
|
||||
5. **State Management**: Saves the current configuration to `decnet-state.json`.
|
||||
6. **Orchestrated Build/Up**: Executes `docker compose up --build` with automatic retries for transient Docker daemon failures.
|
||||
|
||||
#### `teardown(decky_id: str | None = None)`
|
||||
Handles the cleanup of DECNET resources.
|
||||
- **Targeted Teardown**: If a `decky_id` is provided, it stops and removes only those specific containers.
|
||||
- **Full Teardown**: If no ID is provided, it:
|
||||
- Stops and removes all DECNET containers.
|
||||
- Tears down host-level virtual interfaces.
|
||||
- Removes the Docker MACVLAN/IPvlan network.
|
||||
- Clears the internal `decnet-state.json`.
|
||||
|
||||
#### `status()`
|
||||
Provides a real-time snapshot of the deployment.
|
||||
- Queries the Docker SDK for the current status of all containers associated with the active deployment.
|
||||
- Displays a `rich` table showing Decky names, IPs, Hostnames, and the health status of individual services.
|
||||
|
||||
---
|
||||
|
||||
## Internal Logic & Helpers
|
||||
|
||||
### Infrastructure Orchestration
|
||||
The Engine relies heavily on sub-processes to interface with `docker compose`, as it provides a robust abstraction for managing complex container groups (Deckies).
|
||||
|
||||
- **`_compose_with_retry`**: Docker operations (especially `pull` and `build`) can fail due to network timeouts or registry issues. This helper implements exponential backoff to ensure high reliability during deployment.
|
||||
- **`_compose`**: A direct wrapper for `docker compose` commands used during teardown where retries are less critical.
|
||||
|
||||
### The Logging Helper (`_sync_logging_helper`)
|
||||
One of the most critical parts of the engine is ensuring that every honeypot service, regardless of its unique implementation, speaks the same syslog "language." The engine iterates through every active service and copies `templates/decnet_logging.py` into their respective build contexts before the build starts. This allows service containers to import the standardized logging logic at runtime.
|
||||
|
||||
---
|
||||
|
||||
## Error Handling & Resilience
|
||||
The Engine is designed to handle "Permanent" vs "Transient" failures. It identifies errors such as `manifest unknown` or `repository does not exist` as terminal and will abort immediately, while others (connection resets, daemon timeouts) trigger a retry cycle.
|
||||
|
||||
## State Management
|
||||
The Engine maintains a `decnet-state.json` file. This file acts as the source of truth for what is currently "on the wire." Without this state, a proper `teardown` would be impossible, as the engine wouldn't know which virtual interfaces were created on the host NIC.
|
||||
58
development/docs/services/MODELS.md
Normal file
58
development/docs/services/MODELS.md
Normal file
@@ -0,0 +1,58 @@
|
||||
# DECNET Domain Models
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **DEVELOPMENT DISCLAIMER**: DECNET is currently in active development. The models defined in `decnet/models.py` are subject to significant changes as the framework evolves.
|
||||
|
||||
## Overview
|
||||
|
||||
The `decnet/models.py` file serves as the centralized repository for all **Domain Models** used throughout the project. These are implemented using Pydantic v2 and ensure that the core business logic remains decoupled from the specific implementation details of the database (SQLAlchemy/SQLite) or the web layer (FastAPI).
|
||||
|
||||
---
|
||||
|
||||
## Model Hierarchy
|
||||
|
||||
DECNET categorizes its models into two primary functional groups: **INI Specifications** and **Runtime Configurations**.
|
||||
|
||||
### 1. INI Specifications (Input Validation)
|
||||
These models are designed to represent the structure of a `decnet.ini` file. They are primarily consumed by the `ini_loader.py` during the parsing of user-provided configuration files.
|
||||
|
||||
- **`IniConfig`**: The root model for a full deployment specification. It includes global settings like `subnet`, `gateway`, and `interface`, and contains a list of `DeckySpec` objects.
|
||||
- **`DeckySpec`**: A high-level description of a machine. It contains optional fields that the user *may* provide in an INI file (e.g., `ip`, `archetype`, `services`).
|
||||
- **`CustomServiceSpec`**: Defines external "Bring-Your-Own" services using Docker images and custom execution commands.
|
||||
|
||||
### 2. Runtime Configurations (Operational State)
|
||||
These models represent the **active, fully resolved state** of the deployment. Unlike the specifications, these models require all fields to be populated and valid.
|
||||
|
||||
- **`DecnetConfig`**: The operational root of a deployment. It includes the resolved network settings and the list of active `DeckyConfig` objects. It is used by the **Engine** for orchestration and is persisted in `decnet-state.json`.
|
||||
- **`DeckyConfig`**: A fully materialized decoy configuration. It includes generated hostnames, resolved distro images, and specific IP addresses.
|
||||
|
||||
---
|
||||
|
||||
## The Fleet Transformer (`fleet.py`)
|
||||
|
||||
The connection between the **Specifications** and the **Runtime Configurations** is handled by `decnet/fleet.py`.
|
||||
|
||||
The function `build_deckies_from_ini` takes an `IniConfig` as input and performs the following "up-conversion" logic:
|
||||
- **IP Allocation**: Auto-allocates free IPs from the subnet for any deckies missing an explicit IP in the INI.
|
||||
- **Service Resolution**: Validates that all requested services exist in the registry and assigns defaults from archetypes if needed.
|
||||
- **Environment Inheritance**: Inherits settings like rotation intervals (`mutate_interval`) from the global INI context down to individual deckies.
|
||||
|
||||
---
|
||||
|
||||
## Structural Validation: `IniContent`
|
||||
|
||||
To ensure that saved deployments in the database or provided by the API remain structurally sound, DECNET uses a specialized `IniContent` type.
|
||||
|
||||
- **`validate_ini_string`**: A pre-validator that uses Python's native `configparser`. It ensures that the content is a valid INI string, does not exceed 512KB, and contains at least one section.
|
||||
- **Standardized Errors**: It raises specifically formatted `ValueError` exceptions that are captured by both the CLI and the Web UI to provide clear feedback to the user.
|
||||
|
||||
---
|
||||
|
||||
## Key Consumer Modules
|
||||
|
||||
| Module | Usage |
|
||||
| :--- | :--- |
|
||||
| **`decnet/ini_loader.py`** | Uses `IniConfig` and `DeckySpec` to parse raw `.ini` files into structured objects. |
|
||||
| **`decnet/fleet.py`** | Transforms `IniConfig` specs into `DeckyConfig` operational models. |
|
||||
| **`decnet/config.py`** | Uses `DecnetConfig` and `DeckyConfig` to manage the lifecycle of `decnet-state.json`. |
|
||||
| **`decnet/web/db/models.py`** | Utilizes `IniContent` to enforce structural validity on INI strings stored in the database. |
|
||||
134
development/docs/services/WEB_MODELS.md
Normal file
134
development/docs/services/WEB_MODELS.md
Normal file
@@ -0,0 +1,134 @@
|
||||
# DECNET Web & Database Models: Architectural Deep Dive
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **DEVELOPMENT DISCLAIMER**: DECNET is currently in active development. The storage schemas and API signatures defined in `decnet/web/db/models.py` are subject to radical change as the framework's analytical capabilities and distributed features expand.
|
||||
|
||||
## 1. Introduction & Philosophy
|
||||
|
||||
The `decnet/web/db/models.py` file represents the structural backbone of the DECNET web interface and its underlying analytical engine. It serves a dual purpose that is central to the project's architecture:
|
||||
|
||||
1. **Unified Source of Truth**: By utilizing **SQLModel**, DECNET collapses the traditional barrier between Pydantic data validation and SQLAlchemy ORM mapping. This allows a single class definition to act as both a database table and an API data object, drastically reducing the "boilerplate" associated with traditional web-database pipelines.
|
||||
2. **Analytical Scalability**: The models are designed to scale from small-scale local deployments using **SQLite** to large-scale, enterprise-ready environments backed by **MySQL**. This is achieved through clever usage of SQLAlchemy "Variants" and abstraction layers for large text blobs.
|
||||
|
||||
---
|
||||
|
||||
## 2. The Database Layer (SQLModel Entities)
|
||||
|
||||
These models define the physical tables within the DECNET infrastructure. Every class marked with `table=True` is interpreted by the repository layer to generate the corresponding DDL (Data Definition Language) for the target database.
|
||||
|
||||
### 2.1 Identity & Security: The `User` Entity
|
||||
|
||||
The `User` model handles dashboard access control and basic identity management.
|
||||
|
||||
* `uuid`: A unique string identifier. While integers are often used for IDs, DECNET uses strings to support potential future transitions to UUIDs without schema breakage.
|
||||
* `username`: The primary login handle. It is both `unique` and `indexed` for rapid authentication lookups.
|
||||
* `password_hash`: Stores the Argon2 or bcrypt hash. Length constraints in various routers ensure that raw passwords never exceed 72 characters, preventing "Long Password Denial of Service" attacks on various hashing algorithms.
|
||||
* `role`: A simple string-based permission field (e.g., `admin`, `viewer`).
|
||||
* `must_change_password`: A boolean flag used for fresh deployments or manual administrative resets, forcing the user to rotate their credentials upon their first authenticated session.
|
||||
|
||||
### 2.2 Intelligence & Attribution: `Attacker` and `AttackerBehavior`
|
||||
|
||||
These two tables form the core of DECNET's "Attacker Profiling" system. They are split into two tables to maintain "Narrow vs. Wide" performance characteristics.
|
||||
|
||||
#### The `Attacker` Entity (Broad Analytics)
|
||||
The `Attacker` table stores the "primary" record for every unique IP discovered by the honeypot fleet.
|
||||
|
||||
* `ip`: The source IP address. This is the primary key and is heavily indexed.
|
||||
* `first_seen` / `last_seen`: Tracking the lifecycle of an attacker's engagement with the network.
|
||||
* `event_count` / `service_count` / `decky_count`: Aggregated counters used by the stats dashboard to visualize the magnitude of an engagement.
|
||||
* `services` / `deckies`: JSON-serialized lists of every service and machine reached by the attacker. Using `_BIG_TEXT` here allows these lists to grow significantly during long-term campaigns.
|
||||
* `traversal_path`: A string representation (e.g., `omega → epsilon → zulu`) that helps analysts visualize lateral movement attempts recorded by the correlation engine.
|
||||
|
||||
#### The `AttackerBehavior` Entity (Granular Analytics)
|
||||
This "Wide" table stores behavioral signatures. It is separated from the main `Attacker` record so that high-frequency updates to timing stats or sniffer-derived packet signatures don't lock the primary attribution rows.
|
||||
|
||||
* `os_guess`: Derived from the `os_fingerprint` and `sniffer` engines, providing an estimate of the attacker's operating system based on TCP/IP stack nuances.
|
||||
* `tcp_fingerprint`: A JSON blob storing the raw TCP signature (Window size, MSS, Option sequence).
|
||||
* `behavior_class`: A classification (e.g., `beaconing`, `interactive`, `brute_force`) derived from log inter-arrival timing (IAT).
|
||||
* `timing_stats`: Stores a JSON dictionary of mean/median/stdev for event timing, used to detect automated tooling.
|
||||
|
||||
### 2.3 Telemetry: `Log` and `Bounty`
|
||||
|
||||
These tables store the "raw" data generated by the honeypots.
|
||||
|
||||
* **`Log` Table**: The primary event sink. Every line from the collector ends up here.
|
||||
* `event_type`: The MSGID from the RFC 5424 header (e.g., `connect`, `exploit`).
|
||||
* `raw_line`: The full, un-parsed syslog string for forensic verification.
|
||||
* `fields`: A JSON blob containing the structured data (SD-ELEMENTS) extracted during normalization.
|
||||
* **`Bounty` Table**: Specifically for high-value events. When a service detects "Gold" (like a plain-text password or a known PoC payload), it is mirrored here for rapid analyst review.
|
||||
|
||||
### 2.4 System State: The `State` Entity
|
||||
|
||||
The `State` table acts as the orchestrator's brain. It stores the `decnet-state.json` content within the database when the system is integrated with the web layer.
|
||||
|
||||
* `key`: The configuration key (e.g., `global_config`, `active_deployment`).
|
||||
* `value`: A `MEDIUMTEXT` JSON blob. This is potentially its largest field, storing the entire resolved configuration of every running Decky.
|
||||
|
||||
---
|
||||
|
||||
## 3. The API Layer (Pydantic DTOs)
|
||||
|
||||
These models define how data moves across the wire between the FastAPI backend and the frontend.
|
||||
|
||||
### 3.1 Authentication Pipeline
|
||||
* `LoginRequest`: Validates incoming credentials before passing them to the security middleware.
|
||||
* `Token`: The standard OAuth2 bearer token response, enriched with the `must_change_password` hint.
|
||||
* `ChangePasswordRequest`: Ensures the old password is provided and the new one meets the project's security constraints.
|
||||
|
||||
### 3.2 Reporting & Pagination
|
||||
DECNET uses a standardized "Envelope" pattern for broad analytical responses (`LogsResponse`, `AttackersResponse`, `BountyResponse`).
|
||||
|
||||
* `total`: The total count of matching records in the database (ignoring filters).
|
||||
* `limit` / `offset`: The specific slice of data returned, supporting "Infinite Scroll" or traditional pagination in the UI.
|
||||
* `data`: A list of dictionaries. By using `dict[str, Any]` here, the API remains flexible with SQLModel's dynamic attribute loading.
|
||||
|
||||
### 3.3 System Administration
|
||||
* **`DeployIniRequest`**: The most critical input model. It takes `ini_content` as a validated string. By using the `IniContent` annotated type, the API rejects malformed deployments before they ever touch the fleet builder.
|
||||
* **`MutateIntervalRequest`**: Uses a strict REGEX pattern (`^[1-9]\d*[mdMyY]$`) to ensure intervals like `30m` (30 minutes) or `2d` (2 days) are valid before being applied to the orchestrator.
|
||||
|
||||
---
|
||||
|
||||
## 4. Technical Foundations
|
||||
|
||||
### 4.1 Cross-DB Compatibility Logic
|
||||
The project uses a custom variant system to handle the discrepancies between SQLite (which has simplified typing) and MySQL (which has strict size constraints).
|
||||
|
||||
```python
|
||||
_BIG_TEXT = Text().with_variant(MEDIUMTEXT(), "mysql")
|
||||
```
|
||||
|
||||
This abstraction ensures that fields like `Attacker.services` (which can grow to thousands of items) are stored as `MEDIUMTEXT` (16 MiB) on MySQL, whereas standard SQLAlchemy `Text` (often 64 KiB on MySQL) would silently truncate the data, leading to analytical loss.
|
||||
|
||||
### 4.2 High-Fidelity Normalization
|
||||
Data arriving from distributed honeypots is often "dirty." The models include custom pre-validators like `_normalize_null`.
|
||||
|
||||
* **Null Coalescing**: Services often emit logging values as `"null"` or `"undefined"` strings. The `NullableString` type automatically converts these "noise" strings into actual Python `None` types during ingestion.
|
||||
* **Timestamp Integrity**: `NullableDatetime` ensures that various ISO formats or epoch timestamps provided by different service containers are normalized into standard UTC datetime objects.
|
||||
|
||||
---
|
||||
|
||||
## 5. Integration Case Studies (Deep Analysis)
|
||||
|
||||
To understand how these models function, we must examine their lifecycle across the web stack.
|
||||
|
||||
### 5.1 The Repository Layer (`decnet/web/db/sqlmodel_repo.py`)
|
||||
The repository is the primary consumer of the "Entities." It utilizes the metadata generated by SQLModel to:
|
||||
1. **Generate DDL**: On startup, the repository calls `SQLModel.metadata.create_all()`. This takes every `table=True` class and translates it into `CREATE TABLE` statements tailored to the active engine (SQLite or MySQL).
|
||||
2. **Translate DTOs**: When the repository fetches an `Attacker` from the DB, SQLModel automatically populates the Pydantic-style attributes, allowing the repository to return objects that are immediately serializeable by the routers.
|
||||
|
||||
### 5.2 The Dashboard Routers
|
||||
Specific endpoints rely on these models for boundary safety:
|
||||
|
||||
* **`api_deploy_deckies.py`**: Uses `DeployIniRequest`. This ensures that even if a user tries to POST a massive binary file instead of an INI, the Pydantic layer (powered by `decnet.models.validate_ini_string`) will intercept and reject the request with a `422 Unprocessable Entity` error before it reaches the orchestrator.
|
||||
* **`api_get_stats.py`**: Uses `StatsResponse`. This model serves as a "rollup" that aggregates data from the `Log`, `Attacker`, and `State` tables into a single unified JSON object for the dashboard's "At a Glance" view.
|
||||
* **`api_get_health.py`**: Uses `HealthResponse`. This model provides a nested view of the system, where each sub-component (Engine, Collector, DB) is represented as a `ComponentHealth` object, allowing the UI to show granular "Success" or "Failure" states.
|
||||
|
||||
---
|
||||
|
||||
## 6. Futureproofing & Guidelines
|
||||
|
||||
As the project grows, the following habits must be maintained:
|
||||
|
||||
1. **Keep the Row Narrow**: Always separate behavioral data that updates frequently into auxiliary tables like `AttackerBehavior`.
|
||||
2. **Use Variants**: Never use standard `String` or `Text` for JSON blobs; always use `_BIG_TEXT` to respect MySQL's storage limitations.
|
||||
3. **Validate at the Boundary**: Ensure every new API request model uses Pydantic's strict typing to prevent malicious payloads from reaching the database layer.
|
||||
502
development/profiles/profile_1500_fb69a06.csv
Normal file
502
development/profiles/profile_1500_fb69a06.csv
Normal file
@@ -0,0 +1,502 @@
|
||||
Type Name # Requests # Fails Median (ms) 95%ile (ms) 99%ile (ms) Average (ms) Min (ms) Max (ms) Average size (bytes) Current RPS Current Failures/s
|
||||
GET /api/v1/attackers 27857 0 2200 7300 10000 2807.22 1 20651 43 107.3 0
|
||||
GET /api/v1/attackers?search=brute&sort_by=recent 13962 0 2700 8400 12000 3305.79 4 23758 43 48.6 0
|
||||
POST /api/v1/auth/login 7128 0 340 3500 6600 883.47 165 7555 259 27.8 0
|
||||
POST /api/v1/auth/login [on_start] 1500 0 680 1800 2900 811.27 181 3919 259 0 0
|
||||
GET /api/v1/bounty 21070 0 38 4800 6500 1008.43 1 12467 43 82 0
|
||||
GET /api/v1/config 10620 0 890 6200 9500 1694.71 1 15695 214 43.9 0
|
||||
GET /api/v1/deckies 24572 0 14 370 5400 201.21 1 10123 2 93.7 0
|
||||
GET /api/v1/health 10675 0 850 4900 7200 1467.49 1 10851 337 42.2 0
|
||||
GET /api/v1/logs/histogram 17652 0 22 4400 7000 837.93 1 9972 125 60.5 0
|
||||
GET /api/v1/logs?limit=100&offset=0 9 0 1700 4300 4300 2117.87 103 4309 37830 0 0
|
||||
GET /api/v1/logs?limit=100&offset=1 10 0 1300 8100 8100 2910.09 9 8070 36893 0 0
|
||||
GET /api/v1/logs?limit=100&offset=10 14 0 4200 6800 6800 3603.31 113 6766 32590 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=100 8 0 1100 3800 3800 1350.33 57 3772 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=1000 16 0 2700 4900 4900 2925.33 58 4859 48 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=101 16 0 1900 5600 5600 2504.82 57 5629 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=102 12 0 2500 8800 8800 3484.47 53 8770 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=103 9 0 1400 6200 6200 1950.97 67 6181 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=104 16 0 1700 6100 6100 2317.96 43 6126 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=105 17 0 2100 10000 10000 3350.11 44 10344 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=106 16 0 1800 6800 6800 2762.72 63 6784 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=107 16 0 1700 10000 10000 2789.09 27 10431 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=108 19 0 2300 10000 10000 2409.65 59 10118 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=109 16 0 1300 5300 5300 1608.45 65 5255 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=11 13 0 220 6400 6400 1786.76 36 6359 32152 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=110 26 0 3000 8500 11000 3399.39 54 11077 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=111 26 0 1400 5900 9200 2207.97 44 9172 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=112 13 0 1600 8200 8200 2484.88 64 8225 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=113 17 0 1600 8100 8100 2646.15 27 8075 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=114 8 0 1900 7200 7200 2807.48 756 7195 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=115 17 0 2000 8500 8500 2861.25 56 8493 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=116 10 0 2200 6800 6800 2622.73 29 6797 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=117 19 0 2400 6600 6600 2509.69 38 6563 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=118 11 0 3500 7900 7900 3732.91 40 7882 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=119 13 0 2500 8600 8600 2936.16 216 8629 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=12 14 0 2100 8100 8100 2573.58 7 8117 31688 0 0
|
||||
GET /api/v1/logs?limit=100&offset=120 11 0 1600 10000 10000 2820.34 63 10177 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=121 11 0 3400 9100 9100 3628.7 57 9140 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=122 9 0 2900 7100 7100 3142.22 48 7128 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=123 12 0 1900 6700 6700 2286.83 60 6704 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=124 14 0 3600 8400 8400 3643.79 46 8440 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=125 16 0 1800 9400 9400 2413.7 58 9401 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=126 12 0 3200 8500 8500 3847.66 44 8512 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=127 12 0 1900 11000 11000 2823.13 44 11082 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=128 13 0 3900 11000 11000 4707.15 57 10659 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=129 14 0 3800 8400 8400 3940.07 59 8393 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=13 11 0 1900 4100 4100 2029.68 33 4149 30974 0 0
|
||||
GET /api/v1/logs?limit=100&offset=130 8 0 2000 4700 4700 2412.8 169 4747 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=131 15 0 2300 8700 8700 2947.03 95 8698 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=132 17 0 2700 6400 6400 3091.26 48 6403 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=133 9 0 2500 5800 5800 2899.5 183 5794 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=134 14 0 2700 4300 4300 2389.97 39 4256 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=135 10 0 2600 7300 7300 3019.3 61 7286 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=136 19 0 1700 7700 7700 2781.26 60 7746 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=137 17 0 2600 5300 5300 2647.46 56 5344 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=138 7 0 1400 6200 6200 1919.91 77 6246 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=139 13 0 1400 9500 9500 2336.15 62 9485 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=14 11 0 1500 6400 6400 2687.97 43 6360 30514 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=140 24 0 1900 5400 7100 2374.36 81 7071 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=141 10 0 1100 10000 10000 2408.95 49 10225 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=142 9 0 2400 7800 7800 3686.53 55 7753 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=143 8 0 2500 9600 9600 3636.95 52 9568 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=144 10 0 1900 5000 5000 2459.36 59 5050 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=145 13 0 2400 7300 7300 3062.41 60 7342 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=146 20 0 1900 9100 9100 2298.08 41 9091 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=147 10 0 75 3500 3500 1327.22 35 3547 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=148 10 0 2100 5200 5200 2501.82 80 5236 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=149 9 0 1500 3000 3000 1241.2 41 3003 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=15 16 0 1900 6300 6300 2584.34 90 6264 30054 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=150 11 0 2100 5500 5500 2144.73 45 5517 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=151 9 0 1900 6400 6400 2782.37 347 6384 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=152 14 0 1500 8500 8500 2881.68 38 8523 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=153 11 0 1800 6700 6700 3068.2 53 6677 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=154 14 0 1300 4300 4300 1571.28 48 4309 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=155 13 0 1900 8200 8200 2521.7 59 8219 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=156 15 0 2000 7600 7600 2237.56 34 7622 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=157 14 0 2000 6700 6700 2378.86 33 6711 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=158 11 0 3000 5300 5300 3286.63 1579 5254 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=159 10 0 1100 11000 11000 2822.55 58 11156 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=16 15 0 2000 10000 10000 3769.59 47 10098 29590 0 0
|
||||
GET /api/v1/logs?limit=100&offset=160 22 0 3600 8400 8600 3386.13 33 8602 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=161 12 0 2000 5600 5600 2610.53 40 5637 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=162 11 0 1900 11000 11000 2930.02 67 11082 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=163 15 0 1700 6700 6700 2222.65 46 6665 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=164 11 0 1400 4900 4900 1917.46 42 4875 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=165 18 0 1600 8900 8900 2237.55 33 8882 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=166 7 0 1500 6800 6800 1829.12 75 6838 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=167 12 0 2600 9900 9900 3222.45 43 9850 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=168 11 0 1900 5200 5200 2035.88 58 5247 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=169 17 0 2700 7300 7300 3062.78 46 7340 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=17 23 0 1900 8000 9800 2756.92 35 9803 29144 0 0
|
||||
GET /api/v1/logs?limit=100&offset=170 13 0 3300 8100 8100 3362.75 438 8134 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=171 27 0 1900 8100 8300 2311.77 5 8254 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=172 13 0 3900 9900 9900 4106 63 9871 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=173 13 0 650 6900 6900 1958.3 6 6935 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=174 12 0 220 6700 6700 1959.6 51 6679 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=175 18 0 2500 6800 6800 2929.88 48 6800 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=176 14 0 2700 7900 7900 2984.64 45 7884 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=177 13 0 1400 7100 7100 2455.43 51 7147 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=178 12 0 1700 3000 3000 1562.73 46 2977 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=179 12 0 2500 6100 6100 2935.99 86 6108 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=18 13 0 2300 9500 9500 3296.18 48 9498 28680 0 0
|
||||
GET /api/v1/logs?limit=100&offset=180 18 0 1300 8200 8200 2396.09 43 8154 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=181 16 0 2200 8200 8200 2802.47 64 8192 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=182 16 0 1300 6100 6100 2057.17 43 6061 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=183 15 0 1600 5900 5900 2142.61 42 5946 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=184 14 0 2100 7400 7400 2525.15 51 7405 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=185 9 0 2400 4900 4900 2088.61 67 4863 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=186 13 0 2700 11000 11000 3738.56 45 11423 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=187 13 0 1800 6400 6400 1899.97 42 6406 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=188 13 0 2200 7300 7300 2873.82 43 7251 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=189 13 0 1200 6400 6400 1904.57 49 6399 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=19 20 0 2400 8800 8800 2996.42 59 8835 28234 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=190 12 0 280 6100 6100 1667.82 43 6054 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=191 9 0 1900 6600 6600 2303.07 39 6624 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=192 22 0 2400 6800 7100 2769.02 2 7131 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=193 15 0 1900 7700 7700 2464.7 47 7682 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=194 18 0 2400 8100 8100 3043.38 49 8127 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=195 17 0 4100 7400 7400 3853.07 61 7420 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=196 18 0 1700 7000 7000 2523.59 40 7016 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=197 11 0 2400 7400 7400 2910.75 67 7402 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=198 14 0 3100 6500 6500 3057.97 51 6509 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=199 11 0 2300 4900 4900 2513.58 54 4851 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=2 15 0 2400 8900 8900 2923.37 52 8865 36489 0 0
|
||||
GET /api/v1/logs?limit=100&offset=20 18 0 2800 10000 10000 3124.38 41 10400 27784 0 0
|
||||
GET /api/v1/logs?limit=100&offset=200 15 0 4100 8400 8400 3353.53 46 8352 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=201 11 0 1800 7200 7200 2274.68 59 7160 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=202 15 0 3800 9700 9700 4152.2 78 9749 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=203 17 0 2200 7600 7600 2499.06 31 7566 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=204 10 0 3100 17000 17000 4506.94 37 17414 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=205 17 0 1900 7000 7000 2579.26 34 7010 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=206 11 0 2400 9500 9500 3257.89 42 9477 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=207 15 0 2300 6800 6800 2744.21 50 6753 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=208 14 0 3700 7900 7900 3504.5 35 7910 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=209 19 0 2500 6300 6300 2894.09 52 6309 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=21 12 0 1500 5200 5200 2116.61 55 5193 27290 0 0
|
||||
GET /api/v1/logs?limit=100&offset=210 14 0 1900 7400 7400 2608.58 29 7419 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=211 15 0 1900 4700 4700 2119.7 37 4679 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=212 11 0 2800 10000 10000 3361.46 69 10205 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=213 15 0 1700 9200 9200 2720.83 49 9211 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=214 14 0 1700 7800 7800 2381.27 44 7828 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=215 17 0 2000 5700 5700 2310.92 82 5665 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=216 14 0 1600 9400 9400 2854.11 47 9420 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=217 15 0 2000 6200 6200 2204.38 42 6157 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=218 18 0 2600 6800 6800 2863.63 38 6807 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=219 10 0 2000 7500 7500 2725.48 58 7458 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=22 17 0 1800 8700 8700 2544.86 42 8680 26810 0 0
|
||||
GET /api/v1/logs?limit=100&offset=220 15 0 3800 11000 11000 4195.25 50 10724 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=221 14 0 2100 9800 9800 3105.53 43 9794 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=222 16 0 1900 6000 6000 2901.01 57 6019 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=223 19 0 1900 6700 6700 2542.28 50 6700 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=224 16 0 1800 8800 8800 2315.18 48 8804 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=225 9 0 2200 4900 4900 2367.08 286 4890 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=226 13 0 1700 6800 6800 1882.43 68 6826 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=227 13 0 3100 5600 5600 2814.4 58 5591 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=228 18 0 1500 6100 6100 1808.73 40 6124 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=229 13 0 3300 7900 7900 2778.56 50 7882 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=23 21 0 2500 4600 5800 2239.13 40 5810 26332 0 0
|
||||
GET /api/v1/logs?limit=100&offset=230 7 0 2900 6900 6900 3658.83 219 6864 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=231 21 0 3300 8000 10000 3417.89 43 10407 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=232 9 0 1800 11000 11000 2806.22 40 10876 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=233 19 0 1900 8300 8300 2084.12 38 8281 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=234 18 0 1100 5300 5300 1557.69 43 5310 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=235 17 0 2700 7500 7500 3039.85 54 7484 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=236 15 0 2100 7200 7200 2024.78 41 7185 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=237 23 0 1800 4600 5800 2012.76 46 5850 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=238 18 0 3000 8200 8200 3531.19 59 8203 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=239 19 0 2900 8800 8800 3069.91 41 8750 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=24 8 0 400 5600 5600 1765.6 89 5637 25856 0 0
|
||||
GET /api/v1/logs?limit=100&offset=240 10 0 2700 10000 10000 3494.15 64 10179 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=241 12 0 3000 11000 11000 4103.83 48 11386 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=242 12 0 1600 7300 7300 2323.87 87 7327 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=243 11 0 3200 7100 7100 3192.27 54 7098 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=244 18 0 1900 11000 11000 2685.12 44 11048 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=245 19 0 1300 8200 8200 2481.04 38 8208 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=246 13 0 1900 5800 5800 2509 37 5769 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=247 17 0 1700 7800 7800 2386.18 45 7810 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=248 13 0 2600 9600 9600 2293.19 9 9602 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=249 16 0 1900 7500 7500 2729.7 60 7468 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=25 16 0 3100 5600 5600 2808.78 51 5635 25329 0 0
|
||||
GET /api/v1/logs?limit=100&offset=250 11 0 2900 6500 6500 3081.86 1423 6548 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=251 15 0 3200 7600 7600 2906.7 78 7625 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=252 6 0 1400 7700 7700 3419.49 45 7683 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=253 8 0 2600 7800 7800 3223.01 74 7849 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=254 11 0 1900 5300 5300 2027.91 2 5284 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=255 13 0 1300 5100 5100 2097.11 103 5105 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=256 11 0 1400 7100 7100 2143.65 80 7068 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=257 7 0 1700 2800 2800 1318.46 55 2772 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=258 10 0 1700 7900 7900 1925.44 81 7942 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=259 15 0 3100 7000 7000 2829.84 6 7048 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=26 20 0 420 10000 10000 2167.79 39 10447 24880 0 0
|
||||
GET /api/v1/logs?limit=100&offset=260 13 0 2200 8200 8200 2665.29 47 8163 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=261 24 0 2400 7800 8300 2961.9 46 8268 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=262 12 0 2700 4800 4800 2775.47 58 4780 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=263 10 0 2100 6000 6000 2442.66 68 5981 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=264 14 0 2800 5900 5900 2443.98 23 5860 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=265 15 0 1400 8000 8000 2610.8 73 7961 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=266 17 0 1600 7100 7100 2593.08 49 7055 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=267 13 0 1900 7500 7500 2704.84 53 7464 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=268 14 0 2400 10000 10000 3155.34 56 10153 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=269 13 0 1900 6300 6300 2170.66 41 6278 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=27 11 0 3000 8800 8800 2881.68 58 8777 24402 0 0
|
||||
GET /api/v1/logs?limit=100&offset=270 16 0 1600 5200 5200 1854.6 35 5176 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=271 13 0 1300 10000 10000 2120.88 48 10284 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=272 12 0 1100 5500 5500 1890.27 46 5506 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=273 15 0 1600 8000 8000 2512.15 48 7956 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=274 11 0 3200 11000 11000 3713.7 46 11277 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=275 15 0 2000 10000 10000 2662.32 58 10225 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=276 8 0 6500 14000 14000 6458.25 51 14075 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=277 16 0 2800 6400 6400 2954.71 56 6390 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=278 15 0 2500 9500 9500 3247.99 38 9547 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=279 8 0 2900 5600 5600 2955.74 64 5590 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=28 18 0 1700 8900 8900 2420.56 41 8941 23918 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=280 15 0 1900 7400 7400 2613.59 55 7366 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=281 19 0 1700 5900 5900 2093.09 48 5896 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=282 11 0 2500 6800 6800 2756.24 39 6834 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=283 14 0 1400 6800 6800 1906.32 49 6752 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=284 14 0 250 6100 6100 1535.6 29 6134 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=285 13 0 1400 4400 4400 1889.41 33 4392 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=286 13 0 1600 7700 7700 2866.8 59 7711 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=287 10 0 1600 8700 8700 3156.14 56 8678 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=288 8 0 2300 7500 7500 3250.7 1454 7545 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=289 16 0 3500 11000 11000 4098.2 46 11164 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=29 20 0 1700 7300 7300 2537.82 45 7337 23438 0 0
|
||||
GET /api/v1/logs?limit=100&offset=290 9 0 860 4400 4400 1403.7 181 4401 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=291 16 0 1900 6700 6700 2540.49 37 6703 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=292 15 0 3300 12000 12000 3801.47 36 12122 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=293 12 0 1600 8100 8100 2496.44 85 8054 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=294 13 0 1900 10000 10000 2826.56 38 10324 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=295 12 0 4700 7700 7700 4704.06 40 7659 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=296 9 0 4600 7500 7500 3455.69 177 7459 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=297 15 0 2200 7100 7100 2297.8 45 7121 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=298 25 0 1700 6700 9400 2524.79 32 9383 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=299 17 0 2000 8800 8800 2796.56 27 8822 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=3 13 0 2300 8300 8300 3665 1150 8283 36031 0 0
|
||||
GET /api/v1/logs?limit=100&offset=30 24 0 1900 6700 7100 2635.95 32 7100 22960 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=300 12 0 850 6900 6900 1932.54 49 6902 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=301 13 0 1500 5100 5100 1766.86 51 5144 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=302 19 0 2800 7900 7900 3568.27 57 7917 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=303 7 0 1800 11000 11000 3440.52 71 10507 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=304 11 0 3000 9600 9600 3192.1 41 9591 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=305 19 0 1600 12000 12000 2406.03 60 12389 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=306 6 0 68 7000 7000 2154.4 40 7036 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=307 14 0 1800 8300 8300 3492.16 1293 8280 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=308 13 0 2500 8000 8000 2765.33 67 8038 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=309 15 0 1600 12000 12000 3057.51 26 12266 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=31 12 0 1900 8400 8400 2350.09 43 8374 22476 0 0
|
||||
GET /api/v1/logs?limit=100&offset=310 18 0 2000 6900 6900 2705.94 34 6938 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=311 13 0 1900 5700 5700 2637.03 58 5678 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=312 11 0 1500 13000 13000 2992.69 69 12675 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=313 17 0 2000 7100 7100 2851.13 43 7075 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=314 19 0 2100 10000 10000 2855.51 100 10329 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=315 19 0 3000 14000 14000 3339.96 6 13622 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=316 15 0 2200 6700 6700 2411.7 38 6676 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=317 17 0 2500 6900 6900 2897.32 82 6894 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=318 11 0 2200 5100 5100 2557.84 33 5080 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=319 12 0 2100 7700 7700 3177.46 59 7714 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=32 13 0 1800 8300 8300 2684.35 50 8276 22018 0 0
|
||||
GET /api/v1/logs?limit=100&offset=320 12 0 1600 11000 11000 3614.28 56 10520 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=321 19 0 1600 5200 5200 1922.11 45 5213 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=322 20 0 1700 7500 7500 2110.64 48 7512 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=323 12 0 1200 7500 7500 2058.14 46 7528 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=324 14 0 1700 8100 8100 2468.98 57 8149 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=325 8 0 1200 4600 4600 1733.26 39 4563 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=326 11 0 1700 7300 7300 2556.04 39 7341 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=327 19 0 2000 8600 8600 2253.43 43 8555 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=328 13 0 1900 9900 9900 2806.69 37 9948 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=329 20 0 1800 5400 5400 2172.56 45 5361 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=33 14 0 2600 5100 5100 2498.78 62 5136 21490 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=330 12 0 630 7200 7200 2276.41 55 7238 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=331 20 0 1800 6700 6700 3060.26 34 6690 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=332 18 0 1700 6300 6300 2050.53 41 6302 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=333 10 0 1700 6600 6600 2888.98 52 6626 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=334 16 0 1800 6100 6100 2253.18 47 6106 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=335 19 0 2300 5800 5800 2278.37 50 5779 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=336 9 0 1200 4000 4000 1624.26 56 4024 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=337 13 0 1400 3800 3800 1496.47 53 3843 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=338 11 0 1600 7200 7200 2240.96 62 7204 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=339 15 0 1000 5400 5400 1691.48 49 5443 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=34 9 0 3200 6900 6900 3041.86 127 6889 21038 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=340 14 0 1700 5100 5100 1622.69 48 5138 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=341 16 0 1700 5200 5200 1953.64 48 5214 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=342 18 0 2200 8000 8000 2563.89 43 8043 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=343 14 0 2500 7100 7100 3055.48 57 7064 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=344 13 0 2200 9800 9800 2968.89 89 9768 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=345 10 0 2500 4700 4700 2450.89 56 4741 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=346 14 0 3200 7300 7300 2834.87 26 7302 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=347 15 0 3000 6700 6700 2900.4 99 6730 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=348 12 0 2300 6700 6700 2906.91 74 6693 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=349 19 0 1800 7000 7000 2286.79 43 7032 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=35 17 0 2100 4700 4700 2114.38 63 4678 20488 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=350 11 0 2200 6800 6800 2147.07 46 6779 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=351 13 0 2300 5200 5200 2360.29 43 5206 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=352 11 0 1200 4500 4500 1675.27 38 4501 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=353 19 0 2000 7700 7700 2202.21 47 7723 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=354 8 0 1100 5100 5100 2288.22 50 5121 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=355 14 0 1700 6200 6200 2021.97 49 6179 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=356 14 0 2200 5500 5500 2091.9 45 5515 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=357 20 0 1700 10000 10000 2518.45 37 10037 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=358 16 0 2000 5700 5700 2400.05 63 5708 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=359 18 0 1500 7800 7800 2362.87 45 7811 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=36 11 0 4500 6700 6700 3834.12 36 6707 20002 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=360 13 0 2000 5400 5400 2537.12 32 5387 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=361 14 0 3600 7100 7100 4048.11 1522 7056 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=362 17 0 2200 8700 8700 3156.13 43 8748 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=363 11 0 3800 6800 6800 3234.23 45 6779 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=364 10 0 1700 4000 4000 1708.24 29 3986 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=365 8 0 1900 7000 7000 2722.84 61 6959 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=366 16 0 1900 5500 5500 2473.05 53 5491 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=367 8 0 2100 9300 9300 3742.45 83 9312 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=368 13 0 2000 8400 8400 2661.33 54 8404 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=369 11 0 2700 6300 6300 2901.63 22 6275 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=37 15 0 1700 9000 9000 2450.25 84 8981 19552 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=370 14 0 2700 10000 10000 3273.66 40 10310 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=371 20 0 1700 5200 5200 1982.23 11 5234 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=372 13 0 1300 8600 8600 2122.1 46 8556 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=373 10 0 1900 11000 11000 3044.93 42 10657 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=374 15 0 2200 8300 8300 2770.91 34 8309 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=375 14 0 1800 6700 6700 2060.09 29 6704 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=376 13 0 1900 5900 5900 2635.8 149 5916 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=377 16 0 1800 6200 6200 2780.82 466 6196 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=378 15 0 3300 8100 8100 3192.41 448 8120 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=379 16 0 1400 3900 3900 1637.36 14 3878 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=38 26 0 2700 12000 13000 3466.6 88 12817 19010 0 0
|
||||
GET /api/v1/logs?limit=100&offset=380 17 0 1700 7800 7800 2316 37 7800 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=381 18 0 1600 6100 6100 1558.3 43 6146 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=382 10 0 2300 4900 4900 2364.97 54 4911 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=383 12 0 1900 10000 10000 3179.87 53 10474 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=384 18 0 3000 11000 11000 3008.23 39 10860 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=385 16 0 2200 10000 10000 3086.66 65 10291 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=386 7 0 3800 10000 10000 4197.46 89 10194 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=387 18 0 1800 6900 6900 2695.52 42 6852 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=388 14 0 2900 7600 7600 3411.6 236 7580 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=389 11 0 1900 5400 5400 2417.84 86 5400 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=39 15 0 2200 5300 5300 2288.29 69 5267 18526 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=390 16 0 2800 12000 12000 3643.98 37 11583 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=391 12 0 2000 8100 8100 2964.87 48 8096 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=392 17 0 3200 7000 7000 3526.17 77 7047 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=393 8 0 2900 7000 7000 3473.38 38 7003 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=394 11 0 2000 7300 7300 2383.37 46 7257 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=395 14 0 170 6700 6700 1903.61 42 6717 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=396 21 0 2100 8200 10000 2860.36 50 10302 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=397 17 0 1900 21000 21000 3530.78 41 21000 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=398 15 0 2100 9400 9400 2906.07 52 9414 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=399 17 0 2300 6600 6600 2441.5 60 6595 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=4 13 0 1800 8000 8000 2667.7 70 7971 35565 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=40 20 0 2300 12000 12000 3540.46 50 12321 18066 0 0
|
||||
GET /api/v1/logs?limit=100&offset=400 15 0 2600 11000 11000 3361.56 27 10802 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=401 14 0 1100 4400 4400 1242.2 31 4415 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=402 20 0 2700 6000 6000 2929.92 90 6047 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=403 12 0 2000 10000 10000 3025.17 27 10464 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=404 8 0 1700 8100 8100 2527.29 43 8065 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=405 15 0 3000 9800 9800 3286.33 35 9834 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=406 18 0 3600 5300 5300 3034.02 58 5251 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=407 16 0 1800 8000 8000 2555.99 33 8002 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=408 15 0 2200 13000 13000 3911.18 57 12597 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=409 10 0 97 5300 5300 1814.96 39 5264 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=41 14 0 2600 8200 8200 3091.27 35 8188 17564 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=410 9 0 3300 10000 10000 3835.01 63 10055 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=411 17 0 2200 5000 5000 2282.05 57 5041 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=412 9 0 1300 4800 4800 1417.87 37 4753 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=413 10 0 3400 6700 6700 3076.02 23 6668 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=414 17 0 1800 8100 8100 2651.41 58 8143 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=415 7 0 1800 5000 5000 2512.06 1093 4996 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=416 9 0 3200 9900 9900 3504.86 25 9892 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=417 15 0 1800 11000 11000 3111.07 30 11219 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=418 21 0 2400 7800 8000 2657.08 56 8012 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=419 13 0 3500 5000 5000 2544.07 51 4960 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=42 16 0 2500 6600 6600 2670.59 58 6588 17048 0 0
|
||||
GET /api/v1/logs?limit=100&offset=420 10 0 1300 7100 7100 3016 65 7149 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=421 19 0 2400 9100 9100 2970.57 67 9106 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=422 16 0 2200 6900 6900 2911.66 9 6930 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=423 10 0 3400 7700 7700 3315.89 7 7683 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=424 20 0 2600 12000 12000 3841.66 58 11805 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=425 19 0 1800 7100 7100 2445.36 60 7062 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=426 16 0 2300 8900 8900 3247 49 8883 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=427 11 0 1900 10000 10000 2951.39 26 10201 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=428 5 0 1200 3500 3500 1565.47 68 3467 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=429 11 0 940 12000 12000 2018.63 28 12234 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=43 20 0 1600 12000 12000 2414.94 111 12035 16524 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=430 10 0 2800 7400 7400 3292.65 1772 7356 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=431 11 0 1500 8100 8100 2888.79 51 8088 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=432 14 0 1700 11000 11000 3405.84 59 10805 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=433 12 0 420 6000 6000 1848.15 53 6027 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=434 11 0 1900 5100 5100 2547.49 69 5103 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=435 10 0 880 7800 7800 2790.18 26 7842 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=436 13 0 1800 5800 5800 2280.67 39 5779 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=437 13 0 2100 5700 5700 2263.81 40 5735 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=438 17 0 1900 6300 6300 2038.43 269 6284 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=439 10 0 2800 8500 8500 3989.74 56 8528 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=44 18 0 1800 7800 7800 2398.34 54 7839 16030 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=440 18 0 1600 8000 8000 2418.73 43 7986 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=441 13 0 2300 7200 7200 2826.69 25 7230 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=442 19 0 1900 5700 5700 2148.06 81 5652 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=443 17 0 1700 8400 8400 2316.13 55 8421 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=444 11 0 1900 8900 8900 3054.05 43 8856 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=445 17 0 3200 14000 14000 3493.4 52 13734 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=446 14 0 2800 5900 5900 2653.46 54 5937 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=447 8 0 1600 7100 7100 2767.62 63 7116 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=448 16 0 1600 8700 8700 2344.33 48 8741 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=449 8 0 1000 4400 4400 1749.08 45 4390 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=45 17 0 2500 7700 7700 2877.3 52 7742 15522 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=450 16 0 2300 5700 5700 2689.35 34 5713 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=451 19 0 3000 8800 8800 3411.38 52 8847 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=452 16 0 3300 11000 11000 3566.97 68 10703 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=453 17 0 2900 12000 12000 3534.98 36 11987 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=454 16 0 1600 8000 8000 2410.26 7 8008 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=455 14 0 1100 3900 3900 1565.9 56 3897 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=456 15 0 2000 5200 5200 2310.93 32 5190 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=457 11 0 3400 6600 6600 3021.7 57 6616 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=458 19 0 1700 8400 8400 2235.44 43 8410 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=459 10 0 1900 7500 7500 2181.67 26 7535 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=46 14 0 1900 8500 8500 2545.8 38 8472 15077 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=460 7 0 1800 3900 3900 1784.38 75 3903 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=461 13 0 3000 13000 13000 3391.67 58 12717 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=462 13 0 3000 6000 6000 2873.27 70 5988 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=463 20 0 3800 8400 8400 3405.24 52 8376 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=464 13 0 2800 10000 10000 3340.92 60 10352 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=465 12 0 1300 10000 10000 3375.47 48 10237 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=466 15 0 1600 4500 4500 2009.78 293 4547 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=467 19 0 1600 8800 8800 2511.22 42 8778 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=468 9 0 1900 8000 8000 2244.49 55 8012 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=469 9 0 140 8600 8600 1931.26 41 8587 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=47 25 0 1800 6400 11000 2575.91 19 11149 14597 0 0
|
||||
GET /api/v1/logs?limit=100&offset=470 11 0 2100 7900 7900 2938.22 215 7907 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=471 11 0 2100 5200 5200 2131.6 54 5238 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=472 19 0 2200 6600 6600 2569.87 51 6626 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=473 16 0 1700 7500 7500 2810.71 53 7495 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=474 11 0 2600 10000 10000 3731.63 85 10393 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=475 13 0 3400 7000 7000 3468.32 47 7019 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=476 12 0 2100 6700 6700 2418.69 57 6734 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=477 11 0 2400 5400 5400 2170.83 47 5357 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=478 17 0 2300 9600 9600 2790.69 34 9579 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=479 9 0 3600 8300 8300 3548.88 70 8315 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=48 17 0 2000 8600 8600 2636.62 28 8563 13947 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=480 14 0 1400 7600 7600 2326.91 62 7553 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=481 17 0 1900 5300 5300 2568.91 139 5277 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=482 14 0 2000 5900 5900 2501.19 56 5943 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=483 11 0 1400 4900 4900 1891.01 66 4852 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=484 9 0 1600 6900 6900 2796.53 59 6887 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=485 10 0 1700 5000 5000 2395.27 244 5001 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=486 14 0 1400 7600 7600 1984.36 55 7565 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=487 10 0 1900 6100 6100 2247.59 57 6054 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=488 11 0 2400 8000 8000 3012.54 60 8016 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=489 19 0 1700 8900 8900 2223.23 43 8856 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=49 9 0 1600 2900 2900 1259.89 49 2931 13281 0 0
|
||||
GET /api/v1/logs?limit=100&offset=490 19 0 2700 7500 7500 2660.56 39 7526 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=491 7 0 3600 11000 11000 4269.82 550 11477 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=492 21 0 1800 6000 8200 2015.68 38 8205 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=493 19 0 2300 8600 8600 3413.23 56 8638 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=494 12 0 2900 5900 5900 2950.51 48 5890 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=495 12 0 1800 6800 6800 2062.5 38 6793 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=496 12 0 2000 6200 6200 2397.76 54 6228 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=497 14 0 2500 14000 14000 4040.12 59 13934 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=498 13 0 2200 11000 11000 4017.23 92 11480 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=499 15 0 3100 12000 12000 3240.28 35 12175 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=5 15 0 2000 8000 8000 2824.85 60 8039 35107 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=50 16 0 3100 5300 5300 2884.24 44 5278 12641 0 0
|
||||
GET /api/v1/logs?limit=100&offset=500 11 0 2900 5300 5300 2614.47 64 5255 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=501 15 0 2100 6000 6000 2400.74 37 6014 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=502 11 0 2000 7500 7500 2307.08 70 7544 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=503 8 0 2400 11000 11000 3715.83 96 11102 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=504 23 0 2000 6000 7200 2763.32 54 7209 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=505 8 0 4500 14000 14000 5814.44 41 14029 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=506 15 0 1800 7300 7300 2313.51 48 7293 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=507 17 0 1700 8000 8000 2429.32 62 7996 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=508 14 0 1400 5800 5800 2193.09 48 5760 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=509 11 0 3500 6100 6100 3122.81 92 6081 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=51 12 0 1900 10000 10000 2768.51 75 10468 12015 0 0
|
||||
GET /api/v1/logs?limit=100&offset=510 16 0 2500 6100 6100 2576.67 44 6076 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=511 12 0 1600 6700 6700 2740.02 41 6750 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=512 17 0 1600 8000 8000 2557.23 42 8033 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=513 20 0 1600 7000 7000 2187.41 28 6999 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=514 17 0 1100 7900 7900 1918.16 43 7926 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=515 15 0 1500 8400 8400 2298.09 44 8445 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=516 18 0 3700 10000 10000 4065.03 71 10432 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=517 15 0 4200 6600 6600 3563.65 59 6585 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=518 10 0 2000 7000 7000 2692.66 188 7038 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=519 12 0 1800 6600 6600 2090.28 54 6594 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=52 11 0 1700 6100 6100 2689.82 34 6065 11275 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=520 13 0 3200 7600 7600 3415.33 89 7615 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=521 20 0 2000 7900 7900 2743.2 52 7894 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=522 18 0 1200 7400 7400 1811.34 39 7394 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=523 14 0 2500 10000 10000 3027.5 57 10291 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=524 22 0 1300 7400 7800 2551.12 53 7757 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=525 5 0 3300 8900 8900 4208.46 1473 8872 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=526 20 0 2600 5900 5900 3012.41 303 5892 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=527 6 0 84 6700 6700 2079.07 47 6733 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=528 11 0 1700 8200 8200 2603.55 57 8171 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=529 16 0 2300 8100 8100 2616.12 65 8058 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=53 9 0 2200 4900 4900 2207.53 70 4911 10823 0 0
|
||||
GET /api/v1/logs?limit=100&offset=530 18 0 1500 6800 6800 1770.37 51 6840 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=531 13 0 2200 10000 10000 2981.54 61 10285 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=532 12 0 4700 14000 14000 5782.65 2056 14422 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=533 16 0 2400 5800 5800 2701.19 121 5836 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=534 15 0 2400 9500 9500 3167.75 43 9464 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=535 12 0 1800 7100 7100 3004.5 64 7061 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=536 12 0 1700 5900 5900 2372.94 59 5939 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=537 12 0 2800 11000 11000 4825.11 53 11340 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=538 15 0 2100 13000 13000 2695.11 31 12561 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=539 15 0 3400 7100 7100 3233.7 117 7072 47 0.1 0
|
||||
Aggregated 232648 0 690 6500 9500 1773.51 0 24410 3317.24 880.4 0
|
||||
|
@@ -0,0 +1,502 @@
|
||||
Type Name # Requests # Fails Median (ms) 95%ile (ms) 99%ile (ms) Average (ms) Min (ms) Max (ms) Average size (bytes) Current RPS Current Failures/s
|
||||
GET /api/v1/attackers 37331 0 860 2800 3800 1130.72 2 8626 43 194.8 0
|
||||
GET /api/v1/attackers?search=brute&sort_by=recent 18631 0 1000 3100 4100 1328.24 3 8728 43 108.4 0
|
||||
POST /api/v1/auth/login 9220 0 1200 3200 6300 1533.78 178 16444 259 46.7 0
|
||||
POST /api/v1/auth/login [on_start] 1500 0 4400 12000 15000 5068.09 204 16481 259 0 0
|
||||
GET /api/v1/bounty 27619 0 490 1600 3000 588.08 1 8572 43 136.8 0
|
||||
GET /api/v1/config 14058 0 540 2000 3600 680.16 1 7108 214 70 0
|
||||
GET /api/v1/deckies 32497 0 440 1000 2900 523.44 1 10176 2 159 0
|
||||
GET /api/v1/health 13802 0 610 2100 4200 789.43 1 13735 337 71.2 0
|
||||
GET /api/v1/logs/histogram 23418 0 470 1200 2300 532.88 1 7582 125 116.4 0
|
||||
GET /api/v1/logs?limit=100&offset=0 24 0 760 2500 3700 1141.24 302 3708 37830 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=1 22 0 800 2100 2400 954.31 158 2417 36893 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=10 15 0 850 4100 4100 1202.09 317 4097 32590 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=100 30 0 760 2700 3500 1075.49 161 3517 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=1000 21 0 1100 2500 2800 1273.53 233 2797 48 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=101 20 0 790 2100 2100 858 165 2106 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=102 22 0 730 2100 3200 1012.39 308 3198 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=103 23 0 820 2200 2800 1023.35 80 2772 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=104 14 0 820 2700 2700 906.37 341 2708 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=105 20 0 740 3300 3300 1133.87 221 3348 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=106 18 0 830 2400 2400 1006.42 268 2386 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=107 20 0 900 3000 3000 1327.27 232 3032 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=108 16 0 950 4500 4500 1355.38 443 4521 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=109 16 0 820 2200 2200 982.99 231 2234 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=11 13 0 1200 3300 3300 1384.8 207 3326 32152 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=110 11 0 1100 3000 3000 1335.88 580 2991 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=111 21 0 740 2100 2200 903.46 44 2224 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=112 19 0 840 3400 3400 1106.06 168 3362 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=113 23 0 770 2400 2600 931.69 288 2643 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=114 14 0 930 2500 2500 1183.1 430 2513 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=115 14 0 870 3500 3500 1239.44 412 3452 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=116 20 0 810 3800 3800 1146.58 419 3824 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=117 14 0 1300 3100 3100 1321.58 155 3056 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=118 18 0 920 4900 4900 1149.89 98 4855 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=119 20 0 800 3100 3100 1188.43 99 3071 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=12 17 0 1000 3800 3800 1182.85 598 3760 31688 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=120 16 0 920 4600 4600 1400.39 391 4648 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=121 17 0 890 2900 2900 1081.35 291 2902 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=122 15 0 770 2800 2800 1009.1 112 2772 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=123 14 0 810 1900 1900 883.04 363 1924 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=124 20 0 820 2400 2400 1008.2 205 2379 47 0.6 0
|
||||
GET /api/v1/logs?limit=100&offset=125 24 0 940 2600 3100 1149.98 238 3119 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=126 20 0 920 3700 3700 1174.68 225 3726 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=127 13 0 620 2700 2700 783.37 76 2676 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=128 15 0 1300 5000 5000 1589.75 177 4976 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=129 12 0 670 4500 4500 1085.47 295 4492 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=13 16 0 650 1800 1800 905.79 137 1819 30974 0 0
|
||||
GET /api/v1/logs?limit=100&offset=130 20 0 770 2000 2000 942.54 67 2048 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=131 25 0 940 2800 3300 1119.11 182 3340 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=132 18 0 1000 1700 1700 972.41 212 1724 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=133 17 0 960 3500 3500 1334.52 306 3544 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=134 12 0 840 1700 1700 953.16 130 1655 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=135 14 0 930 3700 3700 1437.01 97 3710 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=136 26 0 840 1900 2600 1049.81 336 2645 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=137 16 0 690 2800 2800 934.44 219 2780 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=138 25 0 910 2400 2500 1036.58 523 2469 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=139 23 0 1100 2400 2500 1237.61 272 2549 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=14 22 0 720 3100 5300 1215.92 151 5274 30514 0 0
|
||||
GET /api/v1/logs?limit=100&offset=140 20 0 950 3100 3100 1168.92 153 3101 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=141 18 0 1200 3100 3100 1462.32 477 3141 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=142 15 0 860 2600 2600 1199.98 4 2559 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=143 12 0 790 3000 3000 1058.39 179 2986 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=144 14 0 940 2200 2200 1062.13 360 2197 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=145 21 0 1000 2500 2700 1152.59 317 2729 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=146 22 0 770 1600 2600 918.96 178 2583 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=147 20 0 800 1600 1600 851.46 218 1633 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=148 14 0 790 2900 2900 1153.33 172 2903 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=149 15 0 710 2200 2200 867.03 297 2186 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=15 19 0 1100 3400 3400 1228.86 439 3357 30054 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=150 21 0 1000 1800 4100 1194.49 602 4094 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=151 18 0 910 4300 4300 1385.26 193 4257 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=152 14 0 970 3300 3300 1382.44 374 3260 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=153 11 0 810 2100 2100 967.86 122 2122 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=154 14 0 870 3500 3500 1259.94 575 3466 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=155 9 0 700 2800 2800 917.77 184 2830 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=156 17 0 770 3100 3100 1213.05 338 3067 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=157 26 0 910 3100 3800 1261.99 162 3801 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=158 18 0 760 1600 1600 858.43 252 1594 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=159 17 0 940 3000 3000 1193.43 370 3001 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=16 19 0 1100 3900 3900 1311.55 323 3871 29590 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=160 13 0 1300 4200 4200 1586.14 133 4162 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=161 17 0 1300 2800 2800 1370.88 446 2837 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=162 25 0 870 2200 2200 1035.05 180 2210 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=163 17 0 940 3700 3700 1426.81 125 3655 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=164 16 0 800 4900 4900 1124.09 101 4865 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=165 13 0 1000 4500 4500 1502.36 376 4492 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=166 22 0 990 3500 4800 1459.18 61 4835 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=167 13 0 850 3300 3300 1101.88 143 3346 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=168 21 0 930 2600 3100 1238.99 157 3052 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=169 14 0 660 4300 4300 1007.22 73 4285 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=17 12 0 820 2300 2300 1121.84 527 2261 29144 0 0
|
||||
GET /api/v1/logs?limit=100&offset=170 19 0 850 1700 1700 966.51 233 1718 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=171 15 0 1400 3800 3800 1401.82 245 3843 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=172 19 0 850 3600 3600 1257.07 381 3567 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=173 20 0 770 3100 3100 1122.25 295 3114 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=174 19 0 790 1800 1800 964.61 67 1842 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=175 12 0 1300 3600 3600 1534.58 596 3596 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=176 16 0 760 2100 2100 910.43 206 2087 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=177 21 0 1100 4200 4700 1658.36 202 4653 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=178 18 0 680 3800 3800 927.89 133 3766 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=179 20 0 940 3900 3900 1314.44 179 3873 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=18 15 0 770 2400 2400 980.45 246 2384 28680 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=180 21 0 1000 1700 2200 1097.7 464 2210 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=181 27 0 750 2300 2700 966.44 49 2674 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=182 21 0 950 5100 9700 1727.85 339 9706 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=183 23 0 840 2400 2800 987.54 121 2776 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=184 20 0 1100 2700 2700 1351.44 359 2658 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=185 12 0 860 3500 3500 1163 468 3494 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=186 17 0 800 2800 2800 998 163 2812 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=187 15 0 800 2500 2500 1013.04 436 2479 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=188 20 0 880 3500 3500 1295.8 151 3465 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=189 22 0 1200 2500 2900 1205.59 92 2931 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=19 13 0 880 3000 3000 1236.65 389 2979 28234 0 0
|
||||
GET /api/v1/logs?limit=100&offset=190 13 0 860 2200 2200 973.74 134 2166 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=191 13 0 830 3700 3700 1249.61 307 3663 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=192 15 0 960 3600 3600 1336.7 253 3620 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=193 16 0 800 2400 2400 1094.08 470 2423 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=194 17 0 1400 3000 3000 1484.75 488 3003 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=195 17 0 850 2800 2800 1054.88 120 2763 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=196 17 0 700 3700 3700 1106.38 46 3722 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=197 19 0 830 4200 4200 1320.88 278 4197 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=198 18 0 1300 5600 5600 1924.18 365 5646 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=199 20 0 740 2500 2500 892.8 324 2474 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=2 12 0 1500 7800 7800 2067.38 530 7783 36489 0 0
|
||||
GET /api/v1/logs?limit=100&offset=20 23 0 840 1200 1500 827.17 67 1508 27784 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=200 19 0 720 2300 2300 823.32 310 2326 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=201 23 0 930 3000 3400 1187.07 201 3447 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=202 26 0 790 3000 3000 1098.46 100 3036 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=203 22 0 870 1800 2300 962.49 258 2290 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=204 10 0 840 2200 2200 895.42 297 2230 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=205 20 0 860 3200 3200 1165.02 287 3208 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=206 20 0 750 3300 3300 1082.67 284 3332 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=207 18 0 800 1700 1700 893.54 236 1666 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=208 21 0 820 2200 4300 1102.13 93 4293 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=209 22 0 910 2400 3100 1279.57 462 3140 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=21 10 0 700 3900 3900 1233.98 353 3906 27290 0 0
|
||||
GET /api/v1/logs?limit=100&offset=210 24 0 740 1600 1800 883.93 129 1811 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=211 25 0 760 4100 4600 1252.04 48 4593 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=212 7 0 1100 3500 3500 1306.82 493 3543 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=213 17 0 900 4000 4000 1108.36 229 4008 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=214 12 0 860 2300 2300 1016.16 490 2251 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=215 21 0 790 3300 4700 1397.5 464 4734 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=216 22 0 880 2500 3100 1186.68 124 3085 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=217 19 0 790 2200 2200 1003.66 400 2181 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=218 19 0 810 2500 2500 992.36 350 2498 47 0.4 0
|
||||
GET /api/v1/logs?limit=100&offset=219 18 0 800 2900 2900 1071.26 462 2925 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=22 24 0 730 2900 3200 1111.67 371 3160 26810 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=220 13 0 710 2300 2300 877.49 109 2284 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=221 18 0 930 3100 3100 1151.92 540 3139 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=222 20 0 900 3200 3200 1201.45 302 3225 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=223 16 0 740 2200 2200 940.86 238 2195 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=224 23 0 870 3600 3600 1467.5 394 3640 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=225 19 0 850 4600 4600 1298.88 475 4633 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=226 15 0 1100 2500 2500 1233.26 226 2512 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=227 21 0 1100 3400 3600 1344.99 163 3555 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=228 17 0 830 2300 2300 1086.09 178 2302 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=229 15 0 790 2500 2500 1063.93 213 2474 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=23 21 0 720 1700 2100 756.23 90 2054 26332 0 0
|
||||
GET /api/v1/logs?limit=100&offset=230 18 0 500 2500 2500 669.21 105 2524 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=231 25 0 840 2200 2600 1080.19 321 2552 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=232 13 0 790 1500 1500 869.37 541 1491 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=233 18 0 780 3300 3300 1106.79 117 3331 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=234 10 0 680 1900 1900 838.13 120 1851 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=235 20 0 770 3900 3900 1124.31 36 3939 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=236 21 0 890 1800 2300 1083.51 449 2266 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=237 17 0 790 3200 3200 1076.14 453 3185 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=238 18 0 790 3500 3500 1214.37 212 3520 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=239 17 0 850 3200 3200 1276.01 49 3205 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=24 21 0 1000 2400 3700 1267.13 139 3671 25856 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=240 15 0 810 4200 4200 1286.06 359 4211 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=241 23 0 840 4100 6500 1374.89 205 6465 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=242 11 0 740 2000 2000 898.86 85 1962 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=243 16 0 830 2700 2700 1038.67 83 2738 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=244 19 0 780 2200 2200 945.2 94 2210 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=245 17 0 840 2200 2200 1026.7 246 2243 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=246 16 0 820 1700 1700 894.27 426 1748 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=247 14 0 750 2400 2400 972.65 270 2439 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=248 18 0 800 2000 2000 902.55 239 1964 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=249 12 0 990 2300 2300 1069.81 83 2304 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=25 21 0 1000 2400 2700 1179.17 93 2729 25329 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=250 12 0 860 3500 3500 1326.28 429 3538 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=251 13 0 840 2100 2100 942.92 147 2101 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=252 23 0 760 2100 3000 1050.19 396 3029 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=253 18 0 1100 3100 3100 1433.5 488 3066 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=254 20 0 820 3400 3400 1194.44 263 3388 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=255 20 0 850 2600 2600 1041.39 472 2575 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=256 20 0 750 3500 3500 983.49 321 3495 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=257 20 0 1100 3100 3100 1315.8 116 3109 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=258 21 0 780 1700 2000 847.22 152 1967 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=259 28 0 780 3800 4100 1262.49 563 4100 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=26 19 0 920 3300 3300 1156.13 81 3343 24880 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=260 19 0 710 2500 2500 914.03 226 2457 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=261 23 0 860 3400 3900 1236.92 382 3875 47 0.4 0
|
||||
GET /api/v1/logs?limit=100&offset=262 18 0 1400 3100 3100 1429.38 506 3144 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=263 18 0 700 2500 2500 999.6 269 2549 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=264 21 0 1300 2400 2700 1324.19 363 2718 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=265 17 0 850 2500 2500 1021.04 127 2492 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=266 19 0 740 3600 3600 958.09 462 3613 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=267 21 0 690 2100 5000 1005.09 82 4970 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=268 18 0 1100 2900 2900 1204.69 481 2906 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=269 15 0 770 2000 2000 834.1 374 1987 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=27 15 0 1200 3300 3300 1228.28 454 3313 24402 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=270 20 0 840 2400 2400 1149.81 264 2355 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=271 21 0 1200 3400 3400 1378.33 180 3419 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=272 19 0 1100 2800 2800 1329.34 376 2781 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=273 18 0 860 2500 2500 1042.92 346 2514 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=274 11 0 910 7400 7400 1646.56 416 7352 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=275 21 0 890 3000 3200 1222.06 228 3201 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=276 19 0 1200 3800 3800 1492.76 248 3778 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=277 22 0 880 2100 2400 1133.85 137 2443 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=278 19 0 990 4300 4300 1347.27 447 4287 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=279 14 0 880 2900 2900 1169.6 235 2882 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=28 24 0 920 3200 3200 1377.67 192 3205 23918 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=280 15 0 840 2400 2400 993.5 37 2429 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=281 15 0 1000 2200 2200 1221.76 337 2224 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=282 13 0 940 1500 1500 887.91 321 1489 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=283 18 0 930 3200 3200 1305.66 471 3180 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=284 13 0 1100 1700 1700 1156.52 561 1679 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=285 18 0 760 2400 2400 1092.85 321 2444 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=286 25 0 900 2300 2600 1126.06 237 2566 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=287 17 0 930 2600 2600 1056.75 51 2562 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=288 27 0 780 2900 3100 1172.47 158 3114 47 0.4 0
|
||||
GET /api/v1/logs?limit=100&offset=289 19 0 840 1900 1900 998.59 383 1925 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=29 22 0 880 1800 2400 1014.37 258 2437 23438 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=290 13 0 890 1700 1700 898.48 467 1686 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=291 27 0 740 3400 4800 1245.41 209 4831 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=292 13 0 790 4300 4300 1224.38 347 4324 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=293 16 0 790 4800 4800 1213.53 131 4768 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=294 18 0 780 3400 3400 1075.57 488 3368 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=295 28 0 790 2500 3300 1104.18 106 3277 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=296 17 0 840 3100 3100 1257.03 99 3057 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=297 21 0 990 4100 4900 1454.67 342 4903 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=298 23 0 880 3100 3300 1274.63 280 3266 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=299 18 0 800 3200 3200 1007.99 264 3184 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=3 15 0 750 3000 3000 1146.29 283 3043 36031 0 0
|
||||
GET /api/v1/logs?limit=100&offset=30 16 0 680 1400 1400 731.35 107 1441 22960 0 0
|
||||
GET /api/v1/logs?limit=100&offset=300 17 0 1200 4800 4800 1514.19 675 4835 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=301 27 0 750 2200 2500 930.82 205 2498 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=302 17 0 840 4000 4000 1290.67 408 4006 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=303 21 0 1100 2700 4100 1371.33 386 4078 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=304 15 0 810 1300 1300 784.51 250 1337 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=305 17 0 1200 3300 3300 1401.66 306 3260 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=306 16 0 710 1900 1900 832.9 111 1865 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=307 14 0 720 1500 1500 912.98 447 1533 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=308 11 0 820 1800 1800 931.99 222 1831 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=309 15 0 830 2900 2900 1244.34 210 2918 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=31 14 0 880 3700 3700 1168.16 247 3676 22476 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=310 16 0 810 4000 4000 1107.01 240 3973 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=311 15 0 1000 2800 2800 1281.69 624 2789 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=312 18 0 950 3600 3600 1324.96 505 3649 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=313 15 0 750 4100 4100 1136.82 419 4101 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=314 17 0 700 1900 1900 853.88 328 1863 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=315 18 0 810 3500 3500 1188.52 46 3455 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=316 18 0 750 2700 2700 851.78 169 2676 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=317 22 0 860 2500 2500 1097.2 329 2470 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=318 19 0 780 2700 2700 971.94 181 2728 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=319 10 0 660 1500 1500 764.14 267 1468 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=32 16 0 790 1700 1700 955.16 48 1720 22018 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=320 22 0 730 2400 3000 1015.46 228 2999 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=321 10 0 800 3300 3300 1076.53 192 3289 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=322 22 0 710 2800 3000 1066.13 137 2964 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=323 20 0 950 1800 1800 878.76 362 1797 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=324 14 0 710 3400 3400 1000.41 166 3372 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=325 12 0 830 2800 2800 1268.9 423 2818 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=326 14 0 890 3200 3200 1135.16 537 3190 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=327 12 0 800 1500 1500 944.32 447 1475 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=328 25 0 1000 2200 2800 1168.8 155 2752 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=329 15 0 880 1400 1400 887.88 532 1352 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=33 24 0 840 2400 2800 1079.22 338 2818 21490 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=330 18 0 780 4100 4100 1297.35 325 4108 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=331 21 0 670 3700 5000 1042.85 212 4959 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=332 18 0 760 2600 2600 1027.06 408 2610 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=333 13 0 1100 3300 3300 1383.5 268 3283 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=334 17 0 870 2800 2800 948.33 206 2777 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=335 17 0 730 4900 4900 1096.91 110 4869 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=336 17 0 890 4200 4200 1419.55 349 4184 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=337 13 0 900 4400 4400 1309.1 174 4376 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=338 21 0 940 3100 3600 1306.81 262 3551 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=339 16 0 810 3100 3100 1097.8 156 3112 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=34 17 0 820 3900 3900 1083.19 202 3859 21038 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=340 28 0 870 3400 3500 1155.76 199 3529 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=341 22 0 800 2600 3300 1095.81 305 3325 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=342 9 0 1100 2500 2500 1346.63 606 2536 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=343 18 0 920 4300 4300 1241.96 278 4264 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=344 13 0 890 3000 3000 1219.54 239 3016 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=345 19 0 860 3700 3700 1260.51 459 3662 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=346 18 0 770 4600 4600 1157.75 175 4575 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=347 20 0 750 1700 1700 788.51 206 1716 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=348 15 0 640 2700 2700 955.85 79 2742 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=349 18 0 790 1700 1700 874.4 179 1671 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=35 12 0 820 2400 2400 1094.23 67 2351 20488 0 0
|
||||
GET /api/v1/logs?limit=100&offset=350 20 0 960 4200 4200 1326.9 115 4213 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=351 17 0 840 3800 3800 1374.43 241 3841 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=352 25 0 880 4500 5000 1294.62 275 4984 47 0.4 0
|
||||
GET /api/v1/logs?limit=100&offset=353 24 0 870 1900 3000 1007.68 75 3001 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=354 11 0 1300 3600 3600 1325.04 221 3635 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=355 19 0 720 4600 4600 1286.34 306 4627 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=356 22 0 910 3000 4400 1232.23 108 4427 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=357 20 0 830 3100 3100 966.58 357 3129 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=358 16 0 770 2900 2900 1222.43 355 2909 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=359 13 0 660 1800 1800 820.37 505 1764 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=36 20 0 780 3100 3100 1196.47 466 3100 20002 0 0
|
||||
GET /api/v1/logs?limit=100&offset=360 18 0 860 2200 2200 919.28 373 2215 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=361 22 0 690 2400 3100 1019.54 276 3115 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=362 24 0 1100 2800 3200 1351.4 418 3167 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=363 24 0 840 2400 3600 1042.54 87 3649 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=364 27 0 950 3100 3200 1162.07 148 3180 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=365 15 0 950 3600 3600 1077.57 575 3563 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=366 20 0 770 3000 3000 1170.36 271 2984 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=367 22 0 1100 2500 2500 1250.83 333 2540 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=368 26 0 840 2500 2500 1095.77 261 2507 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=369 16 0 810 2200 2200 1078.09 524 2202 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=37 20 0 940 2600 2600 1026.27 157 2639 19552 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=370 22 0 850 2700 3000 1138.04 215 2971 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=371 19 0 940 3800 3800 1276.35 247 3793 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=372 13 0 830 4600 4600 1462.09 544 4646 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=373 20 0 840 3200 3200 1045.12 70 3170 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=374 19 0 930 2700 2700 1069.67 141 2731 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=375 17 0 690 3000 3000 995.37 170 3002 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=376 14 0 640 3300 3300 886.5 276 3258 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=377 14 0 870 2500 2500 1169.11 179 2472 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=378 10 0 590 3400 3400 1160.61 319 3364 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=379 28 0 770 2400 2500 1025.96 87 2472 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=38 13 0 960 2800 2800 1303.77 395 2786 19010 0 0
|
||||
GET /api/v1/logs?limit=100&offset=380 15 0 900 2500 2500 938.5 77 2494 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=381 14 0 810 2500 2500 967.21 97 2468 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=382 21 0 1000 2700 4800 1331.33 133 4834 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=383 16 0 800 2000 2000 901.38 66 1970 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=384 17 0 780 4200 4200 1123.94 243 4227 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=385 20 0 910 3300 3300 1239.74 332 3319 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=386 15 0 790 3200 3200 1098.27 188 3224 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=387 21 0 660 2500 3800 1072.19 461 3765 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=388 24 0 820 2500 4100 1146.12 171 4090 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=389 15 0 830 1700 1700 798.57 58 1724 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=39 15 0 980 3200 3200 1207.3 604 3230 18526 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=390 12 0 860 2300 2300 1191.27 354 2273 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=391 14 0 940 3100 3100 1168.21 111 3087 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=392 11 0 700 2700 2700 1077.89 320 2690 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=393 12 0 820 2700 2700 1180.96 217 2724 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=394 17 0 810 3300 3300 1128.99 468 3265 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=395 17 0 790 3000 3000 1087.59 547 3034 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=396 9 0 840 2300 2300 1159.43 166 2268 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=397 10 0 750 2400 2400 979.63 603 2402 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=398 17 0 840 5500 5500 1360 335 5469 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=399 21 0 790 2200 5000 1016.56 40 5044 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=4 16 0 970 2600 2600 1005.64 399 2567 35565 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=40 22 0 730 1800 2100 823.13 80 2078 18066 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=400 20 0 900 4000 4000 1401.73 379 3976 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=401 18 0 870 3000 3000 1156.76 20 3022 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=402 20 0 830 3600 3600 1123.18 163 3570 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=403 22 0 690 1500 3700 860.69 28 3696 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=404 17 0 700 2400 2400 872.66 35 2396 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=405 19 0 780 2100 2100 898.45 168 2101 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=406 20 0 750 3300 3300 1192.78 449 3337 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=407 21 0 1100 2900 3300 1317.76 299 3348 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=408 18 0 900 2900 2900 1246.87 322 2895 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=409 17 0 830 2700 2700 1064.92 224 2663 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=41 22 0 1000 3000 3000 1245.49 128 3028 17564 0 0
|
||||
GET /api/v1/logs?limit=100&offset=410 22 0 850 3200 3300 1251.25 338 3295 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=411 17 0 790 3000 3000 1108.47 289 3005 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=412 16 0 730 2600 2600 1077.54 126 2597 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=413 13 0 860 3000 3000 1069.11 517 2973 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=414 17 0 740 1500 1500 768.04 292 1547 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=415 25 0 810 3400 4200 1298.93 60 4238 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=416 23 0 760 3400 3400 1292.88 58 3398 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=417 24 0 860 2400 3800 1178.3 118 3807 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=418 12 0 870 3800 3800 1336.74 515 3821 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=419 22 0 860 3900 8800 1656.83 94 8774 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=42 25 0 1000 2800 4200 1141.63 166 4178 17048 0 0
|
||||
GET /api/v1/logs?limit=100&offset=420 17 0 1300 3000 3000 1421.07 124 2987 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=421 16 0 940 3900 3900 1184.72 206 3888 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=422 29 0 1000 2400 3500 1184.36 303 3488 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=423 13 0 990 2700 2700 1190.66 518 2694 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=424 16 0 810 4700 4700 1369.04 236 4685 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=425 24 0 820 3200 3400 1155.35 55 3446 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=426 22 0 1000 2900 3100 1285.3 419 3077 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=427 22 0 860 3800 4100 1326.32 437 4058 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=428 15 0 810 4200 4200 1479.9 283 4190 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=429 17 0 1000 1700 1700 1031.44 587 1676 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=43 22 0 1000 2300 3200 1182.67 353 3243 16524 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=430 16 0 860 3900 3900 1158.74 304 3906 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=431 18 0 990 2700 2700 1300.77 576 2723 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=432 26 0 820 3200 3700 1246.43 183 3710 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=433 13 0 940 2200 2200 1023.96 422 2239 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=434 15 0 1600 2400 2400 1480.9 398 2420 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=435 21 0 1300 2600 4500 1391.93 411 4484 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=436 25 0 780 2400 3700 978.22 292 3746 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=437 21 0 780 2500 3400 1054.4 299 3416 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=438 12 0 800 2700 2700 1154.41 156 2656 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=439 25 0 840 2000 2400 951.03 360 2354 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=44 13 0 1100 2300 2300 1148.38 474 2349 16030 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=440 17 0 740 3100 3100 984.28 2 3052 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=441 14 0 1000 3800 3800 1348.13 159 3798 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=442 20 0 960 3700 3700 1504.92 310 3742 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=443 18 0 830 1100 1100 740.84 224 1061 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=444 17 0 960 2400 2400 1201.29 206 2384 47 0.4 0
|
||||
GET /api/v1/logs?limit=100&offset=445 32 0 840 3100 3800 1226.25 284 3820 47 0.7 0
|
||||
GET /api/v1/logs?limit=100&offset=446 20 0 870 2400 2400 956.19 77 2438 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=447 20 0 830 3200 3200 1116.2 113 3215 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=448 22 0 850 3000 3000 1263.02 132 3040 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=449 15 0 800 3300 3300 1254.24 120 3263 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=45 15 0 840 2200 2200 1009.76 391 2227 15522 0 0
|
||||
GET /api/v1/logs?limit=100&offset=450 12 0 790 1900 1900 956.06 417 1886 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=451 16 0 870 5000 5000 1440.9 73 5003 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=452 17 0 950 1900 1900 948.59 204 1889 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=453 19 0 890 4400 4400 1337.82 402 4401 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=454 19 0 1100 3000 3000 1436.77 294 2982 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=455 19 0 790 3000 3000 1172.35 20 2995 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=456 19 0 1000 3900 3900 1070.08 119 3904 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=457 15 0 1000 4300 4300 1487.88 308 4287 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=458 21 0 770 2200 3800 1226.72 433 3806 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=459 22 0 850 2600 3300 1191.99 135 3334 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=46 22 0 870 2700 3400 1284.55 607 3402 15077 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=460 19 0 880 3400 3400 1011.74 155 3381 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=461 22 0 720 2500 4100 1103.2 244 4090 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=462 16 0 720 1900 1900 1063.58 318 1943 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=463 17 0 700 2400 2400 903.68 167 2418 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=464 20 0 790 2400 2400 964.39 433 2428 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=465 15 0 660 2100 2100 882.65 147 2138 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=466 21 0 870 3400 3400 1308.56 298 3370 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=467 12 0 1500 3500 3500 1750.84 553 3480 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=468 25 0 930 2800 3300 1135.28 326 3259 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=469 19 0 760 2500 2500 953.65 161 2543 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=47 19 0 780 2800 2800 1223.51 417 2785 14597 0 0
|
||||
GET /api/v1/logs?limit=100&offset=470 18 0 740 2300 2300 956.7 102 2321 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=471 18 0 750 3100 3100 962.85 204 3118 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=472 20 0 950 3200 3200 1370.53 539 3209 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=473 19 0 620 3000 3000 990.65 28 3008 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=474 17 0 910 3300 3300 1155.09 131 3264 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=475 18 0 830 3300 3300 1266.07 71 3304 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=476 13 0 800 2600 2600 1227.75 469 2584 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=477 23 0 1200 4000 4400 1626.55 294 4391 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=478 19 0 770 3000 3000 958.92 306 3016 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=479 28 0 840 2600 4900 1162.82 344 4894 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=48 15 0 1000 1800 1800 987.55 89 1789 13947 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=480 14 0 760 5100 5100 1373.41 594 5073 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=481 23 0 850 2500 2500 1113.04 91 2473 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=482 25 0 1000 2700 6000 1354.93 137 5959 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=483 11 0 800 4100 4100 1360.38 543 4111 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=484 12 0 910 5300 5300 1590.41 155 5284 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=485 13 0 1000 3500 3500 1325.01 382 3536 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=486 13 0 700 5200 5200 1572.78 63 5243 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=487 19 0 790 2900 2900 870.58 84 2933 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=488 29 0 1000 2400 3300 1172.98 111 3274 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=489 27 0 790 3100 3700 1139.4 119 3672 47 0.4 0
|
||||
GET /api/v1/logs?limit=100&offset=49 16 0 920 3400 3400 1204.3 281 3369 13281 0 0
|
||||
GET /api/v1/logs?limit=100&offset=490 13 0 940 2700 2700 1327.82 638 2660 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=491 13 0 860 3100 3100 1130.72 237 3133 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=492 18 0 1300 4000 4000 1322.87 103 4009 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=493 20 0 840 3700 3700 1057.73 293 3716 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=494 12 0 620 1700 1700 770.86 53 1727 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=495 15 0 820 2000 2000 898.28 182 1985 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=496 14 0 1300 3700 3700 1723.02 620 3747 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=497 25 0 780 2900 3400 894.58 74 3372 47 0.5 0
|
||||
GET /api/v1/logs?limit=100&offset=498 7 0 1100 3200 3200 1389.56 387 3203 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=499 15 0 790 1900 1900 933.04 34 1897 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=5 17 0 1000 2900 2900 1260.09 212 2899 35107 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=50 13 0 1000 3100 3100 1342.95 151 3073 12641 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=500 10 0 880 3300 3300 1430.91 585 3275 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=501 16 0 710 1400 1400 737.02 368 1365 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=502 25 0 920 3100 4200 1282.55 184 4196 47 0.4 0
|
||||
GET /api/v1/logs?limit=100&offset=503 18 0 880 3700 3700 1035.77 72 3720 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=504 20 0 670 2500 2500 895.29 255 2492 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=505 16 0 790 2500 2500 979.18 232 2457 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=506 18 0 1100 2700 2700 1282.23 598 2740 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=507 17 0 760 2900 2900 1100.3 102 2876 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=508 17 0 1400 4300 4300 1922.12 550 4258 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=509 14 0 760 2800 2800 1068.97 282 2798 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=51 22 0 830 3500 3500 1311.02 185 3509 12015 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=510 19 0 1100 3900 3900 1417.22 576 3885 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=511 19 0 710 3100 3100 989.56 88 3134 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=512 23 0 790 1700 2200 941.53 294 2198 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=513 19 0 800 3800 3800 992.14 320 3787 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=514 16 0 910 3300 3300 1322.24 226 3266 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=515 12 0 620 2400 2400 839.38 229 2390 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=516 22 0 780 2400 2700 1083.16 58 2690 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=517 14 0 870 3100 3100 1136.82 221 3076 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=518 14 0 810 2200 2200 887.57 348 2248 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=519 19 0 840 2400 2400 1034.19 521 2391 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=52 20 0 810 3100 3100 1192.15 325 3136 11275 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=520 23 0 800 1700 2300 926.53 169 2276 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=521 17 0 770 4500 4500 1069.85 104 4518 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=522 16 0 870 2500 2500 1046.77 471 2533 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=523 25 0 760 1900 2400 930.15 334 2417 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=524 23 0 930 2900 3800 1215.46 322 3779 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=525 14 0 790 6100 6100 1220.67 176 6066 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=526 26 0 820 2700 4600 1311.97 180 4566 47 0.4 0
|
||||
GET /api/v1/logs?limit=100&offset=527 13 0 860 2600 2600 1214.55 271 2581 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=528 21 0 880 2600 3300 1030.71 333 3337 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=529 11 0 800 1800 1800 1017.57 535 1787 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=53 13 0 860 4200 4200 1277.09 108 4244 10823 0 0
|
||||
GET /api/v1/logs?limit=100&offset=530 20 0 830 3300 3300 1357.84 344 3307 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=531 25 0 920 2100 2500 1088.25 301 2494 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=532 10 0 690 2600 2600 1100.94 480 2594 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=533 16 0 960 3000 3000 1281.29 429 2957 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=534 15 0 910 2600 2600 1236.68 485 2585 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=535 15 0 700 3200 3200 959 57 3235 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=536 16 0 760 2500 2500 1002.91 82 2478 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=537 19 0 1100 3500 3500 1252.83 507 3471 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=538 12 0 810 1000 1000 772.11 414 1047 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=539 22 0 690 1500 1600 714.9 175 1613 47 0.3 0
|
||||
Aggregated 308024 0 700 2700 4200 929.88 1 16481 3356.83 1585.1 0
|
||||
|
502
development/profiles/profile_1500_notracing_fb69a06.csv
Normal file
502
development/profiles/profile_1500_notracing_fb69a06.csv
Normal file
@@ -0,0 +1,502 @@
|
||||
Type Name # Requests # Fails Median (ms) 95%ile (ms) 99%ile (ms) Average (ms) Min (ms) Max (ms) Average size (bytes) Current RPS Current Failures/s
|
||||
GET /api/v1/attackers 33626 0 1700 6300 8900 2214.15 2 15667 43 126.5 0
|
||||
GET /api/v1/attackers?search=brute&sort_by=recent 16687 0 2200 6800 9700 2651.5 2 20113 43 53.6 0
|
||||
POST /api/v1/auth/login 8350 0 290 2800 5400 777.44 161 6225 259 29.7 0
|
||||
POST /api/v1/auth/login [on_start] 1500 0 860 4400 5100 1314.2 180 5690 259 0 0
|
||||
GET /api/v1/bounty 25180 0 36 5000 6900 935.48 1 13129 43 88.5 0
|
||||
GET /api/v1/config 12559 0 130 5200 7200 1237.02 1 11439 214 47.3 0
|
||||
GET /api/v1/deckies 29234 0 17 1400 5700 245.38 1 8742 2 103.3 0
|
||||
GET /api/v1/health 12481 0 430 5000 8000 1243.75 1 13782 337 57.2 0
|
||||
GET /api/v1/logs/histogram 20915 0 21 3200 5700 498.34 1 8990 125 76.2 0
|
||||
GET /api/v1/logs?limit=100&offset=0 20 0 1500 8900 8900 2469.55 51 8924 37830 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=1 11 0 1500 4800 4800 1655.67 46 4809 36893 0 0
|
||||
GET /api/v1/logs?limit=100&offset=10 14 0 250 6400 6400 1948.59 57 6378 32590 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=100 15 0 3800 9400 9400 3842.16 88 9413 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=1000 17 0 2200 6100 6100 2147.1 59 6057 48 0 0
|
||||
GET /api/v1/logs?limit=100&offset=101 15 0 1200 6200 6200 2194.12 60 6230 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=102 15 0 1900 5300 5300 2006.04 59 5294 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=103 26 0 1900 7600 8900 2849.35 63 8914 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=104 18 0 1000 6400 6400 1801.51 53 6419 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=105 9 0 1400 2600 2600 1205.04 77 2606 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=106 18 0 1200 5400 5400 1960.08 58 5400 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=107 16 0 1700 11000 11000 2905.62 56 11235 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=108 21 0 1200 5700 7200 1982.84 39 7199 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=109 17 0 1900 8800 8800 2354.89 64 8793 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=11 19 0 1300 9400 9400 2228.73 61 9398 32152 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=110 22 0 2200 5500 7000 2470.12 59 7028 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=111 22 0 1800 7000 9200 2599.58 91 9243 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=112 16 0 2000 8700 8700 2997.3 29 8680 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=113 17 0 2600 6700 6700 2636.13 65 6684 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=114 11 0 1700 12000 12000 2979.62 3 12491 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=115 14 0 370 7700 7700 1318.03 61 7720 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=116 18 0 1400 7900 7900 2391.28 44 7886 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=117 15 0 3500 6600 6600 3292.55 54 6557 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=118 22 0 1500 6100 7800 2046.56 58 7834 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=119 16 0 2600 7800 7800 3252.32 57 7787 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=12 20 0 1800 8300 8300 2049.57 75 8255 31688 0 0
|
||||
GET /api/v1/logs?limit=100&offset=120 17 0 1200 4400 4400 1585.22 58 4419 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=121 14 0 1100 8400 8400 2384.35 82 8416 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=122 18 0 2300 5500 5500 2500.65 114 5509 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=123 13 0 1900 5200 5200 2385.78 57 5178 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=124 25 0 600 7300 7700 1562.22 35 7716 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=125 14 0 810 3100 3100 1133.53 105 3081 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=126 20 0 1400 5500 5500 1816.47 70 5538 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=127 15 0 1400 4100 4100 1507.15 81 4108 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=128 17 0 2800 6400 6400 2683.95 50 6374 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=129 15 0 1800 6400 6400 2000.14 54 6414 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=13 19 0 1500 5500 5500 1647.88 55 5537 30974 0 0
|
||||
GET /api/v1/logs?limit=100&offset=130 15 0 1900 6700 6700 2551.02 71 6747 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=131 18 0 270 4800 4800 1136.85 44 4801 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=132 17 0 1300 4100 4100 1692.98 63 4070 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=133 18 0 1400 5800 5800 2020.32 89 5771 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=134 21 0 1300 4700 6100 1955.27 88 6065 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=135 11 0 1600 5900 5900 2250.1 46 5866 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=136 16 0 940 3900 3900 1594.51 69 3913 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=137 20 0 1800 8500 8500 2457.51 53 8479 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=138 11 0 1200 6300 6300 1724.13 83 6323 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=139 15 0 1900 5600 5600 2063.36 69 5557 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=14 15 0 1500 7000 7000 2603.7 46 7027 30514 0 0
|
||||
GET /api/v1/logs?limit=100&offset=140 17 0 1800 6400 6400 2084.38 55 6384 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=141 31 0 2000 6700 8200 2335.32 55 8172 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=142 18 0 1200 5900 5900 2256.07 61 5860 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=143 26 0 2500 6000 7200 2897.11 53 7174 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=144 13 0 490 7500 7500 2317.76 59 7475 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=145 21 0 3100 6200 7700 3087.53 90 7746 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=146 16 0 2000 6800 6800 2877.89 109 6788 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=147 23 0 1800 6600 7600 2295.02 54 7596 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=148 16 0 1500 7100 7100 2309.75 60 7114 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=149 15 0 1500 5300 5300 1789.16 97 5292 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=15 11 0 2400 6300 6300 2650.87 4 6331 30054 0 0
|
||||
GET /api/v1/logs?limit=100&offset=150 12 0 2400 7900 7900 2765.13 64 7936 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=151 16 0 1800 4600 4600 1965.74 85 4570 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=152 15 0 1700 5500 5500 2216.78 7 5512 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=153 12 0 1600 11000 11000 2836.24 59 11284 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=154 14 0 1300 5700 5700 2165.77 64 5655 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=155 26 0 470 4600 8300 1681.83 44 8253 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=156 11 0 1700 7300 7300 2435.43 46 7277 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=157 20 0 1200 2900 2900 1179.29 54 2912 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=158 17 0 1400 11000 11000 2251.93 44 10700 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=159 14 0 1600 5200 5200 2222.39 77 5199 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=16 18 0 1200 4500 4500 1539.77 49 4501 29590 0 0
|
||||
GET /api/v1/logs?limit=100&offset=160 11 0 1600 5100 5100 2070.38 82 5133 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=161 17 0 1300 6000 6000 1750.56 85 6015 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=162 19 0 1000 3900 3900 1190.23 61 3938 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=163 17 0 2300 9100 9100 2575.28 69 9083 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=164 15 0 2200 5800 5800 2428.76 78 5808 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=165 15 0 1200 5800 5800 1465.22 64 5769 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=166 12 0 3800 11000 11000 4051.43 49 10743 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=167 11 0 2100 6800 6800 2683.82 75 6813 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=168 20 0 1600 8600 8600 2276.46 47 8588 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=169 23 0 2100 6300 7700 2400.48 75 7712 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=17 8 0 2300 7600 7600 3014.28 125 7552 29144 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=170 19 0 2000 5100 5100 2196.9 47 5140 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=171 14 0 700 9100 9100 2294.51 43 9134 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=172 18 0 1000 3800 3800 1464.91 53 3790 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=173 13 0 2400 5500 5500 2622.36 58 5543 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=174 20 0 1200 5000 5000 1543.97 47 5044 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=175 14 0 510 5600 5600 2014.16 5 5618 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=176 20 0 1900 6400 6400 2440.13 54 6381 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=177 21 0 2400 6400 9800 3174.24 63 9789 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=178 7 0 1900 6300 6300 2763.82 370 6350 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=179 18 0 1600 6500 6500 2182.33 78 6476 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=18 10 0 2600 6900 6900 3405.33 45 6858 28680 0 0
|
||||
GET /api/v1/logs?limit=100&offset=180 11 0 1900 4100 4100 1909.02 37 4131 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=181 23 0 2400 5600 9100 2753.85 46 9073 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=182 12 0 79 5500 5500 1602.59 52 5497 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=183 20 0 1100 6900 6900 1872.93 53 6934 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=184 15 0 2800 8900 8900 3098.9 289 8905 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=185 15 0 1500 11000 11000 3052.81 66 10738 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=186 23 0 1500 8300 8800 2887.65 66 8777 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=187 13 0 2400 8900 8900 2869.3 62 8868 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=188 17 0 1700 6700 6700 2518.12 67 6701 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=189 16 0 2100 9000 9000 2437.66 48 8971 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=19 24 0 1100 5400 5900 1499.48 61 5912 28234 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=190 21 0 1400 6200 8100 2184.67 57 8079 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=191 19 0 2300 6300 6300 2365.09 66 6263 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=192 11 0 1600 9000 9000 3241.44 93 8998 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=193 18 0 1600 6600 6600 2108.54 68 6571 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=194 11 0 1500 3500 3500 1731 69 3493 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=195 18 0 1500 5900 5900 2088.53 31 5878 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=196 15 0 1200 6000 6000 1822.32 49 6000 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=197 16 0 1900 9800 9800 2219.26 225 9786 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=198 12 0 1600 7000 7000 2734.27 74 6992 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=199 15 0 1100 5500 5500 1622.35 50 5550 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=2 23 0 1100 3600 4200 1452.05 64 4199 36489 0 0
|
||||
GET /api/v1/logs?limit=100&offset=20 14 0 2000 6200 6200 2829.45 73 6176 27784 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=200 24 0 1200 5300 8000 2025.64 61 7968 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=201 22 0 1500 6900 9100 2283.81 54 9056 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=202 15 0 1400 4900 4900 1750.67 39 4858 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=203 22 0 2300 9600 14000 3699.9 43 14239 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=204 13 0 1700 8500 8500 2320.38 70 8468 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=205 21 0 1400 7800 9500 2468.68 41 9550 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=206 14 0 1500 5300 5300 2169.65 53 5335 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=207 30 0 1200 4100 5300 1568.83 70 5306 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=208 15 0 1800 5000 5000 1993.11 57 4992 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=209 17 0 2200 9000 9000 2560.81 2 9002 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=21 22 0 1600 5800 6800 2058.88 58 6824 27290 0 0
|
||||
GET /api/v1/logs?limit=100&offset=210 18 0 1900 4900 4900 2142.2 60 4859 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=211 13 0 2500 7700 7700 2646.98 38 7685 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=212 19 0 1300 5800 5800 1804.09 52 5780 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=213 8 0 2000 11000 11000 3405.44 278 10866 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=214 18 0 2700 10000 10000 3703.53 58 10214 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=215 18 0 1100 6800 6800 2288.66 63 6810 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=216 12 0 2000 5800 5800 2536.39 86 5815 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=217 15 0 2400 5700 5700 2416.14 46 5733 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=218 16 0 1000 10000 10000 2115.28 67 10483 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=219 16 0 660 5100 5100 1343.05 51 5107 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=22 18 0 2300 6400 6400 2758.62 54 6413 26810 0 0
|
||||
GET /api/v1/logs?limit=100&offset=220 18 0 1900 11000 11000 2840.2 55 11090 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=221 20 0 1800 7200 7200 2151.51 71 7158 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=222 19 0 1300 8300 8300 2221.75 54 8326 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=223 11 0 1600 8300 8300 2077.12 45 8316 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=224 27 0 1900 5900 14000 2405.67 24 13917 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=225 12 0 94 7600 7600 1888.62 39 7567 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=226 12 0 1100 5300 5300 2007.3 63 5339 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=227 10 0 1300 4500 4500 1919.09 60 4487 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=228 17 0 1300 11000 11000 2071.56 63 10994 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=229 18 0 1300 6200 6200 2084.16 52 6229 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=23 22 0 1600 8100 8400 2451.65 55 8450 26332 0 0
|
||||
GET /api/v1/logs?limit=100&offset=230 14 0 1400 5400 5400 1587.14 34 5367 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=231 18 0 2300 10000 10000 2754.26 64 10069 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=232 23 0 1400 4700 7300 1769.88 67 7256 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=233 16 0 1600 6200 6200 2300.37 59 6168 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=234 13 0 2000 6300 6300 2424.12 77 6274 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=235 12 0 1300 5300 5300 1693.02 9 5296 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=236 13 0 1800 7300 7300 2338.55 57 7261 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=237 23 0 1800 4700 5600 1982.01 70 5632 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=238 17 0 2400 9300 9300 3148.21 54 9335 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=239 11 0 5300 6600 6600 4150.94 98 6614 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=24 15 0 1200 8000 8000 2069.12 7 8002 25856 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=240 17 0 1200 4700 4700 1523.19 38 4674 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=241 19 0 1400 5500 5500 1551.68 50 5457 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=242 15 0 270 11000 11000 2622.25 66 10622 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=243 15 0 2700 10000 10000 3436.75 162 10408 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=244 12 0 1000 5500 5500 1864.85 81 5525 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=245 19 0 1300 8900 8900 2460.93 58 8897 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=246 20 0 2300 8900 8900 2755.23 46 8924 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=247 17 0 2800 9000 9000 3016.5 5 9028 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=248 15 0 3500 11000 11000 3150.17 53 10568 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=249 21 0 2200 7600 9700 3203.93 51 9725 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=25 14 0 1100 7500 7500 2018.94 54 7505 25329 0 0
|
||||
GET /api/v1/logs?limit=100&offset=250 18 0 2500 12000 12000 3289.68 190 11536 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=251 28 0 2200 6600 7700 2904.98 56 7746 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=252 18 0 1100 8200 8200 1882.58 32 8201 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=253 25 0 1400 7600 8000 2396.02 59 7992 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=254 14 0 2200 4600 4600 2289.6 51 4627 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=255 19 0 1600 6800 6800 2364.27 55 6840 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=256 13 0 1900 7100 7100 2121.32 49 7099 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=257 16 0 1900 5800 5800 2625.9 62 5834 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=258 21 0 590 3600 5000 1106.97 51 4998 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=259 15 0 3200 7900 7900 3137.88 61 7899 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=26 19 0 2100 8500 8500 2715.88 61 8490 24880 0 0
|
||||
GET /api/v1/logs?limit=100&offset=260 15 0 1900 5200 5200 2097.67 47 5223 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=261 21 0 880 3900 5400 1419.55 33 5447 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=262 16 0 1700 6400 6400 2245 72 6367 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=263 20 0 2200 6800 6800 2581.22 72 6799 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=264 15 0 2500 6700 6700 2877.32 117 6679 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=265 19 0 2200 6400 6400 2419.36 38 6402 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=266 16 0 2400 7100 7100 2724.74 85 7132 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=267 14 0 2100 8000 8000 2932.84 65 7991 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=268 16 0 2300 9000 9000 2984.13 97 9009 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=269 11 0 1200 3800 3800 1490.34 74 3848 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=27 13 0 1300 4000 4000 1602.67 48 4049 24402 0 0
|
||||
GET /api/v1/logs?limit=100&offset=270 16 0 2200 7400 7400 2648.75 47 7354 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=271 20 0 1300 4800 4800 1747.14 40 4850 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=272 10 0 170 4800 4800 1749.44 56 4760 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=273 15 0 2100 7000 7000 2675.51 63 6981 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=274 20 0 1400 9400 9400 2656.83 53 9410 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=275 17 0 1500 6200 6200 2078.5 85 6195 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=276 10 0 380 5100 5100 1747.17 65 5119 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=277 19 0 2800 6100 6100 2697.41 64 6101 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=278 22 0 2600 8500 11000 3280.57 57 10827 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=279 16 0 1700 8300 8300 2723.34 71 8326 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=28 14 0 1400 7800 7800 2579.11 78 7818 23918 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=280 15 0 1300 8200 8200 1632.84 69 8225 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=281 18 0 1400 6800 6800 2314.94 100 6794 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=282 20 0 430 9500 9500 2117.03 45 9497 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=283 16 0 1700 8100 8100 3224.78 775 8080 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=284 20 0 2900 11000 11000 3373.58 98 11127 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=285 18 0 1500 6700 6700 2429.92 55 6742 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=286 14 0 1500 5300 5300 1869.66 62 5315 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=287 18 0 2600 6100 6100 2639.4 55 6056 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=288 15 0 250 5000 5000 1795.95 68 5017 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=289 13 0 1600 4100 4100 1955.41 119 4142 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=29 17 0 1500 6200 6200 2003.15 49 6210 23438 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=290 14 0 1400 6300 6300 2445.98 66 6282 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=291 17 0 1800 9700 9700 2152.6 36 9737 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=292 17 0 1100 10000 10000 2170.85 38 9982 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=293 12 0 1100 5100 5100 1536.4 43 5084 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=294 20 0 2100 4000 4000 2092.92 46 4025 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=295 18 0 1900 8100 8100 2254.28 77 8129 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=296 14 0 1300 7800 7800 2354.5 55 7750 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=297 19 0 1600 6200 6200 2348.35 33 6161 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=298 20 0 1500 6000 6000 1999.88 59 5992 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=299 23 0 1700 5400 5500 2076.87 62 5470 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=3 18 0 1600 6100 6100 2201.37 63 6138 36031 0 0
|
||||
GET /api/v1/logs?limit=100&offset=30 7 0 3500 7400 7400 3423.08 505 7369 22960 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=300 22 0 1200 4400 5000 1383.59 45 5038 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=301 7 0 1000 2400 2400 1162.97 191 2443 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=302 18 0 1400 11000 11000 2623.83 75 10787 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=303 23 0 1900 7700 8300 2216.08 47 8342 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=304 12 0 1700 10000 10000 2469.68 66 10489 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=305 16 0 630 4200 4200 1321.02 38 4163 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=306 13 0 1600 5500 5500 2113.22 88 5468 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=307 16 0 1100 4800 4800 1688.87 1 4788 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=308 19 0 1200 3500 3500 1148.78 49 3501 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=309 16 0 1600 7100 7100 2199.75 3 7076 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=31 13 0 2200 7900 7900 2612.54 113 7911 22476 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=310 19 0 2000 9900 9900 2370.05 48 9875 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=311 15 0 720 7600 7600 1444.46 39 7627 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=312 22 0 2300 6900 7300 2831.23 46 7309 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=313 14 0 2000 6200 6200 1988.88 80 6184 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=314 16 0 2300 6200 6200 2831.67 64 6175 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=315 15 0 1400 5400 5400 2047.96 88 5437 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=316 13 0 1500 6100 6100 2019.7 41 6090 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=317 27 0 1100 5700 5700 1927.08 55 5739 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=318 17 0 2000 6400 6400 2391.37 87 6411 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=319 14 0 1700 5000 5000 2118.36 68 5025 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=32 11 0 1400 2900 2900 1464.46 69 2906 22018 0 0
|
||||
GET /api/v1/logs?limit=100&offset=320 21 0 2000 4700 6200 2333.87 46 6236 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=321 14 0 1600 8800 8800 2209.28 65 8799 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=322 19 0 1100 6800 6800 2484.46 44 6773 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=323 25 0 2200 6100 11000 2652.71 59 10778 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=324 19 0 1200 11000 11000 2836.76 32 10770 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=325 18 0 1200 6100 6100 2313.84 52 6053 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=326 10 0 1600 8700 8700 2647.66 54 8716 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=327 7 0 2400 6400 6400 2751.7 99 6358 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=328 16 0 2100 7900 7900 2785.1 94 7883 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=329 21 0 1300 6500 8100 2451.69 40 8097 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=33 11 0 2700 6200 6200 2875.43 58 6248 21490 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=330 19 0 1500 8100 8100 2368.53 66 8065 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=331 12 0 780 3500 3500 1025.92 50 3531 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=332 20 0 1400 6600 6600 1766.93 51 6622 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=333 11 0 2000 6900 6900 2426.46 72 6942 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=334 19 0 1500 7600 7600 2440.73 80 7556 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=335 15 0 1200 8400 8400 2127.03 62 8357 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=336 18 0 1400 4900 4900 1517.55 56 4908 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=337 19 0 1500 6600 6600 2030.37 55 6624 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=338 13 0 370 12000 12000 2110.74 57 12098 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=339 26 0 1300 5700 6200 1900.43 56 6206 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=34 18 0 1300 6300 6300 2282.06 55 6304 21038 0 0
|
||||
GET /api/v1/logs?limit=100&offset=340 13 0 2100 6100 6100 2443.98 70 6071 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=341 20 0 1300 5400 5400 2272.18 53 5432 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=342 15 0 2300 5000 5000 2211.83 74 4966 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=343 12 0 870 8200 8200 2826.34 95 8164 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=344 17 0 1800 7600 7600 2267.92 4 7611 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=345 14 0 1100 5300 5300 1973.19 53 5291 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=346 11 0 1800 5100 5100 1966.21 94 5076 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=347 11 0 1500 4800 4800 1991.64 86 4818 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=348 16 0 1100 8300 8300 2342.48 61 8275 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=349 32 0 1700 8300 9900 2184.06 43 9903 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=35 13 0 2000 6100 6100 2174.16 98 6111 20488 0 0
|
||||
GET /api/v1/logs?limit=100&offset=350 19 0 2500 5700 5700 2702.13 90 5654 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=351 12 0 3500 6100 6100 3430.09 81 6069 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=352 10 0 2800 10000 10000 3413.85 1332 10462 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=353 18 0 230 10000 10000 1854.83 54 10435 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=354 21 0 1500 5900 6800 2266.15 78 6789 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=355 17 0 1900 9700 9700 2456.66 51 9694 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=356 13 0 1900 4900 4900 2454.82 593 4898 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=357 19 0 1500 6900 6900 2242.52 44 6863 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=358 19 0 2200 7400 7400 2488.67 48 7422 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=359 20 0 2400 6600 6600 2663.97 55 6553 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=36 17 0 1300 4600 4600 1874.96 81 4574 20002 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=360 16 0 1300 7900 7900 2028.6 51 7909 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=361 7 0 2300 6700 6700 2957.52 91 6660 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=362 17 0 460 4300 4300 1247.33 52 4349 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=363 20 0 1300 5000 5000 1824.01 57 4983 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=364 18 0 330 7700 7700 1843.63 59 7693 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=365 21 0 2900 6800 7900 3102.67 63 7865 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=366 11 0 2300 8300 8300 3013.64 96 8259 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=367 19 0 2700 5800 5800 2891.16 60 5779 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=368 20 0 960 6600 6600 1552.85 54 6579 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=369 16 0 260 3800 3800 883.32 41 3811 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=37 13 0 2100 6200 6200 2441.09 57 6208 19552 0 0
|
||||
GET /api/v1/logs?limit=100&offset=370 15 0 1800 10000 10000 2525.24 43 10254 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=371 21 0 1500 8300 10000 2476.25 61 10293 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=372 18 0 1600 8900 8900 2311.46 59 8894 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=373 11 0 2200 5900 5900 2371 52 5910 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=374 16 0 3900 9400 9400 3485.42 46 9369 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=375 13 0 1300 6600 6600 2058.1 61 6577 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=376 17 0 1600 4500 4500 1850.23 3 4458 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=377 14 0 2000 7100 7100 2662.87 54 7058 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=378 18 0 1100 3800 3800 1493.23 59 3767 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=379 21 0 1900 7500 8100 2717.25 52 8098 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=38 19 0 1400 5600 5600 2055.12 66 5616 19010 0 0
|
||||
GET /api/v1/logs?limit=100&offset=380 25 0 1600 5000 10000 2079.57 60 10415 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=381 11 0 910 3900 3900 1531.3 63 3900 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=382 21 0 1500 7400 7800 2230.73 48 7757 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=383 22 0 1400 6300 7500 2340.3 62 7506 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=384 14 0 1100 3900 3900 1372.67 49 3930 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=385 15 0 1700 4700 4700 1821.8 70 4723 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=386 13 0 2400 9800 9800 3285.32 63 9782 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=387 17 0 1300 5800 5800 2146.18 64 5834 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=388 18 0 260 6300 6300 1483.66 39 6311 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=389 8 0 1200 4000 4000 1640.82 75 3970 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=39 17 0 1600 4600 4600 1652.37 78 4580 18526 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=390 9 0 1500 8900 8900 2514.63 60 8945 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=391 7 0 1300 4000 4000 1671.81 80 4008 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=392 15 0 1300 7800 7800 2043.17 62 7761 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=393 14 0 1600 6700 6700 2340.87 72 6732 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=394 22 0 1800 5500 8000 2208.55 40 8045 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=395 18 0 1000 10000 10000 1882.19 2 10468 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=396 20 0 1300 6600 6600 1818.22 62 6641 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=397 14 0 950 5900 5900 1420.64 33 5857 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=398 17 0 820 8400 8400 1734.97 60 8424 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=399 16 0 1200 5800 5800 1934.57 52 5813 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=4 20 0 1100 7100 7100 1566.11 35 7115 35565 0 0
|
||||
GET /api/v1/logs?limit=100&offset=40 29 0 1900 5600 6300 2298.71 38 6305 18066 0 0
|
||||
GET /api/v1/logs?limit=100&offset=400 13 0 2000 4900 4900 2033.4 80 4920 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=401 15 0 1200 6200 6200 2183.32 73 6222 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=402 18 0 210 7200 7200 1917.54 45 7233 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=403 12 0 1100 5700 5700 1801.66 195 5661 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=404 17 0 2100 9600 9600 2333.44 70 9612 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=405 11 0 2000 8600 8600 2879.84 284 8569 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=406 14 0 1600 7400 7400 2339.55 61 7403 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=407 19 0 1300 9500 9500 2566.88 52 9484 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=408 16 0 1100 10000 10000 1905.15 58 10224 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=409 17 0 2000 4100 4100 1935.39 90 4070 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=41 22 0 560 5800 6300 1786.92 4 6330 17564 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=410 24 0 1000 3600 5500 1457.07 43 5455 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=411 19 0 2100 5800 5800 2187.81 43 5843 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=412 11 0 1700 5500 5500 2297.45 72 5531 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=413 22 0 1700 6400 11000 2399.87 54 11027 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=414 16 0 240 4100 4100 1126.56 63 4137 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=415 18 0 1200 6300 6300 1626.88 35 6310 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=416 19 0 2800 6800 6800 2815.54 60 6814 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=417 15 0 1700 5700 5700 2058.21 64 5666 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=418 18 0 990 5300 5300 1643.63 49 5288 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=419 14 0 1100 6600 6600 2114.03 48 6580 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=42 9 0 87 1700 1700 390.06 46 1674 17048 0 0
|
||||
GET /api/v1/logs?limit=100&offset=420 16 0 1400 3000 3000 1367.76 2 2970 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=421 15 0 1500 8900 8900 2384.54 63 8883 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=422 18 0 1100 3800 3800 1104.2 2 3813 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=423 23 0 1200 6400 7900 1992.48 58 7920 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=424 19 0 1200 10000 10000 2019.61 34 10211 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=425 12 0 1500 6100 6100 2250.28 60 6145 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=426 17 0 1200 6100 6100 1451.36 70 6123 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=427 13 0 1500 3900 3900 1934.3 52 3949 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=428 26 0 1100 6000 7800 1594.09 44 7818 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=429 14 0 2000 6100 6100 2332.86 92 6061 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=43 23 0 3000 7000 8400 3106.35 63 8386 16524 0 0
|
||||
GET /api/v1/logs?limit=100&offset=430 16 0 1500 6800 6800 2141.37 84 6760 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=431 14 0 1700 8400 8400 2360.21 61 8379 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=432 22 0 2000 8400 12000 3011.57 82 11509 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=433 17 0 1300 9800 9800 2259.84 47 9824 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=434 16 0 1600 4500 4500 1729.92 47 4512 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=435 16 0 830 5400 5400 1789.93 62 5399 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=436 21 0 1600 6900 8400 2507.02 59 8434 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=437 14 0 2100 5600 5600 2487.37 49 5613 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=438 16 0 550 6000 6000 1493.59 46 5968 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=439 13 0 940 7600 7600 2110.8 54 7563 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=44 22 0 2000 7600 8000 2794.67 72 7982 16030 0 0
|
||||
GET /api/v1/logs?limit=100&offset=440 19 0 2400 8600 8600 2721.24 59 8609 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=441 17 0 2200 6300 6300 2295.14 57 6269 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=442 18 0 1800 6100 6100 2439.04 36 6140 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=443 18 0 1500 5800 5800 2432.71 93 5817 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=444 18 0 1300 8400 8400 2198.2 61 8388 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=445 19 0 1300 9200 9200 1941.93 76 9238 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=446 18 0 1400 6400 6400 2413.34 52 6413 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=447 18 0 1700 6900 6900 2141.83 54 6942 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=448 19 0 1900 6600 6600 1949.43 37 6631 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=449 22 0 1000 4600 5000 1393.63 49 5015 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=45 21 0 1200 5900 6100 1758.25 52 6106 15522 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=450 14 0 2700 8200 8200 2858.65 64 8243 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=451 22 0 1800 4500 8900 2174.54 83 8865 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=452 13 0 1100 8800 8800 2224.98 67 8768 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=453 13 0 2000 6900 6900 2557.64 71 6880 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=454 18 0 910 6900 6900 1548.3 48 6906 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=455 17 0 1100 6400 6400 1879.25 66 6416 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=456 22 0 1100 7200 7300 1843.92 60 7295 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=457 15 0 1900 5500 5500 2321.03 55 5511 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=458 26 0 1200 7500 10000 1633.43 44 10200 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=459 21 0 2100 9700 10000 2803.08 35 10256 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=46 14 0 2800 7600 7600 3322.42 88 7564 15077 0 0
|
||||
GET /api/v1/logs?limit=100&offset=460 21 0 1600 3600 4100 1551.64 49 4146 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=461 21 0 1700 4000 6400 2026.65 76 6370 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=462 29 0 1700 3600 3900 1663.18 46 3944 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=463 8 0 1100 4500 4500 1889.83 66 4538 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=464 15 0 1900 8200 8200 2478.18 42 8186 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=465 8 0 1100 4400 4400 1593.13 80 4418 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=466 14 0 180 4500 4500 962.7 53 4508 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=467 18 0 1700 4900 4900 2199.36 54 4941 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=468 17 0 2600 6500 6500 2562.73 71 6531 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=469 12 0 3000 6800 6800 3260.04 64 6799 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=47 14 0 1100 4200 4200 1714.6 55 4177 14597 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=470 15 0 1300 8100 8100 1733.56 82 8106 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=471 17 0 1300 6800 6800 2062.21 7 6752 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=472 17 0 1400 6800 6800 2401.18 83 6810 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=473 19 0 1300 6300 6300 1852.85 32 6281 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=474 16 0 1400 5800 5800 2306.94 5 5780 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=475 14 0 290 4200 4200 1290.92 49 4195 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=476 17 0 1100 7600 7600 2112.81 58 7583 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=477 8 0 74 2000 2000 487.77 42 1994 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=478 22 0 2400 6500 7100 2869.63 46 7060 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=479 13 0 1800 6800 6800 2161.87 76 6824 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=48 18 0 1300 7500 7500 2391.26 39 7458 13947 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=480 13 0 2800 5800 5800 2355.2 80 5824 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=481 10 0 1300 6000 6000 2054.51 61 5996 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=482 18 0 1600 5800 5800 2361.28 68 5835 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=483 14 0 2100 8500 8500 2099.2 50 8510 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=484 10 0 1100 3900 3900 1707.41 73 3856 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=485 17 0 2100 8300 8300 2736.71 41 8321 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=486 19 0 1400 6800 6800 2170.48 58 6819 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=487 12 0 1700 9600 9600 2667.73 32 9576 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=488 24 0 1700 5500 6800 2396.59 81 6823 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=489 20 0 1300 11000 11000 2751.44 81 10519 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=49 15 0 1500 6400 6400 1941.34 36 6364 13281 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=490 17 0 1200 9700 9700 2606.11 53 9693 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=491 13 0 1800 9200 9200 2565.66 306 9240 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=492 21 0 1700 5000 5800 1869.85 57 5766 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=493 24 0 1300 8300 9100 2463.97 66 9118 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=494 17 0 1600 7800 7800 2217.2 51 7780 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=495 23 0 1400 6800 8300 2276.3 63 8341 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=496 13 0 2200 5700 5700 2640.89 106 5705 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=497 24 0 1400 8300 9100 2547.1 79 9114 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=498 15 0 2000 4400 4400 1833.89 57 4431 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=499 18 0 1600 6400 6400 2335.29 124 6427 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=5 17 0 1800 6800 6800 2608.02 69 6832 35107 0 0
|
||||
GET /api/v1/logs?limit=100&offset=50 17 0 1600 5300 5300 2351.79 54 5288 12641 0 0
|
||||
GET /api/v1/logs?limit=100&offset=500 22 0 1200 4600 5500 1862.75 59 5542 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=501 19 0 1100 2800 2800 1037.96 61 2804 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=502 7 0 210 970 970 366.78 78 975 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=503 24 0 2900 10000 13000 3837.93 56 12659 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=504 16 0 300 5700 5700 1537.03 80 5703 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=505 23 0 2200 7800 11000 2893.69 50 10518 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=506 13 0 1500 6300 6300 2417.47 58 6301 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=507 20 0 1300 6000 6000 1993.8 48 6026 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=508 15 0 1300 6600 6600 1961.86 46 6608 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=509 17 0 770 5300 5300 1430.23 82 5308 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=51 11 0 2500 3900 3900 2039.72 53 3888 12015 0 0
|
||||
GET /api/v1/logs?limit=100&offset=510 16 0 2100 10000 10000 2780.84 65 10475 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=511 22 0 1300 6700 8400 2165.27 56 8391 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=512 17 0 2800 8900 8900 2826.95 66 8873 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=513 9 0 1300 3900 3900 1318.78 62 3863 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=514 16 0 2100 8200 8200 2867.54 52 8174 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=515 16 0 2700 8200 8200 3213.7 377 8174 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=516 14 0 1500 5100 5100 2402.12 72 5084 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=517 14 0 800 5700 5700 1661.34 58 5654 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=518 18 0 800 7200 7200 1434.07 43 7194 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=519 12 0 1000 6300 6300 1838.6 77 6333 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=52 11 0 1700 11000 11000 2457.68 72 10573 11275 0 0
|
||||
GET /api/v1/logs?limit=100&offset=520 18 0 1200 9800 9800 2354.99 60 9820 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=521 22 0 1300 6000 6200 2104.16 52 6215 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=522 22 0 2100 6400 6500 2531.99 53 6535 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=523 11 0 4000 6800 6800 3101.53 78 6755 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=524 16 0 1500 5800 5800 1700.67 52 5813 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=525 21 0 3400 6100 10000 3162.51 78 10497 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=526 18 0 2900 8300 8300 3233.52 42 8293 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=527 12 0 72 4600 4600 1219.31 48 4582 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=528 15 0 2000 7400 7400 2666.02 60 7377 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=529 18 0 1900 5600 5600 2390.71 46 5550 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=53 14 0 2100 7300 7300 3280.85 50 7310 10823 0 0
|
||||
GET /api/v1/logs?limit=100&offset=530 11 0 1500 9600 9600 2837.25 47 9626 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=531 12 0 2100 5800 5800 2804.55 666 5849 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=532 20 0 300 6300 6300 1758.06 67 6340 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=533 15 0 1500 8900 8900 2118.12 81 8855 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=534 17 0 1300 5500 5500 2039.74 71 5470 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=535 22 0 1200 5700 6800 2115.92 73 6821 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=536 10 0 1100 8200 8200 2096.46 59 8240 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=537 15 0 1100 5200 5200 1744.21 46 5185 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=538 22 0 360 5900 5900 1544.24 82 5891 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=539 19 0 1700 5400 5400 1648.16 41 5371 47 0.1 0
|
||||
Aggregated 277214 0 340 5700 8400 1489.08 0 20861 3337.36 992.7 0
|
||||
|
@@ -0,0 +1,203 @@
|
||||
Type Name # Requests # Fails Median (ms) 95%ile (ms) 99%ile (ms) Average (ms) Min (ms) Max (ms) Average size (bytes) Current RPS Current Failures/s
|
||||
GET /api/v1/attackers 426 0 93 2800 3700 478.61 2 5451 43 4.2 0
|
||||
GET /api/v1/attackers?search=brute&sort_by=recent 216 0 170 3400 4500 723.01 23 5455 43 2 0
|
||||
POST /api/v1/auth/login 9 0 47000 100000 100000 60136.54 25316 99846 259 0 0
|
||||
POST /api/v1/auth/login [on_start] 914 0 64000 121000 124000 64480.35 2433 124542 259 5.9 0
|
||||
GET /api/v1/bounty 344 0 36 2100 3100 312.05 1 4480 43 4 0
|
||||
GET /api/v1/config 146 0 56 2900 3800 444.98 1 3845 214 1.4 0
|
||||
GET /api/v1/deckies 151 0 12000 119000 120000 53148.04 3 119924 2 9.2 0
|
||||
GET /api/v1/health 14 0 105000 120000 120000 109124.04 97285 119531 337 0.6 0
|
||||
GET /api/v1/logs/histogram 252 0 37 1200 2900 213.86 1 3338 125 3.7 0
|
||||
GET /api/v1/logs?limit=100&offset=11 1 0 306.66 310 310 306.66 307 307 32152 0 0
|
||||
GET /api/v1/logs?limit=100&offset=114 1 0 37.36 37 37 37.36 37 37 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=119 1 0 298.45 300 300 298.45 298 298 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=124 1 0 77.65 78 78 77.65 78 78 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=126 1 0 19.74 20 20 19.74 20 20 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=131 1 0 70.61 71 71 70.61 71 71 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=134 1 0 161.58 160 160 161.58 162 162 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=144 1 0 923.08 920 920 923.08 923 923 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=147 1 0 203.85 200 200 203.85 204 204 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=153 1 0 963.7 960 960 963.7 964 964 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=162 1 0 243.43 240 240 243.43 243 243 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=163 2 0 18.46 58 58 38.43 18 58 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=166 2 0 150 3700 3700 1918.55 146 3691 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=168 1 0 34.04 34 34 34.04 34 34 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=171 1 0 72.31 72 72 72.31 72 72 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=172 1 0 125.21 130 130 125.21 125 125 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=182 1 0 36.72 37 37 36.72 37 37 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=192 2 0 15 80 80 47.17 15 80 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=194 1 0 581.74 580 580 581.74 582 582 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=200 1 0 136.78 140 140 136.78 137 137 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=205 1 0 8.17 8 8 8.17 8 8 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=210 1 0 532.33 530 530 532.33 532 532 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=214 1 0 61.9 62 62 61.9 62 62 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=216 1 0 35.97 36 36 35.97 36 36 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=218 1 0 121.67 120 120 121.67 122 122 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=223 1 0 61.37 61 61 61.37 61 61 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=23 1 0 164.08 160 160 164.08 164 164 26332 0 0
|
||||
GET /api/v1/logs?limit=100&offset=233 1 0 82.96 83 83 82.96 83 83 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=24 1 0 1066.68 1100 1100 1066.68 1067 1067 25856 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=254 1 0 43.78 44 44 43.78 44 44 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=257 1 0 131.86 130 130 131.86 132 132 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=26 1 0 1174.97 1200 1200 1174.97 1175 1175 24880 0 0
|
||||
GET /api/v1/logs?limit=100&offset=261 1 0 61.39 61 61 61.39 61 61 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=271 1 0 65.49 65 65 65.49 65 65 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=274 1 0 20.7 21 21 20.7 21 21 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=28 1 0 81.08 81 81 81.08 81 81 23918 0 0
|
||||
GET /api/v1/logs?limit=100&offset=282 2 0 30 2200 2200 1136.47 30 2243 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=285 1 0 197.02 200 200 197.02 197 197 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=286 1 0 306.08 310 310 306.08 306 306 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=302 1 0 31.36 31 31 31.36 31 31 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=307 1 0 134.72 130 130 134.72 135 135 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=309 1 0 194.84 190 190 194.84 195 195 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=310 1 0 164.6 160 160 164.6 165 165 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=315 1 0 1192.58 1200 1200 1192.58 1193 1193 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=316 1 0 20.78 21 21 20.78 21 21 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=317 1 0 114.24 110 110 114.24 114 114 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=318 1 0 37.71 38 38 37.71 38 38 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=324 1 0 65.02 65 65 65.02 65 65 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=327 1 0 1567.82 1600 1600 1567.82 1568 1568 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=331 1 0 123.77 120 120 123.77 124 124 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=332 1 0 4448.63 4400 4400 4448.63 4449 4449 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=34 1 0 166.91 170 170 166.91 167 167 21038 0 0
|
||||
GET /api/v1/logs?limit=100&offset=343 1 0 1160.12 1200 1200 1160.12 1160 1160 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=344 1 0 44.7 45 45 44.7 45 45 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=353 1 0 2140.8 2100 2100 2140.8 2141 2141 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=356 1 0 178.22 180 180 178.22 178 178 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=357 1 0 1408.19 1400 1400 1408.19 1408 1408 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=365 1 0 83.94 84 84 83.94 84 84 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=37 1 0 4460.33 4500 4500 4460.33 4460 4460 19552 0 0
|
||||
GET /api/v1/logs?limit=100&offset=375 1 0 30.83 31 31 30.83 31 31 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=383 1 0 126.77 130 130 126.77 127 127 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=384 1 0 2597.26 2600 2600 2597.26 2597 2597 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=40 1 0 58.09 58 58 58.09 58 58 18066 0 0
|
||||
GET /api/v1/logs?limit=100&offset=41 1 0 81.72 82 82 81.72 82 82 17564 0 0
|
||||
GET /api/v1/logs?limit=100&offset=414 1 0 1333.18 1300 1300 1333.18 1333 1333 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=419 1 0 22.16 22 22 22.16 22 22 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=422 1 0 176.24 180 180 176.24 176 176 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=43 1 0 32.68 33 33 32.68 33 33 16524 0 0
|
||||
GET /api/v1/logs?limit=100&offset=443 1 0 17.68 18 18 17.68 18 18 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=444 2 0 21 550 550 283.82 21 547 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=449 1 0 6024.46 6000 6000 6024.46 6024 6024 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=452 1 0 26.95 27 27 26.95 27 27 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=453 1 0 19.95 20 20 19.95 20 20 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=456 1 0 56.25 56 56 56.25 56 56 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=460 1 0 15.68 16 16 15.68 16 16 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=462 1 0 1441.46 1400 1400 1441.46 1441 1441 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=471 1 0 2054.89 2100 2100 2054.89 2055 2055 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=478 1 0 138.17 140 140 138.17 138 138 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=481 1 0 35.11 35 35 35.11 35 35 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=486 1 0 43.87 44 44 43.87 44 44 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=492 1 0 961.53 960 960 961.53 962 962 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=494 1 0 30.38 30 30 30.38 30 30 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=50 1 0 4634.72 4600 4600 4634.72 4635 4635 12641 0 0
|
||||
GET /api/v1/logs?limit=100&offset=507 1 0 104.02 100 100 104.02 104 104 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=508 1 0 10.01 10 10 10.01 10 10 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=522 1 0 203.61 200 200 203.61 204 204 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=525 1 0 380.89 380 380 380.89 381 381 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=532 1 0 426.14 430 430 426.14 426 426 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=539 1 0 77.21 77 77 77.21 77 77 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=540 2 0 100 160 160 128.23 100 157 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=543 1 0 32.97 33 33 32.97 33 33 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=548 2 0 73 2200 2200 1152.34 73 2232 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=55 1 0 57 57 57 57 57 57 10047 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=553 1 0 246.95 250 250 246.95 247 247 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=557 1 0 306.35 310 310 306.35 306 306 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=559 1 0 116.68 120 120 116.68 117 117 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=567 1 0 112.94 110 110 112.94 113 113 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=568 1 0 302.69 300 300 302.69 303 303 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=570 2 0 63 150 150 107.23 63 152 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=571 1 0 54.12 54 54 54.12 54 54 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=573 1 0 28.92 29 29 28.92 29 29 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=595 1 0 135.24 140 140 135.24 135 135 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=596 1 0 140.12 140 140 140.12 140 140 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=609 1 0 124.36 120 120 124.36 124 124 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=614 1 0 61.86 62 62 61.86 62 62 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=618 1 0 207.94 210 210 207.94 208 208 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=636 1 0 60.84 61 61 60.84 61 61 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=641 2 0 84.36 100 100 94 84 104 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=647 1 0 4360.32 4400 4400 4360.32 4360 4360 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=649 1 0 165.1 170 170 165.1 165 165 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=650 1 0 89.07 89 89 89.07 89 89 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=658 1 0 721.64 720 720 721.64 722 722 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=660 2 0 180 930 930 554.13 177 931 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=661 1 0 896.89 900 900 896.89 897 897 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=663 1 0 26.06 26 26 26.06 26 26 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=664 1 0 104.49 100 100 104.49 104 104 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=669 1 0 3423.1 3400 3400 3423.1 3423 3423 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=674 1 0 2272.72 2300 2300 2272.72 2273 2273 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=681 1 0 2141.15 2100 2100 2141.15 2141 2141 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=686 1 0 246.49 250 250 246.49 246 246 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=693 1 0 110.48 110 110 110.48 110 110 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=694 1 0 31.56 32 32 31.56 32 32 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=697 1 0 108.62 110 110 108.62 109 109 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=70 1 0 1082.97 1100 1100 1082.97 1083 1083 3598 0 0
|
||||
GET /api/v1/logs?limit=100&offset=704 2 0 27.16 1400 1400 706.47 27 1386 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=705 1 0 2124.19 2100 2100 2124.19 2124 2124 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=706 1 0 4136.54 4100 4100 4136.54 4137 4137 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=707 1 0 101.39 100 100 101.39 101 101 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=717 1 0 256.06 260 260 256.06 256 256 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=720 1 0 138.78 140 140 138.78 139 139 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=725 1 0 34.07 34 34 34.07 34 34 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=737 1 0 65.45 65 65 65.45 65 65 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=741 1 0 36.81 37 37 36.81 37 37 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=747 1 0 1090.49 1100 1100 1090.49 1090 1090 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=756 1 0 94.99 95 95 94.99 95 95 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=758 1 0 457.44 460 460 457.44 457 457 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=764 1 0 22.73 23 23 22.73 23 23 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=774 1 0 4400.54 4400 4400 4400.54 4401 4401 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=775 1 0 1380.6 1400 1400 1380.6 1381 1381 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=781 3 0 110 290 290 142.76 22 295 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=785 1 0 9.56 10 10 9.56 10 10 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=797 1 0 30.7 31 31 30.7 31 31 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=800 1 0 56.77 57 57 56.77 57 57 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=807 1 0 103.27 100 100 103.27 103 103 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=808 1 0 46.72 47 47 46.72 47 47 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=809 1 0 56.66 57 57 56.66 57 57 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=811 1 0 243.13 240 240 243.13 243 243 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=819 1 0 307.26 310 310 307.26 307 307 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=82 1 0 33.28 33 33 33.28 33 33 46 0 0
|
||||
GET /api/v1/logs?limit=100&offset=821 1 0 428.91 430 430 428.91 429 429 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=822 1 0 212.5 210 210 212.5 212 212 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=826 1 0 111.43 110 110 111.43 111 111 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=827 1 0 1373.95 1400 1400 1373.95 1374 1374 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=828 1 0 896.46 900 900 896.46 896 896 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=829 1 0 17.8 18 18 17.8 18 18 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=838 1 0 9.17 9 9 9.17 9 9 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=84 1 0 4518.84 4500 4500 4518.84 4519 4519 46 0 0
|
||||
GET /api/v1/logs?limit=100&offset=840 1 0 50.39 50 50 50.39 50 50 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=846 1 0 32 32 32 32 32 32 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=854 1 0 69.9 70 70 69.9 70 70 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=855 1 0 23.7 24 24 23.7 24 24 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=872 1 0 47.08 47 47 47.08 47 47 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=874 2 0 93 4100 4100 2092.9 93 4093 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=877 1 0 133.17 130 130 133.17 133 133 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=880 1 0 93.71 94 94 93.71 94 94 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=883 1 0 2014.17 2000 2000 2014.17 2014 2014 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=902 1 0 3490.99 3500 3500 3490.99 3491 3491 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=910 1 0 55.97 56 56 55.97 56 56 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=912 1 0 31 31 31 31 31 31 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=919 1 0 86.19 86 86 86.19 86 86 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=924 1 0 39.25 39 39 39.25 39 39 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=929 1 0 3388.34 3400 3400 3388.34 3388 3388 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=933 1 0 68.54 69 69 68.54 69 69 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=935 1 0 36.11 36 36 36.11 36 36 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=941 1 0 35.63 36 36 35.63 36 36 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=942 1 0 27.28 27 27 27.28 27 27 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=947 1 0 67.26 67 67 67.26 67 67 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=95 3 0 63 99 99 72.91 57 99 46 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=969 1 0 14.8 15 15 14.8 15 15 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=970 1 0 76.5 77 77 76.5 77 77 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=975 1 0 99.17 99 99 99.17 99 99 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=976 1 0 1713.62 1700 1700 1713.62 1714 1714 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=978 2 0 53 1400 1400 746.36 53 1440 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=979 1 0 408.47 410 410 408.47 408 408 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=980 1 0 14.98 15 15 14.98 15 15 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=990 1 0 27.57 28 28 27.57 28 28 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=997 1 0 45.8 46 46 45.8 46 46 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=999 1 0 188.14 190 190 188.14 188 188 47 0 0
|
||||
GET /api/v1/logs?limit=50 427 0 110 3200 4400 585.54 10 5504 25233 3.2 0
|
||||
GET /api/v1/logs?search=ssh&limit=100 262 0 210 3000 4300 756.71 22 6013 1916 2.6 0
|
||||
GET /api/v1/stats 163 0 8800 121000 123000 39182.77 62 122789 78 7.9 0
|
||||
GET /api/v1/stream 3 0 34000 110000 110000 58944.16 33198 110101 0 0 0
|
||||
Aggregated 3532 0 270 115000 122000 21728.92 1 124542 3369.08 46.2 0
|
||||
|
27
development/profiles/profile_255c2e5.csv
Normal file
27
development/profiles/profile_255c2e5.csv
Normal file
@@ -0,0 +1,27 @@
|
||||
Type Name # Requests # Fails Median (ms) 95%ile (ms) 99%ile (ms) Average (ms) Min (ms) Max (ms) Average size (bytes) Current RPS Current Failures/s
|
||||
GET /api/v1/attackers 39 6 740 200000 203000 29246.96 25 203174 38.54 0 0
|
||||
GET /api/v1/attackers?search=brute&sort_by=recent 28 7 1200 56000 154000 14268.48 45 153617 36 0 0
|
||||
POST /api/v1/auth/login 16 3 950 148000 148000 16572.57 192 148264 213.06 0.1 0
|
||||
POST /api/v1/auth/login [on_start] 656 470 132000 150000 185000 85098.96 1 186160 84.29 1.8 0
|
||||
GET /api/v1/bounty 30 5 94 54000 157000 7398.01 2 156595 37.23 0 0
|
||||
GET /api/v1/config 16 3 30 156000 156000 16329.52 3 156460 177.81 0 0
|
||||
GET /api/v1/deckies 47 5 54 4200 11000 718.24 2 10973 1.79 0 0
|
||||
GET /api/v1/health 31 0 41 1400 141000 4687.97 2 140959 337 0 0
|
||||
GET /api/v1/logs/histogram 27 3 70 189000 189000 27019.37 6 189346 111.89 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=159 1 0 60.16 60 60 60.16 60 60 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=250 1 0 150.95 150 150 150.95 151 151 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=261 1 0 22.63 23 23 22.63 23 23 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=273 1 0 623.45 620 620 623.45 623 623 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=44 1 0 8257.6 8300 8300 8257.6 8258 8258 16072 0 0
|
||||
GET /api/v1/logs?limit=100&offset=582 1 0 645 640 640 645 645 645 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=600 1 0 97.69 98 98 97.69 98 98 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=703 1 0 945.58 950 950 945.58 946 946 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=820 1 0 958.48 960 960 958.48 958 958 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=837 1 0 666.2 670 670 666.2 666 666 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=907 1 0 34.44 34 34 34.44 34 34 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=938 1 0 30.41 30 30 30.41 30 30 47 0 0
|
||||
GET /api/v1/logs?limit=50 45 4 990 197000 201000 22659.61 6 201035 23341.78 0.1 0
|
||||
GET /api/v1/logs?search=ssh&limit=100 36 7 1400 157000 167000 22343.82 21 167298 1545.78 0 0
|
||||
GET /api/v1/stats 53 1 41 3700 48000 1867.95 2 48067 76.53 0 0
|
||||
GET /api/v1/stream 6 0 3100 142000 142000 58181.66 199 141698 0 0 0
|
||||
Aggregated 1042 514 6700 150000 186000 58835.59 1 203174 1156.81 2.3 0
|
||||
|
314
development/profiles/profile_2dd86fb.csv
Normal file
314
development/profiles/profile_2dd86fb.csv
Normal file
@@ -0,0 +1,314 @@
|
||||
Type Name # Requests # Fails Median (ms) 95%ile (ms) 99%ile (ms) Average (ms) Min (ms) Max (ms) Average size (bytes) Current RPS Current Failures/s
|
||||
GET /api/v1/attackers 668 0 170 141000 197000 16140.01 5 247805 43 0 0
|
||||
GET /api/v1/attackers?search=brute&sort_by=recent 318 0 230 124000 190000 13619.88 9 242192 43 0.1 0
|
||||
POST /api/v1/auth/change-password 15 0 480 610 610 482.69 395 615 43 0 0
|
||||
POST /api/v1/auth/login 163 0 650 99000 151000 14034.74 170 166461 259 0.2 0
|
||||
POST /api/v1/auth/login [on_start] 515 0 3500 171000 233000 41270 189 245208 258.97 0 0
|
||||
GET /api/v1/bounty 455 0 100 117000 192000 11847.02 5 266610 43 0.2 0
|
||||
GET /api/v1/config 250 0 190 147000 218000 15656.22 5 225589 214 0 0
|
||||
GET /api/v1/deckies 593 0 170 80000 136000 10746.34 3 182607 2 0.2 0
|
||||
GET /api/v1/health 233 0 170 134000 206000 18945.87 4 216524 337 0.5 0
|
||||
GET /api/v1/logs/histogram 453 0 130 107000 176000 12775.61 4 243204 125 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=1 1 0 668.6 670 670 668.6 669 669 36893 0 0
|
||||
GET /api/v1/logs?limit=100&offset=102 1 0 126589.27 127000 127000 126589.27 126589 126589 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=105 1 0 119.46 120 120 119.46 119 119 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=107 1 0 46.32 46 46 46.32 46 46 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=111 2 0 120 2100 2100 1112.09 120 2105 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=113 1 0 206.71 210 210 206.71 207 207 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=12 2 0 54 140 140 98.56 54 143 31676 0 0
|
||||
GET /api/v1/logs?limit=100&offset=122 1 0 351.81 350 350 351.81 352 352 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=127 1 0 650.58 650 650 650.58 651 651 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=128 1 0 281.14 280 280 281.14 281 281 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=136 1 0 45.96 46 46 45.96 46 46 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=137 1 0 9.62 10 10 9.62 10 10 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=140 1 0 75.82 76 76 75.82 76 76 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=142 1 0 179.64 180 180 179.64 180 180 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=144 1 0 90.68 91 91 90.68 91 91 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=146 3 0 5000 194000 194000 66495.94 209 194325 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=148 1 0 28.73 29 29 28.73 29 29 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=150 1 0 190.37 190 190 190.37 190 190 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=153 1 0 108.18 110 110 108.18 108 108 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=155 1 0 86.98 87 87 86.98 87 87 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=161 1 0 392.72 390 390 392.72 393 393 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=170 1 0 2518.81 2500 2500 2518.81 2519 2519 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=171 1 0 49.26 49 49 49.26 49 49 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=173 1 0 30279.9 30000 30000 30279.9 30280 30280 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=176 1 0 116.74 120 120 116.74 117 117 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=179 1 0 71.33 71 71 71.33 71 71 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=18 1 0 1573.61 1600 1600 1573.61 1574 1574 28668 0 0
|
||||
GET /api/v1/logs?limit=100&offset=180 1 0 60.17 60 60 60.17 60 60 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=186 2 0 140 14000 14000 6944.45 137 13752 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=190 1 0 477.84 480 480 477.84 478 478 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=192 1 0 474.41 470 470 474.41 474 474 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=195 1 0 124.36 120 120 124.36 124 124 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=197 1 0 56.03 56 56 56.03 56 56 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=199 1 0 47.02 47 47 47.02 47 47 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=200 1 0 3423.99 3400 3400 3423.99 3424 3424 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=201 1 0 144014.5 144000 144000 144014.5 144015 144015 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=205 1 0 47.31 47 47 47.31 47 47 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=206 1 0 130.64 130 130 130.64 131 131 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=210 1 0 103.63 100 100 103.63 104 104 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=211 1 0 3397.34 3400 3400 3397.34 3397 3397 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=215 1 0 60.87 61 61 60.87 61 61 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=221 1 0 244.67 240 240 244.67 245 245 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=224 1 0 61.18 61 61 61.18 61 61 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=225 1 0 12751.22 13000 13000 12751.22 12751 12751 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=234 1 0 9.98 10 10 9.98 10 10 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=238 1 0 7.94 8 8 7.94 8 8 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=246 2 0 16.16 62 62 39.32 16 62 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=251 1 0 84.29 84 84 84.29 84 84 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=252 3 0 130 1400 1400 533.61 91 1382 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=255 2 0 110 230 230 168.71 105 232 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=258 1 0 214071.85 214000 214000 214071.85 214072 214072 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=262 1 0 9.4 9 9 9.4 9 9 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=263 1 0 46.03 46 46 46.03 46 46 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=266 2 0 382.84 189000 189000 94560.47 383 188738 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=268 2 0 74 1600 1600 826.57 74 1579 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=27 1 0 76.62 77 77 76.62 77 77 24524 0 0
|
||||
GET /api/v1/logs?limit=100&offset=272 1 0 1998.08 2000 2000 1998.08 1998 1998 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=274 2 0 1144.05 2800 2800 1982.6 1144 2821 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=280 2 0 160.79 197000 197000 98633.61 161 197106 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=284 1 0 146618.44 147000 147000 146618.44 146618 146618 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=298 1 0 15.58 16 16 15.58 16 16 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=299 1 0 38.63 39 39 38.63 39 39 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=302 1 0 8.94 9 9 8.94 9 9 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=305 1 0 24891.45 25000 25000 24891.45 24891 24891 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=309 1 0 105.8 110 110 105.8 106 106 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=312 1 0 124.05 120 120 124.05 124 124 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=316 1 0 50.76 51 51 50.76 51 51 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=317 1 0 8.85 9 9 8.85 9 9 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=330 1 0 42.95 43 43 42.95 43 43 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=337 1 0 62.38 62 62 62.38 62 62 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=338 1 0 34604.79 35000 35000 34604.79 34605 34605 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=34 1 0 50.34 50 50 50.34 50 50 20832 0 0
|
||||
GET /api/v1/logs?limit=100&offset=341 1 0 587.51 590 590 587.51 588 588 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=342 1 0 2723.41 2700 2700 2723.41 2723 2723 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=347 1 0 5374.03 5400 5400 5374.03 5374 5374 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=348 1 0 124307.42 124000 124000 124307.42 124307 124307 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=350 1 0 58.59 59 59 58.59 59 59 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=353 1 0 22.26 22 22 22.26 22 22 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=355 1 0 2750.91 2800 2800 2750.91 2751 2751 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=356 1 0 70859.42 71000 71000 70859.42 70859 70859 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=358 1 0 49.76 50 50 49.76 50 50 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=367 2 0 980 46000 46000 23443.38 978 45908 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=374 1 0 43.78 44 44 43.78 44 44 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=379 2 0 9.46 97 97 53.37 9 97 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=38 2 0 61.07 90 90 75.37 61 90 19026 0 0
|
||||
GET /api/v1/logs?limit=100&offset=381 2 0 59 5000 5000 2527.96 59 4997 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=383 1 0 2219.96 2200 2200 2219.96 2220 2220 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=385 1 0 258.55 260 260 258.55 259 259 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=389 1 0 60.87 61 61 60.87 61 61 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=392 1 0 43348.67 43000 43000 43348.67 43349 43349 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=393 1 0 298.96 300 300 298.96 299 299 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=395 1 0 213.42 210 210 213.42 213 213 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=396 1 0 311.99 310 310 311.99 312 312 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=398 1 0 2148.37 2100 2100 2148.37 2148 2148 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=4 1 0 174.66 170 170 174.66 175 175 35535 0 0
|
||||
GET /api/v1/logs?limit=100&offset=404 1 0 1822.84 1800 1800 1822.84 1823 1823 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=407 1 0 88 88 88 88 88 88 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=410 1 0 57.32 57 57 57.32 57 57 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=411 1 0 27315.27 27000 27000 27315.27 27315 27315 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=415 1 0 3850.57 3900 3900 3850.57 3851 3851 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=416 1 0 8490.64 8500 8500 8490.64 8491 8491 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=421 2 0 76.22 117000 117000 58412.05 76 116748 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=424 2 0 49.33 780 780 414.45 49 780 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=427 1 0 105.25 110 110 105.25 105 105 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=429 1 0 69.92 70 70 69.92 70 70 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=436 1 0 60.29 60 60 60.29 60 60 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=44 1 0 58.53 59 59 58.53 59 59 16072 0 0
|
||||
GET /api/v1/logs?limit=100&offset=442 1 0 110.85 110 110 110.85 111 111 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=445 1 0 112553.01 113000 113000 112553.01 112553 112553 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=446 1 0 5576.69 5600 5600 5576.69 5577 5577 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=447 1 0 210412.35 210000 210000 210412.35 210412 210412 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=450 1 0 85.41 85 85 85.41 85 85 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=458 2 0 56.29 770 770 411.16 56 766 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=459 1 0 85099.22 85000 85000 85099.22 85099 85099 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=461 2 0 240.57 49000 49000 24481.18 241 48722 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=462 1 0 257.21 260 260 257.21 257 257 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=463 1 0 6406.05 6400 6400 6406.05 6406 6406 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=464 1 0 51.13 51 51 51.13 51 51 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=467 3 0 2600 3900 3900 2389.57 686 3919 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=468 1 0 1370.33 1400 1400 1370.33 1370 1370 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=470 1 0 7.31 7 7 7.31 7 7 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=475 1 0 298.73 300 300 298.73 299 299 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=476 1 0 189079.49 189000 189000 189079.49 189079 189079 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=477 1 0 87.71 88 88 87.71 88 88 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=49 2 0 1139.19 2800 2800 1949.67 1139 2760 12750 0 0
|
||||
GET /api/v1/logs?limit=100&offset=495 1 0 70.97 71 71 70.97 71 71 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=499 1 0 2554.4 2600 2600 2554.4 2554 2554 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=500 1 0 68.04 68 68 68.04 68 68 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=504 1 0 55.85 56 56 55.85 56 56 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=505 1 0 79.14 79 79 79.14 79 79 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=520 1 0 119.46 120 120 119.46 119 119 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=522 1 0 124.05 120 120 124.05 124 124 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=523 1 0 2735.86 2700 2700 2735.86 2736 2736 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=525 1 0 5689.42 5700 5700 5689.42 5689 5689 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=526 2 0 14 71 71 42.26 14 71 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=528 1 0 706.57 710 710 706.57 707 707 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=53 2 0 66.29 510 510 289.59 66 513 10823 0 0
|
||||
GET /api/v1/logs?limit=100&offset=533 1 0 155.62 160 160 155.62 156 156 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=537 1 0 506.65 510 510 506.65 507 507 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=54 1 0 232.7 230 230 232.7 233 233 10428 0 0
|
||||
GET /api/v1/logs?limit=100&offset=541 1 0 97.95 98 98 97.95 98 98 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=542 1 0 1433.86 1400 1400 1433.86 1434 1434 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=544 1 0 483.81 480 480 483.81 484 484 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=545 1 0 2444.13 2400 2400 2444.13 2444 2444 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=55 1 0 20.04 20 20 20.04 20 20 10043 0 0
|
||||
GET /api/v1/logs?limit=100&offset=551 1 0 720.69 720 720 720.69 721 721 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=552 1 0 62.98 63 63 62.98 63 63 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=559 1 0 195.64 200 200 195.64 196 196 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=56 2 0 47 78 78 62.58 47 78 9666 0 0
|
||||
GET /api/v1/logs?limit=100&offset=560 1 0 446.21 450 450 446.21 446 446 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=561 1 0 25.91 26 26 25.91 26 26 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=563 1 0 208.7 210 210 208.7 209 209 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=564 1 0 8783.61 8800 8800 8783.61 8784 8784 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=566 2 0 15.17 1400 1400 697.52 15 1380 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=572 1 0 3766.8 3800 3800 3766.8 3767 3767 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=573 1 0 106.07 110 110 106.07 106 106 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=578 1 0 59906.98 60000 60000 59906.98 59907 59907 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=581 1 0 16.66 17 17 16.66 17 17 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=582 1 0 46.23 46 46 46.23 46 46 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=587 2 0 49.33 440 440 244.42 49 440 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=593 1 0 61.05 61 61 61.05 61 61 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=594 1 0 1177.96 1200 1200 1177.96 1178 1178 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=596 2 0 51 147000 147000 73729.73 51 147409 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=597 1 0 45906.18 46000 46000 45906.18 45906 45906 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=607 1 0 92.74 93 93 92.74 93 93 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=608 1 0 40.63 41 41 40.63 41 41 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=610 2 0 110 188000 188000 94004.13 107 187901 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=614 1 0 1159.67 1200 1200 1159.67 1160 1160 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=618 2 0 6 1300 1300 637.83 6 1270 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=625 1 0 80530.49 81000 81000 80530.49 80530 80530 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=627 1 0 3678.26 3700 3700 3678.26 3678 3678 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=628 1 0 3784.53 3800 3800 3784.53 3785 3785 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=638 1 0 88.04 88 88 88.04 88 88 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=639 1 0 151.85 150 150 151.85 152 152 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=64 1 0 293.8 290 290 293.8 294 294 6532 0 0
|
||||
GET /api/v1/logs?limit=100&offset=650 1 0 133.86 130 130 133.86 134 134 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=657 1 0 95.14 95 95 95.14 95 95 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=658 1 0 31909.1 32000 32000 31909.1 31909 31909 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=664 1 0 105.04 110 110 105.04 105 105 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=667 1 0 63.12 63 63 63.12 63 63 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=668 1 0 48686.59 49000 49000 48686.59 48687 48687 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=669 1 0 27.09 27 27 27.09 27 27 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=673 1 0 2719.97 2700 2700 2719.97 2720 2720 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=675 1 0 11724.77 12000 12000 11724.77 11725 11725 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=676 1 0 100.42 100 100 100.42 100 100 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=680 1 0 74.93 75 75 74.93 75 75 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=69 2 0 62.37 270 270 168.63 62 275 3961 0 0
|
||||
GET /api/v1/logs?limit=100&offset=693 1 0 16.61 17 17 16.61 17 17 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=695 1 0 77.95 78 78 77.95 78 78 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=697 1 0 2855.98 2900 2900 2855.98 2856 2856 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=701 1 0 77.36 77 77 77.36 77 77 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=708 1 0 521.75 520 520 521.75 522 522 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=717 1 0 234.9 230 230 234.9 235 235 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=723 1 0 165.48 170 170 165.48 165 165 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=724 1 0 277.67 280 280 277.67 278 278 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=725 1 0 959.23 960 960 959.23 959 959 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=726 1 0 2402.74 2400 2400 2402.74 2403 2403 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=727 1 0 38.29 38 38 38.29 38 38 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=729 1 0 119.67 120 120 119.67 120 120 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=730 1 0 251.92 250 250 251.92 252 252 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=732 1 0 228.15 230 230 228.15 228 228 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=739 1 0 122.78 120 120 122.78 123 123 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=740 1 0 1321.65 1300 1300 1321.65 1322 1322 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=75 3 0 83 260 260 133.73 63 255 1659 0 0
|
||||
GET /api/v1/logs?limit=100&offset=750 1 0 4273.34 4300 4300 4273.34 4273 4273 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=755 1 0 77.95 78 78 77.95 78 78 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=756 1 0 11.8 12 12 11.8 12 12 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=758 1 0 859.92 860 860 859.92 860 860 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=760 1 0 2127.34 2100 2100 2127.34 2127 2127 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=762 1 0 21.03 21 21 21.03 21 21 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=764 1 0 3431.28 3400 3400 3431.28 3431 3431 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=774 1 0 122.41 120 120 122.41 122 122 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=778 1 0 46.37 46 46 46.37 46 46 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=781 1 0 53330.48 53000 53000 53330.48 53330 53330 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=782 2 0 16.32 1000 1000 509.53 16 1003 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=787 1 0 116.22 120 120 116.22 116 116 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=79 1 0 215.49 220 220 215.49 215 215 46 0 0
|
||||
GET /api/v1/logs?limit=100&offset=791 1 0 2251.17 2300 2300 2251.17 2251 2251 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=795 1 0 53.82 54 54 53.82 54 54 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=796 1 0 33906.97 34000 34000 33906.97 33907 33907 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=797 1 0 938.03 940 940 938.03 938 938 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=798 1 0 11316.18 11000 11000 11316.18 11316 11316 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=799 1 0 2609.98 2600 2600 2609.98 2610 2610 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=800 1 0 2450.95 2500 2500 2450.95 2451 2451 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=801 1 0 88.21 88 88 88.21 88 88 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=802 1 0 49.47 49 49 49.47 49 49 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=805 1 0 2327.12 2300 2300 2327.12 2327 2327 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=807 1 0 46.73 47 47 46.73 47 47 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=809 2 0 47 49 49 48.06 47 49 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=81 1 0 816.62 820 820 816.62 817 817 46 0 0
|
||||
GET /api/v1/logs?limit=100&offset=813 1 0 53.02 53 53 53.02 53 53 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=814 2 0 21.36 25 25 23.41 21 25 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=816 1 0 50.42 50 50 50.42 50 50 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=818 1 0 46.44 46 46 46.44 46 46 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=827 1 0 1321.54 1300 1300 1321.54 1322 1322 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=828 1 0 534.75 530 530 534.75 535 535 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=829 1 0 61.13 61 61 61.13 61 61 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=830 1 0 277.35 280 280 277.35 277 277 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=831 1 0 10.53 11 11 10.53 11 11 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=835 1 0 210.18 210 210 210.18 210 210 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=836 1 0 113.15 110 110 113.15 113 113 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=838 2 0 52000 195000 195000 123299.15 51830 194769 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=84 1 0 12010.13 12000 12000 12010.13 12010 12010 46 0 0
|
||||
GET /api/v1/logs?limit=100&offset=842 2 0 364.86 4000 4000 2172.61 365 3980 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=849 1 0 111.36 110 110 111.36 111 111 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=850 1 0 83.05 83 83 83.05 83 83 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=851 1 0 852.39 850 850 852.39 852 852 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=852 2 0 86 194000 194000 97071.59 86 194057 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=859 1 0 140.88 140 140 140.88 141 141 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=865 1 0 96.11 96 96 96.11 96 96 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=866 1 0 79.49 79 79 79.49 79 79 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=869 1 0 382.65 380 380 382.65 383 383 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=873 2 0 101.4 190 190 144.51 101 188 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=877 1 0 2135.92 2100 2100 2135.92 2136 2136 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=884 1 0 1081 1100 1100 1081 1081 1081 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=887 1 0 150794.34 151000 151000 150794.34 150794 150794 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=889 1 0 1719.23 1700 1700 1719.23 1719 1719 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=892 1 0 29057.34 29000 29000 29057.34 29057 29057 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=896 1 0 14.41 14 14 14.41 14 14 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=899 2 0 50 192000 192000 96077.56 50 192105 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=900 1 0 15935.85 16000 16000 15935.85 15936 15936 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=901 2 0 201.48 470 470 337.71 201 474 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=904 1 0 54.05 54 54 54.05 54 54 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=914 1 0 170.4 170 170 170.4 170 170 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=915 2 0 97.47 390 390 244.09 97 391 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=92 1 0 248.2 250 250 248.2 248 248 46 0 0
|
||||
GET /api/v1/logs?limit=100&offset=922 1 0 5132.83 5100 5100 5132.83 5133 5133 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=925 1 0 304.43 300 300 304.43 304 304 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=926 1 0 370.55 370 370 370.55 371 371 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=931 1 0 132.9 130 130 132.9 133 133 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=936 1 0 169.7 170 170 169.7 170 170 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=937 1 0 48.98 49 49 48.98 49 49 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=940 2 0 270 217000 217000 108453.49 270 216637 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=947 1 0 290.95 290 290 290.95 291 291 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=948 2 0 6.15 410 410 209.8 6 413 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=949 1 0 72.08 72 72 72.08 72 72 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=95 1 0 2101.42 2100 2100 2101.42 2101 2101 46 0 0
|
||||
GET /api/v1/logs?limit=100&offset=952 1 0 213586.94 214000 214000 213586.94 213587 213587 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=954 1 0 93.34 93 93 93.34 93 93 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=955 1 0 92.8 93 93 92.8 93 93 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=956 1 0 21562.93 22000 22000 21562.93 21563 21563 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=959 1 0 21.85 22 22 21.85 22 22 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=962 1 0 207.4 210 210 207.4 207 207 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=964 1 0 24.5 25 25 24.5 25 25 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=966 2 0 25 57 57 40.6 25 57 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=967 2 0 12 5400 5400 2687.6 12 5363 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=968 2 0 76.29 48000 48000 24283.86 76 48491 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=970 1 0 36.97 37 37 36.97 37 37 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=972 1 0 105.02 110 110 105.02 105 105 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=974 2 0 73.13 190 190 129.36 73 186 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=975 1 0 83.51 84 84 83.51 84 84 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=977 1 0 475.55 480 480 475.55 476 476 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=979 2 0 1400 119000 119000 59973.65 1371 118577 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=986 1 0 205.75 210 210 205.75 206 206 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=987 1 0 51.98 52 52 51.98 52 52 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=989 1 0 136790.02 137000 137000 136790.02 136790 136790 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=994 1 0 35.01 35 35 35.01 35 35 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=997 2 0 54 89 89 71.56 54 89 47 0 0
|
||||
GET /api/v1/logs?limit=50 674 0 220 144000 198000 15778.67 7 248587 25618 0.4 0
|
||||
GET /api/v1/logs?search=ssh&limit=100 416 0 290 133000 171000 16185.87 10 243118 1916 0.2 0
|
||||
GET /api/v1/stats 830 0 110 93000 178000 11037.35 4 236075 78 0.3 0
|
||||
GET /api/v1/stream 78 0 220 194000 264000 19199.46 11 263604 0 0.1 0
|
||||
Aggregated 6012 0 240 134000 194000 16217.04 3 266610 3150.7 2.4 0
|
||||
|
335
development/profiles/profile_3106d0313507f016_locust.csv
Normal file
335
development/profiles/profile_3106d0313507f016_locust.csv
Normal file
@@ -0,0 +1,335 @@
|
||||
Type Name # Requests # Fails Median (ms) 95%ile (ms) 99%ile (ms) Average (ms) Min (ms) Max (ms) Average size (bytes) Current RPS Current Failures/s
|
||||
GET /api/v1/attackers 831 1 870 121000 194000 16076.31 8 236663 42.95 0.7 0
|
||||
GET /api/v1/attackers?search=brute&sort_by=recent 411 0 700 135000 194000 15681.05 6 224507 43 0.1 0
|
||||
POST /api/v1/auth/change-password 15 0 470 710 710 502.36 395 710 43 0 0
|
||||
POST /api/v1/auth/login 206 1 800 49000 131000 10103.85 169 170526 257.74 0.3 0
|
||||
POST /api/v1/auth/login [on_start] 525 10 1400 18000 25000 4126.08 194 27727 254.04 0 0
|
||||
GET /api/v1/bounty 617 0 1100 97000 177000 14374.99 12 236224 43 0.5 0
|
||||
GET /api/v1/config 304 2 1000 187000 228000 23837.45 8 247687 212.59 0.5 0
|
||||
GET /api/v1/deckies 776 3 420 52000 119000 7603.68 4 153295 1.99 0.2 0
|
||||
GET /api/v1/health 333 0 650 90000 168000 12471.56 5 194149 337 0.4 0
|
||||
GET /api/v1/logs/histogram 533 0 920 78000 159000 11734.83 5 181775 125 0.5 0
|
||||
GET /api/v1/logs?limit=100&offset=0 1 0 18609.57 19000 19000 18609.57 18610 18610 37830 0 0
|
||||
GET /api/v1/logs?limit=100&offset=1 1 0 1932.36 1900 1900 1932.36 1932 1932 36893 0 0
|
||||
GET /api/v1/logs?limit=100&offset=100 1 0 6154.39 6200 6200 6154.39 6154 6154 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=102 1 0 895.73 900 900 895.73 896 896 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=105 1 0 169.45 170 170 169.45 169 169 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=109 1 0 15.21 15 15 15.21 15 15 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=117 2 0 2000 3300 3300 2609.65 1961 3258 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=118 1 0 1066.55 1100 1100 1066.55 1067 1067 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=120 1 0 11854.78 12000 12000 11854.78 11855 11855 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=122 2 0 16407.68 78000 78000 47290.37 16408 78173 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=123 1 0 49.96 50 50 49.96 50 50 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=124 1 0 56942.9 57000 57000 56942.9 56943 56943 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=131 1 0 45.14 45 45 45.14 45 45 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=139 1 0 49.53 50 50 49.53 50 50 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=144 1 0 250.05 250 250 250.05 250 250 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=145 2 0 10192.03 31000 31000 20471.96 10192 30752 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=147 2 0 660.91 700 700 680.04 661 699 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=148 2 0 68 11000 11000 5747.04 68 11426 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=153 1 0 313.19 310 310 313.19 313 313 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=156 1 0 2226.05 2200 2200 2226.05 2226 2226 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=17 1 0 325.52 330 330 325.52 326 326 29210 0 0
|
||||
GET /api/v1/logs?limit=100&offset=170 1 0 263978.7 264000 264000 263978.7 263979 263979 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=173 4 0 130 15000 15000 4167.67 64 14642 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=18 1 0 185251.14 185000 185000 185251.14 185251 185251 28668 0 0
|
||||
GET /api/v1/logs?limit=100&offset=19 2 0 173.08 5900 5900 3041.46 173 5910 28184 0 0
|
||||
GET /api/v1/logs?limit=100&offset=20 1 0 1095.34 1100 1100 1095.34 1095 1095 27724 0 0
|
||||
GET /api/v1/logs?limit=100&offset=200 1 0 11302.82 11000 11000 11302.82 11303 11303 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=205 1 0 615.54 620 620 615.54 616 616 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=207 1 0 67.49 67 67 67.49 67 67 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=21 2 0 78.23 240 240 160.64 78 243 27266 0 0
|
||||
GET /api/v1/logs?limit=100&offset=211 1 0 1919.76 1900 1900 1919.76 1920 1920 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=212 2 0 1100 2100 2100 1569.45 1087 2052 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=213 1 0 48292.48 48000 48000 48292.48 48292 48292 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=22 1 0 1845.88 1800 1800 1845.88 1846 1846 26808 0 0
|
||||
GET /api/v1/logs?limit=100&offset=223 1 0 58672.3 59000 59000 58672.3 58672 58672 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=224 2 0 51 370 370 211.26 51 372 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=225 2 0 88 1000 1000 543.36 88 999 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=227 1 0 628.12 630 630 628.12 628 628 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=229 1 0 7.59 8 8 7.59 8 8 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=233 1 0 1010.46 1000 1000 1010.46 1010 1010 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=237 2 0 2400 40000 40000 21265.69 2382 40149 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=239 1 0 144.13 140 140 144.13 144 144 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=241 1 0 258.67 260 260 258.67 259 259 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=242 2 0 1012.12 4100 4100 2534.25 1012 4056 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=249 1 0 1350.64 1400 1400 1350.64 1351 1351 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=25 1 0 14008.13 14000 14000 14008.13 14008 14008 25434 0 0
|
||||
GET /api/v1/logs?limit=100&offset=251 2 0 700 1900 1900 1301.45 697 1906 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=253 1 0 2171.11 2200 2200 2171.11 2171 2171 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=254 1 0 48.83 49 49 48.83 49 49 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=258 2 0 99.25 160 160 128 99 157 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=261 1 0 154744.66 155000 155000 154744.66 154745 154745 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=262 1 0 70747.69 71000 71000 70747.69 70748 70748 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=272 1 0 96 96 96 96 96 96 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=279 1 1 1491.62 1500 1500 1491.62 1492 1492 0 0 0
|
||||
GET /api/v1/logs?limit=100&offset=282 1 0 3474.06 3500 3500 3474.06 3474 3474 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=287 1 0 13969.01 14000 14000 13969.01 13969 13969 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=289 1 0 72062.81 72000 72000 72062.81 72063 72063 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=292 1 0 7.46 7 7 7.46 7 7 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=293 1 0 70.13 70 70 70.13 70 70 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=294 1 0 12400.53 12000 12000 12400.53 12401 12401 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=295 2 0 67.08 76 76 71.72 67 76 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=296 1 0 687.48 690 690 687.48 687 687 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=297 1 0 47.68 48 48 47.68 48 48 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=300 1 0 53.4 53 53 53.4 53 53 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=302 1 0 48.05 48 48 48.05 48 48 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=304 1 0 2155.33 2200 2200 2155.33 2155 2155 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=305 2 0 520.03 1300 1300 908.64 520 1297 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=308 1 0 137.51 140 140 137.51 138 138 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=309 1 0 700.56 700 700 700.56 701 701 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=31 1 0 5504.6 5500 5500 5504.6 5505 5505 22216 0 0
|
||||
GET /api/v1/logs?limit=100&offset=310 1 0 330.04 330 330 330.04 330 330 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=311 1 0 34571.38 35000 35000 34571.38 34571 34571 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=315 2 0 34.21 100 100 68.71 34 103 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=319 2 0 76.36 25000 25000 12354.6 76 24633 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=323 1 0 88840.97 89000 89000 88840.97 88841 88841 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=331 1 0 247.92 250 250 247.92 248 248 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=332 2 0 88 240 240 163.04 88 238 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=334 1 0 51.5 51 51 51.5 51 51 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=336 1 0 106.74 110 110 106.74 107 107 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=339 1 0 946.25 950 950 946.25 946 946 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=34 1 0 2089.03 2100 2100 2089.03 2089 2089 20832 0 0
|
||||
GET /api/v1/logs?limit=100&offset=340 1 0 3511.3 3500 3500 3511.3 3511 3511 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=344 1 0 232.88 230 230 232.88 233 233 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=348 1 0 69.28 69 69 69.28 69 69 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=35 1 0 297.75 300 300 297.75 298 298 20386 0 0
|
||||
GET /api/v1/logs?limit=100&offset=352 2 0 170 1500 1500 834.33 165 1504 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=353 2 0 88.2 360 360 223.9 88 360 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=354 1 0 708.77 710 710 708.77 709 709 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=356 1 0 2550.49 2600 2600 2550.49 2550 2550 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=36 1 0 119.98 120 120 119.98 120 120 19922 0 0
|
||||
GET /api/v1/logs?limit=100&offset=364 1 0 77.15 77 77 77.15 77 77 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=365 1 0 109.59 110 110 109.59 110 110 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=368 1 0 2372.67 2400 2400 2372.67 2373 2373 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=374 1 0 149.94 150 150 149.94 150 150 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=38 1 0 146.06 150 150 146.06 146 146 19026 0 0
|
||||
GET /api/v1/logs?limit=100&offset=380 3 0 32000 49000 49000 28163.72 3003 49329 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=381 1 0 67.49 67 67 67.49 67 67 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=382 1 0 5835.29 5800 5800 5835.29 5835 5835 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=388 1 0 20099.45 20000 20000 20099.45 20099 20099 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=391 1 0 208.72 210 210 208.72 209 209 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=394 2 0 53 510 510 281.92 53 511 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=398 2 0 68 240 240 151.92 68 236 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=399 2 0 72 12000 12000 5971.68 72 11872 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=401 1 0 898.61 900 900 898.61 899 899 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=403 1 0 514.2 510 510 514.2 514 514 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=405 1 0 45.2 45 45 45.2 45 45 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=408 1 0 13935.77 14000 14000 13935.77 13936 13936 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=409 3 0 800 2000 2000 1034.62 269 2032 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=41 1 0 127.98 130 130 127.98 128 128 17564 0 0
|
||||
GET /api/v1/logs?limit=100&offset=410 2 0 76.43 4300 4300 2171.32 76 4266 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=411 1 0 73.59 74 74 73.59 74 74 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=412 1 0 103621.93 104000 104000 103621.93 103622 103622 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=42 1 0 2124.41 2100 2100 2124.41 2124 2124 17048 0 0
|
||||
GET /api/v1/logs?limit=100&offset=420 2 0 73000 195000 195000 133904.02 72758 195050 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=422 1 0 495.51 500 500 495.51 496 496 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=427 2 0 1603.58 29000 29000 15251.04 1604 28898 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=430 1 0 70287 70000 70000 70287 70287 70287 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=437 1 0 8247.51 8200 8200 8247.51 8248 8248 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=439 1 0 1091.37 1100 1100 1091.37 1091 1091 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=443 1 0 1225.24 1200 1200 1225.24 1225 1225 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=446 1 0 78277.58 78000 78000 78277.58 78278 78278 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=452 1 0 885.5 890 890 885.5 886 886 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=455 1 0 3620.11 3600 3600 3620.11 3620 3620 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=456 1 0 365.69 370 370 365.69 366 366 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=457 1 0 82.55 83 83 82.55 83 83 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=460 1 0 160.57 160 160 160.57 161 161 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=466 1 0 31137.76 31000 31000 31137.76 31138 31138 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=467 2 0 122.12 1900 1900 1021.44 122 1921 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=468 1 0 190689.64 191000 191000 190689.64 190690 190690 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=469 1 0 1154.79 1200 1200 1154.79 1155 1155 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=471 2 0 56.47 61000 61000 30433.76 56 60811 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=474 1 0 1632.32 1600 1600 1632.32 1632 1632 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=475 1 0 63.07 63 63 63.07 63 63 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=477 1 0 208.33 210 210 208.33 208 208 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=478 1 0 246.4 250 250 246.4 246 246 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=479 1 0 257.43 260 260 257.43 257 257 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=480 1 0 72.04 72 72 72.04 72 72 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=481 2 0 31 140 140 86.13 31 141 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=485 1 0 12330.03 12000 12000 12330.03 12330 12330 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=486 2 0 58 1900 1900 1001.78 58 1946 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=487 1 0 1008.23 1000 1000 1008.23 1008 1008 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=489 1 0 2224.03 2200 2200 2224.03 2224 2224 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=49 1 0 6582.22 6600 6600 6582.22 6582 6582 12750 0 0
|
||||
GET /api/v1/logs?limit=100&offset=491 1 0 46.68 47 47 46.68 47 47 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=493 1 0 40151.62 40000 40000 40151.62 40152 40152 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=499 1 0 9903.2 9900 9900 9903.2 9903 9903 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=5 1 0 247.86 250 250 247.86 248 248 35008 0 0
|
||||
GET /api/v1/logs?limit=100&offset=504 2 0 29 1100 1100 570.51 29 1112 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=507 1 0 174665.5 175000 175000 174665.5 174666 174666 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=511 1 0 1667.22 1700 1700 1667.22 1667 1667 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=513 1 0 70.66 71 71 70.66 71 71 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=52 1 0 1585.32 1600 1600 1585.32 1585 1585 11331 0 0
|
||||
GET /api/v1/logs?limit=100&offset=521 1 0 56.33 56 56 56.33 56 56 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=526 1 0 2326.86 2300 2300 2326.86 2327 2327 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=528 2 0 11148.28 97000 97000 54004.51 11148 96861 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=53 1 0 213682.36 214000 214000 213682.36 213682 213682 10823 0 0
|
||||
GET /api/v1/logs?limit=100&offset=530 1 0 109.31 110 110 109.31 109 109 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=534 1 0 51.32 51 51 51.32 51 51 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=540 1 0 1848.7 1800 1800 1848.7 1849 1849 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=542 1 0 7405.4 7400 7400 7405.4 7405 7405 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=545 1 0 480.17 480 480 480.17 480 480 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=549 1 0 1693.96 1700 1700 1693.96 1694 1694 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=55 1 0 60.98 61 61 60.98 61 61 10043 0 0
|
||||
GET /api/v1/logs?limit=100&offset=550 2 0 864.67 870 870 869.08 865 873 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=554 2 0 3600 8700 8700 6155.48 3595 8716 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=57 1 0 179.45 180 180 179.45 179 179 9267 0 0
|
||||
GET /api/v1/logs?limit=100&offset=574 2 0 1200 99000 99000 50268.19 1184 99352 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=577 1 0 3295.14 3300 3300 3295.14 3295 3295 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=578 1 0 1734.18 1700 1700 1734.18 1734 1734 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=579 1 0 14400.67 14000 14000 14400.67 14401 14401 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=582 1 0 6754.14 6800 6800 6754.14 6754 6754 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=583 1 0 786.69 790 790 786.69 787 787 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=585 1 0 231.97 230 230 231.97 232 232 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=586 1 0 60.49 60 60 60.49 60 60 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=587 1 0 146.07 150 150 146.07 146 146 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=588 2 0 430 53000 53000 26939.04 426 53452 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=59 1 0 792.67 790 790 792.67 793 793 8483 0 0
|
||||
GET /api/v1/logs?limit=100&offset=591 1 0 1272.66 1300 1300 1272.66 1273 1273 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=593 1 0 1988.65 2000 2000 1988.65 1989 1989 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=596 1 0 69.44 69 69 69.44 69 69 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=599 1 0 510.81 510 510 510.81 511 511 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=604 1 0 74.65 75 75 74.65 75 75 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=605 2 0 200 1600 1600 918.4 196 1641 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=608 1 0 81.26 81 81 81.26 81 81 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=61 2 0 734.21 1100 1100 920.66 734 1107 7693 0 0
|
||||
GET /api/v1/logs?limit=100&offset=613 1 0 53.13 53 53 53.13 53 53 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=624 1 0 20.58 21 21 20.58 21 21 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=630 1 0 93824.82 94000 94000 93824.82 93825 93825 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=634 1 0 1941.14 1900 1900 1941.14 1941 1941 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=636 1 0 4275.44 4300 4300 4275.44 4275 4275 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=64 1 0 2644.62 2600 2600 2644.62 2645 2645 6532 0 0
|
||||
GET /api/v1/logs?limit=100&offset=644 2 0 170 1000 1000 608.66 168 1049 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=648 1 0 87.91 88 88 87.91 88 88 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=649 3 0 42000 181000 181000 76530.07 6496 180923 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=650 1 0 6000.35 6000 6000 6000.35 6000 6000 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=651 1 0 32884.36 33000 33000 32884.36 32884 32884 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=661 2 0 163.58 200 200 183.91 164 204 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=662 2 0 63 206000 206000 103052.55 63 206042 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=665 3 0 1500 3600 3600 1697.74 19 3583 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=666 1 0 1239 1200 1200 1239 1239 1239 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=667 1 0 61.08 61 61 61.08 61 61 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=668 1 0 5220.64 5200 5200 5220.64 5221 5221 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=669 1 0 109.56 110 110 109.56 110 110 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=67 1 0 12236.33 12000 12000 12236.33 12236 12236 4727 0 0
|
||||
GET /api/v1/logs?limit=100&offset=671 1 0 212.96 210 210 212.96 213 213 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=679 1 0 1294.44 1300 1300 1294.44 1294 1294 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=681 1 0 361.67 360 360 361.67 362 362 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=685 1 0 1170.27 1200 1200 1170.27 1170 1170 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=687 1 0 97.77 98 98 97.77 98 98 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=69 2 0 97.45 31000 31000 15525.21 97 30953 3961 0 0
|
||||
GET /api/v1/logs?limit=100&offset=690 2 0 1100 7200 7200 4145.47 1055 7236 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=695 1 0 4366 4400 4400 4366 4366 4366 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=697 1 0 2149.13 2100 2100 2149.13 2149 2149 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=698 1 0 6093.23 6100 6100 6093.23 6093 6093 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=701 1 0 16069.27 16000 16000 16069.27 16069 16069 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=704 1 0 19427.22 19000 19000 19427.22 19427 19427 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=71 1 0 32684.69 33000 33000 32684.69 32685 32685 3183 0 0
|
||||
GET /api/v1/logs?limit=100&offset=712 2 0 62 1900 1900 994.62 62 1927 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=715 1 0 31810.26 32000 32000 31810.26 31810 31810 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=717 1 0 115819.32 116000 116000 115819.32 115819 115819 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=718 1 0 125150.78 125000 125000 125150.78 125151 125151 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=72 2 0 71 73 73 71.84 71 73 2803 0 0
|
||||
GET /api/v1/logs?limit=100&offset=722 1 0 87.49 87 87 87.49 87 87 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=726 1 0 981.29 980 980 981.29 981 981 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=728 1 0 25355.71 25000 25000 25355.71 25356 25356 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=735 2 0 190 500 500 345.76 188 504 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=736 1 0 2358.7 2400 2400 2358.7 2359 2359 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=737 1 0 238.07 240 240 238.07 238 238 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=738 1 0 52.26 52 52 52.26 52 52 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=744 1 0 42086.47 42000 42000 42086.47 42086 42086 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=746 1 0 68.09 68 68 68.09 68 68 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=747 1 0 850.15 850 850 850.15 850 850 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=749 1 0 206188.43 206000 206000 206188.43 206188 206188 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=751 1 0 1456.14 1500 1500 1456.14 1456 1456 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=755 1 0 1254.19 1300 1300 1254.19 1254 1254 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=756 1 0 201.95 200 200 201.95 202 202 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=76 2 0 16000 31000 31000 23549.6 15656 31443 1243 0 0
|
||||
GET /api/v1/logs?limit=100&offset=766 1 0 310.75 310 310 310.75 311 311 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=767 1 0 75.41 75 75 75.41 75 75 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=768 1 0 458.79 460 460 458.79 459 459 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=77 1 0 39233 39000 39000 39233 39233 39233 863 0 0
|
||||
GET /api/v1/logs?limit=100&offset=771 1 0 7724.54 7700 7700 7724.54 7725 7725 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=773 1 0 10978.95 11000 11000 10978.95 10979 10979 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=774 1 0 352.96 350 350 352.96 353 353 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=775 1 0 114.69 110 110 114.69 115 115 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=776 1 0 8391.22 8400 8400 8391.22 8391 8391 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=780 1 0 185.03 190 190 185.03 185 185 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=785 2 0 75 260 260 165.95 75 257 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=789 1 0 175072.61 175000 175000 175072.61 175073 175073 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=792 1 0 1800.17 1800 1800 1800.17 1800 1800 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=793 1 0 3583.88 3600 3600 3583.88 3584 3584 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=798 1 0 1825.39 1800 1800 1825.39 1825 1825 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=800 1 0 68.11 68 68 68.11 68 68 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=801 3 0 290 590 590 379.85 258 593 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=806 1 0 83.9 84 84 83.9 84 84 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=810 1 0 1731.65 1700 1700 1731.65 1732 1732 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=811 1 0 1326.62 1300 1300 1326.62 1327 1327 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=816 1 0 247.4 250 250 247.4 247 247 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=818 2 0 3500 18000 18000 10930.94 3466 18396 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=819 1 0 2023.96 2000 2000 2023.96 2024 2024 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=828 2 0 54 55 55 54.52 54 55 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=831 1 0 2931.66 2900 2900 2931.66 2932 2932 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=837 1 0 62.23 62 62 62.23 62 62 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=838 1 0 72.85 73 73 72.85 73 73 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=839 1 0 13.34 13 13 13.34 13 13 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=84 1 0 37852.66 38000 38000 37852.66 37853 37853 46 0 0
|
||||
GET /api/v1/logs?limit=100&offset=842 1 0 87.02 87 87 87.02 87 87 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=844 1 0 2938.45 2900 2900 2938.45 2938 2938 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=852 1 0 2047.02 2000 2000 2047.02 2047 2047 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=853 1 0 61.27 61 61 61.27 61 61 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=863 1 0 332.08 330 330 332.08 332 332 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=865 1 0 5544.63 5500 5500 5544.63 5545 5545 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=869 1 0 2556.72 2600 2600 2556.72 2557 2557 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=870 1 0 129273.84 129000 129000 129273.84 129274 129274 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=882 1 0 699.4 700 700 699.4 699 699 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=884 1 0 30716.29 31000 31000 30716.29 30716 30716 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=885 1 0 161.66 160 160 161.66 162 162 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=89 2 0 67.15 350 350 210.29 67 353 46 0 0
|
||||
GET /api/v1/logs?limit=100&offset=890 1 0 63.65 64 64 63.65 64 64 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=892 1 0 107782.46 108000 108000 107782.46 107782 107782 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=893 2 0 3200 8200 8200 5679.83 3153 8206 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=894 1 0 240.25 240 240 240.25 240 240 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=901 1 0 15.34 15 15 15.34 15 15 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=907 1 0 171219.25 171000 171000 171219.25 171219 171219 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=908 1 0 4667.87 4700 4700 4667.87 4668 4668 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=91 1 0 41.41 41 41 41.41 41 41 46 0 0
|
||||
GET /api/v1/logs?limit=100&offset=910 1 0 21.45 21 21 21.45 21 21 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=911 1 0 803.28 800 800 803.28 803 803 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=920 1 0 34.29 34 34 34.29 34 34 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=921 1 0 811.95 810 810 811.95 812 812 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=926 1 0 61.69 62 62 61.69 62 62 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=942 1 0 239.09 240 240 239.09 239 239 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=946 1 0 219.39 220 220 219.39 219 219 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=95 1 0 92.28 92 92 92.28 92 92 46 0 0
|
||||
GET /api/v1/logs?limit=100&offset=953 1 0 50.92 51 51 50.92 51 51 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=954 3 0 7900 112000 112000 40071.06 86 112228 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=955 1 0 1369.98 1400 1400 1369.98 1370 1370 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=956 1 0 45069.97 45000 45000 45069.97 45070 45070 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=958 1 0 34775.14 35000 35000 34775.14 34775 34775 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=959 1 0 2272.48 2300 2300 2272.48 2272 2272 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=960 1 0 65.02 65 65 65.02 65 65 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=963 1 0 1026.21 1000 1000 1026.21 1026 1026 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=964 1 0 74.49 74 74 74.49 74 74 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=970 1 0 143.98 140 140 143.98 144 144 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=971 1 0 61.28 61 61 61.28 61 61 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=972 1 0 96.13 96 96 96.13 96 96 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=973 1 0 1724.09 1700 1700 1724.09 1724 1724 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=974 1 0 8859.62 8900 8900 8859.62 8860 8860 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=977 1 0 9988.42 10000 10000 9988.42 9988 9988 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=978 1 0 578.21 580 580 578.21 578 578 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=980 1 0 157.02 160 160 157.02 157 157 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=981 2 0 5300 30000 30000 17645.6 5295 29997 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=982 1 0 1178.59 1200 1200 1178.59 1179 1179 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=983 1 0 22015.08 22000 22000 22015.08 22015 22015 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=988 2 0 27 64 64 45.56 27 64 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=989 1 0 510.73 510 510 510.73 511 511 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=995 1 0 489.11 490 490 489.11 489 489 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=997 2 0 41 143000 143000 71669.2 41 143298 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=999 1 0 2913.35 2900 2900 2913.35 2913 2913 47 0 0
|
||||
GET /api/v1/logs?limit=50 828 1 520 101000 195000 14305.4 8 219151 25587.06 0.6 0
|
||||
GET /api/v1/logs?search=ssh&limit=100 525 0 810 84000 183000 13645.59 8 228961 1916 0.6 0
|
||||
GET /api/v1/stats 1016 1 400 92000 201000 12814.34 4 244997 77.92 1 0
|
||||
GET /api/v1/stream 100 0 1800 139000 227000 20328.99 13 227236 0 0.1 0
|
||||
Aggregated 7410 20 740 87000 187000 12999.71 4 263979 3158.51 5.5 0
|
||||
|
502
development/profiles/profile_e967aaa.csv
Normal file
502
development/profiles/profile_e967aaa.csv
Normal file
@@ -0,0 +1,502 @@
|
||||
Type Name # Requests # Fails Median (ms) 95%ile (ms) 99%ile (ms) Average (ms) Min (ms) Max (ms) Average size (bytes) Current RPS Current Failures/s
|
||||
GET /api/v1/attackers?search=brute&sort_by=recent 15703 0 1400 1900 2300 1401.38 3 3876 43 56.5 0
|
||||
GET /api/v1/logs?limit=100&offset=446 10 0 1100 2800 2800 1259.27 627 2758 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=274 14 0 950 1500 1500 965.83 667 1454 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=319 18 0 940 1500 1500 925.91 3 1522 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=43 14 0 920 1400 1400 917.37 643 1405 16524 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=295 14 0 910 1300 1300 931.22 676 1308 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=345 11 0 910 1300 1300 939.9 676 1293 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=372 9 0 910 1400 1400 890.43 424 1420 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=442 15 0 910 1300 1300 922.98 665 1321 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=14 14 0 890 1600 1600 942.75 197 1626 30696 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=176 13 0 890 1300 1300 916.13 635 1275 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=24 11 0 890 1200 1200 876.37 500 1198 25892 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=410 13 0 890 1300 1300 886.67 546 1286 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=303 6 0 880 3300 3300 1352.45 741 3298 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=314 17 0 880 1500 1500 946.06 511 1544 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=381 11 0 880 1500 1500 935.42 3 1486 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=405 14 0 880 1600 1600 906.07 2 1578 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=154 16 0 870 1300 1300 920.21 585 1319 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=214 13 0 870 1300 1300 872.81 584 1298 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=465 15 0 870 1400 1400 875.04 34 1416 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=523 7 0 870 1100 1100 782.47 8 1148 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=167 13 0 860 1000 1000 776.25 170 999 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=223 11 0 860 1800 1800 946.41 125 1770 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=268 15 0 860 1200 1200 870.27 630 1232 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=307 18 0 860 1400 1400 924.74 11 1416 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=353 11 0 860 1300 1300 912.56 690 1281 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=108 14 0 850 1300 1300 926.19 659 1311 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=421 11 0 850 1400 1400 860.76 669 1419 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=1000 20 0 840 1400 1400 909.94 587 1370 48 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=298 19 0 840 2000 2000 976.06 524 1955 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=5 15 0 840 1400 1400 800.98 230 1397 35008 0 0
|
||||
GET /api/v1/logs?limit=100&offset=512 17 0 840 1400 1400 839.31 78 1359 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=15 10 0 830 1200 1200 832.16 7 1223 30146 0 0
|
||||
GET /api/v1/logs?limit=100&offset=16 16 0 830 1700 1700 905.55 284 1658 29660 0 0
|
||||
GET /api/v1/logs?limit=100&offset=182 17 0 830 1500 1500 838.98 373 1525 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=204 11 0 830 1400 1400 855.6 584 1368 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=209 15 0 830 1100 1100 819.39 352 1118 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=211 10 0 830 1500 1500 939.98 656 1452 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=249 12 0 830 2200 2200 981.87 630 2159 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=418 17 0 830 2000 2000 905.68 561 1965 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=510 13 0 830 1300 1300 820.94 274 1325 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=518 11 0 830 1200 1200 839.24 586 1245 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=205 11 0 820 1600 1600 929.47 596 1605 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=292 15 0 820 2200 2200 953.17 534 2222 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=311 16 0 820 1600 1600 871.59 4 1627 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=395 10 0 820 2000 2000 1011.43 650 2024 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=136 21 0 810 1300 1400 933.27 661 1437 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=184 16 0 810 1500 1500 866.75 630 1506 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=200 19 0 810 1400 1400 853.41 93 1423 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=212 18 0 810 1300 1300 874.81 574 1335 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=254 12 0 810 1200 1200 862.9 735 1207 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=343 26 0 810 1200 1200 860.02 575 1239 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=35 13 0 810 1300 1300 833.61 179 1296 20386 0 0
|
||||
GET /api/v1/logs?limit=100&offset=352 7 0 810 1300 1300 885.23 689 1306 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=359 20 0 810 1400 1400 791.77 2 1398 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=425 16 0 810 1500 1500 872.53 587 1544 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=470 19 0 810 1500 1500 893.35 535 1471 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=488 12 0 810 1100 1100 847.86 580 1121 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=491 15 0 810 1400 1400 861.91 633 1398 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=12 14 0 800 1000 1000 738.04 354 1009 31676 0 0
|
||||
GET /api/v1/logs?limit=100&offset=13 18 0 800 1200 1200 815.17 593 1231 31148 0 0
|
||||
GET /api/v1/logs?limit=100&offset=157 16 0 800 1500 1500 825.2 72 1504 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=165 7 0 800 1200 1200 857.81 667 1178 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=172 13 0 800 1500 1500 882.96 214 1462 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=183 13 0 800 1200 1200 780.74 350 1177 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=192 13 0 800 1200 1200 817.04 425 1226 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=198 18 0 800 2100 2100 984.56 505 2126 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=216 18 0 800 2100 2100 890.81 201 2069 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=263 14 0 800 1200 1200 731.69 7 1223 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=265 19 0 800 1400 1400 826.82 559 1378 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=277 16 0 800 1500 1500 878.53 500 1529 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=284 21 0 800 1100 1200 835.72 566 1247 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=328 16 0 800 1200 1200 831.48 457 1165 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=337 15 0 800 1200 1200 779.58 237 1185 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=348 15 0 800 1900 1900 957.3 565 1883 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=387 24 0 800 1500 1800 861.43 7 1830 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=398 14 0 800 1400 1400 806.52 126 1434 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=419 16 0 800 1800 1800 1018.71 574 1766 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=431 17 0 800 1300 1300 745.22 3 1276 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=432 26 0 800 1400 1500 858.27 534 1547 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=445 13 0 800 1500 1500 826.25 446 1522 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=447 20 0 800 1800 1800 827.1 100 1756 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=459 10 0 800 2000 2000 1045.11 699 1957 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=48 12 0 800 1500 1500 775.51 88 1483 13400 0 0
|
||||
GET /api/v1/logs?limit=100&offset=499 13 0 800 1300 1300 822.84 305 1328 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=508 19 0 800 1200 1200 818.75 287 1209 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=53 14 0 800 1400 1400 881.61 3 1414 10823 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=101 18 0 790 1500 1500 906.69 572 1531 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=103 18 0 790 2100 2100 973 597 2130 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=104 19 0 790 1300 1300 750.77 3 1281 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=109 17 0 790 1400 1400 913.97 481 1362 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=130 14 0 790 1300 1300 798.55 109 1286 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=134 21 0 790 1100 1300 824.83 614 1325 47 0.4 0
|
||||
GET /api/v1/logs?limit=100&offset=149 18 0 790 1400 1400 843.74 11 1407 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=166 17 0 790 1800 1800 947.66 639 1778 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=171 13 0 790 1200 1200 824.86 676 1249 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=174 16 0 790 1200 1200 887.96 691 1249 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=181 23 0 790 1200 1500 819.04 530 1469 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=222 12 0 790 2000 2000 922.23 595 1994 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=225 13 0 790 1200 1200 855.24 650 1214 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=230 17 0 790 1400 1400 803.95 106 1386 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=26 19 0 790 1400 1400 763.88 6 1360 24976 0 0
|
||||
GET /api/v1/logs?limit=100&offset=281 5 0 790 2000 2000 924.74 154 1972 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=293 10 0 790 1200 1200 832.21 446 1169 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=339 20 0 790 2600 2600 926.54 32 2625 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=390 10 0 790 1100 1100 900.76 717 1136 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=414 15 0 790 1500 1500 888.44 4 1501 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=416 11 0 790 1900 1900 949.82 633 1943 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=469 16 0 790 2500 2500 933.12 410 2523 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=50 15 0 790 1500 1500 820.73 28 1474 12256 0 0
|
||||
GET /api/v1/logs?limit=100&offset=509 19 0 790 1700 1700 818 25 1723 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=517 16 0 790 1400 1400 900.28 631 1414 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=132 14 0 780 1400 1400 891.24 650 1413 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=137 22 0 780 1200 1600 795.35 4 1584 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=143 16 0 780 1200 1200 821.52 580 1214 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=145 10 0 780 2100 2100 906.03 26 2058 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=158 18 0 780 1300 1300 788 268 1267 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=173 14 0 780 1100 1100 773.83 250 1128 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=202 16 0 780 2100 2100 931.62 593 2093 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=206 15 0 780 1200 1200 813.01 533 1152 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=215 19 0 780 1300 1300 821.95 376 1251 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=232 19 0 780 1600 1600 848.99 10 1615 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=242 15 0 780 2000 2000 944.18 638 2049 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=250 14 0 780 1400 1400 834.25 183 1401 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=257 7 0 780 1100 1100 820.6 676 1113 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=262 16 0 780 1100 1100 770.13 249 1114 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=282 12 0 780 1200 1200 798.92 127 1183 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=287 21 0 780 1300 1600 859.35 89 1623 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=324 9 0 780 1300 1300 700.35 2 1266 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=332 12 0 780 1200 1200 828.4 408 1194 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=34 11 0 780 1300 1300 858.07 547 1333 20832 0 0
|
||||
GET /api/v1/logs?limit=100&offset=380 21 0 780 870 970 731.56 5 969 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=391 15 0 780 1400 1400 885.69 258 1352 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=396 10 0 780 1300 1300 876.48 607 1335 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=402 16 0 780 2700 2700 1003.94 684 2710 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=404 23 0 780 1100 1400 767.78 3 1369 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=408 16 0 780 1400 1400 848.21 546 1365 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=411 20 0 780 1300 1300 808.33 5 1282 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=441 14 0 780 1400 1400 812.25 231 1420 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=444 22 0 780 1300 1500 818.48 179 1462 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=462 18 0 780 1800 1800 895.48 536 1760 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=464 13 0 780 1100 1100 816.16 585 1096 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=497 13 0 780 990 990 790.82 609 993 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=515 15 0 780 1200 1200 750.22 21 1190 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=516 21 0 780 1100 1200 796.54 445 1167 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=52 14 0 780 1300 1300 885.73 729 1317 11331 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=520 20 0 780 1300 1300 819.47 375 1252 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=124 15 0 770 1500 1500 786.64 614 1496 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=160 19 0 770 2800 2800 925.05 578 2756 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=161 18 0 770 1400 1400 826.67 70 1436 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=168 16 0 770 1300 1300 858.17 261 1304 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=17 19 0 770 1700 1700 774.37 169 1679 29210 0 0
|
||||
GET /api/v1/logs?limit=100&offset=185 18 0 770 1800 1800 875.34 229 1843 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=217 6 0 770 2100 2100 907.83 7 2133 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=23 21 0 770 1300 2000 868.53 582 1990 26350 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=246 21 0 770 1200 1200 821.5 605 1248 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=247 19 0 770 1100 1100 773.1 333 1090 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=251 24 0 770 1300 1300 831.3 160 1328 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=256 21 0 770 1100 1400 812.91 535 1388 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=297 13 0 770 1400 1400 878.59 656 1368 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=315 15 0 770 1400 1400 837.73 581 1410 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=322 16 0 770 1400 1400 848.09 569 1426 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=342 19 0 770 1800 1800 821.93 207 1850 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=386 29 0 770 1300 1500 792.62 187 1457 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=392 17 0 770 1200 1200 818.38 622 1215 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=403 19 0 770 1500 1500 829.41 507 1485 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=45 13 0 770 1000 1000 715.61 8 998 15332 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=461 20 0 770 1400 1400 773.1 4 1400 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=476 19 0 770 1200 1200 846.9 501 1227 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=49 18 0 770 1700 1700 900.84 616 1702 12750 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=492 9 0 770 1600 1600 961.89 609 1614 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=506 13 0 770 1200 1200 801.72 451 1203 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=511 13 0 770 1500 1500 750.58 3 1505 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=0 16 0 760 1700 1700 856.45 84 1695 37830 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=106 20 0 760 1600 1600 831.1 286 1593 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=114 16 0 760 1500 1500 850.67 109 1527 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=120 16 0 760 1200 1200 847.08 527 1177 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=123 20 0 760 1500 1500 817.15 594 1529 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=131 15 0 760 1400 1400 681.05 3 1385 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=138 13 0 760 1000 1000 753.92 200 1046 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=191 19 0 760 1300 1300 760.34 5 1332 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=208 14 0 760 1400 1400 781.22 11 1432 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=220 21 0 760 1300 1400 866.8 401 1409 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=233 12 0 760 1800 1800 888.73 614 1839 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=260 19 0 760 2400 2400 891.53 145 2356 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=270 20 0 760 1300 1300 840.26 224 1342 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=275 18 0 760 1300 1300 712.29 33 1304 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=279 14 0 760 1700 1700 897.26 646 1727 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=280 12 0 760 1200 1200 784.8 97 1217 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=289 17 0 760 1700 1700 841.42 309 1709 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=301 10 0 760 1100 1100 811.84 562 1112 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=312 15 0 760 1300 1300 801.94 107 1306 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=318 17 0 760 1700 1700 774.61 3 1735 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=327 20 0 760 1100 1100 743.67 118 1123 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=347 13 0 760 1400 1400 721.65 110 1380 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=349 14 0 760 2000 2000 854.46 331 2027 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=351 11 0 760 1100 1100 734.75 118 1112 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=356 17 0 760 1500 1500 875.86 528 1509 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=364 11 0 760 1400 1400 813.85 195 1404 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=371 13 0 760 1300 1300 821.14 566 1273 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=399 16 0 760 900 900 688.02 7 902 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=400 15 0 760 1800 1800 833.56 3 1777 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=406 17 0 760 1600 1600 813.01 568 1571 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=42 11 0 760 1300 1300 770.65 323 1341 17048 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=440 20 0 760 1400 1400 826.54 10 1406 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=443 20 0 760 2100 2100 880.02 5 2146 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=458 22 0 760 1300 1300 772.75 19 1320 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=46 17 0 760 1300 1300 830.11 450 1311 14706 0 0
|
||||
GET /api/v1/logs?limit=100&offset=468 19 0 760 1400 1400 784.51 184 1378 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=482 18 0 760 1300 1300 788.59 167 1337 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=486 21 0 760 1400 1700 873.86 585 1660 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=494 23 0 760 1300 3300 928.2 431 3281 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=502 11 0 760 1200 1200 791.59 318 1232 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=514 7 0 760 1000 1000 758.27 531 1010 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=524 11 0 760 1300 1300 788.99 378 1266 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=525 15 0 760 1400 1400 797.17 468 1359 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=526 17 0 760 2300 2300 957.72 602 2310 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=528 16 0 760 1400 1400 796.62 272 1428 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=534 13 0 760 1400 1400 861.26 607 1402 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=537 21 0 760 1300 1300 809.74 573 1281 47 0.2 0
|
||||
GET /api/v1/attackers 31246 0 750 1400 1700 795.57 2 3094 43 116 0
|
||||
GET /api/v1/logs?limit=100&offset=102 19 0 750 1200 1200 747.56 207 1182 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=107 14 0 750 950 950 779.69 648 947 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=11 15 0 750 1300 1300 767.34 483 1281 32156 0 0
|
||||
GET /api/v1/logs?limit=100&offset=112 16 0 750 1400 1400 829.99 441 1374 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=113 18 0 750 1400 1400 892.66 510 1374 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=121 15 0 750 1300 1300 721.35 197 1276 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=125 13 0 750 900 900 760.15 631 905 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=126 11 0 750 1600 1600 807.26 9 1608 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=150 18 0 750 1700 1700 839.85 120 1699 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=153 13 0 750 1300 1300 794.74 574 1338 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=156 19 0 750 1600 1600 825.29 197 1633 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=18 19 0 750 1100 1100 783.38 156 1125 28668 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=186 21 0 750 1100 1300 805.05 557 1250 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=19 12 0 750 1300 1300 818.55 603 1290 28184 0 0
|
||||
GET /api/v1/logs?limit=100&offset=190 19 0 750 2100 2100 835.87 9 2114 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=201 15 0 750 1100 1100 751.5 3 1095 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=207 9 0 750 1300 1300 792.08 465 1253 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=213 17 0 750 1200 1200 776.64 191 1214 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=227 22 0 750 1500 1700 845 423 1673 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=234 11 0 750 1300 1300 739.08 42 1340 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=239 17 0 750 1200 1200 795.57 615 1233 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=267 16 0 750 1400 1400 828.86 338 1364 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=271 23 0 750 1100 1200 780.14 524 1232 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=285 13 0 750 1700 1700 910.91 573 1730 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=288 18 0 750 1600 1600 859.69 580 1571 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=309 16 0 750 1300 1300 743.91 21 1312 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=31 17 0 750 1500 1500 802.46 587 1470 22216 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=313 12 0 750 1500 1500 775.42 161 1469 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=320 10 0 750 1300 1300 787.64 181 1323 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=360 25 0 750 1100 1600 796.79 418 1567 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=369 13 0 750 1200 1200 775.42 474 1164 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=38 20 0 750 1400 1400 724.32 4 1375 19026 0 0
|
||||
GET /api/v1/logs?limit=100&offset=388 16 0 750 1400 1400 787.92 110 1395 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=394 18 0 750 1400 1400 785.72 20 1428 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=409 21 0 750 1200 1600 766.75 93 1641 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=41 19 0 750 1800 1800 888.31 569 1761 17564 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=428 21 0 750 1300 1800 745.25 6 1774 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=429 18 0 750 1200 1200 838.31 561 1218 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=435 13 0 750 1300 1300 769.6 146 1299 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=438 8 0 750 1200 1200 806.28 644 1175 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=452 18 0 750 1200 1200 723.61 9 1233 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=453 11 0 750 1300 1300 778.43 561 1269 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=460 13 0 750 1200 1200 775.93 588 1222 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=466 12 0 750 1100 1100 776.62 542 1126 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=471 20 0 750 2000 2000 873.6 575 1988 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=475 28 0 750 1400 1500 771.94 3 1512 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=479 19 0 750 1600 1600 835.87 18 1594 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=489 25 0 750 1300 1500 828.5 7 1545 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=500 17 0 750 1400 1400 793.02 19 1355 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=504 19 0 750 1500 1500 792.91 92 1475 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=519 21 0 750 1100 1900 850.27 579 1879 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=522 15 0 750 1400 1400 881.44 654 1382 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=530 15 0 750 1400 1400 779.24 7 1413 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=535 15 0 750 1200 1200 762.08 279 1178 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=116 14 0 740 1100 1100 815.6 674 1139 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=118 19 0 740 2300 2300 844.31 389 2277 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=140 19 0 740 1300 1300 763.69 314 1270 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=142 9 0 740 1500 1500 838.3 60 1536 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=148 18 0 740 2000 2000 843.76 456 2048 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=163 10 0 740 1400 1400 841.86 614 1351 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=178 14 0 740 1400 1400 778.74 3 1389 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=179 18 0 740 1200 1200 755.31 351 1209 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=180 14 0 740 1400 1400 837.63 570 1437 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=195 16 0 740 1100 1100 770.16 581 1149 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=199 10 0 740 1400 1400 819.13 13 1350 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=20 17 0 740 2100 2100 820.27 188 2059 27724 0 0
|
||||
GET /api/v1/logs?limit=100&offset=228 21 0 740 1100 1200 743.99 113 1182 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=229 19 0 740 1600 1600 842.54 394 1630 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=240 16 0 740 1100 1100 752.71 2 1079 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=258 21 0 740 1100 1300 757.22 27 1279 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=286 18 0 740 1200 1200 811.77 628 1237 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=291 18 0 740 1500 1500 813.22 343 1546 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=296 21 0 740 1000 1100 771.13 35 1116 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=310 17 0 740 1400 1400 756.66 11 1414 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=325 11 0 740 2000 2000 827.38 135 1983 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=33 19 0 740 1400 1400 781.49 31 1389 21296 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=333 11 0 740 1500 1500 735.98 8 1487 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=340 16 0 740 960 960 714.27 8 958 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=355 20 0 740 2000 2000 820.22 289 2015 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=363 11 0 740 1900 1900 855.49 592 1865 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=366 11 0 740 1500 1500 702.88 4 1487 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=378 15 0 740 1200 1200 798.09 473 1216 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=39 15 0 740 1400 1400 745.88 4 1381 18560 0 0
|
||||
GET /api/v1/logs?limit=100&offset=417 12 0 740 1600 1600 822.62 207 1600 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=422 14 0 740 1400 1400 758.07 418 1410 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=437 16 0 740 1500 1500 755.01 144 1465 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=449 17 0 740 1400 1400 778.96 97 1374 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=450 15 0 740 1700 1700 871.09 666 1661 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=47 14 0 740 1300 1300 728.67 117 1257 14066 0 0
|
||||
GET /api/v1/logs?limit=100&offset=477 9 0 740 1200 1200 813.75 681 1180 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=478 12 0 740 1200 1200 779.05 236 1167 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=483 23 0 740 1200 1400 780.46 185 1450 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=484 12 0 740 1500 1500 810.36 327 1468 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=485 15 0 740 1500 1500 744.27 12 1548 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=487 21 0 740 1200 1300 842.85 376 1266 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=496 20 0 740 1600 1600 808.2 464 1553 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=533 13 0 740 1400 1400 784.54 4 1408 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=110 10 0 730 1100 1100 809.82 586 1125 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=127 16 0 730 1300 1300 778.05 100 1344 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=169 16 0 730 1200 1200 752.05 617 1167 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=2 14 0 730 1200 1200 793.77 604 1219 36489 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=203 14 0 730 1200 1200 787.47 566 1150 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=210 17 0 730 980 980 720 492 975 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=218 17 0 730 1300 1300 751.7 286 1333 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=221 22 0 730 1100 1100 709.64 183 1061 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=224 17 0 730 1100 1100 760.09 388 1143 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=237 13 0 730 1800 1800 871.83 458 1772 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=243 21 0 730 1300 1400 756.73 7 1383 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=244 15 0 730 1200 1200 804.97 594 1240 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=252 5 0 730 1300 1300 844.12 639 1297 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=253 22 0 730 1200 1300 816.25 518 1299 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=255 19 0 730 2300 2300 925.24 148 2347 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=294 15 0 730 1100 1100 762.67 614 1087 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=302 18 0 730 1000 1000 710.44 331 1046 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=304 16 0 730 2300 2300 873.44 209 2279 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=308 12 0 730 1400 1400 736.4 2 1387 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=316 9 0 730 1200 1200 812.89 554 1246 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=321 14 0 730 1100 1100 739.86 121 1120 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=323 21 0 730 1100 1500 824.94 431 1491 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=329 18 0 730 1100 1100 759.66 422 1087 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=330 10 0 730 1100 1100 723.22 223 1059 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=331 16 0 730 980 980 690.31 4 983 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=334 8 0 730 1500 1500 862.85 624 1520 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=335 14 0 730 1300 1300 814.45 38 1343 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=336 21 0 730 1100 1300 742.05 59 1257 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=344 21 0 730 1100 1100 667.96 80 1130 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=357 19 0 730 1100 1100 779.53 631 1141 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=365 22 0 730 1400 1400 768.77 3 1401 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=367 15 0 730 1500 1500 860.26 628 1528 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=368 21 0 730 1200 1400 770.83 42 1383 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=375 11 0 730 1300 1300 741.93 54 1332 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=384 9 0 730 1300 1300 828.93 585 1349 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=415 15 0 730 930 930 671.92 29 930 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=423 19 0 730 1300 1300 779.23 217 1323 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=426 16 0 730 1600 1600 823.7 572 1606 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=451 16 0 730 1400 1400 812.96 289 1360 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=454 10 0 730 1400 1400 772.57 493 1355 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=457 12 0 730 1200 1200 813.83 507 1201 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=480 18 0 730 1200 1200 792.01 553 1188 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=505 15 0 730 1500 1500 807.75 139 1489 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=529 16 0 730 1500 1500 792.85 73 1481 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=532 20 0 730 1300 1300 792.33 214 1313 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=1 16 0 720 1300 1300 820.04 238 1330 36893 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=100 12 0 720 1200 1200 760.47 446 1224 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=122 19 0 720 1200 1200 716.61 4 1178 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=139 13 0 720 1500 1500 692.19 6 1491 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=146 9 0 720 1400 1400 820.56 537 1406 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=155 11 0 720 1200 1200 749.78 52 1220 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=159 20 0 720 1500 1500 761.57 96 1494 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=162 18 0 720 1300 1300 729.24 10 1315 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=164 14 0 720 1300 1300 751.48 6 1314 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=187 16 0 720 1100 1100 768.06 514 1091 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=197 16 0 720 1600 1600 844.64 589 1617 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=22 20 0 720 1300 1300 763.72 121 1281 26808 0 0
|
||||
GET /api/v1/logs?limit=100&offset=231 18 0 720 1400 1400 755.85 537 1382 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=248 14 0 720 1000 1000 752.45 620 1008 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=25 22 0 720 1200 1300 760.9 248 1328 25434 0 0
|
||||
GET /api/v1/logs?limit=100&offset=259 14 0 720 1300 1300 780.67 502 1316 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=261 13 0 720 2100 2100 779.93 15 2065 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=269 17 0 720 1100 1100 681.34 9 1102 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=272 16 0 720 1400 1400 838 236 1419 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=290 20 0 720 2100 2100 747.73 129 2057 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=30 20 0 720 1500 1500 752.15 34 1458 22930 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=305 10 0 720 920 920 742.15 625 915 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=341 17 0 720 1300 1300 794.3 6 1329 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=350 16 0 720 1400 1400 702.14 3 1437 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=36 20 0 720 1300 1300 794.6 380 1270 19922 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=37 10 0 720 880 880 742.56 642 880 19476 0 0
|
||||
GET /api/v1/logs?limit=100&offset=379 11 0 720 1200 1200 731.85 41 1209 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=382 13 0 720 1000 1000 753.55 525 1042 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=383 14 0 720 2000 2000 764.67 4 2004 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=385 24 0 720 1600 2300 892.65 192 2301 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=389 17 0 720 1500 1500 764.9 562 1505 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=401 22 0 720 1100 1200 737.11 449 1225 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=420 14 0 720 1300 1300 826.04 619 1273 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=434 16 0 720 1400 1400 770.98 19 1397 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=436 13 0 720 1300 1300 821.05 619 1268 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=44 20 0 720 1400 1400 760.17 116 1381 16072 0 0
|
||||
GET /api/v1/logs?limit=100&offset=503 18 0 720 1300 1300 808.57 501 1252 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=513 14 0 720 1400 1400 857.42 623 1433 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=521 8 0 720 1300 1300 771.68 574 1281 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=536 21 0 720 1400 1400 725.72 117 1437 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=117 13 0 710 1300 1300 769.62 4 1325 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=133 24 0 710 1000 1300 720.42 4 1333 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=147 18 0 710 1200 1200 765.24 559 1197 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=175 19 0 710 1400 1400 763.15 262 1389 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=177 14 0 710 1700 1700 774.96 46 1716 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=188 28 0 710 1100 2200 790.59 209 2156 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=193 10 0 710 1100 1100 770.73 620 1051 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=196 16 0 710 1400 1400 805.47 383 1365 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=245 10 0 710 1600 1600 805.16 612 1615 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=264 15 0 710 1400 1400 667.27 14 1415 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=266 19 0 710 1700 1700 779.84 3 1660 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=273 18 0 710 1400 1400 682.95 2 1373 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=278 12 0 710 1400 1400 802.68 423 1356 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=283 16 0 710 1200 1200 718.02 3 1178 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=29 17 0 710 2000 2000 735.42 32 2035 23394 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=300 11 0 710 1100 1100 787.34 648 1058 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=317 15 0 710 1600 1600 736.67 26 1558 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=346 18 0 710 1200 1200 770.36 429 1236 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=354 11 0 710 840 840 669.13 408 840 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=376 20 0 710 1700 1700 799.79 96 1749 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=4 10 0 710 1000 1000 759.52 449 1047 35535 0 0
|
||||
GET /api/v1/logs?limit=100&offset=412 12 0 710 1300 1300 725.27 3 1301 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=427 12 0 710 1200 1200 717.96 179 1222 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=433 13 0 710 1100 1100 769.18 547 1139 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=439 15 0 710 1200 1200 744.74 356 1203 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=455 22 0 710 1100 1100 748.73 90 1116 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=472 11 0 710 1300 1300 773.88 315 1259 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=473 12 0 710 1400 1400 812.42 4 1389 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=115 10 0 700 1400 1400 716.64 3 1417 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=119 9 0 700 1300 1300 769.59 115 1258 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=141 17 0 700 1300 1300 754.06 43 1305 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=151 11 0 700 1000 1000 732.62 620 1022 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=170 13 0 700 1300 1300 770.55 182 1325 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=235 15 0 700 2100 2100 736.84 5 2058 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=236 9 0 700 1300 1300 740.53 590 1252 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=238 10 0 700 1200 1200 743.26 480 1162 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=241 14 0 700 1000 1000 746.18 296 999 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=276 16 0 700 2100 2100 815.54 468 2133 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=3 18 0 700 1200 1200 749.72 278 1247 36011 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=306 12 0 700 950 950 705.4 416 952 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=338 9 0 700 930 930 649.94 196 930 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=362 15 0 700 1100 1100 748.51 554 1093 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=373 22 0 700 1300 1400 755.85 75 1382 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=377 16 0 700 1100 1100 658.62 2 1145 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=393 10 0 700 1200 1200 757.34 138 1168 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=40 19 0 700 1000 1000 694.3 157 995 18066 0 0
|
||||
GET /api/v1/logs?limit=100&offset=413 16 0 700 2100 2100 814.31 143 2096 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=424 18 0 700 1400 1400 696.57 34 1417 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=463 12 0 700 2200 2200 905.97 428 2202 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=467 14 0 700 1300 1300 771.09 168 1288 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=490 20 0 700 1500 1500 764.74 4 1524 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=493 13 0 700 1400 1400 829.09 612 1428 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=51 13 0 700 1300 1300 764.16 111 1306 11776 0 0
|
||||
GET /api/v1/logs?limit=100&offset=531 19 0 700 1000 1000 662.33 140 995 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=10 18 0 690 1300 1300 736.48 102 1340 32640 0 0
|
||||
GET /api/v1/logs?limit=100&offset=105 9 0 690 990 990 664.78 48 987 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=128 12 0 690 1300 1300 758.36 51 1253 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=135 16 0 690 1000 1000 692.74 288 999 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=226 18 0 690 1400 1400 774.89 428 1352 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=27 18 0 690 1200 1200 745.33 245 1189 24524 0 0
|
||||
GET /api/v1/logs?limit=100&offset=28 12 0 690 1300 1300 710.65 301 1289 23832 0 0
|
||||
GET /api/v1/logs?limit=100&offset=358 15 0 690 1200 1200 661.35 13 1198 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=374 7 0 690 1100 1100 739.4 571 1146 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=397 22 0 690 1200 1600 735.19 2 1642 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=407 14 0 690 970 970 665.8 133 970 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=448 13 0 690 1700 1700 728.16 30 1725 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=498 18 0 690 1200 1200 711.08 4 1190 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=501 18 0 690 1300 1300 691.48 94 1253 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=527 16 0 690 1600 1600 736.21 2 1639 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=189 12 0 680 1300 1300 759.26 590 1309 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=21 14 0 680 910 910 647.64 175 912 27266 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=219 21 0 680 1000 1200 720.05 473 1169 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=326 9 0 680 1000 1000 693.17 244 1017 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=144 14 0 670 1600 1600 655.38 5 1635 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=299 14 0 670 1300 1300 731.83 3 1323 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=370 15 0 670 1500 1500 748.15 449 1547 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=430 16 0 670 1100 1100 724.6 470 1132 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=481 15 0 670 1300 1300 672.68 4 1253 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=495 14 0 670 1700 1700 742.16 8 1743 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=111 10 0 660 1000 1000 657.28 182 1030 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=361 12 0 660 960 960 715.09 581 963 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=456 17 0 660 890 890 665.29 208 895 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=507 11 0 660 1200 1200 739.82 290 1164 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=152 12 0 650 1400 1400 699.67 4 1369 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=474 14 0 650 1100 1100 680.01 5 1141 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=538 15 0 650 1900 1900 807.05 103 1933 47 0.4 0
|
||||
GET /api/v1/logs?limit=100&offset=129 18 0 640 1400 1400 751.36 44 1363 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=194 16 0 640 1400 1400 612.87 2 1415 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=32 8 0 500 1600 1600 726.31 10 1648 21756 0 0
|
||||
POST /api/v1/auth/change-password 15 0 480 730 730 488.02 358 734 43 0 0
|
||||
POST /api/v1/auth/login [on_start] 515 0 280 560 780 302.83 169 1274 258.97 0 0
|
||||
POST /api/v1/auth/login 7878 0 170 670 850 235.32 159 1235 259 25 0
|
||||
GET /api/v1/health 11872 0 6 680 910 172.54 1 1453 337 42.5 0
|
||||
GET /api/v1/config 11826 0 4 780 1500 179.57 1 3341 214 43.8 0
|
||||
GET /api/v1/bounty 23570 0 2 980 1400 141.98 1 2240 43 82.5 0
|
||||
GET /api/v1/deckies 27379 0 2 20 420 15.89 1 787 2 97.9 0
|
||||
GET /api/v1/logs/histogram 19933 0 2 460 710 60.98 1 1591 125 72 0
|
||||
Aggregated 259381 0 300 1600 2200 514.41 1 5086 3401.12 934.3 0
|
||||
|
502
development/profiles/profile_fb69a06.csv
Normal file
502
development/profiles/profile_fb69a06.csv
Normal file
@@ -0,0 +1,502 @@
|
||||
Type Name # Requests # Fails Median (ms) 95%ile (ms) 99%ile (ms) Average (ms) Min (ms) Max (ms) Average size (bytes) Current RPS Current Failures/s
|
||||
GET /api/v1/attackers 48191 0 570 2200 3000 739.61 1 6542 43 115 0
|
||||
GET /api/v1/attackers?search=brute&sort_by=recent 24202 0 830 2600 3600 1044.41 2 8278 43 55.9 0
|
||||
POST /api/v1/auth/login 12059 0 200 630 1200 259.93 158 1879 259 31.8 0
|
||||
POST /api/v1/auth/login [on_start] 500 0 350 510 730 355.14 173 779 259 0 0
|
||||
GET /api/v1/bounty 35557 0 19 1400 2100 198.44 1 4174 43 88.7 0
|
||||
GET /api/v1/config 18117 0 21 1400 2400 261.69 0 4070 214 45.7 0
|
||||
GET /api/v1/deckies 41959 0 17 99 1100 46.8 0 2799 2 107 0
|
||||
GET /api/v1/health 18070 0 23 1200 2000 257.8 1 4003 337 41.9 0
|
||||
GET /api/v1/logs/histogram 30006 0 18 720 1500 99.73 1 3754 125 78 0
|
||||
GET /api/v1/logs?limit=100&offset=0 22 0 630 1700 1800 721.72 62 1764 37830 0 0
|
||||
GET /api/v1/logs?limit=100&offset=1 27 0 650 1900 2000 698.98 94 1999 36893 0 0
|
||||
GET /api/v1/logs?limit=100&offset=10 25 0 650 1800 2000 727.14 89 2006 32590 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=100 23 0 810 2300 2300 894.34 70 2319 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=1000 25 0 550 2600 2900 670.12 52 2922 48 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=101 26 0 380 1900 2000 623.95 3 2031 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=102 29 0 360 1200 1200 429.63 59 1212 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=103 28 0 710 1800 2300 790.97 69 2268 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=104 26 0 470 2100 3600 690.65 47 3590 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=105 28 0 480 2200 2700 625.15 54 2684 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=106 28 0 440 1800 2400 651.98 64 2383 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=107 24 0 180 1300 1400 473.04 77 1440 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=108 16 0 260 2000 2000 624.7 34 2047 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=109 27 0 660 2300 2700 806.39 72 2732 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=11 35 0 720 2600 2700 882.06 56 2683 32152 0 0
|
||||
GET /api/v1/logs?limit=100&offset=110 20 0 580 1900 1900 759.73 83 1944 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=111 29 0 410 2900 3400 736.75 89 3419 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=112 18 0 180 2100 2100 644.34 39 2103 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=113 27 0 370 1500 2200 543.09 55 2170 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=114 25 0 1000 2100 2500 961.38 56 2499 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=115 14 0 680 1600 1600 728.02 60 1570 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=116 20 0 480 2600 2600 800.78 55 2561 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=117 26 0 440 1800 2500 737.81 1 2486 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=118 21 0 660 1300 1800 626.15 80 1776 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=119 26 0 470 1400 2800 609.91 72 2754 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=12 19 0 720 2500 2500 903.49 68 2520 31688 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=120 24 0 570 1900 2500 712.75 70 2454 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=121 30 0 480 1900 2200 703.84 19 2241 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=122 20 0 590 1800 1800 777.57 74 1841 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=123 15 0 220 1500 1500 414.47 63 1527 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=124 20 0 180 1800 1800 441.89 67 1839 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=125 27 0 510 2100 2100 688.32 58 2104 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=126 36 0 390 2200 2900 635.21 70 2873 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=127 19 0 360 2000 2000 556.54 70 1978 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=128 32 0 560 2200 2500 710.74 69 2476 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=129 21 0 700 2300 2500 846.76 68 2486 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=13 17 0 160 1700 1700 338.12 21 1685 30974 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=130 28 0 560 2300 2700 805 74 2701 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=131 21 0 790 2300 4000 1038.2 73 4001 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=132 27 0 620 1400 1900 660.71 6 1873 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=133 25 0 590 2400 3200 785.19 65 3227 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=134 27 0 610 2200 2600 762.08 76 2614 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=135 26 0 600 1400 2400 702.5 71 2408 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=136 19 0 520 2600 2600 691.82 68 2641 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=137 27 0 300 1800 2200 608.69 68 2153 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=138 13 0 660 1600 1600 645.01 73 1605 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=139 19 0 680 2800 2800 1011.56 74 2835 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=14 26 0 170 1200 1300 369.03 50 1320 30514 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=140 25 0 620 1900 2400 752.61 77 2363 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=141 29 0 1100 2600 2700 1133.25 92 2731 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=142 24 0 740 2100 2900 909.54 55 2947 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=143 32 0 430 1600 1800 503.86 23 1788 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=144 24 0 280 2000 2500 558.5 2 2506 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=145 27 0 580 2200 3200 811.39 56 3174 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=146 21 0 500 1900 2000 617.08 47 2026 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=147 30 0 530 2100 2500 748.15 72 2539 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=148 28 0 530 2000 2700 745.41 60 2744 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=149 22 0 660 1700 1700 758.4 17 1730 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=15 18 0 550 4800 4800 908.44 70 4760 30054 0 0
|
||||
GET /api/v1/logs?limit=100&offset=150 18 0 540 2100 2100 773 62 2092 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=151 21 0 690 1900 1900 871.45 91 1945 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=152 22 0 720 2100 2700 828.42 49 2726 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=153 26 0 290 2000 2300 634.31 15 2317 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=154 21 0 170 1900 2100 575.34 63 2098 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=155 25 0 1100 2000 2300 952.52 67 2333 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=156 17 0 760 2700 2700 833.75 4 2715 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=157 24 0 200 1300 2300 504.04 78 2299 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=158 26 0 680 2600 2700 1013.94 66 2702 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=159 26 0 520 2200 2800 753.62 23 2832 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=16 20 0 660 3300 3300 852.71 95 3315 29590 0 0
|
||||
GET /api/v1/logs?limit=100&offset=160 23 0 560 1200 1500 546.34 58 1546 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=161 35 0 500 2300 4300 794.54 68 4345 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=162 28 0 450 1600 2200 662.43 70 2250 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=163 22 0 500 1600 2200 626.01 75 2164 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=164 17 0 93 1700 1700 367.3 60 1675 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=165 16 0 690 2800 2800 973.88 84 2845 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=166 25 0 410 2600 3000 607.89 4 2982 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=167 29 0 680 2100 3500 817.42 4 3514 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=168 23 0 590 2200 2300 759.36 48 2252 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=169 20 0 220 2600 2600 488.82 62 2588 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=17 21 0 530 1200 1500 589 54 1530 29144 0 0
|
||||
GET /api/v1/logs?limit=100&offset=170 15 0 650 2200 2200 671.54 69 2151 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=171 19 0 460 2100 2100 563.1 73 2053 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=172 22 0 470 1700 2000 681.55 73 2019 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=173 24 0 610 2500 2700 929.15 51 2686 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=174 14 0 510 1500 1500 617.6 95 1503 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=175 26 0 270 1600 1600 542.31 65 1621 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=176 18 0 840 3400 3400 1192.21 73 3413 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=177 17 0 400 1400 1400 457.18 68 1382 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=178 25 0 470 1500 2300 579.4 52 2266 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=179 24 0 610 2400 2600 806.13 26 2552 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=18 21 0 460 1800 2100 657.78 15 2098 28680 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=180 30 0 310 2800 3000 661.32 60 3030 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=181 28 0 360 2800 3200 703.44 45 3239 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=182 25 0 660 1900 2100 849.42 68 2090 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=183 26 0 640 2800 5200 938.31 78 5161 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=184 23 0 380 1600 3100 620.29 56 3064 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=185 23 0 410 1700 2200 631.18 77 2188 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=186 29 0 220 3100 3200 766 44 3186 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=187 14 0 740 2200 2200 1051.48 238 2215 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=188 22 0 100 1600 1700 499.12 2 1721 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=189 19 0 660 4000 4000 999.45 61 4038 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=19 28 0 260 2000 2600 607.07 64 2564 28234 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=190 26 0 600 1700 1900 790.14 73 1927 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=191 26 0 710 2200 2300 912.77 70 2335 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=192 23 0 350 2100 3000 671.59 20 3006 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=193 32 0 630 2700 3000 893.68 5 2994 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=194 15 0 630 3100 3100 815.23 74 3059 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=195 36 0 600 1400 3500 691.69 65 3507 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=196 18 0 880 2300 2300 932.14 73 2344 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=197 22 0 580 1100 1600 613.06 27 1571 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=198 32 0 540 2300 2600 653.89 49 2567 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=199 19 0 1000 2600 2600 1019.55 67 2573 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=2 12 0 290 1400 1400 496.43 86 1350 36489 0 0
|
||||
GET /api/v1/logs?limit=100&offset=20 26 0 700 1900 1900 738.8 60 1922 27784 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=200 23 0 180 1900 2100 539.87 39 2091 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=201 21 0 420 1500 3100 632.65 45 3063 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=202 21 0 540 2100 2900 801.47 63 2879 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=203 22 0 400 1100 1800 434.15 2 1813 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=204 26 0 850 2600 3900 1040.79 81 3880 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=205 26 0 890 2200 3000 940.18 63 3044 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=206 31 0 470 1300 1500 575.42 82 1535 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=207 14 0 350 2000 2000 618.59 84 2025 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=208 27 0 530 1700 2000 665.73 72 2003 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=209 31 0 710 2000 3200 828.14 83 3174 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=21 29 0 670 2100 2700 799 74 2667 27290 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=210 20 0 570 2000 2000 719.13 81 1965 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=211 21 0 600 2500 2800 777.88 79 2768 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=212 37 0 440 2400 3400 595.68 12 3386 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=213 26 0 610 2000 2400 668.34 41 2389 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=214 27 0 420 1300 2700 567.43 55 2684 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=215 20 0 530 3800 3800 832.94 96 3786 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=216 27 0 560 2100 2500 673.31 61 2483 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=217 20 0 150 1700 1700 525.15 52 1703 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=218 22 0 550 2400 2500 903.57 2 2472 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=219 22 0 600 2700 3600 915.47 50 3640 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=22 25 0 380 1800 1900 588.31 2 1900 26810 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=220 25 0 410 1600 2400 572.07 2 2415 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=221 30 0 620 1700 1800 650.73 29 1811 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=222 30 0 350 2100 2800 706.81 69 2793 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=223 30 0 570 2600 3000 789.07 54 3049 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=224 33 0 630 2100 3300 795.37 43 3304 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=225 17 0 620 2300 2300 791.8 85 2317 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=226 26 0 320 1800 1800 513.12 12 1810 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=227 24 0 600 2500 3000 961.87 39 2954 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=228 20 0 470 2900 2900 755.63 76 2921 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=229 21 0 450 2300 2500 747.67 70 2485 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=23 25 0 730 2600 2700 988.45 56 2663 26332 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=230 25 0 600 1800 3100 734.24 49 3091 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=231 22 0 570 1300 2100 674.81 69 2138 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=232 21 0 610 1900 2700 790.54 76 2679 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=233 29 0 360 1800 2100 537.3 70 2078 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=234 25 0 730 3000 3100 1078.55 82 3097 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=235 17 0 160 3900 3900 922.26 35 3856 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=236 21 0 630 1900 2400 764.04 90 2424 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=237 19 0 360 3300 3300 650.19 66 3292 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=238 24 0 590 2000 2200 722.51 66 2178 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=239 20 0 550 2400 2400 705.15 41 2396 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=24 30 0 470 1800 2100 567.09 54 2072 25856 0 0
|
||||
GET /api/v1/logs?limit=100&offset=240 29 0 570 2100 2300 606.59 16 2254 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=241 26 0 660 1600 2500 810.28 52 2538 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=242 23 0 650 3000 4600 978.82 61 4610 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=243 28 0 500 2400 2700 755.24 52 2740 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=244 31 0 620 2000 2100 730.22 1 2136 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=245 32 0 550 2300 3100 705.18 56 3100 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=246 22 0 530 1300 1600 612.35 84 1588 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=247 24 0 260 2300 2800 624.06 2 2821 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=248 28 0 590 1300 2200 597.05 66 2175 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=249 16 0 240 2300 2300 554.59 24 2309 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=25 28 0 180 2400 3100 520.47 64 3089 25329 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=250 24 0 520 1500 4400 738.35 45 4384 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=251 21 0 670 1700 2400 803.16 81 2417 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=252 27 0 560 2000 3300 765.53 2 3279 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=253 13 0 590 1500 1500 623.97 82 1550 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=254 24 0 380 1300 1800 561.89 56 1811 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=255 19 0 660 2700 2700 830.85 103 2652 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=256 20 0 960 2200 2200 974.71 74 2186 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=257 24 0 460 2100 2200 709.84 105 2238 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=258 21 0 150 1400 2600 552.7 53 2631 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=259 23 0 620 2200 3800 841.79 53 3825 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=26 29 0 780 2400 2900 1063.63 98 2940 24880 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=260 28 0 480 2000 2800 661.18 69 2834 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=261 16 0 140 2200 2200 595.3 42 2183 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=262 28 0 630 2900 3100 954.33 66 3108 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=263 30 0 600 1700 1900 665.32 64 1899 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=264 24 0 190 1900 1900 568.88 65 1932 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=265 21 0 510 1800 2900 768.81 54 2850 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=266 28 0 530 1200 1300 529.9 65 1337 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=267 20 0 720 1900 1900 862.9 57 1859 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=268 31 0 470 2100 2600 738.65 51 2557 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=269 27 0 860 2400 3500 973.26 37 3466 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=27 23 0 620 1900 1900 695.73 69 1948 24402 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=270 26 0 570 2800 2800 754.5 79 2848 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=271 24 0 580 1800 2000 695.09 75 1981 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=272 24 0 590 1900 2500 691.89 68 2549 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=273 24 0 510 1800 2800 616.68 47 2782 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=274 17 0 570 1200 1200 490.12 53 1231 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=275 21 0 460 1400 1800 565.61 4 1809 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=276 27 0 570 2100 2200 752.02 71 2182 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=277 19 0 670 2800 2800 934.32 69 2812 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=278 23 0 280 1700 1800 562.7 42 1813 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=279 29 0 700 1600 1600 755.72 92 1629 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=28 14 0 550 1200 1200 463.28 87 1159 23918 0 0
|
||||
GET /api/v1/logs?limit=100&offset=280 29 0 450 2000 3200 632.05 17 3163 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=281 21 0 470 2700 2900 925 5 2861 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=282 12 0 460 3400 3400 780.27 58 3412 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=283 23 0 590 1500 2000 571.04 12 1960 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=284 11 0 580 1300 1300 679.26 87 1332 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=285 26 0 610 1900 3000 746.27 58 3043 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=286 20 0 580 2000 2000 845.37 83 2033 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=287 18 0 300 2800 2800 754.4 49 2818 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=288 27 0 370 2100 2700 691.64 59 2739 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=289 23 0 280 1700 1700 537.89 29 1711 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=29 23 0 630 2000 2300 845.78 56 2324 23438 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=290 27 0 570 2700 5100 898.81 69 5058 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=291 31 0 840 2800 3700 1032.33 63 3666 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=292 21 0 620 2900 3600 793.41 70 3643 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=293 25 0 450 1800 3600 751.4 54 3631 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=294 20 0 460 1400 1400 538.76 67 1354 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=295 18 0 170 740 740 287.58 1 739 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=296 25 0 270 1200 2500 490.93 66 2544 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=297 18 0 150 3000 3000 746.98 81 2993 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=298 22 0 570 1900 3500 745.63 70 3469 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=299 28 0 610 2000 2100 724.88 2 2132 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=3 19 0 670 4500 4500 1117.25 102 4488 36031 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=30 17 0 710 3000 3000 1069.86 64 3036 22960 0 0
|
||||
GET /api/v1/logs?limit=100&offset=300 29 0 430 2200 3100 661.66 59 3131 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=301 17 0 420 3600 3600 907.29 73 3583 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=302 21 0 740 2500 2600 1097.97 151 2597 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=303 20 0 510 1900 1900 587.07 78 1935 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=304 30 0 610 1900 2500 881.4 71 2505 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=305 25 0 830 2200 2500 980.95 84 2533 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=306 17 0 420 3100 3100 829.4 2 3096 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=307 18 0 570 2100 2100 709.17 62 2083 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=308 26 0 190 2400 2900 682.5 73 2872 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=309 23 0 950 2200 2900 1032.76 63 2872 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=31 27 0 600 2600 3100 843.76 9 3150 22476 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=310 18 0 1100 2100 2100 893.18 50 2051 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=311 18 0 560 2500 2500 689.12 77 2493 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=312 20 0 540 2400 2400 682.2 53 2391 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=313 11 0 360 1300 1300 485.36 88 1302 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=314 23 0 410 1800 2300 732.56 55 2330 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=315 26 0 530 1600 2600 570.04 68 2628 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=316 27 0 660 2600 2600 760.73 71 2585 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=317 30 0 430 1900 1900 591.68 2 1905 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=318 28 0 390 2300 2400 599.64 24 2399 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=319 20 0 650 3300 3300 744.32 54 3266 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=32 24 0 340 1600 2000 550.75 11 2021 22018 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=320 22 0 730 2400 2600 967.45 7 2550 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=321 16 0 580 2400 2400 820.73 71 2362 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=322 25 0 580 1700 2000 707.75 65 2019 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=323 25 0 610 2400 2600 843.25 61 2625 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=324 19 0 640 1800 1800 661.88 83 1794 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=325 19 0 460 2500 2500 648.27 58 2532 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=326 20 0 530 2400 2400 678.58 57 2383 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=327 20 0 89 3200 3200 526.29 47 3198 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=328 25 0 710 1700 2900 771.85 49 2853 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=329 28 0 540 1300 1400 571.22 52 1383 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=33 21 0 760 2000 2700 900.3 65 2711 21490 0 0
|
||||
GET /api/v1/logs?limit=100&offset=330 29 0 220 2300 3900 732.38 50 3868 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=331 34 0 550 1600 1700 695.42 57 1653 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=332 22 0 170 1600 1700 482.67 54 1661 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=333 37 0 700 2200 2600 832.77 57 2586 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=334 26 0 580 1900 1900 700.07 2 1945 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=335 22 0 700 2100 2500 779.17 8 2504 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=336 25 0 680 1800 1800 761.7 57 1821 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=337 18 0 400 2600 2600 735.02 80 2593 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=338 27 0 750 2000 2200 795.12 54 2219 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=339 22 0 350 1200 1300 477.09 3 1334 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=34 18 0 630 2300 2300 747.79 73 2267 21038 0 0
|
||||
GET /api/v1/logs?limit=100&offset=340 28 0 480 1600 2800 687.88 76 2850 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=341 23 0 650 1900 2400 797.9 54 2362 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=342 21 0 460 1800 2300 587.82 61 2274 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=343 16 0 300 3300 3300 663.81 64 3276 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=344 16 0 220 2000 2000 643.71 66 1967 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=345 22 0 300 3100 3700 797.95 63 3746 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=346 16 0 670 2000 2000 763.27 60 2036 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=347 18 0 600 1400 1400 673.54 106 1444 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=348 28 0 830 2800 3000 1148.44 74 2971 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=349 18 0 650 2800 2800 912.05 53 2778 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=35 31 0 460 2500 2500 734.63 77 2544 20488 0 0
|
||||
GET /api/v1/logs?limit=100&offset=350 28 0 610 2400 2400 761.86 76 2378 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=351 16 0 640 3200 3200 977.6 69 3205 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=352 31 0 480 1700 1800 605.78 57 1844 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=353 18 0 350 2200 2200 714.46 3 2194 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=354 24 0 670 2500 2900 849.57 73 2852 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=355 19 0 280 2700 2700 607.43 80 2743 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=356 21 0 510 1200 1800 516.18 69 1757 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=357 21 0 560 1900 2000 779.66 60 2042 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=358 18 0 690 3500 3500 921.56 58 3479 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=359 20 0 300 2100 2100 622.74 69 2122 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=36 27 0 590 1500 1700 743.98 5 1678 20002 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=360 37 0 470 3000 3300 682.76 70 3345 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=361 21 0 410 1300 2100 519.29 73 2056 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=362 19 0 550 2800 2800 857.31 65 2759 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=363 23 0 340 1800 1800 573.73 78 1841 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=364 21 0 510 1700 2800 647.84 2 2779 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=365 31 0 510 2900 3600 860.97 28 3641 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=366 25 0 520 2400 3200 635.18 44 3203 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=367 29 0 590 1700 1800 801.29 72 1756 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=368 27 0 450 1800 1900 610.94 53 1893 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=369 19 0 420 1300 1300 525.08 46 1331 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=37 19 0 600 2500 2500 776.6 55 2493 19552 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=370 19 0 250 2800 2800 547.38 5 2775 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=371 24 0 510 2900 3200 952.74 46 3165 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=372 23 0 510 1800 2000 616.18 49 1971 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=373 22 0 340 2300 2300 711.66 63 2339 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=374 25 0 710 2500 2900 851.88 60 2921 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=375 38 0 600 2700 2900 834.15 70 2902 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=376 28 0 590 2300 2500 765.29 39 2545 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=377 19 0 800 2700 2700 865.91 62 2693 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=378 24 0 620 2000 2300 748.89 28 2278 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=379 21 0 400 1900 2400 595.78 67 2399 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=38 16 0 410 1900 1900 624.81 54 1865 19010 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=380 26 0 380 2000 2200 620.53 57 2154 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=381 11 0 580 1300 1300 702.77 85 1336 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=382 24 0 530 2900 4000 911.44 79 3971 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=383 22 0 560 2400 3000 745.29 65 3003 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=384 21 0 660 2400 3000 937.27 58 3021 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=385 22 0 380 2300 2700 706.47 75 2721 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=386 23 0 460 2000 3200 652.56 13 3160 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=387 28 0 550 1800 2500 623.32 45 2506 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=388 23 0 530 1700 2200 614.55 4 2169 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=389 24 0 580 2500 3000 880.63 45 2961 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=39 21 0 610 3000 3500 855.97 50 3489 18526 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=390 31 0 590 1800 2100 657.48 75 2135 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=391 21 0 430 2200 2400 657.01 89 2413 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=392 26 0 430 1500 2700 585.91 62 2712 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=393 17 0 570 2200 2200 767.89 65 2225 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=394 13 0 360 1000 1000 410.33 29 1050 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=395 22 0 190 1800 3100 663.33 1 3083 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=396 26 0 710 2600 2700 934.59 88 2703 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=397 18 0 830 2400 2400 858.71 77 2373 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=398 23 0 380 1700 1900 627.43 3 1919 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=399 16 0 520 2400 2400 717.73 67 2375 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=4 23 0 270 1500 3100 599.31 64 3066 35565 0 0
|
||||
GET /api/v1/logs?limit=100&offset=40 29 0 570 1600 2400 588.1 2 2426 18066 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=400 26 0 630 1700 2000 737.8 62 2037 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=401 25 0 570 1500 2100 555.91 3 2085 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=402 30 0 500 1500 2300 600.67 62 2284 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=403 14 0 550 2200 2200 772.79 75 2244 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=404 24 0 630 2100 3900 798.93 68 3860 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=405 25 0 600 1600 1600 680.52 8 1641 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=406 24 0 490 2300 2300 690.71 68 2283 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=407 27 0 350 1800 2300 582.47 69 2284 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=408 24 0 250 1500 2000 543.97 62 1969 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=409 22 0 580 1900 2400 712.26 69 2362 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=41 17 0 660 1600 1600 588.26 64 1613 17564 0 0
|
||||
GET /api/v1/logs?limit=100&offset=410 23 0 620 1500 2500 689.46 59 2468 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=411 20 0 470 1800 1800 564.3 63 1769 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=412 23 0 460 1900 3000 770.25 99 2954 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=413 27 0 430 1700 1900 570.44 91 1853 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=414 27 0 150 2300 2800 648.13 54 2829 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=415 20 0 570 2200 2200 655.67 76 2215 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=416 31 0 500 2500 2500 775.26 85 2508 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=417 18 0 120 2000 2000 410.12 74 1969 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=418 22 0 310 1700 1800 616.76 69 1798 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=419 20 0 610 3600 3600 1077.31 80 3639 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=42 24 0 480 1900 3000 718.97 63 3037 17048 0 0
|
||||
GET /api/v1/logs?limit=100&offset=420 21 0 480 1600 2800 698.87 67 2815 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=421 21 0 640 1800 2200 810.13 25 2249 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=422 24 0 610 2400 3600 902.74 65 3576 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=423 26 0 600 2500 3200 762.07 89 3161 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=424 23 0 600 1400 1800 621.14 3 1758 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=425 30 0 620 1700 2300 656.84 50 2292 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=426 28 0 430 1600 1900 648.14 71 1933 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=427 19 0 140 2500 2500 477.94 53 2538 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=428 20 0 390 1900 1900 562.71 48 1860 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=429 25 0 550 2600 3600 888.01 4 3571 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=43 24 0 190 2400 2500 648.27 17 2547 16524 0 0
|
||||
GET /api/v1/logs?limit=100&offset=430 24 0 480 1400 3400 576.39 99 3402 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=431 31 0 650 2100 2500 746.92 34 2453 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=432 29 0 670 2100 3000 847.43 52 2959 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=433 22 0 560 2100 3100 769.87 104 3112 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=434 24 0 550 1500 3500 747.44 52 3520 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=435 16 0 580 2900 2900 1098.62 81 2927 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=436 27 0 870 2400 3700 1058.98 62 3722 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=437 22 0 630 1900 2200 734.34 65 2193 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=438 27 0 580 2400 2400 730.09 55 2368 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=439 22 0 160 1300 2200 552.4 63 2196 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=44 17 0 430 1200 1200 442.45 4 1181 16030 0 0
|
||||
GET /api/v1/logs?limit=100&offset=440 21 0 530 2100 3700 833.39 77 3693 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=441 22 0 490 2000 2400 664.2 72 2441 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=442 23 0 270 3100 4200 739.36 70 4199 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=443 17 0 670 2400 2400 789.12 65 2422 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=444 23 0 580 1900 3000 702.13 66 3024 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=445 22 0 560 2800 3400 916.02 2 3441 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=446 19 0 700 2200 2200 795.55 78 2167 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=447 19 0 570 3700 3700 790.77 38 3655 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=448 12 0 460 2600 2600 625.97 64 2557 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=449 22 0 680 1700 2800 890.06 52 2821 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=45 34 0 430 1800 3000 615.17 62 2979 15522 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=450 25 0 370 1500 1600 514.91 48 1558 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=451 19 0 580 2000 2000 595.94 70 2016 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=452 27 0 660 2200 2400 793.5 72 2382 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=453 24 0 570 1300 2100 661.39 44 2070 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=454 18 0 600 1600 1600 702.4 67 1628 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=455 23 0 790 1500 2000 746.43 67 1966 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=456 17 0 270 1200 1200 439.63 65 1208 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=457 27 0 650 1900 2100 778.02 43 2076 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=458 19 0 190 2000 2000 464.53 71 2023 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=459 23 0 550 1900 2000 635.27 83 1972 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=46 26 0 540 1900 1900 600.19 67 1943 15077 0 0
|
||||
GET /api/v1/logs?limit=100&offset=460 24 0 530 1800 2000 667.52 63 2047 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=461 28 0 640 2100 2400 803.34 56 2361 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=462 30 0 500 1800 3100 616.65 68 3069 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=463 22 0 580 2000 3400 795.06 76 3364 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=464 18 0 470 1600 1600 692.57 90 1570 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=465 28 0 640 2300 3700 848.79 49 3737 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=466 24 0 800 1600 2300 848.2 77 2297 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=467 28 0 390 2500 4100 689.81 3 4121 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=468 30 0 750 2100 2400 929.98 69 2388 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=469 29 0 710 2400 4100 872.26 51 4064 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=47 29 0 190 1900 2100 534.25 45 2053 14597 0 0
|
||||
GET /api/v1/logs?limit=100&offset=470 22 0 320 2300 2400 678.42 52 2385 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=471 25 0 590 2200 2200 805.97 2 2234 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=472 31 0 820 2000 2400 895.95 88 2352 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=473 24 0 340 1600 3700 671.48 66 3730 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=474 27 0 600 2700 3600 847.68 77 3650 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=475 20 0 420 2400 2400 574.97 52 2360 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=476 24 0 610 1700 4400 810.38 59 4374 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=477 28 0 540 2900 3100 844.04 76 3055 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=478 22 0 720 1600 1700 760.7 96 1653 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=479 23 0 570 2400 2800 896.23 67 2775 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=48 22 0 940 1800 3200 949.98 4 3165 13947 0 0
|
||||
GET /api/v1/logs?limit=100&offset=480 28 0 640 1500 1900 721.04 62 1935 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=481 27 0 540 1600 2700 713.37 51 2720 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=482 22 0 600 1200 1200 625.94 65 1240 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=483 28 0 600 2400 2700 803.01 61 2694 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=484 32 0 580 2300 2300 738.84 8 2330 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=485 30 0 760 2200 3200 865.18 40 3209 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=486 27 0 160 2600 3700 523.26 66 3710 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=487 21 0 200 2300 3600 741.54 64 3586 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=488 26 0 410 1500 2000 557.74 73 2008 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=489 27 0 610 2900 6200 935.87 65 6195 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=49 23 0 510 1700 1900 607.14 68 1916 13281 0 0
|
||||
GET /api/v1/logs?limit=100&offset=490 24 0 680 1600 2100 675.5 86 2088 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=491 21 0 430 1600 2100 555.53 68 2124 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=492 19 0 490 2400 2400 554.48 67 2409 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=493 28 0 610 2700 3100 881.96 65 3059 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=494 23 0 620 2400 2400 720.31 49 2373 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=495 21 0 200 2200 2400 704.4 4 2445 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=496 18 0 180 3300 3300 780.6 75 3260 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=497 16 0 610 3000 3000 853.95 104 2966 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=498 28 0 440 2200 3100 667.48 13 3096 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=499 22 0 720 2200 2300 1035.58 96 2295 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=5 23 0 550 2500 2700 695.68 73 2750 35107 0 0
|
||||
GET /api/v1/logs?limit=100&offset=50 32 0 930 2700 2700 1009.47 61 2721 12641 0 0
|
||||
GET /api/v1/logs?limit=100&offset=500 19 0 650 2300 2300 731.45 85 2331 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=501 22 0 650 1700 2300 755.9 71 2274 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=502 28 0 610 1600 1700 671.53 84 1719 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=503 22 0 790 2100 2600 1041.46 89 2634 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=504 17 0 400 2500 2500 582.83 62 2458 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=505 23 0 270 2300 2600 593.92 67 2640 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=506 14 0 680 1900 1900 881.65 94 1866 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=507 26 0 540 2200 3700 947.56 80 3731 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=508 26 0 570 1600 1700 643.8 52 1672 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=509 32 0 480 1900 2600 632.11 36 2601 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=51 32 0 540 2100 2200 655.81 76 2205 12015 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=510 21 0 520 2600 3100 813.98 81 3125 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=511 25 0 640 2100 2900 813.99 67 2872 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=512 22 0 680 2400 2800 882.51 59 2798 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=513 19 0 540 3900 3900 756.29 75 3925 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=514 20 0 260 1500 1500 516.15 6 1457 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=515 25 0 670 2400 2600 911.1 3 2625 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=516 25 0 920 2000 2400 941.87 78 2352 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=517 27 0 380 2500 2800 719.3 49 2822 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=518 21 0 660 2600 4300 1022.6 62 4286 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=519 28 0 550 2500 3100 764.76 67 3104 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=52 29 0 460 1900 2900 650.22 62 2889 11275 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=520 21 0 660 2000 2500 791.04 10 2489 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=521 36 0 680 2300 2500 911.45 80 2476 47 0.3 0
|
||||
GET /api/v1/logs?limit=100&offset=522 19 0 800 4200 4200 1083.6 92 4205 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=523 28 0 1100 2300 2800 1219.95 71 2795 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=524 33 0 230 2000 2100 550.18 58 2134 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=525 22 0 560 2300 4300 763.51 52 4257 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=526 19 0 590 2100 2100 657.3 65 2122 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=527 18 0 470 2800 2800 812.23 16 2808 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=528 22 0 430 3000 3000 795.78 59 3005 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=529 19 0 540 2700 2700 718.65 70 2666 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=53 27 0 150 1400 1500 397.19 70 1484 10823 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=530 30 0 390 2100 2300 700.18 81 2257 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=531 20 0 600 3700 3700 783.47 92 3683 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=532 33 0 680 2400 2700 866.73 55 2665 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=533 29 0 710 1800 2100 774.3 45 2070 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=534 26 0 160 2500 2800 599.27 6 2761 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=535 30 0 570 1900 2700 721.27 55 2689 47 0.1 0
|
||||
GET /api/v1/logs?limit=100&offset=536 31 0 500 2300 2600 760.54 5 2564 47 0.2 0
|
||||
GET /api/v1/logs?limit=100&offset=537 19 0 480 1600 1600 618.41 53 1578 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=538 14 0 180 1400 1400 378.18 74 1409 47 0 0
|
||||
GET /api/v1/logs?limit=100&offset=539 24 0 530 2200 2300 644.69 51 2320 47 0.1 0
|
||||
Aggregated 396672 0 100 1900 2900 465.03 0 8278 3356.54 963.6 0
|
||||
|
Reference in New Issue
Block a user