Synse plugin for Juniper JTI metrics over UDP stream.
This plugin ingests Juniper metrics over a UDP stream, making them available to the Synse platform. Juniper supports many sensors/resources, not all of which are yet supported by the plugin. Current plugin capabilities include support for the following resources:
/junos/system/linecard/interface/
/junos/system/linecard/optics/
The plugin has been tested against Juniper routers running Junos OS 18.2R3. Compatibility with other Junos versions is not guaranteed.
You can install the plugin via a release binary or via Docker image
docker pull vaporio/juniper-jti-plugin
If you wish to use a development build, fork/clone the repo and build the plugin from source.
A compose file is included in this repo which provides a basic example of how to run the Juniper JTI plugin in conjunction with Synse Server. You may also run the plugin on its own
docker run -d \
--name juniper-jti \
-p 5010:5010 \
-p 5566:5566/udp \
-v ./config.yaml:/etc/synse/plugin/config/config.yaml \
vaporio/juniper-jti-plugin
and use the Synse CLI to query the plugin's gRPC API.
The Juniper JTI plugin will run with minimal configuration (e.g. with config for the UDP server), but will not provide any data unless JTI data is streamed to the exposed UDP server. As such, the example deployment will run, but will not provide any useful data.
Plugin and device configuration are described in detail in the SDK Documentation.
When deploying, you will need to provide your own plugin configuration (config.yaml
)
with dynamic configuration defined. This is how the Juniper JTI plugin's UDP server is
configured, allowing Juniper devices to stream telemetry data to it.
As an example:
dynamicRegistration:
config:
- address: udp://0.0.0.0:5566
context:
site: ke1-test
Note that the IP address in this example is 0.0.0.0
. When running the plugin via a Docker
container, you will want to use this address so it is able to correctly capture the incoming packets.
Below are the fields that are expected in each of the dynamic registration items.
If no default is specified (-
), the field is required.
Field | Description | Default |
---|---|---|
address | The protocol/address/port for the UDP server to listen for incoming telemetry data. The protocol may be one of: [udp , udp4 , udp6 ]. When running in a docker container, the address should be 0.0.0.0 . |
- |
context | Additional key-value pairs to be globally applied to all device contexts for devices managed by a plugin instance. | {} |
Outputs are referenced by name. A single device may have more than one instance
of an output type. A value of -
in the table below indicates that there is no value
set for that field. The custom section describes outputs which this plugin defines
while the built-in section describes outputs this plugin uses which are built-in to
the SDK.
Custom
Name | Description | Unit | Type | Precision |
---|---|---|---|---|
boolean | A true/false value. | - | bool |
- |
bytes | A count of bytes. This is not associated with any time scale. | bytes | counter |
- |
bytes-per-second | The rate of bytes over a second. | bytes/s | throughput |
- |
decibel-milliwatt | A measure of absolute power expressed as a ratio between decibels to one milliwatt. | dBm | power |
- |
megabit-per-second | The rate of 1,000,000 bits over a second. | Mbit/s | throughput |
- |
milliampere | A measure of electric current, in thousandths of an Ampere. | mA | current |
- |
packets | A count of packets. This is not associated with any time scale. | pkts | counter |
- |
packets-per-second | The rate of packets over a second. | pkts/s | throughput |
- |
time-ticks | A measure of time, described in "time ticks". | ticks | time |
- |
Built-in
Name | Description | Unit | Type | Precision |
---|---|---|---|---|
number | An arbitrary, unit-less number. | - | number |
2 |
status | A generic description of status. | - | status |
- |
string | A generic output for string data. | - | string |
- |
temperature | A measure of temperature, in degrees Celsius. | C | temperature |
2 |
timestamp | A string describing a timestamp. | - | timestamp |
- |
Device Handlers are referenced by name.
Name | Description | Outputs | Read | Write | Bulk Read | Listen |
---|---|---|---|---|---|---|
jti | A handler for all Juniper devices. | - | ✓ | ✗ | ✗ | ✗ |
This plugin does not support writing values to devices.
Below is a table describing the compatibility of plugin versions with Synse platform versions.
Synse v2 | Synse v3 | |
---|---|---|
plugin v0.x | ✗ | ✓ |
The plugin can be run in debug mode for additional logging. This is done by:
-
Setting the
debug
option totrue
in the plugin configuration YAML (config.yml)debug: true
-
Passing the
--debug
flag when running the binary/imagedocker run vaporio/juniper-jti-plugin --debug
-
Running the image with the
PLUGIN_DEBUG
environment variable set totrue
docker run -e PLUGIN_DEBUG=true vaporio/juniper-jti-plugin
A development/debug Dockerfile is provided in the project repository to enable
building image which may be useful when developing or debugging a plugin. Unlike the slim scratch
-based
production image, the development image uses an ubuntu base, bringing with it all the standard command line
tools one would expect. To build a development image:
make docker-dev
The built image will be tagged using the format dev-{COMMIT}
, where COMMIT
is the short commit for
the repository at the time. This image is not published as part of the CI pipeline, but those with access
to the Docker Hub repo may publish manually.
If you experience a bug, would like to ask a question, or request a feature, open a new issue and provide as much context as possible. All contributions, questions, and feedback are welcomed and appreciated.
I either do not know enough about how protoc
works, or am just otherwise struggling
to get each source file to compile to a package correctly.
At present, running $ ./scripts/gen_proto.sh
will generate the compiled Go source
for the proto files. The issue lies with the import paths. The generated Go source
is put into pkg/protocol/jti/protos/{name}/{name}.pb.go
. All files (except
telemetry_top
) import telemetry_top
, but the import is wrong as generated. As such,
it needs to be updated from
import (
telemetry_top "protos/telemetry_top"
)
to
import (
telemetry_top "github.com/vapor-ware/synse-juniper-jti-plugin/pkg/protocol/jti/protos/telemetry_top"
)
Note also that the .proto
files should have a go_import
option added, e.g. for port.proto
:
option go_package = "protos/port";
The Synse Juniper JTI Plugin is licensed under GPLv3. See LICENSE for more info.