diff --git a/config/prometheus.yml b/config/prometheus.yml new file mode 100644 index 0000000..4cad0e2 --- /dev/null +++ b/config/prometheus.yml @@ -0,0 +1,19 @@ +global: + scrape_interval: 10s + evaluation_interval: 5s + scrape_timeout: 5s + +scrape_configs: + - job_name: mikrotik-exporter + bearer_token: ZwRZm7Qe6J + dns_sd_configs: + - names: + - '_mikrotik._tcp.mgmt.k-space.ee' + relabel_configs: + - source_labels: [ __address__ ] + target_label: __param_target + - source_labels: [ __param_target ] + target_label: instance + - target_label: __address__ + replacement: 127.0.0.1:3001 + diff --git a/docker-compose.yml b/docker-compose.yml index 38bad87..b787ff1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,17 @@ version: '3.7' services: - app: + mikrotik-exporter: build: context: . env_file: .env + environment: + - PROMETHEUS_BEARER_TOKEN=ZwRZm7Qe6J network_mode: host + prometheus: + network_mode: "host" + image: prom/prometheus:latest + command: + - --config.file=/config/prometheus.yml + volumes: + - ./config:/config:ro diff --git a/mikrotik.py b/mikrotik.py index bf7dc97..c75eac4 100755 --- a/mikrotik.py +++ b/mikrotik.py @@ -1,6 +1,6 @@ #!/usr/bin/env python import os -from aio_api_ros import create_rosapi_connection +from aio_api_ros.connection import ApiRosConnection from aiostream import stream from sanic import Sanic, response, exceptions @@ -39,14 +39,15 @@ async def wrap(i): value) -async def scrape_mikrotik(target): - mk = await create_rosapi_connection( +async def scrape_mikrotik(target, port): + mk = ApiRosConnection( mk_ip=target, - mk_port=8728, + mk_port=port, mk_user=MIKROTIK_USER, mk_psw=MIKROTIK_PASSWORD, - ) + await mk.connect() + await mk.login() mk.talk_sentence(["/interface/print"]) res = await mk.read_full_answer() @@ -173,9 +174,17 @@ async def scrape_mikrotik(target): async def view_export(request): if request.token != PROMETHEUS_BEARER_TOKEN: raise exceptions.Forbidden("Invalid bearer token") + target = request.args.get("target") + if not target: + raise exceptions.InvalidUsage("Invalid or no target specified") + if ":" in target: + target, port = target.split(":") + port = int(port) + else: + port = 8728 async def streaming_fn(response): - async for line in wrap(scrape_mikrotik(request.args.get("target"))): + async for line in wrap(scrape_mikrotik(target, port)): await response.write(line + "\n") return response.stream(streaming_fn, content_type="text/plain")