Skip to content

Activity & Telemetry

tunlx records what's happening across every proxy in real time. The Activity & Telemetry modal in the dashboard is the live view; the same data is available over HTTP for scripting and dashboards.

Activity and telemetry

What you can see

Bandwidth Per-proxy totals, current bytes-per-second, and short-interval deltas. Counters flush at 64KB so even low-bandwidth streams report quickly.

User activity log The last 200 events that match your configured audit policies — Xtream API calls, playlist fetches, and stream playback.

Non-proxy logs Live tail of EPG, MediaFlow bridge, Xtream helpers, and background workers — handy when stream issues don't show up on the proxy itself.

Outbound IP probe VPN-aware and non-VPN-aware checks shown side-by-side so you can see what each route mode actually resolves to.

User activity policies

Policies tell tunlx which calls to record. They keep the log focused instead of drowning in routine traffic.

{
  "verboseUserActivityLogging": true,
  "userActivityPolicies": [
    {
      "proxy": "exampleProxy1",
      "username": "*",
      "actions": ["player_api:account", "stream:live"]
    },
    {
      "proxy": "favorites",
      "proxyType": "composite",
      "username": "suspicious_user",
      "actions": ["*"]
    }
  ]
}
Field Notes
proxy Name of the proxy / composite / Xtream service.
proxyType Optional disambiguation when names collide across types.
username Xtream username to track; case-insensitive. * matches all users.
actions List of action selectors (see below).

Action selectors

Selector Matches
* Any API call covered by the policy framework
player_api Any player_api.php action (wildcard for player_api:*)
player_api:account Account / login checks
player_api:default Player API calls with no action parameter
player_api:get_live_streams Live stream list
player_api:get_vod_streams VOD stream list
player_api:get_series Series list
player_api:get_live_categories Live categories
player_api:get_vod_categories VOD categories
player_api:get_series_categories Series categories
player_api:get_short_epg Short EPG
player_api:get_simple_data_table Full EPG table
player_api:other Any other player API action
playlist:get get.php playlist requests
stream:live Live stream playback
stream:vod VOD playback
stream:series Series episode playback

No stream wildcard

player_api covers all player_api:* actions, but there is no stream wildcard. To capture all playback, list stream:live, stream:vod, and stream:series individually.

playlist:get, not get.php

Use playlist:get (or playlist) — get.php is normalized internally and won't match if you configure it literally.

Toggle logging at runtime

The Activity & Telemetry modal has two switches:

  • Non-proxy logs — flips verboseNonProxyLogging. Affects EPG, MediaFlow bridge, and other background workers.
  • User activity logs — flips verboseUserActivityLogging. Without this flag, even matching policies don't record events.

Both persist back to config.json.

Host metrics

The /metrics endpoint returns host-level stats — CPU, memory, and network-interface counters:

{
  "cpu": 12.4,
  "memory": {
    "total": 16690954240,
    "available": 9345986560,
    "used": 6987325440,
    "usedPercent": 41.9
  },
  "networkIO": [
    { "name": "eth0", "bytesSent": 48239448212, "bytesRecv": 1592384901733 }
  ]
}

Additional fields from the underlying gopsutil structs are included verbatim. The endpoint is deliberately unauthenticated — the container health check depends on it — so keep the dashboard port off the public internet. Per-proxy bandwidth and stream counters appear on the dashboard's proxy cards and in this modal, not on /metrics.

When to enable verbose user activity logging

Good cases:

  • Onboarding a new user — confirm their client is actually logging in and pulling playlists.
  • Diagnosing one specific user's complaint — set a policy scoped to their username with actions: ["*"].
  • Audit trails for resold panels — log stream:* so you can prove what played and when.

Bad cases:

  • Always-on, wildcard everything. The log only keeps the last 200 events; broad filters mean you'll miss the one you actually wanted.