将Catalyst9300上的Prometheus Exporter作为Docker容器运行
首先,
由于Catalyst9300的IOS XE 16.12.1开始原生支持Docker容器,因此将Prometeus Exporter作为Docker容器运行。
请参考以下文件,了解Catalyst9300对本地Docker容器的支持。
[Qiita] 尝试使用Catalyst9300进行Docker应用托管
https://qiita.com/tetsusat/items/ec11ddb70197b24175e8
【思科官方文档】可编程配置指南:应用托管
链接:https://www.cisco.com/c/zh_cn/td/docs/ios-xml/ios/prog/configuration/1612/b_1612_programmability_cg/application_hosting.html
如何实现
使用Telegraf将作为遥测数据输入的信息以Prometheus Exporter格式输出,而不是使用容易变得复杂的SNMP Exporter。通过这样做,您可以使用一个配置适应来自路由器的任何指标信息。
Telegraf是什么?
Telegraf是一种插件驱动的服务器代理,用于从各种输入收集指标并将其发送到不同的输出。由于对输入和输出都是插件驱动的,所以可以轻松进行扩展。 它由Go编写,并编译为没有外部依赖的单个二进制文件,所需的内存占用量最小化。
[InfluxData官方] Telegraf
https://www.influxdata.com/time-series-platform/telegraf/
[InfluxData官网] Telegraf
https://www.influxdata.com/time-series-platform/telegraf/
思科遥测_MDT插件
Cisco Telemetry MDT通过Telegraf Input插件,从Cisco IOS XR、IOS XE和NX-OS平台收集遥测数据。
[GitHub] cisco_telemetry_mdt
https://github.com/influxdata/telegraf/tree/master/plugins/inputs/cisco_telemetry_mdt
【GitHub】cisco_telemetry_mdt
https://github.com/influxdata/telegraf/tree/master/plugins/inputs/cisco_telemetry_mdt
prometheus_client插件
prometheus_client是Telegraf Output插件,用于将Telegraf收集的指标数据导出给Prometheus服务器。
【Github】prometheus_client
https://github.com/influxdata/telegraf/tree/master/plugins/outputs/prometheus_client
【Github】prometheus_client
https://github.com/influxdata/telegraf/tree/master/plugins/outputs/prometheus_client
准备
首先,我們將在一台普通的Linux伺服器上嘗試。我們將使用InfluxData公司維護的Docker官方映像檔作為我的Docker映像檔。
- https://hub.docker.com/_/telegraf
拉取 Docker 镜像。
$ docker pull telegraf:1.12.4-alpine
我将创建Telegraf配置文件的模板。
$ docker run --rm telegraf:1.12.4-alpine \
telegraf -sample-config \
--input-filter cisco_telemetry_mdt \
--output-filter prometheus_client > telegraf.conf
我们将取消outputs.prometheus_client部分中collectors_exclude行的注释。
...
# Configuration for the Prometheus client to spawn
[[outputs.prometheus_client]]
## Address to listen on
listen = ":9273"
## Use HTTP Basic Authentication.
# basic_username = "Foo"
# basic_password = "Bar"
## If set, the IP Ranges which are allowed to access metrics.
## ex: ip_range = ["192.168.0.0/24", "192.168.1.0/30"]
# ip_range = []
## Path to publish the metrics on.
# path = "/metrics"
## Expiration interval for each metric. 0 == no expiration
# expiration_interval = "60s"
## Collectors to enable, valid entries are "gocollector" and "process".
## If unset, both are enabled.
collectors_exclude = ["gocollector", "process"]
...
开始运行。
$ docker run -d --name=telegraf \
-p 57000:57000 \
-p 9273:9273 \
-v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro \
telegraf:1.12.4-alpine
我会确认它已正确启动。
$ docker logs -f telegraf
2019-11-11T12:15:52Z I! Starting Telegraf 1.12.4
2019-11-11T12:15:52Z I! Using config file: /etc/telegraf/telegraf.conf
2019-11-11T12:15:52Z I! Loaded inputs: cisco_telemetry_mdt
2019-11-11T12:15:52Z I! Loaded aggregators:
2019-11-11T12:15:52Z I! Loaded processors:
2019-11-11T12:15:52Z I! Loaded outputs: prometheus_client
2019-11-11T12:15:52Z I! Tags enabled: host=2cd9e20e70b1
2019-11-11T12:15:52Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"2cd9e20e70b1", Flush Interval:10s
Catalyst应用程序托管
希望能够像在普通的Linux服务器上运行时那样,在启动Docker容器时从Catalyst的Flash等传递Telegraf的配置文件。但我没有找到这种方法,所以我将Telegraf的配置文件直接嵌入Docker镜像中。如前所述,无论是什么遥测数据,Telegraf的配置文件只需一种模式即可,所以就这样吧,不用担心,我会搞定的。
首先,需要在Linux环境下进行操作以构建Docker映像。
在当前目录下创建如下的Dockerfile。
FROM telegraf:1.12.4-alpine
COPY telegraf.conf /etc/telegraf/telegraf.conf
构建Docker镜像。
$ docker build -t telegraf_prom .
以Tar格式输出构建的Docker镜像。
$ docker save telegraf_prom -o telegraf.tar
用某种方式将Docker镜像以Tar格式复制到Catalyst的Flash中。
从这里开始,在Catalyst上进行工作。
我将配置应用程序托管的设置。
app-hosting appid telegraf
app-vnic management guest-interface 0
guest-ipaddress 192.0.2.101 netmask 255.255.255.0
app-default-gateway 192.0.2.254 guest-interface 0
app-resource docker
run-opts 1 "-p 57000:57000"
run-opts 2 "-p 9273:9273"
app-resource profile custom
cpu 7400
memory 2048
将之前创建的Docker镜像安装到应用程序托管平台上。
Switch#app-hosting install appid telegraf package flash:telegraf.tar
激活应用托管。
Switch#app-hosting activate appid telegraf
开始运行应用程序托管。
Switch#app-hosting start appid telegraf
我們在 Catalyst 中進行遙測的設定。
telemetry ietf subscription 1
encoding encode-kvgpb
filter xpath /process-cpu-ios-xe-oper:cpu-usage/cpu-utilization/five-seconds
source-vrf Mgmt-vrf
stream yang-push
update-policy periodic 1000
receiver ip address 192.0.2.101 57000 protocol grpc-tcp
!
netconf-yang
当您使用浏览器访问http://192.0.2.101:9273/metrics时,应该能够将数据成功导出到Prometheus服务器。顺便提一下,source中显示的是Catalyst管理接口的IP地址,它是Telemetry数据的发送源。
$ curl 192.0.2.101:9273/metrics
# HELP Cisco_IOS_XE_process_cpu_oper:cpu_usage_cpu_utilization_five_seconds Telegraf collected metric
# TYPE Cisco_IOS_XE_process_cpu_oper:cpu_usage_cpu_utilization_five_seconds untyped
Cisco_IOS_XE_process_cpu_oper:cpu_usage_cpu_utilization_five_seconds{host="772599aa3993",source="192.0.2.1",subscription="1"} 3
结束了