diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..2f679c2 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,109 @@ +name: Build and Deploy MkDocs OpenJTS Site + +on: + push: + branches-ignore: + - gh-pages + workflow_dispatch: + +permissions: + contents: write + +jobs: + # ========================================================== + # BUILD + DEPLOY + # ========================================================== + build-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # ---------------------------- + # Python setup + # ---------------------------- + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + + # ---------------------------- + # Install MkDocs dependencies + # ---------------------------- + - name: Install Python dependencies + run: | + pip install --upgrade pip + pip install mkdocs==1.4.2 + pip install mkdocs-material==9.6.9 + pip install mkdocs-material[extras] + pip install pymdown-extensions==10.16.1 + pip install markdown-katex==202406.1035 + pip install mkdocs-gen-files==0.5.0 + pip install mkdocs-minify-plugin==0.8.0 + pip install pyyaml==6.0.1 + pip install bs4==0.0.2 + + # ---------------------------- + # Build MkDocs + # ---------------------------- + - name: Build MkDocs site + run: | + mkdocs build --strict + + # ---------------------------- + # Deploy to GitHub Pages + # ---------------------------- + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_branch: gh-pages + publish_dir: ./site + keep_files: true + destination_dir: ${{ github.ref_name != 'main' && github.ref_name || '' }} + + # ========================================================== + # CLEANUP JOB + # ========================================================== + cleanup-previews: + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + + steps: + - name: Checkout gh-pages + uses: actions/checkout@v4 + with: + ref: gh-pages + path: gh-pages + + - name: Install GitHub CLI + uses: cli/cli@v2 + + - name: Remove obsolete branch previews + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -euo pipefail + cd gh-pages + + WHITELIST="addon assets books download images search stylesheets" + ACTIVE_BRANCHES=$(gh api repos/${GITHUB_REPOSITORY}/branches --jq '.[].name') + + for dir in *; do + [ -d "$dir" ] || continue + + if echo "$WHITELIST" | grep -qw "$dir"; then + continue + fi + + if ! echo "$ACTIVE_BRANCHES" | grep -qw "$dir"; then + echo "Removing obsolete preview: $dir" + rm -rf "$dir" + fi + done + + git config user.name "github-actions" + git config user.email "github-actions@github.com" + git add . + git commit -m "Cleanup obsolete branch previews" || echo "Nothing to clean" + git push \ No newline at end of file diff --git a/CONFIG.md b/CONFIG.md deleted file mode 100644 index 6a9fb0c..0000000 --- a/CONFIG.md +++ /dev/null @@ -1,213 +0,0 @@ -# Configuration of OpenJTS - - **Table of content:** - - [Home](README.md) - - [Installation](INSTALL.md) - - [Configuration](CONFIG.md) - - [Update Stack](UPDATE.md) - - [Utilization](USAGE.md) - - [Profiles documentation](PROFILES.md) - -## Prefer HTTPS ? - -If you want to use HTTPs for JTSO and Grafana you may use self signed certificate: - -```shell -#Go to the jtso/cert directpory -cd ./compose/jtso/cert - -sudo openssl genrsa -aes256 -passout pass:gsahdg -out server.pass.key 4096 - -sudo openssl rsa -passin pass:gsahdg -in server.pass.key -out server.key - -sudo rm server.pass.key - -sudo openssl req -new -key server.key -out server.csr - -You are about to be asked to enter information that will be incorporated -into your certificate request. -What you are about to enter is what is called a Distinguished Name or a DN. -There are quite a few fields but you can leave some blank -For some fields there will be a default value, -If you enter '.', the field will be left blank. ------ -Country Name (2 letter code) [AU]: FR -State or Province Name (full name) [Some-State]: France -Locality Name (eg, city) []: Paris -Organization Name (eg, company) [Internet Widgits Pty Ltd]: Juniper -Organizational Unit Name (eg, section) []: AWAN -Common Name (e.g. server FQDN or YOUR name) []: myserver -Email Address []: xxx@yyy.com - -Please enter the following 'extra' attributes -to be sent with your certificate request -A challenge password []: -An optional company name []: - -sudo openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -``` - -Now, edit the JTSO config file and enable JTSO HTTPS (set to true) - -```shell -sudo vi compose/jtso/config.yml -/.../ -modules: - portal: - https: true - server_crt: "server.crt" - server_key: "server.key" -/.../ -``` - -Now copy server.key & server.crt into ./compose/grafana/cert - -```shell -cd compose/jtso/cert -sudo cp server.* ../../grafana/cert -``` -Finally, update the ./compose/grafana/grafana.ini config file like that: - -```shell -sudo vi compose/grafana/grafana.ini -[server] -# Protocol (http, https, h2, socket) -protocol = https - -# https certs & key file -cert_file = /tmp/server.crt -cert_key = /tmp/server.key -/.../ -``` - -## Incoming ports to open - -By default, the JTSO portal listen to TCP port 80 and Grafana to TCP 8080. You can also change the default JTSO & Grafana public facing port (see below) by editing ./compose/.env file before starting the stack. - -You can change public ports facing by editing the **.env** file. Two ports are exposed: -- GRAFANA_PORT: the port used to reach the Grafana portal - default is 8080 -- JTSO_PORT: the port used to reach the JTSO portal - default is 80 - -```shell -# If needed, You can change public ports facing by editing the .env file -cat .env -GRAFANA_PORT=8080 -JTSO_PORT=80 -``` - -If you change the GRAFANA public facing port you also need to update the jtso config.yml with the same port, like that: - -```shell -sudo vi compose/jtso/config.yml -/.../ -modules: - grafana: - port: 8080 -/.../ -``` - -## Outgoing ports to open - -OpenJTS will establish TCP sessions with your routing devices for reaching the following network services: -- Netconf - default is TCP port 830 -- gNMI - default is TCP 9339 - -If needed you can change these ports. - -### Netconf port - -By default OpenJTS uses the Netconf port 830. If you want to change this port you need to edit the jtso config file: - -```shell -sudo vi compose/jtso/config.yml -/.../ -protocols: - netconf: - port: 830 -/.../ -``` - -### gNMI port - -By default OpenJTS uses the gRPC port 9339. If you want to change this port you need to edit the jtso config file: - -```shell -sudo vi compose/jtso/config.yml -/.../ -protocols: - gnmi: - port: 9339 -/.../ -``` - -### gNMI with TLS - -If you want to use SSL for gNMI (**global to all routers**) you need first to create a self signed CA: **Keep the naming convention** - -```shell -cd compose/telegraf/cert -sudo openssl genrsa -out RootCA.key 2048 -sudo openssl req -x509 -new -key RootCA.key -days 3650 -out RootCA.crt -``` - -**(Optionnal)** Now, create and sign telegraf certificates if needed: - -```shell -sudo openssl genrsa -out client.key 2048 -sudo openssl req -new -key client.key -out client.csr -sudo openssl x509 -req -in client.csr -CA RootCA.crt -CAkey RootCA.key -CAcreateserial -out client.crt -days 365 - -``` - -And finally for each router - repeat these following task - to create and sign the router certificate: - -```shell -sudo openssl genrsa -out router.key 2048 -sudo openssl req -new -key router.key -out router.csr -sudo openssl x509 -req -in router.csr -CA RootCA.crt -CAkey RootCA.key -CAcreateserial -out router.crt -days 365 -cat router.crt router.key > router.pem -``` - -Upload to the router the **router.pem**, **client.crt** and **RootCA.crt** into one router folder (i.e. /var/tmp), and do this configuration on each router: - -```junos -edit exclusive -set security pki ca-profile ca1 ca-identity caid1 -set security certificates local lcert load-key-file /var/tmp/router.pem -commit and-quit -request security pki ca-certificate load ca-profile ca1 filename /var/tmp/RootCA.crt -``` - -## Configure your network devices - -For each routing device apply these config lines: - -```junos -edit exclusive - -# Netconf User -set system login user netconf_user class super-user -set system login user netconf_user authentication encrypted-password “” - -#gNMI User -set system login user gnmi_user class super-user -set system login user gnmi_user authentication encrypted-password “” - -# Clear Text gRPC -set system services extension-service request-response grpc clear-text port 9339 -set system services extension-service request-response grpc max-connections 8 -set system services extension-service request-response grpc skip-authentication - -# Or TLS encryption gRPC -set system services extension-service request-response grpc ssl port 9339 -set system services extension-service request-response grpc ssl local-certificate lcert -# Optional mutual authentication -set system services extension-service request-response grpc ssl mutual-authentication certificate-authority ca1 -set system services extension-service request-response grpc ssl mutual-authentication client-certificate-request require-certificate-and-verify - -# Netconf -set system services netconf ssh -set system services netconf rfc-compliant #optional - -commit and-quit -``` \ No newline at end of file diff --git a/INSTALL.md b/INSTALL.md deleted file mode 100644 index b915570..0000000 --- a/INSTALL.md +++ /dev/null @@ -1,75 +0,0 @@ -# Installation - - **Table of content:** - - [Home](README.md) - - [Installation](INSTALL.md) - - [Configuration](CONFIG.md) - - [Update Stack](UPDATE.md) - - [Utilization](USAGE.md) - - [Profiles documentation](PROFILES.md) - -## Install Docker & compose plugin - -https://docs.docker.com/engine/install/ubuntu/ - -```shell -sudo umask 022 - -sudo apt-get update -sudo apt-get install ca-certificates curl gnupg - -sudo install -m 0755 -d /etc/apt/keyrings -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg -sudo chmod a+r /etc/apt/keyrings/docker.gpg - -echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - -sudo apt-get update - -sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -```` - -Then login first time (requiered for downloading from docker hub): - -```shell -docker login --username -``` - -And test: - -```shell -docker run hello-world -``` - -## Installation of OpenJTS - -From root - create a username openjts - -```shell -adduser openjts -# add openjts as sudoer -adduser openjts sudo -``` - -Now, switch to openjts user -```shell -su openjts -``` - -Just clone the git repo locally. - -```shell -# In any directory -sudo mkdir JTS -cd JTS - -sudo git clone https://github.com/door7302/openjts . -``` - -Then, go in the **compose** folder and build all the containers: - -```shell -cd compose -docker compose build --no-cache -``` - diff --git a/PROFILES.md b/PROFILES.md deleted file mode 100644 index 3265bdb..0000000 --- a/PROFILES.md +++ /dev/null @@ -1,339 +0,0 @@ -# Profiles informations - - **Table of content:** - - [Home](README.md) - - [Installation](INSTALL.md) - - [Configuration](CONFIG.md) - - [Update Stack](UPDATE.md) - - [Utilization](USAGE.md) - - [Profiles documentation](PROFILES.md) - -Each profile is a set of files packed together in a tgz archive. Those tgz files are stored in compose/jtso/profile directory. This folder is monitored, if you push a new version of a profile, this will trigger an automatic update of the stack. - -## Router Health profile - -Router health KPIs: CPU, Memory, Errors, Drops... - -### Sensor path details - -![health.png](./img/sensors/health.png) - -### Dashboard screenshots - -#### Router health details - -![health1.png](./img/profiles/health/health1.png) - - (1) Select Route - (2) Current Real Time Error – monitored by the ALARMING Telegraf plugin - (3) Current chassis alarms – i.e. show chassis alarms - (4) Current RE Master/Backup CPU & Memory usage - (5) List of all MPC/FPC current CPU & Memory usage - (6) On-Change based Syslog - -![health2.png](./img/profiles/health/health2.png) - - (1) Details of the current chassis alarms - (2) All past/active MPC/FPC CMERROR - (3) All current router alarms – monitored by the ALARMING Telegraf plugin - (4) Details of all current router alarms – monitored by the ALARMING Telegraf plugin - -![health3.png](./img/profiles/health/health3.png) - - (1) History of CPU/Memory usage of Nominal/Backup RE - (2) History of CPU/Memory usage of all MPC/FPC - -![health4.png](./img/profiles/health/health4.png) - - (1) History of CPU consumption of all RE Master Processes - (2) History of CPU usage of each RE Master cores - (3) History of Memory consumption of all RE Master Processes - -![health5.png](./img/profiles/health/health5.png) - - (1) History of per FPC/MPC Fabric drops - (2) History of per FPC/MPC input Fabric rate (pps) - (3) History of per FPC/MPC output Fabric rate (pps) - -#### NPU Statistics - -![hw-mon1.png](./img/profiles/health/hw-mon1.png) - - (1) Select HW component – depends on the type of Linecard - (2) Select the HW property(ies) - -![hw-mon2.png](./img/profiles/health/hw-mon2.png) - - (1) Provide Router information - (2) Recall current chassis alarms - (3) Display the HW KPI over the time - (4) Display the current HW KPI value - -## BGP profile - -BGP KPIs: peer-groups, families and peers statistics. - -### Sensor path details - -![bgp.png](./img/sensors/bgp.png) - -### Dashboard screenshots - -![bgp1.png](./img/profiles/bgp/bgp1.png) - - (1) Filter per Router, per Routing-Instance, per Peer-Group, per Family and Per Neighbor - (2) Per Peer-Group (Instance / Name) number of active paths - (3) Per Peer-Group Received/Installed/Sent prefixes - (4) Per family number of active paths - (5) On-Change BGP events - -![bgp2.png](./img/profiles/bgp/bgp2.png) - - (1) Per neighbor detailed info - (2) For each neighbor: peer name, peer AS, Current session state, Input&Output queues - (3) Per family prefix-limit if configured - (4) History over the time of routes received, installed, rejected by policy, sent - (5) Per Family route details - -## Traffic/CoS profile - -Traffic KPIs: peer queue statistics, per port statistics, queue-depth, drop per queue/port... - -### Sensor path details - -![traffic.png](./img/sensors/traffic.png) - -### Dashboard screenshots - -#### Physical Interfaces Traffic - -![traffic1.png](./img/profiles/traffic/traffic1.png) - - (1) Filter per router, physical interfaces - (2) Current real-time traffic alarms (RED, TAIL, CRC) drops - monitored by the ALARMING Telegraf plugin - (3) Overall traffic distribution – per Queue - (4) Details of each real-time traffic alarms (point 2) - -![traffic2.png](./img/profiles/traffic/traffic2.png) - - (1) For each port port statistics – In/Out in bps and pps - (2) For each port – per queue drops (red & tail) over the time - -![traffic3.png](./img/profiles/traffic/traffic3.png) - - (1) Real time per Queue Depth utilization – current usage - (2) Real time per Queue Depth utilization – peak usage - (3) Traffic distribution per queue for the given port - (4) Queued traffic per queue – in Bps - (5) Real Forwarded traffic per queue – in Bps - -![traffic4.png](./img/profiles/traffic/traffic4.png) - - (1) Queued traffic per queue – in Bps - (2) Real Forwarded traffic per queue - in Bps - (3) Queued traffic per queue – in pps - (4) Real Forwarded traffic per queue - in pps - -#### Logical Interfaces Traffic - -![unit1.png](./img/profiles/traffic/unit1.png) - - (1) Select physical port and unit(s) - (2) Port statistics - (3) Input traffic load sharing per unit - (4) Ouput traffic load sharing per unit - -![unit2.png](./img/profiles/traffic/unit2.png) - - (1) Per unit traffic in Bps and PPS - -#### VoQ System (PTX Only) - -Need specific configuration on the device to enable the feature. - -![voq1.png](./img/profiles/traffic/voq1.png) - - (1) Filter per router, physical interfaces - (2) Current real-time traffic alarms (RED, TAIL, CRC) drops - monitored by the ALARMING Telegraf plugin - (3) Overall traffic distribution – per Queue - (4) Details of each real-time traffic alarms (point 2) - (5) For each port port statistics – In/Out in bps and pps & traffic types - (6) Traffic distribution – per queue – for a specific port - -![voq2.png](./img/profiles/traffic/voq2.png) - - (1) Forwarded traffic per egress queue in Bps and PPS - (2) Egress Queue drops - -![voq3.png](./img/profiles/traffic/voq3.png) - - (1) Real time per VoQ Depth information – Current / Average and Peak - (2) History graphs for VoQ Depth - -## Optic profile - -Optic KPIs: Optic levels, Physical errors, per optic details... - -### Sensor path details - -![optic.png](./img/sensors/optic.png) - -### Dashboard screenshots - -![optic1.png](./img/profiles/optic/optic1.png) - - (1) Filter per router and per physical port - (2) Real-time CRC/BLOCK error alarms – monitored by the ALARMING Telegraf plugin - (3) Details of each CRC/BLOCK error alarms over the time - (4) Per port – per lane Current TX, RX, BIAS values - -![optic2.png](./img/profiles/optic/optic2.png) - - (1) Per port Optic Alarms - -![optic3.png](./img/profiles/optic/optic3.png) - - (1) Inventory information - (2) For each physical port/optic – per Lane current RX - (3) For each physical port/optic – per Lane current TX - (4) History over the time of each lane RX/TX + low/high warning threshold - (5) History over the time of optic BIAS and temperature - (6) History over the time of the CRC and BLOCK errors - (7) Input frame size distributions over the time - -![optic4.png](./img/profiles/optic/optic4.png) - - (1) OTN Specific information - (2) Frequency and Carrier Frequency Offset - (3) History over the time of OSNR and ESNR - (4) History over the time of pre-fec engine - (5) History over the time of Chromatic Dispersion - (6) History over the time of SOPDM - (7) History over the time of PDL - -## Power - -Power KPIs: per component power usage, global usage, temperature, fan state... -Provide also the overall input traffic view and the ratio Watts per Gbps. - -### Sensor path details - -![power.png](./img/sensors/power-ext.png) - -### Dashboard screenshots - -#### Per router Power consumption - -![power1.png](./img/profiles/power-ext/power1.png) - - (1) Chassis information - (2) Configured Ambient Temperature - (3) Overall chassis power information - (4) In case of multi-zone Chassis – overall zone power information - -![power2.png](./img/profiles/power-ext/power2.png) - - (1) Total chassis input traffic in Bps - (2) Total chassis input traffic in Pps - (3) Ratio Watts per Gbps. - -![power3.png](./img/profiles/power-ext/power3.png) - - (1) History over the time of the overall chassis power consumption - (2) Per components power consumption – over time - -![power4.png](./img/profiles/power-ext/power4.png) - - (1) Per component temperature over the time - -![power5.png](./img/profiles/power-ext/power5.png) - - (1) Per MPC/FPC current power consumption - (2) History over the time of each MPC/FPC power consumption - (3) Per FAN current power consumption - (4) History over the time of each FAN power consumption - -![power6.png](./img/profiles/power-ext/power6.png) - - (1) Per FAN current FAN Speed - (2) History over the time of each FAN speed - -![power7.png](./img/profiles/power-ext/power7.png) - - (1) Per CB/Fabric/RE current power consumption - (2) History over the time of each CB/Fabric/RE power consumption - (3) Per PEM/PSM current power consumption - (4) History over the time of each PEM/PSM power consumption - -#### Power aggregation Dashboard - -![power8.png](./img/profiles/power-ext/power8.png) - - (1) Total of power consumption - (2) Per Model power consumption - (3) History over the time of the total power consumption - (4) History over the time for each chassis model of the total power consumption - -## Firewall profile - -FWF KPIs: per firewall term counters, per policer drop counter... - -### Sensor path details - -![filter.png](./img/sensors/filter.png) - -### Dashboard screenshots - -![filter1.png](./img/profiles/filter/filter1.png) - - (1) Select per router, per filter, per counter & policer history - (2) PPS view – Counters are displayed as positive Y and Policer out-of-spec counters as Negative Y - (3) BPS view – Counters are displayed as positive Y and Policer out-of-spec counters as Negative Y - -## DDOS profile - -DDOS protection KPIs: Support per MPC DDOS protection statistics -Currently, only supported for MX & PTX - -### Sensor path details - -![ddos.png](./img/sensors/ddos.png) - -### Dashboard screenshots - -![ddos1.png](./img/profiles/ddos/ddos1.png) - - (1) Filter per router, per protocol and sub protocol - (2) Global Dashbord - Display for the last 15 minutes the router(s) under DDOS Policer Violation - (3) Per Protocol Details for the selected router - (4) Current (aggregated) protocol stats (Received, Dropped & Punted to RE) - (5) History of received pps, per Linecard, for a given protocol and one or several sub-protocol. - (6) History of dropped pps, per Linecard, for a given protocol and one or several sub-protocol. - (7) History of punted pps, per Linecard, to the RE for a given protocol and one or several sub-protocol. - - -## SR MPLS profile - -SR MPLS KPIs: SR MPLS Traffic per interfaces, per SID, ingress egress - need specific configuration on the device to enable the feature - -### Sensor path details - -![srmpls.png](./img/sensors/srmpls.png) - -### Dashboard screenshots - -#### Per Interface SR MPLS Stats - -![srmpls1.png](./img/profiles/srmpls/srmpls1.png) - - (1) Filter per router, physical interfaces - (2) SR MPLS in/out Bps/Pps per interface - (3) The percentage of SR MPLS traffic relative to other traffic (on this interface) - -#### Per LABEL (SID) SR MPLS Stats - -![srmpls2.png](./img/profiles/srmpls/srmpls2.png) - - (1) Filter per router, MPLS LABEL (derived from SID) - (2) Traffic load per SID (LABEL) - (3) Traffic in PPS and BPS per SID (LABEL) diff --git a/README.md b/README.md index 000ba02..632114d 100644 --- a/README.md +++ b/README.md @@ -4,64 +4,24 @@ ## Disclaimer -This project is a "side time project" supported in 'best-effor' :) and I'm not a software developper, so be indulgent with me :). - -## SUPPORTED USE CASES (Profiles) - -Today OpenJTS supports: - -- **HEALTH PROFILE**: Monitoring the health of the router - many environmental data. -- **TRAFFIC PROFILE**: Monitoring of traffic and traffic error including queue drops, VoQ, Queue depth (depends on HW), and many other traffic KPI for Physical and Logical interfaces. -- **BGP PROFILE**: BGP statistics per neighbor, family, peer-group routing statistics, including on-change session events. -- **DDOS PROFILE**: Monitoring of the DDOS Protection statistics -- **FILTER PROFILE**: Monitoring of all your firewall filter counters and policers at PFE and port levels. -- **POWER PROFILE**: Monitoring of the power consumption of each active chassis components. Include temperature and Fan speed monitoring. Include an aggregated view. -- **OPTIC PROFILE**: Moniroting of the optic KPIs: level, alarms. Support OTN optics. ZR/ZR+ dedicated dashboard. -- **SRMPLS PROFILE**: Monitoring of SR MPLS traffic: per interface and per label (SID) - -> Note: Depending the platform and the version you may have access to more of less information. Also, some profiles are not supported on some PF/Version. Please refer to the "doc" menu from the JTSO portal. - -> Note 2: Some statistics requiere specific device configuration. +This project is a "pet project" supported in 'best-effor' :) and I'm not neither a software developper nor a vibe-coder, just a Network Engineering doing some coding :-) so be indulgent with me :-). ## Quick Overview -Embark on a journey to discover and embrace Juniper Telemetry solution with this simple project. Designed for effortless adoption, this all-in-one tool is here to demystify gRPC Telemetry on Juniper routing products. We currently support PTX 10K, MX (vMX, Neo and 10K platforms) & ACX 7K platforms. Junos/EVO 20.1 and onwards are supported. - -Feel free to open issue if you experience some troubles for a given HW or SW version. The profiles have been tested with recent Junos releases so some older versions may use different "counters" naming - especially when OpenConfig models are used. I can easily patch a profile, in minutes, without touching the code. Moreover, if you want I develop a new profile for a new use case, don't hesitate to also open an issue. - -This project is made around 3 main repos: - -- OpenJTS: https://github.com/door7302/openjts - provides the infra for deplying the stack and includes all theh profiles -- JTSO: https://github.com/door7302/jtso - the source code of the jtso component -- JTS Telegraf: https://github.com/door7302/jts_telegraf - a fork of the telegraf project which includes several plugins and enhancements for OpenJTS. - -All comments, remarks, ideas are welcome. you can reach out to me here: **door7302@gmail.com** - -## Getting Start - - **Table of content:** - - [Home](README.md) - - [Installation](INSTALL.md) - - [Configuration](CONFIG.md) - - [Update Stack](UPDATE.md) - - [Utilization](USAGE.md) - - [Profiles documentation](PROFILES.md) - -## Presentation - -This is a repo to build from scratch a Telemetry stack to monitor any Juniper Routing Devices. - -This stack has the codename "JTS" which stands for Juniper Telemetry Stack +Discover and adopt Juniper gRPC telemetry with this all-in-one, easy-to-deploy project. -This stack relies on OpenSource software solutions such as **Telegraf** for collecting gNMI Telemetry state data (it also supports Netconf input plugin for data not yet available through Telemetry) and pre-processing the data, **InfluxDB** as a Time Series Database to store data, **Kapacitor** to aggregate and perform Alarming and finally **Grafana** to display contents. A specific piece of software developed by Juniper and called **JTSO**, which stands for JTS Orchestrator, is also present in the stack (Dev. in **GOLANG**). This piece of software developed by TME AWAN Team has 2 main roles: the first one is to manage the Stack (provision routers IP, select the pre shipped profils) and on the other hands provide an Enricher tool to enrich on-the-fly telemetry data for better visualization and aggregation). +JTS is designed to simplify the deployment and understanding of Juniper Telemetry on routing platforms. +Multiple platforms are supported, although some profiles may not yet be fully qualified on every platform. -JTS is pre-filled with templates of configuration and dashbords for typical use cases. Those profiles are tgz files store in **compose/jso/profiles directory** +- Supported Junos versions: **20.1 and later (including Junos EVO)** -JTS relies on Docker Compose to deploy in one command this stack. Please be sure you have done all the prerequisites before. +If you experience issues with specific hardware or software versions, please open a GitHub issue. -JTS has only been validated for Ubuntu/Debian Host OS. +Profiles are tested against recent Junos releases. Older versions may use different counter names (especially when OpenConfig models are involved). +Profiles can be patched quickly without modifying the core code. -{- Notice: Currently JTS uses a specific build of Telegraf which offers more functionalities (dev. by Juniper). Juniper will continue to push these enhancements to the official Telegraf project -} +If you need a new profile for a specific use case, feel free to open an issue — contributions and ideas are welcome. -![jts.png](./img/JTS.png) +## Documentation +Doc has moved here: https://door7302.github.io/openjts/ \ No newline at end of file diff --git a/UPDATE.md b/UPDATE.md deleted file mode 100644 index 1fb9e95..0000000 --- a/UPDATE.md +++ /dev/null @@ -1,47 +0,0 @@ -# Update the stack - - **Table of content:** - - [Home](README.md) - - [Installation](INSTALL.md) - - [Configuration](CONFIG.md) - - [Update Stack](UPDATE.md) - - [Utilization](USAGE.md) - - [Profiles documentation](PROFILES.md) - -## Update JTS containers - -To update the stack - first of all stop the stack: - -```shell -docker compose down -``` - -Then issue a git pull: - -```shell -git pull - -# if errors occured you can issue a stash before: - -git stash -git pull -``` - -Remove old images: - -```shell -docker image rm jtso -f -docker image rm jts_telegraf -f -``` - -Finally, rebuild the containers - -```shell -docker compose build --no-cache -``` - -And finally restart the stack - -```shell -docker compose up -d -``` diff --git a/USAGE.md b/USAGE.md deleted file mode 100644 index e37cc88..0000000 --- a/USAGE.md +++ /dev/null @@ -1,177 +0,0 @@ -# Start OpenJTS - - **Table of content:** - - [Home](README.md) - - [Installation](INSTALL.md) - - [Configuration](CONFIG.md) - - [Update Stack](UPDATE.md) - - [Utilization](USAGE.md) - - [Profiles documentation](PROFILES.md) - -## Start the stack - -To start the JTS you just need to deploy each docker by using **docker compose up** command. - -You can start the OpenJTS with the following command: - -{- The first time you bring up the stack, it may take slightly more time as we need to build on-the-fly Telegraf -} - -```shell -# Bring up the stack with one Telegraf Instance -sudo docker compose up -d -``` - -You may want to check if dockers are up and running. For that, just issue the following command: - -```shell -sudo docker compose ps -``` - -Note: Telegraf docker(s) are only started if there is at least one router assigned to the Telegraf instance. - -## JTS logs - -JTS writes its logs into **/var/log/jtso.log** - -## Stop JTS - -To stop the JTS just issue the following command: - -```shell -# Shutdown the stack -sudo docker compose down -``` - -## Manage the stack via JTSO - -Once launched you should have access to the JTSO portal (http or https). Open a web browser and open the portal: **http(s)://your-ip:your-port/index.html** -You should have access to this page - this one provide the state of the OpenJTS stack. You can also empty the InfluxDB database by clicking on the "EmptyDB" button. You may also access directly to Chronograf (for managing InfluxDB or Kapacitor) by clicking on the related button. - -![jtso-main.png](./img/jtso-main.png) - -On top right of the page, you can switch to the dark theme, if prefered. - -![jtso-dark.png](./img/jtso-dark.png) - -Each Telegraf container displays 2 indicators: - -- The left number supplies the number of routers collected by the container -- The right "D" button is a button which allows you to enable Telegraf Debugging. By clicking on this button the related container is automatically restarted in debug mode. Debug is enabled when the "D" button is in Red. Make sure to use Debug only for troubleshooting purposes as it requires a lot of disk space (huge file(s) may be generated): - -![jtso-debug.png](./img/jtso-debug.png) - -## Configure credentials - -Go to the menu **"Admin > Credentials"** - -First step is to fill the Netconf/gNMI user/pwd you configured on your routing devices. Remember, the credentials are the same for all routers. -You can also indicate to the stack that you want to use TLS/SSL for gNMI. Once again this is for all routing devices. It means either you'll use TLS for all routers or you'll use clear text mode for all devices. By default TLS is disabled, skip-verify is enabled and client-side TLS authentication is disabled. - -![jtso-cred.png](./img/jtso-cred.png) - -## Configure your inventory - -Go to the menu **"Routers"** - -Here you must fill for each router: -- a unique short name (internal use only) -- the IP or hostname of the remote device - -Automatically, the JTSO will open a Netconf session to the device to retrieve some facts like the chassis model & version. - -![jtso-rtrs.png](./img/jtso-rtrs.png) - -There are a few actions available: - -- You can import your inventory thanks to a CSV file. Each line of this file must contain: [shortName];[HostName] -- You may for the refresh of a given router by clicking on the refresh button (see Actions column) -- you can remove a given router by clicking on the remove button (see Actions column) - -A router could not be removed if it is associated to a profile. - -## Navigate in the profiles DOC - -Go to the menu **"DOC"** - -Here you will find some information regarding the profiles: -- Which sensors/counters used to build the profile -- Some detail about the config files (telegraf, kapacitor) -- The Dashboards shipped with the profile - -![jtso-doc.png](./img/jtso-doc.png) - -You can click on the "collector" config to have more information about the Telegraf configuration. This file is a json's JTSO file that will be rendered as Telegraf's TOML config file further. - -![jtso-config.png](./img/jtso-config.png) - -## Assign router to profile(s) - -Go to the menu **"Profiles"** - -Here you can assign/remove one or several profiles to a given router. Each time you add/remove a router in this page, the stack will be re-configured automatically. - -![jtso-profile.png](./img/jtso-profile.png) - -You may also choose to configure router/profiles associations by importing a CSV file. The format of each line of this line must be: [shortName];[profileName1];[profileName2];... - -## Browse a sensor path - -Go to the menu **"Tools > Gnmi Browser"** - -Here you need to select a router and to fill a well-known sensor path. The "Merge" option allows better analysis by replacing numeric key by a "X". For full Xpath view you need to unselect the "Merge" option - -![jtso-browser.png](./img/jtso-browser.png) - -The analysis takes about a minute. You should see the number of XPATHs extracted from the sensor in real time: - -![jtso-xpaths.png](./img/jtso-xpaths.png) - -You can export the full Xpaths list if needed by clicking on the "Export Xpaths" button - a new tab will open automatically: - -![jtso-export.png](./img/jtso-export.png) - -Then, the result is displayed as a tree view. You can expand or collapse the tree via the respective buttons. You can also search in tree - search results are highlighted in red. - -![jtso-search.png](./img/jtso-search.png) - -## Check Stack performances - -Go to the menu **"Admin > Stack Util. & Logs"** - -Here is where you can monitor CPU and Memory consumption of each running container: - -![jtso-stats.png](./img/jtso-stats.png) - -You may also display the latest container's logs by clicking on the associated button: - -![jtso-logs.png](./img/jtso-logs.png) - -## Manage Influxdb - -Go to the menu **"Admin > Manage InfluxDB"** - -By clicking on this menu, you will have access to the Chronograf page for managing InfluxDB "measurements": - -![influx-mgt.png](./img/influx-mgt.png) - -## Manage Kapacitor - -Go to the menu **"Admin > Manage Tick Scripts"** - -By clicking on this menu, you will have access to the Chronograf page for managing Kapacitor Tick Scripts: - -![kapa-list.png](./img/kapa-list.png) - -You may want to view or edit a given script: - -![kapa-code.png](./img/kapa-code.png) - -## Use Grafana Dashboard(s) - -Go to the menu **"Grafana"** - -By clicking on the Grafana menu you will have directly access to the Grafana portal. - -![grafana.png](./img/grafana.png) - -Enjoy.... \ No newline at end of file diff --git a/compose/.env b/compose/.env index 185733b..31ee3ef 100644 --- a/compose/.env +++ b/compose/.env @@ -1,3 +1,4 @@ GRAFANA_PORT=8080 CHRONOGRAF_PORT=8081 -JTSO_PORT=80 \ No newline at end of file +JTSO_PORT=80 +APP_SECRET="DEFAULT_APP_SECRET_CHANGE_ME" \ No newline at end of file diff --git a/compose/.version b/compose/.version index b01de29..867e524 100644 --- a/compose/.version +++ b/compose/.version @@ -1 +1 @@ -1.1.16 \ No newline at end of file +1.2.0 \ No newline at end of file diff --git a/compose/docker-compose.yml b/compose/docker-compose.yml index b8a1fad..c93f38f 100644 --- a/compose/docker-compose.yml +++ b/compose/docker-compose.yml @@ -194,6 +194,21 @@ services: - ./telegraf/cert:/var/cert command: --config-directory /etc/telegraf/telegraf.d + telegraf_ondemand: + image: jts_telegraf:latest + container_name: telegraf_ondemand + restart: always + user: root + depends_on: + - telegraf_mx + - influxdb + volumes: + - /var/log:/var/log + - ./telegraf/ondemand:/etc/telegraf/ + - ./telegraf/metadata:/var/metadata + - ./telegraf/cert:/var/cert + command: + --config-directory /etc/telegraf/telegraf.d kapacitor: image: kapacitor:1.7 container_name: kapacitor @@ -202,7 +217,7 @@ services: depends_on: - influxdb ports: - - '9092:9092' + - '9292:9292' environment: - KAPACITOR_AS_ROOT=true volumes: @@ -216,7 +231,7 @@ services: - '${CHRONOGRAF_PORT}:8888' environment: - INFLUXDB_URL=http://influxdb:8086 - - KAPACITOR_URL=http://kapacitor:9092 + - KAPACITOR_URL=http://kapacitor:9292 depends_on: - influxdb - kapacitor @@ -244,18 +259,22 @@ services: - ./grafana/data:/var/lib/grafana - ./grafana/plugins:/var/lib/grafana/plugins jtso: - build: https://github.com/door7302/jtso.git#v1.0.19 + build: https://github.com/door7302/jtso.git#v1.1.0 image: jtso:latest container_name: jtso restart: always user: root + environment: + - APP_SECRET=${APP_SECRET} volumes: + - appdata:/data - /var/log:/var/log - ./jtso/db:/etc/jtso - ./jtso/config.yml:/etc/jtso/config.yml - ./.version:/etc/jtso/openjts.version - ./jtso/cert:/var/cert - ./jtso/profiles:/var/profiles + - ./jtso/ondemand:/var/ondemand - ./jtso/active_profiles:/var/active_profiles - ./telegraf:/var/shared/telegraf - ./telegraf/metadata:/var/metadata @@ -263,3 +282,5 @@ services: - /var/run/docker.sock:/var/run/docker.sock ports: - '${JTSO_PORT}:8082' +volumes: + appdata: \ No newline at end of file diff --git a/compose/influxdb/influxdb.conf b/compose/influxdb/influxdb.conf index 2b1a424..05e2949 100644 --- a/compose/influxdb/influxdb.conf +++ b/compose/influxdb/influxdb.conf @@ -8,7 +8,7 @@ max-series-per-database = 2000000 max-values-per-tag = 500000 [wal] -wal-fsync-delay = "5ms" +wal-fsync-delay = "10s" [compaction] compact-full-write-cold-duration = "2h" @@ -26,10 +26,10 @@ compact-full-write-cold-duration = "2h" wal-dir = "/var/lib/influxdb/wal" max-series-per-database = 0 max-values-per-tag = 0 - cache-max-memory-size = "4g" - cache-snapshot-memory-size = "128m" + cache-max-memory-size = "12g" + cache-snapshot-memory-size = "256m" cache-snapshot-write-cold-duration = "5m" - wal-fsync-delay = "10ms" + wal-fsync-delay = "10s" compact-full-write-cold-duration = "2h" [http] @@ -39,7 +39,7 @@ compact-full-write-cold-duration = "2h" write-tracing = false [monitor] - store-enabled = false + store-enabled = true [tsm1] compact-throughput = "1g" diff --git a/compose/jtso/cert/server.crt b/compose/jtso/cert/server.crt deleted file mode 100644 index 51ffb71..0000000 --- a/compose/jtso/cert/server.crt +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFETCCAvkCFDp50fV9ns5TgUE0mMYcfCGBFbAkMA0GCSqGSIb3DQEBCwUAMEUx -CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl -cm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMjMxMjA0MTMwNjE1WhcNMjQxMjAzMTMw -NjE1WjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UE -CgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIICIjANBgkqhkiG9w0BAQEFAAOC -Ag8AMIICCgKCAgEAq8GcBILtyU/yHi+a5tmvo05YysgqOIKTnrd1E4k/NxxzfH1l -aVlwiU0VFwIAVlYR44q6gUED4atjyoRkUpZDw7wkpKG4zUxU+v0avuURfJ0TY2Sm -afozPnWVtSOKEZC0QOYmVxlVOjaXNWjefqJ9IFV+gdqDsZMgGjLxzrW4WWMKYPRK -hIuEr+3NhL2WvGMpGAOAt6AHyefLF8uo7hajR4yNexZo3AQoZFtDmV5W353LkW6p -YwHRtXfRp4+WbTVVnO6L6N6uq+Rz95vSM6RkfimbsDK1IeC1ggPTnoNk/KGZNIz2 -myKWngZeUhaaiI9mLV3HrJIh4fOFdicO27Ac4I2JknpGBn9Tj09RSYM8eVO4JE3A -mj+lZ/+UAC6OE2rPQprykV9jDgmxPaO0wgbjFM8OoYqvFzIUfNOS2OJ+E7gkdWwL -LZB1BWb9uRRFm2cs4cC4EW+/Pb+csiUL0cELtE74a3UrPrpvnIOq4E1yqKoI096/ -rjwf2l0hgCic4pnu8TJ4g20gHA3VthdyVp8C0pDwrtPK8TaIyyx94WtAokLgUQa6 -h0fZjSXSfCnkbHIBLAUsNgOzkbtNnnw+oB+xdI3rjh2b7r0bCcF9pDYW4iY/gy8j -F3zaVO+K9+C05jiL1ZMNj+ng0EWAKe+f365hJwVMJRAndRqh9DIfoH+R9NUCAwEA -ATANBgkqhkiG9w0BAQsFAAOCAgEAbnBG1+sCflbtDkIqsWgJ3kimfHQgiXhti3ss -l/8t968H9EiKhD9qX5v4lDcfUbMiObrVsG4sjrze47D/1tKYROe+PNbg/YtWXm6k -52bXzBX7hn/If+VRF4aCQW9B0MPzkcp9zrg6/U6amAylcihhkOPw72qrGBZ7uuBS -hh8l2ZSHvZk3ToRMRyfiy5yiIEv3oLRdZHdHDDr2HJtOxOQvgqSOZ5BxAiEd8ZZ9 -5sRNNcmOhzGs/dVXGtwCKuoQZe60OEazWCpZ/3FDWWid5G97uSRpuwu6SOWDPaC6 -9cJpaYi2vbeyNDCA6lYQD09RGZ+b/SdhtY3x0CewSIklNfyDhKtDkNm0eiGRjlwc -GdyeSfjo30lvMldrgX2KdJD4+r830gM+39KOKoKdmG4nupZFgPdTym7i2sYPbsJK -dyTfHXbiaGNl4+Kq57F/M3VB++dE4cXRTqr7loO/7154V+mHJaztf/TGs6u8S5SQ -WNiE20Ov2IFCnC25zxZQOtX0Jo9gEPPgG/nWN7mS6UoNvDmZV9R8HqqHWehGKybX -L8fE+ux5zHlrDFBwAU0RBw2BH5uAPz9Ncyo1HDfJMcUA5y538+BDbKQ2Y9Ce8uIk -ZITqEbCHxFvvsPDXl2zIb7YnSo0m8DM31kL3prRHPutY9JZe0bYUWjWzN00iL5eh -CkhiAtA= ------END CERTIFICATE----- diff --git a/compose/jtso/cert/server.csr b/compose/jtso/cert/server.csr deleted file mode 100644 index 94402c2..0000000 --- a/compose/jtso/cert/server.csr +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIEijCCAnICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx -ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAKvBnASC7clP8h4vmubZr6NOWMrIKjiCk563dROJ -Pzccc3x9ZWlZcIlNFRcCAFZWEeOKuoFBA+GrY8qEZFKWQ8O8JKShuM1MVPr9Gr7l -EXydE2Nkpmn6Mz51lbUjihGQtEDmJlcZVTo2lzVo3n6ifSBVfoHag7GTIBoy8c61 -uFljCmD0SoSLhK/tzYS9lrxjKRgDgLegB8nnyxfLqO4Wo0eMjXsWaNwEKGRbQ5le -Vt+dy5FuqWMB0bV30aePlm01VZzui+jerqvkc/eb0jOkZH4pm7AytSHgtYID056D -ZPyhmTSM9psilp4GXlIWmoiPZi1dx6ySIeHzhXYnDtuwHOCNiZJ6RgZ/U49PUUmD -PHlTuCRNwJo/pWf/lAAujhNqz0Ka8pFfYw4JsT2jtMIG4xTPDqGKrxcyFHzTktji -fhO4JHVsCy2QdQVm/bkURZtnLOHAuBFvvz2/nLIlC9HBC7RO+Gt1Kz66b5yDquBN -cqiqCNPev648H9pdIYAonOKZ7vEyeINtIBwN1bYXclafAtKQ8K7TyvE2iMssfeFr -QKJC4FEGuodH2Y0l0nwp5GxyASwFLDYDs5G7TZ58PqAfsXSN644dm+69GwnBfaQ2 -FuImP4MvIxd82lTvivfgtOY4i9WTDY/p4NBFgCnvn9+uYScFTCUQJ3UaofQyH6B/ -kfTVAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAgEAqSIbUFd8uUEaxiZymCFvs0ln -rupeKvZEQ14UBAZotCO7SAWoP6EbvNLwlds8wyp7iFcdH/+2uUxQwnJ7JtLP5PX3 -ew6l/xyEfc5yUIrVeOTzQUapzhuuxMcIwUsBHSawv/k3XkwkvJmit4B1PANlg62l -vbikz2mJPXXwF/YBO/TqpJDv0PeD7DRNx43CC6rUSyDmpGfqaeKk406z1BBkoY7h -5WXRdE+9kb6z2SRqu+X3glDTyWYXvworPWnxLvHa6eTRWn+4gwSEBBSjaM7F/B6u -5++h9MvceNiIwCQg0H6dfE0j0ZL5xlfL+HKPAAUME8FthmNd8OY4xzWGi6IKIfCW -VXCpWJkGi6AxrmH8drrvs3Dxhu9x0rY2hRcdDYIm8D6HF8EvJ2MxnYy60UldNtOy -fwBqzI6tGO0lk54NbxTPQbVNkBM9BA8JRYL84c0Devvx7iDEAprZ3QJhlEvIvYdv -MZhcxjEa6oLkcVjmCDbkdJBxviNO7ftZec6pZnjoBlCmCUTQhgFYRxSYBpwMtwAt -XqoLUOj/AX+TybE/rwZbLg7PVvY8ODEwPfva/dRZD5BPbpGVAKrzmpjzVqkrNQKE -TwYBeXXl98dN6GHW5Q4EZrpdas1lGBczWKuTySFsDt389WwO7zZhaxGvbm2G6wA4 -tKOS6M3rmr8W/GQ6bIs= ------END CERTIFICATE REQUEST----- diff --git a/compose/jtso/cert/server.key b/compose/jtso/cert/server.key deleted file mode 100644 index a405603..0000000 --- a/compose/jtso/cert/server.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQCrwZwEgu3JT/Ie -L5rm2a+jTljKyCo4gpOet3UTiT83HHN8fWVpWXCJTRUXAgBWVhHjirqBQQPhq2PK -hGRSlkPDvCSkobjNTFT6/Rq+5RF8nRNjZKZp+jM+dZW1I4oRkLRA5iZXGVU6Npc1 -aN5+on0gVX6B2oOxkyAaMvHOtbhZYwpg9EqEi4Sv7c2EvZa8YykYA4C3oAfJ58sX -y6juFqNHjI17FmjcBChkW0OZXlbfncuRbqljAdG1d9Gnj5ZtNVWc7ovo3q6r5HP3 -m9IzpGR+KZuwMrUh4LWCA9Oeg2T8oZk0jPabIpaeBl5SFpqIj2YtXceskiHh84V2 -Jw7bsBzgjYmSekYGf1OPT1FJgzx5U7gkTcCaP6Vn/5QALo4Tas9CmvKRX2MOCbE9 -o7TCBuMUzw6hiq8XMhR805LY4n4TuCR1bAstkHUFZv25FEWbZyzhwLgRb789v5yy -JQvRwQu0TvhrdSs+um+cg6rgTXKoqgjT3r+uPB/aXSGAKJzime7xMniDbSAcDdW2 -F3JWnwLSkPCu08rxNojLLH3ha0CiQuBRBrqHR9mNJdJ8KeRscgEsBSw2A7ORu02e -fD6gH7F0jeuOHZvuvRsJwX2kNhbiJj+DLyMXfNpU74r34LTmOIvVkw2P6eDQRYAp -75/frmEnBUwlECd1GqH0Mh+gf5H01QIDAQABAoICAA3cywRcMuf4IWEJU5XFRRVH -qgf33tx/wX1ibjsc7TK8A6AtGMXHd7tFMuoP+cn+GWSFmmb7Qd5xcFT0mYpG4YJH -SafV+63qNsOpMQLuRxqJLPrtMTdFf+RPJj2f+DFRvhKs4LRP8Z6IsGyZobeT0siM -zfCaG931s3YZ3YVjClWAlmJb5TXMcvGmHlvT13ouAK+U/MsVSfukTzKE+AX7YsNQ -F00zclQrq7zp1stmn1leCYOb7GT2zR+543yELM50qwvG/xjU/EEYZ7m45F7RqmC6 -Z/vxI8hvtAah228kSL7RJiXlKLQ9tu1bMzqp42AZPtRziL2nb7+mYYO3RE476SCe -fzJOVfsdYKpyNC4X+aoI04RZoFVAF2ZYlVlt6rlcbYh34DQPzBxQ7WCHPhEb2Wj3 -l/d190Q0uNGl3riAfFjErwcdJzNYG1iXwxd7rtjknZZQPUfav/sdSq44CdW/iPLi -Vo2DqE15Vrt3j28tk43YDAHj6Qv1NxP6mEJA1IWWNMhNPOjCygDgncDA6u2VDPnc -op3Ol6DdEeyZPk9glumI3BNyZES74RTfTf1xb/tyCoY8KcmXwX7SSM2sUAyc3cpZ -XAx89IijKXZ/5WjFSPLXcagIUNbpwV27aY//xem8ZEPgaytoyD6+WFeW6ycAHvQT -J6eNhE+y6R8Ef6EchrqhAoIBAQDthjiNH1C+prpRdz5VRL4u43feZ6rQila+CX2/ -dTwqXmUmYdDcHspvgtMmGVthw+2zfnY4WGwMF+t5cqLu+vwZYrMgjOA1hrr7Fgzq -avKUx5kQgZDYLuk7UGaHd7MvyqO7HKQLc7+E8NUjDSd4a8chMljmsxY6JQRt38uV -TzgR3UnkjJqed/PcLwnswyvs/mWOTGvvOpvx6aACdLwckJBmKf5BXUfqADSSzthz -PyFRFrbqJ6mQd6V1NCLcZ21ulidaApH7/PCl7mdAM4PQUyS8u91KdQ4YnSzQaHqy -XfPzsmopz6pktYA7iT9LyUHwTh5x7ENFJaV62bjBrYWtJlclAoIBAQC5HcMFQ3we -JE937dLvD/Qh+Qk038DUoxFzTwctGWh8b16oV74RkmvFRSpC0sZz0+EA2c3Fop7b -HTG1e6Ps1yvM8C6mFCp+chFzvInJq/nj0d4mJ1lpnjoUEtKP51NTx4q4O4RSzy5m -7G7wxgzNP3AJcBkQcdkpo9sCDDWAtJBWWLmrnAE23mDvPjZViBwav0s5KawsDOk8 -EMxkrI4Rt34px8GBsZlIUiiqfmmjv/2R7RTuGoJCo3EpGm3At1Tpwsu7Qmg6QSUQ -wb2Q812QGh+wZJPqNBAv1bUEq8w495oxx9BiV8YD/PJDjcBaF7cQw6Ci3/sYw8Ew -3Ple2JTsB8/xAoIBAANBLZExdqfGHRN0sNP2RyzZTREtFngZDSs5chGnh5WFCZnH -CVeazGdOwZnqCwiB6MXm27PV8lUQFtfpLDZeFgo7Af1WMNRK7lD2cmLb6EsFmSFS -xStRKTz40w7UIw5qlme/8rd9dIhbzG/YhEvwHiBkUjeHCKzvSOpAgMeg+EG2aIbL -LmsxdZP0yQwHeJicu8OBZJE4ml5sNxcRhmpVyMS9mpBGuO+J5S6Fyw15NfmoeAUp -WfdyzD+Y4Uln2WYEhLGFC38Kbjm31I5aplm6aex0HoogpHrN3IlWhSfghbE3JqFA -CTOsEP+/17AwJ8klKOGivSE7bNMMHK36tLQ0rEkCggEAMi3cIIAjk/QZypOgGweD -EPZ1xWxl0/4EC/K/Kj158kkqKo3mStMa/ZV7GDQUcW9czaM8wTcMwq6OO/iw/dFx -4RK2QnSy9CWtj2brHszMZzILeuItvZCTg796bmGxV8N+WeRgQSZCGMo8ZG37KGPq -1dQaJzgFOuFcy5hNpH7NpWpVoiwetCXhtthxWAwWOjXiiTM/pY02Z/7RuPSBalII -FAE+9g4TU+RZe6XasvWnIbhXdRegebneQdsVJylLDjasjS06HZhtGLa70R/3G8nJ -D0KkSdclECJo+EQtjr+nf5j/ZrkORyR481DodEN7b0LoN15prVPa+Yjc3BXvgG+5 -sQKCAQA+ZJIg3jvUTpRRAFaLDvsviuPjOmK+/X9dYbgIiY+6BPHkQyN37McII+Wg -ISvg6Vrka77wosCZOZbctJYvOizOmTJFt/SAXfQR00sJHil/TqkPnZkqEG2EO+wR -Qi2Zgu1mhFTdZSpf6DFGsEpHtdr8Z7Zqrtoen+Fdo8lmFvIJRnvuGa/aXWW1QJh/ -NsJ4X56H04oO6UNXRrAOiR9k+r+kr6OuZKKOrt1LHsrleY4dGPrZTD8a6ZN3PKk4 -EGQHkqMwXDZjPQD07ISdbdHuiLTpqFdnHpCFGGOGwZz7FRJFRIFrXVQRHa1Bw2Eh -nLfASW1H+bYbcTJVDY+kCz9/vp5Q ------END PRIVATE KEY----- diff --git a/compose/jtso/ondemand/.gitkeep b/compose/jtso/ondemand/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/compose/jtso/profiles/bgp.tgz b/compose/jtso/profiles/bgp.tgz index 6a8125e..8001f83 100644 Binary files a/compose/jtso/profiles/bgp.tgz and b/compose/jtso/profiles/bgp.tgz differ diff --git a/compose/jtso/profiles/ddos.tgz b/compose/jtso/profiles/ddos.tgz index 1a528ed..5a91fc6 100644 Binary files a/compose/jtso/profiles/ddos.tgz and b/compose/jtso/profiles/ddos.tgz differ diff --git a/compose/jtso/profiles/filter.tgz b/compose/jtso/profiles/filter.tgz index bf1313e..cdcb834 100644 Binary files a/compose/jtso/profiles/filter.tgz and b/compose/jtso/profiles/filter.tgz differ diff --git a/compose/jtso/profiles/health.tgz b/compose/jtso/profiles/health.tgz index 04526f9..097bf61 100644 Binary files a/compose/jtso/profiles/health.tgz and b/compose/jtso/profiles/health.tgz differ diff --git a/compose/jtso/profiles/optic.tgz b/compose/jtso/profiles/optic.tgz index 5c2ebb2..7aa308c 100644 Binary files a/compose/jtso/profiles/optic.tgz and b/compose/jtso/profiles/optic.tgz differ diff --git a/compose/jtso/profiles/power.tgz b/compose/jtso/profiles/power.tgz index 557efcd..0658d25 100644 Binary files a/compose/jtso/profiles/power.tgz and b/compose/jtso/profiles/power.tgz differ diff --git a/compose/jtso/profiles/srmpls.tgz b/compose/jtso/profiles/srmpls.tgz index e6082a6..25d3dcc 100644 Binary files a/compose/jtso/profiles/srmpls.tgz and b/compose/jtso/profiles/srmpls.tgz differ diff --git a/compose/jtso/profiles/traffic.tgz b/compose/jtso/profiles/traffic.tgz index e574f8b..408864a 100644 Binary files a/compose/jtso/profiles/traffic.tgz and b/compose/jtso/profiles/traffic.tgz differ diff --git a/compose/jtso/profiles/twamp.tgz b/compose/jtso/profiles/twamp.tgz new file mode 100644 index 0000000..96d1b88 Binary files /dev/null and b/compose/jtso/profiles/twamp.tgz differ diff --git a/compose/kapacitor/kapacitor.conf b/compose/kapacitor/kapacitor.conf index 75c6dca..4b4c6b6 100644 --- a/compose/kapacitor/kapacitor.conf +++ b/compose/kapacitor/kapacitor.conf @@ -53,7 +53,7 @@ default-retention-policy = "" # it serves both as a write endpoint # and as the API endpoint for all other # Kapacitor calls. - bind-address = ":9092" + bind-address = ":9292" auth-enabled = false log-enabled = true write-tracing = false diff --git a/compose/telegraf/acx/telegraf.conf b/compose/telegraf/acx/telegraf.conf index ba67d00..a8602b4 100644 --- a/compose/telegraf/acx/telegraf.conf +++ b/compose/telegraf/acx/telegraf.conf @@ -15,3 +15,4 @@ logfile = "/var/log/debugtelegraf_acx.log" hostname = "" omit_hostname = false + diff --git a/compose/telegraf/crpd/telegraf.conf b/compose/telegraf/crpd/telegraf.conf index 4892f74..4ce5a6e 100755 --- a/compose/telegraf/crpd/telegraf.conf +++ b/compose/telegraf/crpd/telegraf.conf @@ -15,4 +15,3 @@ logfile = "/var/log/debugtelegraf_crpd.log" hostname = "" omit_hostname = false - diff --git a/compose/telegraf/ondemand/telegraf.conf b/compose/telegraf/ondemand/telegraf.conf new file mode 100755 index 0000000..2e7cc8a --- /dev/null +++ b/compose/telegraf/ondemand/telegraf.conf @@ -0,0 +1,17 @@ +############################################################################### +# GLOBAL CONFIG # +############################################################################### + +[agent] + + round_interval = true + metric_batch_size = 5000 + metric_buffer_limit = 100000 + collection_jitter = "0s" + flush_interval = "5s" + flush_jitter = "0s" + debug = false + quiet = false + logfile = "/var/log/debugtelegraf_ondemand.log" + hostname = "" + omit_hostname = false \ No newline at end of file diff --git a/compose/telegraf/ondemand/telegraf.d/.gitkeep b/compose/telegraf/ondemand/telegraf.d/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/compose/telegraf/srx/telegraf.conf b/compose/telegraf/srx/telegraf.conf index 369cd46..361a54f 100755 --- a/compose/telegraf/srx/telegraf.conf +++ b/compose/telegraf/srx/telegraf.conf @@ -12,7 +12,6 @@ flush_jitter = "0s" debug = false quiet = false - logfile = "/var/log/debugtelegraf_vevo.log" + logfile = "/var/log/debugtelegraf_srx.log" hostname = "" omit_hostname = false - diff --git a/compose/telegraf/vevo/telegraf.conf b/compose/telegraf/vevo/telegraf.conf index 85ec602..369cd46 100755 --- a/compose/telegraf/vevo/telegraf.conf +++ b/compose/telegraf/vevo/telegraf.conf @@ -12,7 +12,7 @@ flush_jitter = "0s" debug = false quiet = false - logfile = "/var/log/debugtelegraf_mx.log" + logfile = "/var/log/debugtelegraf_vevo.log" hostname = "" omit_hostname = false diff --git a/compose/telegraf/vjunos/telegraf.conf b/compose/telegraf/vjunos/telegraf.conf index 7c8c93c..1b83c61 100755 --- a/compose/telegraf/vjunos/telegraf.conf +++ b/compose/telegraf/vjunos/telegraf.conf @@ -16,3 +16,4 @@ hostname = "" omit_hostname = false + diff --git a/compose/telegraf/vmx/telegraf.conf b/compose/telegraf/vmx/telegraf.conf index 4dd50cd..1cb9392 100755 --- a/compose/telegraf/vmx/telegraf.conf +++ b/compose/telegraf/vmx/telegraf.conf @@ -16,3 +16,4 @@ hostname = "" omit_hostname = false + diff --git a/design_profile/bgp/acx_bgp.json b/design_profile/bgp/acx_bgp.json index e16c446..a3deb7d 100644 --- a/design_profile/bgp/acx_bgp.json +++ b/design_profile/bgp/acx_bgp.json @@ -191,7 +191,7 @@ "two_levels": false, "level1_tag": "device" }], - "regrex_list": [{ + "regex_list": [{ "order": 300, "namepass": ["NETWORK_INSTANCE_BGP"], "entries": [{ diff --git a/design_profile/bgp/bgp.png b/design_profile/bgp/bgp.png deleted file mode 100644 index 866a40a..0000000 Binary files a/design_profile/bgp/bgp.png and /dev/null differ diff --git a/design_profile/bgp/definition.json b/design_profile/bgp/definition.json index 39cf386..4879d0c 100644 --- a/design_profile/bgp/definition.json +++ b/design_profile/bgp/definition.json @@ -1,7 +1,6 @@ { "version": 1, "min-interval": 30, - "cheatsheet": "bgp.png", "description": "This profile provides template for collecting BGP data", "telegraf": { "vmx": [{ diff --git a/design_profile/bgp/mx_bgp.json b/design_profile/bgp/mx_bgp.json index d23d082..bce7ef2 100644 --- a/design_profile/bgp/mx_bgp.json +++ b/design_profile/bgp/mx_bgp.json @@ -191,7 +191,7 @@ "two_levels": false, "level1_tag": "device" }], - "regrex_list": [{ + "regex_list": [{ "order": 300, "namepass": ["NETWORK_INSTANCE_BGP"], "entries": [{ diff --git a/design_profile/bgp/ptx_bgp.json b/design_profile/bgp/ptx_bgp.json index d55cc38..d12a5b9 100644 --- a/design_profile/bgp/ptx_bgp.json +++ b/design_profile/bgp/ptx_bgp.json @@ -191,7 +191,7 @@ "two_levels": false, "level1_tag": "device" }], - "regrex_list": [{ + "regex_list": [{ "order": 300, "namepass": ["NETWORK_INSTANCE_BGP"], "entries": [{ diff --git a/design_profile/bgp/vmx_bgp.json b/design_profile/bgp/vmx_bgp.json index 01362b1..052070b 100644 --- a/design_profile/bgp/vmx_bgp.json +++ b/design_profile/bgp/vmx_bgp.json @@ -191,7 +191,7 @@ "two_levels": false, "level1_tag": "device" }], - "regrex_list": [{ + "regex_list": [{ "order": 300, "namepass": ["NETWORK_INSTANCE_BGP"], "entries": [{ diff --git a/design_profile/ddos/ddos.png b/design_profile/ddos/ddos.png deleted file mode 100644 index 0aed1d3..0000000 Binary files a/design_profile/ddos/ddos.png and /dev/null differ diff --git a/design_profile/ddos/definition.json b/design_profile/ddos/definition.json index 84bd8a6..affb322 100644 --- a/design_profile/ddos/definition.json +++ b/design_profile/ddos/definition.json @@ -1,7 +1,6 @@ { "version": 1, "min-interval": 30, - "cheatsheet": "ddos.png", "description": "This profile covers DDOS protection feature statistics. Supported, only for MX & PTX, starting from 22.3", "telegraf": { "mx": [{ diff --git a/design_profile/ddos/mx_ddos.json b/design_profile/ddos/mx_ddos.json index 328d18d..dd2e994 100644 --- a/design_profile/ddos/mx_ddos.json +++ b/design_profile/ddos/mx_ddos.json @@ -2,6 +2,7 @@ "gnmi_inputs": [{ "aliases": [{ "name": "DDOS_STATS", + "aliasof": "/junos/system/linecard/ddos", "prefix_list": ["/ddos-stats/group"] }], "subscriptions": [{ diff --git a/design_profile/ddos/ptx_ddos.json b/design_profile/ddos/ptx_ddos.json index 7498b74..419de16 100644 --- a/design_profile/ddos/ptx_ddos.json +++ b/design_profile/ddos/ptx_ddos.json @@ -2,6 +2,7 @@ "gnmi_inputs": [{ "aliases": [{ "name": "DDOS_STATS", + "aliasof": "/junos/system/linecard/ddos", "prefix_list": ["/ddos-stats/group"] }], "subscriptions": [{ diff --git a/design_profile/filter/acx_filter.json b/design_profile/filter/acx_filter.json index 35cf504..dd46e9d 100644 --- a/design_profile/filter/acx_filter.json +++ b/design_profile/filter/acx_filter.json @@ -2,6 +2,7 @@ "gnmi_inputs": [{ "aliases": [{ "name": "FIREWALL", + "aliasof": "/junos/system/linecard/firewall", "prefix_list": ["/junos/firewall/state/counter", "/junos/firewall/state/policer"] }], "subscriptions": [{ diff --git a/design_profile/filter/definition.json b/design_profile/filter/definition.json index 82d460a..ddfbcf8 100644 --- a/design_profile/filter/definition.json +++ b/design_profile/filter/definition.json @@ -1,7 +1,6 @@ { "version": 1, "min-interval": 30, - "cheatsheet": "filter.png", "description": "This profile provides template for collecting firewall filter information", "telegraf": { "mx": [{ diff --git a/design_profile/filter/filter.png b/design_profile/filter/filter.png deleted file mode 100644 index 1700d50..0000000 Binary files a/design_profile/filter/filter.png and /dev/null differ diff --git a/design_profile/filter/mx_filter.json b/design_profile/filter/mx_filter.json index 9da852d..a6bff28 100644 --- a/design_profile/filter/mx_filter.json +++ b/design_profile/filter/mx_filter.json @@ -2,6 +2,7 @@ "gnmi_inputs": [{ "aliases": [{ "name": "FIREWALL", + "aliasof": "/junos/system/linecard/firewall", "prefix_list": ["/junos/firewall/state/counter", "/junos/firewall/state/policer"] }], "subscriptions": [{ diff --git a/design_profile/filter/ptx_filter.json b/design_profile/filter/ptx_filter.json index f2523db..0d8717a 100644 --- a/design_profile/filter/ptx_filter.json +++ b/design_profile/filter/ptx_filter.json @@ -2,6 +2,7 @@ "gnmi_inputs": [{ "aliases": [{ "name": "FIREWALL", + "aliasof": "/junos/system/linecard/firewall", "prefix_list": ["/junos/firewall/state/counter", "/junos/firewall/state/policer"] }], "subscriptions": [{ diff --git a/design_profile/health/acx_23_health.json b/design_profile/health/acx_23_health.json index e5acaac..1c0347f 100644 --- a/design_profile/health/acx_23_health.json +++ b/design_profile/health/acx_23_health.json @@ -1,11 +1,9 @@ { "gnmi_inputs": [{ - "aliases": [{ - "name": "JUNOS_CMERROR", - "prefix_list": ["/junos/chassis/cmerror/counters"] - }, + "aliases": [ { "name": "COMPONENTS", + "aliasof": "/junos/system/linecard/packet/usage", "prefix_list": ["/components/component"] } ], @@ -21,12 +19,6 @@ "mode": "sample", "interval": 60 }, - { - "name": "JUNOS_CMERROR", - "path": "/junos/system/cmerror/counters", - "mode": "sample", - "interval": 30 - }, { "name": "SYSTEM", "path": "/system/processes/process/state", @@ -108,7 +100,7 @@ }, { "order": 301, - "namepass": ["COMPONENTS", "JUNOS_CMERROR", "JUNOS_ALARMS", "SYSTEM", "JUNOS_EVENTS", "JUNOS_FABRIC"], + "namepass": ["COMPONENTS", "JUNOS_ALARMS", "SYSTEM", "JUNOS_EVENTS", "JUNOS_FABRIC"], "entries": [{ "type": 0, "from": "/components/component/properties/property/@name", @@ -129,11 +121,6 @@ "from": "/components/component/name", "to": "component_name" }, - { - "type": 0, - "from": "/junos/chassis/cmerror/counters/name", - "to": "cmerror_name" - }, { "type": 0, "from": "/system/processes/process/pid", @@ -149,36 +136,6 @@ "from": "/junos/events/event/id", "to": "event_id" }, - { - "type": 1, - "from": "/junos/chassis/cmerror/counters/description", - "to": "cmerror_desc" - }, - { - "type": 1, - "from": "/junos/chassis/cmerror/counters/fru-slot", - "to": "cmerror_slot" - }, - { - "type": 1, - "from": "/junos/chassis/cmerror/counters/identifier", - "to": "cmerror_id" - }, - { - "type": 1, - "from": "/junos/chassis/cmerror/counters/last-updated", - "to": "cmerror_update" - }, - { - "type": 1, - "from": "/junos/chassis/cmerror/counters/last-cleared-at", - "to": "cmerror_clear" - }, - { - "type": 1, - "from": "/junos/chassis/cmerror/counters/occur-count", - "to": "cmerror_count" - }, { "type": 1, "from": "/system/processes/process/state/memory-usage", @@ -289,13 +246,12 @@ ], "converter_list": [{ "order": 400, - "namepass": ["COMPONENTS", "JUNOS_CMERROR", "JUNOS_ALARMS", "SYSTEM", "JUNOS_EVENTS", "JUNOS_FABRIC", "HW_NPU"], + "namepass": ["COMPONENTS", "JUNOS_ALARMS", "SYSTEM", "JUNOS_EVENTS", "JUNOS_FABRIC", "HW_NPU"], "integer_type": [ "idle_cpu", "linecard_cpu", "linecard_memory", "buffer_usage", - "cmerror_slot", "value" ], "tag_type": [ @@ -310,7 +266,7 @@ }], "enrichment_list": [{ "order": 400, - "namepass": ["COMPONENTS", "JUNOS_CMERROR", "JUNOS_ALARMS", "SYSTEM", "JUNOS_EVENTS", "JUNOS_FABRIC", "HW_NPU"], + "namepass": ["COMPONENTS", "JUNOS_ALARMS", "SYSTEM", "JUNOS_EVENTS", "JUNOS_FABRIC", "HW_NPU"], "family": "acx", "two_levels": false, "level1_tag": "device" @@ -362,12 +318,6 @@ "fieldpass": [ "exception", "value", - "cmerror_desc", - "cmerror_slot", - "cmerror_id", - "cmerror_update", - "cmerror_clear", - "cmerror_count", "process_memory_usage", "process_cpu_utilization", "core_cpu_avg", diff --git a/design_profile/health/definition.json b/design_profile/health/definition.json index 69fd7a5..85398ca 100644 --- a/design_profile/health/definition.json +++ b/design_profile/health/definition.json @@ -1,7 +1,6 @@ { "version": 1, "min-interval": 30, - "cheatsheet": "health.png", "description": "This profile provides template for collecting router health data", "telegraf": { "vmx": [ diff --git a/design_profile/health/health.png b/design_profile/health/health.png deleted file mode 100644 index a33ae7d..0000000 Binary files a/design_profile/health/health.png and /dev/null differ diff --git a/design_profile/health/mx_health.json b/design_profile/health/mx_health.json index 932c981..4dd87b5 100644 --- a/design_profile/health/mx_health.json +++ b/design_profile/health/mx_health.json @@ -2,10 +2,12 @@ "gnmi_inputs": [{ "aliases": [{ "name": "JUNOS_CMERROR", + "aliasof": "/junos/system/cmerror/counters", "prefix_list": ["/junos/chassis/cmerror/counters"] }, { "name": "COMPONENTS", + "aliasof": "/junos/system/linecard/packet/usage", "prefix_list": ["/components/component"] } ], diff --git a/design_profile/health/ptx_health.json b/design_profile/health/ptx_health.json index 02bab00..9c04701 100644 --- a/design_profile/health/ptx_health.json +++ b/design_profile/health/ptx_health.json @@ -2,10 +2,12 @@ "gnmi_inputs": [{ "aliases": [{ "name": "JUNOS_CMERROR", + "aliasof": "/junos/system/cmerror/counters", "prefix_list": ["/junos/chassis/cmerror/counters"] }, { "name": "COMPONENTS", + "aliasof": "/junos/system/linecard/packet/usage", "prefix_list": ["/components/component"] } ], diff --git a/design_profile/health/qfx_health.json b/design_profile/health/qfx_health.json index 67d2661..f6a96d6 100644 --- a/design_profile/health/qfx_health.json +++ b/design_profile/health/qfx_health.json @@ -113,11 +113,6 @@ "from": "/components/component/name", "to": "component_name" }, - { - "type": 0, - "from": "/junos/chassis/cmerror/counters/name", - "to": "cmerror_name" - }, { "type": 0, "from": "/system/processes/process/pid", @@ -234,7 +229,6 @@ "linecard_cpu", "linecard_memory", "buffer_usage", - "cmerror_slot", "value" ], "tag_type": [ diff --git a/design_profile/health/vmx_health.json b/design_profile/health/vmx_health.json index 8661f52..1dc0f2f 100644 --- a/design_profile/health/vmx_health.json +++ b/design_profile/health/vmx_health.json @@ -2,6 +2,7 @@ "gnmi_inputs": [{ "aliases": [{ "name": "JUNOS_CMERROR", + "aliasof": "/junos/system/cmerror/counters", "prefix_list": ["/junos/chassis/cmerror/counters"] }], "subscriptions": [{ diff --git a/design_profile/optic/acx_23_optic.json b/design_profile/optic/acx_23_optic.json index c3cdf0c..7d0ed8c 100644 --- a/design_profile/optic/acx_23_optic.json +++ b/design_profile/optic/acx_23_optic.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "COMPONENTS", + "aliasof": "/junos/system/linecard/optics", "prefix_list": [ "/interfaces/interface/optics" ] diff --git a/design_profile/optic/acx_24_optic.json b/design_profile/optic/acx_24_optic.json index 9603baf..79e8e31 100644 --- a/design_profile/optic/acx_24_optic.json +++ b/design_profile/optic/acx_24_optic.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "COMPONENTS", + "aliasof": "/junos/system/linecard/optics", "prefix_list": [ "/interfaces/interface/optics" ] diff --git a/design_profile/optic/acx_optic.json b/design_profile/optic/acx_optic.json index d5e9802..2b245cc 100644 --- a/design_profile/optic/acx_optic.json +++ b/design_profile/optic/acx_optic.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "COMPONENTS", + "aliasof": "/junos/system/linecard/optics", "prefix_list": [ "/interfaces/interface/optics" ] diff --git a/design_profile/optic/definition.json b/design_profile/optic/definition.json index 105bbba..77e36f4 100644 --- a/design_profile/optic/definition.json +++ b/design_profile/optic/definition.json @@ -1,7 +1,6 @@ { "version": 1, "min-interval": 30, - "cheatsheet": "optic.png", "description": "This profile provides template for collecting optical data", "telegraf": { "mx": [{ diff --git a/design_profile/optic/mx_24_optic.json b/design_profile/optic/mx_24_optic.json index 083d184..5d5f56a 100644 --- a/design_profile/optic/mx_24_optic.json +++ b/design_profile/optic/mx_24_optic.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "COMPONENTS", + "aliasof": "/junos/system/linecard/optics", "prefix_list": [ "/interfaces/interface/optics" ] diff --git a/design_profile/optic/mx_optic.json b/design_profile/optic/mx_optic.json index 1d20844..4247fa9 100644 --- a/design_profile/optic/mx_optic.json +++ b/design_profile/optic/mx_optic.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "COMPONENTS", + "aliasof": "/junos/system/linecard/optics", "prefix_list": [ "/interfaces/interface/optics" ] diff --git a/design_profile/optic/optic.png b/design_profile/optic/optic.png deleted file mode 100644 index b759808..0000000 Binary files a/design_profile/optic/optic.png and /dev/null differ diff --git a/design_profile/optic/ptx_23_optic.json b/design_profile/optic/ptx_23_optic.json index 1dbbd2e..3724354 100644 --- a/design_profile/optic/ptx_23_optic.json +++ b/design_profile/optic/ptx_23_optic.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "COMPONENTS", + "aliasof": "/junos/system/linecard/optics", "prefix_list": [ "/interfaces/interface/optics" ] diff --git a/design_profile/optic/ptx_24_optic.json b/design_profile/optic/ptx_24_optic.json index 07a754e..230d562 100644 --- a/design_profile/optic/ptx_24_optic.json +++ b/design_profile/optic/ptx_24_optic.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "COMPONENTS", + "aliasof": "/junos/system/linecard/optics", "prefix_list": [ "/interfaces/interface/optics" ] diff --git a/design_profile/optic/ptx_optic.json b/design_profile/optic/ptx_optic.json index 7c84332..4a402e7 100644 --- a/design_profile/optic/ptx_optic.json +++ b/design_profile/optic/ptx_optic.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "COMPONENTS", + "aliasof": "/junos/system/linecard/optics", "prefix_list": [ "/interfaces/interface/optics" ] diff --git a/design_profile/power/dashboard-power.json b/design_profile/power/dashboard-power.json index d8a5159..41db0f4 100644 --- a/design_profile/power/dashboard-power.json +++ b/design_profile/power/dashboard-power.json @@ -162,10 +162,10 @@ }, "indexByName": { "MODEL": 2, + "SHORTNAME": 1, "Time": 0, "VERSION": 3, "component_name": 4, - "SHORTNAME": 1, "last": 5, "last_1": 6, "last_2": 7, @@ -173,8 +173,8 @@ "last_4": 9 }, "renameByName": { - "component_name": "Component", "SHORTNAME": "Router", + "component_name": "Component", "last": "System Allocated", "last_1": "System Capacity", "last_2": "System Maximum", @@ -569,10 +569,10 @@ }, "indexByName": { "MODEL": 2, + "SHORTNAME": 1, "Time": 0, "VERSION": 3, "component_name": 4, - "SHORTNAME": 1, "last": 5, "last_1": 6, "last_2": 7, @@ -580,8 +580,8 @@ "last_4": 9 }, "renameByName": { - "component_name": "Component", "SHORTNAME": "Router", + "component_name": "Component", "last": "System Allocated", "last_1": "System Capacity", "last_2": "System Maximum", @@ -726,10 +726,10 @@ }, "indexByName": { "MODEL": 2, + "SHORTNAME": 1, "Time": 0, "VERSION": 3, "component_name": 4, - "SHORTNAME": 1, "last": 5, "last_1": 6, "last_2": 7, @@ -737,8 +737,8 @@ "last_4": 9 }, "renameByName": { - "component_name": "Component", "SHORTNAME": "Router", + "component_name": "Component", "last": "System Allocated", "last_1": "System Capacity", "last_2": "System Maximum", @@ -1664,7 +1664,7 @@ "uid": "jtsuid" }, "groupBy": [], - "hide": false, + "hide": true, "measurement": "COMPONENTS", "orderByTime": "ASC", "policy": "default", @@ -1705,15 +1705,15 @@ "Time": false }, "indexByName": { + "SHORTNAME": 1, "Time": 0, "component_name": 2, - "SHORTNAME": 1, "last": 3, "last_1": 4 }, "renameByName": { - "component_name": "FPC Slot", "SHORTNAME": "Router", + "component_name": "FPC Slot", "last": "Current Power Usage", "last_1": "Maximum Power " } @@ -1824,7 +1824,7 @@ "uid": "jtsuid" }, "groupBy": [], - "hide": false, + "hide": true, "measurement": "COMPONENTS", "orderByTime": "ASC", "policy": "default", @@ -1973,15 +1973,15 @@ "options": { "excludeByName": {}, "indexByName": { + "SHORTNAME": 1, "Time": 0, "component_name": 2, - "SHORTNAME": 1, "last": 3, "last_1": 4 }, "renameByName": { - "component_name": "FPC Slot", "SHORTNAME": "Router", + "component_name": "FPC Slot", "last": "Current Power Usage", "last_1": "Maximum Power " } @@ -2123,15 +2123,15 @@ "options": { "excludeByName": {}, "indexByName": { + "SHORTNAME": 1, "Time": 0, "component_name": 2, - "SHORTNAME": 1, "last": 3, "last_1": 4 }, "renameByName": { - "component_name": "FPC Slot", "SHORTNAME": "Router", + "component_name": "FPC Slot", "last": "Current Power Usage", "last_1": "Maximum Power " } @@ -2292,20 +2292,20 @@ "id": "organize", "options": { "excludeByName": { - "Time": true, - "SHORTNAME": true + "SHORTNAME": true, + "Time": true }, "includeByName": {}, "indexByName": { + "SHORTNAME": 1, "Time": 0, "component_name": 2, - "SHORTNAME": 1, "last": 3, "last_1": 4 }, "renameByName": { - "component_name": "FPC Slot", "SHORTNAME": "Router", + "component_name": "FPC Slot", "last": "Current Power Usage", "last_1": "Maximum Power " } @@ -2445,15 +2445,15 @@ "options": { "excludeByName": {}, "indexByName": { + "SHORTNAME": 1, "Time": 0, "component_name": 2, - "SHORTNAME": 1, "last": 3, "last_1": 4 }, "renameByName": { - "component_name": "FPC Slot", "SHORTNAME": "Router", + "component_name": "FPC Slot", "last": "Current Power Usage", "last_1": "Maximum Power " } @@ -2599,20 +2599,20 @@ "id": "organize", "options": { "excludeByName": { - "Time": true, - "SHORTNAME": true + "SHORTNAME": true, + "Time": true }, "includeByName": {}, "indexByName": { + "SHORTNAME": 1, "Time": 0, "component_name": 2, - "SHORTNAME": 1, "last": 3, "last_1": 4 }, "renameByName": { - "component_name": "Fan Name", "SHORTNAME": "Router", + "component_name": "Fan Name", "last": "Current Power Usage", "last_1": "Maximum Power " } @@ -2752,15 +2752,15 @@ "options": { "excludeByName": {}, "indexByName": { + "SHORTNAME": 1, "Time": 0, "component_name": 2, - "SHORTNAME": 1, "last": 3, "last_1": 4 }, "renameByName": { - "component_name": "FPC Slot", "SHORTNAME": "Router", + "component_name": "FPC Slot", "last": "Current Power Usage", "last_1": "Maximum Power " } @@ -3159,20 +3159,20 @@ "id": "organize", "options": { "excludeByName": { - "Time": true, - "SHORTNAME": true + "SHORTNAME": true, + "Time": true }, "includeByName": {}, "indexByName": { + "SHORTNAME": 1, "Time": 0, "component_name": 2, - "SHORTNAME": 1, "last": 3, "last_1": 4 }, "renameByName": { - "component_name": "Component Name", "SHORTNAME": "Router", + "component_name": "Component Name", "last": "Current Power Usage", "last_1": "Maximum Power " } @@ -3312,15 +3312,15 @@ "options": { "excludeByName": {}, "indexByName": { + "SHORTNAME": 1, "Time": 0, "component_name": 2, - "SHORTNAME": 1, "last": 3, "last_1": 4 }, "renameByName": { - "component_name": "FPC Slot", "SHORTNAME": "Router", + "component_name": "FPC Slot", "last": "Current Power Usage", "last_1": "Maximum Power " } @@ -3375,7 +3375,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -3505,20 +3506,20 @@ "id": "organize", "options": { "excludeByName": { - "Time": true, - "SHORTNAME": true + "SHORTNAME": true, + "Time": true }, "includeByName": {}, "indexByName": { + "SHORTNAME": 1, "Time": 0, "component_name": 2, - "SHORTNAME": 1, "last": 3, "last_1": 4 }, "renameByName": { - "component_name": "PEM", "SHORTNAME": "Router", + "component_name": "PEM", "last": "Current Power Usage", "last_1": "Maximum Power " } @@ -3575,7 +3576,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -3694,15 +3696,15 @@ "options": { "excludeByName": {}, "indexByName": { + "SHORTNAME": 1, "Time": 0, "component_name": 2, - "SHORTNAME": 1, "last": 3, "last_1": 4 }, "renameByName": { - "component_name": "FPC Slot", "SHORTNAME": "Router", + "component_name": "FPC Slot", "last": "Current Power Usage", "last_1": "Maximum Power " } @@ -3719,7 +3721,7 @@ "list": [ { "current": { - "selected": false, + "selected": true, "text": "", "value": "" }, diff --git a/design_profile/power/definition.json b/design_profile/power/definition.json index 70e9e4c..556bf71 100644 --- a/design_profile/power/definition.json +++ b/design_profile/power/definition.json @@ -1,7 +1,6 @@ { "version": 1, "min-interval": 60, - "cheatsheet": "power.png", "description": "This profile provides extensive data regarding power consumption.", "telegraf": { "mx": [{ diff --git a/design_profile/power/power.png b/design_profile/power/power.png deleted file mode 100644 index d01f702..0000000 Binary files a/design_profile/power/power.png and /dev/null differ diff --git a/design_profile/srmpls/acx_srmpls.json b/design_profile/srmpls/acx_srmpls.json deleted file mode 100644 index 13db089..0000000 --- a/design_profile/srmpls/acx_srmpls.json +++ /dev/null @@ -1,289 +0,0 @@ -{ - "gnmi_inputs": [ - { - "aliases": [ - { - "name": "SRMPLS_IF_STATS", - "prefix_list": [ - "/mpls/signalling-protocols/segment-routing/interfaces/interface", - "/mpls/signaling-protocols/segment-routing/interfaces/interface" - ] - }, - { - "name": "SRMPLS_SID_STATS", - "prefix_list": [ - "/mpls/signalling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters", - "/mpls/signaling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters" - ] - } - ], - "subscriptions": [ - { - "name": "SRMPLS_IF_STATS", - "path": "/mpls/signaling-protocols/segment-routing/interfaces", - "mode": "sample", - "interval": 30 - }, - { - "name": "SRMPLS_SID_STATS", - "path": "/junos/services/segment-routing/sid/usage", - "mode": "sample", - "interval": 30 - }, - { - "name": "INTERFACES", - "path": "/interfaces/interface/state", - "mode": "sample", - "interval": 30 - } - ] - } - ], - "rename_list": [ - { - "order": 100, - "namepass": [ - "SRMPLS_IF_STATS", - "SRMPLS_SID_STATS", - "INTERFACES" - ], - "entries": [ - { - "type": 0, - "from": "/interfaces/interface/name", - "to": "if_name" - }, - { - "type": 0, - "from": "/interfaces/interface/@name", - "to": "if_name" - }, - { - "type": 0, - "from": "/interfaces/interface/if-name", - "to": "if_name" - }, - { - "type": 0, - "from": "/interfaces/interface/@if-name", - "to": "if_name" - }, - { - "type": 0, - "from": "/mpls/signalling-protocols/segment-routing/interfaces/interface/name", - "to": "ifl_name" - }, - { - "type": 0, - "from": "/mpls/signaling-protocols/segment-routing/interfaces/interface/name", - "to": "ifl_name" - }, - { - "type": 0, - "from": "/mpls/signaling-protocols/segment-routing/interfaces/interface/state/counters/name", - "to": "egress_ifl_counter_name" - }, - { - "type": 0, - "from": "/mpls/signalling-protocols/segment-routing/interfaces/interface/state/counters/name", - "to": "egress_ifl_counter_name" - }, - { - "type": 0, - "from": "/mpls/signaling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/mpls-label", - "to": "mpls_label" - }, - { - "type": 0, - "from": "/mpls/signalling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/mpls-label", - "to": "mpls_label" - }, - { - "type": 0, - "from": "/mpls/signaling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters/name", - "to": "sid_counter_name" - }, - { - "type": 0, - "from": "/mpls/signalling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters/name", - "to": "sid_counter_name" - }, - { - "type": 1, - "from": "/interfaces/interface/state/counters/in-octets", - "to": "in_octets" - }, - { - "type": 1, - "from": "/interfaces/interface/state/counters/out-octets", - "to": "out_octets" - }, - { - "type": 1, - "from": "/interfaces/interface/state/counters/if-in-octets", - "to": "in_octets" - }, - { - "type": 1, - "from": "/interfaces/interface/state/counters/if-out-octets", - "to": "out_octets" - }, - { - "type": 1, - "from": "/interfaces/interface/state/counters/in-pkts", - "to": "in_pkts" - }, - { - "type": 1, - "from": "/interfaces/interface/state/counters/out-pkts", - "to": "out_pkts" - }, - { - "type": 1, - "from": "/interfaces/interface/state/counters/if-in-pkts", - "to": "in_pkts" - }, - { - "type": 1, - "from": "/interfaces/interface/state/counters/if-out-pkts", - "to": "out_pkts" - }, - { - "type": 1, - "from": "/mpls/signaling-protocols/segment-routing/interfaces/interface/in-octets", - "to": "sr_in_octets" - }, - { - "type": 1, - "from": "/mpls/signaling-protocols/segment-routing/interfaces/interface/in-octets", - "to": "sr_in_octets" - }, - { - "type": 1, - "from": "/mpls/signaling-protocols/segment-routing/interfaces/interface/in-pkts", - "to": "sr_in_pkts" - }, - { - "type": 1, - "from": "/mpls/signaling-protocols/segment-routing/interfaces/interface/in-pkts", - "to": "sr_in_pkts" - }, - { - "type": 1, - "from": "/mpls/signaling-protocols/segment-routing/interfaces/interface/state/counters/out-octets", - "to": "sr_out_octets" - }, - { - "type": 1, - "from": "/mpls/signalling-protocols/segment-routing/interfaces/interface/state/counters/out-octets", - "to": "sr_out_octets" - }, - { - "type": 1, - "from": "/mpls/signaling-protocols/segment-routing/interfaces/interface/state/counters/out-pkts", - "to": "sr_out_pkts" - }, - { - "type": 1, - "from": "/mpls/signalling-protocols/segment-routing/interfaces/interface/state/counters/out-pkts", - "to": "sr_out_pkts" - }, - { - "type": 1, - "from": "/mpls/signaling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters/in-octets", - "to": "sid_in_octets" - }, - { - "type": 1, - "from": "/mpls/signalling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters/in-octets", - "to": "sid_in_octets" - }, - { - "type": 1, - "from": "/mpls/signaling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters/in-pkts", - "to": "sid_in_pkts" - }, - { - "type": 1, - "from": "/mpls/signalling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters/in-pkts", - "to": "sid_in_pkts" - } - ] - } - ], - "filtering_list": [ - { - "order": 200, - "namepass": [ - "SRMPLS_IF_STATS", - "SRMPLS_SID_STATS", - "INTERFACES" - ], - "filters": [ - { - "type": 0, - "key": "if_name", - "pattern": "^(et-|xe-|ge-|ae|lt-|ps-|fti-|gr-|demux).*", - "action": "accept" - } - ] - } - ], - "enrichment_list": [ - { - "order": 200, - "namepass": [ - "SRMPLS_IF_STATS", - "SRMPLS_SID_STATS", - "INTERFACES" - ], - "family": "acx", - "two_levels": true, - "level1_tag": "device", - "level2_tag": "if_name" - } - ], - "rate_list": [ - { - "order": 300, - "namepass": [ - "SRMPLS_IF_STATS", - "SRMPLS_SID_STATS", - "INTERFACES" - ], - "fields": [ - "in_octets", - "out_octets", - "in_pkts", - "out_pkts", - "sr_in_octets", - "sr_in_pkts", - "sr_out_octets", - "sr_out_pkts", - "sid_in_octets", - "sid_in_pkts", - "sid_out_octets", - "sid_out_pkts" - ] - } - ], - "influx_outputs": [ - { - "retention": "autogen", - "fieldpass": [ - "in_octets_rate", - "out_octets_rate", - "in_pkts_rate", - "out_pkts_rate", - "sr_in_octets_rate", - "sr_in_pkts_rate", - "sr_out_octets_rate", - "sr_out_pkts_rate", - "sid_in_octets_rate", - "sid_in_pkts_rate", - "sid_out_octets_rate", - "sid_out_pkts_rate" - ] - } - ] -} \ No newline at end of file diff --git a/design_profile/srmpls/definition.json b/design_profile/srmpls/definition.json index 4b9ff3a..23958ce 100644 --- a/design_profile/srmpls/definition.json +++ b/design_profile/srmpls/definition.json @@ -1,7 +1,6 @@ { "version": 1, "min-interval": 30, - "cheatsheet": "srmpls.png", "description": "This profile provides monitoring information for SR-MPLS.", "telegraf": { "mx": [ @@ -16,12 +15,6 @@ "conf": "ptx_srmpls.json" } ], - "acx": [ - { - "version": "all", - "conf": "acx_srmpls.json" - } - ], "vmx": [ { "version": "all", diff --git a/design_profile/srmpls/mx_srmpls.json b/design_profile/srmpls/mx_srmpls.json index 586d1c8..078d3f0 100644 --- a/design_profile/srmpls/mx_srmpls.json +++ b/design_profile/srmpls/mx_srmpls.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "SRMPLS_IF_STATS", + "aliasof": "/mpls/signaling-protocols/segment-routing/interfaces", "prefix_list": [ "/mpls/signalling-protocols/segment-routing/interfaces/interface", "/mpls/signaling-protocols/segment-routing/interfaces/interface" @@ -11,6 +12,7 @@ }, { "name": "SRMPLS_SID_STATS", + "aliasof": "/junos/services/segment-routing/sid/usage", "prefix_list": [ "/mpls/signalling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters", "/mpls/signaling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters" diff --git a/design_profile/srmpls/ptx_srmpls.json b/design_profile/srmpls/ptx_srmpls.json index 13db089..90cdd53 100644 --- a/design_profile/srmpls/ptx_srmpls.json +++ b/design_profile/srmpls/ptx_srmpls.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "SRMPLS_IF_STATS", + "aliasof": "/mpls/signaling-protocols/segment-routing/interfaces", "prefix_list": [ "/mpls/signalling-protocols/segment-routing/interfaces/interface", "/mpls/signaling-protocols/segment-routing/interfaces/interface" @@ -11,6 +12,7 @@ }, { "name": "SRMPLS_SID_STATS", + "aliasof": "/junos/services/segment-routing/sid/usage", "prefix_list": [ "/mpls/signalling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters", "/mpls/signaling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters" diff --git a/design_profile/srmpls/srmpls.png b/design_profile/srmpls/srmpls.png deleted file mode 100644 index d29053d..0000000 Binary files a/design_profile/srmpls/srmpls.png and /dev/null differ diff --git a/design_profile/srmpls/vmx_srmpls.json b/design_profile/srmpls/vmx_srmpls.json index fba7838..bb0f766 100644 --- a/design_profile/srmpls/vmx_srmpls.json +++ b/design_profile/srmpls/vmx_srmpls.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "SRMPLS_IF_STATS", + "aliasof": "/mpls/signaling-protocols/segment-routing/interfaces", "prefix_list": [ "/mpls/signalling-protocols/segment-routing/interfaces/interface", "/mpls/signaling-protocols/segment-routing/interfaces/interface" @@ -11,6 +12,7 @@ }, { "name": "SRMPLS_SID_STATS", + "aliasof": "/junos/services/segment-routing/sid/usage", "prefix_list": [ "/mpls/signalling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters", "/mpls/signaling-protocols/segment-routing/aggregate-sid-counters/aggregate-sid-counter/state/counters" diff --git a/design_profile/traffic/definition.json b/design_profile/traffic/definition.json index 397cbba..52f932f 100644 --- a/design_profile/traffic/definition.json +++ b/design_profile/traffic/definition.json @@ -1,7 +1,6 @@ { "version": 1, "min-interval": 15, - "cheatsheet": "traffic.png", "description": "This profile provides template for collecting traffic/cos for physical ports", "telegraf": { "vmx": [{ diff --git a/design_profile/traffic/ptx_22_traffic.json b/design_profile/traffic/ptx_22_traffic.json index bfe485a..d56c81d 100644 --- a/design_profile/traffic/ptx_22_traffic.json +++ b/design_profile/traffic/ptx_22_traffic.json @@ -4,6 +4,7 @@ "aliases": [ { "name": "JUNOS_QMON", + "aliasof": "/junos/system/linecard/qmon-sw", "prefix_list": [ "/cos/interfaces/interface/input/queues/queue/pfes/pfe" ] diff --git a/design_profile/traffic/traffic.png b/design_profile/traffic/traffic.png deleted file mode 100644 index 92ccd73..0000000 Binary files a/design_profile/traffic/traffic.png and /dev/null differ diff --git a/design_profile/twamp/dashboard-twamp.json b/design_profile/twamp/dashboard-twamp.json new file mode 100644 index 0000000..af6fdba --- /dev/null +++ b/design_profile/twamp/dashboard-twamp.json @@ -0,0 +1,1790 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 3, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#6ED0E0", + "value": 0.25 + }, + { + "color": "#EAB839", + "value": 1 + }, + { + "color": "red", + "value": 2 + } + ] + }, + "unit": "percent", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 10, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT \n 100.0 * (SUM(\"probes_sent\") \n - SUM(\"probe_responses\")) \n / SUM(\"probes_sent\") \n AS \"cumulative_loss_pct\"\nFROM \"JUNOS_TWAMP\"\nWHERE $timeFilter \n AND \"SHORTNAME\" =~ /^${rtr:regex}$/ \n AND \"test_owner\" =~ /^${test_owner:regex}$/ \n AND \"test_name\" =~ /^${twamp_test:regex}$/ \n AND \"results_scope\" =~ /^${scope:regex}$/ ", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + } + ], + "title": "Packet Loss %", + "type": "stat" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "description": "", + "fieldConfig": { + "defaults": { + "decimals": 3, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 80 + }, + { + "color": "red", + "value": 150 + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT min(\"min_delay\")/1000 AS \"min_rtt_last_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" = 'ROUND_TRIP_TIME'", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + } + ], + "title": "Min RTT (ms) - ROUND_TRIP_TIME", + "type": "stat" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "description": "", + "fieldConfig": { + "defaults": { + "decimals": 3, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 80 + }, + { + "color": "red", + "value": 150 + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 0 + }, + "id": 13, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT min(\"min_delay\")/1000 AS \"min_rtt_last_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" = 'NEGATIVE_RTT_JITTER'", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + } + ], + "title": "Min RTT (ms) - NEGATIVE_RTT_JITTER", + "type": "stat" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "description": "", + "fieldConfig": { + "defaults": { + "decimals": 3, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 80 + }, + { + "color": "red", + "value": 150 + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 0 + }, + "id": 16, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT min(\"min_delay\")/1000 AS \"min_rtt_last_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" = 'POSITIVE_RTT_JITTER'", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + } + ], + "title": "Min RTT (ms) - POSITIVE_RTT_JITTER", + "type": "stat" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 3 + }, + "id": 14, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT MEAN(\"avg_delay\") / 1000 \nAS \"avg_of_avgs_rtt_ms\" \nFROM \"JUNOS_TWAMP\" \nWHERE $timeFilter \n AND \"SHORTNAME\" =~ /^${rtr:regex}$/ \n AND \"test_owner\" =~ /^${test_owner:regex}$/ \n AND \"test_name\" =~ /^${twamp_test:regex}$/ \n AND \"results_scope\" =~ /^${scope:regex}$/ \n AND \"probe_measurement_type\" = 'ROUND_TRIP_TIME'", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + } + ], + "title": "Average RTT - ROUND_TRIP_TIME", + "type": "stat" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 3 + }, + "id": 11, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT MEAN(\"avg_delay\") / 1000 \nAS \"avg_of_avgs_rtt_ms\" \nFROM \"JUNOS_TWAMP\" \nWHERE $timeFilter \n AND \"SHORTNAME\" =~ /^${rtr:regex}$/ \n AND \"test_owner\" =~ /^${test_owner:regex}$/ \n AND \"test_name\" =~ /^${twamp_test:regex}$/ \n AND \"results_scope\" =~ /^${scope:regex}$/ \n AND \"probe_measurement_type\" = 'NEGATIVE_RTT_JITTER'", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + } + ], + "title": "Average RTT - NEGATIVE_RTT_JITTER", + "type": "stat" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 3 + }, + "id": 17, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT MEAN(\"avg_delay\") / 1000 \nAS \"avg_of_avgs_rtt_ms\" \nFROM \"JUNOS_TWAMP\" \nWHERE $timeFilter \n AND \"SHORTNAME\" =~ /^${rtr:regex}$/ \n AND \"test_owner\" =~ /^${test_owner:regex}$/ \n AND \"test_name\" =~ /^${twamp_test:regex}$/ \n AND \"results_scope\" =~ /^${scope:regex}$/ \n AND \"probe_measurement_type\" = 'POSITIVE_RTT_JITTER'", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + } + ], + "title": "Average RTT - POSITIVE_RTT_JITTER", + "type": "stat" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "fieldConfig": { + "defaults": { + "decimals": 3, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 120 + }, + { + "color": "red", + "value": 250 + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 6 + }, + "id": 2, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT max(\"max_delay\")/1000 AS \"max_rtt_last_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" = 'ROUND_TRIP_TIME'", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + } + ], + "title": "Max RTT (ms) - ROUND_TRIP_TIME", + "type": "stat" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "fieldConfig": { + "defaults": { + "decimals": 3, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 120 + }, + { + "color": "red", + "value": 250 + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 6 + }, + "id": 15, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT max(\"max_delay\")/1000 AS \"max_rtt_last_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" = 'NEGATIVE_RTT_JITTER'", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + } + ], + "title": "Max RTT (ms) - NEGATIVE_RTT_JITTER", + "type": "stat" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "fieldConfig": { + "defaults": { + "decimals": 3, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 120 + }, + { + "color": "red", + "value": 250 + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 6 + }, + "id": 18, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT max(\"max_delay\")/1000 AS \"max_rtt_last_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" = 'POSITIVE_RTT_JITTER'", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + } + ], + "title": "Max RTT (ms) - POSITIVE_RTT_JITTER", + "type": "stat" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 7, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 4, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 3, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "Jitter Delay RTT" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "Jitter Delay Negative RTT" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "Jitter Delay Positive Jitter Delay RTT" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 4, + "options": { + "legend": { + "calcs": [ + "lastNotNull", + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Mean", + "sortDesc": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "alias": "Jitter Delay RTT", + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "hide": false, + "query": "SELECT mean(\"jitter_delay\") / 1000 AS \"rtt_jitter_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" = 'ROUND_TRIP_TIME' GROUP BY time($interval) fill(null)", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + }, + { + "alias": "Jitter Delay Negative RTT", + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT mean(\"jitter_delay\") / 1000 AS \"negative_rtt_jitter_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" = 'NEGATIVE_RTT_JITTER' GROUP BY time($interval) fill(null)", + "rawQuery": true, + "refId": "B", + "resultFormat": "time_series" + }, + { + "alias": "Jitter Delay Positive Jitter Delay RTT", + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT mean(\"jitter_delay\") / 1000 AS \"positive_rtt_jitter_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" = 'POSITIVE_RTT_JITTER' GROUP BY time($interval) fill(null)", + "rawQuery": true, + "refId": "C", + "resultFormat": "time_series" + } + ], + "title": "Jitter Delay For All Probe Types", + "type": "timeseries" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "points", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "line" + } + }, + "decimals": 3, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "Min Delay RTT" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 8, + 4 + ], + "fill": "dash" + } + }, + { + "id": "custom.lineWidth", + "value": 2 + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "Avg Delay RTT" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + } + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.showPoints", + "value": "always" + }, + { + "id": "custom.pointSize", + "value": 3 + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "Max Delay RTT" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 2, + 4 + ], + "fill": "dash" + } + }, + { + "id": "custom.lineWidth", + "value": 2 + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "Avg Min Delay RTT" + }, + "properties": [ + { + "id": "custom.drawStyle", + "value": "line" + }, + { + "id": "custom.lineStyle" + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + }, + { + "id": "custom.spanNulls", + "value": true + }, + { + "id": "custom.showPoints", + "value": "never" + } + ] + } + ] + }, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 19 + }, + "id": 5, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "alias": "Avg Delay RTT", + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "hide": false, + "query": "SELECT mean(\"avg_delay\")/1000 AS \"avg_rtt_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" =~ /^${mtype:regex}$/ GROUP BY time($interval) fill(null)\n", + "rawQuery": true, + "refId": "C", + "resultFormat": "time_series" + }, + { + "alias": "Min Delay RTT", + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "hide": false, + "query": "SELECT min(\"min_delay\")/1000 AS \"min_rtt_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" =~ /^${mtype:regex}$/ GROUP BY time($interval) fill(null)", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + }, + { + "alias": "Avg Min Delay RTT", + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT mean(\"min_delay\")/1000 AS \"avg_min_rtt_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" =~ /^${mtype:regex}$/ group by time(365d) fill(previous)", + "rawQuery": true, + "refId": "D", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + }, + { + "alias": "Max Delay RTT", + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "hide": false, + "query": "SELECT max(\"max_delay\")/1000 AS \"max_rtt_ms\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" =~ /^${mtype:regex}$/ GROUP BY time($interval) fill(null)", + "rawQuery": true, + "refId": "B", + "resultFormat": "time_series" + } + ], + "title": "Min/Avg/Max RTT Trend (ms) for Probe Type $mtype", + "transformations": [ + { + "id": "configFromData", + "options": { + "applyTo": { + "id": "byType", + "options": "number" + }, + "configRefId": "D", + "mappings": [ + { + "fieldName": "Avg Min Delay RTT", + "handlerKey": "threshold1" + } + ] + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 5 + }, + { + "color": "red", + "value": 20 + } + ] + }, + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "min_rtt_ms" + }, + "properties": [ + { + "id": "unit", + "value": "ms" + }, + { + "id": "decimals", + "value": 3 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "max_rtt_ms" + }, + "properties": [ + { + "id": "unit", + "value": "ms" + }, + { + "id": "decimals", + "value": 3 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "avg_rtt_ms" + }, + "properties": [ + { + "id": "unit", + "value": "ms" + }, + { + "id": "decimals", + "value": 3 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "jitter_ms" + }, + "properties": [ + { + "id": "unit", + "value": "ms" + }, + { + "id": "decimals", + "value": 3 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 13, + "x": 0, + "y": 30 + }, + "id": 7, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": true, + "displayName": "max_rtt_ms" + } + ] + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT last(\"min_delay\")/1000 AS min_rtt_ms, last(\"max_delay\")/1000 AS max_rtt_ms, last(\"avg_delay\")/1000 AS avg_rtt_ms, last(\"jitter_delay\")/1000 AS jitter_ms FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" =~ /^${mtype:regex}$/ GROUP BY \"test_name\" LIMIT 250", + "rawQuery": true, + "refId": "A", + "resultFormat": "table" + } + ], + "title": "Per-Test RTT/Jitter Snapshot (min/max/avg/jitter) - $mtype", + "type": "table" + }, + { + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 11, + "x": 13, + "y": 30 + }, + "id": 8, + "options": { + "legend": { + "calcs": [ + "lastNotNull", + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "alias": "Point Per Interval", + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "query": "SELECT count(\"avg_delay\") AS \"points_per_interval\" FROM \"JUNOS_TWAMP\" WHERE $timeFilter AND \"SHORTNAME\" =~ /^${rtr:regex}$/ AND \"test_owner\" =~ /^${test_owner:regex}$/ AND \"test_name\" =~ /^${twamp_test:regex}$/ AND \"results_scope\" =~ /^${scope:regex}$/ AND \"probe_measurement_type\" =~ /^${mtype:regex}$/ GROUP BY time($interval) fill(0)", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series" + } + ], + "title": "Ingest Cadence (points / $interval) - $mtype", + "type": "timeseries" + } + ], + "refresh": "5m", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "", + "value": "" + }, + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "definition": "SHOW TAG VALUES FROM \"JUNOS_TWAMP\" WITH KEY=\"SHORTNAME\"", + "hide": 0, + "includeAll": false, + "label": "Routeur", + "multi": false, + "name": "rtr", + "options": [], + "query": "SHOW TAG VALUES FROM \"JUNOS_TWAMP\" WITH KEY=\"SHORTNAME\"", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": true, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "definition": "SHOW TAG VALUES FROM \"JUNOS_TWAMP\" WITH KEY=\"test_owner\" WHERE \"SHORTNAME\" =~ /^$rtr$/", + "hide": 0, + "includeAll": true, + "label": "Test Owner", + "multi": false, + "name": "test_owner", + "options": [], + "query": "SHOW TAG VALUES FROM \"JUNOS_TWAMP\" WITH KEY=\"test_owner\" WHERE \"SHORTNAME\" =~ /^$rtr$/", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "definition": "SHOW TAG VALUES FROM \"JUNOS_TWAMP\" WITH KEY=\"test_name\" WHERE \"SHORTNAME\" =~ /^$rtr$/", + "hide": 0, + "includeAll": true, + "label": "Test Name", + "multi": true, + "name": "twamp_test", + "options": [], + "query": "SHOW TAG VALUES FROM \"JUNOS_TWAMP\" WITH KEY=\"test_name\" WHERE \"SHORTNAME\" =~ /^$rtr$/", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "LAST_TEST", + "value": "LAST_TEST" + }, + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "definition": "SHOW TAG VALUES FROM \"JUNOS_TWAMP\" WITH KEY=\"results_scope\"", + "hide": 0, + "includeAll": false, + "label": "Result Scope", + "multi": false, + "name": "scope", + "options": [], + "query": "SHOW TAG VALUES FROM \"JUNOS_TWAMP\" WITH KEY=\"results_scope\"", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": true, + "text": "ROUND_TRIP_TIME", + "value": "ROUND_TRIP_TIME" + }, + "datasource": { + "type": "influxdb", + "uid": "jtsuid" + }, + "definition": "SHOW TAG VALUES FROM \"JUNOS_TWAMP\" WITH KEY=\"probe_measurement_type\"", + "hide": 0, + "includeAll": false, + "label": "Probe Type", + "multi": false, + "name": "mtype", + "options": [], + "query": "SHOW TAG VALUES FROM \"JUNOS_TWAMP\" WITH KEY=\"probe_measurement_type\"", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "10s", + "value": "10s" + }, + "hide": 0, + "includeAll": false, + "label": "Interval", + "multi": false, + "name": "interval", + "options": [ + { + "selected": true, + "text": "10s", + "value": "10s" + }, + { + "selected": false, + "text": "15s", + "value": "15s" + }, + { + "selected": false, + "text": "30s", + "value": "30s" + }, + { + "selected": false, + "text": "60s", + "value": "60s" + }, + { + "selected": false, + "text": "2m", + "value": "2m" + }, + { + "selected": false, + "text": "5m", + "value": "5m" + } + ], + "query": "10s, 15s, 30s, 60s, 2m, 5m", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "TWAMP SLA (RTT + Jitter) - JTS", + "uid": "dashboardtwamp", + "version": 3, + "weekStart": "" +} \ No newline at end of file diff --git a/design_profile/twamp/definition.json b/design_profile/twamp/definition.json new file mode 100644 index 0000000..5203dc2 --- /dev/null +++ b/design_profile/twamp/definition.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "min-interval": 10, + "description": "This profile provides template for collecting router twamp data", + "telegraf": { + "vmx": [ + { + "version": "all", + "conf": "vmx_twamp.json" + } + ], + "mx": [ + { + "version": ">=23.2", + "conf": "mx_twamp.json" + } + ], + "ptx": [ + { + "version": ">=23.2", + "conf": "ptx_twamp.json" + } + ] + }, + "kapacitor": null, + "grafana": [ + "dashboard-twamp.json" + ] +} \ No newline at end of file diff --git a/design_profile/twamp/mx_twamp.json b/design_profile/twamp/mx_twamp.json new file mode 100644 index 0000000..9f67de9 --- /dev/null +++ b/design_profile/twamp/mx_twamp.json @@ -0,0 +1,165 @@ +{ + "gnmi_inputs": [ + { + "aliases": [], + "subscriptions": [ + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/last-test-time", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/loss-percentage", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-responses", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probes-sent", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-test-generic-measurements[probe-measurement-type=ROUND_TRIP_TIME]", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-test-generic-measurements[probe-measurement-type=NEGATIVE_RTT_JITTER]", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-test-generic-measurements[probe-measurement-type=POSITIVE_RTT_JITTER]", + "mode": "sample", + "interval": 30 + } + ] + } + ], + "rename_list": [ + { + "order": 100, + "namepass": [ + "JUNOS_TWAMP" + ], + "entries": [ + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/owner", + "to": "test_owner" + }, + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/test-name", + "to": "test_name" + }, + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/results-scope", + "to": "results_scope" + }, + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/probe-measurement-type", + "to": "probe_measurement_type" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/loss-percentage", + "to": "loss_percentage" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-responses", + "to": "probe_responses" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probes-sent", + "to": "probes_sent" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/last-test-time", + "to": "last_test_time" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/avg-delay", + "to": "avg_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/jitter-delay", + "to": "jitter_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/max-delay", + "to": "max_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/min-delay", + "to": "min_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/sum-delay", + "to": "sum_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/samples", + "to": "samples" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/stddev-delay", + "to": "stddev_delay" + } + ] + } + ], + "enrichment_list": [ + { + "order": 200, + "namepass": [ + "JUNOS_TWAMP" + ], + "family": "mx", + "two_levels": false, + "level1_tag": "device" + } + ], + "influx_outputs": [ + { + "retention": "autogen", + "fieldpass": [ + "last_test_time", + "loss_percentage", + "probe_responses", + "probes_sent", + "avg_delay", + "jitter_delay", + "max_delay", + "min_delay", + "sum_delay", + "stddev_delay", + "samples" + ] + } + ] +} \ No newline at end of file diff --git a/design_profile/twamp/ptx_twamp.json b/design_profile/twamp/ptx_twamp.json new file mode 100644 index 0000000..9c90994 --- /dev/null +++ b/design_profile/twamp/ptx_twamp.json @@ -0,0 +1,165 @@ +{ + "gnmi_inputs": [ + { + "aliases": [], + "subscriptions": [ + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/last-test-time", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/loss-percentage", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-responses", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probes-sent", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-test-generic-measurements[probe-measurement-type=ROUND_TRIP_TIME]", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-test-generic-measurements[probe-measurement-type=NEGATIVE_RTT_JITTER]", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-test-generic-measurements[probe-measurement-type=POSITIVE_RTT_JITTER]", + "mode": "sample", + "interval": 30 + } + ] + } + ], + "rename_list": [ + { + "order": 100, + "namepass": [ + "JUNOS_TWAMP" + ], + "entries": [ + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/owner", + "to": "test_owner" + }, + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/test-name", + "to": "test_name" + }, + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/results-scope", + "to": "results_scope" + }, + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/probe-measurement-type", + "to": "probe_measurement_type" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/loss-percentage", + "to": "loss_percentage" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-responses", + "to": "probe_responses" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probes-sent", + "to": "probes_sent" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/last-test-time", + "to": "last_test_time" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/avg-delay", + "to": "avg_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/jitter-delay", + "to": "jitter_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/max-delay", + "to": "max_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/min-delay", + "to": "min_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/sum-delay", + "to": "sum_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/samples", + "to": "samples" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/stddev-delay", + "to": "stddev_delay" + } + ] + } + ], + "enrichment_list": [ + { + "order": 200, + "namepass": [ + "JUNOS_TWAMP" + ], + "family": "ptx", + "two_levels": false, + "level1_tag": "device" + } + ], + "influx_outputs": [ + { + "retention": "autogen", + "fieldpass": [ + "last_test_time", + "loss_percentage", + "probe_responses", + "probes_sent", + "avg_delay", + "jitter_delay", + "max_delay", + "min_delay", + "sum_delay", + "stddev_delay", + "samples" + ] + } + ] +} \ No newline at end of file diff --git a/design_profile/twamp/vmx_twamp.json b/design_profile/twamp/vmx_twamp.json new file mode 100644 index 0000000..b2a98c7 --- /dev/null +++ b/design_profile/twamp/vmx_twamp.json @@ -0,0 +1,165 @@ +{ + "gnmi_inputs": [ + { + "aliases": [], + "subscriptions": [ + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/last-test-time", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/loss-percentage", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-responses", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probes-sent", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-test-generic-measurements[probe-measurement-type=ROUND_TRIP_TIME]", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-test-generic-measurements[probe-measurement-type=NEGATIVE_RTT_JITTER]", + "mode": "sample", + "interval": 30 + }, + { + "name": "JUNOS_TWAMP", + "path": "/junos/twamp/client/probe-test-results/probe-test-generic-results[results-scope=LAST_TEST]/probe-test-generic-measurements[probe-measurement-type=POSITIVE_RTT_JITTER]", + "mode": "sample", + "interval": 30 + } + ] + } + ], + "rename_list": [ + { + "order": 100, + "namepass": [ + "JUNOS_TWAMP" + ], + "entries": [ + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/owner", + "to": "test_owner" + }, + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/test-name", + "to": "test_name" + }, + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/results-scope", + "to": "results_scope" + }, + { + "type": 0, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/probe-measurement-type", + "to": "probe_measurement_type" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/loss-percentage", + "to": "loss_percentage" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-responses", + "to": "probe_responses" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probes-sent", + "to": "probes_sent" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/last-test-time", + "to": "last_test_time" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/avg-delay", + "to": "avg_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/jitter-delay", + "to": "jitter_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/max-delay", + "to": "max_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/min-delay", + "to": "min_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/sum-delay", + "to": "sum_delay" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/samples", + "to": "samples" + }, + { + "type": 1, + "from": "/junos/twamp/client/probe-test-results/probe-test-generic-results/probe-test-generic-measurements/stddev-delay", + "to": "stddev_delay" + } + ] + } + ], + "enrichment_list": [ + { + "order": 200, + "namepass": [ + "JUNOS_TWAMP" + ], + "family": "vmx", + "two_levels": false, + "level1_tag": "device" + } + ], + "influx_outputs": [ + { + "retention": "autogen", + "fieldpass": [ + "last_test_time", + "loss_percentage", + "probe_responses", + "probes_sent", + "avg_delay", + "jitter_delay", + "max_delay", + "min_delay", + "sum_delay", + "stddev_delay", + "samples" + ] + } + ] +} \ No newline at end of file diff --git a/docs/about.md b/docs/about.md new file mode 100644 index 0000000..73d14d4 --- /dev/null +++ b/docs/about.md @@ -0,0 +1,7 @@ +# About Me + +My name is **David Roy**, Principal TME at **HPE Juniper Networking**. + +- **LinkedIn**: [David Roy](https://www.linkedin.com/in/david-roy-6aa26133/) +- **BlueSky**: [@door7302](https://bsky.app/profile/door7302.bsky.social) +- **Email**: [door7302@gmail.com](mailto:door7302@gmail.com) diff --git a/docs/config.md b/docs/config.md new file mode 100644 index 0000000..9ae7241 --- /dev/null +++ b/docs/config.md @@ -0,0 +1,324 @@ +# Configuration of OpenJTS + +## Change the APP_SECRET + +Gnmi and Netconf passwords are encrypted into the DB. JTSO uses an external secret that could be changed if needed. For that edit the `.env` file: + +```shell +vi compose/.env + +[...] +APP_SECRET="DEFAULT_APP_SECRET_CHANGE_ME" +[...] +``` + +A change of the secret requires a reboot of the stack (if this one was running during the modification): + +```shell +cd compose/ + +docker compose down +docker compose up -d +``` + +## Enable HTTPS (Optional) + +If you want to enable HTTPS for both **JTSO** and **Grafana**, you can generate a self-signed certificate (see below) or use your own certificate. + +### 1. Generate Self-Signed Certificates + +```shell +# Go to the jtso certificate directory +cd ./compose/jtso/cert + +sudo openssl genrsa -aes256 -passout pass:gsahdg -out server.pass.key 4096 +sudo openssl rsa -passin pass:gsahdg -in server.pass.key -out server.key +sudo rm server.pass.key + +sudo openssl req -new -key server.key -out server.csr +``` + +You will be prompted to enter certificate information: + +```shell +Country Name (2 letter code) [AU]: FR +State or Province Name (full name) [Some-State]: France +Locality Name (eg, city) []: Paris +Organization Name (eg, company) [Internet Widgits Pty Ltd]: Juniper +Organizational Unit Name (eg, section) []: AWAN +Common Name (e.g. server FQDN or YOUR name) []: myserver +Email Address []: xxx@yyy.com +``` + +Then generate the certificate: + +```shell +sudo openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt +``` + +### 2. Enable HTTPS in JTSO + +Edit the JTSO configuration file: + +```shell +sudo vi compose/jtso/config.yml +``` + +Update the portal module by setting `https` to `true`: + +```yaml +modules: + portal: + https: true + server_crt: "server.crt" + server_key: "server.key" +``` + +Then change the JTSO port from 80 to 443 in `.env` file + +```shell +vi compose/.env + +[...] +JTSO_PORT=443 +[...] +``` + +You must restart the stack then (if this one was running during the modification): + +```shell +cd compose/ + +docker compose down +docker compose up -d +``` + +### 3. Copy Certificates to Grafana Cert Folder + +```shell +cd compose/jtso/cert +sudo cp server.* ../../grafana/cert +``` + +### 4. Enable HTTPS in Grafana + +Edit the Grafana configuration file: + +```shell +sudo vi compose/grafana/grafana.ini +``` + +Update the server section like that: + +```ini +[server] +protocol = https +cert_file = /tmp/server.crt +cert_key = /tmp/server.key +``` + +You must restart the Grafana container then (if this one was running during the modification): + +```shell +cd compose/ + +docker compose restart grafana +``` + +## Incoming Ports + +By default: + +- **JTSO Portal** → TCP port 80 +- **Grafana** → TCP port 8080 +- **Chronograf** → TCP port 8080 + +You can modify these public-facing ports by editing the `.env` file before starting the stack. + +```shell +cat compose/.env + +GRAFANA_PORT=8080 +CHRONOGRAF_PORT=8081 +JTSO_PORT=80 +``` + +If you change the **Grafana public port**, you must also update the JTSO configuration: + +```shell +sudo vi compose/jtso/config.yml +``` + +```yaml +modules: + grafana: + port: 8080 +``` + +You must restart the Grafana container then (if this one was running during the modification): + +```shell +cd compose/ + +docker compose restart grafana +``` + +## Outgoing Ports + +OpenJTS establishes TCP sessions toward routing devices for: + +- **NETCONF** → default TCP 830 +- **gNMI (gRPC)** → default TCP 9339 + +These ports can be modified if required. Once modified, it requires to restart JTSO - don't forget to modify your router's config as well. + +```shell +cd compose/ + +docker compose restart jtso +``` + +### Change NETCONF Port + +Edit: + +```shell +sudo vi compose/jtso/config.yml +``` + +And modify the netconf port: + +```yaml +protocols: + netconf: + port: 830 +``` + +### Change gNMI Port + +Edit: + +```shell +sudo vi compose/jtso/config.yml +``` + +And modify the gNMI port: + +```yaml +protocols: + gnmi: + port: 9339 +``` + +## gNMI with TLS (Global Configuration) + +To enable TLS for gNMI across all routers, create a self-signed CA. +⚠️ Keep the naming convention as shown below. + +### 1. Create Root CA + +```shell +cd compose/telegraf/cert + +sudo openssl genrsa -out RootCA.key 2048 +sudo openssl req -x509 -new -key RootCA.key -days 3650 -out RootCA.crt +``` + +### 2. (Optional) Generate Telegraf Client Certificate + +```shell +sudo openssl genrsa -out client.key 2048 +sudo openssl req -new -key client.key -out client.csr +sudo openssl x509 -req -in client.csr -CA RootCA.crt -CAkey RootCA.key -CAcreateserial -out client.crt -days 365 +``` + +### 3. Generate Router Certificate (Repeat for Each Router) + +```shell +sudo openssl genrsa -out router.key 2048 +sudo openssl req -new -key router.key -out router.csr +sudo openssl x509 -req -in router.csr -CA RootCA.crt -CAkey RootCA.key -CAcreateserial -out router.crt -days 365 +cat router.crt router.key > router.pem +``` + +Upload the following files to each router (e.g., `/var/tmp`): + +- `router.pem` +- `client.crt` +- `RootCA.crt` + +Then apply the following configuration: + +```junos +edit exclusive +set security pki ca-profile ca1 ca-identity caid1 +set security certificates local lcert load-key-file /var/tmp/router.pem +commit and-quit + +request security pki ca-certificate load ca-profile ca1 filename /var/tmp/RootCA.crt +``` + +## Configure Your Network Devices + +Apply this generic configuration on each router + +```junos +edit exclusive + +# NETCONF User +set system login user netconf_user class super-user +set system login user netconf_user authentication encrypted-password "" + +# gNMI User +set system login user gnmi_user class super-user +set system login user gnmi_user authentication encrypted-password "" + +# NETCONF SERVICE +set system services netconf ssh +set system services netconf rfc-compliant # optional + +commit and-quit +``` + +Then prior to **Junos/EVO 25.2** - use this config snippet for configuring gNMI service: + +```junos +edit exclusive + +# Clear-text gRPC +set system services extension-service request-response grpc clear-text port 9339 +set system services extension-service request-response grpc max-connections 8 +set system services extension-service request-response grpc skip-authentication + +# OR TLS gRPC +set system services extension-service request-response grpc ssl port 9339 +set system services extension-service request-response grpc ssl local-certificate lcert + +# Optional mutual authentication - Add: +set system services extension-service request-response grpc ssl mutual-authentication certificate-authority ca1 +set system services extension-service request-response grpc ssl mutual-authentication client-certificate-request require-certificate-and-verify + +commit and-quit +``` + +Starting from **Junos/EVO 25.2** I recommend to use this new config snippet: + +```junos +edit exclusive + +# Clear-text gRPC +set system services http servers server MY-SERVER port 9339 +set system services http servers server MY-SERVER grpc gnmi +set system services http servers server MY-SERVER clear-text + +# OR TLS gRPC +set system services http servers server MY-SERVER port 9339 +set system services http servers server MY-SERVER grpc gnmi +set system services http servers server MY-SERVER tls local-certificate lcert + +# Optional mutual authentication - Add: +set system services http servers server MY-SERVER tls mutual-authentication certificate-authority ca1 +set system services http servers server MY-SERVER tls mutual-authentication authentication-type request-and-require-cert-and-verify + +commit and-quit +``` diff --git a/img/JTS.png b/docs/img/JTS.png similarity index 100% rename from img/JTS.png rename to docs/img/JTS.png diff --git a/docs/img/favicon.ico b/docs/img/favicon.ico new file mode 100644 index 0000000..813d607 Binary files /dev/null and b/docs/img/favicon.ico differ diff --git a/img/grafana.png b/docs/img/grafana.png similarity index 100% rename from img/grafana.png rename to docs/img/grafana.png diff --git a/img/influx-mgt.png b/docs/img/influx-mgt.png similarity index 100% rename from img/influx-mgt.png rename to docs/img/influx-mgt.png diff --git a/docs/img/jtso-browser-1.png b/docs/img/jtso-browser-1.png new file mode 100644 index 0000000..325865c Binary files /dev/null and b/docs/img/jtso-browser-1.png differ diff --git a/docs/img/jtso-browser-2.png b/docs/img/jtso-browser-2.png new file mode 100644 index 0000000..2079991 Binary files /dev/null and b/docs/img/jtso-browser-2.png differ diff --git a/docs/img/jtso-browser-3.png b/docs/img/jtso-browser-3.png new file mode 100644 index 0000000..7238165 Binary files /dev/null and b/docs/img/jtso-browser-3.png differ diff --git a/docs/img/jtso-browser-4.png b/docs/img/jtso-browser-4.png new file mode 100644 index 0000000..11fc3c9 Binary files /dev/null and b/docs/img/jtso-browser-4.png differ diff --git a/docs/img/jtso-dark.png b/docs/img/jtso-dark.png new file mode 100644 index 0000000..f3c4f4c Binary files /dev/null and b/docs/img/jtso-dark.png differ diff --git a/docs/img/jtso-debug.png b/docs/img/jtso-debug.png new file mode 100644 index 0000000..74dbbee Binary files /dev/null and b/docs/img/jtso-debug.png differ diff --git a/docs/img/jtso-docs-1.png b/docs/img/jtso-docs-1.png new file mode 100644 index 0000000..f42dabb Binary files /dev/null and b/docs/img/jtso-docs-1.png differ diff --git a/docs/img/jtso-docs-2.png b/docs/img/jtso-docs-2.png new file mode 100644 index 0000000..8d37106 Binary files /dev/null and b/docs/img/jtso-docs-2.png differ diff --git a/docs/img/jtso-docs-3.png b/docs/img/jtso-docs-3.png new file mode 100644 index 0000000..a9c8ff4 Binary files /dev/null and b/docs/img/jtso-docs-3.png differ diff --git a/docs/img/jtso-docs-4.png b/docs/img/jtso-docs-4.png new file mode 100644 index 0000000..2c657cf Binary files /dev/null and b/docs/img/jtso-docs-4.png differ diff --git a/docs/img/jtso-main.png b/docs/img/jtso-main.png new file mode 100644 index 0000000..46f9d65 Binary files /dev/null and b/docs/img/jtso-main.png differ diff --git a/docs/img/jtso-ondemand-1.png b/docs/img/jtso-ondemand-1.png new file mode 100644 index 0000000..250bc09 Binary files /dev/null and b/docs/img/jtso-ondemand-1.png differ diff --git a/docs/img/jtso-ondemand-10.png b/docs/img/jtso-ondemand-10.png new file mode 100644 index 0000000..b6891bc Binary files /dev/null and b/docs/img/jtso-ondemand-10.png differ diff --git a/docs/img/jtso-ondemand-11.png b/docs/img/jtso-ondemand-11.png new file mode 100644 index 0000000..c981442 Binary files /dev/null and b/docs/img/jtso-ondemand-11.png differ diff --git a/docs/img/jtso-ondemand-12.png b/docs/img/jtso-ondemand-12.png new file mode 100644 index 0000000..c593c25 Binary files /dev/null and b/docs/img/jtso-ondemand-12.png differ diff --git a/docs/img/jtso-ondemand-13.png b/docs/img/jtso-ondemand-13.png new file mode 100644 index 0000000..825940e Binary files /dev/null and b/docs/img/jtso-ondemand-13.png differ diff --git a/docs/img/jtso-ondemand-14.png b/docs/img/jtso-ondemand-14.png new file mode 100644 index 0000000..74b29a6 Binary files /dev/null and b/docs/img/jtso-ondemand-14.png differ diff --git a/docs/img/jtso-ondemand-15.png b/docs/img/jtso-ondemand-15.png new file mode 100644 index 0000000..ae816c8 Binary files /dev/null and b/docs/img/jtso-ondemand-15.png differ diff --git a/docs/img/jtso-ondemand-16.png b/docs/img/jtso-ondemand-16.png new file mode 100644 index 0000000..062c7e6 Binary files /dev/null and b/docs/img/jtso-ondemand-16.png differ diff --git a/docs/img/jtso-ondemand-17.png b/docs/img/jtso-ondemand-17.png new file mode 100644 index 0000000..98ee56c Binary files /dev/null and b/docs/img/jtso-ondemand-17.png differ diff --git a/docs/img/jtso-ondemand-2.png b/docs/img/jtso-ondemand-2.png new file mode 100644 index 0000000..87c5bab Binary files /dev/null and b/docs/img/jtso-ondemand-2.png differ diff --git a/docs/img/jtso-ondemand-3.png b/docs/img/jtso-ondemand-3.png new file mode 100644 index 0000000..6d0f8e0 Binary files /dev/null and b/docs/img/jtso-ondemand-3.png differ diff --git a/docs/img/jtso-ondemand-4.png b/docs/img/jtso-ondemand-4.png new file mode 100644 index 0000000..f6c71a7 Binary files /dev/null and b/docs/img/jtso-ondemand-4.png differ diff --git a/docs/img/jtso-ondemand-5.png b/docs/img/jtso-ondemand-5.png new file mode 100644 index 0000000..c16e279 Binary files /dev/null and b/docs/img/jtso-ondemand-5.png differ diff --git a/docs/img/jtso-ondemand-6.png b/docs/img/jtso-ondemand-6.png new file mode 100644 index 0000000..9eb3a61 Binary files /dev/null and b/docs/img/jtso-ondemand-6.png differ diff --git a/docs/img/jtso-ondemand-7.png b/docs/img/jtso-ondemand-7.png new file mode 100644 index 0000000..d4aabc3 Binary files /dev/null and b/docs/img/jtso-ondemand-7.png differ diff --git a/docs/img/jtso-ondemand-8.png b/docs/img/jtso-ondemand-8.png new file mode 100644 index 0000000..f06e952 Binary files /dev/null and b/docs/img/jtso-ondemand-8.png differ diff --git a/docs/img/jtso-ondemand-9.png b/docs/img/jtso-ondemand-9.png new file mode 100644 index 0000000..64fc075 Binary files /dev/null and b/docs/img/jtso-ondemand-9.png differ diff --git a/docs/img/jtso-profile-1.png b/docs/img/jtso-profile-1.png new file mode 100644 index 0000000..3fb2abd Binary files /dev/null and b/docs/img/jtso-profile-1.png differ diff --git a/docs/img/jtso-profile-2.png b/docs/img/jtso-profile-2.png new file mode 100644 index 0000000..5fe18f5 Binary files /dev/null and b/docs/img/jtso-profile-2.png differ diff --git a/docs/img/jtso-rtrs.png b/docs/img/jtso-rtrs.png new file mode 100644 index 0000000..242b349 Binary files /dev/null and b/docs/img/jtso-rtrs.png differ diff --git a/docs/img/jtso-settings-1.png b/docs/img/jtso-settings-1.png new file mode 100644 index 0000000..5ac8c0c Binary files /dev/null and b/docs/img/jtso-settings-1.png differ diff --git a/docs/img/jtso-settings-2.png b/docs/img/jtso-settings-2.png new file mode 100644 index 0000000..d3c60d7 Binary files /dev/null and b/docs/img/jtso-settings-2.png differ diff --git a/docs/img/jtso-settings-3.png b/docs/img/jtso-settings-3.png new file mode 100644 index 0000000..782938f Binary files /dev/null and b/docs/img/jtso-settings-3.png differ diff --git a/docs/img/jtso-settings-4.png b/docs/img/jtso-settings-4.png new file mode 100644 index 0000000..ed249fd Binary files /dev/null and b/docs/img/jtso-settings-4.png differ diff --git a/docs/img/jtso-stats-1.png b/docs/img/jtso-stats-1.png new file mode 100644 index 0000000..a7f3c50 Binary files /dev/null and b/docs/img/jtso-stats-1.png differ diff --git a/docs/img/jtso-stats-2.png b/docs/img/jtso-stats-2.png new file mode 100644 index 0000000..b6bbded Binary files /dev/null and b/docs/img/jtso-stats-2.png differ diff --git a/img/kapa-code.png b/docs/img/kapa-code.png similarity index 100% rename from img/kapa-code.png rename to docs/img/kapa-code.png diff --git a/img/kapa-list.png b/docs/img/kapa-list.png similarity index 100% rename from img/kapa-list.png rename to docs/img/kapa-list.png diff --git a/docs/img/logo-med.png b/docs/img/logo-med.png new file mode 100644 index 0000000..b13c587 Binary files /dev/null and b/docs/img/logo-med.png differ diff --git a/img/profiles/bgp/bgp1.png b/docs/img/profiles/bgp/bgp1.png similarity index 100% rename from img/profiles/bgp/bgp1.png rename to docs/img/profiles/bgp/bgp1.png diff --git a/img/profiles/bgp/bgp2.png b/docs/img/profiles/bgp/bgp2.png similarity index 100% rename from img/profiles/bgp/bgp2.png rename to docs/img/profiles/bgp/bgp2.png diff --git a/img/profiles/ddos/ddos1.png b/docs/img/profiles/ddos/ddos1.png similarity index 100% rename from img/profiles/ddos/ddos1.png rename to docs/img/profiles/ddos/ddos1.png diff --git a/img/profiles/ddos/ddos2.png b/docs/img/profiles/ddos/ddos2.png similarity index 100% rename from img/profiles/ddos/ddos2.png rename to docs/img/profiles/ddos/ddos2.png diff --git a/img/profiles/filter/filter1.png b/docs/img/profiles/filter/filter1.png similarity index 100% rename from img/profiles/filter/filter1.png rename to docs/img/profiles/filter/filter1.png diff --git a/img/profiles/health/health1.png b/docs/img/profiles/health/health1.png similarity index 100% rename from img/profiles/health/health1.png rename to docs/img/profiles/health/health1.png diff --git a/img/profiles/health/health2.png b/docs/img/profiles/health/health2.png similarity index 100% rename from img/profiles/health/health2.png rename to docs/img/profiles/health/health2.png diff --git a/img/profiles/health/health3.png b/docs/img/profiles/health/health3.png similarity index 100% rename from img/profiles/health/health3.png rename to docs/img/profiles/health/health3.png diff --git a/img/profiles/health/health4.png b/docs/img/profiles/health/health4.png similarity index 100% rename from img/profiles/health/health4.png rename to docs/img/profiles/health/health4.png diff --git a/img/profiles/health/health5.png b/docs/img/profiles/health/health5.png similarity index 100% rename from img/profiles/health/health5.png rename to docs/img/profiles/health/health5.png diff --git a/img/profiles/health/hw-mon1.png b/docs/img/profiles/health/hw-mon1.png similarity index 100% rename from img/profiles/health/hw-mon1.png rename to docs/img/profiles/health/hw-mon1.png diff --git a/img/profiles/health/hw-mon2.png b/docs/img/profiles/health/hw-mon2.png similarity index 100% rename from img/profiles/health/hw-mon2.png rename to docs/img/profiles/health/hw-mon2.png diff --git a/img/profiles/optic/optic1.png b/docs/img/profiles/optic/optic1.png similarity index 100% rename from img/profiles/optic/optic1.png rename to docs/img/profiles/optic/optic1.png diff --git a/img/profiles/optic/optic2.png b/docs/img/profiles/optic/optic2.png similarity index 100% rename from img/profiles/optic/optic2.png rename to docs/img/profiles/optic/optic2.png diff --git a/img/optic3.png b/docs/img/profiles/optic/optic3.png similarity index 100% rename from img/optic3.png rename to docs/img/profiles/optic/optic3.png diff --git a/img/optic4.png b/docs/img/profiles/optic/optic4.png similarity index 100% rename from img/optic4.png rename to docs/img/profiles/optic/optic4.png diff --git a/img/profiles/power-ext/power1.png b/docs/img/profiles/power-ext/power1.png similarity index 100% rename from img/profiles/power-ext/power1.png rename to docs/img/profiles/power-ext/power1.png diff --git a/img/profiles/power-ext/power2.png b/docs/img/profiles/power-ext/power2.png similarity index 100% rename from img/profiles/power-ext/power2.png rename to docs/img/profiles/power-ext/power2.png diff --git a/img/profiles/power-ext/power3.png b/docs/img/profiles/power-ext/power3.png similarity index 100% rename from img/profiles/power-ext/power3.png rename to docs/img/profiles/power-ext/power3.png diff --git a/img/profiles/power-ext/power4.png b/docs/img/profiles/power-ext/power4.png similarity index 100% rename from img/profiles/power-ext/power4.png rename to docs/img/profiles/power-ext/power4.png diff --git a/img/profiles/power-ext/power5.png b/docs/img/profiles/power-ext/power5.png similarity index 100% rename from img/profiles/power-ext/power5.png rename to docs/img/profiles/power-ext/power5.png diff --git a/img/profiles/power-ext/power6.png b/docs/img/profiles/power-ext/power6.png similarity index 100% rename from img/profiles/power-ext/power6.png rename to docs/img/profiles/power-ext/power6.png diff --git a/img/profiles/power-ext/power7.png b/docs/img/profiles/power-ext/power7.png similarity index 100% rename from img/profiles/power-ext/power7.png rename to docs/img/profiles/power-ext/power7.png diff --git a/img/profiles/power-ext/power8.png b/docs/img/profiles/power-ext/power8.png similarity index 100% rename from img/profiles/power-ext/power8.png rename to docs/img/profiles/power-ext/power8.png diff --git a/img/profiles/power/power1.png b/docs/img/profiles/power/power1.png similarity index 100% rename from img/profiles/power/power1.png rename to docs/img/profiles/power/power1.png diff --git a/img/profiles/power/power2.png b/docs/img/profiles/power/power2.png similarity index 100% rename from img/profiles/power/power2.png rename to docs/img/profiles/power/power2.png diff --git a/img/profiles/power/power3.png b/docs/img/profiles/power/power3.png similarity index 100% rename from img/profiles/power/power3.png rename to docs/img/profiles/power/power3.png diff --git a/img/profiles/power/power4.png b/docs/img/profiles/power/power4.png similarity index 100% rename from img/profiles/power/power4.png rename to docs/img/profiles/power/power4.png diff --git a/img/profiles/power/power5.png b/docs/img/profiles/power/power5.png similarity index 100% rename from img/profiles/power/power5.png rename to docs/img/profiles/power/power5.png diff --git a/img/profiles/power/power6.png b/docs/img/profiles/power/power6.png similarity index 100% rename from img/profiles/power/power6.png rename to docs/img/profiles/power/power6.png diff --git a/img/profiles/power/power7.png b/docs/img/profiles/power/power7.png similarity index 100% rename from img/profiles/power/power7.png rename to docs/img/profiles/power/power7.png diff --git a/img/profiles/srmpls/srmpls1.png b/docs/img/profiles/srmpls/srmpls1.png similarity index 100% rename from img/profiles/srmpls/srmpls1.png rename to docs/img/profiles/srmpls/srmpls1.png diff --git a/img/profiles/srmpls/srmpls2.png b/docs/img/profiles/srmpls/srmpls2.png similarity index 100% rename from img/profiles/srmpls/srmpls2.png rename to docs/img/profiles/srmpls/srmpls2.png diff --git a/img/profiles/traffic/traffic1.png b/docs/img/profiles/traffic/traffic1.png similarity index 100% rename from img/profiles/traffic/traffic1.png rename to docs/img/profiles/traffic/traffic1.png diff --git a/img/profiles/traffic/traffic2.png b/docs/img/profiles/traffic/traffic2.png similarity index 100% rename from img/profiles/traffic/traffic2.png rename to docs/img/profiles/traffic/traffic2.png diff --git a/img/profiles/traffic/traffic3.png b/docs/img/profiles/traffic/traffic3.png similarity index 100% rename from img/profiles/traffic/traffic3.png rename to docs/img/profiles/traffic/traffic3.png diff --git a/img/profiles/traffic/traffic4.png b/docs/img/profiles/traffic/traffic4.png similarity index 100% rename from img/profiles/traffic/traffic4.png rename to docs/img/profiles/traffic/traffic4.png diff --git a/img/profiles/traffic/unit1.png b/docs/img/profiles/traffic/unit1.png similarity index 100% rename from img/profiles/traffic/unit1.png rename to docs/img/profiles/traffic/unit1.png diff --git a/img/profiles/traffic/unit2.png b/docs/img/profiles/traffic/unit2.png similarity index 100% rename from img/profiles/traffic/unit2.png rename to docs/img/profiles/traffic/unit2.png diff --git a/img/profiles/traffic/voq1.png b/docs/img/profiles/traffic/voq1.png similarity index 100% rename from img/profiles/traffic/voq1.png rename to docs/img/profiles/traffic/voq1.png diff --git a/img/profiles/traffic/voq2.png b/docs/img/profiles/traffic/voq2.png similarity index 100% rename from img/profiles/traffic/voq2.png rename to docs/img/profiles/traffic/voq2.png diff --git a/img/profiles/traffic/voq3.png b/docs/img/profiles/traffic/voq3.png similarity index 100% rename from img/profiles/traffic/voq3.png rename to docs/img/profiles/traffic/voq3.png diff --git a/docs/img/profiles/twamp/twamp1.png b/docs/img/profiles/twamp/twamp1.png new file mode 100644 index 0000000..3bcdf3b Binary files /dev/null and b/docs/img/profiles/twamp/twamp1.png differ diff --git a/docs/img/profiles/twamp/twamp2.png b/docs/img/profiles/twamp/twamp2.png new file mode 100644 index 0000000..af72500 Binary files /dev/null and b/docs/img/profiles/twamp/twamp2.png differ diff --git a/docs/img/version.png b/docs/img/version.png new file mode 100644 index 0000000..8ba75e1 Binary files /dev/null and b/docs/img/version.png differ diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..b2b84e9 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,144 @@ +# Juniper Telemetry Stack (JTS) + +
+

+ + logo + +

+
+ +## Disclaimer + +This is a personal (pet) project maintained on a **best-effort basis**. + +I am not a professional software developer — just a Network Engineer who enjoys coding and building useful tools 🙂. +Please be understanding if you encounter rough edges or imperfections. + +Contributions, feedback, and suggestions are always welcome. + +## Supported Use Cases (Profiles) + +OpenJTS currently supports the following monitoring profiles: + +- **HEALTH PROFILE** + Monitor overall router health, including environmental metrics. + +- **TRAFFIC PROFILE** + Traffic monitoring including errors, queue drops, VoQ, queue depth (hardware dependent), and various traffic KPIs for physical and logical interfaces. + +- **BGP PROFILE** + BGP statistics per neighbor, family, peer-group routing statistics, including on-change session events. + +- **DDOS PROFILE** + Monitoring of DDoS protection statistics. + +- **FILTER PROFILE** + Monitoring firewall filter counters and policers at both PFE and port levels. + +- **POWER PROFILE** + Power consumption monitoring for active chassis components, including temperature and fan speed. + Includes aggregated views. + +- **OPTIC PROFILE** + Monitoring of optical KPIs such as signal levels and alarms. + Supports OTN optics and includes dedicated dashboards for ZR/ZR+. + +- **SRMPLS PROFILE** + Monitoring SR-MPLS traffic per interface and per label (SID). + +- **TWAMP PROFILE** + Monitoring TWAMP Probe Results. + +--- + +> **Note:** Available telemetry data depends on platform and Junos version. +> Some profiles may not be supported on certain platforms or PFEs. +> Please refer to the **"Profiles Management"** section in the JTSO portal for detailed compatibility information. + +> **Note 2:** Some statistics require specific device configuration to be enabled. + +## Quick Overview + +Discover and adopt Juniper gRPC telemetry with this all-in-one, easy-to-deploy project. + +JTS is designed to simplify the deployment and understanding of Juniper Telemetry on routing platforms. +Multiple platforms are supported, although some profiles may not yet be fully qualified on every platform. + +- Supported Junos versions: **20.1 and later (including Junos EVO)** + +If you experience issues with specific hardware or software versions, please open a GitHub issue. + +Profiles are tested against recent Junos releases. Older versions may use different counter names (especially when OpenConfig models are involved). +Profiles can be patched quickly without modifying the core code. + +If you need a new profile for a specific use case, feel free to open an issue — contributions and ideas are welcome. + +## Project Structure + +JTS is built around three main repositories: + +- **OpenJTS** + https://github.com/door7302/openjts + Infrastructure deployment and profile definitions. + +- **JTSO (JTS Orchestrator)** + https://github.com/door7302/jtso + Orchestrator component source code. + +- **JTS Telegraf** + https://github.com/door7302/jts_telegraf + A fork of Telegraf including additional plugins and enhancements tailored for OpenJTS. + +For feedback or questions, you can contact: +**door7302@gmail.com** + +## Project Presentation + +This repository allows you to build from scratch a complete telemetry stack to monitor Juniper routing devices. + +The stack is called **JTS – Juniper Telemetry Stack**. + +It relies on the following open-source components: + +- **Telegraf** + Collects gNMI telemetry state data + (also supports NETCONF input for data not yet available via telemetry) + Performs data preprocessing. + +- **InfluxDB** + Time-series database for telemetry data storage. + +- **Kapacitor** + Aggregation and alerting engine. + +- **Grafana** + Visualization and dashboards. + +- **JTSO (JTS Orchestrator)** – developed in **Go (Golang)** + Developed by the TME AWAN Team, JTSO has two main roles: + 1. Stack management (router provisioning, profile selection) + 2. On-the-fly telemetry enrichment for improved visualization and aggregation + +JTS comes preloaded with configuration templates and dashboards for common use cases. +Profiles are packaged as `.tgz` files and stored in `compose/jtso/profiles/` + +Deployment is handled via **Docker Compose**, enabling one-command stack deployment. +Please ensure all prerequisites are met before deployment. + +## Platform Support + +JTS has been validated on: + +- **Ubuntu** +- **Debian** + +Other operating systems are not officially validated. + +## Telegraf Build Notice + +JTS currently uses a custom Telegraf build that includes additional enhancements developed by Juniper. + +These improvements are expected to be progressively contributed upstream to the official Telegraf project. + +![jts.png](./img/JTS.png) \ No newline at end of file diff --git a/docs/install.md b/docs/install.md new file mode 100644 index 0000000..bc976e3 --- /dev/null +++ b/docs/install.md @@ -0,0 +1,85 @@ +# Installation + +## Prerequisites + +Follow the official Docker documentation for Ubuntu: + +https://docs.docker.com/engine/install/ubuntu/ + +Then execute the following commands: + +```shell +sudo umask 022 + +sudo apt-get update +sudo apt-get install -y ca-certificates curl gnupg + +sudo install -m 0755 -d /etc/apt/keyrings +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +sudo chmod a+r /etc/apt/keyrings/docker.gpg + +echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + +sudo apt-get update + +sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +``` + +### First-Time Docker Login + +You must authenticate once to download images from Docker Hub: + +```shell +docker login --username +``` + +### Verify Installation + +Run the following test container: + +```shell +docker run hello-world +``` + +If everything is working properly, Docker should display a confirmation message. + +## Install OpenJTS + +### 1. Create a Dedicated User + +From the root account, create a dedicated user for OpenJTS: + +```shell +adduser openjts +adduser openjts sudo +``` + +### 2. Switch to the New User + +```shell +su - openjts +``` + +### 3. Clone the Repository + +Create a working directory and clone the OpenJTS repository: + +```shell +mkdir -p ~/JTS +cd ~/JTS + +git clone https://github.com/door7302/openjts . +``` + +> **Note:** The last dot "." is useful. Don't miss it. + +### 4. Build the Stack + +Navigate to the `compose` directory and build all containers: + +```shell +cd compose +docker compose build --no-cache +``` + +The stack images will now be built locally. You are ready to proceed with the configuration phase. \ No newline at end of file diff --git a/docs/js/extra.js b/docs/js/extra.js new file mode 100644 index 0000000..4273b5e --- /dev/null +++ b/docs/js/extra.js @@ -0,0 +1,22 @@ +document.addEventListener("DOMContentLoaded", function() { + const lightboxLinks = []; + + document.querySelectorAll('.md-typeset img').forEach(img => { + // Skip if already inside a link + if (img.parentNode.tagName.toLowerCase() === 'a') return; + + // Wrap image in for lightbox + const link = document.createElement('a'); + link.href = img.src; + link.classList.add('glightbox'); + img.parentNode.insertBefore(link, img); + link.appendChild(img); + + // Add zoom icon on hover + link.style.position = 'relative'; + link.style.display = 'inline-block'; + }); + + // Initialize GLightbox + GLightbox({ selector: '.glightbox' }); +}); \ No newline at end of file diff --git a/docs/profiles.md b/docs/profiles.md new file mode 100644 index 0000000..f98958a --- /dev/null +++ b/docs/profiles.md @@ -0,0 +1,322 @@ +# Native Profiles information + +Each profile consists of a set of files packaged into a `.tgz` archive. +These archives are stored in the `compose/jtso/profile` directory. + +> This directory is continuously monitored by JTSO component. When a new version of a profile is added or updated, it automatically triggers a stack reconfiguration. + +## Router Health Profile + +Router health KPIs include CPU, memory, errors, drops, and more. + +### Dashboard Screenshots + +#### Router Health Details + +![health1.png](./img/profiles/health/health1.png) + +- (1) Select router +- (2) Current real-time error status – monitored by the **ALARMING** Telegraf plugin +- (3) Current chassis alarms +- (4) Current RE master/backup CPU and memory usage +- (5) Current CPU and memory usage for all MPCs/FPCs +- (6) On-change based syslog events + +![health2.png](./img/profiles/health/health2.png) + +- (1) Details of current chassis alarms +- (2) All past and active MPC/FPC CMERROR events +- (3) Current router alarms – monitored by the **ALARMING** Telegraf plugin +- (4) Detailed view of current router alarms + +![health3.png](./img/profiles/health/health3.png) + +- (1) CPU and memory usage history for master and backup REs +- (2) CPU and memory usage history for all MPCs/FPCs + +![health4.png](./img/profiles/health/health4.png) + +- (1) CPU consumption history of all RE master processes +- (2) CPU usage history per RE master core +- (3) Memory consumption history of all RE master processes + +![health5.png](./img/profiles/health/health5.png) + +- (1) Fabric drops history per FPC/MPC +- (2) Input fabric rate (pps) history per FPC/MPC +- (3) Output fabric rate (pps) history per FPC/MPC + +#### NPU Statistics + +![hw-mon1.png](./img/profiles/health/hw-mon1.png) + +- (1) Select hardware component (depends on line card type) +- (2) Select hardware property(ies) + +![hw-mon2.png](./img/profiles/health/hw-mon2.png) + +- (1) Router information +- (2) Current chassis alarms +- (3) Hardware KPI trends over time +- (4) Current hardware KPI values + +## BGP Profile + +BGP KPIs include peer-groups, address families, and per-peer statistics. + +### Dashboard Screenshots + +![bgp1.png](./img/profiles/bgp/bgp1.png) + +- (1) Filters by router, routing instance, peer-group, family, and neighbor +- (2) Number of active paths per peer-group +- (3) Received, installed, and sent prefixes per peer-group +- (4) Number of active paths per family +- (5) On-change BGP events + +![bgp2.png](./img/profiles/bgp/bgp2.png) + +- (1) Per-neighbor detailed information +- (2) Peer name, peer AS, session state, input/output queues +- (3) Prefix-limit per family (if configured) +- (4) Historical view of received, installed, rejected, and sent routes +- (5) Per-family route details + +## Traffic / CoS Profile + +Traffic KPIs include per-queue statistics, per-port statistics, queue depth, and drops per queue or port. + +### Dashboard Screenshots + +#### Physical Interfaces Traffic + +![traffic1.png](./img/profiles/traffic/traffic1.png) + +- (1) Filter by router and physical interface +- (2) Real-time traffic alarms (RED, TAIL, CRC drops) – monitored by the **ALARMING** Telegraf plugin +- (3) Overall traffic distribution per queue +- (4) Details of real-time traffic alarms + +![traffic2.png](./img/profiles/traffic/traffic2.png) + +- (1) Per-port statistics (in/out bps and pps) +- (2) Per-port queue drops (RED and TAIL) over time + +![traffic3.png](./img/profiles/traffic/traffic3.png) + +- (1) Real-time queue depth utilization (current) +- (2) Real-time queue depth utilization (peak) +- (3) Traffic distribution per queue +- (4) Queued traffic per queue (bps) +- (5) Forwarded traffic per queue (bps) + +![traffic4.png](./img/profiles/traffic/traffic4.png) + +- (1) Queued traffic per queue (bps) +- (2) Forwarded traffic per queue (bps) +- (3) Queued traffic per queue (pps) +- (4) Forwarded traffic per queue (pps) + +#### Logical Interfaces Traffic + +![unit1.png](./img/profiles/traffic/unit1.png) + +- (1) Select physical interface and unit(s) +- (2) Port statistics +- (3) Input traffic load sharing per unit +- (4) Output traffic load sharing per unit + +![unit2.png](./img/profiles/traffic/unit2.png) + +- (1) Per-unit traffic in bps and pps + +#### VoQ System (PTX Only) + +Requires specific device configuration. + +![voq1.png](./img/profiles/traffic/voq1.png) + +- (1) Filter by router and physical interface +- (2) Real-time traffic alarms +- (3) Traffic distribution per queue +- (4) Alarm details +- (5) Per-port traffic statistics and traffic types +- (6) Per-queue traffic distribution per port + +![voq2.png](./img/profiles/traffic/voq2.png) + +- (1) Forwarded traffic per egress queue (bps and pps) +- (2) Egress queue drops + +![voq3.png](./img/profiles/traffic/voq3.png) + +- (1) Real-time VoQ depth (current, average, peak) +- (2) VoQ depth history + +## Optic Profile + +Optic KPIs include optic levels, physical errors, and per-optic details. + +### Dashboard Screenshots + +![optic1.png](./img/profiles/optic/optic1.png) + +- (1) Filter by router and physical port +- (2) Real-time CRC/BLOCK error alarms +- (3) CRC/BLOCK error history +- (4) Per-lane TX, RX, and BIAS values + +![optic2.png](./img/profiles/optic/optic2.png) + +- (1) Per-port optic alarms + +![optic3.png](./img/profiles/optic/optic3.png) + +- (1) Inventory information +- (2) Per-lane RX values +- (3) Per-lane TX values +- (4) RX/TX history with warning thresholds +- (5) BIAS and temperature history +- (6) CRC and BLOCK error history +- (7) Input frame size distribution history + +![optic4.png](./img/profiles/optic/optic4.png) + +- (1) OTN-specific information +- (2) Frequency and carrier frequency offset +- (3) OSNR and ESNR history +- (4) Pre-FEC engine history +- (5) Chromatic dispersion history +- (6) SOPDM history +- (7) PDL history + +## Power Profile + +Power KPIs include per-component consumption, total power usage, temperature, fan state, and efficiency metrics. + +### Dashboard Screenshots + +#### Per-Router Power Consumption + +![power1.png](./img/profiles/power-ext/power1.png) + +- (1) Chassis information +- (2) Configured ambient temperature +- (3) Overall chassis power metrics +- (4) Per-zone power metrics (multi-zone chassis) + +![power2.png](./img/profiles/power-ext/power2.png) + +- (1) Total input traffic (bps) +- (2) Total input traffic (pps) +- (3) Watts per Gbps ratio + +![power3.png](./img/profiles/power-ext/power3.png) + +- (1) Total chassis power history +- (2) Per-component power history + +![power4.png](./img/profiles/power-ext/power4.png) + +- (1) Per-component temperature history + +![power5.png](./img/profiles/power-ext/power5.png) + +- (1) Current MPC/FPC power consumption +- (2) MPC/FPC power history +- (3) Current fan power consumption +- (4) Fan power history + +![power6.png](./img/profiles/power-ext/power6.png) + +- (1) Current fan speed +- (2) Fan speed history + +![power7.png](./img/profiles/power-ext/power7.png) + +- (1) CB/Fabric/RE power consumption +- (2) CB/Fabric/RE power history +- (3) PEM/PSM power consumption +- (4) PEM/PSM power history + +#### Power Aggregation Dashboard + +![power8.png](./img/profiles/power-ext/power8.png) + +- (1) Total power consumption +- (2) Power consumption per model +- (3) Total power consumption history +- (4) Power consumption history per chassis model + +## Firewall Profile + +Firewall KPIs include per-term counters and policer drop counters. + +### Dashboard Screenshots + +![filter1.png](./img/profiles/filter/filter1.png) + +- (1) Filter by router, filter, counter, and policer history +- (2) PPS view (counters shown as positive, policer drops as negative) +- (3) BPS view (counters shown as positive, policer drops as negative) + +## DDOS Profile + +DDOS KPIs include per-MPC protection statistics. +Currently supported on **MX** and **PTX** platforms only. + +### Dashboard Screenshots + +![ddos1.png](./img/profiles/ddos/ddos1.png) + +- (1) Filter by router, protocol, and sub-protocol +- (2) Global dashboard showing routers under DDOS policer violation (last 15 minutes) +- (3) Per-protocol details for the selected router +- (4) Aggregated protocol statistics (received, dropped, punted to RE) +- (5) Received PPS history per line card +- (6) Dropped PPS history per line card +- (7) Punted PPS history per line card + +## SR MPLS Profile + +SR MPLS KPIs include traffic per interface, per SID, ingress, and egress. +Requires specific device configuration. + +### Dashboard Screenshots + +#### Per-Interface SR MPLS Statistics + +![srmpls1.png](./img/profiles/srmpls/srmpls1.png) + +- (1) Filter by router and physical interface +- (2) SR MPLS traffic in/out (bps and pps) +- (3) Percentage of SR MPLS traffic relative to total interface traffic + +#### Per-Label (SID) SR MPLS Statistics + +![srmpls2.png](./img/profiles/srmpls/srmpls2.png) + +- (1) Filter by router and MPLS label (derived from SID) +- (2) Traffic load per SID (label) +- (3) Traffic in bps and pps per SID (label) + + +## TWAMP Profile + +TWAMP profile includes TWAMP Lite statistics. + +### Dashboard Screenshots + +#### Global and + +![twamp1.png](./img/profiles/twamp/twamp1.png) + +- (1) Filter by router and Test Owner, Test Name, Result Scope (Only Last Test supported today) and Probe Type. +- (2) Overall current KPIs +- (3) RTT for All Probe Types +- (4) Min, Max, Avg. RTT trend for a specific Probe Type + +![twamp2.png](./img/profiles/twamp/twamp2.png) + +- (1) Per Test RTT/Jitter Snapshot for a given Probe Type +- (2) Injest cadence for a given Probe Type \ No newline at end of file diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000..d0f1577 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,148 @@ +/* ===================================================== */ +/* 🔹 COMMON (theme-agnostic) */ +/* ===================================================== */ + +/* Zoomable images (glightbox) */ +.md-typeset a.glightbox { + position: relative; + display: inline-block; + cursor: zoom-in; +} + +.md-typeset a.glightbox::after { + content: "\1F50D"; /* 🔍 Unicode magnifying glass icon */ + position: absolute; + top: 8px; + right: 8px; + font-size: 1.2em; + color: rgba(255,255,255,0.8); + text-shadow: 0 0 2px #000; + opacity: 0; + transition: opacity 0.2s ease-in-out; + pointer-events: none; +} + +.md-typeset a.glightbox:hover::after { + opacity: 1; +} + +/* Images */ +.md-typeset img { + max-width: 70% !important; + height: auto !important; + display: block !important; + margin-left: auto !important; + margin-right: auto !important; +} + +/* Ensure width attribute images behave correctly */ +.md-typeset img[width] { + max-width: none !important; + height: auto !important; + display: block !important; + margin-left: auto !important; + margin-right: auto !important; +} + +/* Center ALL Markdown tables */ +.md-typeset .md-typeset__table { + display: flex; + justify-content: center; +} + +.md-typeset .md-typeset__table table { + width: max-content; + max-width: 100%; + margin: 0 auto; +} + +/* Page layout */ +.md-grid { + max-width: 85rem; +} + +/* Headings spacing */ +.md-typeset h1 { + margin: 0 0 0.25em; +} + +.md-typeset h2 { + margin: 0.6em 0 0.64em; +} + +/* Footer content (icons, links) */ +.mdx-content__footer { + margin-top: 20px; + text-align: center; +} + +.mdx-content__footer a { + display: inline-block; + transition: transform 250ms cubic-bezier(0.1, 0.7, 0.1, 1), color 125ms; +} + +.mdx-content__footer a:focus, +.mdx-content__footer a:hover { + transform: scale(1.2); +} + +.mdx-content__footer hr { + display: inline-block; + width: 40px; + margin: 16px; + vertical-align: middle; + background-color: currentColor; + border: none; +} + +/* Footer links (both themes) */ +.md-footer a { + color: white !important; +} + + +/* ===================================================== */ +/* 🌞 LIGHT THEME (default) */ +/* ===================================================== */ + +[data-md-color-scheme="default"] .md-header, +[data-md-color-scheme="default"] .md-header__inner { + background-color: #01a982 !important; +} + +[data-md-color-scheme="default"] .md-tabs { + background-color: #01a982 !important; +} + +[data-md-color-scheme="default"] .md-tabs__item--active > .md-tabs__link { + color: white !important; +} + +[data-md-color-scheme="default"] .md-tabs__link:hover { + color: white; +} + +[data-md-color-scheme="default"] .md-footer { + background-color: #01a982 !important; + color: white !important; +} + + +/* ===================================================== */ +/* 🌙 DARK THEME (slate) */ +/* ===================================================== */ + +[data-md-color-scheme="slate"] .md-header, +[data-md-color-scheme="slate"] .md-header__inner, +[data-md-color-scheme="slate"] .md-tabs { + background-color: #008567 !important; +} + +[data-md-color-scheme="slate"] .md-tabs__item--active > .md-tabs__link { + color: white !important; +} + +[data-md-color-scheme="slate"] .md-footer { + background-color: #008567 !important; + color: white !important; +} \ No newline at end of file diff --git a/docs/update.md b/docs/update.md new file mode 100644 index 0000000..dec86f8 --- /dev/null +++ b/docs/update.md @@ -0,0 +1,55 @@ +# Update the Stack + +## Update JTS Containers + +To update OpenJTS, follow the steps below. + +### 1. Stop the Stack + +```shell +docker compose down +``` + +### 2. Pull the Latest Changes + +```shell +git pull +``` + +If you encounter local modification conflicts, you can stash your changes first: + +```shell +git stash +git pull +``` + +### 3. Remove Old Images + +Remove the previously built images to ensure a clean rebuild: + +```shell +docker image rm jtso -f +docker image rm jts_telegraf -f +``` + +### 4. Rebuild Containers + +```shell +docker compose build --no-cache +``` + +This forces Docker to rebuild all images without using cached layers. + +### 5. Restart the Stack + +```shell +docker compose up -d +``` + +The stack is now updated and running with the latest version. + +### 6. Version Checking + +Version of each OpenJTS component is visible at the bottom of the main UI page: + +![jts.png](./img/version.png) \ No newline at end of file diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 0000000..afec8a4 --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,515 @@ +# Start OpenJTS + +## Start the Stack + +To start OpenJTS, deploy the stack using Docker Compose. + +```shell +# Start the stack (single Telegraf instance) +cd compose/ +sudo docker compose up -d +``` + +## Verify Containers + +You can verify that all containers are running with: + +```shell +sudo docker compose ps +``` + +> Note: Telegraf containers are started only if at least one router is assigned to the corresponding instance. + +## JTS Logs + +JTS logs are written to: + +``` +/var/log/jtso.log +``` + +## Stop the Stack + +To stop and remove the running containers: + +```shell +cd compose/ +sudo docker compose down +``` + +## Managing the Stack via JTSO + +Once the stack is running, access the JTSO portal: + +``` +http(s)://:/index.html +``` + +The main page provides: + +- Stack status overview +- InfluxDB database full cleanup via the **Clear DB** button +- Change the InfluxDB database retention policy value via the **Change Retention** button +- Direct access to Chronograf (InfluxDB & Kapacitor management) +- Direct access to Grafana via the **Open** button + +![jtso-main.png](./img/jtso-main.png) + +A dark theme is available (top-right corner): + +![jtso-dark.png](./img/jtso-dark.png) + +### Telegraf Containers Overview + +Each Telegraf container displays two indicators: + +- **Left number** → Number of routers assigned to the container +- **Right "D" button** → Enables Debug mode + +When Debug is enabled, the container restarts automatically in debug mode. +The button turns **red** when active. + +⚠️ Debug mode generates large log files. Use it only for troubleshooting. + +![jtso-debug.png](./img/jtso-debug.png) + +## Change Settings + +Go to: + +``` +Admin > Settings +``` + +### Change Credentials + +![jtso-settings-1.png](./img/jtso-settings-1.png) + +Here you must configure: + +- NETCONF username/password +- gNMI username/password + +> **Note**: Default credential for both protocols is lab/lab123 + +⚠️ **These credentials must be identical across all routers** + +### Enabling/Disabling gNMI TLS + +![jtso-settings-2.png](./img/jtso-settings-2.png) + +You can also configure: + +- Enable/Disable TLS for gNMI (global setting) +- Skip certificate verification (enabled by default) +- Client-side TLS authentication (disabled by default) + +⚠️ **TLS configuration is global: either all routers use TLS or none** + +> **Note**: By default the tool uses clear-text mode for gNMI + +### Tunning Telegraf Parameters + +![jtso-settings-2.png](./img/jtso-settings-3.png) + +You could tune some global telegraf paramaters. Changes will affect all the Telegraf instances. +You could tune these parameters: + +- `metric_batch_size` (default: `5000`) + +**Definition:** +Maximum number of metrics sent to an output plugin in a single write operation. + +**Implications:** +Larger value → fewer write calls, better throughput efficiency. Smaller value → more frequent writes, lower per-flush memory usage. + +- `metric_buffer_limit` (default: `100000`) + +**Definition:** +Maximum number of metrics that can be queued in memory waiting to be written. + +**Behavior:** +If outputs are slow or unreachable, metrics accumulate in memory. When the limit is reached, new incoming metrics are dropped. + +**Recommendation:** +Should be at least `2 × metric_batch_size`. + +- `flush_interval` (default: `5s`) + +**Definition:** +Time interval between flush attempts to output plugins. + +**Behavior:** +Every `flush_interval`, up to `metric_batch_size` metrics are sent. Lower value → lower latency. Higher value → better batching efficiency. + +- `flush_jitter` (default: `0s`) + +**Definition:** +Random delay added to the `flush_interval` before each flush. + +**Purpose:** +Prevents synchronized flush spikes when multiple Telegraf instances run simultaneously. Useful in large distributed deployments. + +**Example behavior:** +- `flush_interval = 10s` +- `flush_jitter = 5s` + +> Actual flush occurs randomly between 10s and 15s. + +### Enable Kafka export + +You could use Kafka export in parallel of the data injestion into InfluxDB. + +> **Note*: Kafka is not part of the stack + +Make sure the OpenJTS VM will be able to connect to Kafka bus, otherwise the telegraf instances should continoustly reboot. + +![jtso-settings-4.png](./img/jtso-settings-4.png) + +External Kafka export applies to all profiles including On-demand profile. As of now, several Kafka Brokers may be configured, but only one Topic is allowed today. You could configure: + +- **Kafka Brokers**: a list of tuple (address:port) seperated with a comma +- **Kafka Topic**: the topic on which to produce +- **Kafka Version**: the version of the Kafka bus +- **Kafka Format**: the encoding format - today only **json** or **influx** format are supported +- **Kafka Compression**: the supported codec are: **none**, **gzip**, **snappy**, **lz4** and **zstd** +- **Kafka Max Message Size**: Value in bytes - default value is **1MB** + +## Configure Inventory + +Go to: + +``` +Routers +``` + +For each router, configure: + +- A unique short name (internal reference) +- IP address or hostname + +JTSO will automatically establish a NETCONF session to retrieve device facts (model, version, etc.). + +![jtso-rtrs.png](./img/jtso-rtrs.png) + +You can also import a CSV file. The required format is shown by clicking the **Info** button or as below: + +```csv +shortName;hostName +``` + +Alternatively, to refresh a router's facts, click the refresh **icon** next to the desired router. You may also remove a router by clicking on the delete **icon**. + + +## Profiles Management + +Go to: + +``` +Profiles > Management +``` + +This section provides: + +- Sensors and counters used per profile +- Telegraf configuration details per-platform/version +- Included Grafana dashboards +- Modification of the streaming **interval** rates. + +![jtso-docs-1.png](./img/jtso-docs-1.png) + +You can click on the **Config** button of a given Platform/Version to inspect the JSON definition used by JTSO. + +This JSON file will be dynamically rendered into a Telegraf TOML configuration file (See. Profiles Association section) + +![jtso-docs-2.png](./img/jtso-docs-2.png) + +By clicking the **Sensors** button, you can view: + +- The sensors used by the profile +- The sensor origin: **native** or **openconfig** +- The default or modified interval rate +- Sensor aliases, if any +- A list of leaves (counters) collected and stored in the database + +![jtso-docs-3.png](./img/jtso-docs-3.png) + +You can change the default interval rate for each sensor (minimum 2 seconds) by clicking the **Modify Interval(s)** button. + +![jtso-docs-4.png](./img/jtso-docs-4.png) + +⚠️ This change applies profile-wide, affecting all platforms and versions. +You can revert to the default interval by clicking the **Reset to Default** button. + +## Profiles Associations + +Go to: + +``` +Profiles > Associations +``` + +From this page, you can assign or remove profiles for each router. +Any modification automatically triggers a stack reconfiguration. + +![jtso-profile-1.png](./img/jtso-profile-1.png) + +You can also import a CSV file. The required format is displayed by clicking the **Info** button or as shown below: + +```csv +shortName;profile1;profile2;profile3 +``` + +Once profiles are assigned, they are combined to generate a Telegraf configuration. +To view the full aggregated Telegraf TOML configuration, click the green **file** icon: + +![jtso-profile-2.png](./img/jtso-profile-2.png) + +## Browse a Sensor Path + +Go to: + +``` +Tools > Gnmi Browser +``` + +Steps: + +1. Select a router +2. Enter a sensor path +3. Click Analyze + +The **Merge** option replaces numeric keys with `X` for easier analysis. +Uncheck Merge for full XPath expansion. + +![jtso-browser-1.png](./img/jtso-browser-1.png) + +Analysis takes approximately one minute. Number of extracted XPaths are displayed in real time: + +![jtso-browser-2.png](./img/jtso-browser-2.png) + +You can then export the full XPath list by clicking on the **export** button. + +![jtso-browser-3.png](./img/jtso-browser-3.png) + +Results are displayed in tree view format: + +- Expand/Collapse tree +- Search within tree (matches highlighted in yellow) + +![jtso-browser-4.png](./img/jtso-browser-4.png) + +## Create On-Demand Graph + +This feature is designed for troubleshooting purposes when existing profiles are not sufficient. + +> At the time of writing, the On-Demand Graph supports **only one custom profile at a time**. + +It also provides a simple way to share custom profiles created by end users with the OpenJTS maintainer. This helps speed up the integration of new profiles by supplying a JSON configuration file (see below). + +``` +Tools > On-Demand Graph +``` + +The main On-Demand Graph UI is shown below: + +![jtso-ondemand-1.png](./img/jtso-ondemand-1.png) + +### Adding Sensors + +There are two ways to add sensors: + +- **Manual** (more complex) +- **Assisted** (recommended when state data is available on devices) + +For both approaches, you must first enter a sensor path in the corresponding input field: + +![jtso-ondemand-2.png](./img/jtso-ondemand-2.png) + +### Manual Configuration + +Manual configuration is available using the **+ Field** and **+ Alias** buttons. + +Clicking on **+ Field** opens the following dialog: + +![jtso-ondemand-3.png](./img/jtso-ondemand-3.png) + +You can enter either: +- A full field path, or +- A relative path from the previously entered sensor path + +To use a relative path, prefix it with `./`. + +You can apply two optional pre-processing operations on a field: + +- **Convert to float** before ingesting into the database (useful if the original value is a string) +- **Compute rate** before ingestion (highly recommended for incremental counters such as `in-bytes`, `in-packets`, etc.) + +You may also associate a list (sperated with comma) of tags (**full XPath keys is required**) with the field. + +Aliases can be added using the **+ Alias** button. This is useful when legacy paths are redirected to other paths (often OpenConfig paths). Telegraf must be aware of these aliases to subscribe correctly. + +![jtso-ondemand-4.png](./img/jtso-ondemand-4.png) + +Once configured manually, you should see the selected fields, tags, and aliases: + +![jtso-ondemand-5.png](./img/jtso-ondemand-5.png) + +### Assisted Configuration (Recommended) + +The assisted method is recommended when routers expose the desired state data and are reachable by OpenJTS. + +After entering a sensor path, click on **Analyze path instead**. This opens a new window where you can: + +1. Select a router with available state data +2. Click **Launch a gNMI collect** + +![jtso-ondemand-6.png](./img/jtso-ondemand-6.png) + +Wait approximately one minute while OpenJTS collects the initial state data. Once completed, a list of available fields (leaves), tags, and aliases is displayed: + +![jtso-ondemand-7.png](./img/jtso-ondemand-7.png) + +Tags are automatically inherited and do not require selection. + +In most cases, aliases with the same prefix as the original sensor path do not need to be selected. If unsure, you may include them. + +For each available field, select: +- The fields to monitor +- Whether to compute a **rate** (recommended for incremental counters) +- Whether to convert the value to **float** + +Once your selection is complete, click **Monitor**. The selected fields, tags, and aliases will appear, similar to the manual method: + +![jtso-ondemand-8.png](./img/jtso-ondemand-8.png) + +### Finalizing the Sensor Path + +Set the collection interval (in seconds), then click **Add Path**. +The configured path will appear in the lower table: + +![jtso-ondemand-9.png](./img/jtso-ondemand-9.png) + +You can repeat the process to add additional paths. + +### Profile Management + +Save your profile once it is ready (you can save at any time). +An unsaved profile is indicated by a **red floppy disk** icon: + +![jtso-ondemand-10.png](./img/jtso-ondemand-10.png) + +If the profile has never been saved, it will retain the default name `no-name`. + +From left to right, the available profile actions are: + +- **Load**: Load an existing on-demand profile from the OpenJTS server +- **Save**: Save the current on-demand profile to the OpenJTS server +- **Save As**: Save a copy of the on-demand profile under a new name +- **Export**: Export the on-demand profile as a JSON file to the local machine + +> **Export** is useful for sharing troubleshooting details or requesting the creation of a native OpenJTS profile via a GitHub issue. + +Once saved, the red floppy disk icon disappears: + +![jtso-ondemand-11.png](./img/jtso-ondemand-11.png) + +### Device Selection and Data Collection + +Select the devices to which the on-demand profile should apply, then click **Update Devices**: + +![jtso-ondemand-12.png](./img/jtso-ondemand-12.png) + +Three controls are available for managing data collection: + +![jtso-ondemand-13.png](./img/jtso-ondemand-13.png) + +- **Start / Stop**: Start or stop data collection +- **Clear On-Demand DB**: Remove only data collected by on-demand profiles +- **Reset All**: Reset the On-Demand Graph tool to a blank state + +When data collection is running, a blinking **red circle** indicates active collection: + +![jtso-ondemand-14.png](./img/jtso-ondemand-14.png) + +You may leave this page; data collection continues in the background. +On the main page, the On-Demand Telegraf instance appears **UP**, showing the number of active routers (2 in this example): + +![jtso-ondemand-15.png](./img/jtso-ondemand-15.png) + +### Grafana Dashboard + +A dedicated Grafana dashboard is automatically created: + +![jtso-ondemand-16.png](./img/jtso-ondemand-16.png) + +- One **row** is created per sensor path +- One **panel** is created per field +- All tags are converted into Grafana **variables** at the top of the dashboard + +![jtso-ondemand-17.png](./img/jtso-ondemand-17.png) + +## Monitor Stack Performance + +Go to: + +``` +Admin > Stack Util. & Logs +``` + +Monitor: + +- CPU usage +- Memory consumption +- Container status + +![jtso-stats-1.png](./img/jtso-stats-1.png) + +You can also view container logs directly: + +![jtso-stats-2.png](./img/jtso-stats-2.png) + +## Manage InfluxDB + +Go to: + +``` +Admin > Manage InfluxDB +``` + +This opens the Chronograf interface for managing InfluxDB measurements. + +![influx-mgt.png](./img/influx-mgt.png) + +## Manage Kapacitor + +Go to: + +``` +Admin > Manage Tick Scripts +``` + +This opens the Chronograf interface for managing Kapacitor Tick scripts. + +![kapa-list.png](./img/kapa-list.png) + +You can view or edit a specific script: + +![kapa-code.png](./img/kapa-code.png) + + +# Access Grafana Dashboards + +Go to: + +``` +Grafana +``` + +This provides direct access to the Grafana portal. + +![grafana.png](./img/grafana.png) + +--- + +Enjoy 🙂 \ No newline at end of file diff --git a/img/jtso-browser.png b/img/jtso-browser.png deleted file mode 100644 index e70e07b..0000000 Binary files a/img/jtso-browser.png and /dev/null differ diff --git a/img/jtso-config.png b/img/jtso-config.png deleted file mode 100644 index 6ca1ecf..0000000 Binary files a/img/jtso-config.png and /dev/null differ diff --git a/img/jtso-cred.png b/img/jtso-cred.png deleted file mode 100644 index 750b6be..0000000 Binary files a/img/jtso-cred.png and /dev/null differ diff --git a/img/jtso-dark.png b/img/jtso-dark.png deleted file mode 100644 index 634c5dd..0000000 Binary files a/img/jtso-dark.png and /dev/null differ diff --git a/img/jtso-debug.png b/img/jtso-debug.png deleted file mode 100644 index 8b2747d..0000000 Binary files a/img/jtso-debug.png and /dev/null differ diff --git a/img/jtso-doc.png b/img/jtso-doc.png deleted file mode 100644 index 2605f3b..0000000 Binary files a/img/jtso-doc.png and /dev/null differ diff --git a/img/jtso-export.png b/img/jtso-export.png deleted file mode 100644 index 235de09..0000000 Binary files a/img/jtso-export.png and /dev/null differ diff --git a/img/jtso-logs.png b/img/jtso-logs.png deleted file mode 100644 index 0018eb7..0000000 Binary files a/img/jtso-logs.png and /dev/null differ diff --git a/img/jtso-main.png b/img/jtso-main.png deleted file mode 100644 index c658336..0000000 Binary files a/img/jtso-main.png and /dev/null differ diff --git a/img/jtso-profile.png b/img/jtso-profile.png deleted file mode 100644 index 4b40dad..0000000 Binary files a/img/jtso-profile.png and /dev/null differ diff --git a/img/jtso-rtrs.png b/img/jtso-rtrs.png deleted file mode 100644 index 53aa128..0000000 Binary files a/img/jtso-rtrs.png and /dev/null differ diff --git a/img/jtso-search.png b/img/jtso-search.png deleted file mode 100644 index 2ca4dd9..0000000 Binary files a/img/jtso-search.png and /dev/null differ diff --git a/img/jtso-stats.png b/img/jtso-stats.png deleted file mode 100644 index e936016..0000000 Binary files a/img/jtso-stats.png and /dev/null differ diff --git a/img/jtso-xpaths.png b/img/jtso-xpaths.png deleted file mode 100644 index c69be4b..0000000 Binary files a/img/jtso-xpaths.png and /dev/null differ diff --git a/img/profiles/optic/optic3.png b/img/profiles/optic/optic3.png deleted file mode 100644 index f7762fa..0000000 Binary files a/img/profiles/optic/optic3.png and /dev/null differ diff --git a/img/profiles/optic/optic4.png b/img/profiles/optic/optic4.png deleted file mode 100644 index 897d427..0000000 Binary files a/img/profiles/optic/optic4.png and /dev/null differ diff --git a/img/sensors/bgp.png b/img/sensors/bgp.png deleted file mode 100644 index 866a40a..0000000 Binary files a/img/sensors/bgp.png and /dev/null differ diff --git a/img/sensors/ddos.png b/img/sensors/ddos.png deleted file mode 100644 index 0aed1d3..0000000 Binary files a/img/sensors/ddos.png and /dev/null differ diff --git a/img/sensors/filter.png b/img/sensors/filter.png deleted file mode 100644 index 1700d50..0000000 Binary files a/img/sensors/filter.png and /dev/null differ diff --git a/img/sensors/health.png b/img/sensors/health.png deleted file mode 100644 index a33ae7d..0000000 Binary files a/img/sensors/health.png and /dev/null differ diff --git a/img/sensors/optic.png b/img/sensors/optic.png deleted file mode 100644 index b759808..0000000 Binary files a/img/sensors/optic.png and /dev/null differ diff --git a/img/sensors/power-ext.png b/img/sensors/power-ext.png deleted file mode 100644 index d01f702..0000000 Binary files a/img/sensors/power-ext.png and /dev/null differ diff --git a/img/sensors/power.png b/img/sensors/power.png deleted file mode 100644 index 5815890..0000000 Binary files a/img/sensors/power.png and /dev/null differ diff --git a/img/sensors/srmpls.png b/img/sensors/srmpls.png deleted file mode 100644 index d29053d..0000000 Binary files a/img/sensors/srmpls.png and /dev/null differ diff --git a/img/sensors/traffic.png b/img/sensors/traffic.png deleted file mode 100644 index 92ccd73..0000000 Binary files a/img/sensors/traffic.png and /dev/null differ diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..72e064d --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,80 @@ +copyright: This site is maintained by David Roy. Powered by + Material for MkDocs +docs_dir: docs +extra: + generator: false + social: + - icon: fontawesome/brands/linkedin + link: https://www.linkedin.com/in/david-roy-6aa26133/ + - icon: fontawesome/brands/github + link: https://github.com/door7302 +extra_css: +- https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.css +- https://cdn.jsdelivr.net/npm/glightbox/dist/css/glightbox.min.css +- stylesheets/extra.css +extra_javascript: +- https://cdn.jsdelivr.net/npm/glightbox/dist/js/glightbox.min.js +- https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.js +- https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/contrib/auto-render.min.js +- https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/js/all.min.js +- js/extra.js +markdown_extensions: +- attr_list +- pymdownx.extra +- markdown_katex +- toc: + permalink: true + toc_depth: 3 +- pymdownx.highlight: + anchor_linenums: true + guess_lang: false + linenums: true +nav: +- Home: index.md +- Getting started: + - Installation: install.md + - Configuration: config.md + - Update the tool: update.md +- User Guide: usage.md +- Supported Profiles: profiles.md +- About: about.md +plugins: +- search: + separator: '[\s\-\_]' +- minify: + minify_html: true +site_author: David Roy +site_name: OpenJTS - A complete Juniper Telemetry Stack +theme: + favicon: img/favicon.ico + features: + - toc.follow + - navigation.top + - navigation.tabs + - navigation.instant + - navigation.footer + - navigation.indexes + - search.suggest + - content.code.annotate + - content.code.copy + - content.code.select + - content.action.edit + - content.tooltips + - content.footnote.tooltips + font: + code: Nova + text: Google Sans + language: en + logo: img/favicon.ico + name: material + palette: + - media: '(prefers-color-scheme: light)' + scheme: default + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - media: '(prefers-color-scheme: dark)' + scheme: slate + toggle: + icon: material/brightness-auto + name: Switch to light mode