DEPOT logging: add Telemt fleet monitoring via Zabbix
Install and persist Grafana Zabbix plugin 6.5.0, provision the internal Zabbix datasource, and add a fleet dashboard modeled on client 02 Telemt panels. Add an active-agent Zabbix 7 template plus a 30-second sanitized collector for active IP count/list, connections, traffic, and uptime. Active checks avoid inbound polling of client-private Docker hosts. The exact Zabbix host names and required ZABBIX_API_TOKEN Portainer variable are documented. Compose validation passed on 10.0.0.6; the live plugin registered successfully under Grafana 13.1.0.
This commit is contained in:
+63
-13
@@ -5,18 +5,24 @@ part of the manual `mktxp-stack`:
|
|||||||
|
|
||||||
- `loki` stores syslog in the persistent host path
|
- `loki` stores syslog in the persistent host path
|
||||||
`/mnt/containers/logging/loki-data`;
|
`/mnt/containers/logging/loki-data`;
|
||||||
- `alloy` replaces the `syslog-ng` -> `promtail` relay;
|
- `syslog-ng` accepts and normalizes the fleet's mixed/raw syslog formats;
|
||||||
- `grafana` provides the existing MikroTik Loki dashboard.
|
- `alloy` replaces Promtail and sends normalized RFC5424 to Loki;
|
||||||
|
- `grafana` provides the MikroTik Loki dashboard and a Telemt fleet dashboard
|
||||||
|
backed by the internal DEPOT Zabbix server.
|
||||||
|
|
||||||
The retired stack's `mktxp`, Prometheus, Promtail, and syslog-ng services are
|
The retired stack's `mktxp`, Prometheus, and Promtail services are not part of
|
||||||
not part of this stack.
|
this stack. syslog-ng remains because real DEPOT RouterOS traffic includes raw
|
||||||
|
messages that Alloy's strict RFC3164 parser rejects.
|
||||||
|
|
||||||
## Portainer settings
|
## Portainer settings
|
||||||
|
|
||||||
- Repository: `https://git.it-depot.ru/depot/docker-infrastructure`
|
- Repository: `https://git.it-depot.ru/depot/docker-infrastructure`
|
||||||
- Branch: `master`
|
- Branch: `master`
|
||||||
- Compose path: `logging/docker-compose.yaml`
|
- Compose path: `logging/docker-compose.yaml`
|
||||||
- Required environment variable: `GRAFANA_ADMIN_PASSWORD`
|
- Required environment variables:
|
||||||
|
- `GRAFANA_ADMIN_PASSWORD`
|
||||||
|
- `ZABBIX_API_TOKEN` — token for a read-only Zabbix API user; it is passed
|
||||||
|
into Grafana's provisioned datasource and must not be committed.
|
||||||
|
|
||||||
Do not deploy the new stack before completing the cutover below: the current
|
Do not deploy the new stack before completing the cutover below: the current
|
||||||
containers still own names `loki` and `grafana` and host ports 3000, 3100, 514,
|
containers still own names `loki` and `grafana` and host ports 3000, 3100, 514,
|
||||||
@@ -33,12 +39,14 @@ Before deployment, the repository files must be copied to:
|
|||||||
├── alloy-data/
|
├── alloy-data/
|
||||||
├── grafana-config/
|
├── grafana-config/
|
||||||
│ ├── dashboards/mikrotik-loki-logs.json
|
│ ├── dashboards/mikrotik-loki-logs.json
|
||||||
|
│ ├── dashboards/telemt-proxy-fleet.json
|
||||||
│ └── provisioning/
|
│ └── provisioning/
|
||||||
│ ├── dashboards/dashboards.yaml
|
│ ├── dashboards/dashboards.yaml
|
||||||
│ └── datasources/loki.yaml
|
│ └── datasources/{loki,zabbix}.yaml
|
||||||
├── grafana-data/
|
├── grafana-data/
|
||||||
├── loki-config/config.yaml
|
├── loki-config/config.yaml
|
||||||
└── loki-data/
|
├── loki-data/
|
||||||
|
└── syslog-ng-config/syslog-ng.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
SELinux is enforcing. The compose mounts use `:Z`; do not remove those flags.
|
SELinux is enforcing. The compose mounts use `:Z`; do not remove those flags.
|
||||||
@@ -47,10 +55,11 @@ Loki `10001:10001`, Grafana `472:0`, and Alloy `0:0`.
|
|||||||
|
|
||||||
## Cutover
|
## Cutover
|
||||||
|
|
||||||
The live Loki history is inside the old container at `/tmp/loki`. A stopped,
|
The live Loki history is inside the old container at `/tmp/loki`. Do not merge
|
||||||
consistent rescue copy from 2026-07-30 is pre-seeded in the new host path, but
|
a newer WAL over an older rescue WAL: the resulting non-contiguous segment
|
||||||
it must be refreshed from the stopped live container immediately before the
|
sequence makes Loki fail with `segments are not sequential`. Instead, move the
|
||||||
old stack is removed:
|
seed aside and copy the stopped container's complete data directory as one
|
||||||
|
generation:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /mnt/containers/mktxp/mktxp-stack
|
cd /mnt/containers/mktxp/mktxp-stack
|
||||||
@@ -59,8 +68,10 @@ cd /mnt/containers/mktxp/mktxp-stack
|
|||||||
curl -fsS http://127.0.0.1:3100/ready
|
curl -fsS http://127.0.0.1:3100/ready
|
||||||
docker compose stop
|
docker compose stop
|
||||||
|
|
||||||
# The stopped Loki container still contains the newest WAL/chunks.
|
# Preserve the seed separately; never overlay WAL generations.
|
||||||
docker cp -a loki:/tmp/loki/. /mnt/containers/logging/loki-data/
|
mv /mnt/containers/logging/loki-data \
|
||||||
|
/mnt/containers/logging/loki-data-rescue-seed-2026-07-30
|
||||||
|
docker cp -a loki:/tmp/loki /mnt/containers/logging/loki-data
|
||||||
chown -R 10001:10001 /mnt/containers/logging/loki-data
|
chown -R 10001:10001 /mnt/containers/logging/loki-data
|
||||||
|
|
||||||
# Removes containers and the old network, but NOT the old named Grafana and
|
# Removes containers and the old network, but NOT the old named Grafana and
|
||||||
@@ -98,6 +109,45 @@ In Grafana, the provisioned **Network / Mikrotik Loki Logs** dashboard should
|
|||||||
list existing `routerboard` values and show both pre-cutover and post-cutover
|
list existing `routerboard` values and show both pre-cutover and post-cutover
|
||||||
entries.
|
entries.
|
||||||
|
|
||||||
|
## Telemt / Zabbix monitoring
|
||||||
|
|
||||||
|
The Zabbix server is `10.0.0.11` internally. The DEPOT router at `10.0.0.1`
|
||||||
|
publishes TCP `185.108.4.158:10051` only for the three proxy-host egress
|
||||||
|
addresses, allowing Zabbix Agent 2 active checks without exposing the trapper
|
||||||
|
to the whole internet.
|
||||||
|
|
||||||
|
Create the following Zabbix hosts with these exact technical **Host name**
|
||||||
|
values (visible names may be friendlier):
|
||||||
|
|
||||||
|
| Client | Zabbix Host name |
|
||||||
|
|---|---|
|
||||||
|
| 00-xserver | `00-xserver-fedora-xxx` |
|
||||||
|
| 11-nevafud | `11-nevafud-fedora` |
|
||||||
|
| 19-nutrilent | `19-nutrilent-docker` |
|
||||||
|
|
||||||
|
Import `zabbix-template-telemt-active.yaml`, link **Telemt proxy by active
|
||||||
|
agent** to all three hosts, and ensure each host is in the `Linux servers`
|
||||||
|
group. Do not add a passive-agent interface: these hosts are behind NAT and
|
||||||
|
send active checks to `185.108.4.158`.
|
||||||
|
|
||||||
|
The matching host-side collector is in `zabbix-agent/`. It enters only the
|
||||||
|
Telemt container network namespace for the control API, discards links and
|
||||||
|
secrets, caches the active-IP list and Prometheus values, and exposes
|
||||||
|
read-only Agent 2 keys. The active-IP list retains one day of history; the
|
||||||
|
numeric count and other counters retain 31 days.
|
||||||
|
|
||||||
|
After redeploying Grafana with a valid `ZABBIX_API_TOKEN`, verify:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec grafana grafana cli plugins ls
|
||||||
|
curl -fsS http://127.0.0.1:3000/api/health
|
||||||
|
```
|
||||||
|
|
||||||
|
The provisioned **Network / Telegram proxy fleet** dashboard selects one of
|
||||||
|
the three exact host names above and mirrors the Telemt section of the
|
||||||
|
client-02 dashboard: current IP count, active/total connections, IP list,
|
||||||
|
traffic, and uptime.
|
||||||
|
|
||||||
## Rollback
|
## Rollback
|
||||||
|
|
||||||
Remove the new Portainer stack, then recreate the old stack with its Loki data
|
Remove the new Portainer stack, then recreate the old stack with its Loki data
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Direct replacement for the old syslog-ng -> Promtail -> Loki path.
|
// Replaces Promtail in the old syslog-ng -> Promtail -> Loki path.
|
||||||
//
|
//
|
||||||
// Existing RouterOS senders target 185.108.4.158:514/udp and use classic
|
// DEPOT's fleet is not uniformly parseable as RFC3164: some RouterOS senders
|
||||||
// BSD/RFC3164 framing. TCP/601 is retained for RFC5424-capable senders.
|
// emit raw messages without a PRI/header. syslog-ng therefore keeps listening
|
||||||
|
// on the public stack ports and normalizes every message to RFC5424 before
|
||||||
|
// forwarding it here on the private stack network.
|
||||||
|
|
||||||
loki.relabel "syslog" {
|
loki.relabel "syslog" {
|
||||||
forward_to = []
|
forward_to = []
|
||||||
@@ -28,29 +30,14 @@ loki.relabel "syslog" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loki.source.syslog "network_devices_udp" {
|
loki.source.syslog "normalized_syslog" {
|
||||||
listener {
|
listener {
|
||||||
address = "0.0.0.0:514"
|
address = "0.0.0.0:1514"
|
||||||
protocol = "udp"
|
|
||||||
syslog_format = "rfc3164"
|
|
||||||
labels = {
|
|
||||||
job = "syslog",
|
|
||||||
transport = "udp",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
relabel_rules = loki.relabel.syslog.rules
|
|
||||||
forward_to = [loki.write.default.receiver]
|
|
||||||
}
|
|
||||||
|
|
||||||
loki.source.syslog "network_devices_tcp" {
|
|
||||||
listener {
|
|
||||||
address = "0.0.0.0:601"
|
|
||||||
protocol = "tcp"
|
protocol = "tcp"
|
||||||
syslog_format = "rfc5424"
|
syslog_format = "rfc5424"
|
||||||
labels = {
|
labels = {
|
||||||
job = "syslog",
|
job = "syslog",
|
||||||
transport = "tcp",
|
transport = "syslog-ng",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,29 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
- logging-nw
|
- logging-nw
|
||||||
|
|
||||||
|
syslog-ng:
|
||||||
|
# DEPOT's RouterOS fleet includes senders that omit the PRI/header Alloy's
|
||||||
|
# strict parser requires. Keep the proven normalizer, pinned by digest,
|
||||||
|
# and relay canonical RFC5424 to Alloy.
|
||||||
|
image: balabit/syslog-ng@sha256:ce85e1af17daf888c72267b19f7f104bf329044257564b784ff8c00ce4fc01ef
|
||||||
|
container_name: syslog-ng
|
||||||
|
command: -edv
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- alloy
|
||||||
|
volumes:
|
||||||
|
- /mnt/containers/logging/syslog-ng-config/syslog-ng.conf:/etc/syslog-ng/syslog-ng.conf:ro,Z
|
||||||
|
ports:
|
||||||
|
# Existing fleet target: 185.108.4.158:514/udp.
|
||||||
|
- "514:514/udp"
|
||||||
|
# Preserve the old stack's TCP syslog endpoint.
|
||||||
|
- "601:601/tcp"
|
||||||
|
networks:
|
||||||
|
- logging-nw
|
||||||
|
|
||||||
alloy:
|
alloy:
|
||||||
# Replaces the syslog-ng -> Promtail relay with one direct syslog receiver.
|
# Replaces Promtail. syslog-ng normalizes the mixed/raw fleet input into
|
||||||
|
# RFC5424 before sending it to Alloy on the private stack network.
|
||||||
image: grafana/alloy:v1.16.1
|
image: grafana/alloy:v1.16.1
|
||||||
container_name: alloy
|
container_name: alloy
|
||||||
command:
|
command:
|
||||||
@@ -31,11 +52,6 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- /mnt/containers/logging/alloy-config/config.alloy:/etc/alloy/config.alloy:ro,Z
|
- /mnt/containers/logging/alloy-config/config.alloy:/etc/alloy/config.alloy:ro,Z
|
||||||
- /mnt/containers/logging/alloy-data:/var/lib/alloy/data:Z
|
- /mnt/containers/logging/alloy-data:/var/lib/alloy/data:Z
|
||||||
ports:
|
|
||||||
# Existing fleet target: 185.108.4.158:514/udp.
|
|
||||||
- "514:514/udp"
|
|
||||||
# Preserve the old stack's TCP syslog endpoint.
|
|
||||||
- "601:601/tcp"
|
|
||||||
networks:
|
networks:
|
||||||
- logging-nw
|
- logging-nw
|
||||||
|
|
||||||
@@ -48,6 +64,11 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD}
|
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD}
|
||||||
GF_USERS_ALLOW_SIGN_UP: "false"
|
GF_USERS_ALLOW_SIGN_UP: "false"
|
||||||
|
# Install the same Zabbix datasource version used by client 02.
|
||||||
|
GF_PLUGINS_PREINSTALL_SYNC: alexanderzobnin-zabbix-app@6.5.0
|
||||||
|
# Used only by the provisioned Zabbix datasource; set as a Portainer
|
||||||
|
# secret/environment value and never commit the token.
|
||||||
|
ZABBIX_API_TOKEN: ${ZABBIX_API_TOKEN}
|
||||||
volumes:
|
volumes:
|
||||||
- /mnt/containers/logging/grafana-data:/var/lib/grafana:Z
|
- /mnt/containers/logging/grafana-data:/var/lib/grafana:Z
|
||||||
- /mnt/containers/logging/grafana-config/provisioning/datasources:/etc/grafana/provisioning/datasources:ro,Z
|
- /mnt/containers/logging/grafana-config/provisioning/datasources:/etc/grafana/provisioning/datasources:ro,Z
|
||||||
|
|||||||
@@ -0,0 +1,836 @@
|
|||||||
|
{
|
||||||
|
"uid": "telemt-proxy-fleet",
|
||||||
|
"title": "Telegram proxy fleet",
|
||||||
|
"tags": [
|
||||||
|
"proxy",
|
||||||
|
"telemt",
|
||||||
|
"zabbix",
|
||||||
|
"fleet"
|
||||||
|
],
|
||||||
|
"schemaVersion": 39,
|
||||||
|
"version": 1,
|
||||||
|
"editable": true,
|
||||||
|
"refresh": "30s",
|
||||||
|
"time": {
|
||||||
|
"from": "now-6h",
|
||||||
|
"to": "now"
|
||||||
|
},
|
||||||
|
"timezone": "",
|
||||||
|
"templating": {
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"current": {
|
||||||
|
"selected": true,
|
||||||
|
"text": "00-xserver-fedora-xxx",
|
||||||
|
"value": "00-xserver-fedora-xxx"
|
||||||
|
},
|
||||||
|
"hide": 0,
|
||||||
|
"includeAll": false,
|
||||||
|
"label": "Proxy host",
|
||||||
|
"multi": false,
|
||||||
|
"name": "proxy_host",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"selected": true,
|
||||||
|
"text": "00-xserver-fedora-xxx",
|
||||||
|
"value": "00-xserver-fedora-xxx"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"selected": false,
|
||||||
|
"text": "11-nevafud-fedora",
|
||||||
|
"value": "11-nevafud-fedora"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"selected": false,
|
||||||
|
"text": "19-nutrilent-docker",
|
||||||
|
"value": "19-nutrilent-docker"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"query": "00-xserver-fedora-xxx,11-nevafud-fedora,19-nutrilent-docker",
|
||||||
|
"queryValue": "",
|
||||||
|
"skipUrlSync": false,
|
||||||
|
"type": "custom"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"annotations": {
|
||||||
|
"list": []
|
||||||
|
},
|
||||||
|
"panels": [
|
||||||
|
{
|
||||||
|
"type": "row",
|
||||||
|
"title": "Telegram MTProto (:1080) — Telemt",
|
||||||
|
"collapsed": false,
|
||||||
|
"gridPos": {
|
||||||
|
"h": 1,
|
||||||
|
"w": 24,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
"panels": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"type": "stat",
|
||||||
|
"title": "Уникальных пользователей сейчас (IP)",
|
||||||
|
"description": "Текущее число уникальных активных клиентских IP для Telemt user secret `tekhnohim`. Это наиболее близкая доступная метрика к числу подключённых пользователей: несколько клиентов за одним NAT считаются как один IP, а один пользователь с нескольких внешних IP — как несколько.",
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 5,
|
||||||
|
"w": 10,
|
||||||
|
"x": 0,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"reduceOptions": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"fields": "",
|
||||||
|
"values": false
|
||||||
|
},
|
||||||
|
"colorMode": "background",
|
||||||
|
"graphMode": "area",
|
||||||
|
"textMode": "value_and_name",
|
||||||
|
"justifyMode": "center",
|
||||||
|
"wideLayout": true
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "thresholds"
|
||||||
|
},
|
||||||
|
"unit": "short",
|
||||||
|
"decimals": 0,
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "dark-gray",
|
||||||
|
"value": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "green",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"application": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"countTriggers": true,
|
||||||
|
"countTriggersBy": "",
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"evaltype": "0",
|
||||||
|
"functions": [],
|
||||||
|
"group": {
|
||||||
|
"filter": "Linux servers"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"filter": "$proxy_host"
|
||||||
|
},
|
||||||
|
"item": {
|
||||||
|
"filter": "/^Telemt: Active IP address count$/"
|
||||||
|
},
|
||||||
|
"itemTag": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"macro": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"minSeverity": 3,
|
||||||
|
"mode": 0,
|
||||||
|
"options": {
|
||||||
|
"count": false,
|
||||||
|
"disableDataAlignment": false,
|
||||||
|
"showDisabledItems": false,
|
||||||
|
"skipEmptyValues": false,
|
||||||
|
"useTrends": "default",
|
||||||
|
"useZabbixValueMapping": false
|
||||||
|
},
|
||||||
|
"proxy": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"queryType": "0",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"schema": 12,
|
||||||
|
"table": {
|
||||||
|
"skipEmptyValues": false
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"textFilter": "",
|
||||||
|
"trigger": {
|
||||||
|
"filter": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"type": "stat",
|
||||||
|
"title": "Активных соединений",
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 5,
|
||||||
|
"w": 7,
|
||||||
|
"x": 10,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"reduceOptions": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"fields": "",
|
||||||
|
"values": false
|
||||||
|
},
|
||||||
|
"colorMode": "value",
|
||||||
|
"graphMode": "area",
|
||||||
|
"textMode": "value_and_name",
|
||||||
|
"justifyMode": "center"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "fixed",
|
||||||
|
"fixedColor": "blue"
|
||||||
|
},
|
||||||
|
"unit": "short",
|
||||||
|
"decimals": 0
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"application": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"functions": [],
|
||||||
|
"group": {
|
||||||
|
"filter": "Linux servers"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"filter": "$proxy_host"
|
||||||
|
},
|
||||||
|
"item": {
|
||||||
|
"filter": "/^Telemt: Active connections$/"
|
||||||
|
},
|
||||||
|
"itemTag": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"mode": 0,
|
||||||
|
"options": {
|
||||||
|
"count": false,
|
||||||
|
"disableDataAlignment": false,
|
||||||
|
"showDisabledItems": false,
|
||||||
|
"skipEmptyValues": false,
|
||||||
|
"useTrends": "default",
|
||||||
|
"useZabbixValueMapping": false
|
||||||
|
},
|
||||||
|
"queryType": "0",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"schema": 12
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"type": "stat",
|
||||||
|
"title": "Всего подключений",
|
||||||
|
"description": "Накопительный счётчик подключений user secret `tekhnohim` с момента запуска Telemt.",
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 5,
|
||||||
|
"w": 7,
|
||||||
|
"x": 17,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"reduceOptions": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"fields": "",
|
||||||
|
"values": false
|
||||||
|
},
|
||||||
|
"colorMode": "value",
|
||||||
|
"graphMode": "area",
|
||||||
|
"textMode": "value_and_name",
|
||||||
|
"justifyMode": "center"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "fixed",
|
||||||
|
"fixedColor": "purple"
|
||||||
|
},
|
||||||
|
"unit": "short",
|
||||||
|
"decimals": 0
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"application": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"functions": [],
|
||||||
|
"group": {
|
||||||
|
"filter": "Linux servers"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"filter": "$proxy_host"
|
||||||
|
},
|
||||||
|
"item": {
|
||||||
|
"filter": "/^Telemt: Total connections$/"
|
||||||
|
},
|
||||||
|
"itemTag": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"mode": 0,
|
||||||
|
"options": {
|
||||||
|
"count": false,
|
||||||
|
"disableDataAlignment": false,
|
||||||
|
"showDisabledItems": false,
|
||||||
|
"skipEmptyValues": false,
|
||||||
|
"useTrends": "default",
|
||||||
|
"useZabbixValueMapping": false
|
||||||
|
},
|
||||||
|
"queryType": "0",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"schema": 12
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"type": "table",
|
||||||
|
"title": "Текущие активные IP-адреса Telemt",
|
||||||
|
"description": "Последний снимок активных IP-адресов из Zabbix item telemt.active_ips.list. Обновляется каждые 30 секунд.",
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 6,
|
||||||
|
"w": 24,
|
||||||
|
"x": 0,
|
||||||
|
"y": 6
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"custom": {
|
||||||
|
"align": "left",
|
||||||
|
"filterable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"cellHeight": "auto",
|
||||||
|
"footer": {
|
||||||
|
"countRows": false,
|
||||||
|
"fields": "",
|
||||||
|
"reducer": [
|
||||||
|
"sum"
|
||||||
|
],
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
"showHeader": true,
|
||||||
|
"sortBy": []
|
||||||
|
},
|
||||||
|
"transformations": [
|
||||||
|
{
|
||||||
|
"id": "organize",
|
||||||
|
"options": {
|
||||||
|
"excludeByName": {
|
||||||
|
"Host": true,
|
||||||
|
"Item": true,
|
||||||
|
"Key": true
|
||||||
|
},
|
||||||
|
"renameByName": {
|
||||||
|
"Last value": "Активные подключения (пользователь | IP)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"application": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"functions": [],
|
||||||
|
"group": {
|
||||||
|
"filter": "Linux servers"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"filter": "$proxy_host"
|
||||||
|
},
|
||||||
|
"item": {
|
||||||
|
"filter": "/^Telemt: Active IP addresses$/"
|
||||||
|
},
|
||||||
|
"itemTag": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"mode": 0,
|
||||||
|
"options": {
|
||||||
|
"count": false,
|
||||||
|
"disableDataAlignment": false,
|
||||||
|
"showDisabledItems": false,
|
||||||
|
"skipEmptyValues": true,
|
||||||
|
"useTrends": "default",
|
||||||
|
"useZabbixValueMapping": false
|
||||||
|
},
|
||||||
|
"queryType": "2",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "table",
|
||||||
|
"schema": 12,
|
||||||
|
"textFilter": "",
|
||||||
|
"useCaptureGroups": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"type": "timeseries",
|
||||||
|
"title": "Пользователи и соединения",
|
||||||
|
"description": "Текущее число уникальных активных IP и параллельных Telemt-соединений.",
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 8,
|
||||||
|
"w": 12,
|
||||||
|
"x": 0,
|
||||||
|
"y": 12
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 15,
|
||||||
|
"lineInterpolation": "stepAfter",
|
||||||
|
"lineWidth": 2,
|
||||||
|
"pointSize": 3,
|
||||||
|
"showPoints": "never",
|
||||||
|
"spanNulls": true,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"unit": "short",
|
||||||
|
"decimals": 0
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull",
|
||||||
|
"max"
|
||||||
|
],
|
||||||
|
"displayMode": "table",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "multi",
|
||||||
|
"sort": "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"application": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"functions": [],
|
||||||
|
"group": {
|
||||||
|
"filter": "Linux servers"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"filter": "$proxy_host"
|
||||||
|
},
|
||||||
|
"item": {
|
||||||
|
"filter": "/^Telemt: (Active IP address count|Active connections)$/"
|
||||||
|
},
|
||||||
|
"itemTag": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"mode": 0,
|
||||||
|
"options": {
|
||||||
|
"count": false,
|
||||||
|
"disableDataAlignment": false,
|
||||||
|
"showDisabledItems": false,
|
||||||
|
"skipEmptyValues": false,
|
||||||
|
"useTrends": "default",
|
||||||
|
"useZabbixValueMapping": false
|
||||||
|
},
|
||||||
|
"queryType": "0",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"schema": 12
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"type": "timeseries",
|
||||||
|
"title": "Трафик Telemt (накопительно)",
|
||||||
|
"description": "Накопительные байтовые счётчики Telemt по user secret `tekhnohim`; сбрасываются при перезапуске сервиса.",
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 8,
|
||||||
|
"w": 12,
|
||||||
|
"x": 12,
|
||||||
|
"y": 12
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 15,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 2,
|
||||||
|
"pointSize": 3,
|
||||||
|
"showPoints": "never",
|
||||||
|
"spanNulls": true,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"unit": "bytes"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull",
|
||||||
|
"max"
|
||||||
|
],
|
||||||
|
"displayMode": "table",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
|
"mode": "multi",
|
||||||
|
"sort": "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"application": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"functions": [],
|
||||||
|
"group": {
|
||||||
|
"filter": "Linux servers"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"filter": "$proxy_host"
|
||||||
|
},
|
||||||
|
"item": {
|
||||||
|
"filter": "/^Telemt: Bytes (received from|sent to) clients$/"
|
||||||
|
},
|
||||||
|
"itemTag": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"mode": 0,
|
||||||
|
"options": {
|
||||||
|
"count": false,
|
||||||
|
"disableDataAlignment": false,
|
||||||
|
"showDisabledItems": false,
|
||||||
|
"skipEmptyValues": false,
|
||||||
|
"useTrends": "default",
|
||||||
|
"useZabbixValueMapping": false
|
||||||
|
},
|
||||||
|
"queryType": "0",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"schema": 12
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"type": "stat",
|
||||||
|
"title": "Аптайм Telemt",
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 4,
|
||||||
|
"w": 8,
|
||||||
|
"x": 0,
|
||||||
|
"y": 20
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"reduceOptions": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"fields": "",
|
||||||
|
"values": false
|
||||||
|
},
|
||||||
|
"colorMode": "value",
|
||||||
|
"graphMode": "none",
|
||||||
|
"textMode": "value_and_name",
|
||||||
|
"justifyMode": "center"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "fixed",
|
||||||
|
"fixedColor": "green"
|
||||||
|
},
|
||||||
|
"unit": "s"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"application": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"functions": [],
|
||||||
|
"group": {
|
||||||
|
"filter": "Linux servers"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"filter": "$proxy_host"
|
||||||
|
},
|
||||||
|
"item": {
|
||||||
|
"filter": "/^Telemt: Uptime$/"
|
||||||
|
},
|
||||||
|
"itemTag": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"mode": 0,
|
||||||
|
"options": {
|
||||||
|
"count": false,
|
||||||
|
"disableDataAlignment": false,
|
||||||
|
"showDisabledItems": false,
|
||||||
|
"skipEmptyValues": false,
|
||||||
|
"useTrends": "default",
|
||||||
|
"useZabbixValueMapping": false
|
||||||
|
},
|
||||||
|
"queryType": "0",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"schema": 12
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"type": "stat",
|
||||||
|
"title": "Получено от клиентов",
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 4,
|
||||||
|
"w": 8,
|
||||||
|
"x": 8,
|
||||||
|
"y": 20
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"reduceOptions": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"fields": "",
|
||||||
|
"values": false
|
||||||
|
},
|
||||||
|
"colorMode": "value",
|
||||||
|
"graphMode": "none",
|
||||||
|
"textMode": "value_and_name",
|
||||||
|
"justifyMode": "center"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "fixed",
|
||||||
|
"fixedColor": "semi-dark-blue"
|
||||||
|
},
|
||||||
|
"unit": "bytes"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"application": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"functions": [],
|
||||||
|
"group": {
|
||||||
|
"filter": "Linux servers"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"filter": "$proxy_host"
|
||||||
|
},
|
||||||
|
"item": {
|
||||||
|
"filter": "/^Telemt: Bytes received from clients$/"
|
||||||
|
},
|
||||||
|
"itemTag": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"mode": 0,
|
||||||
|
"options": {
|
||||||
|
"count": false,
|
||||||
|
"disableDataAlignment": false,
|
||||||
|
"showDisabledItems": false,
|
||||||
|
"skipEmptyValues": false,
|
||||||
|
"useTrends": "default",
|
||||||
|
"useZabbixValueMapping": false
|
||||||
|
},
|
||||||
|
"queryType": "0",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"schema": 12
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"type": "stat",
|
||||||
|
"title": "Отправлено клиентам",
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 4,
|
||||||
|
"w": 8,
|
||||||
|
"x": 16,
|
||||||
|
"y": 20
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"reduceOptions": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"fields": "",
|
||||||
|
"values": false
|
||||||
|
},
|
||||||
|
"colorMode": "value",
|
||||||
|
"graphMode": "none",
|
||||||
|
"textMode": "value_and_name",
|
||||||
|
"justifyMode": "center"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "fixed",
|
||||||
|
"fixedColor": "semi-dark-purple"
|
||||||
|
},
|
||||||
|
"unit": "bytes"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"application": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"datasource": {
|
||||||
|
"type": "alexanderzobnin-zabbix-datasource",
|
||||||
|
"uid": "zabbix-depot"
|
||||||
|
},
|
||||||
|
"functions": [],
|
||||||
|
"group": {
|
||||||
|
"filter": "Linux servers"
|
||||||
|
},
|
||||||
|
"host": {
|
||||||
|
"filter": "$proxy_host"
|
||||||
|
},
|
||||||
|
"item": {
|
||||||
|
"filter": "/^Telemt: Bytes sent to clients$/"
|
||||||
|
},
|
||||||
|
"itemTag": {
|
||||||
|
"filter": ""
|
||||||
|
},
|
||||||
|
"mode": 0,
|
||||||
|
"options": {
|
||||||
|
"count": false,
|
||||||
|
"disableDataAlignment": false,
|
||||||
|
"showDisabledItems": false,
|
||||||
|
"skipEmptyValues": false,
|
||||||
|
"useTrends": "default",
|
||||||
|
"useZabbixValueMapping": false
|
||||||
|
},
|
||||||
|
"queryType": "0",
|
||||||
|
"refId": "A",
|
||||||
|
"resultFormat": "time_series",
|
||||||
|
"schema": 12
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
apiVersion: 1
|
||||||
|
|
||||||
|
datasources:
|
||||||
|
- name: Zabbix
|
||||||
|
uid: zabbix-depot
|
||||||
|
type: alexanderzobnin-zabbix-datasource
|
||||||
|
access: proxy
|
||||||
|
url: http://10.0.0.11/api_jsonrpc.php
|
||||||
|
editable: false
|
||||||
|
jsonData:
|
||||||
|
authType: token
|
||||||
|
cacheTTL: 1h
|
||||||
|
dbConnectionEnable: false
|
||||||
|
disableDataAlignment: false
|
||||||
|
disableReadOnlyUsersAck: true
|
||||||
|
queryTimeout: 60
|
||||||
|
timeout: 30
|
||||||
|
trends: true
|
||||||
|
trendsFrom: 7d
|
||||||
|
trendsRange: 4d
|
||||||
|
secureJsonData:
|
||||||
|
apiToken: ${ZABBIX_API_TOKEN}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
@version: 3.29
|
||||||
|
@include "scl.conf"
|
||||||
|
|
||||||
|
source s_local {
|
||||||
|
internal();
|
||||||
|
};
|
||||||
|
|
||||||
|
# default-network-drivers accepts the mixed/raw formats used by the DEPOT
|
||||||
|
# fleet on the standard UDP/TCP syslog listeners.
|
||||||
|
source s_network {
|
||||||
|
default-network-drivers();
|
||||||
|
};
|
||||||
|
|
||||||
|
# Alloy's syslog receiver accepts one explicit format per listener. Normalize
|
||||||
|
# every accepted input to RFC5424 before relaying it over the private network.
|
||||||
|
template t_alloy_rfc5424 {
|
||||||
|
template("<${PRI}>1 ${ISODATE} ${HOST} ${PROGRAM} ${PID} ${MSGID} - ${MSG}\n");
|
||||||
|
};
|
||||||
|
|
||||||
|
destination d_alloy {
|
||||||
|
syslog("alloy" transport("tcp") port("1514")
|
||||||
|
template(t_alloy_rfc5424)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
log {
|
||||||
|
source(s_local);
|
||||||
|
source(s_network);
|
||||||
|
destination(d_alloy);
|
||||||
|
};
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# Cached by zabbix-telemt-collector.service; contains no proxy links or secrets.
|
||||||
|
UserParameter=telemt.active_ips.list,cat /var/lib/zabbix/telemt-active-ips.txt
|
||||||
|
UserParameter=telemt.active_ips.count,/usr/local/libexec/zabbix-telemt-value active_ips_count
|
||||||
|
UserParameter=telemt.connections.current,/usr/local/libexec/zabbix-telemt-value connections_current
|
||||||
|
UserParameter=telemt.connections.total,/usr/local/libexec/zabbix-telemt-value connections_total
|
||||||
|
UserParameter=telemt.bytes.received,/usr/local/libexec/zabbix-telemt-value bytes_received
|
||||||
|
UserParameter=telemt.bytes.sent,/usr/local/libexec/zabbix-telemt-value bytes_sent
|
||||||
|
UserParameter=telemt.uptime,/usr/local/libexec/zabbix-telemt-value uptime
|
||||||
Executable
+65
@@ -0,0 +1,65 @@
|
|||||||
|
#!/usr/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
container_name="ts-lan-telemt"
|
||||||
|
output_dir="/var/lib/zabbix"
|
||||||
|
json_target="${output_dir}/telemt-active-ips.json"
|
||||||
|
text_target="${output_dir}/telemt-active-ips.txt"
|
||||||
|
metrics_target="${output_dir}/telemt-metrics.prom"
|
||||||
|
|
||||||
|
install -d -o root -g zabbix -m 0750 "${output_dir}"
|
||||||
|
|
||||||
|
container_pid="$(docker inspect --format '{{.State.Pid}}' "${container_name}")"
|
||||||
|
if [[ -z "${container_pid}" || "${container_pid}" == "0" ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
host_ip="$(ip -4 route get 1.1.1.1 | awk '{for (i=1; i<=NF; i++) if ($i == "src") {print $(i+1); exit}}')"
|
||||||
|
if [[ -z "${host_ip}" ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
json_tmp="$(mktemp "${output_dir}/.telemt-active-ips.json.XXXXXX")"
|
||||||
|
text_tmp="$(mktemp "${output_dir}/.telemt-active-ips.txt.XXXXXX")"
|
||||||
|
metrics_tmp="$(mktemp "${output_dir}/.telemt-metrics.prom.XXXXXX")"
|
||||||
|
trap 'rm -f "${json_tmp}" "${text_tmp}" "${metrics_tmp}"' EXIT
|
||||||
|
|
||||||
|
# The API response also contains proxy links and secrets. Filter it in-memory
|
||||||
|
# and persist only the username and current active IP address list.
|
||||||
|
nsenter -t "${container_pid}" -n \
|
||||||
|
curl --fail --silent --show-error --max-time 5 \
|
||||||
|
http://127.0.0.1:9091/v1/users |
|
||||||
|
jq --compact-output '{
|
||||||
|
users: [
|
||||||
|
.data[]
|
||||||
|
| {
|
||||||
|
username,
|
||||||
|
active_unique_ips: (.active_unique_ips_list // [])
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}' > "${json_tmp}"
|
||||||
|
|
||||||
|
{
|
||||||
|
active_count="$(jq '[.users[].active_unique_ips[]] | unique | length' "${json_tmp}")"
|
||||||
|
printf 'Active IP addresses: %s\n' "${active_count}"
|
||||||
|
jq --raw-output '
|
||||||
|
[
|
||||||
|
.users[] as $user
|
||||||
|
| $user.active_unique_ips[]
|
||||||
|
| "\($user.username) | \(.)"
|
||||||
|
]
|
||||||
|
| if length == 0 then ["No active IP addresses"] else . end
|
||||||
|
| .[]
|
||||||
|
' "${json_tmp}"
|
||||||
|
} > "${text_tmp}"
|
||||||
|
|
||||||
|
# Cache Prometheus output locally. Zabbix active checks read the cache, so the
|
||||||
|
# central server does not need a route to each private Docker host.
|
||||||
|
curl --fail --silent --show-error --max-time 5 \
|
||||||
|
"http://${host_ip}:9092/metrics" > "${metrics_tmp}"
|
||||||
|
|
||||||
|
chown root:zabbix "${json_tmp}" "${text_tmp}" "${metrics_tmp}"
|
||||||
|
chmod 0640 "${json_tmp}" "${text_tmp}" "${metrics_tmp}"
|
||||||
|
mv -f "${json_tmp}" "${json_target}"
|
||||||
|
mv -f "${text_tmp}" "${text_target}"
|
||||||
|
mv -f "${metrics_tmp}" "${metrics_target}"
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Collect sanitized Telemt data for Zabbix
|
||||||
|
After=docker.service
|
||||||
|
Requires=docker.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/local/libexec/zabbix-telemt-collector
|
||||||
|
User=root
|
||||||
|
Group=root
|
||||||
|
PrivateTmp=true
|
||||||
|
NoNewPrivileges=true
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Refresh sanitized Telemt data for Zabbix
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnBootSec=30s
|
||||||
|
OnUnitActiveSec=30s
|
||||||
|
AccuracySec=2s
|
||||||
|
Unit=zabbix-telemt-collector.service
|
||||||
|
Persistent=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
Executable
+30
@@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
json_file="/var/lib/zabbix/telemt-active-ips.json"
|
||||||
|
metrics_file="/var/lib/zabbix/telemt-metrics.prom"
|
||||||
|
|
||||||
|
case "${1:-}" in
|
||||||
|
active_ips_count)
|
||||||
|
jq '[.users[].active_unique_ips[]] | unique | length' "${json_file}"
|
||||||
|
;;
|
||||||
|
connections_current)
|
||||||
|
awk '$1 ~ /^telemt_user_connections_current\{/ {sum += $2} END {print sum + 0}' "${metrics_file}"
|
||||||
|
;;
|
||||||
|
connections_total)
|
||||||
|
awk '$1 ~ /^telemt_user_connections_total\{/ {sum += $2} END {print sum + 0}' "${metrics_file}"
|
||||||
|
;;
|
||||||
|
bytes_received)
|
||||||
|
awk '$1 ~ /^telemt_user_octets_from_client\{/ {sum += $2} END {printf "%.0f\n", sum + 0}' "${metrics_file}"
|
||||||
|
;;
|
||||||
|
bytes_sent)
|
||||||
|
awk '$1 ~ /^telemt_user_octets_to_client\{/ {sum += $2} END {printf "%.0f\n", sum + 0}' "${metrics_file}"
|
||||||
|
;;
|
||||||
|
uptime)
|
||||||
|
awk '$1 == "telemt_uptime_seconds" {printf "%.0f\n", $2; found=1} END {if (!found) exit 1}' "${metrics_file}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf 'unsupported Telemt value: %s\n' "${1:-}" >&2
|
||||||
|
exit 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
zabbix_export:
|
||||||
|
version: '7.0'
|
||||||
|
template_groups:
|
||||||
|
- uuid: a571c0d144b14fd4a87a9d9b2aa9fcd6
|
||||||
|
name: Templates/Applications
|
||||||
|
templates:
|
||||||
|
- uuid: 1d617f451f8640089f9ac33d62865e72
|
||||||
|
template: 'Telemt proxy by active agent'
|
||||||
|
name: 'Telemt proxy by active agent'
|
||||||
|
description: |
|
||||||
|
Telemt metrics cached locally by zabbix-telemt-collector.timer.
|
||||||
|
Designed for hosts behind NAT; every item is a Zabbix agent active check.
|
||||||
|
groups:
|
||||||
|
- name: Templates/Applications
|
||||||
|
items:
|
||||||
|
- uuid: e383ca45b2c047519f30665999cfc02e
|
||||||
|
name: 'Telemt: Active IP address count'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: telemt.active_ips.count
|
||||||
|
delay: 30s
|
||||||
|
history: 31d
|
||||||
|
trends: 365d
|
||||||
|
value_type: UNSIGNED
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: telemt
|
||||||
|
- uuid: 5a29849443d5473884246d049a2dd79f
|
||||||
|
name: 'Telemt: Active IP addresses'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: telemt.active_ips.list
|
||||||
|
delay: 30s
|
||||||
|
history: 1d
|
||||||
|
value_type: TEXT
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: telemt
|
||||||
|
- uuid: 465288678a084f8c84f56c2cffc0dcda
|
||||||
|
name: 'Telemt: Active connections'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: telemt.connections.current
|
||||||
|
delay: 30s
|
||||||
|
history: 31d
|
||||||
|
trends: 365d
|
||||||
|
value_type: UNSIGNED
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: telemt
|
||||||
|
- uuid: dddf99d04abb459f8890eff46b948c4b
|
||||||
|
name: 'Telemt: Total connections'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: telemt.connections.total
|
||||||
|
delay: 30s
|
||||||
|
history: 31d
|
||||||
|
trends: 365d
|
||||||
|
value_type: UNSIGNED
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: telemt
|
||||||
|
- uuid: 03e3a3671d744efaa65d4328d8d4035f
|
||||||
|
name: 'Telemt: Bytes received from clients'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: telemt.bytes.received
|
||||||
|
delay: 30s
|
||||||
|
history: 31d
|
||||||
|
trends: 365d
|
||||||
|
value_type: UNSIGNED
|
||||||
|
units: B
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: telemt
|
||||||
|
- uuid: 97679bf1d06b47b0acf8f33f1253d114
|
||||||
|
name: 'Telemt: Bytes sent to clients'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: telemt.bytes.sent
|
||||||
|
delay: 30s
|
||||||
|
history: 31d
|
||||||
|
trends: 365d
|
||||||
|
value_type: UNSIGNED
|
||||||
|
units: B
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: telemt
|
||||||
|
- uuid: b554b83a21ca46638c753e803870661f
|
||||||
|
name: 'Telemt: Uptime'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: telemt.uptime
|
||||||
|
delay: 30s
|
||||||
|
history: 31d
|
||||||
|
trends: 365d
|
||||||
|
value_type: UNSIGNED
|
||||||
|
units: uptime
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: telemt
|
||||||
Reference in New Issue
Block a user